diff --git a/AssaultCube-Multihack.vcxproj b/AssaultCube-Multihack.vcxproj index cc55837..bc90641 100644 --- a/AssaultCube-Multihack.vcxproj +++ b/AssaultCube-Multihack.vcxproj @@ -211,8 +211,10 @@ NotUsing + + diff --git a/AssaultCube-Multihack.vcxproj.filters b/AssaultCube-Multihack.vcxproj.filters index 55b9927..0da9dfe 100644 --- a/AssaultCube-Multihack.vcxproj.filters +++ b/AssaultCube-Multihack.vcxproj.filters @@ -66,6 +66,12 @@ Source Files + + Source Files + + + Source Files + diff --git a/src/base.cpp b/src/base.cpp index 6fd0912..c6980b8 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -1,31 +1,39 @@ #include #include -HMODULE Base::Data::hModule = NULL; -HWND Base::Data::hWindow = NULL; -mem::module_t Base::Data::m_opengl; -mem::module_t Base::Data::m_ac_client; -mem::module_t Base::Data::m_sdl; -mem::voidptr_t Base::Data::pSwapBuffers = nullptr; -mem::voidptr_t Base::Data::pShowCursor = nullptr; -mem::voidptr_t Base::Data::p_c2sinfo = nullptr; -mem::voidptr_t Base::Data::p_servertoclient = nullptr; -SwapBuffers_t Base::Data::oSwapBuffers = nullptr; -WndProc_t Base::Data::oWndProc = nullptr; -ShowCursor_t Base::Data::oShowCursor = nullptr; -c2sinfo_t Base::Data::o_c2sinfo = nullptr; -servertoclient_t Base::Data::o_servertoclient = nullptr; -mem::size_t Base::Data::szSwapBuffers = 5; -mem::size_t Base::Data::szShowCursor = 5; -mem::size_t Base::Data::sz_c2sinfo = 5; -mem::size_t Base::Data::sz_servertoclient = 6; -UINT Base::Data::WMKeys[0xFE]; -bool Base::Data::InitSwapBuffers = false; -bool Base::Data::IsUnloaded = false; -bool Base::Data::ShowMenu = true; -HGLRC Base::Data::glContext = NULL; -HGLRC Base::Data::oContext = NULL; -AC_Client Base::Data::game; +HMODULE Base::Data::hModule = NULL; +HWND Base::Data::hWindow = NULL; +mem::module_t Base::Data::m_opengl; +mem::module_t Base::Data::m_ac_client; +mem::module_t Base::Data::m_sdl; +mem::voidptr_t Base::Data::pSwapBuffers = nullptr; +mem::voidptr_t Base::Data::pShowCursor = nullptr; +mem::voidptr_t Base::Data::p_c2sinfo = nullptr; +mem::voidptr_t Base::Data::p_servertoclient = nullptr; +mem::voidptr_t Base::Data::p_movelocalplayer = nullptr; +SwapBuffers_t Base::Data::oSwapBuffers = nullptr; +WndProc_t Base::Data::oWndProc = nullptr; +ShowCursor_t Base::Data::oShowCursor = nullptr; +c2sinfo_t Base::Data::o_c2sinfo = nullptr; +servertoclient_t Base::Data::o_servertoclient = nullptr; +movelocalplayer_t Base::Data::o_movelocalplayer = nullptr; +mem::size_t Base::Data::szSwapBuffers = 5; +mem::size_t Base::Data::szShowCursor = 5; +mem::size_t Base::Data::sz_c2sinfo = 5; +mem::size_t Base::Data::sz_servertoclient = 6; +mem::size_t Base::Data::sz_movelocalplayer = 8; +UINT Base::Data::WMKeys[0xFE]; +bool Base::Data::InitSwapBuffers = false; +bool Base::Data::IsUnloaded = false; +bool Base::Data::ShowMenu = true; +HGLRC Base::Data::glContext = NULL; +HGLRC Base::Data::oContext = NULL; +AC_Client Base::Data::game; + +bool Base::Data::Settings::TeleportQueued = false; +bool Base::Data::Settings::TeleportSaveQueued = false; +float Base::Data::Settings::TeleportPosition[3]; +bool Base::Data::Settings::TeleportForce[3]; DWORD WINAPI ExitThread(LPVOID lpReserved); @@ -41,6 +49,7 @@ void Base::Init(HMODULE hMod) Data::pShowCursor = mem::in::get_symbol(Data::m_sdl, "SDL_ShowCursor"); Data::p_c2sinfo = (mem::voidptr_t)Data::game.c2sinfo; Data::p_servertoclient = (mem::voidptr_t)Data::game.servertoclient; + Data::p_movelocalplayer = (mem::voidptr_t)Data::game.movelocalplayer; Hooks::Init(); } diff --git a/src/base.h b/src/base.h index a77212c..fbf9704 100644 --- a/src/base.h +++ b/src/base.h @@ -19,35 +19,41 @@ namespace Base namespace Data { - extern HMODULE hModule; - extern HWND hWindow; - extern mem::module_t m_opengl; - extern mem::module_t m_ac_client; - extern mem::module_t m_sdl; - extern mem::voidptr_t pSwapBuffers; - extern mem::voidptr_t pShowCursor; - extern mem::voidptr_t p_c2sinfo; - extern mem::voidptr_t p_servertoclient; - extern SwapBuffers_t oSwapBuffers; - extern ShowCursor_t oShowCursor; - extern WndProc_t oWndProc; - extern c2sinfo_t o_c2sinfo; - extern servertoclient_t o_servertoclient; - extern mem::size_t szSwapBuffers; - extern mem::size_t szShowCursor; - extern mem::size_t sz_c2sinfo; - extern mem::size_t sz_servertoclient; - extern UINT WMKeys[0xFE]; - extern bool InitSwapBuffers; - extern bool IsUnloaded; - extern bool ShowMenu; - extern HGLRC glContext; - extern HGLRC oContext; - extern AC_Client game; + extern HMODULE hModule; + extern HWND hWindow; + extern mem::module_t m_opengl; + extern mem::module_t m_ac_client; + extern mem::module_t m_sdl; + extern mem::voidptr_t pSwapBuffers; + extern mem::voidptr_t pShowCursor; + extern mem::voidptr_t p_c2sinfo; + extern mem::voidptr_t p_servertoclient; + extern mem::voidptr_t p_movelocalplayer; + extern SwapBuffers_t oSwapBuffers; + extern ShowCursor_t oShowCursor; + extern WndProc_t oWndProc; + extern c2sinfo_t o_c2sinfo; + extern servertoclient_t o_servertoclient; + extern movelocalplayer_t o_movelocalplayer; + extern mem::size_t szSwapBuffers; + extern mem::size_t szShowCursor; + extern mem::size_t sz_c2sinfo; + extern mem::size_t sz_servertoclient; + extern mem::size_t sz_movelocalplayer; + extern UINT WMKeys[0xFE]; + extern bool InitSwapBuffers; + extern bool IsUnloaded; + extern bool ShowMenu; + extern HGLRC glContext; + extern HGLRC oContext; + extern AC_Client game; namespace Settings { - + extern bool TeleportQueued; + extern bool TeleportSaveQueued; + extern float TeleportPosition[3]; + extern bool TeleportForce[3]; } namespace Keys @@ -59,7 +65,7 @@ namespace Base namespace Hacks { - + void Teleport(); } namespace Hooks @@ -71,5 +77,6 @@ namespace Base int SDLCALL ShowCursor(int toggle); void c2sinfo(playerent* d); void servertoclient(int chan, uchar* buf, int len, bool demo); + void movelocalplayer(); } } \ No newline at end of file diff --git a/src/hacks/Teleport.cpp b/src/hacks/Teleport.cpp new file mode 100644 index 0000000..72a758e --- /dev/null +++ b/src/hacks/Teleport.cpp @@ -0,0 +1,32 @@ +#include +#include + +/* Not yet implemented */ + +void Base::Hacks::Teleport() +{ + if (Data::Settings::TeleportSaveQueued) + { + Data::Settings::TeleportPosition[0] = Data::game.player1->o.x; + Data::Settings::TeleportPosition[1] = Data::game.player1->o.y; + Data::Settings::TeleportPosition[2] = Data::game.player1->o.z; + Data::Settings::TeleportSaveQueued = false; + } + + if (Data::Settings::TeleportQueued) + { + Data::game.player1->o.x = Data::Settings::TeleportPosition[0]; + Data::game.player1->o.y = Data::Settings::TeleportPosition[1]; + Data::game.player1->o.z = Data::Settings::TeleportPosition[2]; + Data::Settings::TeleportQueued = false; + } + + if(Data::Settings::TeleportForce[0]) + Data::game.player1->o.x = Data::Settings::TeleportPosition[0]; + + if (Data::Settings::TeleportForce[1]) + Data::game.player1->o.x = Data::Settings::TeleportPosition[1]; + + if (Data::Settings::TeleportForce[2]) + Data::game.player1->o.x = Data::Settings::TeleportPosition[2]; +} \ No newline at end of file diff --git a/src/hooks/SwapBuffers.cpp b/src/hooks/SwapBuffers.cpp index 1f4e3ae..57e3b90 100644 --- a/src/hooks/SwapBuffers.cpp +++ b/src/hooks/SwapBuffers.cpp @@ -39,6 +39,14 @@ BOOL __stdcall Base::Hooks::SwapBuffers(_In_ HDC hdc) { ImGui::Begin("ImGui Window"); ImGui::Text("Test ImGUI Window"); + + ImGui::SliderFloat3("Teleport Position", Data::Settings::TeleportPosition, -5000, 5000); + ImGui::Checkbox("Force Teleport X", &Data::Settings::TeleportForce[0]); + ImGui::Checkbox("Force Teleport Y", &Data::Settings::TeleportForce[1]); + ImGui::Checkbox("Force Teleport Z", &Data::Settings::TeleportForce[2]); + if (ImGui::Button("Save Pos")) Data::Settings::TeleportSaveQueued = true; + if (ImGui::Button("Teleport")) Data::Settings::TeleportQueued = true; + if (ImGui::Button("Detach")) { ImGui::End(); diff --git a/src/hooks/hooks.cpp b/src/hooks/hooks.cpp index 14bea84..a2c2128 100644 --- a/src/hooks/hooks.cpp +++ b/src/hooks/hooks.cpp @@ -7,11 +7,15 @@ void Base::Hooks::Init() Data::oShowCursor = (ShowCursor_t)mem::in::detour_trampoline(Data::pShowCursor, (mem::voidptr_t)Hooks::ShowCursor, Data::szShowCursor, mem::MEM_DT_M1); Data::o_c2sinfo = (c2sinfo_t)mem::in::detour_trampoline(Data::p_c2sinfo, (mem::voidptr_t)Hooks::c2sinfo, Data::sz_c2sinfo, mem::MEM_DT_M1); Data::o_servertoclient = (servertoclient_t)mem::in::detour_trampoline(Data::p_servertoclient, (mem::voidptr_t)Hooks::servertoclient, Data::sz_servertoclient, mem::MEM_DT_M1); + Data::o_movelocalplayer = (movelocalplayer_t)mem::in::detour_trampoline(Data::p_movelocalplayer, (mem::voidptr_t)Hooks::movelocalplayer, Data::sz_movelocalplayer); } void Base::Hooks::Shutdown() { SetWindowLongPtr(Data::hWindow, GWL_WNDPROC, (LONG_PTR)Data::oWndProc); + mem::in::detour_restore(Data::p_movelocalplayer, (mem::byte_t*)Data::o_movelocalplayer, Data::sz_movelocalplayer); + mem::in::detour_restore(Data::p_servertoclient, (mem::byte_t*)Data::o_servertoclient, Data::sz_servertoclient); + mem::in::detour_restore(Data::p_c2sinfo, (mem::byte_t*)Data::o_c2sinfo, Data::sz_c2sinfo); mem::in::detour_restore(Data::pSwapBuffers, (mem::byte_t*)Data::oSwapBuffers, Data::szSwapBuffers); mem::in::detour_restore(Data::pShowCursor, (mem::byte_t*)Data::oShowCursor, Data::szShowCursor); } \ No newline at end of file diff --git a/src/hooks/movelocalplayer.cpp b/src/hooks/movelocalplayer.cpp new file mode 100644 index 0000000..39d766f --- /dev/null +++ b/src/hooks/movelocalplayer.cpp @@ -0,0 +1,7 @@ +#include +#include + +void Base::Hooks::movelocalplayer() +{ + return Data::o_movelocalplayer(); +} \ No newline at end of file