L L4D2node

SendTable_BuildHierarchy_IterateProps

0x00142460 · 451 bytes · __cdecl

_Z37SendTable_BuildHierarchy_IteratePropsP9CSendNodePK9SendTableP21CBuildHierarchyStructPPK8SendPropRi

Decompiled

undefined (5 params)

/* SendTable_BuildHierarchy_IterateProps(CSendNode*, SendTable const*, CBuildHierarchyStruct*,
   SendProp const**, int&) */

void SendTable_BuildHierarchy_IterateProps
               (CSendNode *param_1,SendTable *param_2,CBuildHierarchyStruct *param_3,
               SendProp **param_4,int *param_5)

{
  int iVar1;
  uint uVar2;
  SendProp *pSVar3;
  int iVar4;
  CSendNode *local_20 [4];
  
  iVar4 = 0;
  if (*(int *)(param_2 + 4) < 1) {
    return;
  }
  do {
    while ((pSVar3 = (SendProp *)(iVar4 * 0x54 + *(int *)param_2),
           (*(uint *)(pSVar3 + 0x3c) & 0x140) != 0 ||
           (iVar1 = FindExcludeProp(*(char **)(param_2 + 8),*(char **)(pSVar3 + 0x30),
                                    *(ExcludeProp **)param_3,*(int *)(param_3 + 4)), iVar1 != 0))) {
LAB_00142480:
      iVar4 = iVar4 + 1;
      if (*(int *)(param_2 + 4) <= iVar4) {
        return;
      }
    }
    if (*(int *)(pSVar3 + 8) == 6) {
      if (((byte)pSVar3[0x3d] & 8) == 0) {
        local_20[0] = operator_new(0x24);
        *(undefined2 *)(local_20[0] + 0x1e) = 0;
        *(undefined2 *)(local_20[0] + 0x20) = 0xfe;
        *(undefined2 *)(local_20[0] + 0x14) = 0xffff;
        *(undefined4 *)local_20[0] = 0;
        *(undefined2 *)(local_20[0] + 0x1c) = 0;
        *(undefined4 *)(local_20[0] + 4) = 0;
        *(undefined4 *)(local_20[0] + 8) = 0;
        *(undefined4 *)(local_20[0] + 0xc) = 0;
        *(undefined4 *)(local_20[0] + 0x10) = 0;
        *(undefined4 *)(local_20[0] + 0x18) = 0;
        uVar2 = *(uint *)(param_3 + 0x4004);
        if (0xffe < uVar2) {
          Error("Overflowed datatable prop list in SendTable \'%s\'.",*(undefined4 *)(param_2 + 8));
          uVar2 = *(uint *)(param_3 + 0x4004);
        }
        *(SendProp **)(param_3 + uVar2 * 4 + 8) = pSVar3;
        *(short *)(local_20[0] + 0x14) = (short)uVar2;
        *(int *)(param_3 + 0x4004) = *(int *)(param_3 + 0x4004) + 1;
        CUtlVector<CSendNode*,CUtlMemory<CSendNode*,int>>::InsertBefore
                  ((CUtlVector<CSendNode*,CUtlMemory<CSendNode*,int>> *)param_1,
                   *(int *)(param_1 + 0xc),local_20);
        SendTable_BuildHierarchy(local_20[0],*(SendTable **)(pSVar3 + 0x48),param_3);
      }
      else {
        SendTable_BuildHierarchy_IterateProps
                  (param_1,*(SendTable **)(pSVar3 + 0x48),param_3,param_4,param_5);
      }
      goto LAB_00142480;
    }
    iVar1 = *param_5;
    if (0xffe < iVar1) {
      Error("SendTable_BuildHierarchy: overflowed non-datatable props with \'%s\'.",
            *(undefined4 *)(pSVar3 + 0x30));
      iVar1 = *param_5;
    }
    iVar4 = iVar4 + 1;
    param_4[iVar1] = pSVar3;
    *param_5 = *param_5 + 1;
    if (*(int *)(param_2 + 4) <= iVar4) {
      return;
    }
  } while( true );
}

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)