Files
Project-Reboot-3.0/Project Reboot 3.0/FortItem.h
Milxnor 02717f33f3 a medium amount
fix some playlist starter loot, cleanup some code, fix death bugs on 1.8 and 1.7.2, fix reloading not taking items on 1.8 and 1.7.2, fix looting on s9, fix some s15 & s16 builds, fix bug with higher version looting
2023-04-30 22:12:03 -04:00

210 lines
5.5 KiB
C++

#pragma once
#include "NetSerialization.h"
#include "Class.h"
#include "reboot.h"
enum class EFortItemEntryState : uint8_t // idk if this changes
{
NoneState = 0,
NewItemCount = 1,
ShouldShowItemToast = 2,
DurabilityInitialized = 3,
DoNotShowSpawnParticles = 4,
FromRecoveredBackpack = 5,
FromGift = 6,
PendingUpgradeCriteriaProgress = 7,
OwnerBuildingHandle = 8,
FromDroppedPickup = 9,
JustCrafted = 10,
CraftAndSlotTarget = 11,
GenericAttributeValueSet = 12,
PickupInstigatorHandle = 13,
CreativeUserPrefabHasContent = 14,
EFortItemEntryState_MAX = 15
};
struct FFortItemEntryStateValue
{
static UStruct* GetStruct()
{
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.FortItemEntryStateValue");
return Struct;
}
static int GetStructSize()
{
return GetStruct()->GetPropertiesSize();
}
int& GetIntValue()
{
static auto IntValueOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "IntValue");
return *(int*)(__int64(this) + IntValueOffset);
}
EFortItemEntryState& GetStateType()
{
static auto StateTypeOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "StateType");
return *(EFortItemEntryState*)(__int64(this) + StateTypeOffset);
}
FName& GetNameValue()
{
static auto NameValueOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntryStateValue", "NameValue");
return *(FName*)(__int64(this) + NameValueOffset);
}
};
struct FFortItemEntry : FFastArraySerializerItem
{
FGuid& GetItemGuid()
{
static auto ItemGuidOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "ItemGuid");
return *(FGuid*)(__int64(this) + ItemGuidOffset);
}
bool& GetIsReplicatedCopy()
{
static auto bIsReplicatedCopyOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "bIsReplicatedCopy");
return *(bool*)(__int64(this) + bIsReplicatedCopyOffset);
}
class UFortItemDefinition*& GetItemDefinition()
{
static auto ItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "ItemDefinition");
return *(class UFortItemDefinition**)(__int64(this) + ItemDefinitionOffset);
}
int& GetCount()
{
static auto CountOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "Count");
return *(int*)(__int64(this) + CountOffset);
}
int& GetLevel()
{
static auto LevelOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "Level");
return *(int*)(__int64(this) + LevelOffset);
}
TArray<FFortItemEntryStateValue>& GetStateValues()
{
static auto StateValuesOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "StateValues");
return *(TArray<FFortItemEntryStateValue>*)(__int64(this) + StateValuesOffset);
}
int& GetLoadedAmmo()
{
static auto LoadedAmmoOffset = FindOffsetStruct("/Script/FortniteGame.FortItemEntry", "LoadedAmmo");
return *(int*)(__int64(this) + LoadedAmmoOffset);
}
void CopyFromAnotherItemEntry(FFortItemEntry* OtherItemEntry, bool bCopyGuid = false)
{
// We can use FortItemEntryStruct->CopyScriptStruct
FGuid OldGuid = this->GetItemGuid();
if (false)
{
CopyStruct(this, OtherItemEntry, FFortItemEntry::GetStructSize(), FFortItemEntry::GetStruct());
}
else
{
this->GetItemDefinition() = OtherItemEntry->GetItemDefinition();
this->GetCount() = OtherItemEntry->GetCount();
this->GetLoadedAmmo() = OtherItemEntry->GetLoadedAmmo();
this->GetItemGuid() = OtherItemEntry->GetItemGuid();
this->GetLevel() = OtherItemEntry->GetLevel();
}
if (!bCopyGuid)
this->GetItemGuid() = OldGuid;
// should we do this?
this->MostRecentArrayReplicationKey = -1;
this->ReplicationID = -1;
this->ReplicationKey = -1;
}
static UStruct* GetStruct()
{
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.FortItemEntry");
return Struct;
}
static int GetStructSize()
{
static auto StructSize = GetStruct()->GetPropertiesSize();
return StructSize;
}
static FFortItemEntry* MakeItemEntry(UFortItemDefinition* ItemDefinition, int Count = 1, int LoadedAmmo = 0)
{
auto Entry = // (FFortItemEntry*)FMemory::Realloc(0, GetStructSize(), 0);
Alloc<FFortItemEntry>(GetStructSize());
if (!Entry)
return nullptr;
Entry->MostRecentArrayReplicationKey = -1;
Entry->ReplicationID = -1;
Entry->ReplicationKey = -1;
Entry->GetItemDefinition() = ItemDefinition;
Entry->GetCount() = Count;
Entry->GetLoadedAmmo() = LoadedAmmo;
// Entry->bUpdateStatsOnCollection = true; // Idk what this does but fortnite does it soo
return Entry;
}
// We need to find a better way for below... Especially since we can't do either method for season 5 or 6.
static void FreeItemEntry(FFortItemEntry* Entry)
{
if (Addresses::FreeEntry)
{
static __int64 (*FreeEntryOriginal)(__int64 Entry) = decltype(FreeEntryOriginal)(Addresses::FreeEntry);
FreeEntryOriginal(__int64(Entry));
}
}
static void FreeArrayOfEntries(TArray<FFortItemEntry>& tarray)
{
if (Addresses::FreeArrayOfEntries)
{
static __int64 (*FreeArrayOfEntriesOriginal)(TArray<FFortItemEntry>& a1) = decltype(FreeArrayOfEntriesOriginal)(Addresses::FreeArrayOfEntries);
FreeArrayOfEntriesOriginal(tarray);
}
else
{
if (Addresses::FreeEntry)
{
for (int i = 0; i < tarray.size(); i++)
{
FreeItemEntry(tarray.AtPtr(i));
}
}
else
{
tarray.Free(); // does nothing
}
}
}
};
class UFortItem : public UObject
{
public:
FFortItemEntry* GetItemEntry()
{
static auto ItemEntryOffset = this->GetOffset("ItemEntry");
return GetPtr<FFortItemEntry>(ItemEntryOffset);
}
void SetOwningControllerForTemporaryItem(UObject* Controller);
};