Bullet TP V2

- Added Bullet TP V2
- Added RaycastMulti function offset grabbing
- Added RaycastMulti hook
- Changed RaycastMulti and CalculateShot hook to only hook when required (less detection vectors)
- Added box ESP types (Full and Cornered 2D only right now)
- Moved math function bodies to new Math.cpp

Bug-Fixes:
- Fixed text issues in ImGui drawing
- Fixed crash issues on release mode
- Fixed crash issues on ImGui
- Fixed GetPlayerViewpoint VFT index grabbing on S19

Minor Changes:
- Made custom function to get weapon color from UFortItemDefinition
This commit is contained in:
raax7
2024-03-25 21:24:57 +00:00
parent 0c00976d5e
commit 999e367c20
38 changed files with 1175 additions and 525 deletions
+12 -1
View File
@@ -17,6 +17,7 @@ namespace Config {
inline KeyName AimKey = (KeyName)7;
inline bool BulletTP = false;
inline bool BulletTPV2 = false;
inline bool SilentAim = false;
inline bool UseAimKeyForSilent = false;
@@ -84,11 +85,16 @@ namespace Config {
inline int FOV = 20;
}
inline ConfigTypes::BoxType BoxType = ConfigTypes::BoxType::Cornered2D;
inline bool Box = true;
inline bool Skeleton = true;
inline bool IndividualBoneVisibilities = true;
inline bool Name = true;
inline bool Distance = true;
inline bool Weapon = true;
inline bool CurrentWeapon = true;
}
namespace Weapons {
@@ -107,6 +113,11 @@ namespace Config {
namespace Player {
inline bool EditEnemyBuilds = false;
inline bool ADSWhileNotOnGround = false;
inline bool DoublePump = false;
inline bool AllowRedeploy = false;
inline bool InfiniteBuilds = false;
inline bool InfiniteAmmo = false;
}
+7
View File
@@ -6,4 +6,11 @@ namespace ConfigTypes {
Crosshair,
Distance,
};
enum class BoxType {
Full3D,
Cornered3D,
Full2D,
Cornered2D,
};
}
+72 -29
View File
@@ -36,14 +36,6 @@ void Drawing::BatchLineCache::Draw() {
void Drawing::TextCache::Draw() {
ImVec2 TextPosition = ImVec2(ScreenPosition.X, ScreenPosition.Y);
if (CentredX || CentredY) {
ImVec2 TextSize = ImGui::GetFont()->CalcTextSizeA(FontSize, FLT_MAX, 0.0f, RenderText.c_str());
ImVec2 CentredPos = ImVec2(ScreenPosition.X - TextSize.x / 2, ScreenPosition.Y - TextSize.y / 2);
if (CentredX) TextPosition.x = CentredPos.x;
if (CentredY) TextPosition.y = CentredPos.y;
}
if (Outlined) {
ImU32 OutlineColor = ImColor(0.f, 0.f, 0.f, RenderColor.A);
@@ -55,8 +47,8 @@ void Drawing::TextCache::Draw() {
};
for (ImVec2& Offset : Offsets) {
ImVec2 outlinePos = ImVec2(TextPosition.x + Offset.x, TextPosition.y + Offset.y);
ImGui::GetBackgroundDrawList()->AddText(Hooks::Present::LargeFont, FontSize, outlinePos, OutlineColor, RenderText.c_str());
ImVec2 OutlinePos = ImVec2(TextPosition.x + Offset.x, TextPosition.y + Offset.y);
ImGui::GetBackgroundDrawList()->AddText(Hooks::Present::LargeFont, FontSize, OutlinePos, OutlineColor, RenderText.c_str());
}
}
@@ -73,9 +65,21 @@ void Drawing::CircleCache::Draw() {
ImGui::GetBackgroundDrawList()->AddCircle(ImVec2(ScreenPosition.X, ScreenPosition.Y), Radius, ImColor(RenderColor.R, RenderColor.G, RenderColor.B, RenderColor.A), Segments);
}
void Drawing::FilledRectCache::Draw() {
if (Outlined) {
ImU32 OutlineColor = ImColor(0.f, 0.f, 0.f, RenderColor.A);
ImGui::GetBackgroundDrawList()->AddRectFilled(ImVec2(ScreenPosition.X, ScreenPosition.Y), ImVec2(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), OutlineColor);
}
ImGui::GetBackgroundDrawList()->AddRectFilled(ImVec2(ScreenPosition.X, ScreenPosition.Y), ImVec2(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), ImColor(RenderColor.R, RenderColor.G, RenderColor.B, RenderColor.A));
}
void Drawing::RectCache::Draw() {
if (Outlined) {
ImU32 OutlineColor = ImColor(0.f, 0.f, 0.f, RenderColor.A);
ImGui::GetBackgroundDrawList()->AddRect(ImVec2(ScreenPosition.X, ScreenPosition.Y), ImVec2(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), OutlineColor, 0, 0, Thickness + 1.f);
}
ImGui::GetBackgroundDrawList()->AddRect(ImVec2(ScreenPosition.X, ScreenPosition.Y), ImVec2(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), ImColor(RenderColor.R, RenderColor.G, RenderColor.B, RenderColor.A), 0, 0, Thickness);
}
void Drawing::TriangleCache::Draw() {
@@ -100,17 +104,40 @@ void Drawing::TriangleCache::Draw() {
}
void Drawing::RenderDrawingData() {
std::lock_guard<std::mutex> Lock(DrawingMutex);
for (auto& RenderObject : RenderBuffer) {
RenderObject->Draw();
}
}
void Drawing::Line(SDK::FVector2D ScreenPositionA, SDK::FVector2D ScreenPositionB, float Thickness, SDK::FLinearColor RenderColor, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
auto Cache = std::make_unique<LineCache>(ScreenPositionA, ScreenPositionB, Thickness, RenderColor, Outlined);
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::Text(const char* RenderText, SDK::FVector2D ScreenPosition, float FontSize, SDK::FLinearColor RenderColor, bool CentredX, bool CentredY, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
if (Hooks::Present::LargeFont == nullptr) {
return;
}
auto Cache = std::make_unique<TextCache>(RenderText, ScreenPosition, FontSize, RenderColor, CentredX, CentredY, Outlined);
// Handle centred text here so it doesn't go crazy
if (CentredX || CentredY) {
ImVec2 TextSize = Hooks::Present::LargeFont->CalcTextSizeA(FontSize, FLT_MAX, FLT_MAX, RenderText);
ImVec2 CentredPos = ImVec2(ScreenPosition.X - TextSize.x / 2.f, ScreenPosition.Y - TextSize.y / 2.f);
if (CentredX) {
Cache->ScreenPosition.X = CentredPos.x;
}
if (CentredY) {
Cache->ScreenPosition.Y = CentredPos.y;
}
}
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::Text(const wchar_t* RenderText, SDK::FVector2D ScreenPosition, float FontSize, SDK::FLinearColor RenderColor, bool CentredX, bool CentredY, bool Outlined) {
@@ -135,39 +162,51 @@ SDK::FVector2D Drawing::TextSize(const wchar_t* RenderText, float FontSize) {
return SDK::FVector2D(TextSize.x, TextSize.y);
}
void Drawing::Circle(SDK::FVector2D ScreenPosition, float Radius, int32_t Segments, SDK::FLinearColor RenderColor, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
auto Cache = std::make_unique<CircleCache>(ScreenPosition, Radius, Segments, RenderColor, Outlined);
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::FilledRect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenSize, SDK::FLinearColor RenderColor, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
auto Cache = std::make_unique<FilledRectCache>(ScreenPosition, ScreenSize, RenderColor, Outlined);
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::Rect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenSize, float Thickness, SDK::FLinearColor RenderColor, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
auto Cache = std::make_unique<RectCache>(ScreenPosition, ScreenSize, Thickness, RenderColor, Outlined);
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::CorneredRect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenSize, float Thickness, SDK::FLinearColor RenderColor, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
float LineW = ScreenSize.X / 4;
float LineH = ScreenSize.Y / 4;
float Overlap = max(Thickness, 1.0f);
float Correction = Thickness;
Correction -= 2.f;
Correction *= -1;
auto Cache = std::make_unique<BatchLineCache>();
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + LineW - Thickness / 2 + Overlap, ScreenPosition.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + LineH - Thickness / 2 + Overlap), Thickness, RenderColor, Outlined));
// Top-left corner horizontal and vertical
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + Correction, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + LineW, ScreenPosition.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + Correction), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + LineH), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - LineW + Thickness / 2 - Overlap, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + LineH - Thickness / 2 + Overlap), Thickness, RenderColor, Outlined));
// Top-right corner horizontal and vertical
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - LineW, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X - Correction, ScreenPosition.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + Correction), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + LineH), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y - LineH + Thickness / 2 - Overlap), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + LineW - Thickness / 2 + Overlap, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
// Bottom-left corner horizontal and vertical
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + Correction, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + LineW, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y - LineH), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y - Correction), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - LineW + Thickness / 2 - Overlap, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y - LineH + Thickness / 2 - Overlap), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
// Bottom-right corner horizontal and vertical
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - LineW, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X - Correction, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined));
Cache->Lines.push_back(Drawing::LineCache(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y - LineH), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y - Correction), Thickness, RenderColor, Outlined));
DrawingQueue.push_back(std::move(Cache));
}
void Drawing::Triangle(SDK::FVector2D ScreenPositionA, SDK::FVector2D ScreenPositionB, SDK::FVector2D ScreenPositionC, float Thickness, SDK::FLinearColor RenderColor, bool Filled, bool Outlined) {
std::lock_guard<std::mutex> Lock(DrawingMutex);
auto Cache = std::make_unique<TriangleCache>(ScreenPositionA, ScreenPositionB, ScreenPositionC, Thickness, RenderColor, Filled, Outlined);
DrawingQueue.push_back(std::move(Cache));
}
@@ -247,8 +286,8 @@ void Drawing::FilledRect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenSiz
}
void Drawing::Rect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenSize, float Thickness, SDK::FLinearColor RenderColor, bool Outlined) {
if (Outlined) {
SDK::GetLocalCanvas()->K2_DrawBox(ScreenPositionA, ScreenSize, Thickness + 1.f, SDK::FLinearColor(0.f, 0.f, 0.f, 1.f));
SDK::GetLocalCanvas()->K2_DrawBox(ScreenPositionA, ScreenSize, Thickness - 1.f, SDK::FLinearColor(0.f, 0.f, 0.f, 1.f));
SDK::GetLocalCanvas()->K2_DrawBox(ScreenPosition, ScreenSize, Thickness + 1.f, SDK::FLinearColor(0.f, 0.f, 0.f, 1.f));
SDK::GetLocalCanvas()->K2_DrawBox(ScreenPosition, ScreenSize, Thickness - 1.f, SDK::FLinearColor(0.f, 0.f, 0.f, 1.f));
}
SDK::GetLocalCanvas()->K2_DrawBox(ScreenPosition, ScreenSize, Thickness, RenderColor);
@@ -257,14 +296,18 @@ void Drawing::CorneredRect(SDK::FVector2D ScreenPosition, SDK::FVector2D ScreenS
float lineW = ScreenSize.X / 4;
float lineH = ScreenSize.Y / 4;
Line(SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y), SDK::FVector2D(ScreenPositionA.X + lineW, ScreenPositionA.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y), SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y + lineH), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y), SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y + lineH), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X + ScreenSize.X - lineW, ScreenPositionA.Y), SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + lineW, ScreenPosition.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + lineH), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + lineH), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - lineW, ScreenPosition.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y + ScreenSize.Y), SDK::FVector2D(ScreenPositionA.X + lineW, ScreenPositionA.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y + ScreenSize.Y - lineH), SDK::FVector2D(ScreenPositionA.X, ScreenPositionA.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y + ScreenSize.Y - lineH), SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPositionA.X + ScreenSize.X - lineW, ScreenPositionA.Y + ScreenSize.Y), SDK::FVector2D(ScreenPositionA.X + ScreenSize.X, ScreenPositionA.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + lineW, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y - lineH), SDK::FVector2D(ScreenPosition.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y - lineH), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
Line(SDK::FVector2D(ScreenPosition.X + ScreenSize.X - lineW, ScreenPosition.Y + ScreenSize.Y), SDK::FVector2D(ScreenPosition.X + ScreenSize.X, ScreenPosition.Y + ScreenSize.Y), Thickness, RenderColor, Outlined);
}
void Drawing::Triangle(SDK::FVector2D ScreenPositionA, SDK::FVector2D ScreenPositionB, SDK::FVector2D ScreenPositionC, float Thickness, SDK::FLinearColor RenderColor, bool Filled, bool Outlined) {
}
#endif // _ENGINE
+6 -2
View File
@@ -2,6 +2,7 @@
#ifdef _IMGUI
#include <vector>
#include <memory>
#include <mutex>
#endif
#include "../Game/SDK/Classes/Basic.h"
@@ -114,11 +115,14 @@ namespace Drawing {
inline std::mutex DrawingMutex;
inline std::vector<std::unique_ptr<IDrawingCache>> RenderBuffer, DrawingQueue;
#endif
#ifdef _IMGUI
inline void SwapBuffers() {
std::lock_guard<std::mutex> Lock(DrawingMutex);
std::swap(RenderBuffer, DrawingQueue);
DrawingQueue.clear();
+2
View File
@@ -39,6 +39,8 @@
// - Add WndProc as an option for Engine rendering
// - Add proper outline for ImGui drawing
// - Add batch-line support for ImGui and Engine line drawing (Drawing::BeginBatch, Drawing::EndBatch)
// - Add RaycastMulti offset finding for UE5
// - Add build through walls using RaycastMulti hook
#if UNLOAD_THREAD
const Input::KeyName UnloadKey = Input::KeyName::F5;
@@ -360,6 +360,8 @@
</ClCompile>
<ClCompile Include="Game\Features\Exploits\Vehicle.cpp" />
<ClCompile Include="Game\Features\Exploits\Weapon.cpp" />
<ClCompile Include="Hooks\Callbacks\RaycastMulti.cpp" />
<ClCompile Include="Utilities\Math.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Configs\Config.h" />
@@ -128,6 +128,12 @@
<ClCompile Include="Hooks\Callbacks\CalculateShot.cpp">
<Filter>Hooks\Callbacks</Filter>
</ClCompile>
<ClCompile Include="Utilities\Math.cpp">
<Filter>Utilities</Filter>
</ClCompile>
<ClCompile Include="Hooks\Callbacks\RaycastMulti.cpp">
<Filter>Hooks\Callbacks</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="Game">
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ShowAllFiles>false</ShowAllFiles>
<ShowAllFiles>true</ShowAllFiles>
</PropertyGroup>
</Project>
+129 -24
View File
@@ -14,6 +14,10 @@
#include "../../Features/Exploits/Weapon.h"
#include "../../../Utilities/Math.h"
#include "../../../Utilities/Logger.h"
#include "../../Input/Input.h"
int num = 0;
void Actors::FortPawn::Tick() {
bool SeenTarget = false;
@@ -26,11 +30,57 @@ void Actors::FortPawn::Tick() {
for (auto it = CachedPlayersLocal.begin(); it != CachedPlayersLocal.end(); ++it) {
Actors::Caches::FortPawnCache& CurrentPlayer = *it;
SDK::AActor* Actor = CurrentPlayer.FortPawn; if (SDK::IsValidPointer(Actor) == false) continue;
SDK::AFortPawn* FortPawn = reinterpret_cast<SDK::AFortPawn*>(Actor); if (SDK::IsValidPointer(FortPawn) == false) continue;
SDK::AFortPlayerState* FortPlayerState = FortPawn->PlayerState(); //if (SDK::IsValidPointer(FortPlayerState) == false) continue;
SDK::ACharacter* Character = static_cast<SDK::ACharacter*>((SDK::APawn*)FortPawn); if (SDK::IsValidPointer(Character) == false) continue;
CurrentPlayer.Mesh = Character->Mesh(); if (SDK::IsValidPointer(CurrentPlayer.Mesh) == false) continue;
SDK::AActor* Actor = CurrentPlayer.FortPawn; if (SDK::IsValidPointer(Actor) == false) continue;
SDK::AFortPawn* FortPawn = reinterpret_cast<SDK::AFortPawn*>(Actor); if (SDK::IsValidPointer(FortPawn) == false) continue;
SDK::AFortPlayerState* FortPlayerState = reinterpret_cast<SDK::AFortPlayerState*>(FortPawn->PlayerState()); //if (SDK::IsValidPointer(FortPlayerState) == false) continue;
SDK::ACharacter* Character = reinterpret_cast<SDK::ACharacter*>(FortPawn); if (SDK::IsValidPointer(Character) == false) continue;
CurrentPlayer.Mesh = Character->Mesh(); if (SDK::IsValidPointer(CurrentPlayer.Mesh) == false) continue;
int loop = 0;
bool found = false;
#if 0
for (int i = 0; i < SDK::UObject::ObjectArray.Num(); i++) {
SDK::UObject* Object = SDK::UObject::ObjectArray.GetByIndex(i);
if (Object == nullptr) continue;
if (Object->IsDefaultObject() == false && Object->IsA(SDK::UMaterialInterface::StaticClass())) {
found = true;
loop++;
if (loop < num) {
num++;
continue;
}
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Material: ")) + Object->GetFullName());
num++;
SDK::UMaterialInstanceDynamic* MaterialInstanceDynamic = SDK::UKismetMaterialLibrary::StaticClass()->SDK::UKismetMaterialLibrary::CreateDynamicMaterialInstance(SDK::GetWorld(), reinterpret_cast<SDK::UMaterialInterface*>(Object), SDK::FName());
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Material Made! - ")) + std::to_string((uintptr_t)MaterialInstanceDynamic));
if (MaterialInstanceDynamic) {
//DEBUG_LOG(LOG_INFO, std::string(skCrypt("Material: ")) + Object->GetFullName());
//test->SetScalarParameterValue(skCrypt("GlowAmount").decrypt(), 1.f);
SDK::TArray<SDK::UMaterialInterface*> Materials = CurrentPlayer.Mesh->GetMaterials();
for (int i2 = 0; i2 < Materials.Num(); i2++) {
DEBUG_LOG(LOG_INFO, "Num Mats: " + std::to_string(Materials.Num()));
CurrentPlayer.Mesh->SetMaterial(i2, MaterialInstanceDynamic);
}
break;
}
}
}
#endif
if (found == false) {
num = 0;
}
// LocalPawn caching and exploit ticks
if (FortPawn == SDK::GetLocalPawn()) {
@@ -40,20 +90,36 @@ void Actors::FortPawn::Tick() {
Features::Exploits::Vehicle::Tick();
Features::Exploits::Weapon::Tick(FortPawn->CurrentWeapon());
if (SDK::GetLocalController()) {
if (Config::Exploits::Player::InfiniteBuilds) {
reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->SetbBuildFree(true, &Config::Exploits::Player::InfiniteBuilds);
{
if (SDK::GetLocalController()) {
if (Config::Exploits::Player::InfiniteBuilds) {
reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->SetbBuildFree(true, &Config::Exploits::Player::InfiniteBuilds);
}
if (Config::Exploits::Player::InfiniteAmmo) {
reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->SetbInfiniteAmmo(true, &Config::Exploits::Player::InfiniteAmmo);
}
}
if (Config::Exploits::Player::InfiniteAmmo) {
reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->SetbInfiniteAmmo(true, &Config::Exploits::Player::InfiniteAmmo);
if (Config::Exploits::Player::ADSWhileNotOnGround) {
reinterpret_cast<SDK::AFortPlayerPawnAthena*>(FortPawn)->SetbADSWhileNotOnGround(true, &Config::Exploits::Player::ADSWhileNotOnGround);
}
}
if (Config::Exploits::Player::EditEnemyBuilds) {
SDK::ABuildingActor* TargetedBuilding = reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->TargetedBuilding();
if (TargetedBuilding) {
TargetedBuilding->SetTeamIndex(LocalPawnCache.TeamIndex, & Config::Exploits::Player::EditEnemyBuilds);
if (Config::Exploits::Player::DoublePump) {
FortPawn->CurrentWeapon()->SetbIgnoreTryToFireSlotCooldownRestriction(true, &Config::Exploits::Player::DoublePump);
}
if (Config::Exploits::Player::AllowRedeploy) {
if (SDK::GetWorld()->GameState()->IsA(SDK::AFortGameStateAthena::StaticClass())) {
reinterpret_cast<SDK::AFortGameStateAthena*>(SDK::GetWorld()->GameState())->SetDefaultGliderRedeployCanRedeploy(true, &Config::Exploits::Player::AllowRedeploy);
}
}
if (Config::Exploits::Player::EditEnemyBuilds) {
SDK::ABuildingActor* TargetedBuilding = reinterpret_cast<SDK::AFortPlayerController*>(SDK::GetLocalController())->TargetedBuilding();
if (TargetedBuilding) {
TargetedBuilding->SetTeamIndex(LocalPawnCache.TeamIndex, &Config::Exploits::Player::EditEnemyBuilds);
}
}
}
@@ -78,7 +144,7 @@ void Actors::FortPawn::Tick() {
CurrentPlayer.IsPlayerVisibleOnScreen = true;
}
}
CurrentPlayer.DistanceFromLocalPawn = LocalPawnCache.Position.Distance(CurrentPlayer.BonePositions3D[Features::FortPawnHelper::Bone::Root]) / 100.f;
// Hardcoded max distance, should move to bone population for optimisation
@@ -98,16 +164,21 @@ void Actors::FortPawn::Tick() {
SDK::FVector2D TopLeft, BottomRight;
Features::FortPawnHelper::PopulateBoundCorners(CurrentPlayer, TopLeft, BottomRight);
float FontSize = Math::CalculateInterpolatedValue(CurrentPlayer.DistanceFromLocalPawn, 150.f, 10.f, 20.f);
float FontSize = Math::CalculateInterpolatedValue(150.f, CurrentPlayer.DistanceFromLocalPawn, 12.f, 20.f);
float PrimaryThicknessMultiplier = Math::CalculateInterpolatedValue(75.f, CurrentPlayer.DistanceFromLocalPawn, 1.f, 3.f);
float SecondaryThicknessMultiplier = Math::CalculateInterpolatedValue(75.f, CurrentPlayer.DistanceFromLocalPawn, 1.f, 2.f);
float PrimaryThickness = 1.f * PrimaryThicknessMultiplier;
float SecondaryThickness = 1.f * SecondaryThicknessMultiplier;
SDK::FLinearColor Color = SDK::FLinearColor(1.f, 1.f, 1.f, 1.f);
SDK::FLinearColor PrimaryColor = SDK::FLinearColor(1.f, 1.f, 1.f, 1.f);
if (CurrentPlayer.IsAnyBoneVisible) {
Color = SDK::FLinearColor(1.f, 0.f, 0.f, 1.f);
PrimaryColor = SDK::FLinearColor(1.f, 0.f, 0.f, 1.f);
}
SDK::FLinearColor SecondaryColor = SDK::FLinearColor(1.0f, 0.f, 0.f, 1.0f);
if (CurrentPlayer.IsAnyBoneVisible) {
SecondaryColor = SDK::FLinearColor(0.0f, 1.f, 1.f, 1.0f);
}
if (CurrentPlayer.IsPlayerVisibleOnScreen){
@@ -141,21 +212,55 @@ void Actors::FortPawn::Tick() {
SDK::FVector2D(ScreenPos[0].X, ScreenPos[0].Y),
SDK::FVector2D(ScreenPos[1].X, ScreenPos[1].Y),
SecondaryThicknessMultiplier,
BoneVisibleToPlayer ? SDK::FLinearColor(0.0f, 1.f, 1.f, 1.0f) : SDK::FLinearColor(1.0f, 0.f, 0.f, 1.0f),
Config::Visuals::Players::IndividualBoneVisibilities ? BoneVisibleToPlayer ? SDK::FLinearColor(0.0f, 1.f, 1.f, 1.0f) : SDK::FLinearColor(1.0f, 0.f, 0.f, 1.0f) : SecondaryColor,
false
);
}
}
if (Config::Visuals::Players::Box) {
Drawing::CorneredRect(TopLeft, SDK::FVector2D(BottomRight - TopLeft), PrimaryThickness, Color, true);
switch (Config::Visuals::Players::BoxType) {
case ConfigTypes::BoxType::Full3D:
// ADD THIS LATER
break;
case ConfigTypes::BoxType::Cornered3D:
// ADD THIS LATER
break;
case ConfigTypes::BoxType::Full2D:
Drawing::Rect(TopLeft, SDK::FVector2D(BottomRight - TopLeft), PrimaryThickness, PrimaryColor, true);
break;
case ConfigTypes::BoxType::Cornered2D:
Drawing::CorneredRect(TopLeft, SDK::FVector2D(BottomRight - TopLeft), PrimaryThickness, PrimaryColor, true);
break;
}
}
if (Config::Visuals::Players::Name) {
SDK::FVector2D PlayerNameTextSize = Drawing::TextSize(CurrentPlayer.PlayerName.ToString().c_str(), FontSize);
SDK::FVector2D PlayerNameTextPos = SDK::FVector2D(TopLeft.X + (BottomRight.X - TopLeft.X) / 2 - PlayerNameTextSize.X / 2, TopLeft.Y - PlayerNameTextSize.Y - 2.f);
// Text position at the top of the box
SDK::FVector2D PlayerNameTextPos = SDK::FVector2D(TopLeft.X + (BottomRight.X - TopLeft.X) / 2, TopLeft.Y - FontSize - 2);
Drawing::Text(CurrentPlayer.PlayerName.ToString().c_str(), PlayerNameTextPos, FontSize, Color, true, false, true);
Drawing::Text(CurrentPlayer.PlayerName.ToString().c_str(), PlayerNameTextPos, FontSize, PrimaryColor, true, false, true);
}
if (Config::Visuals::Players::Distance) {
// Text position at the bottom of the box
SDK::FVector2D PlayerDistanceTextPos = SDK::FVector2D(TopLeft.X + (BottomRight.X - TopLeft.X) / 2, BottomRight.Y + 2);
// Cast to int to remove decimal places
std::string DistanceString = skCrypt("[ ").decrypt() + std::to_string((int)CurrentPlayer.DistanceFromLocalPawn) + skCrypt(" m ]").decrypt();
Drawing::Text(DistanceString.c_str(), PlayerDistanceTextPos, FontSize, PrimaryColor, true, false, true);
}
if (Config::Visuals::Players::CurrentWeapon) {
//SDK::AFortWeapon* CurrentWeapon = FortPawn->CurrentWeapon();
//if (CurrentWeapon) {
// std::string WeaponName = CurrentWeapon->WeaponData()->DisplayName().ToString();
// SDK::FVector2D WeaponTextPos = SDK::FVector2D(TopLeft.X + (BottomRight.X - TopLeft.X) / 2, BottomRight.Y);
// WeaponTextPos.Y += Config::Visuals::Players::Distance ? FontSize + 1 : 0;
// Drawing::Text(WeaponName.c_str(), WeaponTextPos, FontSize, CurrentWeapon->WeaponData()->GetRarityColor(), true, false, true);
//}
}
}
}
@@ -38,34 +38,7 @@ void Actors::FortWeapon::Tick() {
if (WeaponName.Data && WeaponName.Data->Name && WeaponName.Data->Length > 0) {
SDK::EFortItemTier Rarity = FortItemDefinition->Tier();
SDK::FLinearColor WeaponColor(0.74f, 0.74f, 0.71f, 1.0f);
switch (Rarity) {
case SDK::EFortItemTier::I:
WeaponColor = SDK::FLinearColor(0.74f, 0.74f, 0.71f, 1.0f); // Set color for Common rarity
break;
case SDK::EFortItemTier::II:
WeaponColor = SDK::FLinearColor(0.12f, 0.87f, 0.11f, 1.0f); // Set color for Uncommon rarity
break;
case SDK::EFortItemTier::III:
WeaponColor = SDK::FLinearColor(0.29f, 0.33f, 0.95f, 1.0f); // Set color for Rare rarity
break;
case SDK::EFortItemTier::IV:
WeaponColor = SDK::FLinearColor(0.65f, 0.27f, 0.82f, 1.0f); // Set color for Epic rarity
break;
case SDK::EFortItemTier::V:
WeaponColor = SDK::FLinearColor(0.95f, 0.40f, 0.07f, 1.0f); // Set color for Legendary rarity
break;
case SDK::EFortItemTier::VI:
WeaponColor = SDK::FLinearColor(0.98f, 0.85f, 0.29f, 1.0f); // Set color for Mythic rarity
break;
case SDK::EFortItemTier::VII:
WeaponColor = SDK::FLinearColor(0.47f, 1.0f, 0.96f, 1.0f); // Set color for Transcendent rarity
break;
default:
WeaponColor = SDK::FLinearColor(0.74f, 0.74f, 0.71f, 1.0f); // Set color for Default rarity
break;
}
SDK::FLinearColor WeaponColor = FortItemDefinition->GetRarityColor();
Drawing::Text(WeaponName.ToString().c_str(), Project, 16.f, WeaponColor, true, true, true);
}
@@ -25,7 +25,40 @@ void Features::Aimbot::AimbotTarget(Target& TargetToAimot) {
void Features::Aimbot::CalculateShotCallback(SDK::FTransform* BulletTransform) {
if (Config::Aimbot::BulletTP && Actors::MainTarget.GlobalInfo.TargetActor) {
BulletTransform->Translation = Actors::MainTarget.GlobalInfo.TargetBonePosition;
SDK::FVector Position = Actors::MainTarget.GlobalInfo.TargetBonePosition;
Position.Z += 10.f; // Add 0.01 meters to the Z axis to make sue it always hits the correct bone
BulletTransform->Translation = Position;
}
}
void Features::Aimbot::RaycastMultiCallback(SDK::UWorld* World, SDK::TArray<SDK::FHitResult>& OutHits, SDK::ECollisionChannel TraceChannel) {
if (Actors::MainTarget.GlobalInfo.TargetActor && Config::Aimbot::BulletTPV2) {
if (TraceChannel != SDK::ECollisionChannel::ECC_GameTraceChannel7) return; // Only modify the line trace for the bullet
DEBUG_LOG(LOG_INFO, std::string(skCrypt("RaycastMultiCallback - ")) + std::to_string((int)TraceChannel));
for (int i = 0; i < OutHits.Num(); i++) {
SDK::FHitResult OutHit = OutHits[i];
// Prepare data for our own line trace
SDK::TArray<SDK::AActor*> ActorsToIgnore;
SDK::FVector Position = Actors::MainTarget.GlobalInfo.TargetBonePosition;
Position.Z += 50.f;
// Save the original start position of the RaycastMulti
SDK::FVector OriginalStart = OutHits[i].TraceStart();
// Run our own line trace that is guaranteed to hit the target bone
SDK::UKismetSystemLibrary::LineTraceSingle(World, Position, Actors::MainTarget.GlobalInfo.TargetBonePosition, (SDK::ETraceTypeQuery)TraceChannel, true, ActorsToIgnore, SDK::EDrawDebugTrace::None, OutHit, false, SDK::FLinearColor(), SDK::FLinearColor(), 0.f);
// Revert some data back to the original RaycastMulti (to avoid some possible detections)
OutHit.SetTraceStart(OriginalStart);
OutHit.SetDistance(OriginalStart.Distance(Actors::MainTarget.GlobalInfo.TargetBonePosition));
// Set the new hit result
OutHits[i] = OutHit;
}
}
}
@@ -39,7 +72,7 @@ void Features::Aimbot::GetViewpointCallback(SDK::FMinimalViewInfo* OutViewInfo)
}
}
void Features::Aimbot::GetPlayerViewpointCallback(SDK::FRotator* Rotation) {
void Features::Aimbot::GetPlayerViewpointCallback(SDK::FVector* Location, SDK::FRotator* Rotation) {
if (Config::Aimbot::SilentAim == false) return;
if (Actors::MainTarget.LocalInfo.IsTargeting == false && Config::Aimbot::UseAimKeyForSilent) return;
@@ -13,12 +13,21 @@ namespace Features {
void AimbotTarget(Aimbot::Target& TargetToAimot);
/*
* @brief Callback for the CalculateShot hook (used for silent aim and bullet TP)
* @brief Callback for the CalculateShot hook (used for silent aim and bullet TP V1)
*
* @param ShotTransform The bullet transform
*/
void CalculateShotCallback(SDK::FTransform* BulletTransform);
/*
* @brief Callback for the RaycastMulti hook (used for bullet TP V2)
*
* @param World The world (from the RaycastMulti hook)
* @param OutHits The hit results (from the RaycastMulti hook)
* @param TraceChannel The trace channel (from the RaycastMulti hook)
*/
void RaycastMultiCallback(SDK::UWorld* World, SDK::TArray<SDK::FHitResult>& OutHits, SDK::ECollisionChannel TraceChannel);
/*
* @brief Callback for the GetViewpoint hook (used for silent aim)
*
@@ -29,8 +38,9 @@ namespace Features {
/*
* @brief Callback for the GetPlayerViewpoint hook (used for silent aim)
*
* @param this_ The player controller
* @param Location The location of the camera
* @param Rotation The rotation of the camera
*/
void GetPlayerViewpointCallback(SDK::FRotator* Rotation);
void GetPlayerViewpointCallback(SDK::FVector* Location, SDK::FRotator* Rotation);
};
}
@@ -5,6 +5,8 @@
#include "../FortPawnHelper/Bone.h"
#include "../../Game.h"
void Features::Aimbot::Target::UpdateLocalInfoAndType(Target& TargetToUpdate) {
switch (TargetToUpdate.GlobalInfo.Type) {
case TargetType::ClosePlayer:
@@ -10,8 +10,9 @@
#include "../../Input/Input.h"
void Features::Exploits::Vehicle::Tick() {
SDK::AFortAthenaVehicle* Vehicle = reinterpret_cast<SDK::AFortPawn*>(SDK::GetLocalPawn())->GetVehicle();
if (Vehicle) {
SDK::AFortAthenaVehicle* Vehicle = reinterpret_cast<SDK::AFortPlayerPawn*>(SDK::GetLocalPawn())->GetVehicle();
if (SDK::IsValidPointer(Vehicle)) {
VehicleLastTick = Vehicle;
if (Config::Exploits::Vehicle::InfiniteBoost) {
+23 -2
View File
@@ -44,6 +44,9 @@ void Game::MenuCallback() {
RaaxGUI::Checkbox(skCrypt("Show Aim Line"), &Config::Aimbot::ShowAimLine);
RaaxGUI::Checkbox(skCrypt("Show FOV"), &Config::Aimbot::ShowFOV);
RaaxGUI::Checkbox(skCrypt("Sticky Aim"), &Config::Aimbot::StickyAim);
RaaxGUI::Checkbox(skCrypt("Visible Check"), &Config::Aimbot::VisibleCheck);
RaaxGUI::Checkbox(skCrypt("Standard"), &Config::Aimbot::Standard::Enabled);
if (Config::Aimbot::Standard::Enabled) {
RaaxGUI::SliderInt(skCrypt("Standard FOV"), &Config::Aimbot::Standard::FOV, 0, 180);
@@ -201,7 +204,10 @@ void Game::MenuCallback() {
}
if (SDK::Cached::Functions::CalculateShot) {
ImGui::Checkbox(skCrypt("Bullet TP"), &Config::Aimbot::BulletTP);
ImGui::Checkbox(skCrypt("Bullet TP V1 (CalculateShot)"), &Config::Aimbot::BulletTP);
}
if (SDK::Cached::Functions::RaycastMulti) {
ImGui::Checkbox(skCrypt("Bullet TP V2 (RaycastMulti)"), &Config::Aimbot::BulletTPV2);
}
ImGui::Checkbox(skCrypt("Silent Aim"), &Config::Aimbot::SilentAim);
@@ -243,7 +249,16 @@ void Game::MenuCallback() {
ImGui::Checkbox(skCrypt("Player ESP"), &Config::Visuals::Players::Enabled);
if (Config::Visuals::Players::Enabled) {
ImGui::Checkbox(skCrypt("Box"), &Config::Visuals::Players::Box);
if (Config::Visuals::Players::Box) {
// Fix skCrypter messing up the strings here
const char* Items[] = { skCrypt("3D Full").decrypt(), skCrypt("3D Cornered").decrypt(), skCrypt("2D Full").decrypt(), skCrypt("2D Cornered").decrypt() };
ImGui::Combo(skCrypt("Box Type").decrypt(), (int*)&Config::Visuals::Players::BoxType, Items, 4);
}
ImGui::Checkbox(skCrypt("Skeleton"), &Config::Visuals::Players::Skeleton);
ImGui::Checkbox(skCrypt("Display Individual Bone Visibilities"), &Config::Visuals::Players::IndividualBoneVisibilities);
ImGui::Checkbox(skCrypt("Distance"), &Config::Visuals::Players::Distance);
ImGui::Checkbox(skCrypt("Name"), &Config::Visuals::Players::Name);
@@ -288,9 +303,15 @@ void Game::MenuCallback() {
switch (SubTab) {
case 0:
{
ImGui::Checkbox(skCrypt("Edit Enemy Builds"), &Config::Exploits::Player::EditEnemyBuilds);
ImGui::Checkbox(skCrypt("ADS While Not On Ground"), &Config::Exploits::Player::ADSWhileNotOnGround);
ImGui::Checkbox(skCrypt("Double Pump"), &Config::Exploits::Player::DoublePump);
ImGui::Checkbox(skCrypt("Allow Redeploy (client sided 99% of the time)"), &Config::Exploits::Player::AllowRedeploy);
ImGui::Checkbox(skCrypt("Infinite Builds (client sided 99% of the time)"), &Config::Exploits::Player::InfiniteBuilds);
ImGui::Checkbox(skCrypt("Infinite Ammo (client sided 99% of the time)"), &Config::Exploits::Player::InfiniteAmmo);
ImGui::Checkbox(skCrypt("Edit Enemy Builds"), &Config::Exploits::Player::EditEnemyBuilds);
}
break;
case 1:
@@ -11,13 +11,4 @@ bool SDK::FVector::Normalize(float Tolerance) {
return true;
}
return false;
}
SDK::FVector SDK::FRotator::Vector() const {
float CP, SP, CY, SY;
Math::SinCos(&SP, &CP, Math::DegreesToRadians(Pitch));
Math::SinCos(&SY, &CY, Math::DegreesToRadians(Yaw));
FVector V = FVector(CP * CY, CP * SY, SP);
return V;
}
@@ -592,8 +592,6 @@ namespace SDK {
}
return delta;
}
inline FVector Vector() const;
};
struct FVector2D
@@ -105,7 +105,6 @@ namespace SDK {
}
void UObject::SetupObjects(std::vector<FunctionSearch>& Functions, std::vector<OffsetSearch>& Offsets) {
DEBUG_LOG(LOG_OFFSET, std::string(skCrypt("Setting up objects...")));
@@ -152,11 +151,11 @@ namespace SDK {
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)) {
if (Offset.Offset != nullptr && (*Offset.Offset == -0x1 || *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)) {
if (Offset.Mask != nullptr && (*Offset.Mask == -0x1 || *Offset.Mask == 0x0) && ChildProperty->HasTypeFlag(SDK::EClassCastFlags::BoolProperty)) {
*Offset.Mask = ((SDK::FBoolProperty*)ChildProperty)->FieldMask;
}
@@ -171,11 +170,11 @@ namespace SDK {
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)) {
if (Offset.Offset != nullptr && (*Offset.Offset == -0x1 || *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)) {
if (Offset.Mask != nullptr && (*Offset.Mask == -0x1 || *Offset.Mask == 0x0) && Child->HasTypeFlag(SDK::EClassCastFlags::BoolProperty)) {
*Offset.Mask = ((SDK::UBoolProperty*)Child)->ByteMask();
}
@@ -28,6 +28,23 @@ void SDK::USceneComponent::SetPhysicsLinearVelocity(FVector NewVel, bool bAddToC
return;
}
void SDK::UPrimitiveComponent::SetMaterial(int32 ElementIndex, UMaterialInterface* Material) {
if (SDK::IsValidPointer(this) == false) return;
struct {
int32 ElementIndex;
uint8 Pad_677[0x4];
UMaterialInterface* Material;
} params_SetMaterial{};
params_SetMaterial.ElementIndex = ElementIndex;
params_SetMaterial.Material = Material;
this->ProcessEvent(SDK::Cached::Functions::PrimitiveComponent::SetMaterial, &params_SetMaterial);
return;
}
void SDK::UMovementComponent::StopMovementImmediately() {
if (SDK::IsValidPointer(this) == false) return;
@@ -112,6 +129,18 @@ void SDK::AActor::SetActorEnableCollision(bool bNewActorEnableCollision) {
return;
}
SDK::TArray<SDK::UMaterialInterface*> SDK::UMeshComponent::GetMaterials() {
if (SDK::IsValidPointer(this) == false) return TArray<UMaterialInterface*>{};
struct {
TArray<UMaterialInterface*> return_value;
} params_GetMaterials{};
this->ProcessEvent(SDK::Cached::Functions::MeshComponent::GetMaterials, &params_GetMaterials);
return params_GetMaterials.return_value;
}
SDK::FName SDK::USkeletalMeshComponent::GetBoneName(int32 BoneIndex) {
if (SDK::IsValidPointer(this) == false) return FName{};
@@ -370,7 +399,7 @@ bool SDK::UKismetSystemLibrary::LineTraceSingle(class UObject* WorldContextObjec
bool bTraceComplex,
TArray<class AActor*>& ActorsToIgnore,
EDrawDebugTrace DrawDebugType,
FHitResult OutHit,
FHitResult& OutHit,
bool bIgnoreSelf,
FLinearColor& TraceColor,
FLinearColor& TraceHitColor,
@@ -386,7 +415,7 @@ bool SDK::UKismetSystemLibrary::LineTraceSingle(class UObject* WorldContextObjec
SDK::FLinearColor EmptyColor = SDK::FLinearColor();
return OriginalLineTraceSingle(WorldContextObject, StartCopy, EndCopy, TraceChannel, bTraceComplex, ActorsToIgnore, EDrawDebugTrace::None, {}, bIgnoreSelf, EmptyColor, EmptyColor, 0.f);
return OriginalLineTraceSingle(WorldContextObject, StartCopy, EndCopy, TraceChannel, bTraceComplex, ActorsToIgnore, EDrawDebugTrace::None, OutHit, bIgnoreSelf, EmptyColor, EmptyColor, 0.f);
}
SDK::UClass* SDK::UKismetSystemLibrary::StaticClass() {
static class UClass* Clss = nullptr;
@@ -397,6 +426,34 @@ SDK::UClass* SDK::UKismetSystemLibrary::StaticClass() {
return Clss;
}
SDK::UMaterialInstanceDynamic* SDK::UKismetMaterialLibrary::CreateDynamicMaterialInstance(class UObject* WorldContextObject, class UMaterialInterface* Parent, class FName OptionalName) {
if (SDK::IsValidPointer(this) == false) return nullptr;
struct {
class UObject* WorldContextObject;
class UMaterialInterface* Parent;
class FName OptionalName;
class UMaterialInstanceDynamic* return_value;
} params_CreateDynamicMaterialInstance{};
params_CreateDynamicMaterialInstance.WorldContextObject = WorldContextObject;
params_CreateDynamicMaterialInstance.Parent = Parent;
params_CreateDynamicMaterialInstance.OptionalName = OptionalName;
this->ProcessEvent(SDK::Cached::Functions::KismetMaterialLibrary::CreateDynamicMaterialInstance, &params_CreateDynamicMaterialInstance);
return params_CreateDynamicMaterialInstance.return_value;
}
SDK::UKismetMaterialLibrary* SDK::UKismetMaterialLibrary::StaticClass() {
static class UClass* Clss = nullptr;
if (!Clss)
Clss = UObject::FindClassFast(std::string(skCrypt("KismetMaterialLibrary")));
return reinterpret_cast<UKismetMaterialLibrary*>(Clss);
}
SDK::FVector SDK::UKismetMathLibrary::GetForwardVector(const FRotator& InRot) {
if (SDK::IsValidPointer(this) == false) return FVector{};
@@ -444,6 +501,27 @@ SDK::FRotator SDK::UKismetMathLibrary::FindLookAtRotation(struct FVector Start,
return params_FindLookAtRotation.return_value;
}
int32 SDK::UKismetMathLibrary::FMod(float Dividend, float Divisor, float* Remainder) {
if (SDK::IsValidPointer(this) == false) return 0;
struct {
float Dividend;
float Divisor;
float Remainder;
int32 return_value;
} params_FMod{};
params_FMod.Dividend = Dividend;
params_FMod.Divisor = Divisor;
params_FMod.Remainder = *Remainder;
this->ProcessEvent(SDK::Cached::Functions::KismetMathLibrary::FMod, &params_FMod);
*Remainder = params_FMod.Remainder;
return params_FMod.return_value;
}
SDK::UKismetMathLibrary* SDK::UKismetMathLibrary::StaticClass() {
static class UClass* Clss = nullptr;
@@ -608,6 +686,15 @@ void SDK::UCanvas::K2_DrawBox(FVector2D ScreenPosition, FVector2D ScreenSize, fl
this->ProcessEvent(SDK::Cached::Functions::Canvas::K2_DrawBox, &params_K2_DrawBox);
}
SDK::UClass* SDK::UMaterialInterface::StaticClass() {
static class UClass* Clss = nullptr;
if (!Clss)
Clss = UObject::FindClassFast(std::string(skCrypt("MaterialInterface")));
return Clss;
}
// Wrapper Functions
@@ -648,9 +735,6 @@ bool SDK::IsPositionVisible(SDK::UObject* WorldContextObj, FVector CameraPositio
if (ActorToIgnore) IgnoredActors.Add(ActorToIgnore);
if (ActorToIgnore2) IgnoredActors.Add(ActorToIgnore2);
Hit.TraceStart = CameraPosition;
Hit.TraceEnd = TargetPosition;
bool bHitSomething = SDK::UKismetSystemLibrary::LineTraceSingle(
WorldContextObj,
CameraPosition,
@@ -17,12 +17,26 @@ typedef unsigned __int64 uint64;
namespace SDK {
// Classes
class UMaterial : public UObject {
public:
};
class UMaterialInterface : public UObject {
public:
// STATIC FUNCTIONS
static UClass* StaticClass();
};
class UMaterialInstanceDynamic : public UMaterialInterface {
public:
};
class USceneComponent : public UObject {
public:
// VALUES
FVector GetPosition() {
if (SDK::IsValidPointer(this) == false) return FVector{};
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::SceneComponent::RelativeLocation == -0x1) return FVector{};
return *(FVector*)((uintptr_t)this + SDK::Cached::Offsets::SceneComponent::RelativeLocation);
}
@@ -32,6 +46,12 @@ namespace SDK {
void SetPhysicsLinearVelocity(FVector NewVel, bool bAddToCurrent, FName BoneName);
};
class UPrimitiveComponent : public USceneComponent {
public:
// FUNCTIONS
void SetMaterial(int32 ElementIndex, UMaterialInterface* Material);
};
class UMovementComponent : public UObject {
public:
// FUNCTIONS
@@ -47,7 +67,7 @@ namespace SDK {
// VALUES
USceneComponent* GetRootComponent() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Actor::RootComponent == -0x1) return nullptr;
return (USceneComponent*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Actor::RootComponent));
}
@@ -62,7 +82,13 @@ namespace SDK {
void SetActorEnableCollision(bool bNewActorEnableCollision);
};
class USkeletalMeshComponent : public UObject {
class UMeshComponent : public UPrimitiveComponent {
public:
// FUNCTIONS
TArray<UMaterialInterface*> GetMaterials();
};
class USkeletalMeshComponent : public UMeshComponent {
public:
// FUNCTIONS
@@ -76,8 +102,25 @@ namespace SDK {
FVector GetBonePosition(uint8_t BoneID);
};
class APlayerState : public AActor {
public:
// FUNCTIONS
FString GetPlayerName();
};
class APawn : public AActor {
public:
// VALUES
APlayerState* PlayerState() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Pawn::PlayerState == -0x1) return nullptr;
return (APlayerState*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Pawn::PlayerState));
}
// FUNCTIONS
UPawnMovementComponent* GetMovementComponent();
};
class ACharacter : public APawn {
@@ -85,16 +128,10 @@ namespace SDK {
// VALUES
USkeletalMeshComponent* Mesh() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Character::Mesh == -0x1) return nullptr;
return (USkeletalMeshComponent*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Character::Mesh));
}
};
class APlayerState : public AActor {
public:
// FUNCTIONS
FString GetPlayerName();
};
class APlayerCameraManager : public UObject {
public:
// FUNCTIONS
@@ -110,12 +147,12 @@ namespace SDK {
// VALUES
APawn* AcknowledgedPawn() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::PlayerController::AcknowledgedPawn == -0x1) return nullptr;
return (APawn*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::PlayerController::AcknowledgedPawn));
}
APlayerCameraManager* PlayerCameraManager() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::PlayerController::PlayerCameraManager == -0x1) return nullptr;
return (APlayerCameraManager*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::PlayerController::PlayerCameraManager));
}
@@ -146,7 +183,7 @@ namespace SDK {
// VALUES
APlayerController* PlayerController() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Player::PlayerController == -0x1) return nullptr;
return (APlayerController*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Player::PlayerController));
}
};
@@ -159,25 +196,34 @@ namespace SDK {
// VALUES
TArray<ULocalPlayer*> LocalPlayers() {
if (SDK::IsValidPointer(this) == false) return TArray<ULocalPlayer*>{};
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::GameInstance::LocalPlayers == -0x1) return TArray<ULocalPlayer*>{};
return *(TArray<ULocalPlayer*>*)((uintptr_t)this + SDK::Cached::Offsets::GameInstance::LocalPlayers);
}
};
class UWorld : public UObject {
class AGameState : public AActor {
public:
};
class UWorld : public UObject {
public:
// VALUES
AGameState* GameState() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::World::GameState == -0x1) return nullptr;
return (AGameState*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::World::GameState));
}
};
class UGameViewportClient : public UObject {
public:
// VALUES
UWorld* World() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::GameViewportClient::World == -0x1) return nullptr;
return (UWorld*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::GameViewportClient::World));
}
UGameInstance* GameInstance() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::GameViewportClient::GameInstance == -0x1) return nullptr;
return (UGameInstance*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::GameViewportClient::GameInstance));
}
@@ -192,7 +238,7 @@ namespace SDK {
// VALUES
UGameViewportClient* GameViewport() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Engine::GameViewport == -0x1) return nullptr;
return (UGameViewportClient*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Engine::GameViewport));
}
@@ -243,6 +289,18 @@ namespace SDK {
static UClass* StaticClass();
};
class UKismetMaterialLibrary : public UObject {
public:
// FUNCTIONS
UMaterialInstanceDynamic* CreateDynamicMaterialInstance(class UObject* WorldContextObject, class UMaterialInterface* Parent, class FName OptionalName);
// STATIC FUNCTIONS
static UKismetMaterialLibrary* StaticClass();
};
class UKismetMathLibrary : public UObject {
public:
// FUNCTIONS
@@ -252,6 +310,8 @@ namespace SDK {
SDK::FVector GetRightVector(const FRotator& InRot);
FRotator FindLookAtRotation(struct FVector Start, struct FVector Target);
int32 FMod(float Dividend, float Divisor, float* Remainder);
@@ -264,12 +324,12 @@ namespace SDK {
// VALUES
void SetFontSize(int32 NewFontSize) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Font::LegacyFontSize == -0x1) return;
*(int32*)((uintptr_t)this + SDK::Cached::Offsets::Font::LegacyFontSize) = NewFontSize;
}
int32 GetFontSize() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Font::LegacyFontSize == -0x1) return 0;
return *(int32*)((uintptr_t)this + SDK::Cached::Offsets::Font::LegacyFontSize);
}
};
@@ -284,12 +344,12 @@ namespace SDK {
// VALUES
int32 SizeX() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Canvas::SizeX == -0x1) return 0;
return *(int32*)((uintptr_t)this + SDK::Cached::Offsets::Canvas::SizeX);;
}
int32 SizeY() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Canvas::SizeY == -0x1) return 0;
return *(int32*)((uintptr_t)this + SDK::Cached::Offsets::Canvas::SizeY);
}
@@ -51,6 +51,43 @@ namespace SDK {
ETraceTypeQuery_MAX = 33,
};
enum class ECollisionChannel : uint8 {
ECC_WorldStatic = 0,
ECC_WorldDynamic = 1,
ECC_Pawn = 2,
ECC_Visibility = 3,
ECC_Camera = 4,
ECC_PhysicsBody = 5,
ECC_Vehicle = 6,
ECC_Destructible = 7,
ECC_EngineTraceChannel1 = 8,
ECC_EngineTraceChannel2 = 9,
ECC_EngineTraceChannel3 = 10,
ECC_EngineTraceChannel4 = 11,
ECC_EngineTraceChannel5 = 12,
ECC_EngineTraceChannel6 = 13,
ECC_GameTraceChannel1 = 14,
ECC_GameTraceChannel2 = 15,
ECC_GameTraceChannel3 = 16,
ECC_GameTraceChannel4 = 17,
ECC_GameTraceChannel5 = 18,
ECC_GameTraceChannel6 = 19,
ECC_GameTraceChannel7 = 20,
ECC_GameTraceChannel8 = 21,
ECC_GameTraceChannel9 = 22,
ECC_GameTraceChannel10 = 23,
ECC_GameTraceChannel11 = 24,
ECC_GameTraceChannel12 = 25,
ECC_GameTraceChannel13 = 26,
ECC_GameTraceChannel14 = 27,
ECC_GameTraceChannel15 = 28,
ECC_GameTraceChannel16 = 29,
ECC_GameTraceChannel17 = 30,
ECC_GameTraceChannel18 = 31,
ECC_OverlapAll_Deprecated = 32,
ECC_MAX = 33,
};
enum class EDrawDebugTrace : uint8 {
None = 0,
ForOneFrame = 1,
@@ -59,28 +96,33 @@ namespace SDK {
EDrawDebugTrace_MAX = 4,
};
struct FHitResult {
enum class EMIDCreationFlags : uint8 {
None = 0,
Transient = 1,
EMIDCreationFlags_MAX = 2,
};
struct FHitResult
{
public:
uint8 bBlockingHit : 1; // Mask: 0x1, PropSize: 0x10x0(0x1)(NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
uint8 bStartPenetrating : 1; // Mask: 0x2, PropSize: 0x10x0(0x1)(NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
uint8 BitPad_1D0 : 6; // Fixing Bit-Field Size [ Dumper-7 ]
uint8 Pad_2126[0x3]; // Fixing Size After Last Property [ Dumper-7 ]
int32 FaceIndex; // 0x4(0x4)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
float Time; // 0x8(0x4)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
float Distance; // 0xC(0x4)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
struct SDK::FVector Location; // 0x10(0xC)(NoDestructor, NativeAccessSpecifierPublic)
struct SDK::FVector ImpactPoint; // 0x1C(0xC)(NoDestructor, NativeAccessSpecifierPublic)
struct SDK::FVector Normal; // 0x28(0xC)(NoDestructor, NativeAccessSpecifierPublic)
struct SDK::FVector ImpactNormal; // 0x34(0xC)(NoDestructor, NativeAccessSpecifierPublic)
struct SDK::FVector TraceStart; // 0x40(0xC)(NoDestructor, NativeAccessSpecifierPublic)
struct SDK::FVector TraceEnd; // 0x4C(0xC)(NoDestructor, NativeAccessSpecifierPublic)
float PenetrationDepth; // 0x58(0x4)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
int32 Item; // 0x5C(0x4)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
void* PhysMaterial; // 0x60(0x8)(ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
void* Actor; // 0x68(0x8)(ZeroConstructor, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
void* Component; // 0x70(0x8)(ExportObject, ZeroConstructor, InstancedReference, IsPlainOldData, NoDestructor, UObjectWrapper, HasGetValueTypeHash, NativeAccessSpecifierPublic)
SDK::FName BoneName; // 0x78(0x8)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
SDK::FName MyBoneName; // 0x80(0x8)(ZeroConstructor, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
char UnknownData[0x100]; // Dummy data
// Values
SDK::FVector TraceStart() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::HitResult::TraceStart == -0x1) return SDK::FVector();
return *(SDK::FVector*)((uintptr_t)this + SDK::Cached::Offsets::HitResult::TraceStart);
}
void SetTraceStart(FVector NewTraceStart) {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::HitResult::TraceStart == -0x1) return;
*(SDK::FVector*)((uintptr_t)this + SDK::Cached::Offsets::HitResult::TraceStart) = NewTraceStart;
}
void SetDistance(float NewDistance) {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::HitResult::Distance == -0x1) return;
*(float*)((uintptr_t)this + SDK::Cached::Offsets::HitResult::Distance) = NewDistance;
}
};
struct FMinimalViewInfo {
@@ -88,12 +130,12 @@ namespace SDK {
// VALUES
void SetLocation(SDK::FVector NewLocation) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::MinimalViewInfo::Location == -0x1) return;
*(SDK::FVector*)((uintptr_t)this + SDK::Cached::Offsets::MinimalViewInfo::Location) = NewLocation;
}
void SetRotation(SDK::FRotator NewRotation) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::MinimalViewInfo::Rotation == -0x1) return;
*(SDK::FRotator*)((uintptr_t)this + SDK::Cached::Offsets::MinimalViewInfo::Rotation) = NewRotation;
}
};
@@ -22,7 +22,7 @@ namespace SDK {
// VALUES
void SetBoostAccumulationRate(float Value, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAntelopeVehicleConfigs::BoostAccumulationRate == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortAntelopeVehicleConfigs::BoostAccumulationRate), AutoRevertFeature);
@@ -32,7 +32,7 @@ namespace SDK {
}
void SetBoostExpenseRate(float Value, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAntelopeVehicleConfigs::BoostExpenseRate == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortAntelopeVehicleConfigs::BoostExpenseRate), AutoRevertFeature);
@@ -52,7 +52,7 @@ namespace SDK {
// VALUES
TArray<struct FFortRechargingActionTimer> BoostTimers() {
if (SDK::IsValidPointer(this) == false) return TArray<struct FFortRechargingActionTimer>{};
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAthenaJackalVehicle::BoostTimers == -0x1) return TArray<struct FFortRechargingActionTimer>{};
return *(TArray<struct FFortRechargingActionTimer>*)((uintptr_t)this + SDK::Cached::Offsets::FortAthenaJackalVehicle::BoostTimers);
}
@@ -68,7 +68,7 @@ namespace SDK {
// VALUES
FFortRechargingActionTimer* BoostAction() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAthenaDoghouseVehicle::BoostAction == -0x1) return nullptr;
return (FFortRechargingActionTimer*)((uintptr_t)this + SDK::Cached::Offsets::FortAthenaDoghouseVehicle::BoostAction);
}
@@ -84,7 +84,7 @@ namespace SDK {
// VALUES
UFortAntelopeVehicleConfigs* FortAntelopeVehicleConfigs() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAthenaAntelopeVehicle::FortAntelopeVehicleConfigs == -0x1) return nullptr;
return (UFortAntelopeVehicleConfigs*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::FortAthenaAntelopeVehicle::FortAntelopeVehicleConfigs));
}
@@ -95,7 +95,27 @@ namespace SDK {
static UClass* StaticClass();
};
class UFortWeaponItemDefinition : public UObject {
class UFortItemDefinition : public UObject {
public:
// VALUES
FText DisplayName() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortItemDefinition::DisplayName == -0x1) return FText();
return *(FText*)((uintptr_t)this + SDK::Cached::Offsets::FortItemDefinition::DisplayName);
}
EFortItemTier Tier() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortItemDefinition::Tier == -0x1) return EFortItemTier();
return *(EFortItemTier*)((uintptr_t)this + SDK::Cached::Offsets::FortItemDefinition::Tier);
}
// CUSTOM FUNCTIONS
FLinearColor GetRarityColor();
};
class UFortWeaponItemDefinition : public UFortItemDefinition {
public:
};
@@ -105,31 +125,12 @@ namespace SDK {
static UClass* StaticClass();
};
class UFortItemDefinition : public UObject {
public:
// VALUES
FText DisplayName() {
if (SDK::IsValidPointer(this) == false) return FText();
return *(FText*)((uintptr_t)this + SDK::Cached::Offsets::FortItemDefinition::DisplayName);
}
EFortItemTier Tier() {
if (SDK::IsValidPointer(this) == false) return EFortItemTier();
return *(EFortItemTier*)((uintptr_t)this + SDK::Cached::Offsets::FortItemDefinition::Tier);
}
//EFortItemType Type() {
// if (!SDK::IsValidPointer(this)) return EFortItemType{};
// return *(EFortItemType*)((uintptr_t)this + SDK::Cached::Offsets::FortItemDefinition::ItemType);
//}
};
class FFortItemEntry : public UObject {
public:
// VALUES
UFortItemDefinition* ItemDefinition() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortItemEntry::ItemDefinition == -0x1) return nullptr;
return (UFortItemDefinition*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::FortItemEntry::ItemDefinition));
}
};
@@ -138,7 +139,7 @@ namespace SDK {
// VALUES
FFortItemEntry* PrimaryPickupItemEntry() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortPickup::PrimaryPickupItemEntry == -0x1) return nullptr;
return (FFortItemEntry*)((uintptr_t)this + SDK::Cached::Offsets::FortPickup::PrimaryPickupItemEntry);
}
@@ -153,25 +154,35 @@ namespace SDK {
// VALUES
UFortWeaponItemDefinition* WeaponData() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortWeapon::WeaponData == -0x1) return nullptr;
return (UFortWeaponItemDefinition*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::WeaponData));
}
float LastFireTime() {
if (SDK::IsValidPointer(this) == false) return 0.f;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortWeapon::LastFireTime == -0x1) return 0.f;
return *(float*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::LastFireTime);
}
float LastFireTimeVerified() {
if (SDK::IsValidPointer(this) == false) return 0.f;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortWeapon::LastFireTimeVerified == -0x1) return 0.f;
return *(float*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::LastFireTimeVerified);
}
void SetLastFireTime(float NewLastFireTime) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortWeapon::LastFireTime == -0x1) return;
*(float*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::LastFireTime) = NewLastFireTime;
}
void SetbIgnoreTryToFireSlotCooldownRestriction(bool NewValue, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortWeapon::bIgnoreTryToFireSlotCooldownRestriction == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<bool>((bool*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::bIgnoreTryToFireSlotCooldownRestriction), AutoRevertFeature);
}
*(bool*)((uintptr_t)this + SDK::Cached::Offsets::FortWeapon::bIgnoreTryToFireSlotCooldownRestriction) = NewValue;
}
// FUNCTIONS
@@ -206,7 +217,7 @@ namespace SDK {
// VALUES
uint8 TeamIndex() {
if (SDK::IsValidPointer(this) == false) return uint8{};
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortPlayerStateAthena::TeamIndex == -0x1) return 0;
return *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerStateAthena::TeamIndex);
}
};
@@ -214,23 +225,13 @@ namespace SDK {
public:
// VALUES
AFortPlayerState* PlayerState() {
if (SDK::IsValidPointer(this) == false) return nullptr;
return (AFortPlayerState*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::Pawn::PlayerState));
}
AFortWeapon* CurrentWeapon() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::Pawn::PlayerState == -0x1) return nullptr;
return (AFortWeapon*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::CurrentWeapon));
}
FVehiclePawnState* VehicleStateLocal() {
if (SDK::IsValidPointer(this) == false) return nullptr;
return (FVehiclePawnState*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::VehicleStateLocal);
}
bool IsDying() {
if (SDK::IsValidPointer(this) == false) return false;
if (SDK::IsValidPointer(this) == false || (SDK::Cached::Offsets::FortPawn::bIsDying == -0x1 && SDK::Cached::Masks::FortPawn::bIsDying == -0x1)) return false;
if (SDK::Cached::Masks::FortPawn::bIsDying) {
uint8 BitField = *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::FortPawn::bIsDying);
@@ -252,6 +253,15 @@ namespace SDK {
// STATIC FUNCTIONS
static UClass* StaticClass();
};
class AFortPlayerPawn : public AFortPawn {
public:
// VALUES
FVehiclePawnState* VehicleStateLocal() {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortPlayerPawn::VehicleStateLocal == -0x1) return nullptr;
return (FVehiclePawnState*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerPawn::VehicleStateLocal);
}
@@ -259,17 +269,37 @@ namespace SDK {
AFortAthenaVehicle* GetVehicle();
};
class AFortPlayerPawnAthena : public AFortPawn {
public:
// VALUES
void SetbADSWhileNotOnGround(bool NewValue, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortPlayerPawnAthena::bADSWhileNotOnGround == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<bool>((bool*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerPawnAthena::bADSWhileNotOnGround), AutoRevertFeature);
}
*(bool*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerPawnAthena::bADSWhileNotOnGround) = NewValue;
}
// STATIC FUNCTIONS
static UClass* StaticClass();
};
class ABuildingActor : public AActor {
public:
// VALUES
uint8 TeamIndex() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::BuildingActor::TeamIndex == -0x1) return 0;
return *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::BuildingActor::TeamIndex);
}
void SetTeamIndex(uint8 NewTeamIndex, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::BuildingActor::TeamIndex == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<uint8>((uint8*)((uintptr_t)this + SDK::Cached::Offsets::BuildingActor::TeamIndex), AutoRevertFeature);
@@ -288,7 +318,7 @@ namespace SDK {
}
void SetbBuildFree(bool NewbBuildFree, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || (SDK::Cached::Offsets::FortPlayerController::bBuildFree == -0x1 && SDK::Cached::Masks::FortPlayerController::bBuildFree)) return;
if (SDK::Cached::Masks::FortPlayerController::bBuildFree) {
uint8* BitField = (uint8*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerController::bBuildFree);
@@ -309,7 +339,7 @@ namespace SDK {
}
void SetbInfiniteAmmo(bool NewbInfiniteAmmo, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || (SDK::Cached::Offsets::FortPlayerController::bInfiniteAmmo == -0x1 && SDK::Cached::Masks::FortPlayerController::bInfiniteAmmo)) return;
if (SDK::Cached::Masks::FortPlayerController::bInfiniteAmmo) {
uint8* BitField = (uint8*)((uintptr_t)this + SDK::Cached::Offsets::FortPlayerController::bInfiniteAmmo);
@@ -337,6 +367,26 @@ namespace SDK {
};
class UFortLocalPlayer : public ULocalPlayer {
public:
// STATIC FUNCTIONS
static UClass* StaticClass();
};
class AFortGameStateAthena : public AGameState {
public:
// VALUES
void SetDefaultGliderRedeployCanRedeploy(bool NewValue, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortGameStateAthena::DefaultGliderRedeployCanRedeploy == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<bool>((bool*)((uintptr_t)this + SDK::Cached::Offsets::FortGameStateAthena::DefaultGliderRedeployCanRedeploy), AutoRevertFeature);
}
*(bool*)((uintptr_t)this + SDK::Cached::Offsets::FortGameStateAthena::DefaultGliderRedeployCanRedeploy) = NewValue;
}
// STATIC FUNCTIONS
static UClass* StaticClass();
@@ -346,7 +396,7 @@ namespace SDK {
// VALUES
uint8 GetWeakSpotInfo() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField == -0x1) return 0;
return *(uint8*)((uintptr_t)this + SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField);
}
@@ -27,6 +27,48 @@ SDK::UClass* SDK::AFortAthenaDoghouseVehicle::StaticClass() {
return Clss;
}
SDK::FLinearColor SDK::UFortItemDefinition::GetRarityColor() {
if (SDK::IsValidPointer(this) == false) return FLinearColor(1.f, 1.f, 1.f, 1.f);
EFortItemTier Tier = this->Tier();
switch (Tier) {
// Common
case SDK::EFortItemTier::I:
return SDK::FLinearColor(0.74f, 0.74f, 0.71f, 1.0f);
// Uncommon
case SDK::EFortItemTier::II:
return SDK::FLinearColor(0.12f, 0.87f, 0.11f, 1.0f);
// Rare
case SDK::EFortItemTier::III:
return SDK::FLinearColor(0.29f, 0.33f, 0.95f, 1.0f);
// Epic
case SDK::EFortItemTier::IV:
return SDK::FLinearColor(0.65f, 0.27f, 0.82f, 1.0f);
// Legendary
case SDK::EFortItemTier::V:
return SDK::FLinearColor(0.95f, 0.40f, 0.07f, 1.0f);
// Mythic
case SDK::EFortItemTier::VI:
return SDK::FLinearColor(0.98f, 0.85f, 0.29f, 1.0f);
// Transcendent
case SDK::EFortItemTier::VII:
return SDK::FLinearColor(0.47f, 1.0f, 0.96f, 1.0f);
// Default
default:
return SDK::FLinearColor(0.74f, 0.74f, 0.71f, 1.0f);
}
return SDK::FLinearColor(1.f, 1.f, 1.f, 1.f);
}
SDK::UClass* SDK::UFortWeaponMeleeItemDefinition::StaticClass() {
static class UClass* Clss = nullptr;
@@ -135,7 +177,7 @@ SDK::UClass* SDK::AFortPawn::StaticClass() {
return Clss;
}
SDK::AFortAthenaVehicle* SDK::AFortPawn::GetVehicle() {
SDK::AFortAthenaVehicle* SDK::AFortPlayerPawn::GetVehicle() {
if (SDK::IsValidPointer(this) == false) return nullptr;
return VehicleStateLocal()->GetVehicle();
}
@@ -158,6 +200,15 @@ SDK::UClass* SDK::UFortLocalPlayer::StaticClass() {
return Clss;
}
SDK::UClass* SDK::AFortGameStateAthena::StaticClass() {
static class UClass* Clss = nullptr;
if (!Clss)
Clss = UObject::FindClassFast(std::string(skCrypt("FortGameStateAthena")));
return Clss;
}
SDK::UClass* SDK::ABuildingWeakSpot::StaticClass() {
static class UClass* Clss = nullptr;
@@ -19,7 +19,7 @@ namespace SDK {
// VALUES
class AFortAthenaVehicle* GetVehicle() {
if (SDK::IsValidPointer(this) == false) return nullptr;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::VehiclePawnState::Vehicle == -0x1) return nullptr;
return (AFortAthenaVehicle*)(*(uintptr_t*)((uintptr_t)this + SDK::Cached::Offsets::VehiclePawnState::Vehicle));
}
};
@@ -29,7 +29,7 @@ namespace SDK {
// VALUES
void SetChargeRate(float NewChargeRate, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRechargingActionTimer::ChargeRate == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRechargingActionTimer::ChargeRate), AutoRevertFeature);
@@ -39,7 +39,7 @@ namespace SDK {
}
void SetActiveExpenseRate(float NewActiveExpenseRate, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRechargingActionTimer::ActiveExpenseRate == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRechargingActionTimer::ActiveExpenseRate), AutoRevertFeature);
@@ -49,7 +49,7 @@ namespace SDK {
}
void SetPassiveExpenseRate(float NewPassiveExpenseRate, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRechargingActionTimer::PassiveExpenseRate == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRechargingActionTimer::PassiveExpenseRate), AutoRevertFeature);
@@ -59,7 +59,7 @@ namespace SDK {
}
void SetCharge(float NewCharge) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRechargingActionTimer::Charge == -0x1) return;
*(float*)((uintptr_t)this + SDK::Cached::Offsets::FortRechargingActionTimer::Charge) = NewCharge;
}
};
@@ -69,7 +69,7 @@ namespace SDK {
// VALUES
void SetReloadTime(float NewReloadTime, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::ReloadTime == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::ReloadTime), AutoRevertFeature);
@@ -84,7 +84,7 @@ namespace SDK {
// VALUES
void SetSpread(float NewSpread, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::Spread == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::Spread), AutoRevertFeature);
@@ -94,7 +94,7 @@ namespace SDK {
}
void SetSpreadDownsights(float NewSpreadDownsights, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::SpreadDownsights == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::SpreadDownsights), AutoRevertFeature);
@@ -104,7 +104,7 @@ namespace SDK {
}
void SetStandingStillSpreadMultiplier(float NewStandingStillSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::StandingStillSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::StandingStillSpreadMultiplier), AutoRevertFeature);
@@ -114,7 +114,7 @@ namespace SDK {
}
void SetAthenaCrouchingSpreadMultiplier(float NewAthenaCrouchingSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::AthenaCrouchingSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::AthenaCrouchingSpreadMultiplier), AutoRevertFeature);
@@ -124,7 +124,7 @@ namespace SDK {
}
void SetAthenaJumpingFallingSpreadMultiplier(float NewAthenaJumpingFallingSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::AthenaJumpingFallingSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::AthenaJumpingFallingSpreadMultiplier), AutoRevertFeature);
@@ -134,7 +134,7 @@ namespace SDK {
}
void SetAthenaSprintingSpreadMultiplier(float NewAthenaSprintingSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::AthenaSprintingSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::AthenaSprintingSpreadMultiplier), AutoRevertFeature);
@@ -144,7 +144,7 @@ namespace SDK {
}
void SetMinSpeedForSpreadMultiplier(float NewMinSpeedForSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::MinSpeedForSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::MinSpeedForSpreadMultiplier), AutoRevertFeature);
@@ -154,7 +154,7 @@ namespace SDK {
}
void SetMaxSpeedForSpreadMultiplier(float NewMaxSpeedForSpreadMultiplier, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::MaxSpeedForSpreadMultiplier == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::MaxSpeedForSpreadMultiplier), AutoRevertFeature);
@@ -164,7 +164,7 @@ namespace SDK {
}
void SetRecoilVert(float NewRecoilVert, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::RecoilVert == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::RecoilVert), AutoRevertFeature);
@@ -174,7 +174,7 @@ namespace SDK {
}
void SetRecoilHoriz(float NewRecoilHoriz, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::RecoilHoriz == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::RecoilHoriz), AutoRevertFeature);
@@ -184,7 +184,7 @@ namespace SDK {
}
void SetBulletsPerCartridge(int32 NewBulletsPerCartridge, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortRangedWeaponStats::BulletsPerCartridge == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<int32>((int32*)((uintptr_t)this + SDK::Cached::Offsets::FortRangedWeaponStats::BulletsPerCartridge), AutoRevertFeature);
@@ -200,12 +200,12 @@ namespace SDK {
// VALUES
float GetSwingPlaySpeed() {
if (SDK::IsValidPointer(this) == false) return 0;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortMeleeWeaponStats::SwingPlaySpeed == -0x1) return 0;
return *(float*)((uintptr_t)this + SDK::Cached::Offsets::FortMeleeWeaponStats::SwingPlaySpeed);
}
void SetSwingPlaySpeed(float NewSwingPlaySpeed, bool* AutoRevertFeature = nullptr) {
if (SDK::IsValidPointer(this) == false) return;
if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortMeleeWeaponStats::SwingPlaySpeed == -0x1) return;
if (AutoRevertFeature) {
Features::CreateAutoRevertFeature<float>((float*)((uintptr_t)this + SDK::Cached::Offsets::FortMeleeWeaponStats::SwingPlaySpeed), AutoRevertFeature);
+18 -1
View File
@@ -67,6 +67,7 @@ void SDK::Init() {
// Init CalculateShot function offset (requires game version)
SDKInitializer::InitCalculateShot();
SDKInitializer::InitRaycastMulti();
// Continue initiating VFT Indexes
SDKInitializer::InitDTIndex();
@@ -93,9 +94,11 @@ void SDK::Init() {
FunctionSearch { std::string(skCrypt("Controller")), std::string(skCrypt("ClientSetRotation")), &SDK::Cached::Functions::PlayerController::ClientSetRotation },
FunctionSearch { std::string(skCrypt("Controller")), std::string(skCrypt("SetControlRotation")), &SDK::Cached::Functions::PlayerController::SetControlRotation },
FunctionSearch { std::string(skCrypt("KismetSystemLibrary")), std::string(skCrypt("LineTraceSingle")), &SDK::Cached::Functions::KismetSystemLibrary::LineTraceSingle },
FunctionSearch { std::string(skCrypt("KismetMaterialLibrary")), std::string(skCrypt("CreateDynamicMaterialInstance")),&SDK::Cached::Functions::KismetMaterialLibrary::CreateDynamicMaterialInstance},
FunctionSearch { std::string(skCrypt("KismetMathLibrary")), std::string(skCrypt("FindLookAtRotation")), &SDK::Cached::Functions::KismetMathLibrary::FindLookAtRotation },
FunctionSearch { std::string(skCrypt("KismetMathLibrary")), std::string(skCrypt("GetForwardVector")), &SDK::Cached::Functions::KismetMathLibrary::GetForwardVector },
FunctionSearch { std::string(skCrypt("KismetMathLibrary")), std::string(skCrypt("GetRightVector")), &SDK::Cached::Functions::KismetMathLibrary::GetRightVector },
FunctionSearch { std::string(skCrypt("KismetMathLibrary")), std::string(skCrypt("FMod")), &SDK::Cached::Functions::KismetMathLibrary::FMod },
FunctionSearch { std::string(skCrypt("PlayerState")), std::string(skCrypt("GetPlayerName")), &SDK::Cached::Functions::PlayerState::GetPlayerName },
FunctionSearch { std::string(skCrypt("SkinnedMeshComponent")), std::string(skCrypt("GetBoneName")), &SDK::Cached::Functions::SkinnedMeshComponent::GetBoneName },
FunctionSearch { std::string(skCrypt("SceneComponent")), std::string(skCrypt("GetSocketLocation")), &SDK::Cached::Functions::SkinnedMeshComponent::GetSocketLocation },
@@ -109,11 +112,14 @@ void SDK::Init() {
FunctionSearch { std::string(skCrypt("FortWeapon")), std::string(skCrypt("IsProjectileWeapon")), &SDK::Cached::Functions::FortWeapon::IsProjectileWeapon },
FunctionSearch { std::string(skCrypt("FortWeapon")), std::string(skCrypt("GetProjectileSpeed")), &SDK::Cached::Functions::FortWeapon::GetProjectileSpeed },
FunctionSearch { std::string(skCrypt("FortPlayerPawn")), std::string(skCrypt("ServerHandlePickup")), &SDK::Cached::Functions::FortPlayerPawn::ServerHandlePickup },
FunctionSearch { std::string(skCrypt("MeshComponent")), std::string(skCrypt("GetMaterials")), &SDK::Cached::Functions::MeshComponent::GetMaterials },
FunctionSearch { std::string(skCrypt("PrimitiveComponent")), std::string(skCrypt("SetMaterial")), &SDK::Cached::Functions::PrimitiveComponent::SetMaterial },
};
std::vector<OffsetSearch> Offsets{
OffsetSearch { std::string(skCrypt("GameViewportClient")), std::string(skCrypt("GameInstance")), &SDK::Cached::Offsets::GameViewportClient::GameInstance, nullptr },
OffsetSearch { std::string(skCrypt("Engine")), std::string(skCrypt("GameViewport")), &SDK::Cached::Offsets::Engine::GameViewport, nullptr },
OffsetSearch { std::string(skCrypt("Engine")), std::string(skCrypt("WireframeMaterial")), &SDK::Cached::Offsets::Engine::WireframeMaterial, nullptr },
OffsetSearch { std::string(skCrypt("GameViewportClient")), std::string(skCrypt("World")), &SDK::Cached::Offsets::GameViewportClient::World, nullptr },
OffsetSearch { std::string(skCrypt("GameInstance")), std::string(skCrypt("LocalPlayers")), &SDK::Cached::Offsets::GameInstance::LocalPlayers, nullptr },
OffsetSearch { std::string(skCrypt("Player")), std::string(skCrypt("PlayerController")), &SDK::Cached::Offsets::Player::PlayerController, nullptr },
@@ -123,6 +129,11 @@ void SDK::Init() {
OffsetSearch { std::string(skCrypt("Pawn")), std::string(skCrypt("PlayerState")), &SDK::Cached::Offsets::Pawn::PlayerState, nullptr },
OffsetSearch { std::string(skCrypt("Character")), std::string(skCrypt("Mesh")), &SDK::Cached::Offsets::Character::Mesh, nullptr },
OffsetSearch { std::string(skCrypt("Font")), std::string(skCrypt("LegacyFontSize")), &SDK::Cached::Offsets::Font::LegacyFontSize, nullptr },
OffsetSearch { std::string(skCrypt("HitResult")), std::string(skCrypt("TraceStart")), &SDK::Cached::Offsets::HitResult::TraceStart, nullptr },
OffsetSearch { std::string(skCrypt("HitResult")), std::string(skCrypt("Distance")), &SDK::Cached::Offsets::HitResult::Distance, nullptr },
OffsetSearch { std::string(skCrypt("World")), std::string(skCrypt("GameState")), &SDK::Cached::Offsets::World::GameState, nullptr },
OffsetSearch { std::string(skCrypt("FortPickup")), std::string(skCrypt("PrimaryPickupItemEntry")), &SDK::Cached::Offsets::FortPickup::PrimaryPickupItemEntry, nullptr },
OffsetSearch { std::string(skCrypt("FortItemDefinition")), std::string(skCrypt("DisplayName")), &SDK::Cached::Offsets::FortItemDefinition::DisplayName, nullptr },
@@ -133,10 +144,12 @@ void SDK::Init() {
OffsetSearch { std::string(skCrypt("Canvas")), std::string(skCrypt("SizeY")), &SDK::Cached::Offsets::Canvas::SizeY, nullptr },
OffsetSearch { std::string(skCrypt("FortPawn")), std::string(skCrypt("CurrentWeapon")), &SDK::Cached::Offsets::FortPawn::CurrentWeapon, nullptr },
OffsetSearch { std::string(skCrypt("FortPawn")), std::string(skCrypt("bIsDying")), &SDK::Cached::Offsets::FortPawn::bIsDying, &SDK::Cached::Masks::FortPawn::bIsDying },
OffsetSearch { std::string(skCrypt("FortPlayerPawn")), std::string(skCrypt("VehicleStateLocal")), &SDK::Cached::Offsets::FortPawn::VehicleStateLocal, nullptr },
OffsetSearch { std::string(skCrypt("FortPlayerPawn")), std::string(skCrypt("VehicleStateLocal")), &SDK::Cached::Offsets::FortPlayerPawn::VehicleStateLocal, nullptr },
OffsetSearch { std::string(skCrypt("FortPlayerPawnAthena")), std::string(skCrypt("bADSWhileNotOnGround")), &SDK::Cached::Offsets::FortPlayerPawnAthena::bADSWhileNotOnGround,nullptr },
OffsetSearch { std::string(skCrypt("BuildingWeakSpot")), std::string(skCrypt("bHit")), &SDK::Cached::Offsets::BuildingWeakSpot::WeakSpotInfoBitField, nullptr },
OffsetSearch { std::string(skCrypt("FortWeapon")), std::string(skCrypt("WeaponData")), &SDK::Cached::Offsets::FortWeapon::WeaponData, nullptr },
OffsetSearch { std::string(skCrypt("FortWeapon")), std::string(skCrypt("LastFireTime")), &SDK::Cached::Offsets::FortWeapon::LastFireTime, nullptr },
OffsetSearch { std::string(skCrypt("FortWeapon")), std::string(skCrypt("bIgnoreTryToFireSlotCooldownRestriction")), &SDK::Cached::Offsets::FortWeapon::bIgnoreTryToFireSlotCooldownRestriction, nullptr },
OffsetSearch { std::string(skCrypt("FortPlayerController")), std::string(skCrypt("bBuildFree")), &SDK::Cached::Offsets::FortPlayerController::bBuildFree, &SDK::Cached::Masks::FortPlayerController::bBuildFree },
OffsetSearch { std::string(skCrypt("FortPlayerController")), std::string(skCrypt("bInfiniteAmmo")), &SDK::Cached::Offsets::FortPlayerController::bInfiniteAmmo, &SDK::Cached::Masks::FortPlayerController::bInfiniteAmmo },
@@ -179,6 +192,8 @@ void SDK::Init() {
Offsets.push_back(OffsetSearch{ std::string(skCrypt("FortAthenaAntelopeVehicle")), std::string(skCrypt("FortAntelopeVehicleConfigs")), &SDK::Cached::Offsets::FortAthenaAntelopeVehicle::FortAntelopeVehicleConfigs, nullptr });
Offsets.push_back(OffsetSearch{ std::string(skCrypt("FortAthenaJackalVehicle")), std::string(skCrypt("BoostTimers")), &SDK::Cached::Offsets::FortAthenaJackalVehicle::BoostTimers, nullptr });
Offsets.push_back(OffsetSearch{ std::string(skCrypt("FortGameStateAthena")), std::string(skCrypt("DefaultGliderRedeployCanRedeploy")), &SDK::Cached::Offsets::FortGameStateAthena::DefaultGliderRedeployCanRedeploy, nullptr });
}
if (SDK::GetGameVersion() >= 7.00) {
@@ -201,6 +216,8 @@ void SDK::Init() {
Input::Init();
Features::FortPawnHelper::Bone::Init();
DEBUG_LOG(LOG_OFFSET, std::string(skCrypt("SDK Initialized!")));
#if OBJECT_DUMP
for (int i = 0; i < SDK::UObject::ObjectArray.Num(); i++) {
SDK::UObject* Object = SDK::UObject::ObjectArray.GetByIndex(i);
+130 -93
View File
@@ -14,249 +14,286 @@ namespace SDK {
}
namespace Offsets {
namespace World {
inline uintptr_t GameState = -0x1;
}
namespace Canvas {
inline uintptr_t SizeX;
inline uintptr_t SizeY;
inline uintptr_t SizeX = -0x1;
inline uintptr_t SizeY = -0x1;
}
namespace Character {
inline uintptr_t Mesh;
inline uintptr_t Mesh = -0x1;
}
namespace Pawn {
inline uintptr_t PlayerState;
inline uintptr_t PlayerState = -0x1;
}
namespace FortPawn {
inline uintptr_t bIsDying;
inline uintptr_t CurrentWeapon;
inline uintptr_t VehicleStateLocal;
inline uintptr_t bIsDying = -0x1;
inline uintptr_t CurrentWeapon = -0x1;
}
namespace FortPlayerPawn {
inline uintptr_t VehicleStateLocal = -0x1;
}
namespace FortPlayerPawnAthena {
inline uintptr_t bADSWhileNotOnGround = -0x1;
}
namespace Font {
inline uintptr_t LegacyFontSize;
inline uintptr_t LegacyFontSize = -0x1;
}
namespace Engine {
inline uintptr_t GameViewport;
inline uintptr_t GameViewport = -0x1;
inline uintptr_t WireframeMaterial = -0x1;
}
namespace GameViewportClient {
inline uintptr_t World;
inline uintptr_t GameInstance; // DO NOT DELETE! Required for getting PostRender VFT index
inline uintptr_t World = -0x1;
inline uintptr_t GameInstance = -0x1; // DO NOT DELETE! Required for getting PostRender VFT index
}
namespace GameInstance {
inline uintptr_t LocalPlayers;
inline uintptr_t LocalPlayers = -0x1;
}
namespace Player {
inline uintptr_t PlayerController;
inline uintptr_t PlayerController = -0x1;
}
namespace PlayerController {
inline uintptr_t AcknowledgedPawn;
inline uintptr_t PlayerCameraManager;
inline uintptr_t AcknowledgedPawn = -0x1;
inline uintptr_t PlayerCameraManager = -0x1;
}
namespace HUD {
inline uintptr_t Canvas;
inline uintptr_t Canvas = -0x1;
}
namespace HitResult {
inline uintptr_t TraceStart = -0x1;
inline uintptr_t Distance = -0x1;
}
namespace FortItemEntry {
inline uintptr_t ItemDefinition;
inline uintptr_t ItemDefinition = -0x1;
}
namespace FortPickup {
inline uintptr_t PrimaryPickupItemEntry;
inline uintptr_t PrimaryPickupItemEntry = -0x1;
}
namespace FortWeapon {
inline uintptr_t WeaponData;
inline uintptr_t WeaponData = -0x1;
inline uintptr_t LastFireTime;
inline uintptr_t LastFireTimeVerified;
inline uintptr_t LastFireTime = -0x1;
inline uintptr_t LastFireTimeVerified = -0x1;
inline uintptr_t bIgnoreTryToFireSlotCooldownRestriction = -0x1;
}
namespace FortItemDefinition {
inline uintptr_t DisplayName;
inline uintptr_t Tier;
inline uintptr_t DisplayName = -0x1;
inline uintptr_t Tier = -0x1;
}
namespace Actor {
inline uintptr_t RootComponent;
inline uintptr_t RootComponent = -0x1;
}
namespace SceneComponent {
inline uintptr_t RelativeLocation;
inline uintptr_t RelativeLocation = -0x1;
}
namespace FortPlayerStateAthena {
inline uintptr_t TeamIndex;
inline uintptr_t TeamIndex = -0x1;
}
namespace BuildingWeakSpot {
inline uintptr_t WeakSpotInfoBitField;
inline uintptr_t WeakSpotInfoBitField = -0x1;
}
namespace MinimalViewInfo {
inline uintptr_t Location;
inline uintptr_t Rotation;
inline uintptr_t Location = -0x1;
inline uintptr_t Rotation = -0x1;
}
namespace FortMeleeWeaponStats {
inline uintptr_t SwingPlaySpeed;
inline uintptr_t SwingPlaySpeed = -0x1;
}
namespace FortRangedWeaponStats {
inline uintptr_t Spread;
inline uintptr_t SpreadDownsights;
inline uintptr_t StandingStillSpreadMultiplier;
inline uintptr_t AthenaCrouchingSpreadMultiplier;
inline uintptr_t AthenaJumpingFallingSpreadMultiplier;
inline uintptr_t AthenaSprintingSpreadMultiplier;
inline uintptr_t MinSpeedForSpreadMultiplier;
inline uintptr_t MaxSpeedForSpreadMultiplier;
inline uintptr_t Spread = -0x1;
inline uintptr_t SpreadDownsights = -0x1;
inline uintptr_t StandingStillSpreadMultiplier = -0x1;
inline uintptr_t AthenaCrouchingSpreadMultiplier = -0x1;
inline uintptr_t AthenaJumpingFallingSpreadMultiplier = -0x1;
inline uintptr_t AthenaSprintingSpreadMultiplier = -0x1;
inline uintptr_t MinSpeedForSpreadMultiplier = -0x1;
inline uintptr_t MaxSpeedForSpreadMultiplier = -0x1;
inline uintptr_t BulletsPerCartridge;
inline uintptr_t ReloadTime;
inline uintptr_t RecoilVert;
inline uintptr_t RecoilHoriz;
inline uintptr_t BulletsPerCartridge = -0x1;
inline uintptr_t ReloadTime = -0x1;
inline uintptr_t RecoilVert = -0x1;
inline uintptr_t RecoilHoriz = -0x1;
}
namespace FortAthenaAntelopeVehicle {
inline uintptr_t FortAntelopeVehicleConfigs;
inline uintptr_t FortAntelopeVehicleConfigs = -0x1;
}
namespace FortAthenaJackalVehicle {
inline uintptr_t BoostTimers;
inline uintptr_t BoostTimers = -0x1;
}
namespace FortAthenaDoghouseVehicle {
inline uintptr_t BoostAction;
inline uintptr_t BoostAction = -0x1;
}
namespace FortAntelopeVehicleConfigs {
inline uintptr_t BoostAccumulationRate;
inline uintptr_t BoostExpenseRate;
inline uintptr_t BoostAccumulationRate = -0x1;
inline uintptr_t BoostExpenseRate = -0x1;
}
namespace VehiclePawnState {
inline uintptr_t Vehicle;
inline uintptr_t Vehicle = -0x1;
}
namespace FortRechargingActionTimer {
inline uintptr_t ChargeRate;
inline uintptr_t ActiveExpenseRate;
inline uintptr_t PassiveExpenseRate;
inline uintptr_t Charge;
inline uintptr_t ChargeRate = -0x1;
inline uintptr_t ActiveExpenseRate = -0x1;
inline uintptr_t PassiveExpenseRate = -0x1;
inline uintptr_t Charge = -0x1;
}
namespace BuildingActor {
inline uintptr_t TeamIndex;
inline uintptr_t TeamIndex = -0x1;
}
namespace FortPlayerController {
inline uintptr_t bBuildFree;
inline uintptr_t bInfiniteAmmo;
inline uintptr_t TargetedBuilding;
inline uintptr_t bBuildFree = -0x1;
inline uintptr_t bInfiniteAmmo = -0x1;
inline uintptr_t TargetedBuilding = -0x1;
}
namespace FortGameStateAthena {
inline uintptr_t DefaultGliderRedeployCanRedeploy = -0x1;
}
}
namespace Functions {
namespace SceneComponent {
inline void* SetPhysicsLinearVelocity;
inline void* SetPhysicsLinearVelocity = nullptr;
}
namespace PrimitiveComponent {
inline void* SetMaterial = nullptr;
}
namespace MeshComponent {
inline void* GetMaterials = nullptr;
}
namespace Actor {
inline void* K2_TeleportTo;
inline void* K2_SetActorRotation;
inline void* K2_SetActorLocation;
inline void* SetActorEnableCollision;
inline void* K2_TeleportTo = nullptr;
inline void* K2_SetActorRotation = nullptr;
inline void* K2_SetActorLocation = nullptr;
inline void* SetActorEnableCollision = nullptr;
}
namespace Pawn {
inline void* GetMovementComponent;
inline void* GetMovementComponent = nullptr;
}
namespace MovementComponent {
inline void* StopMovementImmediately;
inline void* StopMovementImmediately = nullptr;
}
namespace Canvas {
inline void* K2_DrawLine;
inline void* K2_DrawText;
inline void* K2_TextSize;
inline void* K2_Project;
inline void* K2_DrawBox;
inline void* K2_DrawLine = nullptr;
inline void* K2_DrawText = nullptr;
inline void* K2_TextSize = nullptr;
inline void* K2_Project = nullptr;
inline void* K2_DrawBox = nullptr;
}
namespace KismetSystemLibrary {
inline void* GetEngineVersion;
inline void* LineTraceSingle;
inline void* GetEngineVersion = nullptr;
inline void* LineTraceSingle = nullptr;
}
namespace KismetMaterialLibrary {
inline void* CreateDynamicMaterialInstance = nullptr;
}
namespace KismetMathLibrary {
inline void* FindLookAtRotation;
inline void* GetForwardVector;
inline void* GetRightVector;
inline void* FindLookAtRotation = nullptr;
inline void* GetForwardVector = nullptr;
inline void* GetRightVector = nullptr;
inline void* FMod = nullptr;
}
namespace GameplayStatics {
inline void* GetAllActorsOfClass;
inline void* GetAllActorsOfClass = nullptr;
}
namespace PlayerCameraManager {
inline void* GetCameraLocation;
inline void* GetCameraRotation;
inline void* GetFOVAngle;
inline void* GetCameraLocation = nullptr;
inline void* GetCameraRotation = nullptr;
inline void* GetFOVAngle = nullptr;
}
namespace PlayerController {
inline void* WasInputKeyJustReleased;
inline void* WasInputKeyJustPressed;
inline void* IsInputKeyDown;
inline void* ClientSetRotation;
inline void* SetControlRotation;
inline void* GetMousePosition;
inline void* WasInputKeyJustReleased = nullptr;
inline void* WasInputKeyJustPressed = nullptr;
inline void* IsInputKeyDown = nullptr;
inline void* ClientSetRotation = nullptr;
inline void* SetControlRotation = nullptr;
inline void* GetMousePosition = nullptr;
}
namespace PlayerState {
inline void* GetPlayerName;
inline void* GetPlayerName = nullptr;
}
namespace SkinnedMeshComponent {
inline void* GetBoneName;
inline void* GetSocketLocation;
inline void* GetBoneName = nullptr;
inline void* GetSocketLocation = nullptr;
}
namespace FortWeapon {
inline void* IsProjectileWeapon;
inline void* GetProjectileSpeed;
inline void* IsProjectileWeapon = nullptr;
inline void* GetProjectileSpeed = nullptr;
}
namespace FortPlayerPawn {
inline void* ServerHandlePickup;
inline void* ServerHandlePickup = nullptr;
}
namespace BuildingActor {
inline void* SetTeam;
inline void* SetTeam = nullptr;
}
inline uintptr_t AppendString = 0x0;
inline uintptr_t FNameConstructor = 0x0;
inline uintptr_t LineTraceSingle = 0x0;
inline uintptr_t CalculateShot = 0x0;
inline uintptr_t RaycastMulti = 0x0;
}
namespace Masks {
namespace FortPawn{
inline uintptr_t bIsDying;
inline uintptr_t bIsDying = -0x1;
}
namespace FortPlayerController {
inline uintptr_t bBuildFree;
inline uintptr_t bInfiniteAmmo;
inline uintptr_t bBuildFree = -0x1;
inline uintptr_t bInfiniteAmmo = -0x1;
}
}
}
+57 -11
View File
@@ -115,10 +115,11 @@ void SDKInitializer::InitDTIndex() {
}
if (Vft == nullptr) {
THROW_ERROR(std::string(skCrypt("Failed to find VFT for UGameViewportClient!")), false);
THROW_ERROR(std::string(skCrypt("Failed to find VFT for UGameViewportClient!")), true);
return;
}
uintptr_t GameInstance = 0;
uintptr_t GameInstance = -0x1;
std::vector<FunctionSearch> Functions = {};
std::vector<OffsetSearch> Offsets = { OffsetSearch{ std::string(skCrypt("GameViewportClient")), std::string(skCrypt("GameInstance")), &GameInstance, nullptr }};
@@ -220,6 +221,7 @@ void SDKInitializer::InitGPVIndex() {
if (Vft == nullptr) {
THROW_ERROR(std::string(skCrypt("Failed to find VFT for APlayerController!")), CRASH_ON_NOT_FOUND);
return;
}
auto Resolve32BitRelativeJump = [](void* FunctionPtr) -> uint8_t*
@@ -258,8 +260,9 @@ void SDKInitializer::InitGPVIndex() {
// Signature for UE5 builds (19.00+)
|| (SDK::GetGameVersion() >= 19.00 && Memory::FindPatternInRange({ 0x48, 0x81, 0xEC, -0x01, -0x01, 0x00, 0x00 }, Resolve32BitRelativeJump(Vft[i]), 0x70)
&& (Memory::FindPatternInRange({ 0x44, 0x0F, -0x01, -0x01, -0x01, -0x01, 0x44, 0x0F, -0x01, -0x01, -0x01, -0x01 }, Resolve32BitRelativeJump(Vft[i]), 0x70)
|| Memory::FindPatternInRange({ 0x44, 0x0F, -0x01, -0x01, -0x01, 0x44, 0x0F, -0x01, -0x01, -0x01 }, Resolve32BitRelativeJump(Vft[i]), 0x70))
&& Memory::FindPatternInRange({ 0x48, 0x8B, -0x01, -0x01, 0x48, 0x8B }, Resolve32BitRelativeJump(Vft[i]), 0x70)
&& (Memory::FindPatternInRange({ 0x44, 0x0F, -0x01, -0x01, -0x01, -0x01, 0x44 }, Resolve32BitRelativeJump(Vft[i]), 0x70)
|| Memory::FindPatternInRange({ 0x44, 0x0F, -0x01, -0x01, -0x01, 0x44, 0x0F }, Resolve32BitRelativeJump(Vft[i]), 0x70))
)
)
{
@@ -334,7 +337,7 @@ void SDKInitializer::InitGetWeaponStatsIndex(const SDK::UObject* WeaponActor) {
}
if (SDK::Cached::VFT::GetWeaponStats == 0x0) {
THROW_ERROR(std::string(skCrypt("Failed to find GetWeaponStats VFT index! (Using fall back VFT index, may cause crashes)")), CRASH_ON_NOT_FOUND);
THROW_ERROR(std::string(skCrypt("Failed to find GetWeaponStats VFT index! (Using fall back VFT index, may cause crashes)")), false);
// This is usually the VFT index for GetWeaponStats, but it's not guaranteed
// Later, make it follow the jnz to find the sub routine
@@ -413,48 +416,69 @@ void SDKInitializer::InitLineTraceSingle() {
void SDKInitializer::InitCalculateShot() {
uintptr_t CalculateShotAddress = 0x0;
if (SDK::GetGameVersion() > 16.00) {
if (SDK::GetGameVersion() >= 16.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 8B C4 48 89 58 18 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70 B8 0F 29 78 A8 44 0F 29 40 ? 44 0F 29 48 ? 44 0F 29 90 ? ? ? ? 44 0F 29 98 ? ? ? ? 44 0F 29 A0 ? ? ? ? 44 0F 29 A8 ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 85 ? ? ? ? 4C 8D A1"),
0,
false);
}
else if (SDK::GetGameVersion() > 14.00) {
else if (SDK::GetGameVersion() >= 14.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 89 5C 24 ? 4C 89 4C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B F9 4C"),
0,
false);
}
else if (SDK::GetGameVersion() > 12.00) {
else if (SDK::GetGameVersion() >= 12.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 89 5C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 4C 89 4C 24 ? 55 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B F1 4C 8D"),
0,
false);
}
else if (SDK::GetGameVersion() > 11.00) {
else if (SDK::GetGameVersion() >= 11.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 8B C4 48 89 58 10 4C 89 48 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 98"),
0,
false);
}
else if (SDK::GetGameVersion() > 8.00) {
else if (SDK::GetGameVersion() >= 8.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 8B C4 48 89 58 10 4C 89 48 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 68 98"),
0,
false);
}
else if (SDK::GetGameVersion() > 7.00) {
else if (SDK::GetGameVersion() >= 7.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 8B C4 48 89 58 10 48 89 70 18 55 57 41 54 41 56 41 57 48 8D 68 88"),
0,
false);
}
else if (SDK::GetGameVersion() >= 4.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 54 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 44 0F"),
0,
false);
}
else if (SDK::GetGameVersion() >= 3.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 8B C4 48 89 58 10 48 89 70 18 55 57 41 54 41 56 41 57 48 8D 68 88"),
0,
false);
}
else if (SDK::GetGameVersion() >= 1.00) {
CalculateShotAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 89 5C 24 ? 48 89 74 24 ? 55 57 41 54 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 44 0F"),
0,
false);
}
if (CalculateShotAddress) {
SDK::Cached::Functions::CalculateShot = CalculateShotAddress - SDK::GetBaseAddress();
@@ -465,6 +489,28 @@ void SDKInitializer::InitCalculateShot() {
THROW_ERROR(std::string(skCrypt("Failed to find CalculateShot!")), false);
}
}
void SDKInitializer::InitRaycastMulti() {
uintptr_t RaycastMultiAddress = 0x0;
#if SEASON_20_PLUS
// TO-DO: Find a better pattern for RaycastMulti on Season 20+ builds
#else
RaycastMultiAddress = Memory::PatternScan(
SDK::GetBaseAddress(),
skCrypt("48 89 44 24 ? 48 8B 84 24 ? ? ? ? 48 89 44 24 ? 48 8B 44 24 ? 48 89 44 24 ? 8B 44 24 70 89 44 24 20 E8 ? ? ? ?"),
41,
true);
#endif
if (RaycastMultiAddress) {
SDK::Cached::Functions::RaycastMulti = RaycastMultiAddress - SDK::GetBaseAddress();
DEBUG_LOG(LOG_OFFSET, std::string(skCrypt("RaycastMulti offset found: ")) + std::to_string(SDK::Cached::Functions::RaycastMulti));
}
else {
THROW_ERROR(std::string(skCrypt("Failed to find RaycastMulti!")), false);
}
}
void SDKInitializer::InitGObjects() {
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Searching for GObjects...")));
@@ -97,6 +97,9 @@ public:
/* Update the CalculateShot function offset (for bullet tp) */
static void InitCalculateShot();
/* Update the RaycastMulti functino offset (for bullet tp v2) */
static void InitRaycastMulti();
/* Update the DrawTransition VFT index (for engine rendering, and on ImGui builds for caching draw data) */
static void InitDTIndex();
@@ -2,7 +2,7 @@
#include "../../Game/Features/Aimbot/Aimbot.h"
SDK::FTransform* Hooks::CalculateShot::CalculateShotHook(void** FortPlayerPawnCalculateShotVFT, uintptr_t arg1, uintptr_t arg2) {
SDK::FTransform* Hooks::CalculateShot::CalculateShot(void** FortPlayerPawnCalculateShotVFT, uintptr_t arg1, uintptr_t arg2) {
SDK::FTransform* ReturnValue = CalculateShotOriginal(FortPlayerPawnCalculateShotVFT, arg1, arg2);
if (SDK::IsValidPointer(ReturnValue)) {
@@ -8,6 +8,8 @@
#include "../../Utilities/Logger.h"
#include "../../Utilities/Math.h"
#include <algorithm>
void Hooks::DrawTransition::DrawTransition(uintptr_t this_, uintptr_t Canvas) {
if (Canvas == 0x0) {
return DrawTransitionOriginal(this_, Canvas);
@@ -24,7 +26,7 @@ void Hooks::DrawTransition::DrawTransition(uintptr_t this_, uintptr_t Canvas) {
Game::ScreenCenterY = Game::ScreenHeight / 2.f;
// Clamp the FOV to fix target issues on extreme FOV's. This does make it inaccurate 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)))));
Game::PixelsPerDegree = Game::ScreenWidth / Math::RadiansToDegrees((2 * tan(0.5f * Math::DegreesToRadians(std::clamp(Actors::MainCamera.FOV, 0.f, 120.f)))));
Hooks::Tick();
@@ -9,5 +9,5 @@ void Hooks::GetPlayerViewpoint::GetPlayerViewpoint(void* this_, SDK::FVector* Lo
GetPlayerViewpointOriginal(this_, Location, Rotation);
//spoof_call<void>(GetPlayerViewpointOriginal, this_, Location, Rotation);
Features::Aimbot::GetPlayerViewpointCallback(Rotation);
Features::Aimbot::GetPlayerViewpointCallback(Location, Rotation);
}
@@ -0,0 +1,11 @@
#include "../Hooks.h"
#include "../../Game/Features/Aimbot/Aimbot.h"
bool Hooks::RaycastMulti::RaycastMulti(SDK::UWorld* World, SDK::TArray<SDK::FHitResult>& OutHits, const SDK::FVector Start, const SDK::FVector End, SDK::ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams) {
bool Original = RaycastMultiOriginal(World, OutHits, Start, End, TraceChannel, Params, ResponseParams, ObjectParams);
Features::Aimbot::RaycastMultiCallback(World, OutHits, TraceChannel);
return Original;
}
+81 -9
View File
@@ -7,9 +7,9 @@
#include "../External-Libs/LazyImporter.h"
#include "../Utilities/Logger.h"
#include "../Utilities/Error.h"
#include "../Configs/Config.h"
#include "../Utilities/Memory.h"
#include "RaaxDx/minhook/include/MinHook.h"
template <typename T>
@@ -49,22 +49,25 @@ Hooks::VFTHook::~VFTHook() {
}
void Hooks::Init() {
MH_Initialize();
MH_STATUS CreateCalculateShotHook = MH_CreateHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()), &Hooks::CalculateShot::CalculateShotHook, (void**)&Hooks::CalculateShot::CalculateShotOriginal);
MH_STATUS EnableCalculateShotHook = MH_EnableHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()));
if (CreateCalculateShotHook != MH_OK || EnableCalculateShotHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to hook CalculateShot! Create Status: ")) + std::to_string(CreateCalculateShotHook) + std::string(skCrypt(" Enable Status: ")) + std::to_string(EnableCalculateShotHook));
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Initializing Hooks...")));
MH_STATUS InitStats = MH_Initialize();
if (InitStats != MH_OK && InitStats != MH_ERROR_ALREADY_INITIALIZED) {
THROW_ERROR(std::string(skCrypt("Failed to init MinHook!")), true);
}
if (SDK::Cached::VFT::DrawTransition) {
if (SDK::Cached::VFT::DrawTransition && SDK::IsValidPointer(SDK::GetEngine()->GameViewport())) {
DrawTransition::Hook = new Hooks::VFTHook(
SDK::GetEngine()->GameViewport()->Vft,
SDK::Cached::VFT::DrawTransition,
Hooks::DrawTransition::DrawTransitionOriginal,
Hooks::DrawTransition::DrawTransition);
}
else {
THROW_ERROR(std::string(skCrypt("Failed to hook DrawTransition!")), true);
}
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Hooks Initialized!")));
}
void Hooks::Tick() {
if (Config::Aimbot::SilentAim && SDK::Cached::VFT::GetPlayerViewpoint != 0x0 && SDK::Cached::VFT::GetViewpoint != 0x0) {
@@ -109,4 +112,73 @@ void Hooks::Tick() {
Hooks::GetViewpoint::LocalPlayerHooked = nullptr;
}
}
if (SDK::Cached::Functions::CalculateShot) {
if (Config::Aimbot::BulletTP && Hooks::CalculateShot::Hooked == false) {
Hooks::CalculateShot::Hooked = true;
MH_STATUS CreateCalculateShotHook = MH_CreateHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()), &Hooks::CalculateShot::CalculateShot, (void**)&Hooks::CalculateShot::CalculateShotOriginal);
if (CreateCalculateShotHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to hook CalculateShot! Create Status: ")) + std::to_string(CreateCalculateShotHook));
}
MH_STATUS EnableCalculateShotHook = MH_EnableHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()));
if (EnableCalculateShotHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to hook CalculateShot! Enable Status: ")) + std::to_string(EnableCalculateShotHook));
}
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Hooked CalculateShot!")));
}
else if (Config::Aimbot::BulletTP == false && Hooks::CalculateShot::Hooked) {
Hooks::CalculateShot::Hooked = false;
MH_STATUS DisableCalculateShotHook = MH_DisableHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()));
if (DisableCalculateShotHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to unhook CalculateShot! Disable Status: ")) + std::to_string(DisableCalculateShotHook));
}
MH_STATUS RemoveCalculateShotHook = MH_RemoveHook((void*)(SDK::Cached::Functions::CalculateShot + SDK::GetBaseAddress()));
if (RemoveCalculateShotHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to unhook CalculateShot! Remove Status: ")) + std::to_string(RemoveCalculateShotHook));
}
Hooks::CalculateShot::CalculateShotOriginal = nullptr;
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Unhooked CalculateShot!")));
}
}
if (SDK::Cached::Functions::RaycastMulti) {
if (Config::Aimbot::BulletTPV2 && Hooks::RaycastMulti::Hooked == false) {
Hooks::RaycastMulti::Hooked = true;
MH_STATUS CreateRaycastMultiHook = MH_CreateHook((void*)(SDK::Cached::Functions::RaycastMulti + SDK::GetBaseAddress()), &Hooks::RaycastMulti::RaycastMulti, (void**)&Hooks::RaycastMulti::RaycastMultiOriginal);
if (CreateRaycastMultiHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to hook RaycastMulti! Create Status: ")) + std::to_string(CreateRaycastMultiHook));
}
MH_STATUS EnableRaycastMultiHook = MH_EnableHook((void*)(SDK::Cached::Functions::RaycastMulti + SDK::GetBaseAddress()));
if (EnableRaycastMultiHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to hook RaycastMulti! Enable Status: ")) + std::to_string(EnableRaycastMultiHook));
}
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Hooked RaycastMulti!")));
}
else if (Config::Aimbot::BulletTPV2 == false && Hooks::RaycastMulti::Hooked) {
Hooks::RaycastMulti::Hooked = false;
MH_STATUS DisableRaycastMultiHook = MH_DisableHook((void*)(SDK::Cached::Functions::RaycastMulti + SDK::GetBaseAddress()));
if (DisableRaycastMultiHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to unhook RaycastMulti! Disable Status: ")) + std::to_string(DisableRaycastMultiHook));
}
MH_STATUS RemoveRaycastMultiHook = MH_RemoveHook((void*)(SDK::Cached::Functions::RaycastMulti + SDK::GetBaseAddress()));
if (RemoveRaycastMultiHook != MH_OK) {
DEBUG_LOG(LOG_ERROR, std::string(skCrypt("Failed to unhook RaycastMulti! Remove Status: ")) + std::to_string(RemoveRaycastMultiHook));
}
Hooks::RaycastMulti::RaycastMultiOriginal = nullptr;
DEBUG_LOG(LOG_INFO, std::string(skCrypt("Unhooked RaycastMulti!")));
}
}
}
+14 -2
View File
@@ -5,14 +5,15 @@
#include <d3d11.h>
#include <dxgi.h>
#include <mutex>
#include "RaaxDx/RaaxDx.h"
#include "../External-Libs/ImGui/imgui.h"
#include "../External-Libs/ImGui/imgui_impl_win32.h"
#include "../External-Libs/ImGui/imgui_impl_dx11.h"
#include "RaaxDx/RaaxDx.h"
#endif
#include "../Game/SDK/Classes/Basic.h"
#include "../Game/SDK/Classes/Engine_Structs.h"
#include "../Game/SDK/Classes/Engine_Classes.h"
namespace Hooks {
// Virtual Function Table Hook
@@ -93,7 +94,18 @@ namespace Hooks {
using CalcShotParams = SDK::FTransform*(*)(void**, uintptr_t, uintptr_t);
inline CalcShotParams CalculateShotOriginal = nullptr;
SDK::FTransform* CalculateShotHook(void** arg0, uintptr_t arg1, uintptr_t arg2);
SDK::FTransform* CalculateShot(void** arg0, uintptr_t arg1, uintptr_t arg2);
inline bool Hooked = false;
}
namespace RaycastMulti {
using RaycastMultiParams = bool(*)(const SDK::UWorld* World, SDK::TArray<SDK::FHitResult>& OutHits, const SDK::FVector Start, const SDK::FVector End, SDK::ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams);
inline RaycastMultiParams RaycastMultiOriginal = nullptr;
bool RaycastMulti(SDK::UWorld* World, SDK::TArray<SDK::FHitResult>& OutHits, const SDK::FVector Start, const SDK::FVector End, SDK::ECollisionChannel TraceChannel, const struct FCollisionQueryParams& Params, const struct FCollisionResponseParams& ResponseParams, const struct FCollisionObjectQueryParams& ObjectParams);
inline bool Hooked = false;
}
namespace GetPlayerViewpoint {
+1 -1
View File
@@ -1,6 +1,6 @@
#pragma once
unsigned char RawFontData[1036584] = {
inline unsigned char RawFontData[1036584] = {
0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x04, 0x00, 0x90,
0x44, 0x53, 0x49, 0x47, 0xA8, 0xD2, 0x33, 0x4C, 0x00, 0x0D, 0x13, 0xB4,
0x00, 0x00, 0x1D, 0xB4, 0x47, 0x44, 0x45, 0x46, 0x07, 0x1E, 0x0A, 0xC7,
+1 -1
View File
@@ -91,5 +91,5 @@ inline std::ofstream Logger::File;
#define DEBUG_LOG(LogLevel, Message) Logger::Log(LogLevel, Message, __FILE__, __LINE__)
#else
#define DEBUG_LOG(LogLevel, Message) ((void)0)
#define DEBUG_LOG(LogLevel, Message)
#endif
+120
View File
@@ -0,0 +1,120 @@
#include "Math.h"
#include <cmath>
#include <emmintrin.h>
#include <algorithm>
#include "../Game/SDK/Classes/Engine_Classes.h"
#include "../Game/Game.h"
float Math::InvSqrt(float F) {
// Performs two passes of Newton-Raphson iteration on the hardware estimate
// v^-0.5 = x
// => x^2 = v^-1
// => 1/(x^2) = v
// => F(x) = x^-2 - v
// F'(x) = -2x^-3
// x1 = x0 - F(x0)/F'(x0)
// => x1 = x0 + 0.5 * (x0^-2 - Vec) * x0^3
// => x1 = x0 + 0.5 * (x0 - Vec * x0^3)
// => x1 = x0 + x0 * (0.5 - 0.5 * Vec * x0^2)
//
// This final form has one more operation than the legacy factorization (X1 = 0.5*X0*(3-(Y*X0)*X0)
// but retains better accuracy (namely InvSqrt(1) = 1 exactly).
const __m128 fOneHalf = _mm_set_ss(0.5f);
__m128 Y0, X0, X1, X2, FOver2;
float temp;
Y0 = _mm_set_ss(F);
X0 = _mm_rsqrt_ss(Y0); // 1/sqrt estimate (12 bits)
FOver2 = _mm_mul_ss(Y0, fOneHalf);
// 1st Newton-Raphson iteration
X1 = _mm_mul_ss(X0, X0);
X1 = _mm_sub_ss(fOneHalf, _mm_mul_ss(FOver2, X1));
X1 = _mm_add_ss(X0, _mm_mul_ss(X0, X1));
// 2nd Newton-Raphson iteration
X2 = _mm_mul_ss(X1, X1);
X2 = _mm_sub_ss(fOneHalf, _mm_mul_ss(FOver2, X2));
X2 = _mm_add_ss(X1, _mm_mul_ss(X1, X2));
_mm_store_ss(&temp, X2);
return temp;
}
float Math::GetDistance2D(float x1, float y1, float x2, float y2) {
return (float)sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2));
}
SDK::FRotator Math::NormalizeAxis(SDK::FRotator Rotation) {
while (Rotation.Yaw > 180.f)
Rotation.Yaw -= 360.f;
while (Rotation.Yaw < -180.f)
Rotation.Yaw += 360.f;
while (Rotation.Roll > 180.f)
Rotation.Roll -= 360.f;
while (Rotation.Roll < -180.f)
Rotation.Roll += 360.f;
while (Rotation.Pitch > 180.f)
Rotation.Pitch -= 360.f;
while (Rotation.Pitch < -180.f)
Rotation.Pitch += 360.f;
return Rotation;
}
float Math::NormalizeAngle(float Angle) {
while (Angle > 180.f) {
Angle -= 360.f;
}
while (Angle < -180.f) {
Angle += 360.f;
}
return Angle;
}
float Math::DegreesToRadians(float degrees) {
return degrees * (M_PI / 180.0f);
}
float Math::RadiansToDegrees(float radians) {
return radians * (180.0f / M_PI);
}
float Math::GetDegreeDistance(SDK::FRotator Rotator1, SDK::FRotator Rotator2) {
SDK::FVector ForwardVector1 = SDK::UKismetMathLibrary::StaticClass()->GetForwardVector(Rotator1);
SDK::FVector ForwardVector2 = SDK::UKismetMathLibrary::StaticClass()->GetForwardVector(Rotator2);
ForwardVector1.Normalize();
ForwardVector2.Normalize();
float DotProduct = ForwardVector1.Dot(ForwardVector2);
DotProduct = std::clamp(DotProduct, -1.0f, 1.0f);
float AngleBetween = RadiansToDegrees(acos(DotProduct));
return AngleBetween;
}
float Math::CalculateInterpolatedValue(float CurrentScalar, float MaxScalar, float MinValue, float MaxValue) {
MaxScalar = min(MaxScalar, CurrentScalar);
float InterpolatedValue = MaxValue - (MaxValue - MinValue) * (MaxScalar / CurrentScalar);
InterpolatedValue = std::clamp(InterpolatedValue, MinValue, MaxValue);
return InterpolatedValue;
}
bool Math::IsOnScreen(const SDK::FVector2D& Position) {
bool OnScreenX = (Position.X >= 0.f) && (Position.X <= Game::ScreenWidth);
bool OnScreenY = (Position.Y >= 0.f) && (Position.Y <= Game::ScreenHeight);
return OnScreenX && OnScreenY;
}
+10 -175
View File
@@ -1,189 +1,24 @@
#pragma once
#include <Windows.h>
#include <cmath>
#include <emmintrin.h>
#include <algorithm>
#include "../Game/SDK/Classes/Basic.h"
#include "../Game/SDK/Classes/Engine_Classes.h"
#include "../Game/Game.h"
#define INV_PI 0.31830988618f
#define HALF_PI 1.57079632679f
#define M_PI 3.14159265358979323f
namespace Math {
inline float InvSqrt(float F) {
// Performs two passes of Newton-Raphson iteration on the hardware estimate
// v^-0.5 = x
// => x^2 = v^-1
// => 1/(x^2) = v
// => F(x) = x^-2 - v
// F'(x) = -2x^-3
float InvSqrt(float F);
// x1 = x0 - F(x0)/F'(x0)
// => x1 = x0 + 0.5 * (x0^-2 - Vec) * x0^3
// => x1 = x0 + 0.5 * (x0 - Vec * x0^3)
// => x1 = x0 + x0 * (0.5 - 0.5 * Vec * x0^2)
//
// This final form has one more operation than the legacy factorization (X1 = 0.5*X0*(3-(Y*X0)*X0)
// but retains better accuracy (namely InvSqrt(1) = 1 exactly).
float GetDistance2D(float x1, float y1, float x2, float y2);
const __m128 fOneHalf = _mm_set_ss(0.5f);
__m128 Y0, X0, X1, X2, FOver2;
float temp;
SDK::FRotator NormalizeAxis(SDK::FRotator Rotation);
Y0 = _mm_set_ss(F);
X0 = _mm_rsqrt_ss(Y0); // 1/sqrt estimate (12 bits)
FOver2 = _mm_mul_ss(Y0, fOneHalf);
float NormalizeAngle(float Angle);
// 1st Newton-Raphson iteration
X1 = _mm_mul_ss(X0, X0);
X1 = _mm_sub_ss(fOneHalf, _mm_mul_ss(FOver2, X1));
X1 = _mm_add_ss(X0, _mm_mul_ss(X0, X1));
float DegreesToRadians(float degrees);
// 2nd Newton-Raphson iteration
X2 = _mm_mul_ss(X1, X1);
X2 = _mm_sub_ss(fOneHalf, _mm_mul_ss(FOver2, X2));
X2 = _mm_add_ss(X1, _mm_mul_ss(X1, X2));
float RadiansToDegrees(float radians);
_mm_store_ss(&temp, X2);
return temp;
}
inline void SinCos(float* ScalarSin, float* ScalarCos, float Value)
{
// Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder.
float quotient = (INV_PI * 0.5f) * Value;
if (Value >= 0.0f)
{
quotient = (float)((int)(quotient + 0.5f));
}
else
{
quotient = (float)((int)(quotient - 0.5f));
}
float y = Value - (2.0f * M_PI) * quotient;
float GetDegreeDistance(SDK::FRotator Rotator1, SDK::FRotator Rotator2);
// Map y to [-pi/2,pi/2] with sin(y) = sin(Value).
float sign;
if (y > HALF_PI)
{
y = M_PI - y;
sign = -1.0f;
}
else if (y < -HALF_PI)
{
y = -M_PI - y;
sign = -1.0f;
}
else
{
sign = +1.0f;
}
float CalculateInterpolatedValue(float CurrentScalar, float MaxScalar, float MinValue, float MaxValue);
float y2 = y * y;
// 11-degree minimax approximation
*ScalarSin = (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y;
// 10-degree minimax approximation
float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f;
*ScalarCos = sign * p;
}
inline float GetDistance2D(float x1, float y1, float x2, float y2) {
return (float)sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2));
}
inline float Interpolate(float Value, float InputMin, float InputMax, float OutputMin, float OutputMax) {
return OutputMin + (OutputMax - OutputMin) * ((Value - InputMin) / (InputMax - InputMin));
}
inline float Clamp(float Value, float MinValue, float MaxValue) {
return (Value < MinValue) ? MinValue : ((Value > MaxValue) ? MaxValue : Value);
}
inline SDK::FRotator NormalizeAxis(SDK::FRotator Rotation) {
while (Rotation.Yaw > 180.f)
Rotation.Yaw -= 360.f;
while (Rotation.Yaw < -180.f)
Rotation.Yaw += 360.f;
while (Rotation.Roll > 180.f)
Rotation.Roll -= 360.f;
while (Rotation.Roll < -180.f)
Rotation.Roll += 360.f;
while (Rotation.Pitch > 180.f)
Rotation.Pitch -= 360.f;
while (Rotation.Pitch < -180.f)
Rotation.Pitch += 360.f;
return Rotation;
}
inline float NormalizeAngle(float Angle) {
while (Angle > 180.f) {
Angle -= 360.f;
}
while (Angle < -180.f) {
Angle += 360.f;
}
return Angle;
}
inline float DegreesToRadians(float degrees) {
return degrees * (M_PI / 180.0f);
}
inline SDK::FQuat FRotatorToQuat(SDK::FRotator Rotator) {
float SP, SY, SR, CP, CY, CR;
Math::SinCos(&SP, &CP, Math::DegreesToRadians(Rotator.Pitch));
Math::SinCos(&SY, &CY, Math::DegreesToRadians(Rotator.Yaw));
Math::SinCos(&SR, &CR, Math::DegreesToRadians(Rotator.Roll));
SDK::FQuat RotationQuat;
RotationQuat.X = CR * SP * SY - SR * CP * CY;
RotationQuat.Y = -CR * SP * CY - SR * CP * SY;
RotationQuat.Z = CR * CP * SY - SR * SP * CY;
RotationQuat.W = CR * CP * CY + SR * SP * SY;
return RotationQuat;
}
inline float RadiansToDegrees(float radians) {
return radians * (180.0f / M_PI);
}
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);
ForwardVector1.Normalize();
ForwardVector2.Normalize();
float DotProduct = ForwardVector1.Dot(ForwardVector2);
DotProduct = Clamp(DotProduct, -1.0f, 1.0f);
float AngleBetween = RadiansToDegrees(acos(DotProduct));
return AngleBetween;
}
inline float CalculateInterpolatedValue(float CurrentScalar, float MaxScalar, float MinValue, float MaxValue) {
MaxScalar = min(MaxScalar, CurrentScalar);
float InterpolatedValue = MaxValue - (MaxValue - MinValue) * (MaxScalar / CurrentScalar);
InterpolatedValue = std::clamp(InterpolatedValue, MinValue, MaxValue);
return InterpolatedValue;
}
inline bool IsOnScreen(const SDK::FVector2D& Position) {
bool OnScreenX = (Position.X >= 0.f) && (Position.X <= Game::ScreenWidth);
bool OnScreenY = (Position.Y >= 0.f) && (Position.Y <= Game::ScreenHeight);
return OnScreenX && OnScreenY;
}
bool IsOnScreen(const SDK::FVector2D& Position);
}