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