From dc27eb98bdaa94a16e10fa37719929e13c085d2d Mon Sep 17 00:00:00 2001 From: explorer Date: Thu, 20 Feb 2025 15:59:52 +0300 Subject: [PATCH] stability implementing logic for custom hitboxes isn't trivial, but at least to not crash; stumbled upon junk in `m_survivorCharacter` at `hehe30_9` --- Copy_Command.hpp | 71 ++++++++++++----------- Paint.hpp | 145 ++++++++++++++++++++++++----------------------- 2 files changed, 112 insertions(+), 104 deletions(-) diff --git a/Copy_Command.hpp b/Copy_Command.hpp index 7673e4c..8306cd1 100644 --- a/Copy_Command.hpp +++ b/Copy_Command.hpp @@ -802,57 +802,60 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu void* Hitbox = (void*)((unsigned __int32)Hitbox_Set + 12 + Hitboxes[Target->Identifier] * 68); - float* Hitbox_Minimum = (float*)((unsigned __int32)Hitbox + 8); - - float* Hitbox_Maximum = (float*)((unsigned __int32)Hitbox + 20); - - float Hitbox_Center[3] + if (*(__int32*)Hitbox < sizeof(Bones) / sizeof(Bones[0])) { - (Hitbox_Minimum[0] + Hitbox_Maximum[0]) / 2.f, + float* Hitbox_Minimum = (float*)((unsigned __int32)Hitbox + 8); - (Hitbox_Minimum[1] + Hitbox_Maximum[1]) / 2.f, + float* Hitbox_Maximum = (float*)((unsigned __int32)Hitbox + 20); - (Hitbox_Minimum[2] + Hitbox_Maximum[2]) / 2.f - }; + float Hitbox_Center[3] + { + (Hitbox_Minimum[0] + Hitbox_Maximum[0]) / 2.f, - float Target_Origin[3] = - { - Bones[*(__int32*)Hitbox][0][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][0][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][0][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][0][3], + (Hitbox_Minimum[1] + Hitbox_Maximum[1]) / 2.f, - Bones[*(__int32*)Hitbox][1][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][1][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][1][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][1][3], + (Hitbox_Minimum[2] + Hitbox_Maximum[2]) / 2.f + }; - Bones[*(__int32*)Hitbox][2][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][2][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][2][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][2][3] - }; + float Target_Origin[3] = + { + Bones[*(__int32*)Hitbox][0][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][0][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][0][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][0][3], - float Direction[3] = - { - Target_Origin[0] - Eye_Position[0], + Bones[*(__int32*)Hitbox][1][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][1][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][1][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][1][3], - Target_Origin[1] - Eye_Position[1], + Bones[*(__int32*)Hitbox][2][0] * Hitbox_Center[0] + Bones[*(__int32*)Hitbox][2][1] * Hitbox_Center[1] + Bones[*(__int32*)Hitbox][2][2] * Hitbox_Center[2] + Bones[*(__int32*)Hitbox][2][3] + }; - Target_Origin[2] - Eye_Position[2] - }; + float Direction[3] = + { + Target_Origin[0] - Eye_Position[0], - Vector_Normalize(Direction); + Target_Origin[1] - Eye_Position[1], - float Angles[3] = - { - __builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180.f / 3.1415927f, + Target_Origin[2] - Eye_Position[2] + }; - __builtin_atan2f(Direction[1], Direction[0]) * 180.f / 3.1415927f - }; + Vector_Normalize(Direction); - if (Perform_Trace(Angles) == 1) - { - Command->Tick_Number = Target->Tick_Number; + float Angles[3] = + { + __builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180.f / 3.1415927f, - Byte_Manager::Copy_Bytes(1, Command->Angles, sizeof(Angles), Angles); + __builtin_atan2f(Direction[1], Direction[0]) * 180.f / 3.1415927f + }; - Command->Buttons |= 1; + if (Perform_Trace(Angles) == 1) + { + Command->Tick_Number = Target->Tick_Number; - *(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target); + Byte_Manager::Copy_Bytes(1, Command->Angles, sizeof(Angles), Angles); - goto Aim_Found_Target_Label; + Command->Buttons |= 1; + + *(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target); + + goto Aim_Found_Target_Label; + } } } diff --git a/Paint.hpp b/Paint.hpp index 4e1437c..4cf1b5e 100755 --- a/Paint.hpp +++ b/Paint.hpp @@ -95,84 +95,89 @@ void __thiscall Redirected_Paint(void* Panel) { void* Hitbox = (void*)((unsigned __int32)Hitbox_Set + 12 + Hitbox_Number * 68); - float* Hitbox_Minimum = (float*)((unsigned __int32)Hitbox + 8); - - float* Hitbox_Maximum = (float*)((unsigned __int32)Hitbox + 20); - - float Hitbox_Vertices[8][3]; - - __int32 Axis_Number = 0; - - Initialize_Vertices_Label: + if (*(__int32*)Hitbox < sizeof(Bones) / sizeof(Bones[0])) { - Hitbox_Vertices[0][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + float* Hitbox_Minimum = (float*)((unsigned __int32)Hitbox + 8); - Hitbox_Vertices[1][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + float* Hitbox_Maximum = (float*)((unsigned __int32)Hitbox + 20); - Hitbox_Vertices[2][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + float Hitbox_Vertices[8][3]; - Hitbox_Vertices[3][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + __int32 Axis_Number = 0; - Hitbox_Vertices[4][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; - - Hitbox_Vertices[5][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; - - Hitbox_Vertices[6][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; - - Hitbox_Vertices[7][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; - - Axis_Number += 1; - - if (Axis_Number != sizeof(Hitbox_Vertices[0]) / sizeof(float)) + Initialize_Vertices_Label: { - goto Initialize_Vertices_Label; + Hitbox_Vertices[0][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[1][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[2][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[3][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[4][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Minimum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[5][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Minimum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[6][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Minimum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Hitbox_Vertices[7][Axis_Number] = Bones[*(__int32*)Hitbox][Axis_Number][0] * Hitbox_Maximum[0] + Bones[*(__int32*)Hitbox][Axis_Number][1] * Hitbox_Maximum[1] + Bones[*(__int32*)Hitbox][Axis_Number][2] * Hitbox_Maximum[2] + Bones[*(__int32*)Hitbox][Axis_Number][3]; + + Axis_Number += 1; + + if (Axis_Number != sizeof(Hitbox_Vertices[0]) / sizeof(float)) + { + goto Initialize_Vertices_Label; + } } + + __int32 Vertex_Number = 0; + + Transform_Vertices_Label: + { + using Screen_Transform_Type = __int8(__cdecl*)(float* World, float* Screen); + + float Screen[3]; + + if (Screen_Transform_Type((unsigned __int32)Client_Module + 1841648)(Hitbox_Vertices[Vertex_Number], Screen) == 0) + { + using Get_Screen_Size_Type = __int32(__cdecl*)(); + + __int32 Screen_Width = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738576)(); + + __int32 Screen_Height = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738544)(); + + Screen[0] = Screen[0] / 2.f * Screen_Width + Screen_Width / 2.f; + + Screen[1] = -Screen[1] / 2.f * Screen_Height + Screen_Height / 2.f; + + Bounds[0] = min(Bounds[0], Screen[0]); + + Bounds[1] = max(Bounds[1], Screen[0]); + + Bounds[2] = min(Bounds[2], Screen[1]); + + Bounds[3] = max(Bounds[3], Screen[1]); + } + else + { + return 0; + } + + Vertex_Number += 1; + + if (Vertex_Number != sizeof(Hitbox_Vertices) / sizeof(Hitbox_Vertices[0])) + { + goto Transform_Vertices_Label; + } + } + + Hitbox_Number += 1; + + goto Get_Bounds_Label; } - __int32 Vertex_Number = 0; - - Transform_Vertices_Label: - { - using Screen_Transform_Type = __int8(__cdecl*)(float* World, float* Screen); - - float Screen[3]; - - if (Screen_Transform_Type((unsigned __int32)Client_Module + 1841648)(Hitbox_Vertices[Vertex_Number], Screen) == 0) - { - using Get_Screen_Size_Type = __int32(__cdecl*)(); - - __int32 Screen_Width = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738576)(); - - __int32 Screen_Height = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738544)(); - - Screen[0] = Screen[0] / 2.f * Screen_Width + Screen_Width / 2.f; - - Screen[1] = -Screen[1] / 2.f * Screen_Height + Screen_Height / 2.f; - - Bounds[0] = min(Bounds[0], Screen[0]); - - Bounds[1] = max(Bounds[1], Screen[0]); - - Bounds[2] = min(Bounds[2], Screen[1]); - - Bounds[3] = max(Bounds[3], Screen[1]); - } - else - { - return 0; - } - - Vertex_Number += 1; - - if (Vertex_Number != sizeof(Hitbox_Vertices) / sizeof(Hitbox_Vertices[0])) - { - goto Transform_Vertices_Label; - } - } - - Hitbox_Number += 1; - - goto Get_Bounds_Label; + return 0; } } @@ -242,7 +247,7 @@ void __thiscall Redirected_Paint(void* Panel) { static wchar_t* Survivors[8] = { (wchar_t*)L"Nick", (wchar_t*)L"Rochelle", (wchar_t*)L"Coach", (wchar_t*)L"Ellis", (wchar_t*)L"Bill", (wchar_t*)L"Zoey", (wchar_t*)L"Louis", (wchar_t*)L"Francis" }; - Paint_Data->Name = Survivors[*(__int32*)((unsigned __int32)Target->Self + 7308) + 4 * (*(__int32*)((unsigned __int32)Client_Module + 8144624) == 1)]; + Paint_Data->Name = Survivors[std::clamp(*(__int32*)((unsigned __int32)Target->Self + 7308), 0, 7) + 4 * (*(__int32*)((unsigned __int32)Client_Module + 8144624) == 1)]; } __int8 Ghost = 0;