GCSDK::CJobMgr::AccumulateStatsofJob
0x00061e40 · 652 bytes · __thiscall
_ZN5GCSDK7CJobMgr20AccumulateStatsofJobERNS_4CJobE
Decompiled
undefined (2 params)
/* GCSDK::CJobMgr::AccumulateStatsofJob(GCSDK::CJob&) */
void __thiscall GCSDK::CJobMgr::AccumulateStatsofJob(CJobMgr *this,CJob *param_1)
{
CJob *pCVar1;
uint *puVar2;
uint uVar3;
CJob CVar4;
uint uVar5;
undefined4 uVar6;
char *pcVar7;
int iVar8;
int iVar9;
undefined4 *puVar10;
int in_GS_OFFSET;
byte bVar11;
undefined8 uVar12;
char local_1d4 [216];
undefined4 local_fc;
undefined4 local_f8 [54];
int local_20;
bVar11 = 0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (this[0xec] == (CJobMgr)0x0) {
if (*(int *)(param_1 + 0x18) == 0) goto LAB_00061e78;
LAB_00062050:
*(int *)(this + 0xf0) = *(int *)(this + 0xf0) + 1;
}
else if (*(int *)(param_1 + 0x18) != 0) goto LAB_00062050;
uVar12 = rdtsc();
uVar5 = (uint)uVar12 - *(uint *)(param_1 + 0x40);
iVar8 = ((int)((ulonglong)uVar12 >> 0x20) - *(int *)(param_1 + 0x44)) -
(uint)((uint)uVar12 < *(uint *)(param_1 + 0x40));
*(uint *)(param_1 + 0x40) = uVar5;
pCVar1 = param_1 + 0x48;
uVar3 = *(uint *)pCVar1;
*(uint *)pCVar1 = *(uint *)pCVar1 + uVar5;
*(int *)(param_1 + 0x44) = iVar8;
*(uint *)(param_1 + 0x4c) = *(int *)(param_1 + 0x4c) + iVar8 + (uint)CARRY4(uVar3,uVar5);
uVar6 = CJob::GetName(param_1);
puVar10 = local_f8;
for (iVar8 = 0x36; iVar8 != 0; iVar8 = iVar8 + -1) {
*puVar10 = 0;
puVar10 = puVar10 + (uint)bVar11 * -2 + 1;
}
local_fc = uVar6;
iVar8 = CUtlRBTree<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int,CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int>,int>>
::Find((CUtlRBTree<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int,CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int>,int>>
*)(this + 0xf8),(Node_t *)&local_fc);
if (iVar8 == -1) {
pcVar7 = local_1d4;
for (iVar8 = 0x36; iVar8 != 0; iVar8 = iVar8 + -1) {
pcVar7[0] = '\0';
pcVar7[1] = '\0';
pcVar7[2] = '\0';
pcVar7[3] = '\0';
pcVar7 = pcVar7 + ((uint)bVar11 * -2 + 1) * 4;
}
pcVar7 = (char *)CJob::GetName(param_1);
V_strncpy(local_1d4,pcVar7,0x40);
puVar10 = local_f8;
for (iVar8 = 0x36; iVar8 != 0; iVar8 = iVar8 + -1) {
*puVar10 = 0;
puVar10 = puVar10 + (uint)bVar11 * -2 + 1;
}
local_fc = uVar6;
pcVar7 = local_1d4;
puVar10 = local_f8;
for (iVar8 = 0x36; iVar8 != 0; iVar8 = iVar8 + -1) {
*puVar10 = *(undefined4 *)pcVar7;
pcVar7 = pcVar7 + ((uint)bVar11 * -2 + 1) * 4;
puVar10 = puVar10 + (uint)bVar11 * -2 + 1;
}
iVar8 = CUtlRBTree<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int,CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int>,int>>
::Insert((CUtlRBTree<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int,CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<unsigned_int,GCSDK::JobStatsBucket_t,int>::Node_t,int>,int>>
*)(this + 0xf8),(Node_t *)&local_fc);
}
iVar9 = iVar8 * 0xec + *(int *)(this + 0xfc);
puVar2 = (uint *)(iVar9 + 0x54);
uVar3 = *puVar2;
*puVar2 = *puVar2 + 1;
*(int *)(iVar9 + 0x58) = *(int *)(iVar9 + 0x58) + (uint)(0xfffffffe < uVar3);
uVar5 = *(uint *)(param_1 + 0x1c);
puVar2 = (uint *)(iVar9 + 0x74);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x78) = *(int *)(iVar9 + 0x78) + ((int)uVar5 >> 0x1f) + (uint)CARRY4(uVar3,uVar5)
;
uVar5 = *(uint *)(param_1 + 0x20);
puVar2 = (uint *)(iVar9 + 0x7c);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x80) = *(int *)(iVar9 + 0x80) + ((int)uVar5 >> 0x1f) + (uint)CARRY4(uVar3,uVar5)
;
uVar5 = (byte)param_1[0x18] >> 1 & 1;
puVar2 = (uint *)(iVar9 + 0x84);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x88) = *(int *)(iVar9 + 0x88) + (uint)CARRY4(uVar3,uVar5);
uVar5 = (byte)param_1[0x18] >> 2 & 1;
puVar2 = (uint *)(iVar9 + 0x8c);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x90) = *(int *)(iVar9 + 0x90) + (uint)CARRY4(uVar3,uVar5);
uVar5 = (byte)param_1[0x18] >> 3 & 1;
puVar2 = (uint *)(iVar9 + 0x94);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x98) = *(int *)(iVar9 + 0x98) + (uint)CARRY4(uVar3,uVar5);
uVar5 = (byte)param_1[0x18] >> 4 & 1;
puVar2 = (uint *)(iVar9 + 0x9c);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0xa0) = *(int *)(iVar9 + 0xa0) + (uint)CARRY4(uVar3,uVar5);
CVar4 = param_1[0x18];
puVar2 = (uint *)(iVar9 + 0xb4);
uVar3 = *puVar2;
*puVar2 = *puVar2 + ((byte)CVar4 & 1);
*(int *)(iVar9 + 0xb8) = *(int *)(iVar9 + 0xb8) + (uint)CARRY4(uVar3,(byte)CVar4 & 1);
uVar5 = (byte)param_1[0x18] >> 5 & 1;
puVar2 = (uint *)(iVar9 + 0x6c);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x70) = *(int *)(iVar9 + 0x70) + (uint)CARRY4(uVar3,uVar5);
uVar5 = (byte)param_1[0x18] >> 6 & 1;
puVar2 = (uint *)(iVar9 + 100);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0x68) = *(int *)(iVar9 + 0x68) + (uint)CARRY4(uVar3,uVar5);
uVar12 = CJobTime::CServerMicroSecsPassed((CJobTime *)(param_1 + 0x28));
puVar2 = (uint *)(iVar9 + 0xa4);
uVar3 = *puVar2;
*puVar2 = *puVar2 + (uint)uVar12;
*(int *)(iVar9 + 0xa8) =
*(int *)(iVar9 + 0xa8) + (int)((ulonglong)uVar12 >> 0x20) + (uint)CARRY4(uVar3,(uint)uVar12);
uVar5 = *(uint *)(param_1 + 0x48);
iVar8 = *(int *)(param_1 + 0x4c);
puVar2 = (uint *)(iVar9 + 0xbc);
uVar3 = *puVar2;
*puVar2 = *puVar2 + uVar5;
*(int *)(iVar9 + 0xc0) = *(int *)(iVar9 + 0xc0) + iVar8 + (uint)CARRY4(uVar3,uVar5);
uVar3 = *(uint *)(param_1 + 0x4c);
if ((*(uint *)(iVar9 + 0x60) <= uVar3) &&
((*(uint *)(iVar9 + 0x60) < uVar3 || (*(uint *)(iVar9 + 0x5c) < *(uint *)(param_1 + 0x48))))) {
*(uint *)(iVar9 + 0x5c) = *(uint *)(param_1 + 0x48);
*(uint *)(iVar9 + 0x60) = uVar3;
}
if (*(int *)(param_1 + 0x2c) != *(int *)(param_1 + 0x34) ||
*(int *)(param_1 + 0x28) != *(int *)(param_1 + 0x30)) {
puVar2 = (uint *)(iVar9 + 0xac);
uVar3 = *puVar2;
*puVar2 = *puVar2 + 1;
*(int *)(iVar9 + 0xb0) = *(int *)(iVar9 + 0xb0) + (uint)(0xfffffffe < uVar3);
}
LAB_00061e78:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.