diff --git a/Fortnite Internal/Configs/Config.h b/Fortnite Internal/Configs/Config.h index 35a75ad..88839f0 100644 --- a/Fortnite Internal/Configs/Config.h +++ b/Fortnite Internal/Configs/Config.h @@ -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; } diff --git a/Fortnite Internal/Configs/ConfigTypes.h b/Fortnite Internal/Configs/ConfigTypes.h index cc2c307..fcd65e2 100644 --- a/Fortnite Internal/Configs/ConfigTypes.h +++ b/Fortnite Internal/Configs/ConfigTypes.h @@ -6,4 +6,11 @@ namespace ConfigTypes { Crosshair, Distance, }; + + enum class BoxType { + Full3D, + Cornered3D, + Full2D, + Cornered2D, + }; } \ No newline at end of file diff --git a/Fortnite Internal/Drawing/Drawing.cpp b/Fortnite Internal/Drawing/Drawing.cpp index 9e757a9..3c0bddf 100644 --- a/Fortnite Internal/Drawing/Drawing.cpp +++ b/Fortnite Internal/Drawing/Drawing.cpp @@ -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 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 Lock(DrawingMutex); auto Cache = std::make_unique(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 Lock(DrawingMutex); + if (Hooks::Present::LargeFont == nullptr) { + return; + } + auto Cache = std::make_unique(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 Lock(DrawingMutex); auto Cache = std::make_unique(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 Lock(DrawingMutex); auto Cache = std::make_unique(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 Lock(DrawingMutex); auto Cache = std::make_unique(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 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(); - 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 Lock(DrawingMutex); auto Cache = std::make_unique(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 \ No newline at end of file diff --git a/Fortnite Internal/Drawing/Drawing.h b/Fortnite Internal/Drawing/Drawing.h index c3ac3b2..953693f 100644 --- a/Fortnite Internal/Drawing/Drawing.h +++ b/Fortnite Internal/Drawing/Drawing.h @@ -2,6 +2,7 @@ #ifdef _IMGUI #include #include +#include #endif #include "../Game/SDK/Classes/Basic.h" @@ -114,11 +115,14 @@ namespace Drawing { + inline std::mutex DrawingMutex; inline std::vector> RenderBuffer, DrawingQueue; -#endif -#ifdef _IMGUI + + inline void SwapBuffers() { + std::lock_guard Lock(DrawingMutex); + std::swap(RenderBuffer, DrawingQueue); DrawingQueue.clear(); diff --git a/Fortnite Internal/Entry.cpp b/Fortnite Internal/Entry.cpp index 2b1d9b0..c38968f 100644 --- a/Fortnite Internal/Entry.cpp +++ b/Fortnite Internal/Entry.cpp @@ -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; diff --git a/Fortnite Internal/Fortnite Internal.vcxproj b/Fortnite Internal/Fortnite Internal.vcxproj index 9063d1b..45e4bad 100644 --- a/Fortnite Internal/Fortnite Internal.vcxproj +++ b/Fortnite Internal/Fortnite Internal.vcxproj @@ -360,6 +360,8 @@ + + diff --git a/Fortnite Internal/Fortnite Internal.vcxproj.filters b/Fortnite Internal/Fortnite Internal.vcxproj.filters index 5e9500a..48d10f4 100644 --- a/Fortnite Internal/Fortnite Internal.vcxproj.filters +++ b/Fortnite Internal/Fortnite Internal.vcxproj.filters @@ -128,6 +128,12 @@ Hooks\Callbacks + + Utilities + + + Hooks\Callbacks + diff --git a/Fortnite Internal/Fortnite Internal.vcxproj.user b/Fortnite Internal/Fortnite Internal.vcxproj.user index 5df420f..966b4ff 100644 --- a/Fortnite Internal/Fortnite Internal.vcxproj.user +++ b/Fortnite Internal/Fortnite Internal.vcxproj.user @@ -1,6 +1,6 @@  - false + true \ No newline at end of file diff --git a/Fortnite Internal/Game/Actors/Loops/FortPawn.cpp b/Fortnite Internal/Game/Actors/Loops/FortPawn.cpp index d2ee983..12a25a2 100644 --- a/Fortnite Internal/Game/Actors/Loops/FortPawn.cpp +++ b/Fortnite Internal/Game/Actors/Loops/FortPawn.cpp @@ -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(Actor); if (SDK::IsValidPointer(FortPawn) == false) continue; - SDK::AFortPlayerState* FortPlayerState = FortPawn->PlayerState(); //if (SDK::IsValidPointer(FortPlayerState) == false) continue; - SDK::ACharacter* Character = static_cast((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(Actor); if (SDK::IsValidPointer(FortPawn) == false) continue; + SDK::AFortPlayerState* FortPlayerState = reinterpret_cast(FortPawn->PlayerState()); //if (SDK::IsValidPointer(FortPlayerState) == false) continue; + SDK::ACharacter* Character = reinterpret_cast(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(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 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::GetLocalController())->SetbBuildFree(true, &Config::Exploits::Player::InfiniteBuilds); + { + if (SDK::GetLocalController()) { + if (Config::Exploits::Player::InfiniteBuilds) { + reinterpret_cast(SDK::GetLocalController())->SetbBuildFree(true, &Config::Exploits::Player::InfiniteBuilds); + } + + if (Config::Exploits::Player::InfiniteAmmo) { + reinterpret_cast(SDK::GetLocalController())->SetbInfiniteAmmo(true, &Config::Exploits::Player::InfiniteAmmo); + } } - if (Config::Exploits::Player::InfiniteAmmo) { - reinterpret_cast(SDK::GetLocalController())->SetbInfiniteAmmo(true, &Config::Exploits::Player::InfiniteAmmo); + if (Config::Exploits::Player::ADSWhileNotOnGround) { + reinterpret_cast(FortPawn)->SetbADSWhileNotOnGround(true, &Config::Exploits::Player::ADSWhileNotOnGround); } - } - if (Config::Exploits::Player::EditEnemyBuilds) { - SDK::ABuildingActor* TargetedBuilding = reinterpret_cast(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::GetWorld()->GameState())->SetDefaultGliderRedeployCanRedeploy(true, &Config::Exploits::Player::AllowRedeploy); + } + } + + if (Config::Exploits::Player::EditEnemyBuilds) { + SDK::ABuildingActor* TargetedBuilding = reinterpret_cast(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); + //} } } } diff --git a/Fortnite Internal/Game/Actors/Loops/FortWeapon.cpp b/Fortnite Internal/Game/Actors/Loops/FortWeapon.cpp index cb4b916..16f321c 100644 --- a/Fortnite Internal/Game/Actors/Loops/FortWeapon.cpp +++ b/Fortnite Internal/Game/Actors/Loops/FortWeapon.cpp @@ -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); } diff --git a/Fortnite Internal/Game/Features/Aimbot/Aimbot.cpp b/Fortnite Internal/Game/Features/Aimbot/Aimbot.cpp index ae9d947..147ba2b 100644 --- a/Fortnite Internal/Game/Features/Aimbot/Aimbot.cpp +++ b/Fortnite Internal/Game/Features/Aimbot/Aimbot.cpp @@ -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& 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 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; diff --git a/Fortnite Internal/Game/Features/Aimbot/Aimbot.h b/Fortnite Internal/Game/Features/Aimbot/Aimbot.h index c8a3855..c56d1d4 100644 --- a/Fortnite Internal/Game/Features/Aimbot/Aimbot.h +++ b/Fortnite Internal/Game/Features/Aimbot/Aimbot.h @@ -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& 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); }; } \ No newline at end of file diff --git a/Fortnite Internal/Game/Features/Aimbot/Target.cpp b/Fortnite Internal/Game/Features/Aimbot/Target.cpp index 0d4f140..8d5a863 100644 --- a/Fortnite Internal/Game/Features/Aimbot/Target.cpp +++ b/Fortnite Internal/Game/Features/Aimbot/Target.cpp @@ -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: diff --git a/Fortnite Internal/Game/Features/Exploits/Vehicle.cpp b/Fortnite Internal/Game/Features/Exploits/Vehicle.cpp index 36f5ed4..ce7c49c 100644 --- a/Fortnite Internal/Game/Features/Exploits/Vehicle.cpp +++ b/Fortnite Internal/Game/Features/Exploits/Vehicle.cpp @@ -10,8 +10,9 @@ #include "../../Input/Input.h" void Features::Exploits::Vehicle::Tick() { - SDK::AFortAthenaVehicle* Vehicle = reinterpret_cast(SDK::GetLocalPawn())->GetVehicle(); - if (Vehicle) { + SDK::AFortAthenaVehicle* Vehicle = reinterpret_cast(SDK::GetLocalPawn())->GetVehicle(); + + if (SDK::IsValidPointer(Vehicle)) { VehicleLastTick = Vehicle; if (Config::Exploits::Vehicle::InfiniteBoost) { diff --git a/Fortnite Internal/Game/Game.cpp b/Fortnite Internal/Game/Game.cpp index d431678..15d9e73 100644 --- a/Fortnite Internal/Game/Game.cpp +++ b/Fortnite Internal/Game/Game.cpp @@ -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: diff --git a/Fortnite Internal/Game/SDK/Classes/Basic.cpp b/Fortnite Internal/Game/SDK/Classes/Basic.cpp index ead7cea..8753ed2 100644 --- a/Fortnite Internal/Game/SDK/Classes/Basic.cpp +++ b/Fortnite Internal/Game/SDK/Classes/Basic.cpp @@ -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; } \ No newline at end of file diff --git a/Fortnite Internal/Game/SDK/Classes/Basic.h b/Fortnite Internal/Game/SDK/Classes/Basic.h index 2590c29..5d38a5e 100644 --- a/Fortnite Internal/Game/SDK/Classes/Basic.h +++ b/Fortnite Internal/Game/SDK/Classes/Basic.h @@ -592,8 +592,6 @@ namespace SDK { } return delta; } - - inline FVector Vector() const; }; struct FVector2D diff --git a/Fortnite Internal/Game/SDK/Classes/CoreUObject_functions.cpp b/Fortnite Internal/Game/SDK/Classes/CoreUObject_functions.cpp index 71a3082..6bc3c5d 100644 --- a/Fortnite Internal/Game/SDK/Classes/CoreUObject_functions.cpp +++ b/Fortnite Internal/Game/SDK/Classes/CoreUObject_functions.cpp @@ -105,7 +105,6 @@ namespace SDK { } - void UObject::SetupObjects(std::vector& Functions, std::vector& 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(); } diff --git a/Fortnite Internal/Game/SDK/Classes/Engine_Functions.cpp b/Fortnite Internal/Game/SDK/Classes/Engine_Functions.cpp index ad1922f..d7ed720 100644 --- a/Fortnite Internal/Game/SDK/Classes/Engine_Functions.cpp +++ b/Fortnite Internal/Game/SDK/Classes/Engine_Functions.cpp @@ -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, ¶ms_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::UMeshComponent::GetMaterials() { + if (SDK::IsValidPointer(this) == false) return TArray{}; + + struct { + TArray return_value; + } params_GetMaterials{}; + + this->ProcessEvent(SDK::Cached::Functions::MeshComponent::GetMaterials, ¶ms_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& 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, ¶ms_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(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, ¶ms_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, ¶ms_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, diff --git a/Fortnite Internal/Game/SDK/Classes/Engine_classes.h b/Fortnite Internal/Game/SDK/Classes/Engine_classes.h index b6b47f4..bc7d766 100644 --- a/Fortnite Internal/Game/SDK/Classes/Engine_classes.h +++ b/Fortnite Internal/Game/SDK/Classes/Engine_classes.h @@ -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 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 LocalPlayers() { - if (SDK::IsValidPointer(this) == false) return TArray{}; + if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::GameInstance::LocalPlayers == -0x1) return TArray{}; return *(TArray*)((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); } diff --git a/Fortnite Internal/Game/SDK/Classes/Engine_structs.h b/Fortnite Internal/Game/SDK/Classes/Engine_structs.h index 55af885..c9ec0e0 100644 --- a/Fortnite Internal/Game/SDK/Classes/Engine_structs.h +++ b/Fortnite Internal/Game/SDK/Classes/Engine_structs.h @@ -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; } }; diff --git a/Fortnite Internal/Game/SDK/Classes/FortniteGame_Classes.h b/Fortnite Internal/Game/SDK/Classes/FortniteGame_Classes.h index 060c6ac..9dde0c9 100644 --- a/Fortnite Internal/Game/SDK/Classes/FortniteGame_Classes.h +++ b/Fortnite Internal/Game/SDK/Classes/FortniteGame_Classes.h @@ -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*)((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*)((uintptr_t)this + SDK::Cached::Offsets::FortAntelopeVehicleConfigs::BoostExpenseRate), AutoRevertFeature); @@ -52,7 +52,7 @@ namespace SDK { // VALUES TArray BoostTimers() { - if (SDK::IsValidPointer(this) == false) return TArray{}; + if (SDK::IsValidPointer(this) == false || SDK::Cached::Offsets::FortAthenaJackalVehicle::BoostTimers == -0x1) return TArray{}; return *(TArray*)((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*)((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*)((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*)((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*)((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); } diff --git a/Fortnite Internal/Game/SDK/Classes/FortniteGame_Functions.cpp b/Fortnite Internal/Game/SDK/Classes/FortniteGame_Functions.cpp index 727cb38..61b7da5 100644 --- a/Fortnite Internal/Game/SDK/Classes/FortniteGame_Functions.cpp +++ b/Fortnite Internal/Game/SDK/Classes/FortniteGame_Functions.cpp @@ -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; diff --git a/Fortnite Internal/Game/SDK/Classes/FortniteGame_structs.h b/Fortnite Internal/Game/SDK/Classes/FortniteGame_structs.h index 622acc0..95cfd43 100644 --- a/Fortnite Internal/Game/SDK/Classes/FortniteGame_structs.h +++ b/Fortnite Internal/Game/SDK/Classes/FortniteGame_structs.h @@ -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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((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*)((uintptr_t)this + SDK::Cached::Offsets::FortMeleeWeaponStats::SwingPlaySpeed), AutoRevertFeature); diff --git a/Fortnite Internal/Game/SDK/SDK.cpp b/Fortnite Internal/Game/SDK/SDK.cpp index 7aa99dd..cff30f0 100644 --- a/Fortnite Internal/Game/SDK/SDK.cpp +++ b/Fortnite Internal/Game/SDK/SDK.cpp @@ -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 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); diff --git a/Fortnite Internal/Game/SDK/SDK.h b/Fortnite Internal/Game/SDK/SDK.h index 291b31b..2627d43 100644 --- a/Fortnite Internal/Game/SDK/SDK.h +++ b/Fortnite Internal/Game/SDK/SDK.h @@ -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; } } } diff --git a/Fortnite Internal/Game/SDK/SDKInitializer.cpp b/Fortnite Internal/Game/SDK/SDKInitializer.cpp index c5c5567..8379315 100644 --- a/Fortnite Internal/Game/SDK/SDKInitializer.cpp +++ b/Fortnite Internal/Game/SDK/SDKInitializer.cpp @@ -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 Functions = {}; std::vector 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..."))); diff --git a/Fortnite Internal/Game/SDK/SDKInitializer.h b/Fortnite Internal/Game/SDK/SDKInitializer.h index 8ebe534..8eece7c 100644 --- a/Fortnite Internal/Game/SDK/SDKInitializer.h +++ b/Fortnite Internal/Game/SDK/SDKInitializer.h @@ -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(); diff --git a/Fortnite Internal/Hooks/Callbacks/CalculateShot.cpp b/Fortnite Internal/Hooks/Callbacks/CalculateShot.cpp index 0b073ff..4842a89 100644 --- a/Fortnite Internal/Hooks/Callbacks/CalculateShot.cpp +++ b/Fortnite Internal/Hooks/Callbacks/CalculateShot.cpp @@ -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)) { diff --git a/Fortnite Internal/Hooks/Callbacks/DrawTransition.cpp b/Fortnite Internal/Hooks/Callbacks/DrawTransition.cpp index 35d8d61..a2d7860 100644 --- a/Fortnite Internal/Hooks/Callbacks/DrawTransition.cpp +++ b/Fortnite Internal/Hooks/Callbacks/DrawTransition.cpp @@ -8,6 +8,8 @@ #include "../../Utilities/Logger.h" #include "../../Utilities/Math.h" +#include + 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(); diff --git a/Fortnite Internal/Hooks/Callbacks/GetPlayerViewpoint.cpp b/Fortnite Internal/Hooks/Callbacks/GetPlayerViewpoint.cpp index 72ee20e..302ddd7 100644 --- a/Fortnite Internal/Hooks/Callbacks/GetPlayerViewpoint.cpp +++ b/Fortnite Internal/Hooks/Callbacks/GetPlayerViewpoint.cpp @@ -9,5 +9,5 @@ void Hooks::GetPlayerViewpoint::GetPlayerViewpoint(void* this_, SDK::FVector* Lo GetPlayerViewpointOriginal(this_, Location, Rotation); //spoof_call(GetPlayerViewpointOriginal, this_, Location, Rotation); - Features::Aimbot::GetPlayerViewpointCallback(Rotation); + Features::Aimbot::GetPlayerViewpointCallback(Location, Rotation); } \ No newline at end of file diff --git a/Fortnite Internal/Hooks/Callbacks/RaycastMulti.cpp b/Fortnite Internal/Hooks/Callbacks/RaycastMulti.cpp new file mode 100644 index 0000000..343179d --- /dev/null +++ b/Fortnite Internal/Hooks/Callbacks/RaycastMulti.cpp @@ -0,0 +1,11 @@ +#include "../Hooks.h" + +#include "../../Game/Features/Aimbot/Aimbot.h" + +bool Hooks::RaycastMulti::RaycastMulti(SDK::UWorld* World, SDK::TArray& 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; +} \ No newline at end of file diff --git a/Fortnite Internal/Hooks/Hooks.cpp b/Fortnite Internal/Hooks/Hooks.cpp index ffd0d4a..15ae439 100644 --- a/Fortnite Internal/Hooks/Hooks.cpp +++ b/Fortnite Internal/Hooks/Hooks.cpp @@ -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 @@ -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!"))); + } + } } \ No newline at end of file diff --git a/Fortnite Internal/Hooks/Hooks.h b/Fortnite Internal/Hooks/Hooks.h index 0f382ea..6d2efbc 100644 --- a/Fortnite Internal/Hooks/Hooks.h +++ b/Fortnite Internal/Hooks/Hooks.h @@ -5,14 +5,15 @@ #include #include #include -#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& 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& 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 { diff --git a/Fortnite Internal/Utilities/Font.h b/Fortnite Internal/Utilities/Font.h index 9ff7f41..1568ab5 100644 --- a/Fortnite Internal/Utilities/Font.h +++ b/Fortnite Internal/Utilities/Font.h @@ -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, diff --git a/Fortnite Internal/Utilities/Logger.h b/Fortnite Internal/Utilities/Logger.h index df8ce4c..cfab1bc 100644 --- a/Fortnite Internal/Utilities/Logger.h +++ b/Fortnite Internal/Utilities/Logger.h @@ -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 \ No newline at end of file diff --git a/Fortnite Internal/Utilities/Math.cpp b/Fortnite Internal/Utilities/Math.cpp new file mode 100644 index 0000000..e8582a9 --- /dev/null +++ b/Fortnite Internal/Utilities/Math.cpp @@ -0,0 +1,120 @@ +#include "Math.h" + +#include +#include +#include + +#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; +} \ No newline at end of file diff --git a/Fortnite Internal/Utilities/Math.h b/Fortnite Internal/Utilities/Math.h index e6e08bd..fa03af5 100644 --- a/Fortnite Internal/Utilities/Math.h +++ b/Fortnite Internal/Utilities/Math.h @@ -1,189 +1,24 @@ #pragma once -#include -#include -#include -#include +#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); } \ No newline at end of file