diff --git a/Project Reboot 3.0/FortInventory.cpp b/Project Reboot 3.0/FortInventory.cpp index 7704ded..afc1e09 100644 --- a/Project Reboot 3.0/FortInventory.cpp +++ b/Project Reboot 3.0/FortInventory.cpp @@ -146,11 +146,11 @@ std::pair, std::vector> AFortInventory::AddI static auto FortItemEntryStruct = FindObject(L"/Script/FortniteGame.FortItemEntry"); static auto FortItemEntrySize = *(int*)(__int64(FortItemEntryStruct) + Offsets::PropertiesSize); - bool bEnableStateValues = false; + bool bEnableStateValues = false; // Addresses::FreeEntry; if (bEnableStateValues) { - FFortItemEntryStateValue* StateValue = Alloc(FFortItemEntryStateValue::GetStructSize()); + FFortItemEntryStateValue* StateValue = Alloc(FFortItemEntryStateValue::GetStructSize(), true); StateValue->GetIntValue() = bShowItemToast; StateValue->GetStateType() = EFortItemEntryState::ShouldShowItemToast; 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); break; } @@ -382,7 +382,7 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int { if (ReplicatedEntries.at(i, FortItemEntrySize).GetItemGuid() == ItemGuid) { - ReplicatedEntries.at(i, FortItemEntrySize).GetStateValues().FreeReal(); + FFortItemEntry::FreeItemEntry(ReplicatedEntries.AtPtr(i, FortItemEntrySize)); ReplicatedEntries.Remove(i, FortItemEntrySize); break; } diff --git a/Project Reboot 3.0/FortItem.h b/Project Reboot 3.0/FortItem.h index 2a15073..1ac7a2e 100644 --- a/Project Reboot 3.0/FortItem.h +++ b/Project Reboot 3.0/FortItem.h @@ -108,9 +108,11 @@ struct FFortItemEntry : FFastArraySerializerItem this->GetItemDefinition() = OtherItemEntry->GetItemDefinition(); this->GetCount() = OtherItemEntry->GetCount(); this->GetLoadedAmmo() = OtherItemEntry->GetLoadedAmmo(); + this->GetItemGuid() = OtherItemEntry->GetItemGuid(); } - this->GetItemGuid() = OldGuid; + if (!bCopyGuid) + this->GetItemGuid() = OldGuid; } static UStruct* GetStruct() @@ -144,6 +146,40 @@ struct FFortItemEntry : FFastArraySerializerItem 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& tarray) + { + if (Addresses::FreeArrayOfEntries) + { + static __int64 (*FreeArrayOfEntriesOriginal)(TArray& 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 diff --git a/Project Reboot 3.0/FortKismetLibrary.cpp b/Project Reboot 3.0/FortKismetLibrary.cpp index d3070cd..79c71de 100644 --- a/Project Reboot 3.0/FortKismetLibrary.cpp +++ b/Project Reboot 3.0/FortKismetLibrary.cpp @@ -561,16 +561,12 @@ bool UFortKismetLibrary::PickLootDropsHook(UObject* Context, FFrame& Stack, bool Stack.StepCompiledIn(&WorldLevel); Stack.StepCompiledIn(&ForcedLootTier); + FFortItemEntry::FreeArrayOfEntries(OutLootToDropTempBuf); + LOG_INFO(LogDev, "Picking loot for {}.", TierGroupName.ComparisonIndex.Value ? TierGroupName.ToString() : "InvalidName"); auto LootDrops = PickLootDrops(TierGroupName, true); - /* LootDrop skuffed{}; - skuffed.ItemDefinition = FindObject("AGID_CarminePack", nullptr, ANY_PACKAGE); - skuffed.Count = 1; - - LootDrops.push_back(skuffed); */ - for (int i = 0; i < LootDrops.size(); i++) { auto& LootDrop = LootDrops.at(i); diff --git a/Project Reboot 3.0/FortPickup.cpp b/Project Reboot 3.0/FortPickup.cpp index 8de700e..4d33245 100644 --- a/Project Reboot 3.0/FortPickup.cpp +++ b/Project Reboot 3.0/FortPickup.cpp @@ -53,12 +53,12 @@ AFortPickup* AFortPickup::SpawnPickup(FFortItemEntry* ItemEntry, FVector Locatio if (Addresses::PickupInitialize) { - static void (*SetupPickup)(AFortPickup* Pickup, __int64 ItemEntry, TArray<__int64> MultiItemPickupEntriesIGuess, bool bSplitOnPickup) + static void (*SetupPickup)(AFortPickup* Pickup, __int64 ItemEntry, TArray MultiItemPickupEntriesIGuess, bool bSplitOnPickup) = decltype(SetupPickup)(Addresses::PickupInitialize); - TArray<__int64> MultiItemPickupEntriesIGuess{}; + TArray MultiItemPickupEntriesIGuess{}; SetupPickup(Pickup, __int64(ItemEntry), MultiItemPickupEntriesIGuess, false); - MultiItemPickupEntriesIGuess.Free(); + FFortItemEntry::FreeArrayOfEntries(MultiItemPickupEntriesIGuess); } else { diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index b411376..39bc2f6 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -271,6 +271,12 @@ void Addresses::FindAll() LOG_INFO(LogDev, "Finding PickupInitialize"); Addresses::PickupInitialize = FindPickupInitialize(); + LOG_INFO(LogDev, "Finding FreeEntry"); + Addresses::FreeEntry = FindFreeEntry(); + + LOG_INFO(LogDev, "Finding FreeArrayOfEntries"); + Addresses::FreeArrayOfEntries = FindFreeArrayOfEntries(); + LOG_INFO(LogDev, "Finished finding!"); } diff --git a/Project Reboot 3.0/addresses.h b/Project Reboot 3.0/addresses.h index 720bf65..2e2c6ea 100644 --- a/Project Reboot 3.0/addresses.h +++ b/Project Reboot 3.0/addresses.h @@ -63,7 +63,9 @@ namespace Addresses extern inline uint64 EnterAircraft = 0; extern inline uint64 SetTimer = 0; extern inline uint64 PickupInitialize = 0; - + extern inline uint64 FreeEntry = 0; + extern inline uint64 FreeArrayOfEntries = 0; + void SetupVersion(); // Finds Engine Version void FindAll(); void Print(); diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 756e129..64a618b 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -547,8 +547,13 @@ DWORD WINAPI Main(LPVOID) UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierOriginal, false, true); Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithClass"), UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithClassOriginal, false, true); - Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"), - UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true); + + if (Addresses::FreeArrayOfEntries || Addresses::FreeEntry) + { + Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"), + UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true); + } + Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.CreateTossAmmoPickupForWeaponItemDefinitionAtLocation"), UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook, (PVOID*)&UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal, false, true); Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.SpawnInstancedPickupInWorld"), diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index b2d2349..9e37159 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -731,6 +731,26 @@ static inline uint64 FindEnterAircraft() 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() { if (Engine_Version <= 423)