CmdStart() is called for each client when he runs command.
Example for RunPlayerMove function, which calls SV_RunCmd(), which call engine.pfnCmdStart() function:
Decompiled:
Code:
//----- (01D84280) --------------------------------------------------------
int __cdecl PF_RunPlayerMove_I(int a1/* edict_t *fakeClient */, int a2/* float *moveAngles */, int a3/* float forwardMoveSpeed */, int a4/* float sideMoveSpeed */, int a5/* float upMoveSpeed */, __int16 a6/* unsigned short buttons */, char a7/* unsigned char impulse */, char a8/* unsigned char msecValue */)
{
int result; // eax@1
int v9; // ebx@1
int v10; // ebp@1
unsigned int v11; // eax@1
int v12; // edx@1
char v13; // [sp+18h] [bp-34h]@1
char v14; // [sp+1Ah] [bp-32h]@1
int v15; // [sp+1Ch] [bp-30h]@1
int v16; // [sp+20h] [bp-2Ch]@1
int v17; // [sp+24h] [bp-28h]@1
int v18; // [sp+28h] [bp-24h]@1
int v19; // [sp+2Ch] [bp-20h]@1
int v20; // [sp+30h] [bp-1Ch]@1
char v21; // [sp+34h] [bp-18h]@1
__int16 v22; // [sp+36h] [bp-16h]@1
char v23; // [sp+38h] [bp-14h]@1
v9 = host_client;
v10 = sv_player;
v11 = NUM_FOR_EDICT(a1);
sv_player = a1;
host_client = svs.clients + 20488 * v11 - 20488; // host_client = &svs.clients[NUM_FOR_EDICT(fakeClient) - 1];
*(double *)(host_client + 9656)/* host_client->time */ = host_frametime + sv.time - (double)(unsigned __int8)a8 / 1000.0;
Q_memset(v9, &v13, 0, 0x34u/* sizeof (usercmd_t) */);
v21/* command.lightlevel */ = 0;
pmove = &g_svmove.player_index;
v12 = *(_DWORD *)(a2 + 4);
result = *(_DWORD *)(a2 + 8);
v15 = *(_DWORD *)a2; // command.viewangles.x = moveAngles.x;
v16 = v12; // command.viewangles.y = moveAngles.y;
v17 = result; // command.viewangles.z = moveAngles.z;
v18 = a3; // command.forwardmove = forwardMoveSpeed;
v19 = a4; // command.sidemove = sideMoveSpeed;
v20 = a5; // command.upmove = upMoveSpeed;
v22 = a6; // command.buttons = buttons;
v23 = a7; // command.impulse = impulse;
v14 = a8; // command.msec = msecValue;
SV_PreRunCmd();
SV_RunCmd(v9, (int)&v13/* &command.lerp_msec */, 0/* randomSeed */);
sv_player = v10;
memcpy((void *)(host_client + 9552)/* host_client->lastcmd */, &v13, 0x34u/* sizeof (usercmd_t) */);
host_client = v9;
return result;
}
Restored:
Code:
//----- (01D84280) --------------------------------------------------------
void PF_RunPlayerMove_I (edict_t *fakeClient, const float *moveAngles, float forwardMoveSpeed, float sideMoveSpeed, float upMoveSpeed, unsigned short buttons, unsigned char impulse, unsigned char msecValue)
{
usercmd_t command;
// Store off the globals.. they're gonna get whacked
client_t *const temp_host_client (host_client);
edict_t *const temp_sv_player (sv_player);
sv_player = fakeClient;
host_client = &svs.clients[NUM_FOR_EDICT (fakeClient) - 1];
host_client->time = host_frametime + sv.time - msecValue / 1000.0;
Q_memset (&command, 0, sizeof (usercmd_t));
command.lightlevel = 0;
pmove = &g_svmove.player_index;
command.viewangles.x = moveAngles.x;
command.viewangles.y = moveAngles.y;
command.viewangles.z = moveAngles.z;
command.forwardmove = forwardMoveSpeed;
command.sidemove = sideMoveSpeed;
command.upmove = upMoveSpeed;
command.buttons = buttons;
command.impulse = impulse;
command.msec = msecValue;
SV_PreRunCmd ();
SV_RunCmd (&command, 0/* randomSeed */);
// save off the last good usercmd
memcpy (&host_client->lastcmd, &command, sizeof (usercmd_t));
// Restore the globals..
sv_player = temp_sv_player;
host_client = temp_host_client;
}
SV_RunCmd() function (only decompiled):
Code:
//----- (01DC0CC0) --------------------------------------------------------
void __usercall SV_RunCmd(int a1<ebx>, int a2/* usercmd_t command */, int a3/* unsigned int random_seed */)
{
int v3; // edx@3
float v4; // ST64_4@4
float v5; // ST1C_4@12
int v6; // eax@18
int v7; // eax@19
int v8; // ST54_4@25
bool v9; // [sp+Ch] [bp-CCh]@15
int v10; // [sp+4Ch] [bp-8Ch]@23
int v11; // [sp+50h] [bp-88h]@23
int v12; // [sp+54h] [bp-84h]@23
char v13; // [sp+5Ch] [bp-7Ch]@1
int v14; // [sp+5Eh] [bp-7Ah]@3
char v15; // [sp+7Ch] [bp-5Ch]@4
int v16; // [sp+90h] [bp-48h]@25
int i; // [sp+94h] [bp-44h]@23
int v18; // [sp+98h] [bp-40h]@25
char v19; // [sp+9Ch] [bp-3Ch]@25
float v20; // [sp+D4h] [bp-4h]@7
memcpy(&v13, (const void *)a2, 0x34u);
if ( *(double *)(host_client + 9624) <= realtime )
{
v3 = host_client;
*(_DWORD *)(host_client + 9624) = 0;
*(_DWORD *)(v3 + 9628) = 0;
if ( (double)(unsigned __int8)v14 <= 50.0 )
{
if ( !*(_DWORD *)(host_client + 9544) )
SV_SetupMove(host_client);
gEntityInterface.pfnCmdStart(sv_player, a2, a3);
v20 = (double)*(_BYTE *)(a2 + 2) * 0.001;
*(double *)(host_client + 9656) = v20 + *(double *)(host_client + 9656);
*(double *)(host_client + 9616) = (double)*(_BYTE *)(a2 + 2) / 1000.0 + *(double *)(host_client + 9616);
if ( *(_BYTE *)(a2 + 32) )
{
*(_DWORD *)(sv_player + 516) = *(_BYTE *)(a2 + 32);
if ( *(_BYTE *)(a2 + 32) == 204 )
SV_ForceFullClientsUpdate(a1);
}
*(_DWORD *)(sv_player + 184) = 0;
*(_DWORD *)(sv_player + 188) = 0;
*(_DWORD *)(sv_player + 192) = 0;
*(_DWORD *)(sv_player + 512) = *(_WORD *)(a2 + 30);
SV_CheckMovingGround(sv_player, v20);
*(_DWORD *)(pmove + 80) = *(_DWORD *)(sv_player + 244);
*(_DWORD *)(pmove + 84) = *(_DWORD *)(sv_player + 248);
*(_DWORD *)(pmove + 88) = *(_DWORD *)(sv_player + 252);
if ( !*(_DWORD *)(sv_player + 288) )
{
*(_DWORD *)(sv_player + 244) = *(_DWORD *)(a2 + 4);
*(_DWORD *)(sv_player + 248) = *(_DWORD *)(a2 + 8);
*(_DWORD *)(sv_player + 252) = *(_DWORD *)(a2 + 12);
}
v5 = *(double *)(host_client + 9656);
SV_PlayerRunPreThink(sv_player, v5);
SV_PlayerRunThink(sv_player, v20, *(double *)(host_client + 9656));
if ( Length((float *)(sv_player + 172)) > 0.0 )
{
*(_DWORD *)(sv_player + 184) = *(_DWORD *)(sv_player + 172);
*(_DWORD *)(sv_player + 188) = *(_DWORD *)(sv_player + 176);
*(_DWORD *)(sv_player + 192) = *(_DWORD *)(sv_player + 180);
}
*(_DWORD *)(pmove + 4) = 1;
*(_DWORD *)(pmove + 8) = *(_DWORD *)svs.maxclients > 1;
*(float *)(pmove + 12) = 1000.0 * *(double *)(host_client + 9656);
*(_DWORD *)(pmove + 188) = (*(_DWORD *)(sv_player + 548) & 0x4000) != 0;
*(_DWORD *)(pmove + 500) = LODWORD(flt_1E8B214);
*(_DWORD *)(pmove + 504) = *(_DWORD *)(sv_player + 656);
*(float *)(pmove + 140) = (double)*(signed int *)(sv_player + 684);
*(_DWORD *)(pmove + 144) = *(_DWORD *)(sv_player + 672);
*(_DWORD *)(pmove + 148) = *(_DWORD *)(sv_player + 676);
*(_DWORD *)(pmove + 152) = *(_DWORD *)(sv_player + 688);
*(_DWORD *)(pmove + 156) = *(_DWORD *)(sv_player + 692);
*(float *)(pmove + 172) = (double)*(signed int *)(sv_player + 680);
*(_DWORD *)(pmove + 200) = *(_DWORD *)(sv_player + 700);
Q_strncpy(pmove + 324592, host_client + 20220, 255);
*(_BYTE *)(pmove + 324847) = 0;
*(_DWORD *)(pmove + 92) = *(_DWORD *)(sv_player + 160);
*(_DWORD *)(pmove + 96) = *(_DWORD *)(sv_player + 164);
*(_DWORD *)(pmove + 100) = *(_DWORD *)(sv_player + 168);
*(_DWORD *)(pmove + 104) = *(_DWORD *)(sv_player + 196);
*(_DWORD *)(pmove + 108) = *(_DWORD *)(sv_player + 200);
*(_DWORD *)(pmove + 112) = *(_DWORD *)(sv_player + 204);
*(_DWORD *)(pmove + 68) = *(_DWORD *)(sv_player + 244);
*(_DWORD *)(pmove + 72) = *(_DWORD *)(sv_player + 248);
*(_DWORD *)(pmove + 76) = *(_DWORD *)(sv_player + 252);
*(_DWORD *)(pmove + 116) = *(_DWORD *)(sv_player + 172);
*(_DWORD *)(pmove + 120) = *(_DWORD *)(sv_player + 176);
*(_DWORD *)(pmove + 124) = *(_DWORD *)(sv_player + 180);
*(_DWORD *)(pmove + 128) = *(_DWORD *)(sv_player + 500);
*(_DWORD *)(pmove + 132) = *(_DWORD *)(sv_player + 504);
*(_DWORD *)(pmove + 136) = *(_DWORD *)(sv_player + 508);
*(_DWORD *)(pmove + 160) = *(_DWORD *)(sv_player + 232);
*(_DWORD *)(pmove + 164) = *(_DWORD *)(sv_player + 236);
*(_DWORD *)(pmove + 168) = *(_DWORD *)(sv_player + 240);
*(_DWORD *)(pmove + 212) = *(_DWORD *)(sv_player + 496);
*(_DWORD *)(pmove + 180) = *(_DWORD *)(sv_player + 408);
*(_DWORD *)(pmove + 192) = *(_DWORD *)(sv_player + 412);
*(_DWORD *)(pmove + 196) = *(_DWORD *)(sv_player + 416);
*(_DWORD *)(pmove + 216) = 0;
*(_DWORD *)(pmove + 204) = *(_DWORD *)(sv_player + 564);
memcpy((void *)(pmove + 283736), &v13, 0x34u);
v9 = *(float *)(sv_player + 480) <= 0.0;
*(_DWORD *)(pmove + 208) = v9;
*(_DWORD *)(pmove + 220) = *(_DWORD *)(sv_player + 392);
*(_DWORD *)(pmove + 184) = *(_DWORD *)(sv_player + 548);
*(_DWORD *)pmove = NUM_FOR_EDICT(sv_player) - 1;
*(_DWORD *)(pmove + 508) = *(_DWORD *)(sv_player + 708);
*(_DWORD *)(pmove + 512) = *(_DWORD *)(sv_player + 712);
*(_DWORD *)(pmove + 516) = *(_DWORD *)(sv_player + 716);
*(_DWORD *)(pmove + 520) = *(_DWORD *)(sv_player + 720);
*(_DWORD *)(pmove + 524) = *(_DWORD *)(sv_player + 724);
*(_DWORD *)(pmove + 528) = *(_DWORD *)(sv_player + 728);
*(_DWORD *)(pmove + 532) = *(_DWORD *)(sv_player + 732);
*(_DWORD *)(pmove + 536) = *(_DWORD *)(sv_player + 736);
*(_DWORD *)(pmove + 540) = *(_DWORD *)(sv_player + 740);
*(_DWORD *)(pmove + 544) = *(_DWORD *)(sv_player + 744);
*(_DWORD *)(pmove + 548) = *(_DWORD *)(sv_player + 748);
*(_DWORD *)(pmove + 552) = *(_DWORD *)(sv_player + 752);
*(_DWORD *)(pmove + 556) = *(_DWORD *)(sv_player + 756);
*(_DWORD *)(pmove + 560) = *(_DWORD *)(sv_player + 760);
*(_DWORD *)(pmove + 564) = *(_DWORD *)(sv_player + 764);
*(_DWORD *)(pmove + 568) = *(_DWORD *)(sv_player + 768);
*(_DWORD *)(pmove + 572) = *(_DWORD *)(sv_player + 772);
*(_DWORD *)(pmove + 576) = *(_DWORD *)(sv_player + 776);
*(_DWORD *)(pmove + 580) = *(_DWORD *)(sv_player + 780);
*(_DWORD *)(pmove + 584) = *(_DWORD *)(sv_player + 784);
*(_DWORD *)(pmove + 56) = *(_DWORD *)(sv_player + 136);
*(_DWORD *)(pmove + 60) = *(_DWORD *)(sv_player + 140);
*(_DWORD *)(pmove + 64) = *(_DWORD *)(sv_player + 144);
SV_AddLinksToPM((int)&sv_areanodes, pmove + 56);
*(_DWORD *)(pmove + 16) = LODWORD(v20);
*(_DWORD *)(pmove + 325040) = 1;
*(_DWORD *)(pmove + 325044) = PM_SV_PlaySound;
*(_DWORD *)(pmove + 325048) = PM_SV_TraceTexture;
*(_DWORD *)(pmove + 325052) = PM_SV_PlaybackEventFull;
gEntityInterface.pfnPM_Move(pmove, 1);
*(_DWORD *)(sv_player + 496) = *(_DWORD *)(pmove + 212);
*(_DWORD *)(sv_player + 408) = *(_DWORD *)(pmove + 180);
*(_DWORD *)(sv_player + 564) = *(_DWORD *)(pmove + 204);
*(_DWORD *)(sv_player + 576) = *(_DWORD *)(pmove + 228);
*(_DWORD *)(sv_player + 580) = *(_DWORD *)(pmove + 232);
*(_DWORD *)(sv_player + 548) = *(_DWORD *)(pmove + 184);
*(_DWORD *)(sv_player + 416) = *(_DWORD *)(pmove + 196);
*(_DWORD *)(sv_player + 392) = *(_DWORD *)(pmove + 220);
*(_DWORD *)(sv_player + 656) = *(_DWORD *)(pmove + 504);
*(_DWORD *)(sv_player + 688) = *(_DWORD *)(pmove + 152);
*(_DWORD *)(sv_player + 500) = *(_DWORD *)(pmove + 128);
*(_DWORD *)(sv_player + 504) = *(_DWORD *)(pmove + 132);
*(_DWORD *)(sv_player + 508) = *(_DWORD *)(pmove + 136);
*(_DWORD *)(sv_player + 196) = *(_DWORD *)(pmove + 104);
*(_DWORD *)(sv_player + 200) = *(_DWORD *)(pmove + 108);
*(_DWORD *)(sv_player + 204) = *(_DWORD *)(pmove + 112);
*(_DWORD *)(sv_player + 232) = *(_DWORD *)(pmove + 160);
*(_DWORD *)(sv_player + 236) = *(_DWORD *)(pmove + 164);
*(_DWORD *)(sv_player + 240) = *(_DWORD *)(pmove + 168);
if ( *(_DWORD *)(pmove + 224) == -1 )
{
v7 = *(_DWORD *)(sv_player + 548);
BYTE1(v7) &= 0xFDu;
*(_DWORD *)(sv_player + 548) = v7;
}
else
{
v6 = *(_DWORD *)(sv_player + 548);
BYTE1(v6) |= 2u;
*(_DWORD *)(sv_player + 548) = v6;
*(_DWORD *)(sv_player + 540) = EDICT_NUM(*(_DWORD *)(pmove
+ 224 * *(_DWORD *)(pmove + 224)
+ 672));
}
*(_DWORD *)(sv_player + 136) = *(_DWORD *)(pmove + 56);
*(_DWORD *)(sv_player + 140) = *(_DWORD *)(pmove + 60);
*(_DWORD *)(sv_player + 144) = *(_DWORD *)(pmove + 64);
*(_DWORD *)(sv_player + 160) = *(_DWORD *)(pmove + 92);
*(_DWORD *)(sv_player + 164) = *(_DWORD *)(pmove + 96);
*(_DWORD *)(sv_player + 168) = *(_DWORD *)(pmove + 100);
*(_DWORD *)(sv_player + 172) = *(_DWORD *)(pmove + 116);
*(_DWORD *)(sv_player + 176) = *(_DWORD *)(pmove + 120);
*(_DWORD *)(sv_player + 180) = *(_DWORD *)(pmove + 124);
if ( !*(_DWORD *)(sv_player + 288) )
{
*(_DWORD *)(sv_player + 244) = *(_DWORD *)(pmove + 68);
*(_DWORD *)(sv_player + 248) = *(_DWORD *)(pmove + 72);
*(_DWORD *)(sv_player + 252) = *(_DWORD *)(pmove + 76);
*(_DWORD *)(sv_player + 208) = *(_DWORD *)(pmove + 68);
*(_DWORD *)(sv_player + 212) = *(_DWORD *)(pmove + 72);
*(_DWORD *)(sv_player + 216) = *(_DWORD *)(pmove + 76);
*(float *)(sv_player + 208) = -*(float *)(pmove + 68) / 3.0;
}
*(_DWORD *)(sv_player + 672) = *(_DWORD *)(pmove + 144);
*(_DWORD *)(sv_player + 684) = (signed __int64)*(float *)(pmove + 140);
*(_DWORD *)(sv_player + 676) = *(_DWORD *)(pmove + 148);
*(_DWORD *)(sv_player + 692) = *(_DWORD *)(pmove + 156);
*(_DWORD *)(sv_player + 680) = (signed __int64)*(float *)(pmove + 172);
*(_DWORD *)(sv_player + 700) = *(_WORD *)(pmove + 283766);
*(_DWORD *)(sv_player + 708) = *(_DWORD *)(pmove + 508);
*(_DWORD *)(sv_player + 712) = *(_DWORD *)(pmove + 512);
*(_DWORD *)(sv_player + 716) = *(_DWORD *)(pmove + 516);
*(_DWORD *)(sv_player + 720) = *(_DWORD *)(pmove + 520);
*(_DWORD *)(sv_player + 724) = *(_DWORD *)(pmove + 524);
*(_DWORD *)(sv_player + 728) = *(_DWORD *)(pmove + 528);
*(_DWORD *)(sv_player + 732) = *(_DWORD *)(pmove + 532);
*(_DWORD *)(sv_player + 736) = *(_DWORD *)(pmove + 536);
*(_DWORD *)(sv_player + 740) = *(_DWORD *)(pmove + 540);
*(_DWORD *)(sv_player + 744) = *(_DWORD *)(pmove + 544);
*(_DWORD *)(sv_player + 748) = *(_DWORD *)(pmove + 548);
*(_DWORD *)(sv_player + 752) = *(_DWORD *)(pmove + 552);
*(_DWORD *)(sv_player + 756) = *(_DWORD *)(pmove + 556);
*(_DWORD *)(sv_player + 760) = *(_DWORD *)(pmove + 560);
*(_DWORD *)(sv_player + 764) = *(_DWORD *)(pmove + 564);
*(_DWORD *)(sv_player + 768) = *(_DWORD *)(pmove + 568);
*(_DWORD *)(sv_player + 772) = *(_DWORD *)(pmove + 572);
*(_DWORD *)(sv_player + 776) = *(_DWORD *)(pmove + 576);
*(_DWORD *)(sv_player + 780) = *(_DWORD *)(pmove + 580);
*(_DWORD *)(sv_player + 784) = *(_DWORD *)(pmove + 584);
SetMinMaxSize(
sv_player,
(int)&dword_1E7E79C[3 * *(_DWORD *)(pmove + 188)],
(int)&dword_1E7E7CC[3 * *(_DWORD *)(pmove + 188)]);
if ( *(_DWORD *)(*(_DWORD *)(host_client + 19356) + 396) )
{
SV_LinkEdict(a1, sv_player, 1);
v10 = *(_DWORD *)(sv_player + 160);
v11 = *(_DWORD *)(sv_player + 164);
v12 = *(_DWORD *)(sv_player + 168);
for ( i = 0; i < *(_DWORD *)(pmove + 283788); ++i )
{
v16 = *(_DWORD *)(pmove + 224 * *(_DWORD *)(pmove + 68 * i + 283840) + 672);
v18 = EDICT_NUM(v16);
v8 = pmove + 68 * i + 283792;
SV_ConvertPMTrace((int)&v19, pmove + 68 * i + 283792, v18);
*(_DWORD *)(sv_player + 160) = *(_DWORD *)(v8 + 52);
*(_DWORD *)(sv_player + 164) = *(_DWORD *)(v8 + 56);
*(_DWORD *)(sv_player + 168) = *(_DWORD *)(v8 + 60);
SV_Impact(v18, sv_player, (int)&v19);
}
*(_DWORD *)(sv_player + 160) = v10;
*(_DWORD *)(sv_player + 164) = v11;
*(_DWORD *)(sv_player + 168) = v12;
}
gGlobalVariables.time = *(double *)(host_client + 9656);
gGlobalVariables.frametime = v20;
gEntityInterface.pfnPlayerPostThink(sv_player);
gEntityInterface.pfnCmdEnd(sv_player);
if ( !*(_DWORD *)(host_client + 9544) )
SV_RestoreMove(host_client);
}
else
{
v4 = (double)*(_BYTE *)(a2 + 2);
LOBYTE(v14) = (signed __int64)(v4 / 2.0);
SV_RunCmd(&v13, a3);
LOBYTE(v14) = (signed __int64)(v4 / 2.0);
v15 = 0;
SV_RunCmd(&v13, a3);
}
}
else
{
*(double *)(host_client + 9616) = (double)*(_BYTE *)(a2 + 2) / 1000.0 + *(double *)(host_client + 9616);
}
}