lots of general improveents. idk exxactly what. going to work alot on the engine gui next push.

This commit is contained in:
raax7
2024-03-04 02:50:47 +00:00
parent 278932a97c
commit cd823f735d
17 changed files with 818 additions and 1133 deletions
+1 -1
View File
@@ -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 {
+2 -2
View File
@@ -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:
+2 -2
View File
@@ -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);
+22 -10
View File
@@ -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
+47 -187
View File
@@ -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);
}
+57 -51
View File
@@ -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();
+8 -1
View File
@@ -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));
+45 -14
View File
@@ -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();
-4
View File
@@ -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.