mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 10:52:22 +01:00
a lot
fix 1.11 replication, fix some ltm specific stuff, start on shadow stones, fix some events not having foundations, fix s4-s6 gadgets, fix clear inventory on some versions
This commit is contained in:
44
Project Reboot 3.0/AthenaBarrierFlag.h
Normal file
44
Project Reboot 3.0/AthenaBarrierFlag.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BuildingGameplayActor.h"
|
||||||
|
#include "AthenaBarrierObjective.h"
|
||||||
|
|
||||||
|
struct FBarrierFlagDisplayData
|
||||||
|
{
|
||||||
|
static UStruct* GetStruct()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.BarrierFlagDisplayData");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
|
||||||
|
UStaticMesh* GetHeadMesh()
|
||||||
|
{
|
||||||
|
static auto HeadMeshOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "HeadMesh");
|
||||||
|
return *(UStaticMesh**)(__int64(this) + HeadMeshOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FVector& GetMeshScale()
|
||||||
|
{
|
||||||
|
static auto MeshScaleOffset = FindOffsetStruct("/Script/FortniteGame.BarrierFlagDisplayData", "MeshScale");
|
||||||
|
return *(FVector*)(__int64(this) + MeshScaleOffset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AAthenaBarrierFlag : public ABuildingGameplayActor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EBarrierFoodTeam& GetFoodTeam()
|
||||||
|
{
|
||||||
|
static auto FoodTeamOffset = GetOffset("FoodTeam");
|
||||||
|
return Get<EBarrierFoodTeam>(FoodTeamOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBarrierFlagDisplayData* GetDisplayData(EBarrierFoodTeam FoodTeam)
|
||||||
|
{
|
||||||
|
static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData");
|
||||||
|
auto FoodDisplayData = Get<FBarrierFlagDisplayData*>(FoodDisplayDataOffset); // Array of size 2
|
||||||
|
return &FoodDisplayData[(int)FoodTeam];
|
||||||
|
}
|
||||||
|
};
|
||||||
59
Project Reboot 3.0/AthenaBarrierObjective.h
Normal file
59
Project Reboot 3.0/AthenaBarrierObjective.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BuildingGameplayActor.h"
|
||||||
|
|
||||||
|
using UStaticMesh = UObject;
|
||||||
|
using UMaterialInterface = UObject;
|
||||||
|
|
||||||
|
enum class EBarrierFoodTeam : uint8_t
|
||||||
|
{
|
||||||
|
Burger = 0,
|
||||||
|
Tomato = 1,
|
||||||
|
MAX = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FBarrierObjectiveDisplayData
|
||||||
|
{
|
||||||
|
UStaticMesh* HeadMesh; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
FVector MeshScale; // 0x0008(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
FVector MeshRelativeOffset; // 0x0014(0x000C) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
TArray<UMaterialInterface*> MaterialsToSwap; // 0x0020(0x0010) (Edit, ZeroConstructor, NativeAccessSpecifierPublic)
|
||||||
|
};
|
||||||
|
|
||||||
|
class AAthenaBarrierObjective : public ABuildingGameplayActor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void SetHeadMesh(UStaticMesh* NewMesh, const FVector& NewScale, const FVector& NewOffset, const TArray<UMaterialInterface*>& MaterialsToSwap)
|
||||||
|
{
|
||||||
|
static auto SetHeadMeshFn = FindObject<UFunction>("/Script/FortniteGame.AthenaBarrierObjective.SetHeadMesh");
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
UStaticMesh* NewMesh; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
FVector NewScale; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
FVector NewOffset; // (Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
TArray<UMaterialInterface*> MaterialsToSwap; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, NativeAccessSpecifierPublic)
|
||||||
|
} AAthenaBarrierObjective_SetHeadMesh_Params{ NewMesh, NewScale, NewOffset, MaterialsToSwap };
|
||||||
|
|
||||||
|
this->ProcessEvent(SetHeadMeshFn, &AAthenaBarrierObjective_SetHeadMesh_Params);
|
||||||
|
}
|
||||||
|
|
||||||
|
EBarrierFoodTeam& GetFoodTeam()
|
||||||
|
{
|
||||||
|
static auto FoodTeamOffset = GetOffset("FoodTeam");
|
||||||
|
return Get<EBarrierFoodTeam>(FoodTeamOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBarrierObjectiveDisplayData* GetFoodDisplayData(EBarrierFoodTeam FoodTeam)
|
||||||
|
{
|
||||||
|
static auto FoodDisplayDataOffset = GetOffset("FoodDisplayData");
|
||||||
|
auto FoodDisplayData = Get<FBarrierObjectiveDisplayData*>(FoodDisplayDataOffset); // Array size of 2
|
||||||
|
return &FoodDisplayData[(int)FoodTeam];
|
||||||
|
}
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.AthenaBarrierObjective");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
|
};
|
||||||
8
Project Reboot 3.0/AthenaBigBaseWall.h
Normal file
8
Project Reboot 3.0/AthenaBigBaseWall.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BuildingGameplayActor.h"
|
||||||
|
|
||||||
|
class AAthenaBigBaseWall : public ABuildingGameplayActor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
};
|
||||||
@@ -9,6 +9,9 @@ UObject* UClass::CreateDefaultObject()
|
|||||||
|
|
||||||
auto name = this->GetFullName();
|
auto name = this->GetFullName();
|
||||||
|
|
||||||
|
if (name.contains("Default__"))
|
||||||
|
return this;
|
||||||
|
|
||||||
auto defaultafqaf = defaultAbilities.find(name);
|
auto defaultafqaf = defaultAbilities.find(name);
|
||||||
|
|
||||||
UObject* DefaultObject = nullptr;
|
UObject* DefaultObject = nullptr;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class UClass : public UStruct
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UObject* CreateDefaultObject();
|
UObject* CreateDefaultObject();
|
||||||
|
UClass* GetSuperStruct() { return *(UClass**)(__int64(this) + Offsets::SuperStruct); } // idk if this is in UStruct
|
||||||
};
|
};
|
||||||
|
|
||||||
class UFunction : public UStruct
|
class UFunction : public UStruct
|
||||||
|
|||||||
@@ -1,2 +1,19 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "DelegateBase.h"
|
||||||
|
#include "DelegateSignatureImpl.inl"
|
||||||
|
|
||||||
|
#define FUNC_CONCAT( ... ) __VA_ARGS__
|
||||||
|
|
||||||
|
#define FUNC_DECLARE_DELEGATE( DelegateName, ReturnType, ... ) \
|
||||||
|
typedef TBaseDelegate/*<__VA_ARGS__>*/ DelegateName;
|
||||||
|
|
||||||
|
#define FUNC_DECLARE_DYNAMIC_DELEGATE( TWeakPtr, DynamicDelegateName, ExecFunction, FuncParamList, FuncParamPassThru, ... ) \
|
||||||
|
class DynamicDelegateName : public TBaseDynamicDelegate<TWeakPtr, __VA_ARGS__> \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
DynamicDelegateName() \
|
||||||
|
{ \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
};
|
||||||
@@ -2,19 +2,27 @@
|
|||||||
|
|
||||||
#include "inc.h"
|
#include "inc.h"
|
||||||
|
|
||||||
|
#include "TypeCompatibleBytes.h"
|
||||||
|
#include "ContainerAllocationPolicies.h"
|
||||||
|
|
||||||
/*
|
#if !defined(_WIN32) || defined(_WIN64)
|
||||||
|
// Let delegates store up to 32 bytes which are 16-byte aligned before we heap allocate
|
||||||
typedef TAlignedBytes<16, 16> FAlignedInlineDelegateType;
|
typedef TAlignedBytes<16, 16> FAlignedInlineDelegateType;
|
||||||
#if USE_SMALL_DELEGATES
|
#if USE_SMALL_DELEGATES
|
||||||
typedef FHeapAllocator FDelegateAllocatorType;
|
typedef FHeapAllocator FDelegateAllocatorType;
|
||||||
#else
|
#else
|
||||||
typedef TInlineAllocator<2> FDelegateAllocatorType;
|
typedef TInlineAllocator<2> FDelegateAllocatorType;
|
||||||
#endif
|
#endif
|
||||||
*/
|
#else
|
||||||
|
// ... except on Win32, because we can't pass 16-byte aligned types by value, as some delegates are
|
||||||
|
// so we'll just keep it heap-allocated, which are always sufficiently aligned.
|
||||||
|
typedef TAlignedBytes<16, 8> FAlignedInlineDelegateType;
|
||||||
|
typedef FHeapAllocator FDelegateAllocatorType;
|
||||||
|
#endif
|
||||||
|
|
||||||
class FDelegateBase
|
class FDelegateBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// FDelegateAllocatorType::ForElementType<FAlignedInlineDelegateType> DelegateAllocator;
|
FDelegateAllocatorType::ForElementType<FAlignedInlineDelegateType> DelegateAllocator;
|
||||||
// int32 DelegateSize;
|
int32 DelegateSize;
|
||||||
};
|
};
|
||||||
7
Project Reboot 3.0/DelegateCombinations.h
Normal file
7
Project Reboot 3.0/DelegateCombinations.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Delegate.h"
|
||||||
|
#include "ObjectMacros.h"
|
||||||
|
|
||||||
|
#define DECLARE_DELEGATE( DelegateName ) FUNC_DECLARE_DELEGATE( DelegateName, void )
|
||||||
|
#define DECLARE_DYNAMIC_DELEGATE( DelegateName ) /* BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) */ FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, DelegateName, DelegateName##_DelegateWrapper, , FUNC_CONCAT( *this ), void )
|
||||||
16
Project Reboot 3.0/DelegateInstanceInterface.h
Normal file
16
Project Reboot 3.0/DelegateInstanceInterface.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
template <bool Const, typename Class, typename FuncType>
|
||||||
|
struct TMemFunPtrType;
|
||||||
|
|
||||||
|
template <typename Class, typename RetType, typename... ArgTypes>
|
||||||
|
struct TMemFunPtrType<false, Class, RetType(ArgTypes...)>
|
||||||
|
{
|
||||||
|
typedef RetType(Class::* Type)(ArgTypes...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Class, typename RetType, typename... ArgTypes>
|
||||||
|
struct TMemFunPtrType<true, Class, RetType(ArgTypes...)>
|
||||||
|
{
|
||||||
|
typedef RetType(Class::* Type)(ArgTypes...) const;
|
||||||
|
};
|
||||||
@@ -1,9 +1,63 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "DelegateBase.h"
|
#include "DelegateBase.h"
|
||||||
|
#include "ScriptDelegates.h"
|
||||||
|
|
||||||
template <typename WrappedRetValType, typename... ParamTypes>
|
#include "DelegateInstanceInterface.h"
|
||||||
|
#include "RemoveReference.h"
|
||||||
|
#include "TypeWrapper.h"
|
||||||
|
|
||||||
|
// template <typename WrappedRetValType, typename... ParamTypes> // (Milxnor) IDK IM SCUFFED
|
||||||
class TBaseDelegate : public FDelegateBase
|
class TBaseDelegate : public FDelegateBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// (Milxnor) YEAH NO
|
||||||
|
|
||||||
|
/*
|
||||||
|
typedef typename TUnwrapType<WrappedRetValType>::Type RetValType;
|
||||||
|
|
||||||
|
template <typename UserClass, typename... VarTypes>
|
||||||
|
FUNCTION_CHECK_RETURN_START
|
||||||
|
inline static TBaseDelegate<RetValType, ParamTypes...> CreateRaw(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
||||||
|
FUNCTION_CHECK_RETURN_END
|
||||||
|
{
|
||||||
|
// UE_STATIC_DEPRECATE(4.23, TIsConst<UserClass>::Value, "Binding a delegate with a const object pointer and non-const function is deprecated.");
|
||||||
|
|
||||||
|
TBaseDelegate<RetValType, ParamTypes...> Result;
|
||||||
|
TBaseRawMethodDelegateInstance<false, UserClass, TFuncType, VarTypes...>::Create(Result, InUserObject, InFunc, Vars...);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
template <typename UserClass, typename... VarTypes>
|
||||||
|
FUNCTION_CHECK_RETURN_START
|
||||||
|
inline static TBaseDelegate<RetValType, ParamTypes...> CreateRaw(UserClass* InUserObject, typename TMemFunPtrType<true, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
||||||
|
FUNCTION_CHECK_RETURN_END
|
||||||
|
{
|
||||||
|
TBaseDelegate<RetValType, ParamTypes...> Result;
|
||||||
|
TBaseRawMethodDelegateInstance<true, UserClass, TFuncType, VarTypes...>::Create(Result, InUserObject, InFunc, Vars...);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename UserClass, typename... VarTypes>
|
||||||
|
inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
||||||
|
{
|
||||||
|
// UE_STATIC_DEPRECATE(4.23, TIsConst<UserClass>::Value, "Binding a delegate with a const object pointer and non-const function is deprecated.");
|
||||||
|
|
||||||
|
*this = CreateRaw(const_cast<typename TRemoveConst<UserClass>::Type*>(InUserObject), InFunc, Vars...);
|
||||||
|
}
|
||||||
|
template <typename UserClass, typename... VarTypes>
|
||||||
|
inline void BindRaw(UserClass* InUserObject, typename TMemFunPtrType<true, UserClass, RetValType(ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
|
||||||
|
{
|
||||||
|
*this = CreateRaw(InUserObject, InFunc, Vars...);
|
||||||
|
} */
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename TWeakPtr, typename RetValType, typename... ParamTypes>
|
||||||
|
class TBaseDynamicDelegate : public TScriptDelegate<TWeakPtr>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
*/
|
||||||
|
TBaseDynamicDelegate() { }
|
||||||
};
|
};
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
|
|
||||||
|
#include "DelegateCombinations.h"
|
||||||
|
|
||||||
enum class ESpawnActorCollisionHandlingMethod : uint8
|
enum class ESpawnActorCollisionHandlingMethod : uint8
|
||||||
{
|
{
|
||||||
Undefined,
|
Undefined,
|
||||||
@@ -16,3 +18,73 @@ struct FHitResult
|
|||||||
static class UStruct* GetStruct();
|
static class UStruct* GetStruct();
|
||||||
static int GetStructSize();
|
static int GetStructSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FTimerHandle
|
||||||
|
{
|
||||||
|
FTimerHandle()
|
||||||
|
: Handle(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/** True if this handle was ever initialized by the timer manager */
|
||||||
|
bool IsValid() const
|
||||||
|
{
|
||||||
|
return Handle != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Explicitly clear handle */
|
||||||
|
void Invalidate()
|
||||||
|
{
|
||||||
|
Handle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const FTimerHandle& Other) const
|
||||||
|
{
|
||||||
|
return Handle == Other.Handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const FTimerHandle& Other) const
|
||||||
|
{
|
||||||
|
return Handle != Other.Handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FString ToString() const
|
||||||
|
{
|
||||||
|
return FString::Printf(TEXT("%llu"), Handle);
|
||||||
|
} */
|
||||||
|
|
||||||
|
// private:
|
||||||
|
static const uint32 IndexBits = 24;
|
||||||
|
static const uint32 SerialNumberBits = 40;
|
||||||
|
|
||||||
|
static_assert(IndexBits + SerialNumberBits == 64, "The space for the timer index and serial number should total 64 bits");
|
||||||
|
|
||||||
|
static const int32 MaxIndex = (int32)1 << IndexBits;
|
||||||
|
static const uint64 MaxSerialNumber = (uint64)1 << SerialNumberBits;
|
||||||
|
|
||||||
|
void SetIndexAndSerialNumber(int32 Index, uint64 SerialNumber)
|
||||||
|
{
|
||||||
|
// check(Index >= 0 && Index < MaxIndex);
|
||||||
|
// check(SerialNumber < MaxSerialNumber);
|
||||||
|
Handle = (SerialNumber << IndexBits) | (uint64)(uint32)Index;
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE int32 GetIndex() const
|
||||||
|
{
|
||||||
|
return (int32)(Handle & (uint64)(MaxIndex - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCEINLINE uint64 GetSerialNumber() const
|
||||||
|
{
|
||||||
|
return Handle >> IndexBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64 Handle;
|
||||||
|
|
||||||
|
/* friend uint32 GetTypeHash(const FTimerHandle& InHandle)
|
||||||
|
{
|
||||||
|
return GetTypeHash(InHandle.Handle);
|
||||||
|
} */
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_DELEGATE(FTimerDynamicDelegate);
|
||||||
1
Project Reboot 3.0/ExpressionParserTypes.inl
Normal file
1
Project Reboot 3.0/ExpressionParserTypes.inl
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#pragma once
|
||||||
@@ -1,8 +1,33 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
|
|
||||||
|
#include "Stack.h"
|
||||||
|
|
||||||
|
#include "ScriptInterface.h"
|
||||||
|
#include "FortGameStateAthena.h"
|
||||||
|
#include "GameplayStatics.h"
|
||||||
|
|
||||||
class AFortAthenaMutator : public AActor // AFortGameplayMutator
|
class AFortAthenaMutator : public AActor // AFortGameplayMutator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void LoopMutators(std::function<void(AFortAthenaMutator*)> Callback)
|
||||||
|
{
|
||||||
|
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), AFortAthenaMutator::StaticClass());
|
||||||
|
|
||||||
|
for (int i = 0; i < AllMutators.Num(); i++)
|
||||||
|
{
|
||||||
|
Callback((AFortAthenaMutator*)AllMutators.at(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
AllMutators.Free();
|
||||||
|
}
|
||||||
30
Project Reboot 3.0/FortAthenaMutator_Barrier.cpp
Normal file
30
Project Reboot 3.0/FortAthenaMutator_Barrier.cpp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#include "FortAthenaMutator_Barrier.h"
|
||||||
|
|
||||||
|
void AFortAthenaMutator_Barrier::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
TScriptInterface<UObject> SafeZoneInterface;
|
||||||
|
EAthenaGamePhaseStep GamePhaseStep;
|
||||||
|
|
||||||
|
static auto SafeZoneInterfaceOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaMutator_Barrier.OnGamePhaseStepChanged", "SafeZoneInterface", false);
|
||||||
|
|
||||||
|
if (SafeZoneInterfaceOffset != -1)
|
||||||
|
Stack.StepCompiledIn(&SafeZoneInterface);
|
||||||
|
|
||||||
|
Stack.StepCompiledIn(&GamePhaseStep);
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep);
|
||||||
|
|
||||||
|
if (GamePhaseStep == EAthenaGamePhaseStep::Warmup)
|
||||||
|
{
|
||||||
|
// idk when they spawn the barrier could also be warmup or something
|
||||||
|
}
|
||||||
|
else if (GamePhaseStep == EAthenaGamePhaseStep::BusLocked)
|
||||||
|
{
|
||||||
|
// idk if they spawn the heads on flying or locked
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
return OnGamePhaseStepChangedOriginal(Context, Stack, Ret);
|
||||||
|
}
|
||||||
73
Project Reboot 3.0/FortAthenaMutator_Barrier.h
Normal file
73
Project Reboot 3.0/FortAthenaMutator_Barrier.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "FortAthenaMutator.h"
|
||||||
|
#include "AthenaBigBaseWall.h"
|
||||||
|
#include "AthenaBarrierObjective.h"
|
||||||
|
#include "AthenaBarrierFlag.h"
|
||||||
|
|
||||||
|
struct FBarrierTeamState // Idk if this actually changes
|
||||||
|
{
|
||||||
|
static UStruct* GetStruct()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.BarrierTeamState");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
|
||||||
|
EBarrierFoodTeam& GetFoodTeam()
|
||||||
|
{
|
||||||
|
static auto FoodTeamOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "FoodTeam");
|
||||||
|
return *(EBarrierFoodTeam*)(__int64(this) + FoodTeamOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
AAthenaBarrierFlag*& GetObjectiveFlag()
|
||||||
|
{
|
||||||
|
static auto ObjectiveFlagOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "ObjectiveFlag");
|
||||||
|
return *(AAthenaBarrierFlag**)(__int64(this) + ObjectiveFlagOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
AAthenaBarrierObjective*& GetObjectiveObject()
|
||||||
|
{
|
||||||
|
static auto ObjectiveObjectOffset = FindOffsetStruct("/Script/FortniteGame.BarrierTeamState", "ObjectiveObject");
|
||||||
|
return *(AAthenaBarrierObjective**)(__int64(this) + ObjectiveObjectOffset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AFortAthenaMutator_Barrier : public AFortAthenaMutator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static inline void (*OnGamePhaseStepChangedOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
|
|
||||||
|
UClass* GetBigBaseWallClass()
|
||||||
|
{
|
||||||
|
static auto BigBaseWallClassOffset = GetOffset("BigBaseWallClass");
|
||||||
|
return Get<UClass*>(BigBaseWallClassOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
UClass* GetObjectiveFlagClass()
|
||||||
|
{
|
||||||
|
static auto ObjectiveFlagOffset = GetOffset("ObjectiveFlag");
|
||||||
|
return Get<UClass*>(ObjectiveFlagOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
AAthenaBigBaseWall*& GetBigBaseWall()
|
||||||
|
{
|
||||||
|
static auto BigBaseWallOffset = GetOffset("BigBaseWall");
|
||||||
|
return Get<AAthenaBigBaseWall*>(BigBaseWallOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBarrierTeamState* GetTeam_0_State()
|
||||||
|
{
|
||||||
|
static auto Team_0_StateOffset = GetOffset("Team_0_State");
|
||||||
|
return GetPtr<FBarrierTeamState>(Team_0_StateOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FBarrierTeamState* GetTeam_1_State()
|
||||||
|
{
|
||||||
|
static auto Team_1_StateOffset = GetOffset("Team_1_State");
|
||||||
|
return GetPtr<FBarrierTeamState>(Team_1_StateOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
|
};
|
||||||
18
Project Reboot 3.0/FortAthenaMutator_Disco.cpp
Normal file
18
Project Reboot 3.0/FortAthenaMutator_Disco.cpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#include "FortAthenaMutator_Disco.h"
|
||||||
|
|
||||||
|
void AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret)
|
||||||
|
{
|
||||||
|
TScriptInterface<UObject> SafeZoneInterface;
|
||||||
|
EAthenaGamePhaseStep GamePhaseStep = EAthenaGamePhaseStep::BusFlying;
|
||||||
|
|
||||||
|
static auto SafeZoneInterfaceOffset = FindOffsetStruct("/Script/FortniteGame.FortAthenaMutator_Disco.OnGamePhaseStepChanged", "SafeZoneInterface", false);
|
||||||
|
|
||||||
|
if (SafeZoneInterfaceOffset != -1)
|
||||||
|
Stack.StepCompiledIn(&SafeZoneInterface);
|
||||||
|
|
||||||
|
// Stack.StepCompiledIn(&GamePhaseStep, true);
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "{} GamePhaseStep: {}", __FUNCTION__, (int)GamePhaseStep);
|
||||||
|
|
||||||
|
return OnGamePhaseStepChangedOriginal(Context, Stack, Ret);
|
||||||
|
}
|
||||||
29
Project Reboot 3.0/FortAthenaMutator_Disco.h
Normal file
29
Project Reboot 3.0/FortAthenaMutator_Disco.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "FortAthenaMutator.h"
|
||||||
|
#include "Array.h"
|
||||||
|
|
||||||
|
struct FControlPointSpawnData
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class AFortAthenaMutator_Disco : public AFortAthenaMutator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static inline void (*OnGamePhaseStepChangedOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
|
|
||||||
|
TArray<FControlPointSpawnData>& GetControlPointSpawnData()
|
||||||
|
{
|
||||||
|
static auto ControlPointSpawnDataOffset = GetOffset("ControlPointSpawnData");
|
||||||
|
return Get<TArray<FControlPointSpawnData>>(ControlPointSpawnDataOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_Disco");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
|
};
|
||||||
@@ -10,19 +10,41 @@
|
|||||||
|
|
||||||
struct FGunGameGunEntry
|
struct FGunGameGunEntry
|
||||||
{
|
{
|
||||||
UFortWeaponItemDefinition* Weapon; // 0x0000(0x0008) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
static UStruct* GetStruct()
|
||||||
FScalableFloat Enabled; // 0x0008(0x0020) (Edit, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
{
|
||||||
FScalableFloat AwardAtElim; // 0x0028(0x0020) (Edit, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.GunGameGunEntry");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
|
||||||
|
UFortWeaponItemDefinition*& GetWeapon()
|
||||||
|
{
|
||||||
|
static auto WeaponOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "Weapon");
|
||||||
|
return *(UFortWeaponItemDefinition**)(__int64(this) + WeaponOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FScalableFloat& GetEnabled()
|
||||||
|
{
|
||||||
|
static auto EnabledOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "Enabled");
|
||||||
|
return *(FScalableFloat*)(__int64(this) + EnabledOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FScalableFloat& GetAwardAtElim()
|
||||||
|
{
|
||||||
|
static auto AwardAtElimOffset = FindOffsetStruct("/Script/FortniteGame.GunGameGunEntry", "AwardAtElim");
|
||||||
|
return *(FScalableFloat*)(__int64(this) + AwardAtElimOffset);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FGunGameGunEntries
|
struct FGunGameGunEntries
|
||||||
{
|
{
|
||||||
TArray<struct FGunGameGunEntry> Entries; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic)
|
TArray<FGunGameGunEntry> Entries; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic)
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FGunGamePlayerData
|
struct FGunGamePlayerData
|
||||||
{
|
{
|
||||||
TArray<class UFortWeaponItemDefinition*> CurrentlyAssignedWeapons; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic)
|
TArray<UFortWeaponItemDefinition*> CurrentlyAssignedWeapons; // 0x0000(0x0010) (ZeroConstructor, NativeAccessSpecifierPublic)
|
||||||
};
|
};
|
||||||
|
|
||||||
class AFortAthenaMutator_GG : public AFortAthenaMutator
|
class AFortAthenaMutator_GG : public AFortAthenaMutator
|
||||||
@@ -50,7 +72,7 @@ public:
|
|||||||
{
|
{
|
||||||
auto& AwardEntriesAtElimMap = GetAwardEntriesAtElimMap();
|
auto& AwardEntriesAtElimMap = GetAwardEntriesAtElimMap();
|
||||||
|
|
||||||
float Value = 0;
|
float Value = 0; // TODO Get from AwardAtElim
|
||||||
|
|
||||||
for (auto& AwardEntry : AwardEntriesAtElimMap)
|
for (auto& AwardEntry : AwardEntriesAtElimMap)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
void AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret)
|
void AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook(UObject* Context, FFrame& Stack, void* Ret)
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "OnGamePhaseStepChangedHook!");
|
LOG_INFO(LogDev, __FUNCTION__);
|
||||||
|
|
||||||
return OnGamePhaseStepChangedOriginal(Context, Stack, Ret);
|
return OnGamePhaseStepChangedOriginal(Context, Stack, Ret);
|
||||||
}
|
}
|
||||||
@@ -9,8 +9,25 @@
|
|||||||
|
|
||||||
struct FItemsToGive
|
struct FItemsToGive
|
||||||
{
|
{
|
||||||
UFortWorldItemDefinition* ItemToDrop; // 0x0000(0x0008) (Edit, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
static UStruct* GetStruct()
|
||||||
FScalableFloat NumberToGive; // 0x0008(0x0020) (Edit, NativeAccessSpecifierPublic)
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.ItemsToGive");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
|
||||||
|
UFortWorldItemDefinition*& GetItemToDrop()
|
||||||
|
{
|
||||||
|
static auto ItemToDropOffset = FindOffsetStruct("/Script/FortniteGame.ItemsToGive", "ItemToDrop");
|
||||||
|
return *(UFortWorldItemDefinition**)(__int64(this) + ItemToDropOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FScalableFloat& GetNumberToGive()
|
||||||
|
{
|
||||||
|
static auto NumberToGiveOffset = FindOffsetStruct("/Script/FortniteGame.ItemsToGive", "NumberToGive");
|
||||||
|
return *(FScalableFloat*)(__int64(this) + NumberToGiveOffset);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class AFortAthenaMutator_GiveItemsAtGamePhaseStep : public AFortAthenaMutator
|
class AFortAthenaMutator_GiveItemsAtGamePhaseStep : public AFortAthenaMutator
|
||||||
|
|||||||
36
Project Reboot 3.0/FortAthenaMutator_Heist.h
Normal file
36
Project Reboot 3.0/FortAthenaMutator_Heist.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "FortAthenaMutator.h"
|
||||||
|
#include "GameplayAbilityTypes.h"
|
||||||
|
#include "reboot.h"
|
||||||
|
|
||||||
|
struct FFortPieSliceSpawnData
|
||||||
|
{
|
||||||
|
FScalableFloat SpawnDirection; // 0x0000(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
FScalableFloat SpawnDirectionDeviation; // 0x0020(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
FScalableFloat MinSpawnDistanceFromCenter; // 0x0040(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
FScalableFloat MaxSpawnDistanceFromCenter; // 0x0060(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FHeistExitCraftSpawnData : public FFortPieSliceSpawnData
|
||||||
|
{
|
||||||
|
FScalableFloat SpawnDelayTime; // 0x0080(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
FScalableFloat SafeZonePhaseWhenToSpawn; // 0x00A0(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
FScalableFloat SafeZonePhaseWhereToSpawn; // 0x00C0(0x0020) (Edit, BlueprintVisible, DisableEditOnInstance, NativeAccessSpecifierPublic)
|
||||||
|
};
|
||||||
|
|
||||||
|
class AFortAthenaMutator_Heist : public AFortAthenaMutator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TArray<FHeistExitCraftSpawnData>& GetHeistExitCraftSpawnData()
|
||||||
|
{
|
||||||
|
static auto HeistExitCraftSpawnDataOffset = GetOffset("HeistExitCraftSpawnData");
|
||||||
|
return Get<TArray<FHeistExitCraftSpawnData>>(HeistExitCraftSpawnDataOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_Heist");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -2,7 +2,123 @@
|
|||||||
|
|
||||||
#include "FortAthenaMutator.h"
|
#include "FortAthenaMutator.h"
|
||||||
|
|
||||||
|
enum class EAthenaLootDropOverride : uint8_t
|
||||||
|
{
|
||||||
|
NoOverride = 0,
|
||||||
|
ForceDrop = 1,
|
||||||
|
ForceKeep = 2,
|
||||||
|
ForceDestroy = 3,
|
||||||
|
ForceDropUnlessRespawning = 4,
|
||||||
|
ForceDestroyUnlessRespawning = 5,
|
||||||
|
EAthenaLootDropOverride_MAX = 6
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class EAthenaInventorySpawnOverride : uint8_t
|
||||||
|
{
|
||||||
|
NoOverride = 0,
|
||||||
|
Always = 1,
|
||||||
|
IntialSpawn = 2,
|
||||||
|
AircraftPhaseOnly = 3,
|
||||||
|
EAthenaInventorySpawnOverride_MAX = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FItemLoadoutContainer
|
||||||
|
{
|
||||||
|
TArray<FItemAndCount> Loadout;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FItemLoadoutTeamMap
|
||||||
|
{
|
||||||
|
unsigned char TeamIndex; // 0x0000(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
unsigned char LoadoutIndex; // 0x0001(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
EAthenaInventorySpawnOverride UpdateOverrideType; // 0x0002(0x0001) (Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
EAthenaLootDropOverride DropAllItemsOverride; // 0x0003(0x0001) (Edit, BlueprintVisible, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
};
|
||||||
|
|
||||||
class AFortAthenaMutator_InventoryOverride : public AFortAthenaMutator
|
class AFortAthenaMutator_InventoryOverride : public AFortAthenaMutator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
TArray<FItemLoadoutContainer>& GetInventoryLoadouts()
|
||||||
|
{
|
||||||
|
static auto InventoryLoadoutsOffset = GetOffset("InventoryLoadouts");
|
||||||
|
return Get<TArray<FItemLoadoutContainer>>(InventoryLoadoutsOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<FItemLoadoutTeamMap>& GetTeamLoadouts()
|
||||||
|
{
|
||||||
|
static auto TeamLoadoutsOffset = GetOffset("TeamLoadouts");
|
||||||
|
return Get<TArray<FItemLoadoutTeamMap>>(TeamLoadoutsOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FItemLoadoutTeamMap GetLoadoutTeamForTeamIndex(uint8_t TeamIndex)
|
||||||
|
{
|
||||||
|
auto& TeamLoadouts = GetTeamLoadouts();
|
||||||
|
|
||||||
|
for (int i = 0; i < TeamLoadouts.Num(); i++)
|
||||||
|
{
|
||||||
|
auto& TeamLoadout = TeamLoadouts.at(i);
|
||||||
|
|
||||||
|
if (TeamLoadout.TeamIndex == TeamIndex)
|
||||||
|
return TeamLoadout;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FItemLoadoutTeamMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
FItemLoadoutContainer GetLoadoutContainerForTeamIndex(uint8_t TeamIndex)
|
||||||
|
{
|
||||||
|
auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex);
|
||||||
|
|
||||||
|
if (LoadoutTeam.TeamIndex == TeamIndex)
|
||||||
|
{
|
||||||
|
auto& InventoryLoadouts = GetInventoryLoadouts();
|
||||||
|
|
||||||
|
if (InventoryLoadouts.Num() - 1 < LoadoutTeam.LoadoutIndex)
|
||||||
|
return FItemLoadoutContainer();
|
||||||
|
|
||||||
|
return InventoryLoadouts.at(LoadoutTeam.LoadoutIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FItemLoadoutContainer();
|
||||||
|
}
|
||||||
|
|
||||||
|
EAthenaInventorySpawnOverride& GetInventoryUpdateOverride(uint8_t TeamIndex = 255)
|
||||||
|
{
|
||||||
|
if (TeamIndex != 255)
|
||||||
|
{
|
||||||
|
auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex);
|
||||||
|
|
||||||
|
if (LoadoutTeam.TeamIndex == TeamIndex)
|
||||||
|
{
|
||||||
|
if (LoadoutTeam.UpdateOverrideType != EAthenaInventorySpawnOverride::NoOverride)
|
||||||
|
return LoadoutTeam.UpdateOverrideType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto InventoryUpdateOverrideOffset = GetOffset("InventoryUpdateOverride");
|
||||||
|
return Get<EAthenaInventorySpawnOverride>(InventoryUpdateOverrideOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAthenaLootDropOverride& GetDropAllItemsOverride(uint8_t TeamIndex = 255)
|
||||||
|
{
|
||||||
|
if (TeamIndex != 255)
|
||||||
|
{
|
||||||
|
auto LoadoutTeam = GetLoadoutTeamForTeamIndex(TeamIndex);
|
||||||
|
|
||||||
|
if (LoadoutTeam.TeamIndex == TeamIndex)
|
||||||
|
{
|
||||||
|
if (LoadoutTeam.DropAllItemsOverride != EAthenaLootDropOverride::NoOverride)
|
||||||
|
return LoadoutTeam.DropAllItemsOverride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto DropAllItemsOverrideOffset = GetOffset("DropAllItemsOverride");
|
||||||
|
return Get<EAthenaLootDropOverride>(DropAllItemsOverrideOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator_InventoryOverride");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "OnlineReplStructs.h"
|
#include "OnlineReplStructs.h"
|
||||||
#include "BGA.h"
|
#include "BGA.h"
|
||||||
#include "vendingmachine.h"
|
#include "vendingmachine.h"
|
||||||
|
#include "FortAthenaMutator.h"
|
||||||
|
|
||||||
static UFortPlaylist* GetPlaylistToUse()
|
static UFortPlaylist* GetPlaylistToUse()
|
||||||
{
|
{
|
||||||
@@ -212,7 +213,7 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
|
|||||||
|
|
||||||
auto Fortnite_Season = std::floor(Fortnite_Version);
|
auto Fortnite_Season = std::floor(Fortnite_Version);
|
||||||
|
|
||||||
if (false) // Manual foundation showing
|
// if (false) // Manual foundation showing
|
||||||
{
|
{
|
||||||
if (Fortnite_Season >= 7 && Fortnite_Season <= 10)
|
if (Fortnite_Season >= 7 && Fortnite_Season <= 10)
|
||||||
{
|
{
|
||||||
@@ -548,6 +549,8 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
|
|||||||
Globals::bStartedListening = true;
|
Globals::bStartedListening = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Ret = false;
|
||||||
|
|
||||||
if (Engine_Version >= 424) // returning true is stripped on c2+
|
if (Engine_Version >= 424) // returning true is stripped on c2+
|
||||||
{
|
{
|
||||||
static auto WarmupRequiredPlayerCountOffset = GameMode->GetOffset("WarmupRequiredPlayerCount");
|
static auto WarmupRequiredPlayerCountOffset = GameMode->GetOffset("WarmupRequiredPlayerCount");
|
||||||
@@ -561,13 +564,67 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game
|
|||||||
// if (MapInfo->Get<TArray<__int64>>(FlightInfosOffset).ArrayNum > 0)
|
// if (MapInfo->Get<TArray<__int64>>(FlightInfosOffset).ArrayNum > 0)
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "ReadyToStartMatch Return Address: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0)));
|
LOG_INFO(LogDev, "ReadyToStartMatch Return Address: 0x{:x}", __int64(_ReturnAddress()) - __int64(GetModuleHandleW(0)));
|
||||||
return true;
|
Ret = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Athena_ReadyToStartMatchOriginal(GameMode);
|
if (!Ret)
|
||||||
|
Ret = Athena_ReadyToStartMatchOriginal(GameMode);
|
||||||
|
|
||||||
|
if (Ret)
|
||||||
|
{
|
||||||
|
// We are assuming it successfully became warmup.
|
||||||
|
|
||||||
|
static auto mutatorClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
|
||||||
|
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), mutatorClass);
|
||||||
|
|
||||||
|
std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall;
|
||||||
|
|
||||||
|
for (int i = 0; i < AllMutators.Num(); i++)
|
||||||
|
{
|
||||||
|
auto Mutator = (AFortAthenaMutator*)AllMutators.at(i);
|
||||||
|
|
||||||
|
FunctionsToCall.push_back(std::make_pair(Mutator, Mutator->FindFunction("OnGamePhaseStepChanged")));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int LastNum1 = 3125;
|
||||||
|
|
||||||
|
if (LastNum1 != Globals::AmountOfListens)
|
||||||
|
{
|
||||||
|
LastNum1 = Globals::AmountOfListens;
|
||||||
|
|
||||||
|
for (auto& FunctionToCallPair : FunctionsToCall)
|
||||||
|
{
|
||||||
|
// On newer versions there is a second param.
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "FunctionToCallPair.second: {}", __int64(FunctionToCallPair.second));
|
||||||
|
|
||||||
|
if (FunctionToCallPair.second)
|
||||||
|
{
|
||||||
|
if (Fortnite_Version < 10)
|
||||||
|
{
|
||||||
|
// mem leak btw
|
||||||
|
|
||||||
|
auto a = ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::None);
|
||||||
|
|
||||||
|
if (a)
|
||||||
|
{
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, a);
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::Setup));
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::Warmup));
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormFormingGamePhaseStep);
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormHoldingGamePhaseStep);
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormShrinkingGamePhaseStep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller)
|
int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller)
|
||||||
@@ -580,11 +637,26 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
|
|||||||
|
|
||||||
static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false);
|
static auto CurrentPlaylistDataOffset = GameState->GetOffset("CurrentPlaylistData", false);
|
||||||
|
|
||||||
UObject* Playlist = nullptr;
|
UFortPlaylist* Playlist = nullptr;
|
||||||
|
|
||||||
|
bool bVersionHasPlaylist = false;
|
||||||
|
|
||||||
|
if (CurrentPlaylistDataOffset != -1 || Fortnite_Version >= 6)
|
||||||
|
{
|
||||||
|
bVersionHasPlaylist = true;
|
||||||
|
Playlist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist();
|
||||||
|
}
|
||||||
|
|
||||||
static int DefaultFirstTeam = 3;
|
static int DefaultFirstTeam = 3;
|
||||||
|
|
||||||
|
if (Playlist)
|
||||||
|
{
|
||||||
|
static auto bIsLargeTeamGameOffset = Playlist->GetOffset("bIsLargeTeamGame");
|
||||||
|
bool bIsLargeTeamGame = Playlist->Get<bool>(bIsLargeTeamGameOffset);
|
||||||
|
}
|
||||||
|
|
||||||
static int CurrentTeamMembers = 0; // bad
|
static int CurrentTeamMembers = 0; // bad
|
||||||
static int Current = 3;
|
static int Current = DefaultFirstTeam;
|
||||||
|
|
||||||
static int LastNum = 1;
|
static int LastNum = 1;
|
||||||
|
|
||||||
@@ -592,7 +664,7 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
|
|||||||
{
|
{
|
||||||
LastNum = AmountOfRestarts;
|
LastNum = AmountOfRestarts;
|
||||||
|
|
||||||
Current = 3;
|
Current = DefaultFirstTeam;
|
||||||
CurrentTeamMembers = 0;
|
CurrentTeamMembers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,10 +675,8 @@ int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint
|
|||||||
|
|
||||||
bool bShouldSpreadTeams = false;
|
bool bShouldSpreadTeams = false;
|
||||||
|
|
||||||
if (CurrentPlaylistDataOffset != -1 || Fortnite_Version >= 6)
|
if (bVersionHasPlaylist)
|
||||||
{
|
{
|
||||||
Playlist = CurrentPlaylistDataOffset == -1 && Fortnite_Version < 6 ? nullptr : GameState->GetCurrentPlaylist();
|
|
||||||
|
|
||||||
if (!Playlist)
|
if (!Playlist)
|
||||||
{
|
{
|
||||||
CurrentTeamMembers = 0;
|
CurrentTeamMembers = 0;
|
||||||
@@ -754,7 +824,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
// CurrentActor->K2_DestroyActor();
|
// CurrentActor->K2_DestroyActor();
|
||||||
// continue;
|
// continue;
|
||||||
|
|
||||||
if (Engine_Version != 419)
|
// if (Engine_Version != 419)
|
||||||
{
|
{
|
||||||
auto Location = CurrentActor->GetActorLocation();
|
auto Location = CurrentActor->GetActorLocation();
|
||||||
Location.Z += UpZ;
|
Location.Z += UpZ;
|
||||||
|
|||||||
@@ -9,6 +9,33 @@
|
|||||||
|
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
TScriptInterface<UFortSafeZoneInterface> AFortGameStateAthena::GetSafeZoneInterface()
|
||||||
|
{
|
||||||
|
int Offset = -1;
|
||||||
|
|
||||||
|
if (Fortnite_Version == 10.40)
|
||||||
|
{
|
||||||
|
// Offset = 0xF60;
|
||||||
|
}
|
||||||
|
|
||||||
|
TScriptInterface<UFortSafeZoneInterface> ScriptInterface{};
|
||||||
|
|
||||||
|
if (Offset != -1)
|
||||||
|
{
|
||||||
|
auto idk = (void*)(__int64(this) + Offset);
|
||||||
|
|
||||||
|
UObject* ObjectPtr = reinterpret_cast<UObject* (*)(__int64)>(((UObject*)idk)->VFTable[0x1])(__int64(idk)); // not actually a uobject but its just how we can get vft
|
||||||
|
|
||||||
|
if (ObjectPtr)
|
||||||
|
{
|
||||||
|
ScriptInterface.ObjectPointer = ObjectPtr;
|
||||||
|
ScriptInterface.InterfacePointer = ObjectPtr->GetInterfaceAddress(UFortSafeZoneInterface::StaticClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ScriptInterface;
|
||||||
|
}
|
||||||
|
|
||||||
UFortPlaylist*& AFortGameStateAthena::GetCurrentPlaylist()
|
UFortPlaylist*& AFortGameStateAthena::GetCurrentPlaylist()
|
||||||
{
|
{
|
||||||
static auto CurrentPlaylistInfoOffset = GetOffset("CurrentPlaylistInfo", false);
|
static auto CurrentPlaylistInfoOffset = GetOffset("CurrentPlaylistInfo", false);
|
||||||
|
|||||||
@@ -4,6 +4,26 @@
|
|||||||
#include "FortPlayerState.h"
|
#include "FortPlayerState.h"
|
||||||
#include "FortPlaylist.h"
|
#include "FortPlaylist.h"
|
||||||
#include "BuildingStructuralSupportSystem.h"
|
#include "BuildingStructuralSupportSystem.h"
|
||||||
|
#include "ScriptInterface.h"
|
||||||
|
#include "Interface.h"
|
||||||
|
|
||||||
|
enum class EAthenaGamePhaseStep : uint8_t // idk if this changes
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Setup = 1,
|
||||||
|
Warmup = 2,
|
||||||
|
GetReady = 3,
|
||||||
|
BusLocked = 4,
|
||||||
|
BusFlying = 5,
|
||||||
|
StormForming = 6,
|
||||||
|
StormHolding = 7,
|
||||||
|
StormShrinking = 8,
|
||||||
|
Countdown = 9,
|
||||||
|
FinalCountdown = 10,
|
||||||
|
EndGame = 11,
|
||||||
|
Count = 12,
|
||||||
|
EAthenaGamePhaseStep_MAX = 13
|
||||||
|
};
|
||||||
|
|
||||||
enum class EAthenaGamePhase : uint8_t
|
enum class EAthenaGamePhase : uint8_t
|
||||||
{
|
{
|
||||||
@@ -17,6 +37,16 @@ enum class EAthenaGamePhase : uint8_t
|
|||||||
EAthenaGamePhase_MAX = 7
|
EAthenaGamePhase_MAX = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class UFortSafeZoneInterface : public UInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UClass>("/Script/FortniteGame.FortSafeZoneInterface");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct FPlayerBuildableClassContainer
|
struct FPlayerBuildableClassContainer
|
||||||
{
|
{
|
||||||
TArray<UClass*> BuildingClasses; // 0x0000(0x0010) (ZeroConstructor, Transient, UObjectWrapper, NativeAccessSpecifierPublic)
|
TArray<UClass*> BuildingClasses; // 0x0000(0x0010) (ZeroConstructor, Transient, UObjectWrapper, NativeAccessSpecifierPublic)
|
||||||
@@ -50,6 +80,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
UFortPlaylist*& GetCurrentPlaylist();
|
UFortPlaylist*& GetCurrentPlaylist();
|
||||||
|
TScriptInterface<UFortSafeZoneInterface> GetSafeZoneInterface();
|
||||||
|
|
||||||
// void AddPlayerStateToGameMemberInfo(class AFortPlayerStateAthena* PlayerState);
|
// void AddPlayerStateToGameMemberInfo(class AFortPlayerStateAthena* PlayerState);
|
||||||
|
|
||||||
@@ -59,3 +90,35 @@ public:
|
|||||||
void OnRep_GamePhase();
|
void OnRep_GamePhase();
|
||||||
void OnRep_CurrentPlaylistInfo();
|
void OnRep_CurrentPlaylistInfo();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void* ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep GamePhaseStep)
|
||||||
|
{
|
||||||
|
struct AFortAthenaAIBotController_OnGamePhaseStepChanged_Params
|
||||||
|
{
|
||||||
|
TScriptInterface<UFortSafeZoneInterface> SafeZoneInterface; // (ConstParm, Parm, OutParm, ZeroConstructor, ReferenceParm, IsPlainOldData, NoDestructor, UObjectWrapper, NativeAccessSpecifierPublic)
|
||||||
|
EAthenaGamePhaseStep GamePhaseStep; // (ConstParm, Parm, ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||||
|
};
|
||||||
|
|
||||||
|
bool bHasSafeZoneInterfaceParam = Fortnite_Version >= 10; // idk what version
|
||||||
|
|
||||||
|
AFortAthenaAIBotController_OnGamePhaseStepChanged_Params* Params = Alloc<AFortAthenaAIBotController_OnGamePhaseStepChanged_Params>();
|
||||||
|
|
||||||
|
if (bHasSafeZoneInterfaceParam)
|
||||||
|
{
|
||||||
|
auto GameState = (AFortGameStateAthena*)GetWorld()->GetGameState();
|
||||||
|
|
||||||
|
auto Interface = GameState->GetSafeZoneInterface();
|
||||||
|
|
||||||
|
if (!Interface.ObjectPointer)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
Params->SafeZoneInterface = Interface;
|
||||||
|
Params->GamePhaseStep = GamePhaseStep;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*(EAthenaGamePhaseStep*)(__int64(Params) + 0) = GamePhaseStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Params;
|
||||||
|
}
|
||||||
@@ -3,10 +3,54 @@
|
|||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "Stack.h"
|
#include "Stack.h"
|
||||||
|
|
||||||
|
#include "GameplayAbilityTypes.h"
|
||||||
|
#include "FortWorldItemDefinition.h"
|
||||||
|
|
||||||
|
struct FActiveItemGrantInfo
|
||||||
|
{
|
||||||
|
static UStruct* GetStruct()
|
||||||
|
{
|
||||||
|
static auto Struct = FindObject<UStruct>("/Script/FortniteGame.ActiveItemGrantInfo");
|
||||||
|
return Struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetStructSize() { return GetStruct()->GetPropertiesSize(); }
|
||||||
|
|
||||||
|
UFortWorldItemDefinition*& GetItem()
|
||||||
|
{
|
||||||
|
static auto ItemOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "Item");
|
||||||
|
return *(UFortWorldItemDefinition**)(__int64(this) + ItemOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FScalableFloat& GetAmountToGive()
|
||||||
|
{
|
||||||
|
static auto AmountToGiveOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "AmountToGive");
|
||||||
|
return *(FScalableFloat*)(__int64(this) + AmountToGiveOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
FScalableFloat& GetMaxAmount()
|
||||||
|
{
|
||||||
|
static auto MaxAmountOffset = FindOffsetStruct("/Script/FortniteGame.ActiveItemGrantInfo", "MaxAmount");
|
||||||
|
return *(FScalableFloat*)(__int64(this) + MaxAmountOffset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class UFortGameplayAbilityAthena_PeriodicItemGrant : public UObject // UFortGameplayAbility
|
class UFortGameplayAbilityAthena_PeriodicItemGrant : public UObject // UFortGameplayAbility
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static inline void (*StartItemAwardTimersOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
static inline void (*StartItemAwardTimersOriginal)(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
|
|
||||||
|
TMap<FActiveItemGrantInfo, FScalableFloat>& GetItemsToGrant()
|
||||||
|
{
|
||||||
|
static auto ItemsToGrantOffset = GetOffset("ItemsToGrant");
|
||||||
|
return Get<TMap<FActiveItemGrantInfo, FScalableFloat>>(ItemsToGrantOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<FTimerHandle>& GetActiveTimers()
|
||||||
|
{
|
||||||
|
static auto ActiveTimersOffset = GetOffset("ActiveTimers");
|
||||||
|
return Get<TArray<FTimerHandle>>(ActiveTimersOffset);
|
||||||
|
}
|
||||||
|
|
||||||
static void StartItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret);
|
static void StartItemAwardTimersHook(UObject* Context, FFrame& Stack, void* Ret);
|
||||||
};
|
};
|
||||||
@@ -160,13 +160,8 @@ std::pair<std::vector<UFortItem*>, std::vector<UFortItem*>> AFortInventory::AddI
|
|||||||
auto ReplicatedEntryIdx = GetItemList().GetReplicatedEntries().Add(*NewItemInstance->GetItemEntry(), FortItemEntrySize);
|
auto ReplicatedEntryIdx = GetItemList().GetReplicatedEntries().Add(*NewItemInstance->GetItemEntry(), FortItemEntrySize);
|
||||||
// GetItemList().GetReplicatedEntries().AtPtr(ReplicatedEntryIdx, FFortItemEntry::GetStructSize())->GetIsReplicatedCopy() = true;
|
// GetItemList().GetReplicatedEntries().AtPtr(ReplicatedEntryIdx, FFortItemEntry::GetStructSize())->GetIsReplicatedCopy() = true;
|
||||||
|
|
||||||
if (WorldItemDefinition->IsValidLowLevel())
|
if (FortPlayerController && WorldItemDefinition->IsValidLowLevel())
|
||||||
{
|
{
|
||||||
if (WorldItemDefinition->ShouldFocusWhenAdded()) // Should we also do this for stacking?
|
|
||||||
{
|
|
||||||
FortPlayerController->ServerExecuteInventoryItemHook(FortPlayerController, NewItemInstance->GetItemEntry()->GetItemGuid());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AreGadgetsEnabled = Addresses::ApplyGadgetData && Addresses::RemoveGadgetData && Globals::bEnableAGIDs;
|
bool AreGadgetsEnabled = Addresses::ApplyGadgetData && Addresses::RemoveGadgetData && Globals::bEnableAGIDs;
|
||||||
|
|
||||||
if (AreGadgetsEnabled)
|
if (AreGadgetsEnabled)
|
||||||
@@ -180,11 +175,26 @@ std::pair<std::vector<UFortItem*>, std::vector<UFortItem*>> AFortInventory::AddI
|
|||||||
|
|
||||||
bool (*ApplyGadgetData)(UFortGadgetItemDefinition * a1, __int64 a2, UFortItem* a3, unsigned __int8 a4) = decltype(ApplyGadgetData)(Addresses::ApplyGadgetData);
|
bool (*ApplyGadgetData)(UFortGadgetItemDefinition * a1, __int64 a2, UFortItem* a3, unsigned __int8 a4) = decltype(ApplyGadgetData)(Addresses::ApplyGadgetData);
|
||||||
static auto FortInventoryOwnerInterfaceClass = FindObject<UClass>("/Script/FortniteGame.FortInventoryOwnerInterface");
|
static auto FortInventoryOwnerInterfaceClass = FindObject<UClass>("/Script/FortniteGame.FortInventoryOwnerInterface");
|
||||||
auto Interface = __int64(PlayerController->GetInterfaceAddress(FortInventoryOwnerInterfaceClass));
|
auto Interface = __int64(FortPlayerController->GetInterfaceAddress(FortInventoryOwnerInterfaceClass));
|
||||||
LOG_INFO(LogDev, "Res: {}", ApplyGadgetData(GadgetItemDefinition, Interface, NewItemInstance, true));
|
LOG_INFO(LogDev, "Res: {}", ApplyGadgetData(GadgetItemDefinition, Interface, NewItemInstance, true));
|
||||||
|
|
||||||
|
if (Fortnite_Version < 7)
|
||||||
|
{
|
||||||
|
auto PickaxeInstance = GetPickaxeInstance();
|
||||||
|
|
||||||
|
if (PickaxeInstance)
|
||||||
|
{
|
||||||
|
RemoveItem(PickaxeInstance->GetItemEntry()->GetItemGuid(), nullptr, PickaxeInstance->GetItemEntry()->GetCount(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WorldItemDefinition->ShouldFocusWhenAdded()) // Should we also do this for stacking?
|
||||||
|
{
|
||||||
|
FortPlayerController->ServerExecuteInventoryItemHook(FortPlayerController, NewItemInstance->GetItemEntry()->GetItemGuid());
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "Not Valid!");
|
LOG_INFO(LogDev, "Not Valid!");
|
||||||
@@ -343,6 +353,21 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int
|
|||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "Unequipping Gadget!");
|
LOG_INFO(LogDev, "Unequipping Gadget!");
|
||||||
GadgetItemDefinition->UnequipGadgetData(FortPlayerController, ItemInstances.at(i));
|
GadgetItemDefinition->UnequipGadgetData(FortPlayerController, ItemInstances.at(i));
|
||||||
|
|
||||||
|
if (Fortnite_Version < 7)
|
||||||
|
{
|
||||||
|
auto CosmeticLoadout = FortPlayerController->GetCosmeticLoadout();
|
||||||
|
// LOG_INFO(LogDev, "CosmeticLoadout: {}", __int64(CosmeticLoadout));
|
||||||
|
auto CosmeticLoadoutPickaxe = CosmeticLoadout ? CosmeticLoadout->GetPickaxe() : nullptr;
|
||||||
|
// LOG_INFO(LogDev, "CosmeticLoadoutPickaxe: {}", __int64(CosmeticLoadoutPickaxe));
|
||||||
|
// LOG_INFO(LogDev, "CosmeticLoadoutPickaxe Name: {}", CosmeticLoadoutPickaxe ? CosmeticLoadoutPickaxe->GetFullName() : "InvalidObject");
|
||||||
|
static auto WeaponDefinitionOffset = FindOffsetStruct("/Script/FortniteGame.AthenaPickaxeItemDefinition", "WeaponDefinition");
|
||||||
|
|
||||||
|
auto PickaxeDefinition = CosmeticLoadoutPickaxe ? CosmeticLoadoutPickaxe->Get<UFortItemDefinition*>(WeaponDefinitionOffset)
|
||||||
|
: FindObject<UFortItemDefinition>(L"/Game/Athena/Items/Weapons/WID_Harvest_Pickaxe_Athena_C_T01.WID_Harvest_Pickaxe_Athena_C_T01");
|
||||||
|
|
||||||
|
this->AddItem(PickaxeDefinition, nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -890,7 +890,7 @@ void AFortPlayerController::ServerAttemptInventoryDropHook(AFortPlayerController
|
|||||||
if (!ItemDefinition || !ItemDefinition->CanBeDropped())
|
if (!ItemDefinition || !ItemDefinition->CanBeDropped())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!ItemDefinition->ShouldIgnoreRespawningOnDrop())
|
if (!ItemDefinition->ShouldIgnoreRespawningOnDrop() && ItemDefinition->GetDropBehavior() != EWorldItemDropBehavior::DestroyOnDrop)
|
||||||
{
|
{
|
||||||
auto Pickup = AFortPickup::SpawnPickup(ReplicatedEntry, Pawn->GetActorLocation(),
|
auto Pickup = AFortPickup::SpawnPickup(ReplicatedEntry, Pawn->GetActorLocation(),
|
||||||
EFortPickupSourceTypeFlag::Player, EFortPickupSpawnSource::Unset, Pawn);
|
EFortPickupSourceTypeFlag::Player, EFortPickupSpawnSource::Unset, Pawn);
|
||||||
|
|||||||
@@ -9,6 +9,72 @@
|
|||||||
#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h"
|
#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h"
|
||||||
#include "DataTableFunctionLibrary.h"
|
#include "DataTableFunctionLibrary.h"
|
||||||
|
|
||||||
|
void AFortPlayerControllerAthena::StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret)
|
||||||
|
{
|
||||||
|
LOG_INFO(LogDev, __FUNCTION__);
|
||||||
|
|
||||||
|
auto Controller = (AFortPlayerControllerAthena*)Context;
|
||||||
|
|
||||||
|
UFortWorldItemDefinition* ItemProvidingGhostMode = nullptr;
|
||||||
|
|
||||||
|
Stack->StepCompiledIn(&ItemProvidingGhostMode);
|
||||||
|
|
||||||
|
if (!ItemProvidingGhostMode)
|
||||||
|
return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
// if (!Controller->HasAuthority) return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
// if (Controller->GhostModeRepData.bInGhostMode) return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
auto WorldInventory = Controller->GetWorldInventory();
|
||||||
|
|
||||||
|
if (!WorldInventory)
|
||||||
|
return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
bool bShouldUpdate = false;
|
||||||
|
auto NewAndModifiedInstances = WorldInventory->AddItem(ItemProvidingGhostMode, &bShouldUpdate, 1);
|
||||||
|
auto GhostModeItemInstance = NewAndModifiedInstances.first[0];
|
||||||
|
|
||||||
|
if (!GhostModeItemInstance)
|
||||||
|
return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
|
||||||
|
if (bShouldUpdate)
|
||||||
|
WorldInventory->Update();
|
||||||
|
|
||||||
|
Controller->ServerExecuteInventoryItemHook(Controller, GhostModeItemInstance->GetItemEntry()->GetItemGuid());
|
||||||
|
|
||||||
|
return StartGhostModeOriginal(Context, Stack, Ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AFortPlayerControllerAthena::EndGhostModeHook(AFortPlayerControllerAthena* PlayerController)
|
||||||
|
{
|
||||||
|
// I believe there are a lot of other places we should remove it (go to XREFs of K2_RemoveItemFromPlayer on a version like 6.21, and there will be something checking ghost stuff).
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, __FUNCTION__);
|
||||||
|
|
||||||
|
auto WorldInventory = PlayerController->GetWorldInventory();
|
||||||
|
|
||||||
|
if (!WorldInventory)
|
||||||
|
return EndGhostModeOriginal(PlayerController);
|
||||||
|
|
||||||
|
auto GhostModeRepData = PlayerController->GetGhostModeRepData();
|
||||||
|
|
||||||
|
auto GhostModeItemDef = GhostModeRepData->GetGhostModeItemDef();
|
||||||
|
auto GhostModeItemInstance = WorldInventory->FindItemInstance(GhostModeItemDef);
|
||||||
|
|
||||||
|
if (GhostModeItemInstance)
|
||||||
|
{
|
||||||
|
bool bShouldUpdate = false;
|
||||||
|
int Count = 1; // GhostModeItemInstance->GetItemEntry()->GetCount()
|
||||||
|
WorldInventory->RemoveItem(GhostModeItemInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, Count);
|
||||||
|
|
||||||
|
if (bShouldUpdate)
|
||||||
|
WorldInventory->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
return EndGhostModeOriginal(PlayerController);
|
||||||
|
}
|
||||||
|
|
||||||
void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraft)
|
void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraft)
|
||||||
{
|
{
|
||||||
auto PlayerController = Cast<AFortPlayerController>(Engine_Version < 424 ? PC : ((UActorComponent*)PC)->GetOwner());
|
auto PlayerController = Cast<AFortPlayerController>(Engine_Version < 424 ? PC : ((UActorComponent*)PC)->GetOwner());
|
||||||
@@ -16,7 +82,7 @@ void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraf
|
|||||||
if (!PlayerController)
|
if (!PlayerController)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LOG_INFO(LogDev, "EnterAircraftHook");
|
// LOG_INFO(LogDev, "EnterAircraftHook");
|
||||||
|
|
||||||
EnterAircraftOriginal(PC, Aircraft);
|
EnterAircraftOriginal(PC, Aircraft);
|
||||||
|
|
||||||
@@ -55,36 +121,49 @@ void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraf
|
|||||||
static auto mutatorClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
|
static auto mutatorClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
|
||||||
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), mutatorClass);
|
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), mutatorClass);
|
||||||
|
|
||||||
|
std::vector<std::pair<AFortAthenaMutator*, UFunction*>> FunctionsToCall;
|
||||||
|
|
||||||
for (int i = 0; i < AllMutators.Num(); i++)
|
for (int i = 0; i < AllMutators.Num(); i++)
|
||||||
{
|
{
|
||||||
auto Mutator = AllMutators.at(i);
|
auto Mutator = (AFortAthenaMutator*)AllMutators.at(i);
|
||||||
|
|
||||||
LOG_INFO(LogDev, "[{}] Mutator: {}", i, Mutator->GetFullName());
|
LOG_INFO(LogDev, "[{}] Mutator: {}", i, Mutator->GetFullName());
|
||||||
|
|
||||||
|
FunctionsToCall.push_back(std::make_pair(Mutator, Mutator->FindFunction("OnGamePhaseStepChanged")));
|
||||||
|
|
||||||
if (auto GiveItemsAtGamePhaseStepMutator = Cast<AFortAthenaMutator_GiveItemsAtGamePhaseStep>(Mutator))
|
if (auto GiveItemsAtGamePhaseStepMutator = Cast<AFortAthenaMutator_GiveItemsAtGamePhaseStep>(Mutator))
|
||||||
{
|
{
|
||||||
auto PhaseToGive = GiveItemsAtGamePhaseStepMutator->GetPhaseToGiveItems();
|
auto PhaseToGive = GiveItemsAtGamePhaseStepMutator->GetPhaseToGiveItems();
|
||||||
|
|
||||||
LOG_INFO(LogDev, "[{}] PhaseToGiveItems: {}", i, (int)PhaseToGive);
|
|
||||||
|
|
||||||
auto& ItemsToGive = GiveItemsAtGamePhaseStepMutator->GetItemsToGive();
|
auto& ItemsToGive = GiveItemsAtGamePhaseStepMutator->GetItemsToGive();
|
||||||
|
|
||||||
LOG_INFO(LogDev, "[{}] ItemsToGive.Num(): {}", i, ItemsToGive.Num());
|
LOG_INFO(LogDev, "[{}] PhaseToGiveItems: {} ItemsToGive.Num(): {}", i, (int)PhaseToGive, ItemsToGive.Num());
|
||||||
|
|
||||||
if (PhaseToGive <= 5) // Flying or lower
|
if (PhaseToGive <= 5) // Flying or lower
|
||||||
{
|
{
|
||||||
for (int j = 0; j < ItemsToGive.Num(); j++)
|
for (int j = 0; j < ItemsToGive.Num(); j++)
|
||||||
{
|
{
|
||||||
auto& ItemToGive = ItemsToGive.at(j);
|
auto ItemToGive = ItemsToGive.AtPtr(j, FItemsToGive::GetStructSize());
|
||||||
|
|
||||||
|
if (!ItemToGive->GetItemToDrop())
|
||||||
|
continue;
|
||||||
|
|
||||||
float Out = 1;
|
float Out = 1;
|
||||||
FString ContextString;
|
FString ContextString;
|
||||||
EEvaluateCurveTableResult result;
|
EEvaluateCurveTableResult result;
|
||||||
// UDataTableFunctionLibrary::EvaluateCurveTableRow(ItemToGive.NumberToGive.GetCurve().CurveTable, ItemToGive.NumberToGive.GetCurve().RowName, 0.f, ContextString, &result, &Out);
|
float Out2 = 0;
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Out: {}", Out);
|
if (!IsBadReadPtr(ItemToGive->GetNumberToGive().GetCurve().CurveTable, 8) && ItemToGive->GetNumberToGive().GetCurve().RowName.IsValid())
|
||||||
|
{
|
||||||
|
UDataTableFunctionLibrary::EvaluateCurveTableRow(ItemToGive->GetNumberToGive().GetCurve().CurveTable, ItemToGive->GetNumberToGive().GetCurve().RowName,
|
||||||
|
0.f, ContextString, &result, &Out2);
|
||||||
|
}
|
||||||
|
|
||||||
WorldInventory->AddItem(ItemToGive.ItemToDrop, nullptr, Out);
|
LOG_INFO(LogDev, "[{}] [{}] Out: {} Out2: {} ItemToGive.ItemToDrop: {}", i, j, Out, Out2, ItemToGive->GetItemToDrop()->IsValidLowLevel() ? ItemToGive->GetItemToDrop()->GetFullName() : "BadRead");
|
||||||
|
|
||||||
|
if (!Out2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
WorldInventory->AddItem(ItemToGive->GetItemToDrop(), nullptr, Out2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,7 +180,43 @@ void AFortPlayerControllerAthena::EnterAircraftHook(UObject* PC, AActor* Aircraf
|
|||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int LastNum1 = 3125;
|
||||||
|
|
||||||
|
if (LastNum1 != Globals::AmountOfListens)
|
||||||
|
{
|
||||||
|
LastNum1 = Globals::AmountOfListens;
|
||||||
|
|
||||||
|
for (auto& FunctionToCallPair : FunctionsToCall)
|
||||||
|
{
|
||||||
|
// On newer versions there is a second param.
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "FunctionToCallPair.second: {}", __int64(FunctionToCallPair.second));
|
||||||
|
|
||||||
|
if (FunctionToCallPair.second)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
// mem leak btw
|
||||||
|
|
||||||
|
auto a = ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::GetReady);
|
||||||
|
|
||||||
|
if (a)
|
||||||
|
{
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, a);
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::BusLocked));
|
||||||
|
FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, ConstructOnGamePhaseStepChangedParams(EAthenaGamePhaseStep::BusFlying));
|
||||||
|
}
|
||||||
|
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormFormingGamePhaseStep);
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormHoldingGamePhaseStep);
|
||||||
|
// FunctionToCallPair.first->ProcessEvent(FunctionToCallPair.second, &StormShrinkingGamePhaseStep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WorldInventory->Update();
|
WorldInventory->Update();
|
||||||
|
|
||||||
|
// Should we equip the pickaxe for older builds here?
|
||||||
}
|
}
|
||||||
|
|
||||||
void AFortPlayerControllerAthena::ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex)
|
void AFortPlayerControllerAthena::ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex)
|
||||||
|
|||||||
@@ -73,6 +73,21 @@ static void ApplyCID(AFortPlayerPawn* Pawn, UObject* CID, bool bUseServerChooseP
|
|||||||
// PlayerState->Get(HeroTypeOffset) = HeroDefinition;
|
// PlayerState->Get(HeroTypeOffset) = HeroDefinition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FGhostModeRepData
|
||||||
|
{
|
||||||
|
bool& IsInGhostMode()
|
||||||
|
{
|
||||||
|
static auto bInGhostModeOffset = FindOffsetStruct("/Script/FortniteGame.GhostModeRepData", "bInGhostMode");
|
||||||
|
return *(bool*)(__int64(this) + bInGhostModeOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
UFortWorldItemDefinition*& GetGhostModeItemDef()
|
||||||
|
{
|
||||||
|
static auto GhostModeItemDefOffset = FindOffsetStruct("/Script/FortniteGame.GhostModeRepData", "GhostModeItemDef");
|
||||||
|
return *(UFortWorldItemDefinition**)(__int64(this) + GhostModeItemDefOffset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class AFortPlayerControllerAthena : public AFortPlayerController
|
class AFortPlayerControllerAthena : public AFortPlayerController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -80,18 +95,28 @@ public:
|
|||||||
static inline void (*ServerReadyToStartMatchOriginal)(AFortPlayerControllerAthena* PlayerController);
|
static inline void (*ServerReadyToStartMatchOriginal)(AFortPlayerControllerAthena* PlayerController);
|
||||||
static inline void (*ServerRequestSeatChangeOriginal)(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex);
|
static inline void (*ServerRequestSeatChangeOriginal)(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex);
|
||||||
static inline void (*EnterAircraftOriginal)(UObject* PC, AActor* Aircraft);
|
static inline void (*EnterAircraftOriginal)(UObject* PC, AActor* Aircraft);
|
||||||
|
static inline void (*StartGhostModeOriginal)(UObject* Context, FFrame* Stack, void* Ret);
|
||||||
|
static inline void (*EndGhostModeOriginal)(AFortPlayerControllerAthena* PlayerController);
|
||||||
|
|
||||||
AFortPlayerStateAthena* GetPlayerStateAthena()
|
AFortPlayerStateAthena* GetPlayerStateAthena()
|
||||||
{
|
{
|
||||||
return (AFortPlayerStateAthena*)GetPlayerState();
|
return (AFortPlayerStateAthena*)GetPlayerState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FGhostModeRepData* GetGhostModeRepData()
|
||||||
|
{
|
||||||
|
static auto GhostModeRepDataOffset = GetOffset("GhostModeRepData");
|
||||||
|
return GetPtr<FGhostModeRepData>(GhostModeRepDataOffset);
|
||||||
|
}
|
||||||
|
|
||||||
UAthenaMarkerComponent* GetMarkerComponent()
|
UAthenaMarkerComponent* GetMarkerComponent()
|
||||||
{
|
{
|
||||||
static auto MarkerComponentOffset = GetOffset("MarkerComponent");
|
static auto MarkerComponentOffset = GetOffset("MarkerComponent");
|
||||||
return Get<UAthenaMarkerComponent*>(MarkerComponentOffset);
|
return Get<UAthenaMarkerComponent*>(MarkerComponentOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void StartGhostModeHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh
|
||||||
|
static void EndGhostModeHook(AFortPlayerControllerAthena* PlayerController);
|
||||||
static void EnterAircraftHook(UObject* PC, AActor* Aircraft);
|
static void EnterAircraftHook(UObject* PC, AActor* Aircraft);
|
||||||
static void ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex); // actually in zone
|
static void ServerRequestSeatChangeHook(AFortPlayerControllerAthena* PlayerController, int TargetSeatIndex); // actually in zone
|
||||||
static void ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller);
|
static void ServerRestartPlayerHook(AFortPlayerControllerAthena* Controller);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "FortPlayerPawn.h"
|
#include "FortPlayerPawn.h"
|
||||||
#include <memcury.h>
|
#include <memcury.h>
|
||||||
#include "FortPlayerController.h"
|
#include "FortPlayerController.h"
|
||||||
|
#include "FortGadgetItemDefinition.h"
|
||||||
|
|
||||||
void AFortPlayerPawn::ServerChoosePart(EFortCustomPartType Part, UObject* ChosenCharacterPart)
|
void AFortPlayerPawn::ServerChoosePart(EFortCustomPartType Part, UObject* ChosenCharacterPart)
|
||||||
{
|
{
|
||||||
@@ -122,6 +123,36 @@ void AFortPlayerPawn::UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition*
|
|||||||
AFortPlayerController::ServerExecuteInventoryItemHook(PlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); // Bad, we should equip the last weapon.
|
AFortPlayerController::ServerExecuteInventoryItemHook(PlayerController, PickaxeInstance->GetItemEntry()->GetItemGuid()); // Bad, we should equip the last weapon.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AFortPlayerPawn::StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret)
|
||||||
|
{
|
||||||
|
LOG_INFO(LogDev, __FUNCTION__);
|
||||||
|
|
||||||
|
auto Pawn = (AFortPlayerPawn*)Context;
|
||||||
|
|
||||||
|
auto Controller = Cast<AFortPlayerController>(Pawn->GetController());
|
||||||
|
|
||||||
|
if (!Controller)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto WorldInventory = Controller->GetWorldInventory();
|
||||||
|
|
||||||
|
auto SpookyMistItemDefinition = FindObject<UFortGadgetItemDefinition>("/Game/Athena/Items/Gameplay/SpookyMist/AGID_SpookyMist.AGID_SpookyMist");
|
||||||
|
auto SpookyMistInstance = WorldInventory->FindItemInstance(SpookyMistItemDefinition);
|
||||||
|
|
||||||
|
if (SpookyMistInstance)
|
||||||
|
{
|
||||||
|
bool bShouldUpdate = false;
|
||||||
|
WorldInventory->RemoveItem(SpookyMistInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, 1, true);
|
||||||
|
|
||||||
|
if (bShouldUpdate)
|
||||||
|
WorldInventory->Update();
|
||||||
|
|
||||||
|
Controller->ApplyCosmeticLoadout();
|
||||||
|
}
|
||||||
|
|
||||||
|
return StartGhostModeExitOriginal(Context, Stack, Ret);
|
||||||
|
}
|
||||||
|
|
||||||
AActor* AFortPlayerPawn::ServerOnExitVehicleHook(AFortPlayerPawn* PlayerPawn, ETryExitVehicleBehavior ExitForceBehavior)
|
AActor* AFortPlayerPawn::ServerOnExitVehicleHook(AFortPlayerPawn* PlayerPawn, ETryExitVehicleBehavior ExitForceBehavior)
|
||||||
{
|
{
|
||||||
auto VehicleWeaponDefinition = PlayerPawn->GetVehicleWeaponDefinition(PlayerPawn->GetVehicle());
|
auto VehicleWeaponDefinition = PlayerPawn->GetVehicleWeaponDefinition(PlayerPawn->GetVehicle());
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class AFortPlayerPawn : public AFortPawn
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static inline AActor* (*ServerOnExitVehicleOriginal)(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
static inline AActor* (*ServerOnExitVehicleOriginal)(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
||||||
|
static inline void (*StartGhostModeExitOriginal)(UObject* Context, FFrame* Stack, void* Ret);
|
||||||
|
|
||||||
void ServerChoosePart(EFortCustomPartType Part, class UObject* ChosenCharacterPart);
|
void ServerChoosePart(EFortCustomPartType Part, class UObject* ChosenCharacterPart);
|
||||||
void ForceLaunchPlayerZipline(); // Thanks android
|
void ForceLaunchPlayerZipline(); // Thanks android
|
||||||
@@ -41,6 +42,7 @@ public:
|
|||||||
UFortWeaponItemDefinition* GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle);
|
UFortWeaponItemDefinition* GetVehicleWeaponDefinition(AFortAthenaVehicle* Vehicle);
|
||||||
void UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition);
|
void UnEquipVehicleWeaponDefinition(UFortWeaponItemDefinition* VehicleWeaponDefinition);
|
||||||
|
|
||||||
|
static void StartGhostModeExitHook(UObject* Context, FFrame* Stack, void* Ret); // we could native hook this but eh
|
||||||
static AActor* ServerOnExitVehicleHook(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
static AActor* ServerOnExitVehicleHook(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle
|
||||||
static void ServerSendZiplineStateHook(AFortPlayerPawn* Pawn, FZiplinePawnState InZiplineState);
|
static void ServerSendZiplineStateHook(AFortPlayerPawn* Pawn, FZiplinePawnState InZiplineState);
|
||||||
static void ServerHandlePickupHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, float InFlyTime, FVector InStartDirection, bool bPlayPickupSound);
|
static void ServerHandlePickupHook(AFortPlayerPawn* Pawn, AFortPickup* Pickup, float InFlyTime, FVector InStartDirection, bool bPlayPickupSound);
|
||||||
|
|||||||
@@ -2,6 +2,14 @@
|
|||||||
|
|
||||||
#include "FortItemDefinition.h"
|
#include "FortItemDefinition.h"
|
||||||
|
|
||||||
|
enum class EWorldItemDropBehavior : uint8_t
|
||||||
|
{
|
||||||
|
DropAsPickup = 0,
|
||||||
|
DestroyOnDrop = 1,
|
||||||
|
DropAsPickupDestroyOnEmpty = 2,
|
||||||
|
EWorldItemDropBehavior_MAX = 3
|
||||||
|
};
|
||||||
|
|
||||||
class UFortWorldItemDefinition : public UFortItemDefinition
|
class UFortWorldItemDefinition : public UFortItemDefinition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -12,6 +20,12 @@ public:
|
|||||||
return ReadBitfieldValue(bCanBeDroppedOffset, bCanBeDroppedFieldMask);
|
return ReadBitfieldValue(bCanBeDroppedOffset, bCanBeDroppedFieldMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EWorldItemDropBehavior& GetDropBehavior()
|
||||||
|
{
|
||||||
|
static auto DropBehaviorOffset = GetOffset("DropBehavior");
|
||||||
|
return Get<EWorldItemDropBehavior>(DropBehaviorOffset);
|
||||||
|
}
|
||||||
|
|
||||||
bool ShouldDropOnDeath()
|
bool ShouldDropOnDeath()
|
||||||
{
|
{
|
||||||
static auto bDropOnDeathOffset = GetOffset("bDropOnDeath");
|
static auto bDropOnDeathOffset = GetOffset("bDropOnDeath");
|
||||||
|
|||||||
56
Project Reboot 3.0/Function.h
Normal file
56
Project Reboot 3.0/Function.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
// FROM 4.23
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "TypeCompatibleBytes.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(_WIN64)
|
||||||
|
// Don't use inline storage on Win32, because that will affect the alignment of TFunction, and we can't pass extra-aligned types by value on Win32.
|
||||||
|
#define TFUNCTION_USES_INLINE_STORAGE 0
|
||||||
|
#elif USE_SMALL_TFUNCTIONS
|
||||||
|
#define TFUNCTION_USES_INLINE_STORAGE 0
|
||||||
|
#else
|
||||||
|
#define TFUNCTION_USES_INLINE_STORAGE 1
|
||||||
|
#define TFUNCTION_INLINE_SIZE 32
|
||||||
|
#define TFUNCTION_INLINE_ALIGNMENT 16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <typename StorageType, typename FuncType>
|
||||||
|
struct TFunctionRefBase;
|
||||||
|
|
||||||
|
template <typename StorageType, typename Ret, typename... ParamTypes>
|
||||||
|
struct TFunctionRefBase<StorageType, Ret(ParamTypes...)>
|
||||||
|
{
|
||||||
|
Ret(*Callable)(void*, ParamTypes&...);
|
||||||
|
|
||||||
|
StorageType Storage;
|
||||||
|
|
||||||
|
#if ENABLE_TFUNCTIONREF_VISUALIZATION
|
||||||
|
// To help debug visualizers
|
||||||
|
TDebugHelper<void> DebugPtrStorage;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FFunctionStorage
|
||||||
|
{
|
||||||
|
FFunctionStorage()
|
||||||
|
: HeapAllocation(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void* HeapAllocation;
|
||||||
|
#if TFUNCTION_USES_INLINE_STORAGE
|
||||||
|
// Inline storage for an owned object
|
||||||
|
TAlignedBytes<TFUNCTION_INLINE_SIZE, TFUNCTION_INLINE_ALIGNMENT> InlineAllocation;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
template <bool bUnique>
|
||||||
|
struct TFunctionStorage : FFunctionStorage
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename FuncType>
|
||||||
|
class TFunction final : public TFunctionRefBase<TFunctionStorage<false>, FuncType>
|
||||||
|
{
|
||||||
|
};
|
||||||
16
Project Reboot 3.0/GameInstance.h
Normal file
16
Project Reboot 3.0/GameInstance.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Object.h"
|
||||||
|
|
||||||
|
#include "TimerManager.h"
|
||||||
|
|
||||||
|
class UGameInstance :
|
||||||
|
public UObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline FTimerManager& GetTimerManager() const
|
||||||
|
{
|
||||||
|
static auto TimerManagerOffset = 0x90;
|
||||||
|
return **(FTimerManager**)(__int64(TimerManagerOffset));
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h"
|
#include "FortAthenaMutator_GiveItemsAtGamePhaseStep.h"
|
||||||
#include "DataTableFunctionLibrary.h"
|
#include "DataTableFunctionLibrary.h"
|
||||||
#include "FortAthenaMutator_GG.h"
|
#include "FortAthenaMutator_GG.h"
|
||||||
|
#include "FortAthenaMutator_InventoryOverride.h"
|
||||||
|
|
||||||
UClass* AGameModeBase::GetDefaultPawnClassForController(AController* InController)
|
UClass* AGameModeBase::GetDefaultPawnClassForController(AController* InController)
|
||||||
{
|
{
|
||||||
@@ -44,7 +45,7 @@ APawn* AGameModeBase::SpawnDefaultPawnForHook(AGameModeBase* GameMode, AControll
|
|||||||
|
|
||||||
if constexpr (bUseSpawnActor)
|
if constexpr (bUseSpawnActor)
|
||||||
{
|
{
|
||||||
NewPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnParameters);
|
NewPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnParameters);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -66,12 +67,16 @@ NewPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnParamete
|
|||||||
auto NewPlayerAsAthena = Cast<AFortPlayerControllerAthena>(NewPlayer);
|
auto NewPlayerAsAthena = Cast<AFortPlayerControllerAthena>(NewPlayer);
|
||||||
|
|
||||||
auto GameState = ((AFortGameModeAthena*)GameMode)->GetGameStateAthena();
|
auto GameState = ((AFortGameModeAthena*)GameMode)->GetGameStateAthena();
|
||||||
|
auto PlayerStateAthena = NewPlayerAsAthena->GetPlayerStateAthena();
|
||||||
|
|
||||||
|
if (!PlayerStateAthena)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
GET_PLAYLIST(GameState);
|
GET_PLAYLIST(GameState);
|
||||||
|
|
||||||
if (CurrentPlaylist)
|
if (CurrentPlaylist)
|
||||||
{
|
{
|
||||||
CurrentPlaylist->ApplyModifiersToActor(NewPlayerAsAthena->GetPlayerState()); // We need to move this!
|
CurrentPlaylist->ApplyModifiersToActor(PlayerStateAthena); // We need to move this!
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (Fortnite_Version >= 18)
|
/* if (Fortnite_Version >= 18)
|
||||||
@@ -90,6 +95,8 @@ NewPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnParamete
|
|||||||
|
|
||||||
if (!WorldInventory->GetPickaxeInstance())
|
if (!WorldInventory->GetPickaxeInstance())
|
||||||
{
|
{
|
||||||
|
// TODO Check Playlist->bRequirePickaxeInStartingInventory
|
||||||
|
|
||||||
auto CosmeticLoadout = NewPlayerAsAthena->GetCosmeticLoadout();
|
auto CosmeticLoadout = NewPlayerAsAthena->GetCosmeticLoadout();
|
||||||
// LOG_INFO(LogDev, "CosmeticLoadout: {}", __int64(CosmeticLoadout));
|
// LOG_INFO(LogDev, "CosmeticLoadout: {}", __int64(CosmeticLoadout));
|
||||||
auto CosmeticLoadoutPickaxe = CosmeticLoadout ? CosmeticLoadout->GetPickaxe() : nullptr;
|
auto CosmeticLoadoutPickaxe = CosmeticLoadout ? CosmeticLoadout->GetPickaxe() : nullptr;
|
||||||
@@ -134,6 +141,23 @@ NewPawn = GetWorld()->SpawnActor<APawn>(PawnClass, SpawnTransform, SpawnParamete
|
|||||||
}
|
}
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
auto AddInventoryOverrideTeamLoadouts = [&](AFortAthenaMutator* Mutator)
|
||||||
|
{
|
||||||
|
if (auto InventoryOverride = Cast<AFortAthenaMutator_InventoryOverride>(Mutator))
|
||||||
|
{
|
||||||
|
auto TeamIndex = PlayerStateAthena->GetTeamIndex();
|
||||||
|
auto LoadoutContainer = InventoryOverride->GetLoadoutContainerForTeamIndex(TeamIndex);
|
||||||
|
|
||||||
|
for (int i = 0; i < LoadoutContainer.Loadout.Num(); i++)
|
||||||
|
{
|
||||||
|
auto& ItemAndCount = LoadoutContainer.Loadout.at(i);
|
||||||
|
WorldInventory->AddItem(ItemAndCount.GetItem(), nullptr, ItemAndCount.GetCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LoopMutators(AddInventoryOverrideTeamLoadouts);
|
||||||
|
|
||||||
WorldInventory->Update();
|
WorldInventory->Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
Project Reboot 3.0/GenericPlatformMisc.h
Normal file
2
Project Reboot 3.0/GenericPlatformMisc.h
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
24
Project Reboot 3.0/Interface.h
Normal file
24
Project Reboot 3.0/Interface.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Object.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for all interfaces
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class UInterface : public UObject
|
||||||
|
{
|
||||||
|
// DECLARE_CLASS_INTRINSIC(UInterface, UObject, CLASS_Interface | CLASS_Abstract, TEXT("/Script/CoreUObject"))
|
||||||
|
};
|
||||||
|
|
||||||
|
class IInterface
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual ~IInterface() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef UInterface UClassType;
|
||||||
|
};
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -155,6 +155,23 @@ bool UObject::IsA(UClass* otherClass)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UFunction* UObject::FindFunction(const std::string& ShortFunctionName)
|
||||||
|
{
|
||||||
|
// We could also loop through children.
|
||||||
|
|
||||||
|
UClass* super = ClassPrivate;
|
||||||
|
|
||||||
|
while (super)
|
||||||
|
{
|
||||||
|
if (auto Func = FindObject<UFunction>(super->GetPathName() + "." + ShortFunctionName))
|
||||||
|
return Func;
|
||||||
|
|
||||||
|
super = super->GetSuperStruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* class UClass* UObject::StaticClass()
|
/* class UClass* UObject::StaticClass()
|
||||||
{
|
{
|
||||||
static auto Class = FindObject<UClass>("/Script/CoreUObject.Object");
|
static auto Class = FindObject<UClass>("/Script/CoreUObject.Object");
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ public:
|
|||||||
std::string GetFullName();
|
std::string GetFullName();
|
||||||
|
|
||||||
bool IsA(UClass* Other);
|
bool IsA(UClass* Other);
|
||||||
|
class UFunction* FindFunction(const std::string& ShortFunctionName);
|
||||||
|
|
||||||
void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true);
|
void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true);
|
||||||
void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true) const;
|
void* GetProperty(const std::string& ChildName, bool bWarnIfNotFound = true) const;
|
||||||
|
|||||||
@@ -64,3 +64,6 @@ enum class EInternalObjectFlags : int
|
|||||||
};
|
};
|
||||||
|
|
||||||
ENUM_CLASS_FLAGS(EInternalObjectFlags)
|
ENUM_CLASS_FLAGS(EInternalObjectFlags)
|
||||||
|
|
||||||
|
#define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D
|
||||||
|
#define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
@@ -192,6 +192,8 @@
|
|||||||
<ClCompile Include="EngineTypes.cpp" />
|
<ClCompile Include="EngineTypes.cpp" />
|
||||||
<ClCompile Include="events.cpp" />
|
<ClCompile Include="events.cpp" />
|
||||||
<ClCompile Include="FortAthenaCreativePortal.cpp" />
|
<ClCompile Include="FortAthenaCreativePortal.cpp" />
|
||||||
|
<ClCompile Include="FortAthenaMutator_Barrier.cpp" />
|
||||||
|
<ClCompile Include="FortAthenaMutator_Disco.cpp" />
|
||||||
<ClCompile Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp" />
|
<ClCompile Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp" />
|
||||||
<ClCompile Include="FortAthenaSupplyDrop.cpp" />
|
<ClCompile Include="FortAthenaSupplyDrop.cpp" />
|
||||||
<ClCompile Include="FortAthenaVehicle.cpp" />
|
<ClCompile Include="FortAthenaVehicle.cpp" />
|
||||||
@@ -257,6 +259,9 @@
|
|||||||
<ClInclude Include="Array.h" />
|
<ClInclude Include="Array.h" />
|
||||||
<ClInclude Include="AssertionMacros.h" />
|
<ClInclude Include="AssertionMacros.h" />
|
||||||
<ClInclude Include="AssetPtr.h" />
|
<ClInclude Include="AssetPtr.h" />
|
||||||
|
<ClInclude Include="AthenaBarrierFlag.h" />
|
||||||
|
<ClInclude Include="AthenaBarrierObjective.h" />
|
||||||
|
<ClInclude Include="AthenaBigBaseWall.h" />
|
||||||
<ClInclude Include="AthenaMarkerComponent.h" />
|
<ClInclude Include="AthenaMarkerComponent.h" />
|
||||||
<ClInclude Include="AttributeSet.h" />
|
<ClInclude Include="AttributeSet.h" />
|
||||||
<ClInclude Include="BGA.h" />
|
<ClInclude Include="BGA.h" />
|
||||||
@@ -282,6 +287,8 @@
|
|||||||
<ClInclude Include="Decay.h" />
|
<ClInclude Include="Decay.h" />
|
||||||
<ClInclude Include="Delegate.h" />
|
<ClInclude Include="Delegate.h" />
|
||||||
<ClInclude Include="DelegateBase.h" />
|
<ClInclude Include="DelegateBase.h" />
|
||||||
|
<ClInclude Include="DelegateCombinations.h" />
|
||||||
|
<ClInclude Include="DelegateInstanceInterface.h" />
|
||||||
<ClInclude Include="die.h" />
|
<ClInclude Include="die.h" />
|
||||||
<ClInclude Include="EnableIf.h" />
|
<ClInclude Include="EnableIf.h" />
|
||||||
<ClInclude Include="Engine.h" />
|
<ClInclude Include="Engine.h" />
|
||||||
@@ -291,8 +298,11 @@
|
|||||||
<ClInclude Include="FortAbilitySet.h" />
|
<ClInclude Include="FortAbilitySet.h" />
|
||||||
<ClInclude Include="FortAthenaCreativePortal.h" />
|
<ClInclude Include="FortAthenaCreativePortal.h" />
|
||||||
<ClInclude Include="FortAthenaMutator.h" />
|
<ClInclude Include="FortAthenaMutator.h" />
|
||||||
|
<ClInclude Include="FortAthenaMutator_Barrier.h" />
|
||||||
|
<ClInclude Include="FortAthenaMutator_Disco.h" />
|
||||||
<ClInclude Include="FortAthenaMutator_GG.h" />
|
<ClInclude Include="FortAthenaMutator_GG.h" />
|
||||||
<ClInclude Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.h" />
|
<ClInclude Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.h" />
|
||||||
|
<ClInclude Include="FortAthenaMutator_Heist.h" />
|
||||||
<ClInclude Include="FortAthenaMutator_InventoryOverride.h" />
|
<ClInclude Include="FortAthenaMutator_InventoryOverride.h" />
|
||||||
<ClInclude Include="FortAthenaMutator_InventoryOverride_Bucket.h" />
|
<ClInclude Include="FortAthenaMutator_InventoryOverride_Bucket.h" />
|
||||||
<ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h" />
|
<ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h" />
|
||||||
@@ -335,6 +345,8 @@
|
|||||||
<ClInclude Include="FortWeaponMeleeItemDefinition.h" />
|
<ClInclude Include="FortWeaponMeleeItemDefinition.h" />
|
||||||
<ClInclude Include="FortWeaponRangedMountedCannon.h" />
|
<ClInclude Include="FortWeaponRangedMountedCannon.h" />
|
||||||
<ClInclude Include="FortWorldItemDefinition.h" />
|
<ClInclude Include="FortWorldItemDefinition.h" />
|
||||||
|
<ClInclude Include="Function.h" />
|
||||||
|
<ClInclude Include="GameInstance.h" />
|
||||||
<ClInclude Include="GameMode.h" />
|
<ClInclude Include="GameMode.h" />
|
||||||
<ClInclude Include="GameModeBase.h" />
|
<ClInclude Include="GameModeBase.h" />
|
||||||
<ClInclude Include="GameplayAbilitySpec.h" />
|
<ClInclude Include="GameplayAbilitySpec.h" />
|
||||||
@@ -344,12 +356,14 @@
|
|||||||
<ClInclude Include="GameSession.h" />
|
<ClInclude Include="GameSession.h" />
|
||||||
<ClInclude Include="GameState.h" />
|
<ClInclude Include="GameState.h" />
|
||||||
<ClInclude Include="GenericPlatformMath.h" />
|
<ClInclude Include="GenericPlatformMath.h" />
|
||||||
|
<ClInclude Include="GenericPlatformMisc.h" />
|
||||||
<ClInclude Include="GenericPlatformTime.h" />
|
<ClInclude Include="GenericPlatformTime.h" />
|
||||||
<ClInclude Include="globals.h" />
|
<ClInclude Include="globals.h" />
|
||||||
<ClInclude Include="gui.h" />
|
<ClInclude Include="gui.h" />
|
||||||
<ClInclude Include="hooking.h" />
|
<ClInclude Include="hooking.h" />
|
||||||
<ClInclude Include="IdentityFunctor.h" />
|
<ClInclude Include="IdentityFunctor.h" />
|
||||||
<ClInclude Include="inc.h" />
|
<ClInclude Include="inc.h" />
|
||||||
|
<ClInclude Include="Interface.h" />
|
||||||
<ClInclude Include="IntroSort.h" />
|
<ClInclude Include="IntroSort.h" />
|
||||||
<ClInclude Include="InventoryManagementLibrary.h" />
|
<ClInclude Include="InventoryManagementLibrary.h" />
|
||||||
<ClInclude Include="Invoke.h" />
|
<ClInclude Include="Invoke.h" />
|
||||||
@@ -390,6 +404,7 @@
|
|||||||
<ClInclude Include="RemoveReference.h" />
|
<ClInclude Include="RemoveReference.h" />
|
||||||
<ClInclude Include="ReversePredicate.h" />
|
<ClInclude Include="ReversePredicate.h" />
|
||||||
<ClInclude Include="Rotator.h" />
|
<ClInclude Include="Rotator.h" />
|
||||||
|
<ClInclude Include="ScriptDelegates.h" />
|
||||||
<ClInclude Include="ScriptInterface.h" />
|
<ClInclude Include="ScriptInterface.h" />
|
||||||
<ClInclude Include="Set.h" />
|
<ClInclude Include="Set.h" />
|
||||||
<ClInclude Include="SharedPointer.h" />
|
<ClInclude Include="SharedPointer.h" />
|
||||||
@@ -402,9 +417,11 @@
|
|||||||
<ClInclude Include="Stack.h" />
|
<ClInclude Include="Stack.h" />
|
||||||
<ClInclude Include="StringAssetReference.h" />
|
<ClInclude Include="StringAssetReference.h" />
|
||||||
<ClInclude Include="Text.h" />
|
<ClInclude Include="Text.h" />
|
||||||
|
<ClInclude Include="TimerManager.h" />
|
||||||
<ClInclude Include="Transform.h" />
|
<ClInclude Include="Transform.h" />
|
||||||
<ClInclude Include="Tuple.h" />
|
<ClInclude Include="Tuple.h" />
|
||||||
<ClInclude Include="TypeCompatibleBytes.h" />
|
<ClInclude Include="TypeCompatibleBytes.h" />
|
||||||
|
<ClInclude Include="TypeWrapper.h" />
|
||||||
<ClInclude Include="UnrealMathUtility.h" />
|
<ClInclude Include="UnrealMathUtility.h" />
|
||||||
<ClInclude Include="UnrealString.h" />
|
<ClInclude Include="UnrealString.h" />
|
||||||
<ClInclude Include="UnrealTemplate.h" />
|
<ClInclude Include="UnrealTemplate.h" />
|
||||||
@@ -420,6 +437,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="DelegateSignatureImpl.inl" />
|
<None Include="DelegateSignatureImpl.inl" />
|
||||||
|
<None Include="ExpressionParserTypes.inl" />
|
||||||
<None Include="UnrealEngine.cpp" />
|
<None Include="UnrealEngine.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|||||||
@@ -239,6 +239,12 @@
|
|||||||
<ClCompile Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp">
|
<ClCompile Include="FortAthenaMutator_GiveItemsAtGamePhaseStep.cpp">
|
||||||
<Filter>FortniteGame\Source\FortniteGame\Private\Mutators</Filter>
|
<Filter>FortniteGame\Source\FortniteGame\Private\Mutators</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="FortAthenaMutator_Disco.cpp">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Private\Mutators</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="FortAthenaMutator_Barrier.cpp">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Private\Mutators</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="log.h" />
|
<ClInclude Include="log.h" />
|
||||||
@@ -746,6 +752,51 @@
|
|||||||
<ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h">
|
<ClInclude Include="FortAthenaMutator_ItemDropOnDeath.h">
|
||||||
<Filter>FortniteGame\Source\FortniteGame\Public\Mutators</Filter>
|
<Filter>FortniteGame\Source\FortniteGame\Public\Mutators</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="FortAthenaMutator_Disco.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Mutators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="FortAthenaMutator_Heist.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Mutators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AthenaBarrierFlag.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AthenaBarrierObjective.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="FortAthenaMutator_Barrier.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Mutators</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AthenaBigBaseWall.h">
|
||||||
|
<Filter>FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Interface.h">
|
||||||
|
<Filter>Engine\Source\Runtime\CoreUObject\Public\UObject</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="TimerManager.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Engine\Public</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DelegateCombinations.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\Delegates</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ScriptDelegates.h">
|
||||||
|
<Filter>Engine\Source\Runtime\CoreUObject\Public\UObject</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="GenericPlatformMisc.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\GenericPlatform</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Function.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\Templates</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="GameInstance.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Engine\Classes\Engine</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DelegateInstanceInterface.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\Delegates</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="TypeWrapper.h">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\Templates</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Engine">
|
<Filter Include="Engine">
|
||||||
@@ -913,9 +964,6 @@
|
|||||||
<Filter Include="FortniteGame\Source\FortniteGame\Private\Building\GameplayActors">
|
<Filter Include="FortniteGame\Source\FortniteGame\Private\Building\GameplayActors">
|
||||||
<UniqueIdentifier>{18a41ed2-b864-4a36-9396-cb0672b8464d}</UniqueIdentifier>
|
<UniqueIdentifier>{18a41ed2-b864-4a36-9396-cb0672b8464d}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="FortniteGame\Source\FortniteGame\Public\Creative\Minigame">
|
|
||||||
<UniqueIdentifier>{a28fab04-cc3c-4032-ac3e-22c6b9379312}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="FortniteGame\Source\FortniteGame\Private\Creative\Minigame">
|
<Filter Include="FortniteGame\Source\FortniteGame\Private\Creative\Minigame">
|
||||||
<UniqueIdentifier>{7905895d-5ebf-4313-a9de-06f507c35113}</UniqueIdentifier>
|
<UniqueIdentifier>{7905895d-5ebf-4313-a9de-06f507c35113}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -976,6 +1024,15 @@
|
|||||||
<Filter Include="FortniteGame\Source\FortniteGame\Public\Mutators">
|
<Filter Include="FortniteGame\Source\FortniteGame\Public\Mutators">
|
||||||
<UniqueIdentifier>{6efc7bff-2d7b-4fdb-bae8-3d2e736cc82e}</UniqueIdentifier>
|
<UniqueIdentifier>{6efc7bff-2d7b-4fdb-bae8-3d2e736cc82e}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="FortniteGame\Source\FortniteGame\Public\Building\GameplayActors\Barrier">
|
||||||
|
<UniqueIdentifier>{a633ca3f-f699-4c92-8522-e49a14157b95}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="FortniteGame\Source\FortniteGame\Public\Creative\Minigame">
|
||||||
|
<UniqueIdentifier>{a28fab04-cc3c-4032-ac3e-22c6b9379312}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Engine\Source\Runtime\Engine\Public">
|
||||||
|
<UniqueIdentifier>{3d909143-220c-44b3-819f-79d282c3fc0f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="UnrealEngine.cpp">
|
<None Include="UnrealEngine.cpp">
|
||||||
@@ -984,5 +1041,8 @@
|
|||||||
<None Include="DelegateSignatureImpl.inl">
|
<None Include="DelegateSignatureImpl.inl">
|
||||||
<Filter>Engine\Source\Runtime\Core\Public\Delegates</Filter>
|
<Filter>Engine\Source\Runtime\Core\Public\Delegates</Filter>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="ExpressionParserTypes.inl">
|
||||||
|
<Filter>Engine\Source\Runtime\Core\Public\Misc</Filter>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
10
Project Reboot 3.0/ScriptDelegates.h
Normal file
10
Project Reboot 3.0/ScriptDelegates.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "WeakObjectPtr.h"
|
||||||
|
|
||||||
|
template <typename TWeakPtr = FWeakObjectPtr>
|
||||||
|
class TScriptDelegate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TWeakPtr Object;
|
||||||
|
FName FunctionName;
|
||||||
|
};
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
class FScriptInterface
|
class FScriptInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UObject* ObjectPointer;
|
UObject* ObjectPointer = nullptr;
|
||||||
void* InterfacePointer;
|
void* InterfacePointer = nullptr;
|
||||||
|
|
||||||
FORCEINLINE UObject*& GetObjectRef()
|
FORCEINLINE UObject*& GetObjectRef()
|
||||||
{
|
{
|
||||||
@@ -17,4 +17,5 @@ public:
|
|||||||
template<class InterfaceType>
|
template<class InterfaceType>
|
||||||
class TScriptInterface : public FScriptInterface
|
class TScriptInterface : public FScriptInterface
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
};
|
};
|
||||||
@@ -49,7 +49,7 @@ public:
|
|||||||
// (GNatives[B])(Context, *this, RESULT_PARAM);
|
// (GNatives[B])(Context, *this, RESULT_PARAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
__forceinline void StepCompiledIn(void* const Result/*, const FFieldClass* ExpectedPropertyType*/) // https://github.com/EpicGames/UnrealEngine/blob/cdaec5b33ea5d332e51eee4e4866495c90442122/Engine/Source/Runtime/CoreUObject/Public/UObject/Stack.h#L444
|
__forceinline void StepCompiledIn(void* const Result/*, const FFieldClass* ExpectedPropertyType*/, bool bPrint = false) // https://github.com/EpicGames/UnrealEngine/blob/cdaec5b33ea5d332e51eee4e4866495c90442122/Engine/Source/Runtime/CoreUObject/Public/UObject/Stack.h#L444
|
||||||
{
|
{
|
||||||
if (Code)
|
if (Code)
|
||||||
{
|
{
|
||||||
@@ -64,6 +64,9 @@ public:
|
|||||||
PropertyChainForCompiledIn = Property->Next;
|
PropertyChainForCompiledIn = Property->Next;
|
||||||
StepExplicitProperty(Result, Property); */
|
StepExplicitProperty(Result, Property); */
|
||||||
|
|
||||||
|
if (bPrint)
|
||||||
|
LOG_INFO(LogDev, "No code!");
|
||||||
|
|
||||||
void* Property = GetPropertyChainForCompiledIn();
|
void* Property = GetPropertyChainForCompiledIn();
|
||||||
GetPropertyChainForCompiledIn() = Engine_Version >= 425 ? *(void**)(__int64(Property) + 0x20) : ((UField*)Property)->Next;
|
GetPropertyChainForCompiledIn() = Engine_Version >= 425 ? *(void**)(__int64(Property) + 0x20) : ((UField*)Property)->Next;
|
||||||
StepExplicitProperty(Result, Property);
|
StepExplicitProperty(Result, Property);
|
||||||
|
|||||||
32
Project Reboot 3.0/TimerManager.h
Normal file
32
Project Reboot 3.0/TimerManager.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "EngineTypes.h"
|
||||||
|
#include "Function.h"
|
||||||
|
#include "DelegateCombinations.h"
|
||||||
|
|
||||||
|
DECLARE_DELEGATE(FTimerDelegate);
|
||||||
|
|
||||||
|
struct FTimerUnifiedDelegate
|
||||||
|
{
|
||||||
|
/** Holds the delegate to call. */
|
||||||
|
FTimerDelegate FuncDelegate;
|
||||||
|
/** Holds the dynamic delegate to call. */
|
||||||
|
FTimerDynamicDelegate FuncDynDelegate;
|
||||||
|
/** Holds the TFunction callback to call. */
|
||||||
|
TFunction<void(void)> FuncCallback;
|
||||||
|
|
||||||
|
FTimerUnifiedDelegate() {};
|
||||||
|
FTimerUnifiedDelegate(FTimerDelegate const& D) : FuncDelegate(D) {};
|
||||||
|
};
|
||||||
|
|
||||||
|
class FTimerManager // : public FNoncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, FTimerDelegate const& InDelegate, float InRate, bool InbLoop, float InFirstDelay = -1.f)
|
||||||
|
{
|
||||||
|
static void (*InternalSetTimerOriginal)(__int64 TimerManager, FTimerHandle& InOutHandle, FTimerUnifiedDelegate&& InDelegate, float InRate, bool InbLoop, float InFirstDelay) =
|
||||||
|
decltype(InternalSetTimerOriginal)(Addresses::SetTimer);
|
||||||
|
|
||||||
|
InternalSetTimerOriginal(__int64(this), InOutHandle, FTimerUnifiedDelegate(InDelegate), InRate, InbLoop, InFirstDelay);
|
||||||
|
}
|
||||||
|
};
|
||||||
16
Project Reboot 3.0/TypeWrapper.h
Normal file
16
Project Reboot 3.0/TypeWrapper.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct TTypeWrapper;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct TUnwrapType
|
||||||
|
{
|
||||||
|
typedef T Type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct TUnwrapType<TTypeWrapper<T>>
|
||||||
|
{
|
||||||
|
typedef T Type;
|
||||||
|
};
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
#include "Rotator.h"
|
#include "Rotator.h"
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
|
#include "GameInstance.h"
|
||||||
|
|
||||||
struct FNetworkNotify
|
struct FNetworkNotify
|
||||||
{
|
{
|
||||||
@@ -46,6 +47,24 @@ public:
|
|||||||
return this->Get<T*>(AuthorityGameModeOffset);
|
return this->Get<T*>(AuthorityGameModeOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class AGameState* GetGameState()
|
||||||
|
{
|
||||||
|
static auto GameStateOffset = GetOffset("GameState");
|
||||||
|
return this->Get<class AGameState*>(GameStateOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
UGameInstance* GetOwningGameInstance()
|
||||||
|
{
|
||||||
|
static auto OwningGameInstanceOffset = GetOffset("OwningGameInstance");
|
||||||
|
return this->Get<UGameInstance*>(OwningGameInstanceOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline FTimerManager& GetTimerManager()
|
||||||
|
{
|
||||||
|
return GetOwningGameInstance()->GetTimerManager();
|
||||||
|
// return (GetOwningGameInstance() ? GetOwningGameInstance()->GetTimerManager() : *TimerManager);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename ActorType>
|
template <typename ActorType>
|
||||||
ActorType* SpawnActor(UClass* Class, FTransform UserTransformPtr = FTransform(), const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters())
|
ActorType* SpawnActor(UClass* Class, FTransform UserTransformPtr = FTransform(), const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -263,6 +263,9 @@ void Addresses::FindAll()
|
|||||||
LOG_INFO(LogDev, "Finding EnterAircraft");
|
LOG_INFO(LogDev, "Finding EnterAircraft");
|
||||||
Addresses::EnterAircraft = FindEnterAircraft();
|
Addresses::EnterAircraft = FindEnterAircraft();
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "Finding SetTimer");
|
||||||
|
Addresses::SetTimer = FindSetTimer();
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Finished finding!");
|
LOG_INFO(LogDev, "Finished finding!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,6 +326,7 @@ void Addresses::Print()
|
|||||||
LOG_INFO(LogDev, "GetInterfaceAddress: 0x{:x}", GetInterfaceAddress - Base);
|
LOG_INFO(LogDev, "GetInterfaceAddress: 0x{:x}", GetInterfaceAddress - Base);
|
||||||
LOG_INFO(LogDev, "ApplyCharacterCustomization: 0x{:x}", ApplyCharacterCustomization - Base);
|
LOG_INFO(LogDev, "ApplyCharacterCustomization: 0x{:x}", ApplyCharacterCustomization - Base);
|
||||||
LOG_INFO(LogDev, "EnterAircraft: 0x{:x}", EnterAircraft - Base);
|
LOG_INFO(LogDev, "EnterAircraft: 0x{:x}", EnterAircraft - Base);
|
||||||
|
LOG_INFO(LogDev, "SetTimer: 0x{:x}", SetTimer - Base);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Offsets::FindAll()
|
void Offsets::FindAll()
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ namespace Addresses
|
|||||||
extern inline uint64 ApplyCharacterCustomization = 0;
|
extern inline uint64 ApplyCharacterCustomization = 0;
|
||||||
extern inline uint64 GetInterfaceAddress = 0;
|
extern inline uint64 GetInterfaceAddress = 0;
|
||||||
extern inline uint64 EnterAircraft = 0;
|
extern inline uint64 EnterAircraft = 0;
|
||||||
|
extern inline uint64 SetTimer = 0;
|
||||||
|
|
||||||
void SetupVersion(); // Finds Engine Version
|
void SetupVersion(); // Finds Engine Version
|
||||||
void FindAll();
|
void FindAll();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
#include "FortPlayerControllerAthena.h"
|
#include "FortPlayerControllerAthena.h"
|
||||||
#include "KismetSystemLibrary.h"
|
#include "KismetSystemLibrary.h"
|
||||||
|
#include "AthenaBarrierObjective.h"
|
||||||
|
|
||||||
bool IsOperator(APlayerState* PlayerState, AFortPlayerController* PlayerController)
|
bool IsOperator(APlayerState* PlayerState, AFortPlayerController* PlayerController)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "vendingmachine.h"
|
#include "vendingmachine.h"
|
||||||
#include "FortOctopusVehicle.h"
|
#include "FortOctopusVehicle.h"
|
||||||
#include "FortVolumeManager.h"
|
#include "FortVolumeManager.h"
|
||||||
|
#include "FortAthenaMutator_Barrier.h"
|
||||||
|
|
||||||
#include "PlaysetLevelStreamComponent.h"
|
#include "PlaysetLevelStreamComponent.h"
|
||||||
|
|
||||||
@@ -464,6 +465,13 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false);
|
AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false);
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange"),
|
||||||
AFortPlayerControllerAthena::ServerRequestSeatChangeHook, (PVOID*)&AFortPlayerControllerAthena::ServerRequestSeatChangeOriginal, false);
|
AFortPlayerControllerAthena::ServerRequestSeatChangeHook, (PVOID*)&AFortPlayerControllerAthena::ServerRequestSeatChangeOriginal, false);
|
||||||
|
if (false)
|
||||||
|
{
|
||||||
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerGameplay.StartGhostMode"), // (Milxnor) TODO: This changes to a component in later seasons.
|
||||||
|
AFortPlayerControllerAthena::StartGhostModeHook, (PVOID*)&AFortPlayerControllerAthena::StartGhostModeOriginal, false, true);
|
||||||
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerGameplay.EndGhostMode"),
|
||||||
|
AFortPlayerControllerAthena::EndGhostModeHook, (PVOID*)&AFortPlayerControllerAthena::EndGhostModeOriginal, false);
|
||||||
|
}
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerGiveCreativeItem"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerGiveCreativeItem"),
|
||||||
AFortPlayerControllerAthena::ServerGiveCreativeItemHook, nullptr, true);
|
AFortPlayerControllerAthena::ServerGiveCreativeItemHook, nullptr, true);
|
||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerPlaySquadQuickChatMessage"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerPlaySquadQuickChatMessage"),
|
||||||
@@ -471,11 +479,8 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"),
|
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerTeleportToPlaygroundLobbyIsland"),
|
||||||
AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false);
|
AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook, nullptr, false);
|
||||||
|
|
||||||
Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"),
|
// Hooking::MinHook::Hook(FortPlayerStateAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerStateAthena.ServerSetInAircraft"),
|
||||||
AFortPlayerStateAthena::ServerSetInAircraftHook, (PVOID*)&AFortPlayerStateAthena::ServerSetInAircraftOriginal, false, true); // We could use second method but eh
|
// AFortPlayerStateAthena::ServerSetInAircraftHook, (PVOID*)&AFortPlayerStateAthena::ServerSetInAircraftOriginal, false, true); // We could use second method but eh
|
||||||
|
|
||||||
Hooking::MinHook::Hook(FindObject<AFortAthenaMutator_GiveItemsAtGamePhaseStep>("/Script/FortniteGame.Default__FortAthenaMutator_GiveItemsAtGamePhaseStep"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaMutator_GiveItemsAtGamePhaseStep.OnGamePhaseStepChanged"),
|
|
||||||
AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedOriginal, false, true);
|
|
||||||
|
|
||||||
if (FortOctopusVehicleDefault)
|
if (FortOctopusVehicleDefault)
|
||||||
{
|
{
|
||||||
@@ -506,6 +511,13 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
Hooking::MinHook::Hook(FortGameplayAbilityAthena_PeriodicItemGrantDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortGameplayAbilityAthena_PeriodicItemGrant.StartItemAwardTimers"),
|
Hooking::MinHook::Hook(FortGameplayAbilityAthena_PeriodicItemGrantDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortGameplayAbilityAthena_PeriodicItemGrant.StartItemAwardTimers"),
|
||||||
UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersHook, (PVOID*)&UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersOriginal, false, true);
|
UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersHook, (PVOID*)&UFortGameplayAbilityAthena_PeriodicItemGrant::StartItemAwardTimersOriginal, false, true);
|
||||||
|
|
||||||
|
Hooking::MinHook::Hook(FindObject<AFortAthenaMutator_Barrier>("/Script/FortniteGame.Default__FortAthenaMutator_Barrier"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaMutator_Barrier.OnGamePhaseStepChanged"),
|
||||||
|
AFortAthenaMutator_Barrier::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_Barrier::OnGamePhaseStepChangedOriginal, false, true);
|
||||||
|
Hooking::MinHook::Hook(FindObject<AFortAthenaMutator_Disco>("/Script/FortniteGame.Default__FortAthenaMutator_Disco"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaMutator_Disco.OnGamePhaseStepChanged"),
|
||||||
|
AFortAthenaMutator_Disco::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_Disco::OnGamePhaseStepChangedOriginal, false, true);
|
||||||
|
Hooking::MinHook::Hook(FindObject<AFortAthenaMutator_GiveItemsAtGamePhaseStep>("/Script/FortniteGame.Default__FortAthenaMutator_GiveItemsAtGamePhaseStep"), FindObject<UFunction>(L"/Script/FortniteGame.FortAthenaMutator_GiveItemsAtGamePhaseStep.OnGamePhaseStepChanged"),
|
||||||
|
AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedHook, (PVOID*)&AFortAthenaMutator_GiveItemsAtGamePhaseStep::OnGamePhaseStepChangedOriginal, false, true);
|
||||||
|
|
||||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveItemToPlayer"),
|
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveItemToPlayer"),
|
||||||
UFortKismetLibrary::K2_GiveItemToPlayerHook, (PVOID*)&UFortKismetLibrary::K2_GiveItemToPlayerOriginal, false, true);
|
UFortKismetLibrary::K2_GiveItemToPlayerHook, (PVOID*)&UFortKismetLibrary::K2_GiveItemToPlayerOriginal, false, true);
|
||||||
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveBuildingResource"),
|
Hooking::MinHook::Hook(FortKismetLibraryDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GiveBuildingResource"),
|
||||||
|
|||||||
@@ -659,6 +659,38 @@ static inline uint64 FindSetZoneToIndex() // actually StartNewSafeZonePhase
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint64 FindSetTimer()
|
||||||
|
{
|
||||||
|
auto Addr = Memcury::Scanner::FindStringRef(L"STAT_SetTimer", false).Get();
|
||||||
|
|
||||||
|
if (!Addr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 1000; i++)
|
||||||
|
{
|
||||||
|
/* if ((*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x53)
|
||||||
|
|| (*(uint8_t*)(uint8_t*)(Addr - i) == 0x40 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x55))
|
||||||
|
{
|
||||||
|
return Addr - i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Fortnite_Version < 8)
|
||||||
|
{
|
||||||
|
if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C)
|
||||||
|
{
|
||||||
|
return Addr - i;
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
|
if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x8B && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0xC4)
|
||||||
|
{
|
||||||
|
return Addr - i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint64 FindEnterAircraft()
|
static inline uint64 FindEnterAircraft()
|
||||||
{
|
{
|
||||||
auto Addr = Memcury::Scanner::FindStringRef(L"EnterAircraft: [%s] is attempting to enter aircraft after having already exited.", true, 0, Engine_Version >= 500).Get();
|
auto Addr = Memcury::Scanner::FindStringRef(L"EnterAircraft: [%s] is attempting to enter aircraft after having already exited.", true, 0, Engine_Version >= 500).Get();
|
||||||
@@ -671,7 +703,12 @@ static inline uint64 FindEnterAircraft()
|
|||||||
return Addr - i;
|
return Addr - i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x24)
|
/* if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C && *(uint8_t*)(uint8_t*)(Addr - i + 3) == 0x24)
|
||||||
|
{
|
||||||
|
return Addr - i;
|
||||||
|
} */
|
||||||
|
|
||||||
|
if (*(uint8_t*)(uint8_t*)(Addr - i) == 0x48 && *(uint8_t*)(uint8_t*)(Addr - i + 1) == 0x89 && *(uint8_t*)(uint8_t*)(Addr - i + 2) == 0x5C && *(uint8_t*)(uint8_t*)(Addr - i + 3) == 0x74) // 4.1
|
||||||
{
|
{
|
||||||
return Addr - i;
|
return Addr - i;
|
||||||
}
|
}
|
||||||
@@ -744,8 +781,8 @@ static inline uint64 FindApplyGadgetData()
|
|||||||
|
|
||||||
static inline uint64 FindGetInterfaceAddress()
|
static inline uint64 FindGetInterfaceAddress()
|
||||||
{
|
{
|
||||||
if (Engine_Version <= 420)
|
if (Engine_Version <= 421)
|
||||||
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 FF 48 8B DA 48 8B F1 48").Get(); // 4.1
|
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 FF 48 8B DA 48 8B F1 48").Get(); // 4.1 & 6.21
|
||||||
|
|
||||||
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 DB 48 8B FA 48 8B F1 48 85 D2 0F 84 ? ? ? ? 8B 82 ? ? ? ? C1 E8").Get();
|
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 33 DB 48 8B FA 48 8B F1 48 85 D2 0F 84 ? ? ? ? 8B 82 ? ? ? ? C1 E8").Get();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <olectl.h>
|
#include <olectl.h>
|
||||||
|
|
||||||
|
#include "FortAthenaMutator_Disco.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "Fonts/ruda-bold.h"
|
#include "Fonts/ruda-bold.h"
|
||||||
#include "Vector.h"
|
#include "Vector.h"
|
||||||
@@ -36,6 +37,7 @@
|
|||||||
#include "FortGadgetItemDefinition.h"
|
#include "FortGadgetItemDefinition.h"
|
||||||
#include "FortWeaponItemDefinition.h"
|
#include "FortWeaponItemDefinition.h"
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
|
#include "FortAthenaMutator_Heist.h"
|
||||||
|
|
||||||
#define GAME_TAB 1
|
#define GAME_TAB 1
|
||||||
#define PLAYERS_TAB 2
|
#define PLAYERS_TAB 2
|
||||||
@@ -45,8 +47,9 @@
|
|||||||
#define LATEGAME_TAB 6
|
#define LATEGAME_TAB 6
|
||||||
#define DUMP_TAB 7
|
#define DUMP_TAB 7
|
||||||
#define UNBAN_TAB 8
|
#define UNBAN_TAB 8
|
||||||
#define SETTINGS_TAB 9
|
#define DEVELOPER_TAB 9
|
||||||
#define CREDITS_TAB 10
|
#define SETTINGS_TAB 10
|
||||||
|
#define CREDITS_TAB 11
|
||||||
|
|
||||||
#define MAIN_PLAYERTAB 1
|
#define MAIN_PLAYERTAB 1
|
||||||
#define INVENTORY_PLAYERTAB 2
|
#define INVENTORY_PLAYERTAB 2
|
||||||
@@ -216,6 +219,10 @@ static int playerTabTab = MAIN_PLAYERTAB;
|
|||||||
|
|
||||||
void StaticUI()
|
void StaticUI()
|
||||||
{
|
{
|
||||||
|
#ifndef PROD
|
||||||
|
ImGui::Checkbox("Log ProcessEvent", &Globals::bLogProcessEvent);
|
||||||
|
#endif
|
||||||
|
|
||||||
ImGui::Checkbox("Infinite Ammo", &Globals::bInfiniteAmmo);
|
ImGui::Checkbox("Infinite Ammo", &Globals::bInfiniteAmmo);
|
||||||
ImGui::Checkbox("Infinite Materials", &Globals::bInfiniteMaterials);
|
ImGui::Checkbox("Infinite Materials", &Globals::bInfiniteMaterials);
|
||||||
|
|
||||||
@@ -306,6 +313,16 @@ void MainTabs()
|
|||||||
|
|
||||||
// maybe a Replication Stats for >3.3?
|
// maybe a Replication Stats for >3.3?
|
||||||
|
|
||||||
|
#ifndef PROD
|
||||||
|
if (ImGui::BeginTabItem("Developer"))
|
||||||
|
{
|
||||||
|
Tab = DEVELOPER_TAB;
|
||||||
|
PlayerTab = -1;
|
||||||
|
bInformationTab = false;
|
||||||
|
ImGui::EndTabItem();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (false && ImGui::BeginTabItem(("Credits")))
|
if (false && ImGui::BeginTabItem(("Credits")))
|
||||||
{
|
{
|
||||||
Tab = CREDITS_TAB;
|
Tab = CREDITS_TAB;
|
||||||
@@ -365,9 +382,7 @@ void MainUI()
|
|||||||
if (bLoaded)
|
if (bLoaded)
|
||||||
{
|
{
|
||||||
StaticUI();
|
StaticUI();
|
||||||
#ifndef PROD
|
|
||||||
ImGui::Checkbox("Log ProcessEvent", &Globals::bLogProcessEvent);
|
|
||||||
#endif
|
|
||||||
if (!bStartedBus)
|
if (!bStartedBus)
|
||||||
{
|
{
|
||||||
bool bWillBeLategame = Globals::bLateGame.load();
|
bool bWillBeLategame = Globals::bLateGame.load();
|
||||||
@@ -441,6 +456,44 @@ void MainUI()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::Button("TEST"))
|
||||||
|
{
|
||||||
|
auto GameMode = (AFortGameMode*)GetWorld()->GetGameMode();
|
||||||
|
auto GameState = GameMode->GetGameState();
|
||||||
|
|
||||||
|
static auto mutatorClass = FindObject<UClass>("/Script/FortniteGame.FortAthenaMutator");
|
||||||
|
auto AllMutators = UGameplayStatics::GetAllActorsOfClass(GetWorld(), mutatorClass);
|
||||||
|
|
||||||
|
for (int i = 0; i < AllMutators.Num(); i++)
|
||||||
|
{
|
||||||
|
auto Mutator = AllMutators.at(i);
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "[{}] Mutator: {}", i, Mutator->GetFullName());
|
||||||
|
|
||||||
|
if (auto DiscoMutator = Cast<AFortAthenaMutator_Disco>(Mutator))
|
||||||
|
{
|
||||||
|
auto& ControlPointSpawnData = DiscoMutator->GetControlPointSpawnData();
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "ControlPointSpawnData.Num(): {}", ControlPointSpawnData.Num());
|
||||||
|
}
|
||||||
|
else if (auto HeistMutator = Cast<AFortAthenaMutator_Heist>(Mutator))
|
||||||
|
{
|
||||||
|
auto& HeistExitCraftSpawnData = HeistMutator->GetHeistExitCraftSpawnData();
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "HeistExitCraftSpawnData.Num(): {}", HeistExitCraftSpawnData.Num());
|
||||||
|
|
||||||
|
for (int j = 0; j < HeistExitCraftSpawnData.Num(); j++)
|
||||||
|
{
|
||||||
|
auto& CurrentHeistExitCraftSpawnData = HeistExitCraftSpawnData.at(j);
|
||||||
|
auto CurveTable = CurrentHeistExitCraftSpawnData.SpawnDelayTime.GetCurve().CurveTable;
|
||||||
|
|
||||||
|
// LOG_INFO(LogDev, "{} {}", CurveTable ? CurveTable->GetFullName() : "InvalidTable",
|
||||||
|
// CurrentHeistExitCraftSpawnData.SpawnDelayTime.GetCurve().RowName.IsValid() ? CurrentHeistExitCraftSpawnData.SpawnDelayTime.GetCurve().RowName.ToString() : "InvalidName");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!bStartedBus)
|
if (!bStartedBus)
|
||||||
{
|
{
|
||||||
if (Globals::bLateGame.load())
|
if (Globals::bLateGame.load())
|
||||||
@@ -743,6 +796,22 @@ void MainUI()
|
|||||||
else if (Tab == UNBAN_TAB)
|
else if (Tab == UNBAN_TAB)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (Tab == DEVELOPER_TAB)
|
||||||
|
{
|
||||||
|
static std::string ClassNameToDump;
|
||||||
|
|
||||||
|
ImGui::InputText("Class Name to get VFT", &ClassNameToDump);
|
||||||
|
|
||||||
|
if (ImGui::Button("Print Class VFT"))
|
||||||
|
{
|
||||||
|
auto ClassToDump = FindObject<UClass>(ClassNameToDump)->CreateDefaultObject();
|
||||||
|
|
||||||
|
if (ClassToDump)
|
||||||
|
{
|
||||||
|
LOG_INFO(LogDev, "{} VFT: 0x{:x}", ClassToDump->GetName(), __int64(ClassToDump->VFTable) - __int64(GetModuleHandleW(0)));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Tab == SETTINGS_TAB)
|
else if (Tab == SETTINGS_TAB)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ static void CopyStruct(void* Dest, void* Src, size_t Size, UStruct* Struct = nul
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T = __int64>
|
template <typename T = __int64>
|
||||||
static T* Alloc(size_t Size, bool bUseRealloc = false)
|
static T* Alloc(size_t Size = sizeof(T), bool bUseRealloc = false)
|
||||||
{
|
{
|
||||||
return bUseRealloc ? (T*)FMemory::Realloc(0, Size, 0) : (T*)VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
return bUseRealloc ? (T*)FMemory::Realloc(0, Size, 0) : (T*)VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user