43 Commits

Author SHA1 Message Date
6c8f182ebe fix 'cheap' smokecloud 2025-05-26 10:51:17 +03:00
562a6d760e ability handle validation
not tested. probably correct address
2025-03-10 13:08:51 +03:00
5dd6df4471 no push 2025-02-25 12:55:56 +03:00
404b3732e6 stability
implementing logic for custom hitboxes isn't trivial, but at least to not crash; stumbled upon junk in `m_survivorCharacter` at `hehe30_9`. amend: finite checks
2025-02-24 10:29:21 +03:00
7070f6a68c remove FCVAR_CHEAT
just for some (e.g., mat_fullbright)
2025-02-17 11:35:09 +03:00
c6e7a71af1 EF_NODRAW
meant to solve invisible equipment. also, revert: `prevent "asynchronous" destruction violation`; more things are off, i'll have to find root cause of process termination (as soon as i'll be able to reproduce)
2025-02-12 06:26:26 +03:00
bb54206c74 network handle validation
stumbled upon race condition on "拜山2【bai mountain 2】" of m_hActiveWeapon not being updated during reinitialization along with entities or vice versa
2025-02-11 18:04:05 +03:00
386afb13c1 prevent asynchronous destruction violation
spontaneous "C_BasePlayer::RemoveSplitScreenPlayer" seems to be cause. couldn't reproduce to investigate further
2025-02-05 19:58:15 +03:00
92271625c8 always anti-afk 2025-02-05 06:21:06 +03:00
31043114f0 recompute climbing damage 2025-02-04 13:27:57 +03:00
1fc61ba184 ensure pointer isn't dangling (on reconnect)
which is undefined behaviour, as memory isn't necessarily deallocated
2025-02-03 06:29:38 +03:00
359928047c prevent memory corruption on packet loss
realistically, shouldn't ever happen;
theoretically, may happen on great uptime.
2025-02-02 11:00:15 +03:00
631d1e1358 fix typo, anti-afk (fixes #3)
typo is actually on valve's side (array was taken from game's SurvivorCharacterDisplayName function)
2025-02-02 09:06:49 +03:00
d5a3de9a21 disable prediction error smoothing
also z_sidespeed
2025-01-25 07:51:56 +03:00
0b54788d15 ignore burning common, potential collision fix 2025-01-11 17:52:47 +03:00
d12933fe27 fix uninitialized crosshair type
reproduce: give fireaxe; jointeam 1 and sb_takecontrol
2025-01-10 20:00:36 +03:00
f819000cfe s_iSurvivorSet for custom campaigns
e.g., glubtastic5_5 getting into APC affects m_iGender
2025-01-03 19:03:11 +03:00
a402400c01 test action owner
`Shove_Multiplier` wasn't asynchronous but `z_show_swings`
2025-01-03 16:18:13 +03:00
519d56c138 predicted chainsaw state 2/2
unfortunately there's no reliable way due to *::Deploy not being called in certain scenarios but that should serve as good foundation for later improvement.

minor precision loss possibly due to addition being replaced with multiplication (ie. cycle + rate * interval -> ticks * rate * interval)
2025-01-02 21:31:37 +03:00
f5fb3e4d30 predicted chainsaw state 1/2 2024-12-29 15:49:51 +03:00
81feda0668 predicted clock correction 2024-12-27 19:06:35 +03:00
61f5cad124 workaround jockey prediction errors
for some reason networked value (of when jockey wasn't on ground) is getting latched
2024-12-25 14:43:08 +03:00
8496bfcbeb fast actions, fix versus crash
"immobilized" attacks in versus are also considered as action
2024-12-22 14:35:23 +03:00
7b440b4004 precise timers 2/2
may be inaccurate (m_bRedraw, pain/adrenaline timer)
2024-12-21 16:29:02 +03:00
7c6d951aee precise timers 1/2 2024-12-20 14:12:42 +03:00
e2437349a0 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)
2024-12-17 11:02:26 +03:00
0381620f7d prediction, autoshove
fix undefined timing correction;
add shove timing condition;
adjust chainsaw shoving logic.
2024-12-14 07:56:48 +03:00
309a0f2c27 respect Penetrate_Teammates; guaranteed +use 2024-12-13 13:53:38 +03:00
6026914241 better *::Holster detection
m_flTimeAttackQueued is hack to get reload unaffected m_flNextAttack

there are probably false periods before m_flNextSecondaryAttack for Get_Target_Time which isn't critical (with Target_On_Simulation 0) but should be solved eventually
2024-12-12 07:54:57 +03:00
9efc44f17e autoshove during unholstering, use m_Gender instead of m_survivorCharacter
valve uses translator based on s_iSurvivorSet for m_survivorCharacter which is avoidable using m_Gender but potentially unsafe (on modded servers)
2024-12-11 06:54:07 +03:00
02e94e451c m_bInReload check for shotguns, predicted Sequence_Shift
they're using queued attacks.
2024-12-09 06:14:20 +03:00
5d9ab0c46b respect Interpolate_Extra_Commands 2024-12-08 03:59:45 +03:00
6768e29ea6 survivor names
useful for targeted healing/attacks
2024-12-08 02:17:09 +03:00
485ff54642 extend interpolation history; events ordering
intentionally was kept until "something" along with watermark inside of datamap lol

jitters in certain scenarios due to interpolation history not being filled which doesn't bothers anyone (probably) so i've removed "fading"
2024-12-06 03:11:27 +03:00
bd318c5576 Update README.md 2024-11-09 17:50:59 +03:00
82e3a8fd55 nothing 2024-11-09 17:36:57 +03:00
bdf8f51f29 nothing
merged from seg
2024-11-09 15:31:28 +03:00
e462dff4f5 revert to old approach
i've got problem with imagination regarding reliable method of relative correction on networking errors so old approach is preferable for moment

currently focusing on gmod-x64 fork of segregation so probably won't update l4d2 for period of time

[^\S\r\n]+(?=\r?$)
2024-11-05 18:11:13 +03:00
2dc81b9839 adjust special infected shotgun scaling
also explicitly specifying value type seems to be good practice to prevent unintended fraction down-rounding (just what've happened in paint.hpp with color 128 -> 127)
also remove scope check i've competely forgot about in draw_crosshair.hpp
2024-11-01 16:43:34 +03:00
6554d9e04e CTerrorPlayer::IsInvulnerable embryo
i'll get rid of server's timer eventually

also there's bug (i'll take look on later) of "correction accumulation" on tickbase when server is paused which causes memory corruption
2024-10-31 13:33:26 +03:00
68cc187ac7 remove addon restriction
if it doesn't works, probably because i've used magic offset (94)
2024-10-28 12:54:37 +03:00
bc24cea3b5 eliminate m_flStamina induced errors as spitter
for whatever reason m_flStamina inside of C_SpitAbility::UpdateAbility gets pinned at 3000.f (extreme latency concern? or just typo) which in result softlocks C_TerrorPlayer::IsImmobilized for moment ability is updated
it does seems as logic remnant before buffering of 1000.f got implemented (C_TerrorPlayer::IsImmobilized tests for >2000.f) which is needed to keep m_flStamina predicted rather than networked... applying same logic but once solves problem

hopefully i'm not breaking things by omitting m_zombieClass lol

on side note i've thought about adding infinite spit but unfortunately projectiles are using timer-based acceleration

revert: prevent buffer underrun on ack build-up (only for css)
2024-10-28 10:33:10 +03:00
5a7e62dd6f prevent buffer underrun on ack build-up 2024-10-26 16:13:36 +03:00
40 changed files with 1067 additions and 1240 deletions

View File

@ -1,6 +1,38 @@
#pragma once
namespace Byte_Manager
{
#include "Byte_Manager_Functions.hpp"
void Set_Bytes(__int8 Writeable, void* Address, unsigned __int32 Size, unsigned __int8 Byte)
{
if (Writeable == 0)
{
DWORD Previous_Access_Rights;
VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
__builtin_memset(Address, Byte, Size);
VirtualProtect(Address, Size, Previous_Access_Rights, &Previous_Access_Rights);
}
else
{
__builtin_memset(Address, Byte, Size);
}
}
void Copy_Bytes(__int8 Writeable, void* Address, unsigned __int32 Size, void* Bytes)
{
if (Writeable == 0)
{
DWORD Previous_Access_Rights;
VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
__builtin_memcpy(Address, Bytes, Size);
VirtualProtect(Address, Size, Previous_Access_Rights, &Previous_Access_Rights);
}
else
{
__builtin_memcpy(Address, Bytes, Size);
}
}
};

View File

@ -1,22 +0,0 @@
#pragma once
#ifdef Bits_32
void Copy_Bytes(__int8 Modify_Access_Rights, void* Starting_Location, unsigned __int32 Bytes_Amount, void* Bytes)
#else
void Copy_Bytes(__int8 Modify_Access_Rights, void* Starting_Location, unsigned __int64 Bytes_Amount, void* Bytes)
#endif
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
VirtualProtect(Starting_Location, Bytes_Amount, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
}
__builtin_memcpy(Starting_Location, Bytes, Bytes_Amount);
if (Modify_Access_Rights == 1)
{
VirtualProtect(Starting_Location, Bytes_Amount, Previous_Access_Rights, &Previous_Access_Rights);
}
}

View File

@ -1,24 +0,0 @@
#pragma once
#ifdef Bits_32
void* Find_Bytes(void* Starting_Location, void* Bytes, unsigned __int32 Bytes_Amount)
#else
void* Find_Bytes(void* Starting_Location, void* Bytes, unsigned __int64 Bytes_Amount)
#endif
{
Compare_Bytes_Label:
{
if (__builtin_memcmp(Starting_Location, Bytes, Bytes_Amount) == 0)
{
return Starting_Location;
}
#ifdef Bits_32
Starting_Location = (void*)((unsigned __int32)Starting_Location + 1);
#else
Starting_Location = (void*)((unsigned __int64)Starting_Location + 1);
#endif
goto Compare_Bytes_Label;
}
}

View File

@ -1,7 +0,0 @@
#pragma once
#include "Byte_Manager_Find_Bytes.hpp"
#include "Byte_Manager_Set_Bytes.hpp"
#include "Byte_Manager_Copy_Bytes.hpp"

View File

@ -1,22 +0,0 @@
#pragma once
#ifdef Bits_32
void Set_Bytes(__int8 Modify_Access_Rights, void* Starting_Location, unsigned __int32 Bytes_Amount, unsigned __int8 Byte)
#else
void Set_Bytes(__int8 Modify_Access_Rights, void* Starting_Location, unsigned __int64 Bytes_Amount, unsigned __int8 Byte)
#endif
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
VirtualProtect(Starting_Location, Bytes_Amount, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
}
__builtin_memset(Starting_Location, Byte, Bytes_Amount);
if (Modify_Access_Rights == 1)
{
VirtualProtect(Starting_Location, Bytes_Amount, Previous_Access_Rights, &Previous_Access_Rights);
}
}

View File

@ -4,7 +4,5 @@ void __thiscall Redirected_Calculate_View(void* Player, void* Unknown_Parameter_
{
(decltype(&Redirected_Calculate_View)(Original_Calculate_View_Caller))(Player, Unknown_Parameter_1, Angles, Unknown_Parameter_2);
using Get_Eye_Angles_Type = float*(__thiscall*)(void* Entity);
Byte_Manager::Copy_Bytes(0, Angles, sizeof(float[3]), Get_Eye_Angles_Type((unsigned __int32)Client_Module + 2237296)(Player));
Byte_Manager::Copy_Bytes(1, Angles, sizeof(float[3]), (float*)((unsigned __int32)Player + 4996));
}

View File

@ -13,15 +13,20 @@ struct Target_Structure
std::vector<Target_Structure> Sorted_Target_List;
void* Get_Studio_Header(void* Entity)
{
using Get_Studio_Header_Type = void*(__thiscall*)(void* Entity);
return Get_Studio_Header_Type((unsigned __int32)Client_Module + 8512)(Entity);
}
void* Get_Hitbox_Set(Target_Structure* Target, float(*Bones)[3][4], float Time)
{
using Setup_Bones_Type = __int8(__thiscall*)(void* Entity, void* Bones, __int32 Maximum_Bones, __int32 Mask, float Current_Time);
using Setup_Bones_Type = __int8(__thiscall*)(void* Entity, void* Bones, __int32 Maximum_Bones, __int32 Mask, float Time);
if (Setup_Bones_Type((unsigned __int32)Client_Module + 246656)((void*)((unsigned __int32)Target->Self + 4), Bones, 128, 524032, Time) == 1)
{
using Get_Studio_Header_Type = void*(__thiscall*)(void* Entity);
void* Studio_Header = *(void**)Get_Studio_Header_Type((unsigned __int32)Client_Module + 8512)(Target->Self);
void* Studio_Header = *(void**)Get_Studio_Header(Target->Self);
return (void*)((unsigned __int32)Studio_Header + *(__int32*)((unsigned __int32)Studio_Header + 176));
}
@ -45,68 +50,77 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
if (Extra_Commands == -1)
{
*(float*)((unsigned __int32)Local_Player + 16) = Global_Variables->Interval_Per_Tick;
*(__int32*)((unsigned __int32)Local_Player + 20) = Command->Command_Number;
void* Prediction_Frame = *(void**)((unsigned __int32)Local_Player + 1500);
if (Prediction_Frame != nullptr)
if ((Command->Buttons & 524288) == 524288)
{
if ((Command->Buttons & 524288) == 524288)
{
Extended_Command->Extra_Commands = max(0, Extra_Commands = std::clamp(Interface_Extra_Commands.Integer, (__int32)(0.06f / Global_Variables->Interval_Per_Tick + 0.5f), 14));
Extended_Command->Extra_Commands = max(0, Extra_Commands = std::clamp(Interface_Extra_Commands.Integer, (__int32)(0.06f / Global_Variables->Interval_Per_Tick + 0.5f), 14));
*(__int32*)Prediction_Frame = min(*(__int32*)Prediction_Frame + 1, Extended_Command->Extra_Commands * Interface_Interpolate_Extra_Commands.Integer);
}
else
*(float*)((unsigned __int32)Local_Player + 16) *= 1.f + Extended_Command->Extra_Commands * Interface_Interpolate_Extra_Commands.Integer;
}
__int32 Variable_Number = 0;
Traverse_Variables_Label:
{
void* Variable = *(void**)(*(unsigned __int32*)((unsigned __int32)Local_Player + 24) + Variable_Number * 12 + 8);
*(float*)((unsigned __int32)Variable + 36) = *(float*)((unsigned __int32)Local_Player + 16);
Variable_Number += 1;
if (Variable_Number != *(__int32*)((unsigned __int32)Local_Player + 36))
{
*(__int32*)Prediction_Frame = max(0, *(__int32*)Prediction_Frame - 1);
goto Traverse_Variables_Label;
}
}
}
if (*(__int8*)((unsigned __int32)Local_Player + 327) == 0)
{
Command->Buttons |= 4194304 * (Command->Command_Number % 2);
float Move_Angles[3] =
{
Command->Angles[0],
Command->Angles[1],
0
Command->Angles[1]
};
static float Previous_Move_Angle_Y;
if ((Command->Buttons & 2) == 2)
if ((Command->Buttons & 2) + *(__int8*)((unsigned __int32)Local_Player + 324) == 4)
{
Command->Move[0] = 0;
Command->Move[0] = 0.f;
if (*(__int32*)((unsigned __int32)Local_Player + 316) == -1)
if (*(void**)((unsigned __int32)Local_Player + 316) == INVALID_HANDLE_VALUE)
{
Command->Buttons &= ~(*(__int8*)((unsigned __int32)Local_Player + 324) & 2);
Command->Buttons &= ~2;
}
else
{
Command->Buttons &= ~(*(__int32*)((unsigned __int32)Local_Player + 5028) & 2);
}
float Difference = __builtin_remainderf(Move_Angles[1] - Previous_Move_Angle_Y, 360);
float Difference = __builtin_remainderf(Move_Angles[1] - Previous_Move_Angle_Y, 360.f);
Previous_Move_Angle_Y = Move_Angles[1];
float* Velocity = (float*)((unsigned __int32)Local_Player + 256);
if (__builtin_fabsf(Difference) < __builtin_atan2f(30, __builtin_hypotf(Velocity[0], Velocity[1])) * 180 / 3.1415927f)
if (__builtin_fabsf(Difference) < __builtin_atan2f(30.f, __builtin_hypotf(Velocity[0], Velocity[1])) * 180.f / 3.1415927f)
{
float Strafe_Angle = __builtin_remainderf(Move_Angles[1] - __builtin_atan2f(Velocity[1], Velocity[0]) * 180 / 3.1415927f, 360);
float Strafe_Angle = __builtin_remainderf(Move_Angles[1] - __builtin_atan2f(Velocity[1], Velocity[0]) * 180.f / 3.1415927f, 360.f);
if (__builtin_signbitf(Strafe_Angle) == 0)
{
Command->Move[1] = -400;
Command->Move[1] = -450.f;
}
else
{
Command->Move[1] = 400;
Command->Move[1] = 450.f;
}
Move_Angles[1] -= Strafe_Angle;
@ -115,11 +129,11 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
{
if (__builtin_signbitf(Difference) == 0)
{
Command->Move[1] = -400;
Command->Move[1] = -450.f;
}
else
{
Command->Move[1] = 400;
Command->Move[1] = 450.f;
}
}
}
@ -130,7 +144,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
float Previous_Move[2];
Byte_Manager::Copy_Bytes(0, Previous_Move, sizeof(Previous_Move), Command->Move);
Byte_Manager::Copy_Bytes(1, Previous_Move, sizeof(Previous_Move), Command->Move);
float Desired_Move_Forward[3];
@ -138,11 +152,11 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
Angle_Vectors(Move_Angles, Desired_Move_Forward, Desired_Move_Right, nullptr);
Desired_Move_Forward[2] = 0;
Desired_Move_Forward[2] = 0.f;
Vector_Normalize(Desired_Move_Forward);
Desired_Move_Right[2] = 0;
Desired_Move_Right[2] = 0.f;
Vector_Normalize(Desired_Move_Right);
@ -161,11 +175,11 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
Angle_Vectors(Command->Angles, Move_Forward, Move_Right, nullptr);
Move_Forward[2] = 0;
Move_Forward[2] = 0.f;
Vector_Normalize(Move_Forward);
Move_Right[2] = 0;
Move_Right[2] = 0.f;
Vector_Normalize(Move_Right);
@ -178,13 +192,15 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
Correct_Movement();
Extended_Command_Structure* Initial_Extended_Command = &Extended_Commands[*(__int32*)((unsigned __int32)Local_Player + 20) % 150];
void* Network_Channel = *(void**)(*(unsigned __int32*)((unsigned __int32)Engine_Module + 4352236) + 24);
auto Sequence_Shift = [&](__int32 Reserve)
auto Sequence_Shift = [&](__int32 Reserve) -> void
{
if (Extended_Commands[*(__int32*)((unsigned __int32)Local_Player + 20) % 150].Sequence_Shift == 0)
if (Initial_Extended_Command->Sequence_Shift == 0)
{
__int32 Sequence_Shift = (*(__int32*)((unsigned __int32)Local_Player + 5324) + ~-150) / 150 * 150 + (Reserve * 150);
__int32 Sequence_Shift = (*(__int32*)((unsigned __int32)Local_Player + 5324) - Extended_Command->Extra_Commands + ~-150) / 150 * 150 + (Reserve * 150);
if (Sequence_Shift > 0)
{
@ -209,33 +225,93 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
}
};
static __int32 Accumulative_Correction;
auto Disable_Clock_Correction = [&](__int32 Queue) -> void
{
if (Queue > 0)
{
if (Extended_Command == Initial_Extended_Command)
{
Extended_Command->Extra_Commands = 0;
Extra_Commands = max((__int32)(0.06f / Global_Variables->Interval_Per_Tick + 0.5f), Queue);
}
else
{
Accumulative_Correction += 1;
}
if (Initial_Extended_Command->Extra_Commands == 0)
{
*(__int32*)((unsigned __int32)Network_Channel + 16) = -1;
*(__int32*)((unsigned __int32)Network_Channel + 28) = 255;
}
}
};
auto Correct_Extended_Command = [&]() -> void
{
if (*(__int32*)((unsigned __int32)Network_Channel + 16) != -1)
{
Extended_Command->Extra_Commands += Accumulative_Correction;
Accumulative_Correction = 0;
}
Extended_Command->Sequence_Shift = Initial_Extended_Command->Sequence_Shift;
};
if (*(__int32*)((unsigned __int32)Local_Player + 228) == 3)
{
if (*(__int8*)((unsigned __int32)Local_Player + 7322) == 1)
if (*(__int8*)((unsigned __int32)Local_Player + 7322) == 0)
{
if (*(void**)((unsigned __int32)Local_Player + 10008) == INVALID_HANDLE_VALUE)
{
if ((*(void**)((unsigned __int32)Local_Player + 10012) != INVALID_HANDLE_VALUE) + (*(void**)((unsigned __int32)Local_Player + 10024) != INVALID_HANDLE_VALUE) + (*(void**)((unsigned __int32)Local_Player + 10056) != INVALID_HANDLE_VALUE) != 0)
{
Command->Buttons |= (*(void**)((unsigned __int32)Local_Player + 10056) != INVALID_HANDLE_VALUE) * 2;
Disable_Clock_Correction(Interface_Extra_Commands_Action.Integer);
}
}
else
{
Sequence_Shift(2);
}
}
else
{
if (*(__int32*)((unsigned __int32)Local_Player + 7324) == 0)
{
Sequence_Shift(-2);
}
}
else
{
if (*(void**)((unsigned __int32)Local_Player + 10008) != INVALID_HANDLE_VALUE)
{
Sequence_Shift(2);
}
}
Extended_Command->Sequence_Shift = Extended_Commands[*(__int32*)((unsigned __int32)Local_Player + 20) % 150].Sequence_Shift;
Correct_Extended_Command();
}
else
{
if ((*(float*)((unsigned __int32)Local_Player + 4604) + 800 * Global_Variables->Interval_Per_Tick >= 560) + *(__int8*)((unsigned __int32)Local_Player + 8068) + *(__int8*)((unsigned __int32)Local_Player + 9708) != 0)
__int8 Action = *(void**)((unsigned __int32)Local_Player + 7076) == *(void**)((unsigned __int32)Local_Player + 376);
__int8 Reviving = *(void**)((unsigned __int32)Local_Player + 8076) != INVALID_HANDLE_VALUE;
if ((*(float*)((unsigned __int32)Local_Player + 4604) + 800.f * Global_Variables->Interval_Per_Tick >= 560.f) + *(__int8*)((unsigned __int32)Local_Player + 8068) + *(__int8*)((unsigned __int32)Local_Player + 9708) != 0)
{
Sequence_Shift(2);
}
else
{
if (Action + Reviving != 0)
{
Disable_Clock_Correction(Interface_Extra_Commands_Action.Integer);
}
}
Extended_Command->Sequence_Shift = Extended_Commands[*(__int32*)((unsigned __int32)Local_Player + 20) % 150].Sequence_Shift;
Correct_Extended_Command();
*(__int32*)((unsigned __int32)Local_Player + 5620) = Command->Command_Number;
void* Prediction = (void*)((unsigned __int32)Client_Module + 8072728);
@ -257,13 +333,15 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
if ((*(__int32*)((unsigned __int32)Local_Player + 324) & 9) == 0)
{
if ((*(__int32*)((unsigned __int32)Local_Player + 5020) & 32) == 0)
if ((*(__int32*)((unsigned __int32)Local_Player + 5020) & 32) * (Action ^ 1) == 0)
{
using Can_Attack_Type = __int8(__thiscall*)(void* Player);
if (Can_Attack_Type((unsigned __int32)Client_Module + 2541696)(Local_Player) == 1)
{
void* Weapon = *(__int8*)((unsigned __int32)Local_Player + 7867) == 0 ? *(void**)((unsigned __int32)Client_Module + 7644532 + (((*(unsigned __int32*)((unsigned __int32)Local_Player + 4228) & 4095) - 4097) << 4)) : nullptr;
using Get_Weapon_Type = void*(__thiscall*)(void* Entity);
void* Weapon = *(__int8*)((unsigned __int32)Local_Player + 7867) == 0 ? Get_Weapon_Type((unsigned __int32)Client_Module + 74304)(Local_Player) : nullptr;
if (Weapon == nullptr)
{
@ -271,6 +349,59 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
}
else
{
__int8 Cancelable_Shove = 1 + (*(float*)((unsigned __int32)Local_Player + 7336) < Global_Variables->Time) * (*(float*)((unsigned __int32)Weapon + 2404) <= Global_Variables->Time);
__int32 Weapon_Identifier = Get_Identifier(Weapon, 1, 0);
if ((Weapon_Identifier == 105) + (Weapon_Identifier == 121) == 0)
{
static std::unordered_set<__int32> Grenades = { 106, 118, 129 };
if (Grenades.contains(Weapon_Identifier) == 1)
{
Cancelable_Shove = min((*(__int16*)((unsigned __int32)Weapon + 3304) == 0) + (*(float*)((unsigned __int32)Weapon + 3308) == 0.f), Cancelable_Shove);
}
}
else
{
Cancelable_Shove = min(1 + (*(float*)((unsigned __int32)Weapon + 3312) == -1.f), Cancelable_Shove);
}
__int8 In_Shove = Global_Variables->Time >= *(float*)((unsigned __int32)Local_Player + 7904);
if (Global_Variables->Time >= *(float*)((unsigned __int32)Weapon + 2704))
{
In_Shove = *(__int8*)((unsigned __int32)Weapon + 2720);
}
__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 = 0;
if (Weapon_Identifier == 39)
{
Can_Attack = (min(Chainsaw_Cycles * 0.46153846f * Global_Variables->Interval_Per_Tick, 1.f) > 0.95f) * (In_Shove ^ 1);
}
else
{
Can_Attack = (*(float*)((unsigned __int32)Weapon + 2400) <= Global_Variables->Time) * (Ammo > 0 - Is_Melee * 2) * (Reloading ^ 1);
if ((*(double*)((unsigned __int32)Weapon + 3392) == 0.) * Weapon_Identifier == 153)
{
Can_Attack *= *(float*)((unsigned __int32)Weapon + 3400) <= Global_Variables->Time;
}
}
__int32 Entity_Number = 1;
using Get_Interpolation_Time_Type = float(__cdecl*)();
@ -303,7 +434,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
{
if (*(__int32*)((unsigned __int32)Entity + 228) % 2 != *(__int32*)((unsigned __int32)Local_Player + 228) % 2)
{
float* Local_Player_Origin = (float*)((unsigned __int32)Local_Player + 292);
float* Local_Origin = (float*)((unsigned __int32)Local_Player + 292);
float* Entity_Origin = (float*)((unsigned __int32)Entity + 292);
@ -317,7 +448,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
(__int8)(Identifier == 270 ? *(void**)((unsigned __int32)Entity + 8040) == *(void**)((unsigned __int32)Local_Player + 376) : 0),
__builtin_powf(Local_Player_Origin[0] - Entity_Origin[0], 2) + __builtin_powf(Local_Player_Origin[1] - Entity_Origin[1], 2) + __builtin_powf(Local_Player_Origin[2] - Entity_Origin[2], 2),
__builtin_powf(Local_Origin[0] - Entity_Origin[0], 2.f) + __builtin_powf(Local_Origin[1] - Entity_Origin[1], 2.f) + __builtin_powf(Local_Origin[2] - Entity_Origin[2], 2.f),
(__int32)(Time / Global_Variables->Interval_Per_Tick + 0.5f)
};
@ -326,7 +457,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
{
if (Identifier == 277)
{
if (*(float*)((unsigned __int32)Entity + 4844) == 1)
if (*(float*)((unsigned __int32)Entity + 4844) == 1.f)
{
Sorted_Target_List.push_back(Target);
}
@ -349,167 +480,182 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
}
}
auto Target_List_Sort_Prepare = [](Target_Structure& X, Target_Structure& Y) -> __int8
auto Target_List_Sort = [](Target_Structure& X, Target_Structure& Y) -> __int8
{
return X.Priority < Y.Priority;
};
std::sort(Sorted_Target_List.begin(), Sorted_Target_List.end(), Target_List_Sort_Prepare);
auto Target_List_Sort_Finish = [](Target_Structure& X, Target_Structure& Y) -> __int8
{
if (X.Priority > Y.Priority)
if (X.Priority == Y.Priority)
{
return 1;
return X.Distance < Y.Distance;
}
return X.Distance < Y.Distance;
return X.Priority > Y.Priority;
};
std::sort(Sorted_Target_List.begin(), Sorted_Target_List.end(), Target_List_Sort_Finish);
std::sort(Sorted_Target_List.begin(), Sorted_Target_List.end(), Target_List_Sort);
size_t Target_Number = 0;
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;
__int32 Action = *(__int32*)((unsigned __int32)Local_Player + 7080) != 0;
__int8 Reviving = *(void**)((unsigned __int32)Local_Player + 8076) != INVALID_HANDLE_VALUE;
__int32 Weapon_Identifier = Get_Identifier(Weapon, 1, 0);
__int8 Is_Cold_Melee = Weapon_Identifier == 231;
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;
Shove_Traverse_Sorted_Target_List_Label:
if (Cancelable_Shove + In_Shove > 1)
{
if (Target_Number != Sorted_Target_List.size())
if (*(__int8*)((unsigned __int32)Local_Player + 8070) * (Weapon_Identifier == 231) == 0)
{
Target_Structure* Target = &Sorted_Target_List.at(Target_Number);
__int8 Forced = 0;
if ((*(__int8*)((unsigned __int32)Weapon + 2493) + Is_Melee) * (Action + Reviving ^ 1) != 0)
if (Interface_Shotgun_Shove.Integer == 1)
{
if ((Target->Identifier ^ 72) % 348 >= 72)
if ((Weapon_Identifier - 148) % 14 == 0)
{
Forced = 1;
goto Shove_Label;
}
}
if (((270 - Is_Cold_Melee - (*(__int8*)((unsigned __int32)Local_Player + 8070) ^ 1) - 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)
if ((void*)((unsigned __int32)Weapon + Ammo) == Predicted_Shot)
{
using Get_Sequence_Name_Type = char*(__thiscall*)(void* Entity, __int32 Sequence);
Predicted_Shot = nullptr;
if (__builtin_strstr(Get_Sequence_Name_Type((unsigned __int32)Client_Module + 203392)(Target->Self, *(__int32*)((unsigned __int32)Target->Self + 2212)), "hove") == nullptr)
{
using Perform_Shove_Trace = __int8(__thiscall*)(void* Weapon, float* Direction);
Command->Buttons |= 2048;
float* Target_Origin = Get_Center(Target->Self);
float Direction[3] =
{
Target_Origin[0] - Eye_Position[0],
Target_Origin[1] - Eye_Position[1],
Target_Origin[2] - Eye_Position[2]
};
Vector_Normalize(Direction);
*(float*)((unsigned __int32)Weapon + 2724) = 75;
*(__int32*)((unsigned __int32)Weapon + 3248) = 0;
Perform_Trace_Target = Target->Self;
Perform_Trace_Damage = 0;
Perform_Shove_Trace((unsigned __int32)Client_Module + 3220512)(Weapon, Direction);
Perform_Trace_Target = nullptr;
if (Perform_Trace_Damage == 1)
{
if (Action == 0)
{
Command->Tick_Number = Target->Tick_Number;
Command->Angles[0] = __builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180 / 3.1415927f;
Command->Angles[1] = __builtin_atan2f(Direction[1], Direction[0]) * 180 / 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 * Shove_Multiplier + 45 * (1 - Shove_Multiplier);
}
else
{
Command->Angles[1] += 45;
}
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;
}
Cancelable_Shove = 0;
goto Shove_Found_Target_Label;
}
}
Block_Buttons = 1;
}
}
}
Target_Number += 1;
__int8 Is_Chainsaw = Weapon_Identifier == 39;
goto Shove_Traverse_Sorted_Target_List_Label;
__int8 Holstering = 0;
Shove_Found_Target_Label:
if (Is_Chainsaw == 0)
{
Shove_Target = Target;
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 Translate_Activity_Type = __int32(__thiscall**)(void* Weapon, __int32 Activity);
using Get_Deploy_Activity_Type = __int32(__thiscall**)(void* Weapon);
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->Time) * (Can_Attack ^ 1);
}
else
{
Is_Chainsaw = Can_Attack * (Command->Buttons & 1);
}
Shove_Traverse_Sorted_Target_List_Label:
{
if (Target_Number != Sorted_Target_List.size())
{
Target_Structure* Target = &Sorted_Target_List.at(Target_Number);
__int8 Forced = 0;
if (((Command->Buttons & 2048) + Reloading + Holstering + Is_Melee * (Is_Chainsaw ^ 1)) * (Action + Reviving ^ 1) != 0)
{
if ((Target->Identifier ^ 72) % 348 >= 72)
{
Forced = 1;
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)
{
if (__builtin_strstr(Get_Sequence_Name(Target->Self), "hove") == nullptr)
{
using Perform_Shove_Trace = __int8(__thiscall*)(void* Weapon, float* Direction);
float* Target_Origin = Get_Center(Target->Self);
float Direction[3] =
{
Target_Origin[0] - Eye_Position[0],
Target_Origin[1] - Eye_Position[1],
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)
{
Command->Tick_Number = Target->Tick_Number;
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->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;
}
Cancelable_Shove = 0;
goto Shove_Found_Target_Label;
}
}
}
}
}
Target_Number += 1;
goto Shove_Traverse_Sorted_Target_List_Label;
Shove_Found_Target_Label:
{
Shove_Target = Target;
}
}
}
}
}
if (Cancelable_Shove != 0)
{
__int8 Can_Attack = (*(float*)((unsigned __int32)Weapon + 2400) <= Global_Variables->Current_Time) * (*(__int32*)((unsigned __int32)Weapon + 2436) > 0 - Is_Melee * 2) * (*(float*)((unsigned __int32)Local_Player + 3872) <= Global_Variables->Current_Time);
if (Reviving + (Weapon_Identifier == 96) + (Can_Attack ^ 1) == 0)
if (Reviving + (Can_Attack ^ 1) == 0)
{
Target_Structure* Aim_Target = nullptr;
@ -535,12 +681,9 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
{
if (Weapon_Identifier == 153)
{
if (*(float*)((unsigned __int32)Weapon + 3392) + *(float*)((unsigned __int32)Weapon + 3396) != 0)
{
Compensate_Burst = 1;
Compensate_Burst = *(double*)((unsigned __int32)Weapon + 3392) != 0.;
Command->Buttons |= 1;
}
Command->Buttons |= Compensate_Burst;
}
else
{
@ -571,7 +714,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
float Bones[128][3][4];
void* Hitbox_Set = Get_Hitbox_Set(Target, Bones, Global_Variables->Current_Time);
void* Hitbox_Set = Get_Hitbox_Set(Target, Bones, Global_Variables->Time);
if (Hitbox_Set != nullptr)
{
@ -581,14 +724,14 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
__int32 Bullets = *(__int32*)((unsigned __int32)Weapon_Data + 2520);
if (Interface_Penetration_Damage.Floating_Point == 0)
if (Interface_Penetration_Damage.Floating_Point == 0.f)
{
*(__int32*)((unsigned __int32)Weapon_Data + 2520) = 1;
}
Perform_Trace_Target = Target->Self;
Perform_Trace_Damage = 0;
Perform_Trace_Damage = 0.f;
void* Previous_Audio_Device = *(void**)((unsigned __int32)Engine_Module + 5050008);
@ -622,7 +765,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
*(__int32*)((unsigned __int32)Weapon_Data + 2520) = Bullets;
return (Perform_Trace_Damage >= Interface_Penetration_Damage.Floating_Point) * (Perform_Trace_Damage != 0);
return (Perform_Trace_Damage >= Interface_Penetration_Damage.Floating_Point) * (Perform_Trace_Damage != 0.f);
};
static std::unordered_map<__int32, __int32> Hitboxes =
@ -650,59 +793,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,
float* Hitbox_Minimum = (float*)((unsigned __int32)Hitbox + 8);
(Hitbox_Minimum[1] + Hitbox_Maximum[1]) / 2,
float* Hitbox_Maximum = (float*)((unsigned __int32)Hitbox + 20);
(Hitbox_Minimum[2] + Hitbox_Maximum[2]) / 2
};
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 / 3.1415927f,
Target_Origin[2] - Eye_Position[2]
};
__builtin_atan2f(Direction[1], Direction[0]) * 180 / 3.1415927f,
Vector_Normalize(Direction);
0
};
float Angles[3] =
{
__builtin_atan2f(-Direction[2], __builtin_hypotf(Direction[0], Direction[1])) * 180.f / 3.1415927f,
if (Perform_Trace(Angles) == 1)
{
Command->Tick_Number = Target->Tick_Number;
__builtin_atan2f(Direction[1], Direction[0]) * 180.f / 3.1415927f
};
Byte_Manager::Copy_Bytes(0, Command->Angles, sizeof(Angles), Angles);
if (Perform_Trace(Angles) == 1)
{
Command->Tick_Number = Target->Tick_Number;
Command->Buttons |= 1;
Byte_Manager::Copy_Bytes(1, Command->Angles, sizeof(Angles), Angles);
*(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target);
Command->Buttons |= 1;
goto Aim_Found_Target_Label;
*(float*)((unsigned __int32)Target->Self + 16) = Get_Target_Time(Target);
goto Aim_Found_Target_Label;
}
}
}
@ -722,7 +866,7 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
{
if (Shove_Target != nullptr)
{
*(float*)((unsigned __int32)Shove_Target->Self + 16) = 0;
*(float*)((unsigned __int32)Shove_Target->Self + 16) = 0.f;
if (Aim_Target != nullptr)
{
@ -747,6 +891,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;
}
}
@ -763,11 +909,11 @@ void __thiscall Redirected_Copy_Command(void* Unknown_Parameter, Command_Structu
Command->Buttons &= ~Block_Buttons;
Byte_Manager::Copy_Bytes(0, Command->Move, sizeof(Previous_Move), Previous_Move);
Byte_Manager::Copy_Bytes(1, Command->Move, sizeof(Previous_Move), Previous_Move);
Correct_Movement();
*(__int8*)((unsigned __int32)__builtin_frame_address(0) + 235) = Extra_Commands <= 0;
*(__int8*)((unsigned __int32)__builtin_frame_address(0) + 235) = max(Extra_Commands <= 0, *(__int32*)((unsigned __int32)Network_Channel + 16) == -1);
}
}

View File

@ -1,64 +1,71 @@
void Redirected_Draw_Crosshair()
{
if ((*(__int32*)(*(unsigned __int32*)((unsigned __int32)Client_Module + 7498712) + 5008) | 55) == 55)
static float Rotation_Angle;
auto Draw_Storm = [&](__int32 X, __int32 Y, __int32 Additional_Rotation_Angle)
{
static float Rotation_Angle;
using Set_Color_Type = void(__thiscall**)(void* Surface, unsigned __int8 Red, unsigned __int8 Green, unsigned __int8 Blue, unsigned __int8 Alpha);
auto Draw_Storm = [&](__int32 X, __int32 Y, __int32 Additional_Rotation_Angle)
void* Surface = *(void**)((unsigned __int32)Client_Module + 8960244);
(*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 0, 0, 0, 255);
using Draw_Circle_Type = void(__thiscall**)(void* Surface, __int32 X, __int32 Y, __int32 Radius, __int32 Segments);
X += Interface_Storm_Rotation_Radius.Integer * __builtin_cosf(__builtin_remainderf(Rotation_Angle + Additional_Rotation_Angle, 360.f) * 3.1415927f / 180.f);
Y += Interface_Storm_Rotation_Radius.Integer * __builtin_sinf(__builtin_remainderf(Rotation_Angle + Additional_Rotation_Angle, 360.f) * 3.1415927f / 180.f);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 0, 128, 255, 255);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
};
__int32 Storm_Number = 0;
using Get_Screen_Size_Type = __int32(__cdecl*)(__int32* Width, __int32* Height);
__int32 Screen_Width;
__int32 Screen_Height;
Get_Screen_Size_Type((unsigned __int32)Client_Module + 1780352)(&Screen_Width, &Screen_Height);
Screen_Width /= 2;
Screen_Height /= 2;
Draw_Storm_Label:
{
if (Storm_Number < Interface_Storm_Iterations.Integer)
{
using Set_Color_Type = void(__thiscall**)(void* Surface, unsigned __int8 Red, unsigned __int8 Green, unsigned __int8 Blue, unsigned __int8 Alpha);
Draw_Storm(Screen_Width, Screen_Height, Storm_Number * 360 / Interface_Storm_Iterations.Integer);
void* Surface = *(void**)((unsigned __int32)Client_Module + 8960244);
Storm_Number += 1;
(*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 0, 0, 0, 255);
using Draw_Circle_Type = void(__thiscall**)(void* Surface, __int32 X, __int32 Y, __int32 Radius, __int32 Segments);
X += Interface_Storm_Rotation_Radius.Integer * __builtin_cosf(__builtin_remainderf(Rotation_Angle + Additional_Rotation_Angle, 360) * 3.1415927f / 180);
Y += Interface_Storm_Rotation_Radius.Integer * __builtin_sinf(__builtin_remainderf(Rotation_Angle + Additional_Rotation_Angle, 360) * 3.1415927f / 180);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y - 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X - 1, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X + 1, Y + 1, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
(*Set_Color_Type(*(unsigned __int32*)Surface + 44))(Surface, 0, 128, 255, 255);
(*Draw_Circle_Type(*(unsigned __int32*)Surface + 384))(Surface, X, Y, Interface_Storm_Radius.Integer, Interface_Storm_Segments.Integer);
};
__int32 Storm_Number = 0;
using Get_Screen_Size_Type = __int32(__cdecl*)();
__int32 Screen_Width = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738576)() / 2;
__int32 Screen_Height = Get_Screen_Size_Type((unsigned __int32)Client_Module + 738544)() / 2;
Draw_Storm_Label:
{
if (Storm_Number < Interface_Storm_Iterations.Integer)
{
Draw_Storm(Screen_Width, Screen_Height, Storm_Number * 360 / Interface_Storm_Iterations.Integer);
Storm_Number += 1;
goto Draw_Storm_Label;
}
goto Draw_Storm_Label;
}
Rotation_Angle = __builtin_remainderf(Rotation_Angle + (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Frame_Time * Interface_Storm_Speed.Integer, 360);
}
Rotation_Angle = __builtin_remainderf(Rotation_Angle + (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Frame_Time * Interface_Storm_Speed.Integer, 360.f);
using Get_Display_Type = void*(__cdecl*)();
*(__int32*)((unsigned __int32)Get_Display_Type((unsigned __int32)Client_Module + 2930128)() + 400) = 0;
}

View File

@ -2,11 +2,9 @@ void* Original_Draw_Effect_Caller;
__int8 __thiscall Redirected_Draw_Effect(void* Effect, void* Unknown_Parameter_1, void* Unknown_Parameter_2)
{
using Get_Effect_Name_Type = char*(__thiscall*)(void* a1);
using Get_Effect_Name_Type = char*(__thiscall*)(void* Effect);
char* Effect_Name = Get_Effect_Name_Type((unsigned __int32)Client_Module + 1423120)((void*)((unsigned __int32)Effect - 8));
if (__builtin_strstr(Effect_Name, "ecloud_") == nullptr)
if (__builtin_strstr(Get_Effect_Name_Type((unsigned __int32)Client_Module + 1423120)((void*)((unsigned __int32)Effect - 8)), "ecloud_ca") == nullptr)
{
return (decltype(&Redirected_Draw_Effect)(Original_Draw_Effect_Caller))(Effect, Unknown_Parameter_1, Unknown_Parameter_2);
}

View File

@ -2,10 +2,6 @@
#include <TlHelp32.h>
#include <cstdio>
#define Bits_32
#include "Byte_Manager/Byte_Manager.hpp"
#include "Redirection_Manager/Redirection_Manager.hpp"
@ -18,14 +14,12 @@ void* Client_Module;
#include "Post_Network_Data_Received.hpp"
#include "Set_Move_Type.hpp"
#include "Interpolate.hpp"
#include "Update_Animations.hpp"
#include <unordered_set>
#include <unordered_map>
#include "Estimate_Velocity.hpp"
#include "Spawn_Grenade.hpp"
@ -38,8 +32,6 @@ void* Client_Module;
#include "Play_Footstep_Sound.hpp"
#include <algorithm>
#include "Finish_Move.hpp"
#include "Item_Post_Frame.hpp"
@ -54,8 +46,6 @@ void* Client_Module;
#include "Send_Move.hpp"
#include <vector>
#include "Copy_Command.hpp"
#include "Calculate_View.hpp"
@ -117,7 +107,7 @@ __int32 __stdcall DllMain(HMODULE This_Module, unsigned __int32 Call_Reason, voi
}
else
{
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)LoadLibraryW(L"vaudio_speex.dll") + 9440), 1, 195);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)LoadLibraryW(L"vaudio_speex.dll") + 9440), 1, 195);
AllocConsole();
@ -129,29 +119,11 @@ __int32 __stdcall DllMain(HMODULE This_Module, unsigned __int32 Call_Reason, voi
HANDLE Standard_Output_Handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFOEX Console_Font_Information;
Console_Font_Information.cbSize = sizeof(CONSOLE_FONT_INFOEX);
Console_Font_Information.nFont = 0;
Console_Font_Information.dwFontSize.X = 0;
Console_Font_Information.dwFontSize.Y = 12;
Console_Font_Information.FontFamily = FF_DONTCARE;
Console_Font_Information.FontWeight = FW_NORMAL;
wcscpy(Console_Font_Information.FaceName, L"Terminal");
CONSOLE_FONT_INFOEX Console_Font_Information = { sizeof(CONSOLE_FONT_INFOEX), 0, { 0, 12 }, FF_DONTCARE, FW_NORMAL, { L"Terminal" } };
SetCurrentConsoleFontEx(Standard_Output_Handle, 0, &Console_Font_Information);
CONSOLE_CURSOR_INFO Console_Cursor_Information;
Console_Cursor_Information.bVisible = 0;
Console_Cursor_Information.dwSize = sizeof(Console_Cursor_Information);
CONSOLE_CURSOR_INFO Console_Cursor_Information = { sizeof(Console_Cursor_Information) };
SetConsoleTextAttribute(Standard_Output_Handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
@ -161,19 +133,19 @@ __int32 __stdcall DllMain(HMODULE This_Module, unsigned __int32 Call_Reason, voi
GetConsoleScreenBufferInfo(Standard_Output_Handle, &Console_Screen_Buffer_Information);
COORD Top_Left =
{
0,
COORD Top_Left = { };
0
};
DWORD Characters_Written;
DWORD Characters_Written_Count;
FillConsoleOutputAttribute(Standard_Output_Handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE, Console_Screen_Buffer_Information.dwSize.X * Console_Screen_Buffer_Information.dwSize.Y, Top_Left, &Characters_Written_Count);
FillConsoleOutputAttribute(Standard_Output_Handle, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_BLUE, Console_Screen_Buffer_Information.dwSize.X * Console_Screen_Buffer_Information.dwSize.Y, Top_Left, &Characters_Written);
Engine_Module = GetModuleHandleW(L"engine.dll");
_putws(L"[ + ] Delimit Interface");
{
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Engine_Module + 1423205), 1, 235);
}
_putws(L"[ + ] Extend Interface");
{
Implement_Extended_Interface();
@ -183,131 +155,132 @@ __int32 __stdcall DllMain(HMODULE This_Module, unsigned __int32 Call_Reason, voi
_putws(L"[ + ] Events");
{
Redirection_Manager::Redirect_Function(Original_Post_Network_Data_Received_Caller, 0, (void*)((unsigned __int32)Client_Module + 1555264), 1, (void*)Redirected_Post_Network_Data_Received);
Original_Post_Network_Data_Received_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 1555264), (void*)Redirected_Post_Network_Data_Received);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 316816), 1, 195);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 316816), 1, 195);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Engine_Module + 521741), 1, 235);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Engine_Module + 350575), 1, 94);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Engine_Module + 521741), 1, 235);
*(void**)((unsigned __int32)Client_Module + 7492840) = (void*)Redirected_Set_Move_Type;
}
_putws(L"[ + ] Interpolation");
{
Redirection_Manager::Redirect_Function(Original_Interpolate_Caller, 0, (void*)((unsigned __int32)Client_Module + 214256), 1, (void*)Redirected_Interpolate);
Original_Interpolate_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 214256), (void*)Redirected_Interpolate);
}
_putws(L"[ + ] Animations");
{
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 205296), (void*)Redirected_Update_Animations);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Client_Module + 205296), (void*)Redirected_Update_Animations);
Redirection_Manager::Redirect_Function(Original_Estimate_Velocity_Caller, 0, (void*)((unsigned __int32)Client_Module + 311856), 1, (void*)Redirected_Estimate_Velocity);
Original_Estimate_Velocity_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 311856), (void*)Redirected_Estimate_Velocity);
unsigned __int8 Maintain_Sequence_Transitions_Bytes[3] = { 194, 24, 0 };
unsigned __int8 Maintain_Sequence_Transitions_Bytes[3] = { 194, 24 };
Byte_Manager::Copy_Bytes(1, (void*)((unsigned __int32)Client_Module + 245232), sizeof(Maintain_Sequence_Transitions_Bytes), Maintain_Sequence_Transitions_Bytes);
Byte_Manager::Copy_Bytes(0, (void*)((unsigned __int32)Client_Module + 245232), sizeof(Maintain_Sequence_Transitions_Bytes), Maintain_Sequence_Transitions_Bytes);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 3244278), 1, 15);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 3244278), 1, 15);
}
_putws(L"[ + ] Prediction");
{
auto Add_Prediction_Fields = [](Prediction_Descriptor_Structure* Descriptor, Prediction_Field_Structure* Fields, __int32 Size) -> void
{
Prediction_Descriptor_Structure* Original_Descriptor = (Prediction_Descriptor_Structure*)malloc(sizeof(Prediction_Descriptor_Structure));
static Prediction_Descriptor_Structure Original_Prediction_Descriptor;
Byte_Manager::Copy_Bytes(0, Original_Descriptor, sizeof(Prediction_Descriptor_Structure), Descriptor);
Prediction_Descriptor_Structure* Prediction_Descriptor = (Prediction_Descriptor_Structure*)((unsigned __int32)Client_Module + 7290836);
Descriptor->Fields = Fields;
Byte_Manager::Copy_Bytes(0, &Original_Prediction_Descriptor, sizeof(Prediction_Descriptor_Structure), Prediction_Descriptor);
Descriptor->Size = Size;
static Prediction_Field_Structure Prediction_Fields = { 1, (char*)"m_fMaxSpread", 3340, 1, { }, sizeof(float) };
Descriptor->Parent = Original_Descriptor;
};
Prediction_Descriptor->Fields = &Prediction_Fields;
static Prediction_Field_Structure Player_Fields = { 5, (char*)(*(unsigned __int32*)((unsigned __int32)GetModuleHandleW(L"vphysics.dll") + 1701868) + 2226), 16, 1, { }, sizeof(__int32) };
Prediction_Descriptor->Size = sizeof(Prediction_Fields) / sizeof(Prediction_Field_Structure);
Add_Prediction_Fields((Prediction_Descriptor_Structure*)((unsigned __int32)Client_Module + 7236480), &Player_Fields, sizeof(Player_Fields) / sizeof(Prediction_Field_Structure));
Prediction_Descriptor->Parent = &Original_Prediction_Descriptor;
static Prediction_Field_Structure Weapon_Fields = { 1, (char*)"m_fMaxSpread", 3340, 1, { }, sizeof(float) };
Original_Spawn_Grenade_Caller = Redirection_Manager::Redirect_Function(2, (void*)((unsigned __int32)Client_Module + 2227424), (void*)Redirected_Spawn_Grenade);
Add_Prediction_Fields((Prediction_Descriptor_Structure*)((unsigned __int32)Client_Module + 7290836), &Weapon_Fields, sizeof(Weapon_Fields) / sizeof(Prediction_Field_Structure));
Original_Update_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 1554304), (void*)Redirected_Update);
Redirection_Manager::Redirect_Function(Original_Spawn_Grenade_Caller, 2, (void*)((unsigned __int32)Client_Module + 2227424), 1, (void*)Redirected_Spawn_Grenade);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 1554528), 1, 235);
Redirection_Manager::Redirect_Function(Original_Update_Caller, 0, (void*)((unsigned __int32)Client_Module + 1554304), 1, (void*)Redirected_Update);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 1557776), 1, 235);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 1554528), 1, 235);
Original_Run_Command_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 1553504), (void*)Redirected_Run_Command);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 1557776), 1, 235);
Original_Process_Movement_Caller = Redirection_Manager::Redirect_Function(2, (void*)((unsigned __int32)Client_Module + 2590832), (void*)Redirected_Process_Movement);
Redirection_Manager::Redirect_Function(Original_Run_Command_Caller, 0, (void*)((unsigned __int32)Client_Module + 1553504), 1, (void*)Redirected_Run_Command);
Original_Play_Footstep_Sound_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 978464), (void*)Redirected_Play_Footstep_Sound);
Redirection_Manager::Redirect_Function(Original_Process_Movement_Caller, 2, (void*)((unsigned __int32)Client_Module + 2590832), 1, (void*)Redirected_Process_Movement);
Original_Finish_Move_Caller = Redirection_Manager::Redirect_Function(2, (void*)((unsigned __int32)Client_Module + 1553264), (void*)Redirected_Finish_Move);
Redirection_Manager::Redirect_Function(Original_Play_Footstep_Sound_Caller, 0, (void*)((unsigned __int32)Client_Module + 978464), 1, (void*)Redirected_Play_Footstep_Sound);
Redirection_Manager::Redirect_Function(Original_Finish_Move_Caller, 2, (void*)((unsigned __int32)Client_Module + 1553264), 1, (void*)Redirected_Finish_Move);
Redirection_Manager::Redirect_Function(Original_Item_Post_Frame_Caller, 3, (void*)((unsigned __int32)Client_Module + 2542896), 1, (void*)Redirected_Item_Post_Frame);
Original_Item_Post_Frame_Caller = Redirection_Manager::Redirect_Function(3, (void*)((unsigned __int32)Client_Module + 2542896), (void*)Redirected_Item_Post_Frame);
*(__int32*)((unsigned __int32)Original_Item_Post_Frame_Caller + 5) = (__int32)((unsigned __int32)Client_Module + 2438551) - (__int32)Original_Item_Post_Frame_Caller;
Redirection_Manager::Redirect_Function(Original_Perform_Trace_Caller, 0, (void*)((unsigned __int32)Client_Module + 3093744), 1, (void*)Redirected_Perform_Trace);
Original_Perform_Trace_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 3093744), (void*)Redirected_Perform_Trace);
Original_Perform_Shove_Trace_Caller = (void*)((unsigned __int32)Client_Module + 3221111);
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 3221102), (void*)Redirected_Perform_Shove_Trace);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Client_Module + 3221102), (void*)Redirected_Perform_Shove_Trace);
}
_putws(L"[ + ] Network");
{
Redirection_Manager::Redirect_Function(Original_Read_Packets_Caller, 0, (void*)((unsigned __int32)Engine_Module + 499264), 1, (void*)Redirected_Read_Packets);
Original_Read_Packets_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Engine_Module + 499264), (void*)Redirected_Read_Packets);
Redirection_Manager::Redirect_Function(Original_Move_Caller, 3, (void*)((unsigned __int32)Engine_Module + 512288), 1, (void*)Redirected_Move);
Original_Move_Caller = Redirection_Manager::Redirect_Function(3, (void*)((unsigned __int32)Engine_Module + 512288), (void*)Redirected_Move);
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Engine_Module + 511680), (void*)Redirected_Send_Move);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Engine_Module + 511680), (void*)Redirected_Send_Move);
}
_putws(L"[ + ] Input");
{
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 1250629), 3, 144);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 1250629), 3, 144);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 417204), 1, 235);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 417204), 1, 235);
Redirection_Manager::Redirect_Function(Original_Copy_Command_Caller, 0, (void*)((unsigned __int32)Client_Module + 1094624), 1, (void*)Redirected_Copy_Command);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 2538675), 1, 255);
Original_Copy_Command_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 1094624), (void*)Redirected_Copy_Command);
}
_putws(L"[ + ] Effects");
{
Redirection_Manager::Redirect_Function(Original_Calculate_View_Caller, 0, (void*)((unsigned __int32)Client_Module + 132944), 1, (void*)Redirected_Calculate_View);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 407384), 1, 133);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 133424), 1, 235);
Original_Calculate_View_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 132944), (void*)Redirected_Calculate_View);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 2881566), 1, 246);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 133424), 1, 235);
Redirection_Manager::Redirect_Function(Original_Draw_Effect_Caller, 0, (void*)((unsigned __int32)Client_Module + 1425888), 1, (void*)Redirected_Draw_Effect);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 2881566), 1, 246);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 1868237), 1, 52);
Original_Draw_Effect_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)Client_Module + 1425888), (void*)Redirected_Draw_Effect);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 2655546), 1, 216);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 1868237), 1, 52);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 2655546), 1, 216);
*(void**)((unsigned __int32)Client_Module + 8115120) = (void*)((unsigned __int32)Client_Module + 955708);
}
_putws(L"[ + ] Paint");
{
Redirection_Manager::Redirect_Function(Original_Write_Texture_Caller, 0, (void*)((unsigned __int32)GetModuleHandleW(L"vguimatsurface.dll") + 100592), 1, (void*)Redirected_Write_Texture);
Original_Write_Texture_Caller = Redirection_Manager::Redirect_Function(0, (void*)((unsigned __int32)GetModuleHandleW(L"vguimatsurface.dll") + 100592), (void*)Redirected_Write_Texture);
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 2913504), (void*)Redirected_Paint);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Client_Module + 2913504), (void*)Redirected_Paint);
Redirection_Manager::Redirect_Function(Original_Get_Glow_Color_Caller, 1, (void*)((unsigned __int32)Client_Module + 2455600), 1, (void*)Redirected_Get_Glow_Color);
Original_Get_Glow_Color_Caller = Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 2455600), (void*)Redirected_Get_Glow_Color);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 3244715), 1, 49);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 3244715), 1, 49);
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 2301184), (void*)Redirected_Draw_Crosshair);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Client_Module + 2301184), (void*)Redirected_Draw_Crosshair);
Byte_Manager::Set_Bytes(1, (void*)((unsigned __int32)Client_Module + 2930985), 1, 235);
Byte_Manager::Set_Bytes(0, (void*)((unsigned __int32)Client_Module + 2930985), 1, 235);
Redirection_Manager::Redirect_Function(1, (void*)((unsigned __int32)Client_Module + 3118720), (void*)Redirected_Draw_Crosshair);
Redirection_Manager::Redirect_Function((void*)((unsigned __int32)Client_Module + 3118720), (void*)Redirected_Draw_Crosshair);
}
}
}

View File

@ -1,3 +1,10 @@
char* Get_Sequence_Name(void* Entity)
{
using Get_Sequence_Name_Type = char*(__thiscall*)(void* Entity, __int32 Sequence);
return Get_Sequence_Name_Type((unsigned __int32)Client_Module + 203392)(Entity, *(__int32*)((unsigned __int32)Entity + 2212));
}
__int32 Get_Identifier(void* Entity, __int8 Raw, __int8 Equipment)
{
using Get_Identifier_Type = void*(__cdecl**)();
@ -9,128 +16,91 @@ __int32 Get_Identifier(void* Entity, __int8 Raw, __int8 Equipment)
return Identifier;
}
static std::unordered_set<__int32> Targets =
if (*(__int8*)((unsigned __int32)Entity + 221) == 0)
{
0,
static std::unordered_set<__int32> Targets = { 0, 13, 99, 232, 263, 264, 265, 270, 272, 275, 276, 277 };
13,
99,
232,
263,
264,
265,
270,
272,
275,
276,
277
};
if (Targets.contains(Identifier) == 1)
{
__int8 Valid = 0;
if (Identifier == 13)
if (Targets.contains(Identifier) == 1)
{
*(__int32*)((unsigned __int32)Entity + 228) = 1;
__int8 Valid = 0;
Valid = *(__int8*)((unsigned __int32)Entity + 324) == 5;
}
else
{
if (*(__int8*)((unsigned __int32)Entity + 221) == 0)
if (Identifier == 13)
{
*(__int32*)((unsigned __int32)Entity + 228) = 1;
Valid = *(__int8*)((unsigned __int32)Entity + 324) == 5;
}
else
{
if ((*(__int32*)((unsigned __int32)Entity + 572) - 131088 & 255) == 0)
{
using Get_Sequence_Name_Type = char*(__thiscall*)(void* Entity, __int32 Sequence);
if (__builtin_strstr(Get_Sequence_Name_Type((unsigned __int32)Client_Module + 203392)(Entity, *(__int32*)((unsigned __int32)Entity + 2212)), "eath") == nullptr)
if (__builtin_strstr(Get_Sequence_Name(Entity), "eath") == nullptr)
{
Valid = 1;
Valid = Identifier == 264 ? *(__int8*)((unsigned __int32)Entity + 4493) ^ 1 : 1;
}
}
}
}
if (Valid == 1)
{
if (Identifier * (*(__int32*)((unsigned __int32)Entity + 228) == 3) == 232)
if (Valid == 1)
{
static std::unordered_map<__int32, __int32> Translators =
{
{ 1, 270 },
{ 2, 0 },
{ 3, 263 },
{ 4, 272 },
{ 5, 265 },
{ 6, 99 },
{ 8, 276 }
};
Identifier = Translators[*(__int32*)((unsigned __int32)Entity + 7312)];
}
return (Identifier - 232) % 43 ? Identifier : 232;
}
}
else
{
if (Equipment == 1)
{
static std::unordered_set<__int32> Equipment_List =
{
73,
105,
109,
121,
256,
260
};
if (Equipment_List.contains(Identifier) == 1)
{
if (Identifier == 260)
if (Identifier * (*(__int32*)((unsigned __int32)Entity + 228) == 3) == 232)
{
static std::unordered_map<__int32, __int32> Translators =
{
{ 12, 73 },
{ 1, 270 },
{ 15, 121 },
{ 2, 0 },
{ 23, 105 },
{ 3, 263 },
{ 24, 109 }
{ 4, 272 },
{ 5, 265 },
{ 6, 99 },
{ 8, 276 }
};
Identifier = Translators[*(__int32*)((unsigned __int32)Entity + 2392)];
Identifier = Translators[*(__int32*)((unsigned __int32)Entity + 7312)];
}
if (Identifier != 0)
return (Identifier - 232) % 43 ? Identifier : 232;
}
}
else
{
if (Equipment == 1)
{
if ((*(__int32*)((unsigned __int32)Entity + 224) & 32) == 0)
{
if (*(void**)((unsigned __int32)Entity + 312) == INVALID_HANDLE_VALUE)
static std::unordered_set<__int32> Equipment_List = { 73, 105, 109, 121, 256, 260 };
if (Equipment_List.contains(Identifier) == 1)
{
return -Identifier;
if (Identifier == 260)
{
static std::unordered_map<__int32, __int32> Translators =
{
{ 12, 73 },
{ 15, 121 },
{ 23, 105 },
{ 24, 109 }
};
Identifier = Translators[*(__int32*)((unsigned __int32)Entity + 2392)];
}
if (Identifier != 0)
{
if (*(void**)((unsigned __int32)Entity + 312) == INVALID_HANDLE_VALUE)
{
return -Identifier;
}
}
}
}
}
@ -144,12 +114,7 @@ void* Original_Estimate_Velocity_Caller;
void __thiscall Redirected_Estimate_Velocity(void* Entity, float* Velocity)
{
static std::unordered_set<__int32> Invalids =
{
264,
277
};
static std::unordered_set<__int32> Invalids = { 264, 277 };
if (Invalids.contains(Get_Identifier(Entity, 1, 0)) == 1)
{
@ -161,10 +126,6 @@ void __thiscall Redirected_Estimate_Velocity(void* Entity, float* Velocity)
Calculate_Velocity_Type((unsigned __int32)Client_Module + 290704)(Entity);
Velocity[0] = *(float*)((unsigned __int32)Entity + 136);
Velocity[1] = *(float*)((unsigned __int32)Entity + 140);
Velocity[2] = *(float*)((unsigned __int32)Entity + 144);
Byte_Manager::Copy_Bytes(1, Velocity, sizeof(float[3]), (float*)((unsigned __int32)Entity + 136));
}
}

View File

@ -11,10 +11,14 @@ struct Interface_Structure
Interface_Structure Interface_Extra_Commands;
Interface_Structure Interface_Extra_Commands_Action;
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;
@ -37,11 +41,11 @@ Interface_Structure Interface_Storm_Speed;
void Implement_Extended_Interface()
{
auto Create_Console_Interface = [](Interface_Structure* Interface, char* Name, char* Value, void* Handler)
auto Create_Interface = [](Interface_Structure* Interface, char* Name, char* Value, void* Handler)
{
using Create_Console_Variable_Type = void(__thiscall*)(Interface_Structure* Interface, char* Name, char* Value, void* Unknown_Parameter_1, void* Unknown_Parameter_2, void* Handler);
using Create_Variable_Type = void(__thiscall*)(Interface_Structure* Interface, char* Name, char* Value, void* Unknown_Parameter_1, void* Unknown_Parameter_2, void* Handler);
Create_Console_Variable_Type((unsigned __int32)Engine_Module + 2636368)(Interface, Name, Value, nullptr, nullptr, Handler);
Create_Variable_Type((unsigned __int32)Engine_Module + 2636368)(Interface, Name, Value, nullptr, nullptr, Handler);
*(__int32*)((unsigned __int32)Interface + 20) &= ~10;
@ -50,29 +54,33 @@ void Implement_Extended_Interface()
#define Pointer_Name(Interface) &Interface, (char*)#Interface + 10
Create_Console_Interface(Pointer_Name(Interface_Extra_Commands), (char*)"4", nullptr);
Create_Interface(Pointer_Name(Interface_Extra_Commands), (char*)"5", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Interpolate_Extra_Commands), (char*)"1", nullptr);
Create_Interface(Pointer_Name(Interface_Extra_Commands_Action), (char*)"10", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Target_On_Simulation), (char*)"0", nullptr);
Create_Interface(Pointer_Name(Interface_Interpolate_Extra_Commands), (char*)"1", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Riot_Deprioritize), (char*)"0", nullptr);
Create_Interface(Pointer_Name(Interface_Target_On_Simulation), (char*)"0", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Penetrate_Teammates), (char*)"0", nullptr);
Create_Interface(Pointer_Name(Interface_Shotgun_Shove), (char*)"1", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Aim_Intersection), (char*)"1", nullptr);
Create_Interface(Pointer_Name(Interface_Riot_Deprioritize), (char*)"0", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Penetration_Damage), (char*)"12", nullptr);
Create_Interface(Pointer_Name(Interface_Penetrate_Teammates), (char*)"0", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Equipment_Distance), (char*)"2048", nullptr);
Create_Interface(Pointer_Name(Interface_Aim_Intersection), (char*)"1", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Storm_Rotation_Radius), (char*)"24", nullptr);
Create_Interface(Pointer_Name(Interface_Penetration_Damage), (char*)"12", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Storm_Radius), (char*)"8", nullptr);
Create_Interface(Pointer_Name(Interface_Equipment_Distance), (char*)"2048", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Storm_Segments), (char*)"12", nullptr);
Create_Interface(Pointer_Name(Interface_Storm_Rotation_Radius), (char*)"24", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Storm_Iterations), (char*)"16", nullptr);
Create_Interface(Pointer_Name(Interface_Storm_Radius), (char*)"8", nullptr);
Create_Console_Interface(Pointer_Name(Interface_Storm_Speed), (char*)"512", nullptr);
Create_Interface(Pointer_Name(Interface_Storm_Segments), (char*)"12", nullptr);
Create_Interface(Pointer_Name(Interface_Storm_Iterations), (char*)"16", nullptr);
Create_Interface(Pointer_Name(Interface_Storm_Speed), (char*)"512", nullptr);
}

View File

@ -4,9 +4,9 @@ void __thiscall Redirected_Finish_Move(void* Unknown_Parameter_1, void* Player,
{
float X = *(float*)((unsigned __int32)Move_Data + 76);
if (X > 180)
if (X > 180.f)
{
X -= 360;
X -= 360.f;
}
*(float*)((unsigned __int32)Move_Data + 76) = std::clamp(X, -90.f, 90.f);

View File

@ -1,27 +1,10 @@
struct Global_Variables_Structure
{
__int8 Additional_Bytes_1[12];
float Current_Time;
float Frame_Time;
__int8 Additional_Bytes_2[8];
float Interval_Per_Tick;
};
void* Original_Interpolate_Caller;
__int8 __thiscall Redirected_Interpolate(void* Entity, float Time)
__int8 __thiscall Redirected_Interpolate(void* Entity, void* Unknown_Parameter)
{
if (Entity == *(void**)((unsigned __int32)Client_Module + 7498712))
{
Time = (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Current_Time;
*(__int32*)((unsigned __int32)Entity + 5328) -= *(__int32*)((unsigned __int32)Entity + 16);
return (decltype(&Redirected_Interpolate)(Original_Interpolate_Caller))(Entity, Time);
return (decltype(&Redirected_Interpolate)(Original_Interpolate_Caller))(Entity, Unknown_Parameter);
}
return 1;

View File

@ -1,32 +1,36 @@
__int32 Extra_Commands;
__int32 Chainsaw_Cycles;
void* Original_Move_Caller;
void Redirected_Move(float Unknown_Parameter, __int8 Final)
{
void* Local_Player = *(void**)((unsigned __int32)Client_Module + 7498712);
using Run_Prediction_Type = void(__cdecl*)();
if (*(void**)((unsigned __int32)Client_Module + 7498712) != nullptr)
if (Local_Player != nullptr)
{
Redirected_Read_Packets(Final);
Local_Player = *(void**)((unsigned __int32)Client_Module + 7498712);
Run_Prediction_Type((unsigned __int32)Engine_Module + 527776)();
using Update_Animations_Type = void(__cdecl*)();
Update_Animations_Type((unsigned __int32)Client_Module + 205296)();
Update_Animation_Time = (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Current_Time;
Update_Animation_Type = 1;
Update_Animations_Type((unsigned __int32)Client_Module + 205296)();
Update_Animation_Type = 0;
Redirected_Update_Animations();
using Fire_Events_Type = void(__cdecl*)();
Fire_Events_Type((unsigned __int32)Engine_Module + 521648)();
Update_Animation_Time = (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Time;
Update_Animation_Type = 1;
Redirected_Update_Animations();
Update_Animation_Type = 0;
}
Extra_Commands = -1;
@ -37,6 +41,17 @@ void Redirected_Move(float Unknown_Parameter, __int8 Final)
Run_Prediction_Type((unsigned __int32)Engine_Module + 527776)();
if (Local_Player != nullptr)
{
Chainsaw_Cycles += 1 + (Chainsaw_Cycles == 0);
static float Deploy_Time;
Chainsaw_Cycles *= *(float*)((unsigned __int32)Local_Player + 3872) == Deploy_Time;
Deploy_Time = *(float*)((unsigned __int32)Local_Player + 3872);
}
if (Extra_Commands > 0)
{
Extra_Commands -= 1;

192
Paint.hpp
View File

@ -24,7 +24,7 @@ void __thiscall Redirected_Paint(void* Panel)
{
using Get_Origin_Type = float*(__thiscall*)(void* Entity);
float* Local_Player_Origin = Get_Origin_Type((unsigned __int32)Client_Module + 297584)(Local_Player);
float* Local_Origin = Get_Origin_Type((unsigned __int32)Client_Module + 297584)(Local_Player);
float* Entity_Origin = Get_Origin_Type((unsigned __int32)Client_Module + 297584)(Entity);
@ -36,7 +36,7 @@ void __thiscall Redirected_Paint(void* Panel)
0,
__builtin_powf(Local_Player_Origin[0] - Entity_Origin[0], 2) + __builtin_powf(Local_Player_Origin[1] - Entity_Origin[1], 2) + __builtin_powf(Local_Player_Origin[2] - Entity_Origin[2], 2)
__builtin_powf(Local_Origin[0] - Entity_Origin[0], 2.f) + __builtin_powf(Local_Origin[1] - Entity_Origin[1], 2.f) + __builtin_powf(Local_Origin[2] - Entity_Origin[2], 2.f)
};
if (Identifier >= 0)
@ -77,13 +77,13 @@ 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
{
float Bones[128][3][4];
void* Hitbox_Set = Get_Hitbox_Set(Target, Bones, (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Current_Time);
void* Hitbox_Set = Get_Hitbox_Set(Target, Bones, (*(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744))->Time);
if (Hitbox_Set != nullptr)
{
@ -95,99 +95,100 @@ 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];
if (Axis_Number != 2)
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;
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 * Screen_Width + Screen_Width / 2;
Screen[1] = -Screen[1] / 2 * Screen_Height + Screen_Height / 2;
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;
if (Axis_Number != sizeof(Hitbox_Vertices[0]) / sizeof(float))
{
goto Initialize_Vertices_Label;
}
}
if (Vertex_Number != 7)
__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;
goto Transform_Vertices_Label;
if (Vertex_Number != sizeof(Hitbox_Vertices) / sizeof(Hitbox_Vertices[0]))
{
goto Transform_Vertices_Label;
}
}
Hitbox_Number += 1;
goto Get_Bounds_Label;
}
Hitbox_Number += 1;
goto Get_Bounds_Label;
}
}
Bounds[0] -= 2;
Bounds[0] -= 2.f;
Bounds[1] += 2;
Bounds[1] += 2.f;
Bounds[2] -= 2;
Bounds[2] -= 2.f;
Bounds[3] += 2;
return (Bounds[1] != 2) * (Bounds[3] != 2);
Bounds[3] += 2.f;
}
return 0;
return __builtin_isfinite(Bounds[0]) * (Bounds[1] != 2.f) * (Bounds[3] != 2.f);
};
if (Get_Bounds() == 1)
@ -217,7 +218,7 @@ void __thiscall Redirected_Paint(void* Panel)
{ 121, { { 255, 255, 255 }, (wchar_t*)L"Pain" } },
{ 232, { { 0, 255, 0 }, (wchar_t*)L"Survivor" } },
{ 232, { { 0, 255, 0 } } },
{ 256, { { 255, 255, 255 }, (wchar_t*)L"Ammo" } },
@ -238,6 +239,13 @@ void __thiscall Redirected_Paint(void* Panel)
Paint_Data_Structure* Paint_Data = &Paint_Data_List[Target->Identifier];
if (Target->Identifier == 232)
{
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[std::clamp(*(__int32*)((unsigned __int32)Target->Self + 7308), 0, 7) + 4 * (*(__int32*)((unsigned __int32)Client_Module + 8144624) == 1)];
}
__int8 Ghost = 0;
if (*(__int32*)((unsigned __int32)Target->Self + 236) != 0)
@ -245,10 +253,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);
@ -267,19 +288,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 + 0.5f), (__int32)(Paint_Data->Color[1] / 2 + 0.5f), (__int32)(Paint_Data->Color[2] / 2 + 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]);
@ -306,6 +314,8 @@ void __thiscall Redirected_Paint(void* Panel)
Draw_Text_Type((unsigned __int32)Engine_Module + 2218736)(Font, 0, 0, 0, 0, 0, 0, Text);
Write_Character = 0;
if (Character != L'~')
{
Character += L'\1';
@ -358,8 +368,6 @@ void __thiscall Redirected_Paint(void* Panel)
wchar_t Text[2] = { Paint_Data->Name[Character_Number] };
Write_Character = Text[0];
if (Ghost == 0)
{
Draw_Text_Type((unsigned __int32)Engine_Module + 2218736)(Font, Bounds[1] + 7 + Offset_X - Character_Bounds[0], Bounds[2] + Offset_Y, Paint_Data->Color[0], Paint_Data->Color[1], Paint_Data->Color[2], 255, Text);
@ -369,8 +377,6 @@ void __thiscall Redirected_Paint(void* Panel)
Draw_Text_Type((unsigned __int32)Engine_Module + 2218736)(Font, Bounds[1] + 7 + Offset_X - Character_Bounds[0], Bounds[2] + Offset_Y, 128, 128, 128, 255, Text);
}
Write_Character = 0;
Offset_X += Character_Bounds[1] + 1;
Character_Number += 1;

View File

@ -1,16 +1,14 @@
void __thiscall Perform_Shove_Trace(void* Stack)
{
void* Entity = *(void**)((unsigned __int32)Stack + 332);
if (Entity == Perform_Trace_Target)
if (*(void**)((unsigned __int32)Stack + 332) == Perform_Trace_Target)
{
Perform_Trace_Damage = 1;
Perform_Trace_Damage = 1.f;
}
}
void* Original_Perform_Shove_Trace_Caller;
void __declspec(naked) Redirected_Perform_Shove_Trace()
__attribute__((naked)) void Redirected_Perform_Shove_Trace()
{
asm("leal -304(%ebp), %eax");
asm("pushl %eax");

View File

@ -37,6 +37,10 @@ void __thiscall Perform_Trace(void* Stack)
if (*(__int32*)((unsigned __int32)Entity + 228) == *(__int32*)((unsigned __int32)Local_Player + 228))
{
Perform_Trace_Target = nullptr;
Perform_Trace_Damage = 0.f;
return;
}
}
@ -66,15 +70,15 @@ void __thiscall Perform_Trace(void* Stack)
auto Compute_Damage = [&]() -> void
{
if (Interface_Penetration_Damage.Integer == 0)
if (Interface_Penetration_Damage.Floating_Point == 0.f)
{
Perform_Trace_Damage = 1;
Perform_Trace_Damage = 1.f;
}
else
{
float* Start = (float*)((unsigned __int32)Stack + 236);
float Distance = __builtin_sqrtf(__builtin_powf(End[0] - Start[0], 2) + __builtin_powf(End[1] - Start[1], 2) + __builtin_powf(End[2] - Start[2], 2));
float Distance = __builtin_sqrtf(__builtin_powf(End[0] - Start[0], 2.f) + __builtin_powf(End[1] - Start[1], 2.f) + __builtin_powf(End[2] - Start[2], 2.f));
float Damage;
@ -102,7 +106,7 @@ void __thiscall Perform_Trace(void* Stack)
{
using Get_Difficulty_Type = __int32(__cdecl*)();
float Multipliers[3] = { 0.8f, 0.7f, 0.6f };
static float Multipliers[3] = { 0.8f, 0.7f, 0.6f };
Damage *= Multipliers[Get_Difficulty_Type((unsigned __int32)Client_Module + 2650448)()];
};
@ -136,22 +140,17 @@ void __thiscall Perform_Trace(void* Stack)
float Distance = Calculate_Distance_Type((unsigned __int32)Client_Module + 878608)((void*)((unsigned __int32)Local_Player + 540), Bounds);
if (Distance < 100)
if (Distance < 100.f)
{
Damage += 4.f * Damage * __builtin_powf(1.f - Distance / 100.f, 2);
Damage += 4.f * Damage * __builtin_powf(1.f - Distance / 100.f, 2.f);
}
}
}
};
if (Identifier == 277)
if (Identifier == 13)
{
if (Group != 1)
{
Apply_Difficulty_Scaling();
}
Apply_Shotgun_Scaling();
Damage *= *(float*)((unsigned __int32)Entity + 336) - *(float*)((unsigned __int32)Entity + 472) >= 0.5f;
}
else
{
@ -165,27 +164,15 @@ void __thiscall Perform_Trace(void* Stack)
{
Apply_Shotgun_Scaling();
__int8 Is_Sniper_Rifle = (Bullet_Type - 8) > 0;
__int8 Is_Sniper_Rifle = Bullet_Type > 8;
if (Group == 1)
{
if (Gender == 14)
{
auto Is_Neutral = [&]() -> __int8
{
__int32 Sequence_Activity = *(__int32*)((unsigned __int32)Entity + 4688);
static std::unordered_set<__int32> Neutrals = { 563, 567, 592, 600, 648 };
unsigned __int32 Absolute_Sequence_Activity = Sequence_Activity - 563;
if (Absolute_Sequence_Activity <= 29)
{
return (536870929 & (1 << (Absolute_Sequence_Activity & 31))) != 0;
}
return (Sequence_Activity == 600) + (Sequence_Activity == 648);
};
if (Is_Neutral() == 1)
if (Neutrals.contains(*(__int32*)((unsigned __int32)Entity + 4688)) == 1)
{
Damage = __builtin_inff();
}
@ -214,7 +201,7 @@ void __thiscall Perform_Trace(void* Stack)
{
if (Is_Sniper_Rifle * Realism == 0)
{
Damage = 450;
Damage = 450.f;
}
}
else
@ -228,7 +215,16 @@ void __thiscall Perform_Trace(void* Stack)
}
else
{
if (Identifier != 13)
if (Identifier == 277)
{
if (Group != 1)
{
Apply_Difficulty_Scaling();
}
Apply_Shotgun_Scaling();
}
else
{
if (Identifier + Bullet_Type == 284)
{
@ -237,12 +233,14 @@ void __thiscall Perform_Trace(void* Stack)
if ((Identifier != 276) + (Upgrade_Type != 1) == 2)
{
float Multipliers[8] = { 1.f, 4.f, 1.f, 1.25f, 1.f, 1.f, 0.75f, 0.75f };
static float Multipliers[8] = { 1.f, 4.f, 1.f, 1.25f, 1.f, 1.f, 0.75f, 0.75f };
Damage *= Multipliers[Group];
Damage *= min(Multipliers[Group], 4.f - 2.75f * Is_Shotgun);
}
if (Get_Identifier(Entity, 1, 0) == 99)
__int32 Raw_Identifier = Get_Identifier(Entity, 1, 0);
if (Raw_Identifier == 99)
{
if (*(__int32*)((unsigned __int32)Entity + 2212) == 5)
{
@ -255,7 +253,7 @@ void __thiscall Perform_Trace(void* Stack)
{
if (*(void**)((unsigned __int32)Entity + 8040) != INVALID_HANDLE_VALUE)
{
if (Damage > 50)
if (Damage > 50.f)
{
__int8 Competitive = ('v' - Mode[0] ^ Mode[0] - 's') == 3;
@ -275,7 +273,15 @@ void __thiscall Perform_Trace(void* Stack)
if (Damage != __builtin_inff())
{
Damage = (__int32)(Damage + 1.f * (Damage < 1));
Damage = (__int32)(Damage + 1.f * (Damage < 1.f));
if (Raw_Identifier == 276)
{
if (__builtin_strstr(Get_Sequence_Name(Entity), "limb") != nullptr)
{
Damage = min(Damage, *(__int32*)((unsigned __int32)Entity + 236) - 1.f);
}
}
}
}
}
@ -285,7 +291,7 @@ void __thiscall Perform_Trace(void* Stack)
}
};
if (Upgrade_Type + Gender == 17)
if ((Upgrade_Type == 2) + (Gender == 15) == 2)
{
float Inflictor_Direction[3];
@ -311,7 +317,7 @@ void __thiscall Perform_Trace(void* Stack)
Angle_Vectors(Angle, Victim_Direction, nullptr, nullptr);
if (Inflictor_Direction[0] * Victim_Direction[0] + Inflictor_Direction[1] * Victim_Direction[1] + Inflictor_Direction[2] * Victim_Direction[2] >= 0)
if (Inflictor_Direction[0] * Victim_Direction[0] + Inflictor_Direction[1] * Victim_Direction[1] + Inflictor_Direction[2] * Victim_Direction[2] >= 0.f)
{
Compute_Damage();
}
@ -325,7 +331,7 @@ void __thiscall Perform_Trace(void* Stack)
void* Original_Perform_Trace_Caller;
void __declspec(naked) Redirected_Perform_Trace()
__attribute__((naked)) void Redirected_Perform_Trace()
{
asm("pushal");
asm("movl %esp, %ecx");

View File

@ -2,15 +2,8 @@ void* Original_Play_Footstep_Sound_Caller;
void __thiscall Redirected_Play_Footstep_Sound(void* Unknown_Parameter_1, void* Unknown_Parameter_2, void* Unknown_Parameter_3, void* Unknown_Parameter_4, void* Unknown_Parameter_5, void* Unknown_Parameter_6)
{
void* Prediction = (void*)((unsigned __int32)Client_Module + 8072728);
if (*(__int8*)((unsigned __int32)Prediction + 8) == 1)
if (*(__int8*)((unsigned __int32)Client_Module + 8072736) <= *(__int8*)((unsigned __int32)Client_Module + 8072752))
{
if (*(__int8*)((unsigned __int32)Prediction + 24) == 0)
{
return;
}
(decltype(&Redirected_Play_Footstep_Sound)(Original_Play_Footstep_Sound_Caller))(Unknown_Parameter_1, Unknown_Parameter_2, Unknown_Parameter_3, Unknown_Parameter_4, Unknown_Parameter_5, Unknown_Parameter_6);
}
(decltype(&Redirected_Play_Footstep_Sound)(Original_Play_Footstep_Sound_Caller))(Unknown_Parameter_1, Unknown_Parameter_2, Unknown_Parameter_3, Unknown_Parameter_4, Unknown_Parameter_5, Unknown_Parameter_6);
}

View File

@ -1,3 +1,23 @@
struct Prediction_Copy_Structure
{
__int8 Additionals_Bytes_1[8];
void* Destination;
void* Source;
__int8 Additional_Bytes_2[48];
void Construct(void* Destination, void* Source, void* Handler)
{
using Construct_Type = void(__fastcall*)(void* Prediction_Copy, void* Unknown_Parameter, __int32 Type, void* Destination, __int8 Destination_Packed, void* Source, __int8 Source_Packed, __int32 Operation_Type, void* Handler);
Construct_Type((unsigned __int32)Client_Module + 1564512)(this, nullptr, 2, Destination, 1, Source, 0, 3, Handler);
}
};
Prediction_Copy_Structure Predicton_Copy;
struct Prediction_Field_Structure
{
__int32 Type;
@ -19,35 +39,25 @@ struct Prediction_Field_Structure
__int8 Additionals_Bytes_3[2];
};
struct Prediction_Copy_Structure
{
__int8 Additionals_Bytes_1[8];
void* Destination;
void* Source;
__int8 Additional_Bytes_2[48];
void Construct(void* Destination, void* Source, void* Handler)
{
using Construct_Type = void(__fastcall*)(void* Prediction_Copy, void* Unknown_Parameter, __int32 Type, void* Destination, __int8 Destination_Packed, void* Source, __int8 Source_Packed, __int32 Operation_Type, void* Handler);
Construct_Type((unsigned __int32)Client_Module + 1564512)(this, nullptr, 2, Destination, 1, Source, 0, 3, Handler);
}
};
Prediction_Copy_Structure Predicton_Copy;
__int8 Consistent_Time;
void Predicton_Copy_Compare(void* Unknown_Parameter_1, void* Unknown_Parameter_2, void* Unknown_Parameter_3, void* Unknown_Parameter_4, void* Unknown_Parameter_5, void* Unknown_Parameter_6, __int8 Within_Tolerance, void* Unknown_Parameter_7)
{
Prediction_Field_Structure* Field = *(Prediction_Field_Structure**)((unsigned __int32)__builtin_frame_address(0) + 60);
if (Field->Flat_Offset[0] * Consistent_Time == 5324)
{
goto Copy_Label;
}
if (Within_Tolerance == 1)
{
Prediction_Field_Structure* Field = *(Prediction_Field_Structure**)((unsigned __int32)__builtin_frame_address(0) + 60);
if ((256 - Field->Flat_Offset[0] ^ Field->Flat_Offset[0] - 244) != 12)
{
Byte_Manager::Copy_Bytes(0, (void*)((unsigned __int32)Predicton_Copy.Destination + Field->Flat_Offset[0]), Field->Bytes, (void*)((unsigned __int32)Predicton_Copy.Source + Field->Flat_Offset[1]));
Copy_Label:
{
Byte_Manager::Copy_Bytes(1, (void*)((unsigned __int32)Predicton_Copy.Destination + Field->Flat_Offset[0]), Field->Bytes, (void*)((unsigned __int32)Predicton_Copy.Source + Field->Flat_Offset[1]));
}
}
}
}
@ -80,8 +90,6 @@ void __thiscall Redirected_Post_Network_Data_Received(void* Unknown_Parameter, _
using Transfer_Data_Type = __int32(__thiscall*)(Prediction_Copy_Structure* Prediction_Copy, void* Unknown_Parameter, __int32 Entity_Number, Prediction_Descriptor_Structure* Descriptor);
Transfer_Data_Type((unsigned __int32)Client_Module + 1573744)(&Predicton_Copy, nullptr, -1, (Prediction_Descriptor_Structure*)((unsigned __int32)Client_Module + 7236480));
*(__int32*)((unsigned __int32)Local_Player + 5324) += Commands_Acknowledged - Commands_Acknowledged % 150;
}
(decltype(&Redirected_Post_Network_Data_Received)(Original_Post_Network_Data_Received_Caller))(Unknown_Parameter, Commands_Acknowledged);

View File

@ -8,8 +8,20 @@ void __thiscall Redirected_Process_Movement(void* Unknown_Parameter, void* Playe
*(__int32*)((unsigned __int32)Move_Data + 36) |= 4 * *(__int8*)((unsigned __int32)Player + 4636);
*(double*)((unsigned __int32)Move_Data + 44) = 0;
*(double*)((unsigned __int32)Move_Data + 44) = 0.;
}
(decltype(&Redirected_Process_Movement)(Original_Process_Movement_Caller))(Unknown_Parameter, Player, Move_Data);
if (Get_Identifier(Player, 0, 0) == 272)
{
using Get_Ability_Type = void*(__thiscall*)(void* Entity);
void* Ability = Get_Ability_Type((unsigned __int32)Client_Module + 2438560)(Player);
if (Ability != nullptr)
{
*(float*)((unsigned __int32)Ability + 1636) = 0.f;
}
}
}

View File

@ -1,4 +1,4 @@
to achieve least interpolation time: `cl_updaterate -1;cl_interp_ratio 0;cl_interp 0`\
to achieve least (aligned) interpolation time: `cl_updaterate 30;cl_interp_ratio 0;cl_interp 0`\
to queue extra commands: `bind key +zoom`
```
code: https://github.com/qwertyuiop3/Storm

View File

@ -1,6 +1,30 @@
#pragma once
namespace Redirection_Manager
{
#include "Redirection_Manager_Functions.hpp"
void Redirect_Function(void* Original_Function, void* Redirected_Function)
{
DWORD Previous_Access_Rights;
VirtualProtect(Original_Function, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
*(__int8*)Original_Function = 104;
*(void**)((unsigned __int32)Original_Function + 1) = Redirected_Function;
*(unsigned __int8*)((unsigned __int32)Original_Function + 5) = 195;
VirtualProtect(Original_Function, 6, Previous_Access_Rights, &Previous_Access_Rights);
}
void* Redirect_Function(unsigned __int32 Offset, void* Original_Function, void* Redirected_Function)
{
void* Original_Function_Caller = VirtualAlloc(nullptr, 12 + Offset, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
__builtin_memcpy(Original_Function_Caller, Original_Function, 6 + Offset);
Redirect_Function((void*)((unsigned __int32)Original_Function_Caller + 6 + Offset), (void*)((unsigned __int32)Original_Function + 6 + Offset));
Redirect_Function(Original_Function, Redirected_Function);
return Original_Function_Caller;
}
};

View File

@ -1,30 +0,0 @@
#pragma once
void* Copy_Table(void* Table_Location)
{
#ifdef Bits_32
unsigned __int32 Functions_Count = 0;
#else
unsigned __int64 Functions_Count = 0;
#endif
Take_Function_Into_Account_Label:
{
#ifdef Bits_32
if (*(void**)((unsigned __int32)Table_Location + Functions_Count) != nullptr)
#else
if (*(void**)((unsigned __int64)Table_Location + Functions_Count) != nullptr)
#endif
{
Functions_Count += sizeof(void*);
goto Take_Function_Into_Account_Label;
}
}
void* Copied_Table_Location = malloc(Functions_Count);
__builtin_memcpy(Copied_Table_Location, Table_Location, Functions_Count);
return Copied_Table_Location;
}

View File

@ -1,15 +0,0 @@
#pragma once
#include "Redirection_Manager_Redirect_Function.hpp"
#include "Redirection_Manager_Restore_Function.hpp"
#include "Redirection_Manager_Restore_Redirection.hpp"
#include "Redirection_Manager_Copy_Table.hpp"
#include "Redirection_Manager_Redirect_Function_In_Table.hpp"
#include "Redirection_Manager_Redirect_Table.hpp"
#include "Redirection_Manager_Restore_Table.hpp"

View File

@ -1,125 +0,0 @@
#pragma once
void Redirect_Function(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Redirected_Function_Location)
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#endif
}
#ifdef Bits_32
*(__int8*)Original_Function_Location = 104;
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
#else
*(__int8*)Original_Function_Location = 80;
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
#endif
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
#endif
}
}
#ifdef Bits_32
void Redirect_Function(void*& Original_Function_Caller_Location, unsigned __int32 Original_Function_Caller_Offset, void* Original_Function_Location, __int8 Modify_Access_Rights, void* Redirected_Function_Location)
#else
void Redirect_Function(void*& Original_Function_Caller_Location, unsigned __int64 Original_Function_Caller_Offset, void* Original_Function_Location, __int8 Modify_Access_Rights, void* Redirected_Function_Location)
#endif
{
unsigned long __int32 Previous_Access_Rights;
#ifdef Bits_32
Original_Function_Caller_Location = malloc(12 + Original_Function_Caller_Offset);
*(void**)Original_Function_Caller_Location = *(void**)Original_Function_Location;
*(unsigned __int16*)((unsigned __int32)Original_Function_Caller_Location + 4) = *(unsigned __int16*)((unsigned __int32)Original_Function_Location + 4);
__builtin_memcpy((void*)((unsigned __int32)Original_Function_Caller_Location + 6), (void*)((unsigned __int32)Original_Function_Location + 6), Original_Function_Caller_Offset);
*(__int8*)((unsigned __int32)Original_Function_Caller_Location + 6 + Original_Function_Caller_Offset) = 104;
*(void**)((unsigned __int32)Original_Function_Caller_Location + 7 + Original_Function_Caller_Offset) = (void*)((unsigned __int32)Original_Function_Location + 6 + Original_Function_Caller_Offset);
*(unsigned __int8*)((unsigned __int32)Original_Function_Caller_Location + 11 + Original_Function_Caller_Offset) = 195;
VirtualProtect(Original_Function_Caller_Location, 12 + Original_Function_Caller_Offset, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#else
Original_Function_Caller_Location = malloc(32 + Original_Function_Caller_Offset);
*(void**)Original_Function_Caller_Location = *(void**)Original_Function_Location;
*(void**)((unsigned __int64)Original_Function_Caller_Location + 8) = *(void**)((unsigned __int64)Original_Function_Location + 8);
__builtin_memcpy((void*)((unsigned __int64)Original_Function_Caller_Location + 16), (void*)((unsigned __int64)Original_Function_Location + 16), Original_Function_Caller_Offset);
*(__int8*)((unsigned __int64)Original_Function_Caller_Location + 16 + Original_Function_Caller_Offset) = 80;
*(unsigned __int16*)((unsigned __int64)Original_Function_Caller_Location + 17 + Original_Function_Caller_Offset) = 47176;
*(void**)((unsigned __int64)Original_Function_Caller_Location + 19 + Original_Function_Caller_Offset) = (void*)((unsigned __int64)Original_Function_Location + 16 + Original_Function_Caller_Offset);
*(__int32*)((unsigned __int64)Original_Function_Caller_Location + 27 + Original_Function_Caller_Offset) = 604276552;
*(unsigned __int8*)((unsigned __int64)Original_Function_Caller_Location + 31 + Original_Function_Caller_Offset) = 195;
VirtualProtect(Original_Function_Caller_Location, 32 + Original_Function_Caller_Offset, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#endif
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#endif
}
#ifdef Bits_32
*(__int8*)Original_Function_Location = 104;
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
#else
*(__int8*)Original_Function_Location = 80;
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
#endif
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
#endif
}
}

View File

@ -1,18 +0,0 @@
#pragma once
void Redirect_Function_In_Table(__int8 Modify_Access_Rights, void* Original_Function_In_Table_Location, void* Redirected_Function_Location)
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
VirtualProtect(Original_Function_In_Table_Location, sizeof(void*), PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
}
*(void**)Original_Function_In_Table_Location = Redirected_Function_Location;
if (Modify_Access_Rights == 1)
{
VirtualProtect(Original_Function_In_Table_Location, sizeof(void*), Previous_Access_Rights, &Previous_Access_Rights);
}
}

View File

@ -1,6 +0,0 @@
#pragma once
void Redirect_Table(void* Original_Table_Container_Location, void* Redirected_Table_Location)
{
*(void**)Original_Table_Container_Location = Redirected_Table_Location;
}

View File

@ -1,39 +0,0 @@
#pragma once
void Restore_Function(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Original_Function_Caller_Location, __int8 Delete_Original_Function_Caller)
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#endif
}
#ifdef Bits_32
*(void**)Original_Function_Location = *(void**)Original_Function_Caller_Location;
*(unsigned __int16*)((unsigned __int32)Original_Function_Location + 4) = *(unsigned __int16*)((unsigned __int32)Original_Function_Caller_Location + 4);
#else
*(void**)Original_Function_Location = *(void**)Original_Function_Caller_Location;
*(void**)((unsigned __int64)Original_Function_Location + 8) = *(void**)((unsigned __int64)Original_Function_Caller_Location + 8);
#endif
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
#endif
}
if (Delete_Original_Function_Caller == 1)
{
free(Original_Function_Caller_Location);
}
}

View File

@ -1,42 +0,0 @@
#pragma once
void Restore_Redirection(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Redirected_Function_Location)
{
unsigned long __int32 Previous_Access_Rights;
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
#endif
}
#ifdef Bits_32
*(__int8*)Original_Function_Location = 104;
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
#else
*(__int8*)Original_Function_Location = 80;
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
#endif
if (Modify_Access_Rights == 1)
{
#ifdef Bits_32
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
#else
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
#endif
}
}

View File

@ -1,11 +0,0 @@
#pragma once
void Restore_Table(void* Original_Table_Container_Location, void* Original_Table_Location, __int8 Delete_Redirected_Table, void* Redirected_Table_Location)
{
*(void**)Original_Table_Container_Location = Original_Table_Location;
if (Delete_Redirected_Table == 1)
{
free(Redirected_Table_Location);
}
}

View File

@ -42,6 +42,6 @@ void __thiscall Redirected_Run_Command(void* Prediction, void* Player, Command_S
Global_Variables_Structure* Global_Variables = *(Global_Variables_Structure**)((unsigned __int32)Client_Module + 7096744);
Global_Variables->Current_Time = (*(__int32*)((unsigned __int32)Player + 5324) - 1) * Global_Variables->Interval_Per_Tick;
Global_Variables->Time = (*(__int32*)((unsigned __int32)Player + 5324) - 1) * Global_Variables->Interval_Per_Tick;
}
}

View File

@ -6,7 +6,7 @@ void Redirected_Send_Move()
void Construct(__int8* Data, unsigned __int32 Size)
{
Byte_Manager::Set_Bytes(0, Message, sizeof(Message), 0);
Byte_Manager::Set_Bytes(1, Message, sizeof(Message), 0);
*(void**)Message = (void*)((unsigned __int32)Engine_Module + 3501364);
@ -62,9 +62,12 @@ void Redirected_Send_Move()
void* Network_Channel = *(void**)(*(unsigned __int32*)((unsigned __int32)Engine_Module + 4352236) + 24);
*(__int32*)((unsigned __int32)Network_Channel + 28) -= Extra_Commands_Queue;
if (*(__int32*)((unsigned __int32)Network_Channel + 16) != -1)
{
*(__int32*)((unsigned __int32)Network_Channel + 28) -= Extra_Commands_Queue;
}
using Send_Network_Message_Type = void(__thiscall**)(void* Network_Channel, void* Message, void* Unknown_Parameter_1, void* Unknown_Parameter_2);
using Send_Message_Type = void(__thiscall**)(void* Network_Channel, void* Message, void* Unknown_Parameter_1, void* Unknown_Parameter_2);
(*Send_Network_Message_Type(*(unsigned __int32*)Network_Channel + 164))(Network_Channel, &Message, nullptr, nullptr);
(*Send_Message_Type(*(unsigned __int32*)Network_Channel + 164))(Network_Channel, &Message, nullptr, nullptr);
}

11
Set_Move_Type.hpp Normal file
View File

@ -0,0 +1,11 @@
void Redirected_Set_Move_Type(void* Input, void* Output)
{
if (*(__int8*)((unsigned __int32)Output + 324) == 0)
{
*(float*)((unsigned __int32)Output + 472) = *(float*)((unsigned __int32)Output + 336);
}
*(__int8*)((unsigned __int32)Output + 324) = *(__int8*)((unsigned __int32)Input + 4);
*(__int8*)((unsigned __int32)Output + 325) = 0;
}

View File

@ -4,23 +4,9 @@ void __thiscall Redirected_Spawn_Grenade(void* Entity)
{
using Set_Size_Type = void(__thiscall*)(void* Entity, float* Minimum, float* Maximum);
float Minimum[3] =
{
-16.f,
float Minimum[3] = { -16.f, -16.f, -16.f };
-16.f,
-16.f
};
float Maximum[3] =
{
16.f,
16.f,
16.f
};
float Maximum[3] = { 16.f, 16.f, 16.f };
Set_Size_Type((unsigned __int32)Client_Module + 281664)(Entity, Minimum, Maximum);

View File

@ -54,7 +54,7 @@
<BufferSecurityCheck>false</BufferSecurityCheck>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
<FloatingPointModel>Fast</FloatingPointModel>
<AdditionalOptions>/Zc:threadSafeInit- /clang:-fno-unwind-tables -Wno-multichar -Wno-microsoft-goto %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/Zc:threadSafeInit- /clang:-fno-unwind-tables -Wno-microsoft-goto %(AdditionalOptions)</AdditionalOptions>
<StringPooling>true</StringPooling>
<ControlFlowGuard>false</ControlFlowGuard>
<FloatingPointExceptions>false</FloatingPointExceptions>
@ -62,6 +62,7 @@
<ExceptionHandling>false</ExceptionHandling>
<WarningLevel>Level3</WarningLevel>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<ForcedIncludeFiles>__msvc_all_public_headers.hpp</ForcedIncludeFiles>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@ -84,6 +85,7 @@
<ItemGroup>
<ClInclude Include="Calculate_View.hpp" />
<ClInclude Include="Process_Movement.hpp" />
<ClInclude Include="Set_Move_Type.hpp" />
<ClInclude Include="Update.hpp" />
<ClInclude Include="Send_Move.hpp" />
<ClInclude Include="Spawn_Grenade.hpp" />

View File

@ -88,5 +88,8 @@
<ClInclude Include="Update_Animations.hpp">
<Filter>Header++</Filter>
</ClInclude>
<ClInclude Include="Set_Move_Type.hpp">
<Filter>Header++</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -2,5 +2,7 @@ void* Original_Update_Caller;
void __thiscall Redirected_Update(void* Unknown_Parameter_1, void* Unknown_Parameter_2, void* Unknown_Parameter_3, __int32 Incoming_Sequence_Number, int Outgoing_Sequence_Number)
{
Consistent_Time = Outgoing_Sequence_Number - Incoming_Sequence_Number > 150;
(decltype(&Redirected_Update)(Original_Update_Caller))(Unknown_Parameter_1, Unknown_Parameter_2, Unknown_Parameter_3, Incoming_Sequence_Number, Incoming_Sequence_Number + (Outgoing_Sequence_Number - Incoming_Sequence_Number) % 150);
}

View File

@ -1,45 +1,58 @@
struct Global_Variables_Structure
{
__int8 Additional_Bytes_1[12];
float Time;
float Frame_Time;
__int8 Additional_Bytes_2[8];
float Interval_Per_Tick;
};
float Update_Animation_Time;
__int8 Update_Animation_Type;
void __cdecl Redirected_Update_Animations()
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_Time = Global_Variables->Time;
Global_Variables->Current_Time = Update_Animation_Time;
Global_Variables->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->Time = Previous_Time;
}

View File

@ -14,10 +14,10 @@ void __thiscall Redirected_Write_Texture(void* Unknown_Parameter_1, void* Unknow
unsigned __int32 Offset_X = Width;
unsigned __int32 Offset_Y = Height;
unsigned __int32 Character_Width = 0;
unsigned __int32 Offset_Y = Height;
unsigned __int32 Character_Height = 0;
Traverse_Horizontal_Label:
@ -28,11 +28,11 @@ void __thiscall Redirected_Write_Texture(void* Unknown_Parameter_1, void* Unknow
{
if (*(unsigned __int32*)((unsigned __int32)Texture + X * 4 + Y * 4 * Width) != 0)
{
Offset_X = min(Offset_X, X);
Offset_X = min(X, Offset_X);
Character_Width = max(Character_Width, X + 1);
Offset_Y = min(Offset_Y, Y);
Offset_Y = min(Y, Offset_Y);
Character_Height = max(Character_Height, Y + 1);
}