mirror of
https://github.com/ApfelTeeSaft/OG-Fortnite-Cheat.git
synced 2026-08-26 19:33:33 +00:00
lots of general improveents. idk exxactly what. going to work alot on the engine gui next push.
This commit is contained in:
@@ -48,7 +48,7 @@ namespace Config {
|
||||
namespace Standard {
|
||||
inline bool Enabled = true;
|
||||
inline float FOV = 20;
|
||||
inline float Smoothing = 8.f;
|
||||
inline float Smoothing = 1.f;
|
||||
}
|
||||
|
||||
namespace Weakspot {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
// TO-DO:
|
||||
// - Convert menu to a class (ONGOING)
|
||||
// - Add a pickaxe check for weakspot aimbot
|
||||
// - Convert FOV size to camera degrees instead of pixelss
|
||||
// - Revert FOV back to pixels always, add option for disabling FOV circle entirely
|
||||
// - Add a batch line processor for better line outlne handling
|
||||
// - Fix struct offset grabbing not working on new UProperty handling
|
||||
// - Add a proper config system
|
||||
@@ -80,7 +80,7 @@ BOOL APIENTRY DllMain( HMODULE hModule,
|
||||
)
|
||||
{
|
||||
ThisModule = hModule;
|
||||
|
||||
|
||||
switch (ul_reason_for_call)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
|
||||
@@ -47,13 +47,13 @@
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_Engine|x64'">
|
||||
<OutDir>$(SolutionDir)\Build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)\Build\$(Configuration)\Intermediates\</IntDir>
|
||||
<TargetName>$(ProjectName)15</TargetName>
|
||||
<TargetName>$(ProjectName)21</TargetName>
|
||||
<GenerateManifest>true</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Engine|x64'">
|
||||
<OutDir>$(SolutionDir)\Build\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)\Build\$(Configuration)\Intermediates\</IntDir>
|
||||
<TargetName>$(ProjectName)15</TargetName>
|
||||
<TargetName>$(ProjectName)21</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_Engine|x64'">
|
||||
<ClCompile>
|
||||
|
||||
@@ -39,6 +39,7 @@ void Actors::FortPawn::Tick() {
|
||||
}
|
||||
|
||||
if (CurrentPlayer.TeamIndex == LocalPawnCache.TeamIndex) continue;
|
||||
if (CurrentPlayer.FortPawn->IsDying()) continue;
|
||||
|
||||
bool DidPopulate2D = Features::FortPawnHelper::PopulateBones(CurrentPlayer);
|
||||
Features::FortPawnHelper::PopulateVisibilities(CurrentPlayer);
|
||||
|
||||
@@ -61,12 +61,6 @@ void Game::DrawCallback() {
|
||||
}
|
||||
RaaxGUI::EndWindow();
|
||||
|
||||
RaaxGUI::BeginWindow(skCrypt("Dummy Window").decrypt(), &test, RaaxGUI::RaaxGUIWindowFlags_None, SDK::FVector2D(rand() % 540, rand() % 540), SDK::FVector2D(rand() % 540, rand() % 540));
|
||||
RaaxGUI::EndWindow();
|
||||
|
||||
RaaxGUI::BeginWindow(skCrypt("Dummy Window 2").decrypt(), &test, RaaxGUI::RaaxGUIWindowFlags_None, SDK::FVector2D(rand() % 540, rand() % 540), SDK::FVector2D(rand() % 540, rand() % 540));
|
||||
RaaxGUI::EndWindow();
|
||||
|
||||
RaaxGUI::EndFrame();
|
||||
|
||||
if (test) {
|
||||
@@ -94,14 +88,32 @@ void Game::DrawCallback() {
|
||||
}
|
||||
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Right)) {
|
||||
Config::Aimbot::Standard::Smoothing += 0.1f;
|
||||
Config::Aimbot::Standard::Smoothing += 0.10f;
|
||||
}
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Left)) {
|
||||
Config::Aimbot::Standard::Smoothing -= 0.1f;
|
||||
Config::Aimbot::Standard::Smoothing -= 0.10f;
|
||||
}
|
||||
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Zero)) {
|
||||
Config::Aimbot::CloseAim::Smoothing += 0.10f;
|
||||
}
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Nine)) {
|
||||
Config::Aimbot::CloseAim::Smoothing -= 0.10f;
|
||||
}
|
||||
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Eight)) {
|
||||
Config::Aimbot::CloseAim::FOV += 10;
|
||||
}
|
||||
if (Input::WasKeyJustReleased(Input::KeyName::Seven)) {
|
||||
Config::Aimbot::CloseAim::FOV -= 10;
|
||||
}
|
||||
|
||||
Drawing::Text(std::to_string(Config::Aimbot::Standard::FOV).c_str(), SDK::FVector2D(100, 100), 16.f, SDK::FLinearColor(1.f, 1.f, 1.f, 1.f), true, true, true);
|
||||
Drawing::Text(std::to_string(Config::Aimbot::Standard::Smoothing).c_str(), SDK::FVector2D(100, 120), 16.f, SDK::FLinearColor(1.f, 1.f, 1.f, 1.f), true, true, true);
|
||||
Drawing::Text(std::to_string(Actors::MainTarget.LocalInfo.DistanceFromCrosshairDegrees).c_str(), SDK::FVector2D(100, 150), 18.f, SDK::FLinearColor(1.f, 0.f, 0.f, 1.f), true, true, true);
|
||||
Drawing::Text(std::to_string(Actors::MainTarget.LocalInfo.CurrentFOVSizeDegrees).c_str(), SDK::FVector2D(100, 170), 18.f, SDK::FLinearColor(1.f, 1.f, 0.f, 1.f), true, true, true);
|
||||
|
||||
Drawing::Text(std::to_string(Config::Aimbot::CloseAim::FOV).c_str(), SDK::FVector2D(100, 140), 16.f, SDK::FLinearColor(1.f, 1.f, 1.f, 1.f), true, true, true);
|
||||
Drawing::Text(std::to_string(Config::Aimbot::CloseAim::Smoothing).c_str(), SDK::FVector2D(100, 160), 16.f, SDK::FLinearColor(1.f, 1.f, 1.f, 1.f), true, true, true);
|
||||
|
||||
// Drawing::Text(std::to_string(Actors::MainTarget.LocalInfo.DistanceFromCrosshairDegrees).c_str(), SDK::FVector2D(100, 150), 18.f, SDK::FLinearColor(1.f, 0.f, 0.f, 1.f), true, true, true);
|
||||
//Drawing::Text(std::to_string(Actors::MainTarget.LocalInfo.CurrentFOVSizeDegrees).c_str(), SDK::FVector2D(100, 170), 18.f, SDK::FLinearColor(1.f, 1.f, 0.f, 1.f), true, true, true);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,6 @@
|
||||
#pragma once
|
||||
#include <unordered_map>
|
||||
|
||||
#include "../SDK/SDK.h"
|
||||
#include "../SDK/Classes/Engine_classes.h"
|
||||
|
||||
@@ -150,16 +152,25 @@ public:
|
||||
Gamepad_RightTrigger,
|
||||
Gamepad_DPad_Up,
|
||||
Gamepad_DPad_Down,
|
||||
Gamepad_DPad_Right,
|
||||
Gamepad_DPad_Left,
|
||||
Gamepad_DPad_Right,
|
||||
Gamepad_LeftStick_Up,
|
||||
Gamepad_LeftStick_Down,
|
||||
Gamepad_LeftStick_Right,
|
||||
Gamepad_LeftStick_Left,
|
||||
Gamepad_LeftStick_Right,
|
||||
Gamepad_RightStick_Up,
|
||||
Gamepad_RightStick_Down,
|
||||
Gamepad_RightStick_Left,
|
||||
Gamepad_RightStick_Right,
|
||||
Gamepad_RightStick_Left
|
||||
|
||||
KEYNAME_MAX
|
||||
};
|
||||
|
||||
/* Info on key names */
|
||||
struct KeyMapInfo {
|
||||
std::string Name;
|
||||
SDK::FName FName;
|
||||
Input::KeyName KeyName;
|
||||
};
|
||||
private:
|
||||
/* Cache info on keystates to avoid multiple checks per frame */
|
||||
@@ -183,193 +194,15 @@ private:
|
||||
KeyInfoCache WasJustReleased{};
|
||||
KeyInfoCache WasJustPressed{};
|
||||
|
||||
KeyName KeyName;
|
||||
|
||||
|
||||
KeyData() : FName(), Name() {}
|
||||
|
||||
KeyData(SDK::FName FName, std::string Name) : FName(FName), Name(Name) {}
|
||||
};
|
||||
|
||||
/* Cache info on all keys */
|
||||
struct KeysCache {
|
||||
KeyData AnyKey;
|
||||
|
||||
KeyData MouseX;
|
||||
KeyData MouseY;
|
||||
KeyData MouseScrollUp;
|
||||
KeyData MouseScrollDown;
|
||||
KeyData LeftMouseButton;
|
||||
KeyData RightMouseButton;
|
||||
KeyData MiddleMouseButton;
|
||||
KeyData ThumbMouseButton;
|
||||
KeyData ThumbMouseButton2;
|
||||
|
||||
KeyData BackSpace;
|
||||
KeyData Tab;
|
||||
KeyData Enter;
|
||||
KeyData Pause;
|
||||
KeyData CapsLock;
|
||||
KeyData Escape;
|
||||
KeyData SpaceBar;
|
||||
KeyData PageUp;
|
||||
KeyData PageDown;
|
||||
KeyData End;
|
||||
KeyData Home;
|
||||
|
||||
KeyData Left;
|
||||
KeyData Up;
|
||||
KeyData Right;
|
||||
KeyData Down;
|
||||
|
||||
KeyData Insert;
|
||||
KeyData Delete;
|
||||
|
||||
KeyData Zero;
|
||||
KeyData One;
|
||||
KeyData Two;
|
||||
KeyData Three;
|
||||
KeyData Four;
|
||||
KeyData Five;
|
||||
KeyData Six;
|
||||
KeyData Seven;
|
||||
KeyData Eight;
|
||||
KeyData Nine;
|
||||
|
||||
KeyData A;
|
||||
KeyData B;
|
||||
KeyData C;
|
||||
KeyData D;
|
||||
KeyData E;
|
||||
KeyData F;
|
||||
KeyData G;
|
||||
KeyData H;
|
||||
KeyData I;
|
||||
KeyData J;
|
||||
KeyData K;
|
||||
KeyData L;
|
||||
KeyData M;
|
||||
KeyData N;
|
||||
KeyData O;
|
||||
KeyData P;
|
||||
KeyData Q;
|
||||
KeyData R;
|
||||
KeyData S;
|
||||
KeyData T;
|
||||
KeyData U;
|
||||
KeyData V;
|
||||
KeyData W;
|
||||
KeyData X;
|
||||
KeyData Y;
|
||||
KeyData Z;
|
||||
|
||||
KeyData NumPadZero;
|
||||
KeyData NumPadOne;
|
||||
KeyData NumPadTwo;
|
||||
KeyData NumPadThree;
|
||||
KeyData NumPadFour;
|
||||
KeyData NumPadFive;
|
||||
KeyData NumPadSix;
|
||||
KeyData NumPadSeven;
|
||||
KeyData NumPadEight;
|
||||
KeyData NumPadNine;
|
||||
|
||||
KeyData Multiply;
|
||||
KeyData Add;
|
||||
KeyData Subtract;
|
||||
KeyData Decimal;
|
||||
KeyData Divide;
|
||||
|
||||
KeyData F1;
|
||||
KeyData F2;
|
||||
KeyData F3;
|
||||
KeyData F4;
|
||||
KeyData F5;
|
||||
KeyData F6;
|
||||
KeyData F7;
|
||||
KeyData F8;
|
||||
KeyData F9;
|
||||
KeyData F10;
|
||||
KeyData F11;
|
||||
KeyData F12;
|
||||
|
||||
KeyData NumLock;
|
||||
KeyData ScrollLock;
|
||||
KeyData LeftShift;
|
||||
KeyData RightShift;
|
||||
KeyData LeftControl;
|
||||
KeyData RightControl;
|
||||
KeyData LeftAlt;
|
||||
KeyData RightAlt;
|
||||
KeyData LeftCommand;
|
||||
KeyData RightCommand;
|
||||
KeyData Semicolon;
|
||||
KeyData Equals;
|
||||
KeyData Comma;
|
||||
KeyData Underscore;
|
||||
KeyData Period;
|
||||
KeyData Slash;
|
||||
KeyData Tilde;
|
||||
KeyData LeftBracket;
|
||||
KeyData Backslash;
|
||||
KeyData RightBracket;
|
||||
KeyData Quote;
|
||||
KeyData Asterix;
|
||||
KeyData Ampersand;
|
||||
KeyData Caret;
|
||||
KeyData Dollar;
|
||||
KeyData Exclamation;
|
||||
KeyData Colon;
|
||||
|
||||
KeyData A_AccentGrave;
|
||||
KeyData E_AccentGrave;
|
||||
KeyData E_AccentAigu;
|
||||
KeyData C_Cedille;
|
||||
|
||||
KeyData Section;
|
||||
|
||||
KeyData Gamepad_LeftX;
|
||||
KeyData Gamepad_LeftY;
|
||||
KeyData Gamepad_RightX;
|
||||
KeyData Gamepad_RightY;
|
||||
KeyData Gamepad_LeftTriggerAxis;
|
||||
KeyData Gamepad_RightTriggerAxis;
|
||||
KeyData Gamepad_LeftThumbstick;
|
||||
KeyData Gamepad_RightThumbstick;
|
||||
KeyData Gamepad_Special_Left;
|
||||
KeyData Gamepad_Special_Left_X;
|
||||
KeyData Gamepad_Special_Left_Y;
|
||||
KeyData Gamepad_Special_Right;
|
||||
KeyData Gamepad_FaceButton_Bottom;
|
||||
KeyData Gamepad_FaceButton_Right;
|
||||
KeyData Gamepad_FaceButton_Left;
|
||||
KeyData Gamepad_FaceButton_Top;
|
||||
KeyData Gamepad_LeftShoulder;
|
||||
KeyData Gamepad_RightShoulder;
|
||||
KeyData Gamepad_LeftTrigger;
|
||||
KeyData Gamepad_RightTrigger;
|
||||
KeyData Gamepad_DPad_Up;
|
||||
KeyData Gamepad_DPad_Down;
|
||||
KeyData Gamepad_DPad_Right;
|
||||
KeyData Gamepad_DPad_Left;
|
||||
KeyData Gamepad_LeftStick_Up;
|
||||
KeyData Gamepad_LeftStick_Down;
|
||||
KeyData Gamepad_LeftStick_Right;
|
||||
KeyData Gamepad_LeftStick_Left;
|
||||
KeyData Gamepad_RightStick_Up;
|
||||
KeyData Gamepad_RightStick_Down;
|
||||
KeyData Gamepad_RightStick_Right;
|
||||
KeyData Gamepad_RightStick_Left;
|
||||
|
||||
KeyData None;
|
||||
};
|
||||
|
||||
|
||||
|
||||
static KeysCache Keys;
|
||||
static std::unordered_map<KeyName, KeyData> Keys;
|
||||
static MouseCache Mouse;
|
||||
private:
|
||||
/*
|
||||
* @brief Get the key data for a specific key
|
||||
*
|
||||
* @param Key - The key to get the data for
|
||||
*/
|
||||
static KeyData& GetKeyData(KeyName Key);
|
||||
public:
|
||||
/*
|
||||
* @brief Get the mouse position
|
||||
@@ -402,6 +235,33 @@ public:
|
||||
* @return Returns - The mouse position
|
||||
*/
|
||||
static bool WasKeyJustPressed(KeyName Key);
|
||||
/*
|
||||
* @brief Get all the keys that are currently down
|
||||
*
|
||||
* @return A vector of all the keys that are currently down
|
||||
*/
|
||||
std::vector<Input::KeyName> GetAllDownKeys();
|
||||
/*
|
||||
* @brief Get all the keys that were just released
|
||||
*
|
||||
* @return A vector of all the keys that were just released
|
||||
*/
|
||||
std::vector<Input::KeyName> GetAllJustReleasedKeys();
|
||||
/*
|
||||
* @brief Get all the keys that were just pressed
|
||||
*
|
||||
* @return A vector of all the keys that were just pressed
|
||||
*/
|
||||
std::vector<Input::KeyName> GetAllJustPressedKeys();
|
||||
|
||||
/*
|
||||
* @brief Get the key name from a key
|
||||
*
|
||||
* @param Key - The key to get the name of
|
||||
*
|
||||
* @return The name of the key
|
||||
*/
|
||||
std::string GetKeyName(Input::KeyName Key);
|
||||
|
||||
/* Init the input cache system */
|
||||
static void Init();
|
||||
|
||||
@@ -14,20 +14,29 @@ typedef unsigned __int16 uint16;
|
||||
typedef unsigned __int32 uint32;
|
||||
typedef unsigned __int64 uint64;
|
||||
|
||||
enum class OffsetType {
|
||||
Class = 0,
|
||||
Struct = 1,
|
||||
};
|
||||
struct FunctionSearch {
|
||||
std::string ClassName;
|
||||
std::string FunctionName;
|
||||
void** Function;
|
||||
std::string ClassName; // The name of the class
|
||||
std::string FunctionName; // The name of the function
|
||||
void** Function; // A pointer to save the function address to
|
||||
|
||||
bool operator==(const FunctionSearch& rhs) {
|
||||
return ClassName == rhs.ClassName
|
||||
&& FunctionName == rhs.FunctionName
|
||||
&& Function == rhs.Function;
|
||||
}
|
||||
};
|
||||
struct OffsetSearch {
|
||||
std::string ClassName;
|
||||
std::string PropertyName;
|
||||
uintptr_t* Offset;
|
||||
OffsetType Type;
|
||||
std::string ClassName; // The name of the class
|
||||
std::string PropertyName; // The name of the property
|
||||
uintptr_t* Offset; // A pointer to save the offset to
|
||||
uintptr_t* Mask; // A pointer to save the bitfield mask to
|
||||
|
||||
bool operator==(const OffsetSearch& rhs) {
|
||||
return ClassName == rhs.ClassName
|
||||
&& PropertyName == rhs.PropertyName
|
||||
&& Offset == rhs.Offset
|
||||
&& Mask == rhs.Mask;
|
||||
}
|
||||
};
|
||||
|
||||
namespace SDK {
|
||||
@@ -107,6 +116,25 @@ namespace SDK {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<typename UEType = UObject>
|
||||
static UEType* FindObjectFastInOuter(std::string Name, std::string Outer)
|
||||
{
|
||||
for (int i = 0; i < ObjectArray.Num(); ++i)
|
||||
{
|
||||
UObject* Object = ObjectArray.GetByIndex(i);
|
||||
|
||||
if (!Object)
|
||||
continue;
|
||||
|
||||
if (Object->GetName() == Name && Object->Outer->GetName() == Outer)
|
||||
{
|
||||
return reinterpret_cast<UEType*>(Object);
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
static class UClass* FindClass(const std::string& ClassFullName)
|
||||
{
|
||||
@@ -119,6 +147,7 @@ namespace SDK {
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void SetupObjects(std::vector<FunctionSearch>& Functions, std::vector<OffsetSearch>& Offsets);
|
||||
|
||||
|
||||
@@ -127,15 +156,28 @@ namespace SDK {
|
||||
|
||||
|
||||
|
||||
class FFieldClass
|
||||
{
|
||||
public:
|
||||
FName Name; // (0x00[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
uint64 Id; // (0x08[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
EClassCastFlags CastFlags; // (0x10[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
uint64 ClassFlags; // (0x18[0x04]) NOT AUTO-GENERATED PROPERTY
|
||||
uint8 Pad_74C3[0x4]; // Fixing Size After Last (Predefined) Property [ Dumper-7 ]
|
||||
FFieldClass* SuperClass; // (0x20[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
};
|
||||
|
||||
class FField
|
||||
{
|
||||
public:
|
||||
void* Vft; // (0x00[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
void* Class; // (0x08[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
FFieldClass* Class; // (0x08[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
char Owner[0x10]; // (0x10[0x10]) NOT AUTO-GENERATED PROPERTY
|
||||
FField* Next; // (0x20[0x08]) NOT AUTO-GENERATED PROPERTY
|
||||
FName Name; // (0x28[0x10]) NOT AUTO-GENERATED PROPERTY
|
||||
int32 Flags; // (0x38[0x04]) NOT AUTO-GENERATED PROPERTY
|
||||
|
||||
bool HasTypeFlag(EClassCastFlags TypeFlag) const;
|
||||
};
|
||||
|
||||
class FProperty : public FField
|
||||
@@ -147,18 +189,44 @@ namespace SDK {
|
||||
int32 Offset; // (0x4C[0x04]) NOT AUTO-GENERATED PROPERTY
|
||||
};
|
||||
|
||||
class FBoolProperty : public FProperty
|
||||
{
|
||||
public:
|
||||
uint8 Pad_74C7[0x28]; // Fixing Size After Last (Predefined) Property [ Dumper-7 ]
|
||||
uint8 FieldSize; // (0x78[0x01]) NOT AUTO-GENERATED PROPERTY
|
||||
uint8 ByteOffset; // (0x79[0x01]) NOT AUTO-GENERATED PROPERTY
|
||||
uint8 ByteMask; // (0x7A[0x01]) NOT AUTO-GENERATED PROPERTY
|
||||
uint8 FieldMask; // (0x7B[0x01]) NOT AUTO-GENERATED PROPERTY
|
||||
};
|
||||
|
||||
class UField : public UObject {
|
||||
public:
|
||||
static uint32 NextOffset;
|
||||
|
||||
class UField* Next() {
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return nullptr;
|
||||
return (UField*)(*(uintptr_t*)((uintptr_t)this + NextOffset));
|
||||
}
|
||||
};
|
||||
|
||||
class UStruct : public UObject {
|
||||
public:
|
||||
static int32_t SuperOffset;
|
||||
static int32_t ChildPropertiesOffset;
|
||||
static uint32 SuperOffset;
|
||||
static uint32 ChildPropertiesOffset;
|
||||
static uint32 ChildrenOffset;
|
||||
|
||||
class UStruct* Super() {
|
||||
if (!this) return nullptr;
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return nullptr;
|
||||
return (UStruct*)(*(uintptr_t*)((uintptr_t)this + SuperOffset));
|
||||
}
|
||||
|
||||
class UField* Children() {
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return nullptr;
|
||||
return (UField*)(*(uintptr_t*)((uintptr_t)this + ChildrenOffset));
|
||||
}
|
||||
|
||||
class FField* ChildProperties() {
|
||||
if (!this) return nullptr;
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return nullptr;
|
||||
return (FField*)(*(uintptr_t*)((uintptr_t)this + ChildPropertiesOffset));
|
||||
}
|
||||
};
|
||||
@@ -166,31 +234,42 @@ namespace SDK {
|
||||
class UProperty : public UObject
|
||||
{
|
||||
public:
|
||||
static int32_t OffsetOffset;
|
||||
static uint32 OffsetOffset;
|
||||
|
||||
int32 Offset() {
|
||||
if (!this) return 0;
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return 0;
|
||||
return *(int32*)((uintptr_t)this + OffsetOffset);
|
||||
}
|
||||
};
|
||||
|
||||
class UBoolProperty : public UProperty {
|
||||
public:
|
||||
static uint32 ByteMaskOffset;
|
||||
|
||||
uint8 ByteMask() {
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return 0;
|
||||
return *(uint8*)((uintptr_t)this + ByteMaskOffset);
|
||||
}
|
||||
};
|
||||
|
||||
class UClass : public UStruct {
|
||||
public:
|
||||
static int32_t CastFlagsOffset;
|
||||
static int32_t DefaultObjectOffset;
|
||||
static uint32 CastFlagsOffset;
|
||||
static uint32 DefaultObjectOffset;
|
||||
|
||||
enum class EClassCastFlags CastFlags() {
|
||||
if (!this) return EClassCastFlags::None;
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return EClassCastFlags::None;
|
||||
return *(EClassCastFlags*)((uintptr_t)this + CastFlagsOffset);
|
||||
}
|
||||
|
||||
class UObject* DefaultObject() {
|
||||
if (!this) return nullptr;
|
||||
if (SDK::IsValidPointer((uintptr_t)this) == false) return nullptr;
|
||||
return (UObject*)(*(uintptr_t*)((uintptr_t)this + DefaultObjectOffset));
|
||||
}
|
||||
};
|
||||
|
||||
class UFunction : public UStruct {
|
||||
public:
|
||||
static int32_t FunctionFlags;
|
||||
static uint32 FunctionFlagsOffset;
|
||||
};
|
||||
}
|
||||
@@ -8,12 +8,15 @@
|
||||
namespace SDK {
|
||||
TUObjectArray UObject::ObjectArray;
|
||||
|
||||
int32_t UClass::DefaultObjectOffset;
|
||||
int32_t UClass::CastFlagsOffset;
|
||||
int32_t UStruct::SuperOffset;
|
||||
int32_t UStruct::ChildPropertiesOffset;
|
||||
int32_t UProperty::OffsetOffset;
|
||||
int32_t UFunction::FunctionFlags;
|
||||
uint32 UClass::DefaultObjectOffset;
|
||||
uint32 UClass::CastFlagsOffset;
|
||||
uint32 UStruct::SuperOffset;
|
||||
uint32 UStruct::ChildPropertiesOffset;
|
||||
uint32 UStruct::ChildrenOffset;
|
||||
uint32 UField::NextOffset;
|
||||
uint32 UProperty::OffsetOffset;
|
||||
uint32 UBoolProperty::ByteMaskOffset;
|
||||
uint32 UFunction::FunctionFlagsOffset;
|
||||
|
||||
|
||||
|
||||
@@ -79,179 +82,6 @@ namespace SDK {
|
||||
return "None";
|
||||
}
|
||||
|
||||
void UObject::SetupObjects(std::vector<FunctionSearch>& Functions, std::vector<OffsetSearch>& Offsets) {
|
||||
#if 0
|
||||
for (int i = 0; i < ObjectArray.Num() && (!Functions.empty() || !Offsets.empty()); ++i) {
|
||||
UObject* Object = ObjectArray.GetByIndex(i);
|
||||
|
||||
if (!Object)
|
||||
continue;
|
||||
|
||||
if (Object->IsDefaultObject() || Object->HasTypeFlag(SDK::EClassCastFlags::ScriptStruct)) {
|
||||
SDK::UStruct* ObjectStruct = Object->HasTypeFlag(SDK::EClassCastFlags::ScriptStruct) ? ((SDK::UStruct*)Object) : Object->Class;
|
||||
|
||||
std::string ObjectName = ObjectStruct->Name.ToString();
|
||||
|
||||
for (FunctionSearch& Function : Functions) {
|
||||
if (*Function.Function || !ObjectName.ends_with(Function.className))
|
||||
continue;
|
||||
|
||||
SDK::UField* child = ObjectStruct->Children;
|
||||
while (child) {
|
||||
if (child->Name.ToString() == Function.childName) {
|
||||
*Function.Function = child;
|
||||
}
|
||||
|
||||
child = child->Next;
|
||||
}
|
||||
}
|
||||
|
||||
for (Offset_& offset : Offsets) {
|
||||
if (*offset.pOffset || !ObjectName.ends_with(offset.className))
|
||||
continue;
|
||||
|
||||
SDK::FField* child = ObjectStruct->ChildProperties;
|
||||
while (child) {
|
||||
if (child->Name.ToString() == offset.propertyName) {
|
||||
*offset.pOffset = ((SDK::FProperty*)child)->Offset;
|
||||
if (offset.pMask && !*offset.pMask) {
|
||||
*offset.pMask = ((SDK::FBoolProperty*)child)->FieldMask;
|
||||
}
|
||||
}
|
||||
|
||||
child = child->Next;
|
||||
}
|
||||
}
|
||||
|
||||
for (Class_& class_ : Classes) {
|
||||
if (!*class_.pAddress && ObjectName == class_.className)
|
||||
*class_.pAddress = (uintptr_t)ObjectStruct;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
DEBUG_LOG(skCrypt("Setting up objects...").decrypt());
|
||||
|
||||
for (int i = 0; i < ObjectArray.Num() && (!Functions.empty() || !Offsets.empty()); ++i) {
|
||||
UObject* Object = ObjectArray.GetByIndex(i);
|
||||
|
||||
if (!Object)
|
||||
continue;
|
||||
|
||||
std::string ObjectName = Object->GetName();
|
||||
|
||||
if (ObjectName.empty())
|
||||
continue;
|
||||
|
||||
if (!Functions.empty()) {
|
||||
if (Object->HasTypeFlag(EClassCastFlags::Function)) {
|
||||
for (auto it = Functions.begin(); it != Functions.end(); ) {
|
||||
FunctionSearch& CurrentFunction = *it;
|
||||
|
||||
if (CurrentFunction.FunctionName == ObjectName) {
|
||||
|
||||
std::string combinedString = CurrentFunction.ClassName + "." + CurrentFunction.FunctionName;
|
||||
|
||||
std::string FullObjectName = Object->GetFullName();
|
||||
|
||||
if (FullObjectName.length() >= combinedString.length() &&
|
||||
FullObjectName.substr(FullObjectName.length() - combinedString.length()) == combinedString) {
|
||||
*CurrentFunction.Function = Object;
|
||||
it = Functions.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Offsets.empty()) {
|
||||
for (auto it = Offsets.begin(); it != Offsets.end();) {
|
||||
OffsetSearch& CurrentOffset = *it;
|
||||
|
||||
if (Game::GameVersion >= 12.00) {
|
||||
// In later UE4 versions, they changed how they manage UProperty variables, so we add "Default__" to the beginning of the class name
|
||||
// to find the default object of the class. There is no default object for structs, so we just use the class name
|
||||
std::string DefaultName;
|
||||
if (CurrentOffset.Type == OffsetType::Class) {
|
||||
DefaultName = skCrypt("Default__").decrypt() + CurrentOffset.ClassName;
|
||||
}
|
||||
else {
|
||||
DefaultName = CurrentOffset.ClassName;
|
||||
}
|
||||
|
||||
if (ObjectName == DefaultName) {
|
||||
FField* ChildProperties = Object->Class->ChildProperties();
|
||||
|
||||
if (!ChildProperties) {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t Offset = GetPropertyOffset(ChildProperties, CurrentOffset.PropertyName);
|
||||
|
||||
if (Offset) {
|
||||
*CurrentOffset.Offset = Offset;
|
||||
it = Offsets.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (CurrentOffset.PropertyName == ObjectName) {
|
||||
std::string combinedString = CurrentOffset.ClassName + "." + CurrentOffset.PropertyName;
|
||||
|
||||
std::string FullObjectName = Object->GetFullName();
|
||||
|
||||
if (FullObjectName.length() >= combinedString.length() &&
|
||||
FullObjectName.substr(FullObjectName.length() - combinedString.length()) == combinedString) {
|
||||
UProperty* Property = reinterpret_cast<SDK::UProperty*>(Object);
|
||||
*CurrentOffset.Offset = GetPropertyOffset(Property);
|
||||
it = Offsets.erase(it);
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Offsets.empty()) {
|
||||
std::string OffsetsNotFoundStr = skCrypt("Offsets not found:\n").decrypt();
|
||||
for (auto& Offset : Offsets) {
|
||||
OffsetsNotFoundStr += Offset.ClassName + skCrypt(".").decrypt() + Offset.PropertyName + skCrypt("\n").decrypt();
|
||||
}
|
||||
|
||||
THROW_ERROR(skCrypt("One or more offsets were not found!\n").decrypt() + OffsetsNotFoundStr, false);
|
||||
}
|
||||
if (!Functions.empty()) {
|
||||
std::string FunctionsNotFoundStr = skCrypt("Functions not found:\n").decrypt();
|
||||
for (auto& Function : Functions) {
|
||||
FunctionsNotFoundStr += Function.ClassName + skCrypt(".").decrypt() + Function.FunctionName + skCrypt("\n").decrypt();
|
||||
}
|
||||
|
||||
THROW_ERROR(skCrypt("One or more functions were not found!").decrypt() + FunctionsNotFoundStr, false);
|
||||
}
|
||||
|
||||
DEBUG_LOG(skCrypt("Setup objects!").decrypt());
|
||||
}
|
||||
|
||||
bool UObject::IsA(class UClass* Clss) const
|
||||
{
|
||||
for (UStruct* Super = Class; Super; Super = Super->Super())
|
||||
@@ -264,4 +94,128 @@ namespace SDK {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FField::HasTypeFlag(EClassCastFlags TypeFlag) const
|
||||
{
|
||||
if (Class == nullptr)
|
||||
return false;
|
||||
|
||||
return TypeFlag != EClassCastFlags::None ? Class->CastFlags & TypeFlag : true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void UObject::SetupObjects(std::vector<FunctionSearch>& Functions, std::vector<OffsetSearch>& Offsets) {
|
||||
DEBUG_LOG(skCrypt("Setting up objects...").decrypt());
|
||||
|
||||
std::vector<FunctionSearch> FunctionsNotFound = Functions;
|
||||
std::vector<OffsetSearch> OffsetsNotFound = Offsets;
|
||||
|
||||
|
||||
|
||||
for (int i = 0; i < ObjectArray.Num() && (Functions.empty() == false || Offsets.empty() == false); i++) {
|
||||
UObject* Object = ObjectArray.GetByIndex(i);
|
||||
|
||||
if (!Object)
|
||||
continue;
|
||||
|
||||
// In later UE4 versions, they changed how they managed properties
|
||||
// so we need to add these addional checks to make sure we only get the default object or ScriptStruct
|
||||
if (Game::GameVersion >= 12.00 && Object->IsDefaultObject() == false && Object->HasTypeFlag(SDK::EClassCastFlags::ScriptStruct) == false)
|
||||
continue;
|
||||
|
||||
SDK::UStruct* ObjectStruct = Object->HasTypeFlag(SDK::EClassCastFlags::ScriptStruct) ? ((SDK::UStruct*)Object) : Object->Class;
|
||||
std::string ObjectName = ObjectStruct->Name.ToString();
|
||||
|
||||
for (FunctionSearch& Function : Functions) {
|
||||
if (*Function.Function || ObjectName.ends_with(Function.ClassName) == false)
|
||||
continue;
|
||||
|
||||
SDK::UField* Children = ObjectStruct->Children();
|
||||
while (Children) {
|
||||
if (Children->HasTypeFlag(SDK::EClassCastFlags::Function) && Children->Name.ToString() == Function.FunctionName) {
|
||||
*Function.Function = Children;
|
||||
|
||||
FunctionsNotFound.erase(std::remove(FunctionsNotFound.begin(), FunctionsNotFound.end(), Function), FunctionsNotFound.end());
|
||||
}
|
||||
|
||||
Children = Children->Next();
|
||||
}
|
||||
}
|
||||
|
||||
for (OffsetSearch& Offset : Offsets) {
|
||||
if ((Offset.Offset == nullptr && Offset.Mask == nullptr) || ObjectName.ends_with(Offset.ClassName) == false)
|
||||
continue;
|
||||
|
||||
if (Game::GameVersion >= 12.00) {
|
||||
SDK::FField* ChildProperty = ObjectStruct->ChildProperties();
|
||||
while (ChildProperty) {
|
||||
if (ChildProperty->Name.ToString() == Offset.PropertyName) {
|
||||
if (Offset.Offset != nullptr && *Offset.Offset == 0x0 && ChildProperty->HasTypeFlag(SDK::EClassCastFlags::Property)) {
|
||||
*Offset.Offset = ((SDK::FProperty*)ChildProperty)->Offset;
|
||||
}
|
||||
|
||||
if (Offset.Mask != nullptr && *Offset.Mask == 0x0 && ChildProperty->HasTypeFlag(SDK::EClassCastFlags::BoolProperty)) {
|
||||
*Offset.Mask = ((SDK::FBoolProperty*)ChildProperty)->FieldMask;
|
||||
}
|
||||
|
||||
OffsetsNotFound.erase(std::remove(OffsetsNotFound.begin(), OffsetsNotFound.end(), Offset), OffsetsNotFound.end());
|
||||
}
|
||||
|
||||
ChildProperty = ChildProperty->Next;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ObjectName.ends_with(Offset.ClassName)) {
|
||||
SDK::UField* Child = ObjectStruct->Children();
|
||||
while (Child) {
|
||||
if (Child->Name.ToString() == Offset.PropertyName) {
|
||||
if (Offset.Offset != nullptr && *Offset.Offset == 0x0 && Child->HasTypeFlag(SDK::EClassCastFlags::Property)) {
|
||||
*Offset.Offset = GetPropertyOffset((SDK::UProperty*)Child);
|
||||
}
|
||||
|
||||
if (Offset.Mask != nullptr && *Offset.Mask == 0x0 && Child->HasTypeFlag(SDK::EClassCastFlags::BoolProperty)) {
|
||||
*Offset.Mask = ((SDK::UBoolProperty*)Child)->ByteMaskOffset;
|
||||
}
|
||||
|
||||
OffsetsNotFound.erase(std::remove(OffsetsNotFound.begin(), OffsetsNotFound.end(), Offset), OffsetsNotFound.end());
|
||||
}
|
||||
|
||||
Child = Child->Next();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (OffsetsNotFound.empty() == false || FunctionsNotFound.empty() == false) {
|
||||
std::string MissingOffsets;
|
||||
for (OffsetSearch& Offset : OffsetsNotFound) {
|
||||
MissingOffsets += Offset.ClassName + " " + Offset.PropertyName + "\n";
|
||||
}
|
||||
|
||||
std::string MissingFunctions;
|
||||
for (FunctionSearch& Function : FunctionsNotFound) {
|
||||
MissingFunctions += Function.ClassName + " " + Function.FunctionName + "\n";
|
||||
}
|
||||
|
||||
std::string Output = skCrypt("").decrypt();
|
||||
|
||||
if (MissingOffsets.empty() == false) {
|
||||
Output += skCrypt("Missing offsets: \n").decrypt();
|
||||
Output += MissingOffsets;
|
||||
}
|
||||
|
||||
if (MissingFunctions.empty() == false) {
|
||||
Output += skCrypt("\nMissing functions: \n").decrypt();
|
||||
Output += MissingFunctions;
|
||||
}
|
||||
|
||||
THROW_ERROR(skCrypt("Failed to find all offsets and functions!\n\n").decrypt() + Output, CRASH_ON_ERROR);
|
||||
}
|
||||
|
||||
DEBUG_LOG(skCrypt("Setup objects!").decrypt());
|
||||
}
|
||||
}
|
||||
@@ -107,6 +107,18 @@ namespace SDK {
|
||||
return (AFortWeapon*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::CurrentWeapon));
|
||||
}
|
||||
|
||||
bool IsDying() {
|
||||
if (!SDK::IsValidPointer((uintptr_t)this)) return false;
|
||||
|
||||
if (SDK::Cached::Masks::FortPawn::bIsDying) {
|
||||
uint8 BitField = *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::bIsDying);
|
||||
return BitField & SDK::Cached::Masks::FortPawn::bIsDying;
|
||||
}
|
||||
else {
|
||||
return *(bool*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::bIsDying);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// STATIC FUNCTIONS
|
||||
@@ -117,9 +129,9 @@ namespace SDK {
|
||||
public:
|
||||
// VALUES
|
||||
|
||||
uint8_t GetWeakSpotInfo() {
|
||||
uint8 GetWeakSpotInfo() {
|
||||
if (!this) return 0;
|
||||
return *(uint8_t*)((uintptr_t)this + SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField);
|
||||
return *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -42,15 +42,17 @@ void SDK::Init() {
|
||||
SDKInitializer::InitLineTraceSingle();
|
||||
|
||||
// Init Class Offsets
|
||||
SDK::UProperty::OffsetOffset = 0x44;
|
||||
SDK::UProperty::OffsetOffset = 0x44; // Doesn't change (as far as I know)
|
||||
SDK::UBoolProperty::ByteMaskOffset = 0x72; // Doesn't change (as far as I know)
|
||||
SDK::UClass::DefaultObjectOffset = SDKInitializer::FindDefaultObjectOffset();
|
||||
SDK::UClass::CastFlagsOffset = SDKInitializer::FindCastFlagsOffset();
|
||||
SDK::UStruct::SuperOffset = SDKInitializer::FindSuperOffset();
|
||||
SDK::UStruct::ChildPropertiesOffset = SDKInitializer::FindChildPropertiesOffset();
|
||||
SDK::UFunction::FunctionFlags = SDKInitializer::FindFunctionFlagsOffset();
|
||||
SDK::UStruct::ChildrenOffset = SDKInitializer::FindChildrenOffset();
|
||||
SDK::UField::NextOffset = SDKInitializer::FindUFieldNextOffset();
|
||||
SDK::UFunction::FunctionFlagsOffset = SDKInitializer::FindFunctionFlagsOffset();
|
||||
|
||||
// Init VFT Indexes
|
||||
SDKInitializer::InitPRIndex();
|
||||
SDKInitializer::InitPEIndex();
|
||||
SDKInitializer::InitGPVIndex();
|
||||
SDKInitializer::InitGVIndex();
|
||||
@@ -73,63 +75,67 @@ void SDK::Init() {
|
||||
|
||||
// Init Cached Objects
|
||||
{
|
||||
std::vector<FunctionSearch> Functions{
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_DrawLine").decrypt(), &SDK::Cached::Functions::Canvas::K2_DrawLine },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_DrawText").decrypt(), &SDK::Cached::Functions::Canvas::K2_DrawText },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_TextSize").decrypt(), &SDK::Cached::Functions::Canvas::K2_TextSize },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_Project").decrypt(), &SDK::Cached::Functions::Canvas::K2_Project },
|
||||
FunctionSearch { skCrypt("GameplayStatics").decrypt(), skCrypt("GetAllActorsOfClass").decrypt(), &SDK::Cached::Functions::GameplayStatics::GetAllActorsOfClass },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetCameraLocation").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetCameraLocation },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetCameraRotation").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetCameraRotation },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetFOVAngle").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetFOVAngle },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("IsInputKeyDown").decrypt(), &SDK::Cached::Functions::PlayerController::IsInputKeyDown },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("WasInputKeyJustReleased").decrypt(), &SDK::Cached::Functions::PlayerController::WasInputKeyJustReleased },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("WasInputKeyJustPressed").decrypt(), &SDK::Cached::Functions::PlayerController::WasInputKeyJustPressed },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("GetMousePosition").decrypt(), &SDK::Cached::Functions::PlayerController::GetMousePosition },
|
||||
FunctionSearch { skCrypt("Controller").decrypt(), skCrypt("ClientSetRotation").decrypt(), &SDK::Cached::Functions::PlayerController::ClientSetRotation },
|
||||
FunctionSearch { skCrypt("Controller").decrypt(), skCrypt("SetControlRotation").decrypt(), &SDK::Cached::Functions::PlayerController::SetControlRotation },
|
||||
FunctionSearch { skCrypt("KismetSystemLibrary").decrypt(), skCrypt("LineTraceSingle").decrypt(), &SDK::Cached::Functions::KismetSystemLibrary::LineTraceSingle },
|
||||
FunctionSearch { skCrypt("KismetMathLibrary").decrypt(), skCrypt("FindLookAtRotation").decrypt(), &SDK::Cached::Functions::KismetMathLibrary::FindLookAtRotation },
|
||||
FunctionSearch { skCrypt("KismetMathLibrary").decrypt(), skCrypt("GetForwardVector").decrypt(), &SDK::Cached::Functions::KismetMathLibrary::GetForwardVector },
|
||||
FunctionSearch { skCrypt("PlayerState").decrypt(), skCrypt("GetPlayerName").decrypt(), &SDK::Cached::Functions::PlayerState::GetPlayerName },
|
||||
FunctionSearch { skCrypt("SkinnedMeshComponent").decrypt(), skCrypt("GetBoneName").decrypt(), &SDK::Cached::Functions::SkinnedMeshComponent::GetBoneName },
|
||||
FunctionSearch { skCrypt("SceneComponent").decrypt(), skCrypt("GetSocketLocation").decrypt(), &SDK::Cached::Functions::SkinnedMeshComponent::GetSocketLocation },
|
||||
FunctionSearch { skCrypt("Actor").decrypt(), skCrypt("K2_SetActorRotation").decrypt(), &SDK::Cached::Functions::Actor::K2_SetActorRotation },
|
||||
std::vector<FunctionSearch> Functions {
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_DrawLine").decrypt(), &SDK::Cached::Functions::Canvas::K2_DrawLine },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_DrawText").decrypt(), &SDK::Cached::Functions::Canvas::K2_DrawText },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_TextSize").decrypt(), &SDK::Cached::Functions::Canvas::K2_TextSize },
|
||||
FunctionSearch { skCrypt("Canvas").decrypt(), skCrypt("K2_Project").decrypt(), &SDK::Cached::Functions::Canvas::K2_Project },
|
||||
FunctionSearch { skCrypt("GameplayStatics").decrypt(), skCrypt("GetAllActorsOfClass").decrypt(), &SDK::Cached::Functions::GameplayStatics::GetAllActorsOfClass },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetCameraLocation").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetCameraLocation },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetCameraRotation").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetCameraRotation },
|
||||
FunctionSearch { skCrypt("PlayerCameraManager").decrypt(), skCrypt("GetFOVAngle").decrypt(), &SDK::Cached::Functions::PlayerCameraManager::GetFOVAngle },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("IsInputKeyDown").decrypt(), &SDK::Cached::Functions::PlayerController::IsInputKeyDown },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("WasInputKeyJustReleased").decrypt(), &SDK::Cached::Functions::PlayerController::WasInputKeyJustReleased },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("WasInputKeyJustPressed").decrypt(), &SDK::Cached::Functions::PlayerController::WasInputKeyJustPressed },
|
||||
FunctionSearch { skCrypt("PlayerController").decrypt(), skCrypt("GetMousePosition").decrypt(), &SDK::Cached::Functions::PlayerController::GetMousePosition },
|
||||
FunctionSearch { skCrypt("Controller").decrypt(), skCrypt("ClientSetRotation").decrypt(), &SDK::Cached::Functions::PlayerController::ClientSetRotation },
|
||||
FunctionSearch { skCrypt("Controller").decrypt(), skCrypt("SetControlRotation").decrypt(), &SDK::Cached::Functions::PlayerController::SetControlRotation },
|
||||
FunctionSearch { skCrypt("KismetSystemLibrary").decrypt(), skCrypt("LineTraceSingle").decrypt(), &SDK::Cached::Functions::KismetSystemLibrary::LineTraceSingle },
|
||||
FunctionSearch { skCrypt("KismetMathLibrary").decrypt(), skCrypt("FindLookAtRotation").decrypt(), &SDK::Cached::Functions::KismetMathLibrary::FindLookAtRotation },
|
||||
FunctionSearch { skCrypt("KismetMathLibrary").decrypt(), skCrypt("GetForwardVector").decrypt(), &SDK::Cached::Functions::KismetMathLibrary::GetForwardVector },
|
||||
FunctionSearch { skCrypt("PlayerState").decrypt(), skCrypt("GetPlayerName").decrypt(), &SDK::Cached::Functions::PlayerState::GetPlayerName },
|
||||
FunctionSearch { skCrypt("SkinnedMeshComponent").decrypt(), skCrypt("GetBoneName").decrypt(), &SDK::Cached::Functions::SkinnedMeshComponent::GetBoneName },
|
||||
FunctionSearch { skCrypt("SceneComponent").decrypt(), skCrypt("GetSocketLocation").decrypt(), &SDK::Cached::Functions::SkinnedMeshComponent::GetSocketLocation },
|
||||
FunctionSearch { skCrypt("Actor").decrypt(), skCrypt("K2_SetActorRotation").decrypt(), &SDK::Cached::Functions::Actor::K2_SetActorRotation },
|
||||
};
|
||||
|
||||
std::vector<OffsetSearch> Offsets{
|
||||
OffsetSearch { skCrypt("Engine").decrypt(), skCrypt("GameViewport").decrypt(), &SDK::Cached::Offsets::Engine::GameViewport, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("GameViewportClient").decrypt(), skCrypt("World").decrypt(), &SDK::Cached::Offsets::GameViewportClient::World, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("GameViewportClient").decrypt(), skCrypt("GameInstance").decrypt(), &SDK::Cached::Offsets::GameViewportClient::GameInstance, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("GameInstance").decrypt(), skCrypt("LocalPlayers").decrypt(), &SDK::Cached::Offsets::GameInstance::LocalPlayers, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Player").decrypt(), skCrypt("PlayerController").decrypt(), &SDK::Cached::Offsets::Player::PlayerController, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("PlayerController").decrypt(), skCrypt("AcknowledgedPawn").decrypt(), &SDK::Cached::Offsets::PlayerController::AcknowledgedPawn, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("PlayerController").decrypt(), skCrypt("PlayerCameraManager").decrypt(), &SDK::Cached::Offsets::PlayerController::PlayerCameraManager, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("HUD").decrypt(), skCrypt("DebugCanvas").decrypt(), &SDK::Cached::Offsets::HUD::Canvas, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Pawn").decrypt(), skCrypt("PlayerState").decrypt(), &SDK::Cached::Offsets::Pawn::PlayerState, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Character").decrypt(), skCrypt("Mesh").decrypt(), &SDK::Cached::Offsets::Character::Mesh, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Font").decrypt(), skCrypt("LegacyFontSize").decrypt(), &SDK::Cached::Offsets::Font::LegacyFontSize, OffsetType::Class },
|
||||
std::vector<OffsetSearch> Offsets {
|
||||
OffsetSearch { skCrypt("Engine").decrypt(), skCrypt("GameViewport").decrypt(), &SDK::Cached::Offsets::Engine::GameViewport, nullptr },
|
||||
OffsetSearch { skCrypt("GameViewportClient").decrypt(), skCrypt("World").decrypt(), &SDK::Cached::Offsets::GameViewportClient::World, nullptr },
|
||||
OffsetSearch { skCrypt("GameViewportClient").decrypt(), skCrypt("GameInstance").decrypt(), &SDK::Cached::Offsets::GameViewportClient::GameInstance, nullptr },
|
||||
OffsetSearch { skCrypt("GameInstance").decrypt(), skCrypt("LocalPlayers").decrypt(), &SDK::Cached::Offsets::GameInstance::LocalPlayers, nullptr },
|
||||
OffsetSearch { skCrypt("Player").decrypt(), skCrypt("PlayerController").decrypt(), &SDK::Cached::Offsets::Player::PlayerController, nullptr },
|
||||
OffsetSearch { skCrypt("PlayerController").decrypt(), skCrypt("AcknowledgedPawn").decrypt(), &SDK::Cached::Offsets::PlayerController::AcknowledgedPawn, nullptr },
|
||||
OffsetSearch { skCrypt("PlayerController").decrypt(), skCrypt("PlayerCameraManager").decrypt(), &SDK::Cached::Offsets::PlayerController::PlayerCameraManager, nullptr },
|
||||
OffsetSearch { skCrypt("HUD").decrypt(), skCrypt("DebugCanvas").decrypt(), &SDK::Cached::Offsets::HUD::Canvas, nullptr },
|
||||
OffsetSearch { skCrypt("Pawn").decrypt(), skCrypt("PlayerState").decrypt(), &SDK::Cached::Offsets::Pawn::PlayerState, nullptr },
|
||||
OffsetSearch { skCrypt("Character").decrypt(), skCrypt("Mesh").decrypt(), &SDK::Cached::Offsets::Character::Mesh, nullptr },
|
||||
OffsetSearch { skCrypt("Font").decrypt(), skCrypt("LegacyFontSize").decrypt(), &SDK::Cached::Offsets::Font::LegacyFontSize, nullptr },
|
||||
|
||||
OffsetSearch { skCrypt("FortPickup").decrypt(), skCrypt("PrimaryPickupItemEntry").decrypt(), &SDK::Cached::Offsets::FortPickup::PrimaryPickupItemEntry, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortItemDefinition").decrypt(), skCrypt("DisplayName").decrypt(), &SDK::Cached::Offsets::FortItemDefinition::DisplayName, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortItemDefinition").decrypt(), skCrypt("Tier").decrypt(), &SDK::Cached::Offsets::FortItemDefinition::Tier, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Actor").decrypt(), skCrypt("RootComponent").decrypt(), &SDK::Cached::Offsets::Actor::RootComponent, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("SceneComponent").decrypt(), skCrypt("RelativeLocation").decrypt(), &SDK::Cached::Offsets::SceneComponent::RelativeLocation, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Canvas").decrypt(), skCrypt("SizeX").decrypt(), &SDK::Cached::Offsets::Canvas::SizeX, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("Canvas").decrypt(), skCrypt("SizeY").decrypt(), &SDK::Cached::Offsets::Canvas::SizeY, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortPlayerStateAthena").decrypt(), skCrypt("TeamIndex").decrypt(), &SDK::Cached::Offsets::FortPlayerStateAthena::TeamIndex, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortPawn").decrypt(), skCrypt("CurrentWeapon").decrypt(), &SDK::Cached::Offsets::FortPawn::CurrentWeapon, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("BuildingWeakSpot").decrypt(), skCrypt("bHit").decrypt(), &SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortWeapon").decrypt(), skCrypt("WeaponData").decrypt(), &SDK::Cached::Offsets::FortWeapon::WeaponData, OffsetType::Class },
|
||||
OffsetSearch { skCrypt("FortPickup").decrypt(), skCrypt("PrimaryPickupItemEntry").decrypt(), &SDK::Cached::Offsets::FortPickup::PrimaryPickupItemEntry, nullptr },
|
||||
OffsetSearch { skCrypt("FortItemDefinition").decrypt(), skCrypt("DisplayName").decrypt(), &SDK::Cached::Offsets::FortItemDefinition::DisplayName, nullptr },
|
||||
OffsetSearch { skCrypt("FortItemDefinition").decrypt(), skCrypt("Tier").decrypt(), &SDK::Cached::Offsets::FortItemDefinition::Tier, nullptr },
|
||||
OffsetSearch { skCrypt("Actor").decrypt(), skCrypt("RootComponent").decrypt(), &SDK::Cached::Offsets::Actor::RootComponent, nullptr },
|
||||
OffsetSearch { skCrypt("SceneComponent").decrypt(), skCrypt("RelativeLocation").decrypt(), &SDK::Cached::Offsets::SceneComponent::RelativeLocation, nullptr },
|
||||
OffsetSearch { skCrypt("Canvas").decrypt(), skCrypt("SizeX").decrypt(), &SDK::Cached::Offsets::Canvas::SizeX, nullptr },
|
||||
OffsetSearch { skCrypt("Canvas").decrypt(), skCrypt("SizeY").decrypt(), &SDK::Cached::Offsets::Canvas::SizeY, nullptr },
|
||||
OffsetSearch { skCrypt("FortPlayerStateAthena").decrypt(), skCrypt("TeamIndex").decrypt(), &SDK::Cached::Offsets::FortPlayerStateAthena::TeamIndex, nullptr },
|
||||
OffsetSearch { skCrypt("FortPawn").decrypt(), skCrypt("CurrentWeapon").decrypt(), &SDK::Cached::Offsets::FortPawn::CurrentWeapon, nullptr },
|
||||
OffsetSearch { skCrypt("FortPawn").decrypt(), skCrypt("bIsDying").decrypt(), &SDK::Cached::Offsets::FortPawn::bIsDying, &SDK::Cached::Masks::FortPawn::bIsDying },
|
||||
OffsetSearch { skCrypt("BuildingWeakSpot").decrypt(), skCrypt("bHit").decrypt(), &SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField, nullptr },
|
||||
OffsetSearch { skCrypt("FortWeapon").decrypt(), skCrypt("WeaponData").decrypt(), &SDK::Cached::Offsets::FortWeapon::WeaponData, nullptr },
|
||||
|
||||
OffsetSearch { skCrypt("FortItemEntry").decrypt(), skCrypt("ItemDefinition").decrypt(), &SDK::Cached::Offsets::FortItemEntry::ItemDefinition, OffsetType::Struct },
|
||||
OffsetSearch { skCrypt("MinimalViewInfo").decrypt(), skCrypt("Location").decrypt(), &SDK::Cached::Offsets::MinimalViewInfo::Location, OffsetType::Struct },
|
||||
OffsetSearch { skCrypt("MinimalViewInfo").decrypt(), skCrypt("Rotation").decrypt(), &SDK::Cached::Offsets::MinimalViewInfo::Rotation, OffsetType::Struct },
|
||||
OffsetSearch { skCrypt("FortItemEntry").decrypt(), skCrypt("ItemDefinition").decrypt(), &SDK::Cached::Offsets::FortItemEntry::ItemDefinition, nullptr },
|
||||
OffsetSearch { skCrypt("MinimalViewInfo").decrypt(), skCrypt("Location").decrypt(), &SDK::Cached::Offsets::MinimalViewInfo::Location, nullptr },
|
||||
OffsetSearch { skCrypt("MinimalViewInfo").decrypt(), skCrypt("Rotation").decrypt(), &SDK::Cached::Offsets::MinimalViewInfo::Rotation, nullptr },
|
||||
};
|
||||
|
||||
SDK::UObject::SetupObjects(Functions, Offsets);
|
||||
}
|
||||
|
||||
// Init PostRender VFT index after due to it relying on one of the offsets found in the previous step
|
||||
SDKInitializer::InitPRIndex();
|
||||
|
||||
Input::Init();
|
||||
Features::FortPawnHelper::Bone::Init();
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ namespace SDK {
|
||||
}
|
||||
|
||||
namespace FortPawn {
|
||||
inline uintptr_t bIsDying;
|
||||
inline uintptr_t CurrentWeapon;
|
||||
}
|
||||
|
||||
@@ -38,7 +39,7 @@ namespace SDK {
|
||||
|
||||
namespace GameViewportClient {
|
||||
inline uintptr_t World;
|
||||
inline uintptr_t GameInstance;
|
||||
inline uintptr_t GameInstance; // DO NOT DELETE! Required for getting PostRender VFT index
|
||||
}
|
||||
|
||||
namespace GameInstance {
|
||||
@@ -155,6 +156,12 @@ namespace SDK {
|
||||
inline uintptr_t FNameConstructor = 0x0;
|
||||
inline uintptr_t LineTraceSingle = 0x0;
|
||||
}
|
||||
|
||||
namespace Masks {
|
||||
namespace FortPawn{
|
||||
inline uintptr_t bIsDying;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool IsValidPointer(uintptr_t Address);
|
||||
|
||||
@@ -107,7 +107,7 @@ void SDKInitializer::InitPRIndex() {
|
||||
if (!Obj)
|
||||
continue;
|
||||
|
||||
if (Obj->IsA(SDK::UGameViewportClient::StaticClass()) && !Obj->IsDefaultObject())
|
||||
if (Obj->IsA(SDK::UGameViewportClient::StaticClass()) && Obj->IsDefaultObject() == false)
|
||||
{
|
||||
Vft = static_cast<SDK::UEngine*>(Obj)->Vft;
|
||||
break;
|
||||
@@ -118,6 +118,8 @@ void SDKInitializer::InitPRIndex() {
|
||||
THROW_ERROR(skCrypt("Failed to find VFT for UGameViewportClient!").decrypt(), false);
|
||||
}
|
||||
|
||||
int bSuppressTransitionMessage = (int)SDK::Cached::Offsets::GameViewportClient::GameInstance + sizeof(void*);
|
||||
|
||||
auto Resolve32BitRelativeJump = [](void* FunctionPtr) -> uint8_t*
|
||||
{
|
||||
uint8_t* Address = reinterpret_cast<uint8_t*>(FunctionPtr);
|
||||
@@ -137,9 +139,8 @@ void SDKInitializer::InitPRIndex() {
|
||||
if (!Vft[i] || !Memory::IsInProcessRange(reinterpret_cast<uintptr_t>(Vft[i])))
|
||||
continue;
|
||||
|
||||
if (Memory::FindPatternInRange({ 0x80, 0xB9, 0x88, 0x00, 0x00, 0x00, 0x00 }, Resolve32BitRelativeJump(Vft[i]), 0x30))
|
||||
if (Memory::FindPatternInRange({ 0x80, 0xB9, bSuppressTransitionMessage, 0x00, 0x00, 0x00, 0x00 }, Resolve32BitRelativeJump(Vft[i]), 0x30))
|
||||
{
|
||||
// PostRender is always 1 index before DrawTransition
|
||||
SDK::Cached::VFT::PostRender = i;
|
||||
DEBUG_LOG(skCrypt("PostRender VFT index found: ").decrypt() + std::to_string(SDK::Cached::VFT::PostRender));
|
||||
|
||||
@@ -147,7 +148,7 @@ void SDKInitializer::InitPRIndex() {
|
||||
}
|
||||
}
|
||||
|
||||
if (!SDK::Cached::VFT::PostRender) {
|
||||
if (SDK::Cached::VFT::PostRender == 0x0) {
|
||||
THROW_ERROR(skCrypt("Failed to find PostRender VFT index!").decrypt(), CRASH_ON_ERROR);
|
||||
}
|
||||
}
|
||||
@@ -173,8 +174,8 @@ void SDKInitializer::InitPEIndex() {
|
||||
if (!Vft[i] || !Memory::IsInProcessRange(reinterpret_cast<uintptr_t>(Vft[i])))
|
||||
break;
|
||||
|
||||
if (Memory::FindPatternInRange({ 0xF7, -0x1, SDK::UFunction::FunctionFlags, 0x0, 0x0, 0x0, 0x0, 0x04, 0x0, 0x0 }, Resolve32BitRelativeJump(Vft[i]), 0x400)
|
||||
&& Memory::FindPatternInRange({ 0xF7, -0x1, SDK::UFunction::FunctionFlags, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0 }, Resolve32BitRelativeJump(Vft[i]), 0x400))
|
||||
if (Memory::FindPatternInRange({ 0xF7, -0x1, (int32_t)SDK::UFunction::FunctionFlagsOffset, 0x0, 0x0, 0x0, 0x0, 0x04, 0x0, 0x0 }, Resolve32BitRelativeJump(Vft[i]), 0x400)
|
||||
&& Memory::FindPatternInRange({ 0xF7, -0x1, (int32_t)SDK::UFunction::FunctionFlagsOffset, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0 }, Resolve32BitRelativeJump(Vft[i]), 0x400))
|
||||
{
|
||||
SDK::Cached::VFT::ProcessEvent = i;
|
||||
DEBUG_LOG(skCrypt("ProcessEvent VFT index found: ").decrypt() + std::to_string(SDK::Cached::VFT::ProcessEvent));
|
||||
|
||||
@@ -81,34 +81,35 @@ private:
|
||||
*/
|
||||
static void WalkVFT(const char* TargetFunctionName, void** VFT, void* TargetFunction, uintptr_t& VFTIndex, int SearchRange);
|
||||
public:
|
||||
/* @brief Update the GObject offset (for finding UObjects) */
|
||||
/* Update the GObject offset (for finding UObjects) */
|
||||
static void InitGObjects();
|
||||
|
||||
/* @brief Update the AppendString function offset (for converting FNames to strings) */
|
||||
/* Update the AppendString function offset (for converting FNames to strings) */
|
||||
static void InitAppendString();
|
||||
|
||||
/* @brief Update the FNameConstructor function offset (for creating FNames) */
|
||||
/* Update the FNameConstructor function offset (for creating FNames) */
|
||||
static void InitFNameConstructor();
|
||||
|
||||
/* @brief Update the LineTraceSingle function offset (for visible check) */
|
||||
/* Update the LineTraceSingle function offset (for visible check) */
|
||||
static void InitLineTraceSingle();
|
||||
|
||||
|
||||
/* @brief Update the PostRender VFT index (for engine rendering) */
|
||||
/* Update the PostRender VFT index (for engine rendering) */
|
||||
static void InitPRIndex();
|
||||
|
||||
/* @brief Update the PostRender VFT index (for calling UFunctions) */
|
||||
/* Update the PostRender VFT index (for calling UFunctions) */
|
||||
static void InitPEIndex();
|
||||
|
||||
/* @brief Update the GetPlayerViewpoint VFT index (for SilentAim) */
|
||||
/* Update the GetPlayerViewpoint VFT index (for SilentAim) */
|
||||
static void InitGPVIndex();
|
||||
|
||||
/* @brief Update the GetViewpoint VFT index (for SilentAim) */
|
||||
/* Update the GetViewpoint VFT index (for SilentAim) */
|
||||
static void InitGVIndex();
|
||||
|
||||
|
||||
|
||||
// CREDITS TO: Dumper-7
|
||||
static int32_t FindCastFlagsOffset() {
|
||||
static uint32 FindCastFlagsOffset() {
|
||||
std::vector<std::pair<void*, SDK::EClassCastFlags>> infos = {
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Actor").decrypt()), SDK::EClassCastFlags::Actor},
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Class").decrypt()), SDK::EClassCastFlags::Field | SDK::EClassCastFlags::Struct | SDK::EClassCastFlags::Class }
|
||||
@@ -116,7 +117,7 @@ public:
|
||||
return Memory::FindOffset(infos);
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static int32_t FindDefaultObjectOffset() {
|
||||
static uint32 FindDefaultObjectOffset() {
|
||||
std::vector<std::pair<void*, void*>> infos = {
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Object").decrypt()), SDK::UObject::FindObjectFast(skCrypt("Default__Object").decrypt()) },
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Field").decrypt()), SDK::UObject::FindObjectFast(skCrypt("Default__Field").decrypt()) }
|
||||
@@ -124,7 +125,7 @@ public:
|
||||
return Memory::FindOffset(infos);
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static int32_t FindSuperOffset() {
|
||||
static uint32 FindSuperOffset() {
|
||||
std::vector<std::pair<void*, void*>> infos = {
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Struct").decrypt()), SDK::UObject::FindObjectFast(skCrypt("Field").decrypt()) },
|
||||
{ SDK::UObject::FindObjectFast(skCrypt("Class").decrypt()), SDK::UObject::FindObjectFast(skCrypt("Struct").decrypt()) }
|
||||
@@ -138,14 +139,14 @@ public:
|
||||
return Memory::FindOffset(infos);
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static int32_t FindChildPropertiesOffset() {
|
||||
static uint32 FindChildPropertiesOffset() {
|
||||
uint8* ObjA = (uint8*)SDK::UObject::FindObjectFast("Color");
|
||||
uint8* ObjB = (uint8*)SDK::UObject::FindObjectFast("Guid");
|
||||
|
||||
return Memory::GetValidPointerOffset(ObjA, ObjB, SDK::UStruct::SuperOffset + 0x10, 0x80);
|
||||
return Memory::GetValidPointerOffset(ObjA, ObjB, SDK::UStruct::SuperOffset + (sizeof(void*) * 2), 0x80);
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static int32_t FindFunctionFlagsOffset() {
|
||||
static uint32 FindFunctionFlagsOffset() {
|
||||
std::vector<std::pair<void*, SDK::EFunctionFlags>> Infos;
|
||||
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast("WasInputKeyJustPressed"), SDK::EFunctionFlags::Final | SDK::EFunctionFlags::Native | SDK::EFunctionFlags::Public | SDK::EFunctionFlags::BlueprintCallable | SDK::EFunctionFlags::BlueprintPure | SDK::EFunctionFlags::Const });
|
||||
@@ -162,4 +163,34 @@ public:
|
||||
|
||||
return Memory::FindOffset(Infos);
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static uint32 FindChildrenOffset() {
|
||||
std::vector<std::pair<void*, void*>> Infos;
|
||||
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("PlayerController").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("WasInputKeyJustReleased").decrypt(), skCrypt("PlayerController").decrypt())});
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("Controller").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("UnPossess").decrypt(), skCrypt("Controller").decrypt()) });
|
||||
|
||||
uint32 Ret = Memory::FindOffset(Infos);
|
||||
|
||||
if (Ret == 0x28)
|
||||
{
|
||||
Infos.clear();
|
||||
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("Vector").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("X").decrypt(), skCrypt("Vector").decrypt()) });
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("Vector4").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("X").decrypt(), skCrypt("Vector4").decrypt()) });
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("Vector2D").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("X").decrypt(), skCrypt("Vector2D").decrypt()) });
|
||||
Infos.push_back({ SDK::UObject::FindObjectFast(skCrypt("Guid").decrypt()), SDK::UObject::FindObjectFastInOuter(skCrypt("A").decrypt(), skCrypt("Guid").decrypt()) });
|
||||
|
||||
return Memory::FindOffset(Infos);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
}
|
||||
// CREDITS TO: Dumper-7
|
||||
static uint32 FindUFieldNextOffset() {
|
||||
uint8_t* KismetSystemLibraryChild = reinterpret_cast<uint8_t*>(SDK::UObject::FindObjectFast<SDK::UStruct>(skCrypt("KismetSystemLibrary").decrypt())->Children());
|
||||
uint8_t* KismetStringLibraryChild = reinterpret_cast<uint8_t*>(SDK::UObject::FindObjectFast<SDK::UStruct>(skCrypt("KismetStringLibrary").decrypt())->Children());
|
||||
|
||||
return Memory::GetValidPointerOffset(KismetSystemLibraryChild, KismetStringLibraryChild, 0x20 + 0x08, 0x48);
|
||||
}
|
||||
};
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "../../Utilities/Math.h"
|
||||
#include "../../Configs/Config.h"
|
||||
#include "../../Utilities/Logger.h"
|
||||
|
||||
void Hooks::PostRender::PostRender(uintptr_t this_, uintptr_t Canvas) {
|
||||
if (!Canvas) {
|
||||
@@ -17,7 +18,7 @@ void Hooks::PostRender::PostRender(uintptr_t this_, uintptr_t Canvas) {
|
||||
Game::ScreenWidth = reinterpret_cast<SDK::UCanvas*>(Canvas)->SizeX();
|
||||
Game::ScreenHeight = reinterpret_cast<SDK::UCanvas*>(Canvas)->SizeY();
|
||||
|
||||
// Clamp the FOV to targetting FOV issues on extreme FOV's. This does make it innacurate on FOV's above 120, but when is that gonna happen?
|
||||
// Clamp the FOV to fix target issues on extreme FOV's. This does make it innacurate on FOV's above 120, but this doesn't really matter
|
||||
Game::PixelsPerDegree = Game::ScreenWidth / Math::RadiansToDegrees((2 * tan(0.5f * Math::DegreesToRadians(Math::Clamp(Actors::MainCamera.FOV, 0, 120)))));
|
||||
|
||||
Hooks::Tick();
|
||||
|
||||
@@ -139,10 +139,6 @@ namespace Math {
|
||||
return radians * (180.0f / M_PI);
|
||||
}
|
||||
|
||||
inline float Abs(float Value) {
|
||||
return (Value < 0.0f) ? -Value : Value;
|
||||
}
|
||||
|
||||
inline float GetDegreeDistance(SDK::FRotator Rotator1, SDK::FRotator Rotator2) {
|
||||
SDK::FVector ForwardVector1 = SDK::UKismetMathLibrary::StaticClass()->GetForwardVector(Rotator1);
|
||||
SDK::FVector ForwardVector2 = SDK::UKismetMathLibrary::StaticClass()->GetForwardVector(Rotator2);
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user