Пользователь
- Статус
- Оффлайн
- Регистрация
- 12 Июн 2020
- Сообщения
- 465
- Реакции
- 103
Код:
void WriteUserÑmd(void* buf, CUserCmd* incmd, CUserCmd* outcmd);
int32_t nTickBaseShift = 0;
int32_t nSinceUse = 0;
bool bInSendMove = false, bFirstSendMovePack = false;
bool __fastcall hooks::hooked_writeusercmddeltatobuffer(void* ecx, void*edx, int slot, bf_write* buf, int from, int to, bool isnewcommand)
{
static auto original_fn = client_hook->get_func_address <WriteUsercmdDeltaToBuffer_t>(24);
if (!g_ctx.globals.tickbase_shift)
return original_fn(ecx, slot, buf, from, to, isnewcommand);
if (from != -1)
return true;
//signatures
auto CL_SendMove = []() {
using CL_SendMove_t = void(__fastcall*)(void);
static CL_SendMove_t CL_SendMoveF = (CL_SendMove_t)util::FindSignature(crypt_str("engine.dll"), crypt_str("55 8B EC A1 ? ? ? ? 81 EC ? ? ? ? B9 ? ? ? ? 53 8B 98"));
//Utils::FindSignature("engine.dll", "55 8B EC A1 ? ? ? ? 81 EC ? ? ? ? B9 ? ? ? ? 53 8B 98");
CL_SendMoveF();
};
int* pNumBackupCommands = (int*)(reinterpret_cast <uintptr_t> (buf) - 0x30);
int* pNumNewCommands = (int*)(reinterpret_cast <uintptr_t> (buf) - 0x2C);
auto net_channel = *reinterpret_cast <INetChannel**> (reinterpret_cast <uintptr_t> (m_clientstate()) + 0x9C);
int32_t new_commands = *pNumNewCommands;
//if (!g::bInSendMove) {
// if (new_commands <= 0)
// return false;
if (!bInSendMove) {
if (new_commands <= 0)
return false;
bInSendMove = true;
bFirstSendMovePack = true;
nTickBaseShift += new_commands;
while (nTickBaseShift > 0) {
CL_SendMove();
bFirstSendMovePack = false;
}
bInSendMove = false;
return false;
}
if (!bFirstSendMovePack) {
int32_t loss = min(nTickBaseShift, 16);
nTickBaseShift -= loss;
net_channel->m_nOutSequenceNr += loss;
}
int32_t next_cmdnr = m_clientstate()->nLastOutgoingCommand + m_clientstate()->iChokedCommands + 1;
int32_t total_new_commands = min(nTickBaseShift, 64);
nTickBaseShift -= total_new_commands;
from = -1;
*pNumNewCommands = total_new_commands;
*pNumBackupCommands = 0;
for (to = next_cmdnr - new_commands + 1; to <= next_cmdnr; to++) {
if (!original_fn(ecx, slot, buf, from, to, isnewcommand))
return false;
from = to;
}
CUserCmd* last_realCmd = m_input()->GetUserCmd( slot , from);//g_GameInput->GetUserCmd(slot, from);P
CUserCmd fromCmd;
if (last_realCmd)
fromCmd = *last_realCmd;
CUserCmd toCmd = fromCmd;
toCmd.m_command_number++;
toCmd.m_tickcount += 200;
//run
for (int i = new_commands; i <= total_new_commands; i++)
{
int m_shift = total_new_commands - new_commands + 1;
do
{
WriteUserÑmd(buf, &toCmd, &fromCmd);
fromCmd = toCmd;
toCmd.m_command_number++;
toCmd.m_tickcount++;
--m_shift;
} while (m_shift);
}
return true;
}
void WriteUserÑmd(void* buf, CUserCmd* incmd, CUserCmd* outcmd)
{
using WriteUserCmd_t = void(__fastcall*)(void*, CUserCmd*, CUserCmd*);
static auto Fn = (WriteUserCmd_t)util::FindSignature(crypt_str("client.dll"), crypt_str("55 8B EC 83 E4 F8 51 53 56 8B D9 8B 0D"));
__asm
{
mov ecx, buf
mov edx, incmd
push outcmd
call Fn
add esp, 4
}
}
Код:
CUserCmd* CInput::GetUserCmd(int slot ,int sequence_number)//ignore error
{
//typedef CUserCmd* (__thiscall* GetUserCmd_t) (void*, int, int);
return &m_pCommands[slot ,sequence_number % MULTIPLAYER_BACKUP];
}