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 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user