mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 10:52:22 +01:00
we love gc
This commit is contained in:
@@ -146,11 +146,11 @@ std::pair<std::vector<UFortItem*>, std::vector<UFortItem*>> 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>(FFortItemEntryStateValue::GetStructSize());
|
||||
FFortItemEntryStateValue* StateValue = Alloc<FFortItemEntryStateValue>(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;
|
||||
}
|
||||
|
||||
@@ -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<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
|
||||
|
||||
@@ -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<UFortItemDefinition>("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);
|
||||
|
||||
@@ -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<FFortItemEntry> MultiItemPickupEntriesIGuess, bool bSplitOnPickup)
|
||||
= decltype(SetupPickup)(Addresses::PickupInitialize);
|
||||
|
||||
TArray<__int64> MultiItemPickupEntriesIGuess{};
|
||||
TArray<FFortItemEntry> MultiItemPickupEntriesIGuess{};
|
||||
SetupPickup(Pickup, __int64(ItemEntry), MultiItemPickupEntriesIGuess, false);
|
||||
MultiItemPickupEntriesIGuess.Free();
|
||||
FFortItemEntry::FreeArrayOfEntries(MultiItemPickupEntriesIGuess);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -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!");
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -547,8 +547,13 @@ DWORD WINAPI Main(LPVOID)
|
||||
UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierOriginal, false, true);
|
||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_SpawnPickupInWorldWithClass"),
|
||||
UFortKismetLibrary::K2_SpawnPickupInWorldWithClassHook, (PVOID*)&UFortKismetLibrary::K2_SpawnPickupInWorldWithClassOriginal, false, true);
|
||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"),
|
||||
UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true);
|
||||
|
||||
if (Addresses::FreeArrayOfEntries || Addresses::FreeEntry)
|
||||
{
|
||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.PickLootDrops"),
|
||||
UFortKismetLibrary::PickLootDropsHook, (PVOID*)&UFortKismetLibrary::PickLootDropsOriginal, false, true);
|
||||
}
|
||||
|
||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.CreateTossAmmoPickupForWeaponItemDefinitionAtLocation"),
|
||||
UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook, (PVOID*)&UFortKismetLibrary::CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal, false, true);
|
||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.SpawnInstancedPickupInWorld"),
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user