From 129e9ab0d23eb03bb67190caa868f132c2785a7c Mon Sep 17 00:00:00 2001 From: Milxnor Date: Fri, 24 Mar 2023 22:05:45 -0400 Subject: [PATCH] can sopmeone test the fishing on s17 --- Project Reboot 3.0/FortKismetLibrary.cpp | 59 ++++++++++++++++++++++++ Project Reboot 3.0/FortKismetLibrary.h | 59 ++++++++++++++++++++++++ Project Reboot 3.0/dllmain.cpp | 4 ++ 3 files changed, 122 insertions(+) diff --git a/Project Reboot 3.0/FortKismetLibrary.cpp b/Project Reboot 3.0/FortKismetLibrary.cpp index f00b90b..26929ed 100644 --- a/Project Reboot 3.0/FortKismetLibrary.cpp +++ b/Project Reboot 3.0/FortKismetLibrary.cpp @@ -2,6 +2,7 @@ #include "ScriptInterface.h" #include "FortPickup.h" #include "FortLootPackage.h" +#include "AbilitySystemComponent.h" UFortResourceItemDefinition* UFortKismetLibrary::K2_GetResourceItemDefinition(EFortResourceType ResourceType) { @@ -65,6 +66,64 @@ void UFortKismetLibrary::ApplyCharacterCosmetics(UObject* WorldContextObject, co } } +void UFortKismetLibrary::SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret) +{ + UObject* WorldContextObject; // 0x0(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + PadHexB0 Params; // = *Alloc(FSpawnItemVariantParams::GetStructSize()); + + Stack.StepCompiledIn(&WorldContextObject); + Stack.StepCompiledIn(&Params); + + LOG_INFO(LogDev, __FUNCTION__); + + auto ParamsPtr = (FSpawnItemVariantParams*)&Params; + + auto ItemDefinition = ParamsPtr->GetWorldItemDefinition(); + + LOG_INFO(LogDev, "ItemDefinition: {}", ItemDefinition ? ItemDefinition->GetFullName() : "InvalidObject"); + + if (!ItemDefinition) + return SpawnItemVariantPickupInWorldOriginal(Context, Stack, Ret); + + auto& Position = ParamsPtr->GetPosition(); + + LOG_INFO(LogDev, "{} {} {}", Position.X, Position.Y, Position.Z); + + auto Pickup = AFortPickup::SpawnPickup(ItemDefinition, Position, ParamsPtr->GetNumberToSpawn(), ParamsPtr->GetSourceType(), ParamsPtr->GetSource()); + + return SpawnItemVariantPickupInWorldOriginal(Context, Stack, Ret); +} + +bool UFortKismetLibrary::SpawnInstancedPickupInWorldHook(UObject* Context, FFrame& Stack, bool* Ret) +{ + UObject* WorldContextObject; // 0x0(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + UFortWorldItemDefinition* ItemDefinition; // 0x8(0x8)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + int32 NumberToSpawn; // 0x10(0x4)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + FVector Position; // 0x14(0xC)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + FVector Direction; // 0x20(0xC)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + int32 OverrideMaxStackCount; // 0x2C(0x4)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + bool bToss; // 0x30(0x1)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + bool bRandomRotation; // 0x31(0x1)(Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic) + bool bBlockedFromAutoPickup; + + LOG_INFO(LogDev, __FUNCTION__); + + Stack.StepCompiledIn(&WorldContextObject); + Stack.StepCompiledIn(&ItemDefinition); + Stack.StepCompiledIn(&NumberToSpawn); + Stack.StepCompiledIn(&Position); + Stack.StepCompiledIn(&Direction); + Stack.StepCompiledIn(&OverrideMaxStackCount); + Stack.StepCompiledIn(&bToss); + Stack.StepCompiledIn(&bRandomRotation); + Stack.StepCompiledIn(&bBlockedFromAutoPickup); + + auto Pickup = AFortPickup::SpawnPickup(ItemDefinition, Position, NumberToSpawn); + + *Ret = Pickup; + return *Ret; +} + void UFortKismetLibrary::K2_SpawnPickupInWorldWithLootTierHook(UObject* Context, FFrame& Stack, void* Ret) { LOG_INFO(LogDev, __FUNCTION__); diff --git a/Project Reboot 3.0/FortKismetLibrary.h b/Project Reboot 3.0/FortKismetLibrary.h index 123801e..93d5fb7 100644 --- a/Project Reboot 3.0/FortKismetLibrary.h +++ b/Project Reboot 3.0/FortKismetLibrary.h @@ -9,6 +9,61 @@ using UFortInventoryOwnerInterface = UObject; +struct FSpawnItemVariantParams +{ + static UStruct* GetStruct() + { + static auto SpawnItemVariantsParamsStruct = FindObject("/Script/FortniteGame.SpawnItemVariantParams"); + return SpawnItemVariantsParamsStruct; + } + + static int GetStructSize() + { + static auto StructSize = GetStruct()->GetPropertiesSize(); + return StructSize; + } + + UFortWorldItemDefinition*& GetWorldItemDefinition() + { + static auto WorldItemDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "WorldItemDefinition"); + return *(UFortWorldItemDefinition**)(__int64(this) + WorldItemDefinitionOffset); + } + + int& GetNumberToSpawn() + { + static auto NumberToSpawnOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "NumberToSpawn"); + return *(int*)(__int64(this) + NumberToSpawnOffset); + } + + EFortPickupSourceTypeFlag& GetSourceType() + { + static auto SourceTypeOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "SourceType"); + return *(EFortPickupSourceTypeFlag*)(__int64(this) + SourceTypeOffset); + } + + EFortPickupSpawnSource& GetSource() + { + static auto SourceOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Source"); + return *(EFortPickupSpawnSource*)(__int64(this) + SourceOffset); + } + + FVector& GetDirection() + { + static auto DirectionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Direction"); + return *(FVector*)(__int64(this) + DirectionOffset); + } + + FVector& GetPosition() + { + static auto PositionOffset = FindOffsetStruct("/Script/FortniteGame.SpawnItemVariantParams", "Position"); + + if (PositionOffset == -1) + PositionOffset = 0x2C; // wtf + + return *(FVector*)(__int64(this) + PositionOffset); + } +}; + class UFortKismetLibrary : public UObject { public: @@ -22,10 +77,14 @@ public: static inline AFortPickup* (*K2_SpawnPickupInWorldWithClassOriginal)(UObject* Context, FFrame& Stack, AFortPickup** Ret); static inline void (*CreateTossAmmoPickupForWeaponItemDefinitionAtLocationOriginal)(UObject* Context, FFrame& Stack, void* Ret); static inline void (*K2_SpawnPickupInWorldWithLootTierOriginal)(UObject* Context, FFrame& Stack, void* Ret); + static inline bool (*SpawnInstancedPickupInWorldOriginal)(UObject* Context, FFrame& Stack, bool* Ret); + static inline void (*SpawnItemVariantPickupInWorldOriginal)(UObject* Context, FFrame& Stack, void* Ret); static UFortResourceItemDefinition* K2_GetResourceItemDefinition(EFortResourceType ResourceType); static void ApplyCharacterCosmetics(UObject* WorldContextObject, const TArray& CharacterParts, UObject* PlayerState, bool* bSuccess); + static void SpawnItemVariantPickupInWorldHook(UObject* Context, FFrame& Stack, void* Ret); + static bool SpawnInstancedPickupInWorldHook(UObject* Context, FFrame& Stack, bool* Ret); static void K2_SpawnPickupInWorldWithLootTierHook(UObject* Context, FFrame& Stack, void* Ret); static void CreateTossAmmoPickupForWeaponItemDefinitionAtLocationHook(UObject* Context, FFrame& Stack, void* Ret); static void GiveItemToInventoryOwnerHook(UObject* Context, FFrame& Stack, void* Ret); diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index b335056..15c0299 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -261,6 +261,10 @@ DWORD WINAPI Main(LPVOID) 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"), + UFortKismetLibrary::SpawnInstancedPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnInstancedPickupInWorldOriginal, false, true); + Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject(L"/Script/FortniteGame.FortKismetLibrary.SpawnItemVariantPickupInWorld"), + UFortKismetLibrary::SpawnItemVariantPickupInWorldHook, (PVOID*)&UFortKismetLibrary::SpawnItemVariantPickupInWorldOriginal, false, true); Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject(L"/Script/FortniteGame.FortPlayerController.DropSpecificItem"), AFortPlayerController::DropSpecificItemHook, (PVOID*)&AFortPlayerController::DropSpecificItemOriginal, false, true);