L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)