we love gc

This commit is contained in:
Milxnor
2023-04-23 20:19:18 -04:00
parent 94dc2a0907
commit 358a2a9ef2
8 changed files with 82 additions and 17 deletions

View File

@@ -146,11 +146,11 @@ std::pair<std::vector<UFortItem*>, std::vector<UFortItem*>> AFortInventory::AddI
static auto FortItemEntryStruct = FindObject(L"/Script/FortniteGame.FortItemEntry"); static auto FortItemEntryStruct = FindObject(L"/Script/FortniteGame.FortItemEntry");
static auto FortItemEntrySize = *(int*)(__int64(FortItemEntryStruct) + Offsets::PropertiesSize); static auto FortItemEntrySize = *(int*)(__int64(FortItemEntryStruct) + Offsets::PropertiesSize);
bool bEnableStateValues = false; bool bEnableStateValues = false; // Addresses::FreeEntry;
if (bEnableStateValues) if (bEnableStateValues)
{ {
FFortItemEntryStateValue* StateValue = Alloc<FFortItemEntryStateValue>(FFortItemEntryStateValue::GetStructSize()); FFortItemEntryStateValue* StateValue = Alloc<FFortItemEntryStateValue>(FFortItemEntryStateValue::GetStructSize(), true);
StateValue->GetIntValue() = bShowItemToast; StateValue->GetIntValue() = bShowItemToast;
StateValue->GetStateType() = EFortItemEntryState::ShouldShowItemToast; StateValue->GetStateType() = EFortItemEntryState::ShouldShowItemToast;
NewItemInstance->GetItemEntry()->GetStateValues().AddPtr(StateValue, FFortItemEntryStateValue::GetStructSize()); NewItemInstance->GetItemEntry()->GetStateValues().AddPtr(StateValue, FFortItemEntryStateValue::GetStructSize());
@@ -372,7 +372,7 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int
} }
} }
ItemInstance->GetItemEntry()->GetStateValues().FreeReal(); FFortItemEntry::FreeItemEntry(ItemInstances.at(i)->GetItemEntry()); // Really this is deconstructing it, which frees the arrays inside, we have to do this since Remove doesn't.
ItemInstances.Remove(i); ItemInstances.Remove(i);
break; break;
} }
@@ -382,7 +382,7 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int
{ {
if (ReplicatedEntries.at(i, FortItemEntrySize).GetItemGuid() == ItemGuid) if (ReplicatedEntries.at(i, FortItemEntrySize).GetItemGuid() == ItemGuid)
{ {
ReplicatedEntries.at(i, FortItemEntrySize).GetStateValues().FreeReal(); FFortItemEntry::FreeItemEntry(ReplicatedEntries.AtPtr(i, FortItemEntrySize));
ReplicatedEntries.Remove(i, FortItemEntrySize); ReplicatedEntries.Remove(i, FortItemEntrySize);
break; break;
} }

View File

@@ -108,8 +108,10 @@ struct FFortItemEntry : FFastArraySerializerItem
this->GetItemDefinition() = OtherItemEntry->GetItemDefinition(); this->GetItemDefinition() = OtherItemEntry->GetItemDefinition();
this->GetCount() = OtherItemEntry->GetCount(); this->GetCount() = OtherItemEntry->GetCount();
this->GetLoadedAmmo() = OtherItemEntry->GetLoadedAmmo(); this->GetLoadedAmmo() = OtherItemEntry->GetLoadedAmmo();
this->GetItemGuid() = OtherItemEntry->GetItemGuid();
} }
if (!bCopyGuid)
this->GetItemGuid() = OldGuid; this->GetItemGuid() = OldGuid;
} }
@@ -144,6 +146,40 @@ struct FFortItemEntry : FFastArraySerializerItem
return Entry; 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 class UFortItem : public UObject

View File

@@ -561,16 +561,12 @@ bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool
Stack.StepCompiledIn(&WorldLevel); Stack.StepCompiledIn(&WorldLevel);
Stack.StepCompiledIn(&ForcedLootTier); Stack.StepCompiledIn(&ForcedLootTier);
FFortItemEntry::FreeArrayOfEntries(OutLootToDropTempBuf);
LOG_INFO(LogDev, "Picking loot for {}.", TierGroupName.ComparisonIndex.Value ? TierGroupName.ToString() : "InvalidName"); LOG_INFO(LogDev, "Picking loot for {}.", TierGroupName.ComparisonIndex.Value ? TierGroupName.ToString() : "InvalidName");
auto LootDrops = PickLootDrops(TierGroupName, true); auto LootDrops = PickLootDrops(TierGroupName, true);
/* LootDrop skuffed{};
skuffed.ItemDefinition = FindObject<UFortItemDefinition>("AGID_CarminePack", nullptr, ANY_PACKAGE);
skuffed.Count = 1;
LootDrops.push_back(skuffed); */
for (int i = 0; i < LootDrops.size(); i++) for (int i = 0; i < LootDrops.size(); i++)
{ {
auto& LootDrop = LootDrops.at(i); auto& LootDrop = LootDrops.at(i);

View File

@@ -53,12 +53,12 @@ AFortPickup* AFortPickup::SpawnPickup(FFortItemEntry* ItemEntry, FVector Locatio
if (Addresses::PickupInitialize) if (Addresses::PickupInitialize)
{ {
static void (*SetupPickup)(AFortPickup* Pickup, __int64 ItemEntry, TArray<__int64> MultiItemPickupEntriesIGuess, bool bSplitOnPickup) static void (*SetupPickup)(AFortPickup* Pickup, __int64 ItemEntry, TArray<FFortItemEntry> MultiItemPickupEntriesIGuess, bool bSplitOnPickup)
= decltype(SetupPickup)(Addresses::PickupInitialize); = decltype(SetupPickup)(Addresses::PickupInitialize);
TArray<__int64> MultiItemPickupEntriesIGuess{}; TArray<FFortItemEntry> MultiItemPickupEntriesIGuess{};
SetupPickup(Pickup, __int64(ItemEntry), MultiItemPickupEntriesIGuess, false); SetupPickup(Pickup, __int64(ItemEntry), MultiItemPickupEntriesIGuess, false);
MultiItemPickupEntriesIGuess.Free(); FFortItemEntry::FreeArrayOfEntries(MultiItemPickupEntriesIGuess);
} }
else else
{ {

View File

@@ -271,6 +271,12 @@ void Addresses::FindAll()
LOG_INFO(LogDev, "Finding PickupInitialize"); LOG_INFO(LogDev, "Finding PickupInitialize");
Addresses::PickupInitialize = FindPickupInitialize(); Addresses::PickupInitialize = FindPickupInitialize();
LOG_INFO(LogDev, "Finding FreeEntry");
Addresses::FreeEntry = FindFreeEntry();
LOG_INFO(LogDev, "Finding FreeArrayOfEntries");
Addresses::FreeArrayOfEntries = FindFreeArrayOfEntries();
LOG_INFO(LogDev, "Finished finding!"); LOG_INFO(LogDev, "Finished finding!");
} }

View File

@@ -63,6 +63,8 @@ namespace Addresses
extern inline uint64 EnterAircraft = 0; extern inline uint64 EnterAircraft = 0;
extern inline uint64 SetTimer = 0; extern inline uint64 SetTimer = 0;
extern inline uint64 PickupInitialize = 0; extern inline uint64 PickupInitialize = 0;
extern inline uint64 FreeEntry = 0;
extern inline uint64 FreeArrayOfEntries = 0;
void SetupVersion(); // Finds Engine Version void SetupVersion(); // Finds Engine Version
void FindAll(); void FindAll();

View File

@@ -547,8 +547,13 @@ DWORD WINAPI Main(LPVOID)
UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierOriginal, false, true); UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierOriginal, false, true);
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithClass"), Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithClass"),
UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithClassOriginal, false, true); UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithClassOriginal, false, true);
if (Addresses::FreeArrayOfEntries || Addresses::FreeEntry)
{
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"), Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"),
UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true); UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true);
}
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.CreateTossAmmoPickupForWeaponItemDefinitionAtLocation"), Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.CreateTossAmmoPickupForWeaponItemDefinitionAtLocation"),
UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook, (PVOID*)&UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal, false, true); UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook, (PVOID*)&UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal, false, true);
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.SpawnInstancedPickupInWorld"), Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.SpawnInstancedPickupInWorld"),

View File

@@ -731,6 +731,26 @@ static inline uint64 FindEnterAircraft()
return 0; return 0;
} }
static inline uint64 FindFreeArrayOfEntries()
{
// horrific way
if (Engine_Version == 422 || Engine_Version == 423)
return Memcury::Scanner::FindPattern("48 83 EC 38 48 89 6C 24 ? 4C 89 74 24 ? 4C 8B F1 48 8B 09 41 8B 6E 08 85 ED 0F 84 ? ? ? ? 48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 48 8D B9").Get(); // 7.30 & 10.40
return 0;
}
static inline uint64 FindFreeEntry()
{
// horrific way
if (Engine_Version == 420)
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B F1 48 8B 89 ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 8E ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 8E ? ? ? ? 48 85 C9 74 05 E8 ? ? ? ? 48 8B 9E ? ? ? ? 48 85").Get(); // 4.1
return 0;
}
static inline uint64 FindRemoveGadgetData() static inline uint64 FindRemoveGadgetData()
{ {
if (Engine_Version <= 423) if (Engine_Version <= 423)