From e2437349a070451d3a5ae730d33d709de1071f4b Mon Sep 17 00:00:00 2001 From: explorer Date: Sun, 15 Dec 2024 12:14:18 +0300 Subject: [PATCH] shove assist, shotgun shove (finished) https://www.youtube.com/watch?v=FApMeI1KlVo shoving is also beneficial during unholstering for ~266.667ms (depends on sequence_duration, z_gun_swing_interval) that's amended commit (prototype -> finished) --- Copy_Command.hpp | 221 +++++++++++++++++++++++------------------ Extended_Interface.hpp | 4 + Paint.hpp | 42 ++++---- Update_Animations.hpp | 58 +++++------ 4 files changed, 176 insertions(+), 149 deletions(-) diff --git a/Copy_Command.hpp b/Copy_Command.hpp index c1e5d60..23c5542 100644 --- a/Copy_Command.hpp +++ b/Copy_Command.hpp @@ -289,6 +289,24 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu } else { + __int8 Cancelable_Shove = 1 + (*(float*)((unsigned __int32)Local_Player + 7336) < Global_Variables->Current_Time); + + __int32 Weapon_Identifier = Get_Identifier(Weapon, 1, 0); + + __int32 Ammo = *(__int32*)((unsigned __int32)Weapon + 2436); + + static void* Predicted_Shot; + + using Get_Weapon_Data_Type = void*(__thiscall*)(void* Weapon); + + void* Weapon_Data = Get_Weapon_Data_Type((unsigned __int32)Client_Module + 86432)(Weapon); + + __int8 Is_Melee = *(__int32*)((unsigned __int32)Weapon_Data + 352) * (*(__int32*)((unsigned __int32)Weapon_Data + 348) ^ 1) <= 1; + + __int8 Reloading = *(__int8*)((unsigned __int32)Weapon + 2493); + + __int8 Can_Attack = (*(float*)((unsigned __int32)Weapon + 2400) <= Global_Variables->Current_Time) * (Ammo > 0 - Is_Melee * 2) * (Reloading ^ 1) * (*(float*)((unsigned __int32)Local_Player + 3872) <= Global_Variables->Current_Time); + __int32 Entity_Number = 1; using Get_Interpolation_Time_Type = float(__cdecl*)(); @@ -388,151 +406,154 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu size_t Target_Number = 0; - __int8 Reloading = *(__int8*)((unsigned __int32)Weapon + 2493); - - using Get_Weapon_Data_Type = void*(__thiscall*)(void* Weapon); - - void* Weapon_Data = Get_Weapon_Data_Type((unsigned __int32)Client_Module + 86432)(Weapon); - - __int8 Is_Melee = *(__int32*)((unsigned __int32)Weapon_Data + 352) * (*(__int32*)((unsigned __int32)Weapon_Data + 348) ^ 1) <= 1; - - __int8 Can_Attack = (*(float*)((unsigned __int32)Weapon + 2400) <= Global_Variables->Current_Time) * (*(__int32*)((unsigned __int32)Weapon + 2436) > 0 - Is_Melee * 2) * (Reloading ^ 1) * (*(float*)((unsigned __int32)Local_Player + 3872) <= Global_Variables->Current_Time); - __int8 Reviving = *(void**)((unsigned __int32)Local_Player + 8076) != INVALID_HANDLE_VALUE; - __int32 Weapon_Identifier = Get_Identifier(Weapon, 1, 0); - using Get_Eye_Position_Type = void(__thiscall*)(void* Entity, float* Eye_Position); float Eye_Position[3]; Get_Eye_Position_Type((unsigned __int32)Client_Module + 108512)(Local_Player, Eye_Position); - __int8 Cancelable_Shove = 1 + (*(float*)((unsigned __int32)Local_Player + 7336) < Global_Variables->Current_Time); - Target_Structure* Shove_Target = nullptr; + //should be m_flLastShoveTime + z_gun_swing_duration (2704) if (Cancelable_Shove + (*(float*)((unsigned __int32)Weapon + 2400) == *(float*)((unsigned __int32)Weapon + 2404)) > 1) - { - using Get_Sequence_Duration_Type = float(__thiscall*)(void* Entity, void* Studio_Header, __int32 Sequence); - - using Select_Sequence_Type = __int32(__thiscall*)(void* Entity, __int32 Activity); - - using Get_Deploy_Activity_Type = __int32(__thiscall**)(void* Weapon); - - using Translate_Activity_Type = __int32(__thiscall**)(void* Weapon, __int32 Activity); - - __int8 Holstering = (min(*(float*)((unsigned __int32)Local_Player + 3872), *(float*)((unsigned __int32)Weapon + 2412)) + Get_Sequence_Duration_Type((unsigned __int32)Client_Module + 180400)(Weapon, Get_Studio_Header(Weapon), Select_Sequence_Type((unsigned __int32)Client_Module + 202896)(Weapon, (*Translate_Activity_Type(*(unsigned __int32*)Weapon + 1692))(Weapon, (*Get_Deploy_Activity_Type(*(unsigned __int32*)Weapon + 1600))(Weapon)))) > Global_Variables->Current_Time) * (Can_Attack ^ 1); - - __int8 Is_Cold_Melee = Weapon_Identifier == 231; - - Shove_Traverse_Sorted_Target_List_Label: + { + if (*(__int8*)((unsigned __int32)Local_Player + 8070) * (Weapon_Identifier == 231) == 0) { - if (Target_Number != Sorted_Target_List.size()) + if (Interface_Shotgun_Shove.Integer == 1) { - Target_Structure* Target = &Sorted_Target_List.at(Target_Number); - - __int8 Forced = 0; - - if ((Reloading + Holstering + Is_Melee * (Weapon_Identifier * (Command->Buttons & 1) != 39)) * (Action + Reviving ^ 1) != 0) + if ((Weapon_Identifier - 148) % 14 == 0) { - if ((Target->Identifier ^ 72) % 348 >= 72) + if ((void*)((unsigned __int32)Weapon + Ammo) == Predicted_Shot) { - Forced = 1; + Predicted_Shot = nullptr; - goto Shove_Label; + Command->Buttons |= 2048; + + Block_Buttons = 1; } } + } - if (((270 - Is_Cold_Melee - (*(__int8*)((unsigned __int32)Local_Player + 8070) ^ 1) - Target->Identifier) ^ Target->Identifier - 263) > 0) + using Get_Sequence_Duration_Type = float(__thiscall*)(void* Entity, void* Studio_Header, __int32 Sequence); + + using Select_Sequence_Type = __int32(__thiscall*)(void* Entity, __int32 Activity); + + using Get_Deploy_Activity_Type = __int32(__thiscall**)(void* Weapon); + + using Translate_Activity_Type = __int32(__thiscall**)(void* Weapon, __int32 Activity); + + __int8 Holstering = (min(*(float*)((unsigned __int32)Local_Player + 3872), *(float*)((unsigned __int32)Weapon + 2412)) + Get_Sequence_Duration_Type((unsigned __int32)Client_Module + 180400)(Weapon, Get_Studio_Header(Weapon), Select_Sequence_Type((unsigned __int32)Client_Module + 202896)(Weapon, (*Translate_Activity_Type(*(unsigned __int32*)Weapon + 1692))(Weapon, (*Get_Deploy_Activity_Type(*(unsigned __int32*)Weapon + 1600))(Weapon)))) > Global_Variables->Current_Time) * (Can_Attack ^ 1); + + Shove_Traverse_Sorted_Target_List_Label: + { + if (Target_Number != Sorted_Target_List.size()) { - Shove_Label: + Target_Structure* Target = &Sorted_Target_List.at(Target_Number); + + __int8 Forced = 0; + + if (((Command->Buttons & 2048) + Reloading + Holstering + Is_Melee * (Weapon_Identifier * (Command->Buttons & 1) != 39)) * (Action + Reviving ^ 1) != 0) { - __int8 Infected = (Target->Identifier == 264) * (Forced ^ 1); - - __int32 Gender = *(__int32*)((unsigned __int32)Target->Self + 52); - - if ((Infected ^ 1) + (Gender == 15) != 0) + if ((Target->Identifier ^ 72) % 348 >= 72) { - using Get_Sequence_Name_Type = char*(__thiscall*)(void* Entity, __int32 Sequence); + Forced = 1; - if (__builtin_strstr(Get_Sequence_Name_Type((unsigned __int32)Client_Module + 203392)(Target->Self, *(__int32*)((unsigned __int32)Target->Self + 2212)), "hove") == nullptr) + goto Shove_Label; + } + } + + if ((270 - Target->Identifier ^ Target->Identifier - 263) > 0) + { + Shove_Label: + { + __int8 Infected = (Target->Identifier == 264) * (Forced ^ 1); + + __int32 Gender = *(__int32*)((unsigned __int32)Target->Self + 52); + + if ((Infected ^ 1) + (Gender == 15) != 0) { - using Perform_Shove_Trace = __int8(__thiscall*)(void* Weapon, float* Direction); + using Get_Sequence_Name_Type = char*(__thiscall*)(void* Entity, __int32 Sequence); - float* Target_Origin = Get_Center(Target->Self); - - float Direction[3] = + if (__builtin_strstr(Get_Sequence_Name_Type((unsigned __int32)Client_Module + 203392)(Target->Self, *(__int32*)((unsigned __int32)Target->Self + 2212)), "hove") == nullptr) { - Target_Origin[0] - Eye_Position[0], + using Perform_Shove_Trace = __int8(__thiscall*)(void* Weapon, float* Direction); - Target_Origin[1] - Eye_Position[1], + float* Target_Origin = Get_Center(Target->Self); - Target_Origin[2] - Eye_Position[2] - }; - - Vector_Normalize(Direction); - - *(float*)((unsigned __int32)Weapon + 2724) = 75.f; - - *(__int32*)((unsigned __int32)Weapon + 3248) = 0; - - Perform_Trace_Target = Target->Self; - - Perform_Trace_Damage = 0.f; - - Perform_Shove_Trace((unsigned __int32)Client_Module + 3220512)(Weapon, Direction); - - Perform_Trace_Target = nullptr; - - if (Perform_Trace_Damage == 1.f) - { - if (Action == 0) + float Direction[3] = { - Command->Tick_Number = Target->Tick_Number; + Target_Origin[0] - Eye_Position[0], - Command->Angles[0] = __builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180.f / 3.1415927f; + Target_Origin[1] - Eye_Position[1], - Command->Angles[1] = __builtin_atan2f(Direction[1], Direction[0]) * 180.f / 3.1415927f; + Target_Origin[2] - Eye_Position[2] + }; - if (Cancelable_Shove == 1) + Vector_Normalize(Direction); + + *(float*)((unsigned __int32)Weapon + 2724) = 75.f; + + *(__int32*)((unsigned __int32)Weapon + 3248) = 0; + + Perform_Trace_Target = Target->Self; + + Perform_Trace_Damage = 0.f; + + Perform_Shove_Trace((unsigned __int32)Client_Module + 3220512)(Weapon, Direction); + + Perform_Trace_Target = nullptr; + + if (Perform_Trace_Damage == 1.f) + { + if (Action == 0) { - float Shove_Multiplier = min((Global_Variables->Current_Time - *(float*)((unsigned __int32)Weapon + 2704) + *(float*)((unsigned __int32)Weapon + 2700)) / *(float*)((unsigned __int32)Weapon + 2700), 1.f); + Command->Tick_Number = Target->Tick_Number; - Command->Angles[1] += -45.f * Shove_Multiplier + 45.f * (1.f - Shove_Multiplier); - } - else - { - Command->Angles[1] += 45.f; + Command->Angles[0] = __builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180.f / 3.1415927f; + + Command->Angles[1] = __builtin_atan2f(Direction[1], Direction[0]) * 180.f / 3.1415927f; + + if (Cancelable_Shove == 1) + { + float Shove_Multiplier = min((Global_Variables->Current_Time - *(float*)((unsigned __int32)Weapon + 2704) + *(float*)((unsigned __int32)Weapon + 2700)) / *(float*)((unsigned __int32)Weapon + 2700), 1.f); + + Command->Angles[1] += -45.f * Shove_Multiplier + 45.f * (1.f - Shove_Multiplier); + } + else + { + Command->Angles[1] += 45.f; + } + + Command->Buttons |= 2048; + + Block_Buttons = 1; + + Cancelable_Shove = (Gender * Interface_Riot_Deprioritize.Integer * (Forced ^ 1)) == 15; + + *(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target); + + goto Shove_Found_Target_Label; } - Command->Buttons |= 2048; - - Block_Buttons = 1; - - Cancelable_Shove = (Gender * Interface_Riot_Deprioritize.Integer * (Forced ^ 1)) == 15; - - *(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target); + Cancelable_Shove = 0; goto Shove_Found_Target_Label; } - - Cancelable_Shove = 0; - - goto Shove_Found_Target_Label; } } } } - } - Target_Number += 1; + Target_Number += 1; - goto Shove_Traverse_Sorted_Target_List_Label; + goto Shove_Traverse_Sorted_Target_List_Label; - Shove_Found_Target_Label: - { - Shove_Target = Target; + Shove_Found_Target_Label: + { + Shove_Target = Target; + } } } } @@ -776,6 +797,8 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu Command->Angles[2] -= Recoil[2]; } + Predicted_Shot = (void*)((unsigned __int32)Weapon + Ammo - 1); + Block_Buttons = 2048; } } diff --git a/Extended_Interface.hpp b/Extended_Interface.hpp index 52bdf25..c72c369 100755 --- a/Extended_Interface.hpp +++ b/Extended_Interface.hpp @@ -15,6 +15,8 @@ Interface_Structure Interface_Interpolate_Extra_Commands; Interface_Structure Interface_Target_On_Simulation; +Interface_Structure Interface_Shotgun_Shove; + Interface_Structure Interface_Riot_Deprioritize; Interface_Structure Interface_Penetrate_Teammates; @@ -56,6 +58,8 @@ void Implement_Extended_Interface() Create_Interface(Pointer_Name(Interface_Target_On_Simulation), (char*)"0", nullptr); + Create_Interface(Pointer_Name(Interface_Shotgun_Shove), (char*)"1", nullptr); + Create_Interface(Pointer_Name(Interface_Riot_Deprioritize), (char*)"0", nullptr); Create_Interface(Pointer_Name(Interface_Penetrate_Teammates), (char*)"0", nullptr); diff --git a/Paint.hpp b/Paint.hpp index 72437c4..03d57f8 100755 --- a/Paint.hpp +++ b/Paint.hpp @@ -77,7 +77,7 @@ void __thiscall Redirected_Paint(void* Panel) { Target_Structure* Target = &Sorted_Target_List.at(Target_Number); - float Bounds[4] = { __builtin_inff(), -__builtin_inff(), __builtin_inff(), -__builtin_inff()}; + float Bounds[4] = { __builtin_inff(), -__builtin_inff(), __builtin_inff(), -__builtin_inff()}; auto Get_Bounds = [&]() -> __int8 { @@ -121,10 +121,10 @@ void __thiscall Redirected_Paint(void* Panel) 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]; - if (Axis_Number != 2) - { - Axis_Number += 1; + Axis_Number += 1; + if (Axis_Number != sizeof(Hitbox_Vertices[0]) / sizeof(float)) + { goto Initialize_Vertices_Label; } } @@ -162,10 +162,10 @@ void __thiscall Redirected_Paint(void* Panel) return 0; } - if (Vertex_Number != 7) - { - Vertex_Number += 1; + Vertex_Number += 1; + if (Vertex_Number != sizeof(Hitbox_Vertices) / sizeof(Hitbox_Vertices[0])) + { goto Transform_Vertices_Label; } } @@ -252,10 +252,23 @@ void __thiscall Redirected_Paint(void* Panel) Ghost = *(__int8*)((unsigned __int32)Target->Self + 7322); } - auto Draw_Box = [&](__int32 From_X, __int32 From_Y, __int32 To_X, __int32 To_Y) + auto Draw_Box = [&](__int32 From_X, __int32 From_Y, __int32 To_X, __int32 To_Y) -> void { using Set_Color_Type = void(__thiscall**)(void* Surface, unsigned __int8 Red, unsigned __int8 Green, unsigned __int8 Blue, unsigned __int8 Alpha); + if (Ghost == 0) + { + (*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, (__int32)(Paint_Data->Color[0] / 2.f + 0.5f), (__int32)(Paint_Data->Color[1] / 2.f + 0.5f), (__int32)(Paint_Data->Color[2] / 2.f + 0.5f), 128); + } + else + { + (*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 64, 64, 64, 128); + } + + using Draw_Filled_Rect_Type = void(__thiscall**)(void* Surface, __int32 From_X, __int32 From_Y, __int32 To_X, __int32 To_Y); + + (*Draw_Filled_Rect_Type(*(unsigned __int32*)Surface + 48))(Surface, From_X + 2, From_Y + 2, To_X - 2, To_Y - 2); + (*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 0, 0, 0, 255); using Draw_Rect_Type = void(__thiscall**)(void* Surface, __int32 From_X, __int32 From_Y, __int32 To_X, __int32 To_Y); @@ -274,19 +287,6 @@ void __thiscall Redirected_Paint(void* Panel) } (*Draw_Rect_Type(*(unsigned __int32*)Surface + 56))(Surface, From_X, From_Y, To_X, To_Y); - - if (Ghost == 0) - { - (*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, (__int32)(Paint_Data->Color[0] / 2.f + 0.5f), (__int32)(Paint_Data->Color[1] / 2.f + 0.5f), (__int32)(Paint_Data->Color[2] / 2.f + 0.5f), 128); - } - else - { - (*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 64, 64, 64, 128); - } - - using Draw_Filled_Rect_Type = void(__thiscall**)(void* Surface, __int32 From_X, __int32 From_Y, __int32 To_X, __int32 To_Y); - - (*Draw_Filled_Rect_Type(*(unsigned __int32*)Surface + 48))(Surface, From_X + 2, From_Y + 2, To_X - 2, To_Y - 2); }; Draw_Box(Bounds[0], Bounds[2], Bounds[1], Bounds[3]); diff --git a/Update_Animations.hpp b/Update_Animations.hpp index 32f3fe4..0cbae18 100644 --- a/Update_Animations.hpp +++ b/Update_Animations.hpp @@ -1,14 +1,14 @@ struct Global_Variables_Structure { - __int8 Additional_Bytes_1[12]; + __int8 Additional_Bytes_1[12]; - float Current_Time; + float Current_Time; - float Frame_Time; + float Frame_Time; - __int8 Additional_Bytes_2[8]; + __int8 Additional_Bytes_2[8]; - float Interval_Per_Tick; + float Interval_Per_Tick; }; float Update_Animation_Time; @@ -17,42 +17,42 @@ __int8 Update_Animation_Type; void Redirected_Update_Animations() { - Global_Variables_Structure* Global_Variables = *(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744); + Global_Variables_Structure* Global_Variables = *(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744); - float Previous_Current_Time = Global_Variables->Current_Time; + float Previous_Current_Time = Global_Variables->Current_Time; - Global_Variables->Current_Time = Update_Animation_Time; + Global_Variables->Current_Time = Update_Animation_Time; - float Previous_Frame_Time = Global_Variables->Frame_Time; + float Previous_Frame_Time = Global_Variables->Frame_Time; - Global_Variables->Frame_Time = Global_Variables->Interval_Per_Tick * Update_Animation_Type; + Global_Variables->Frame_Time = Global_Variables->Interval_Per_Tick * Update_Animation_Type; - __int32 Entity_Number = 0; + __int32 Entity_Number = 0; - Traverse_Animation_List_Label: - { - if (Entity_Number != *(__int32*)((unsigned __int32)Client_Module + 7479624)) - { - void* Animation_List = *(void**)((unsigned __int32)Client_Module + 7479612); + Traverse_Animation_List_Label: + { + if (Entity_Number != *(__int32*)((unsigned __int32)Client_Module + 7479624)) + { + void* Animation_List = *(void**)((unsigned __int32)Client_Module + 7479612); - if ((*(__int8*)((unsigned __int32)Animation_List + 8 * Entity_Number + 4) & 1) != 0) - { - using Update_Animation_Type = void(__thiscall**)(void* Entity); + if ((*(__int8*)((unsigned __int32)Animation_List + 8 * Entity_Number + 4) & 1) != 0) + { + using Update_Animation_Type = void(__thiscall**)(void* Entity); - void* Entity = *(void**)((unsigned __int32)Animation_List + 8 * Entity_Number); + void* Entity = *(void**)((unsigned __int32)Animation_List + 8 * Entity_Number); - *(float*)((unsigned __int32)Entity + 328) = Update_Animation_Time - Global_Variables->Frame_Time; + *(float*)((unsigned __int32)Entity + 328) = Update_Animation_Time - Global_Variables->Frame_Time; - (*Update_Animation_Type(*(unsigned __int32*)Entity + 808))(Entity); - } + (*Update_Animation_Type(*(unsigned __int32*)Entity + 808))(Entity); + } - Entity_Number += 1; + Entity_Number += 1; - goto Traverse_Animation_List_Label; - } - } + goto Traverse_Animation_List_Label; + } + } - Global_Variables->Frame_Time = Previous_Frame_Time; + Global_Variables->Frame_Time = Previous_Frame_Time; - Global_Variables->Current_Time = Previous_Current_Time; + Global_Variables->Current_Time = Previous_Current_Time; } \ No newline at end of file