L L4D2node

CM_DispTreeLeafnum

0x00124f90 · 1027 bytes · __cdecl

_Z18CM_DispTreeLeafnumP17CCollisionBSPData

Decompiled

undefined (1 param)

/* CM_DispTreeLeafnum(CCollisionBSPData*) */

void CM_DispTreeLeafnum(CCollisionBSPData *param_1)

{
  short *psVar1;
  ushort uVar2;
  CCollisionBSPData *pCVar3;
  CCollisionBSPData *pCVar4;
  int iVar5;
  short sVar6;
  int iVar7;
  int iVar8;
  uint uVar9;
  CUtlMemory<unsigned_short,int> *local_74;
  CUtlMemory<int,int> *local_70;
  CCollisionBSPData *local_60;
  CCollisionBSPData *local_5c;
  void *local_58;
  undefined4 local_54;
  undefined4 local_50;
  int local_4c;
  void *local_48;
  int local_44 [5];
  int local_30 [8];
  
  if (g_DispCollTreeCount == 0) {
    return;
  }
  if (0 < *(int *)(param_1 + 0x94)) {
    iVar8 = 0;
    do {
      if (*(int *)(param_1 + 0x9c) <= iVar8) {
        Error("Cannot load corrupted map.\n");
      }
      iVar5 = iVar8 + 1;
      *(undefined2 *)(iVar8 * 0x10 + *(int *)(param_1 + 0x98) + 0xe) = 0;
      iVar8 = iVar5;
    } while (iVar5 < *(int *)(param_1 + 0x94));
  }
  iVar8 = g_DispCollTreeCount;
  local_50 = 0;
  local_4c = 0;
  local_44[0] = 0;
  local_44[1] = 0;
  local_44[2] = 0;
  local_44[3] = 0;
  local_44[4] = 0;
  local_30[0] = 0;
  local_30[1] = 0;
  local_30[2] = 0;
  local_30[4] = 0;
  local_5c = param_1;
  local_54 = 0x1000;
  local_58 = malloc(0x2000);
  local_30[3] = 0;
  local_48 = local_58;
  if (iVar8 != 0) {
    CUtlVector<unsigned_short,CUtlMemory<unsigned_short,int>>::GrowVector
              ((CUtlVector<unsigned_short,CUtlMemory<unsigned_short,int>> *)local_30,iVar8);
                    /* try { // try from 001252f4 to 00125335 has its CatchHandler @ 0012540d */
    CUtlVector<unsigned_short,CUtlMemory<unsigned_short,int>>::ShiftElementsRight
              ((CUtlVector<unsigned_short,CUtlMemory<unsigned_short,int>> *)local_30,0,iVar8);
    iVar8 = g_DispCollTreeCount;
    local_44[3] = 0;
    if (g_DispCollTreeCount != 0) {
      CUtlVector<int,CUtlMemory<int,int>>::GrowVector
                ((CUtlVector<int,CUtlMemory<int,int>> *)local_44,g_DispCollTreeCount);
      CUtlVector<int,CUtlMemory<int,int>>::ShiftElementsRight
                ((CUtlVector<int,CUtlMemory<int,int>> *)local_44,0,iVar8);
      if (0 < g_DispCollTreeCount) {
        iVar8 = 0;
        do {
          *(undefined2 *)(local_30[0] + iVar8 * 2) = 0;
          *(undefined4 *)(local_44[0] + iVar8 * 4) = 0xffffffff;
          iVar8 = iVar8 + 1;
        } while (iVar8 < g_DispCollTreeCount);
        if (0 < g_DispCollTreeCount) {
          iVar8 = 0;
          do {
                    /* try { // try from 00125387 to 0012538b has its CatchHandler @ 001253a3 */
            CDispLeafBuilder::BuildLeafListForDisplacement((CDispLeafBuilder *)&local_5c,iVar8);
            iVar8 = iVar8 + 1;
          } while (iVar8 < g_DispCollTreeCount);
        }
      }
      goto LAB_00125081;
    }
  }
  local_44[3] = 0;
LAB_00125081:
  iVar8 = local_4c;
  local_70 = (CUtlMemory<int,int> *)local_44;
  local_74 = (CUtlMemory<unsigned_short,int> *)local_30;
                    /* try { // try from 0012509a to 001252c8 has its CatchHandler @ 001253a3 */
  iVar5 = Hunk_AllocName(local_4c * 2,"map_dispList",false);
  *(int *)(param_1 + 0xd0) = iVar5;
  *(int *)(param_1 + 0xd4) = iVar8;
  pCVar4 = local_5c;
  if (0 < *(int *)(local_5c + 0x94)) {
    pCVar3 = local_5c;
    iVar8 = 0;
    do {
      pCVar4 = pCVar3;
      if (*(int *)(pCVar3 + 0x9c) <= iVar8) {
        Error("Cannot load corrupted map.\n");
        pCVar4 = local_5c;
      }
      iVar7 = iVar8 + 1;
      *(undefined2 *)(iVar8 * 0x10 + *(int *)(pCVar3 + 0x98) + 0xe) = 0;
      pCVar3 = pCVar4;
      iVar8 = iVar7;
    } while (iVar7 < *(int *)(pCVar4 + 0x94));
  }
  local_60 = pCVar4;
  if (0 < local_4c) {
    iVar8 = 0;
    pCVar3 = pCVar4;
    do {
      uVar9 = (uint)*(ushort *)((int)local_58 + iVar8 * 2);
      local_60 = pCVar3;
      if (*(int *)(pCVar3 + 0x9c) <= (int)uVar9) {
        Error("Cannot load corrupted map.\n");
        local_60 = local_5c;
        pCVar4 = local_5c;
      }
      iVar8 = iVar8 + 1;
      psVar1 = (short *)(uVar9 * 0x10 + *(int *)(pCVar3 + 0x98) + 0xe);
      *psVar1 = *psVar1 + 1;
      pCVar3 = local_60;
    } while (iVar8 < local_4c);
  }
  if (0 < *(int *)(local_60 + 0x94)) {
    sVar6 = 0;
    iVar8 = 0;
    do {
      if (*(int *)(local_60 + 0x9c) <= iVar8) {
        Error("Cannot load corrupted map.\n");
        pCVar4 = local_5c;
      }
      iVar7 = iVar8 + 1;
      iVar8 = iVar8 * 0x10 + *(int *)(local_60 + 0x98);
      *(short *)(iVar8 + 0xc) = sVar6;
      sVar6 = sVar6 + *(short *)(iVar8 + 0xe);
      *(undefined2 *)(iVar8 + 0xe) = 0;
      iVar8 = iVar7;
      local_60 = pCVar4;
    } while (iVar7 < *(int *)(pCVar4 + 0x94));
  }
  local_60 = (CCollisionBSPData *)0x0;
  if (0 < local_30[3]) {
    do {
      uVar2 = *(ushort *)(local_30[0] + (int)local_60 * 2);
      if (uVar2 != 0) {
        iVar8 = 1;
        do {
          pCVar4 = local_5c;
          uVar9 = (uint)*(ushort *)
                         ((int)local_58 +
                         (*(int *)(local_44[0] + (int)local_60 * 4) + iVar8) * 2 + -2);
          if (*(int *)(local_5c + 0x9c) <= (int)uVar9) {
            Error("Cannot load corrupted map.\n");
          }
          iVar8 = iVar8 + 1;
          iVar7 = uVar9 * 0x10 + *(int *)(pCVar4 + 0x98);
          *(undefined2 *)
           (iVar5 + ((uint)*(ushort *)(iVar7 + 0xe) + (uint)*(ushort *)(iVar7 + 0xc)) * 2) =
               local_60._0_2_;
          *(short *)(iVar7 + 0xe) = *(short *)(iVar7 + 0xe) + 1;
        } while (iVar8 != uVar2 + 1);
      }
      local_60 = (CCollisionBSPData *)((int)local_60 + 1);
    } while ((int)local_60 < local_30[3]);
  }
  local_30[3] = 0;
  CUtlMemory<unsigned_short,int>::Purge(local_74);
  local_30[4] = local_30[0];
  CUtlMemory<unsigned_short,int>::Purge(local_74);
  local_44[3] = 0;
  CUtlMemory<int,int>::Purge(local_70);
  local_44[4] = local_44[0];
  CUtlMemory<int,int>::Purge(local_70);
  local_4c = 0;
  CUtlMemory<unsigned_short,int>::Purge((CUtlMemory<unsigned_short,int> *)&local_58);
  local_48 = local_58;
  CUtlMemory<unsigned_short,int>::Purge((CUtlMemory<unsigned_short,int> *)&local_58);
  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)