L L4D2node

Mod_LoadNodes

0x00197be0 · 1038 bytes · unknown

_Z13Mod_LoadNodesv

Decompiled

undefined (0 params)

/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* Mod_LoadNodes() */

void Mod_LoadNodes(void)

{
  short sVar1;
  short sVar2;
  int iVar3;
  uint uVar4;
  undefined1 *puVar5;
  char *pcVar6;
  mnode_t *pmVar7;
  int iVar8;
  ushort uVar9;
  int iVar10;
  Vector *pVVar11;
  uint uVar12;
  int *piVar13;
  int in_GS_OFFSET;
  float fVar14;
  float fVar15;
  float fVar16;
  uint local_158;
  int local_154;
  mnode_t *local_150;
  uint local_140 [3];
  int local_134;
  int *local_130;
  int local_128;
  undefined1 local_124 [260];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  CMapLoadHelper::CMapLoadHelper((CMapLoadHelper *)local_140,5);
  if ((local_140[0] & 0x1f) != 0) {
                    /* try { // try from 00197fb5 to 00197fb9 has its CatchHandler @ 0019800a */
    Host_Error("Mod_LoadNodes: funny lump size in %s",s_szMapPathName);
  }
  uVar4 = local_140[0] >> 5;
  puVar5 = s_szMapPathName;
  if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
    puVar5 = local_124;
  }
                    /* try { // try from 00197c63 to 00197e9b has its CatchHandler @ 0019800a */
  pcVar6 = (char *)va("%s [%s]",puVar5,"nodes");
  pmVar7 = (mnode_t *)Hunk_AllocName(uVar4 << 6,pcVar6,true);
  iVar8 = s_pMap;
  *(mnode_t **)(s_pMap + 0x50) = pmVar7;
  *(uint *)(iVar8 + 0x4c) = uVar4;
  if (uVar4 == 0) {
    Mod_SetParent(pmVar7,(mnode_t *)0x0);
  }
  else {
    local_158 = 0;
    piVar13 = local_130;
    local_150 = pmVar7;
    do {
      sVar1 = *(short *)((int)piVar13 + 0x12);
      iVar3 = piVar13[5];
      sVar2 = *(short *)((int)piVar13 + 0x16);
      iVar10 = piVar13[3];
      fVar15 = ((float)(int)*(short *)((int)piVar13 + 0xe) + (float)(int)(short)iVar3) * 0.5;
      fVar14 = ((float)(int)(short)piVar13[4] + (float)(int)sVar2) * 0.5;
      *(float *)(pmVar7 + (int)(local_150 + (0x14 - (int)pmVar7))) = fVar15;
      fVar16 = ((float)(int)(short)iVar10 + (float)(int)sVar1) * 0.5;
      *(float *)(pmVar7 + (int)(local_150 + (0x18 - (int)pmVar7))) = fVar14;
      *(float *)(pmVar7 + (int)(local_150 + (0x10 - (int)pmVar7))) = fVar16;
      *(float *)(pmVar7 + (int)(local_150 + (0x24 - (int)pmVar7))) =
           (float)(int)(short)iVar3 - fVar15;
      *(float *)(pmVar7 + (int)(local_150 + (0x28 - (int)pmVar7))) = (float)(int)sVar2 - fVar14;
      *(float *)(pmVar7 + (int)(local_150 + (0x20 - (int)pmVar7))) = (float)(int)sVar1 - fVar16;
      *(int *)(local_150 + 0x30) = *(int *)(iVar8 + 8) + *piVar13 * 0x14;
      uVar9 = *(ushort *)(piVar13 + 6);
      if (s_nMapSurfacesLoaded < (int)((uint)*(ushort *)((int)piVar13 + 0x1a) + (uint)uVar9)) {
        Host_Error("Map %s is corrupted and cannot be loaded.",s_szMapPathName);
        uVar9 = *(ushort *)(piVar13 + 6);
        iVar8 = s_pMap;
      }
      iVar10 = 0;
      *(ushort *)(local_150 + 0x3c) = uVar9;
      *(undefined2 *)(local_150 + 0x3e) = *(undefined2 *)((int)piVar13 + 0x1a);
      iVar3 = piVar13[7];
      *(undefined4 *)local_150 = 0xffffffff;
      *(short *)(local_150 + 0xc) = (short)iVar3;
      do {
        uVar12 = piVar13[iVar10 + 1];
        if ((int)uVar12 < 0) {
          uVar12 = ~uVar12;
          puVar5 = s_szMapPathName;
          if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
            puVar5 = local_124;
          }
          local_154 = *(int *)(iVar8 + 0x10);
          if (*(int *)(iVar8 + 0xc) <= (int)uVar12) goto LAB_00197e27;
        }
        else {
          puVar5 = s_szMapPathName;
          if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
            puVar5 = local_124;
          }
          local_154 = *(int *)(iVar8 + 0x50);
          if (*(int *)(iVar8 + 0x4c) <= (int)uVar12) {
LAB_00197e27:
            Sys_Error("Couldn\'t load corrupted map %s",puVar5);
            iVar8 = s_pMap;
          }
        }
        *(uint *)(local_150 + iVar10 * 4 + 0x34) = local_154 + uVar12 * 0x40;
        iVar10 = iVar10 + 1;
      } while (iVar10 != 2);
      local_158 = local_158 + 1;
      piVar13 = piVar13 + 8;
      local_150 = local_150 + 0x40;
    } while (uVar4 != local_158);
    uVar12 = 0;
    Mod_SetParent(*(mnode_t **)(iVar8 + 0x50),(mnode_t *)0x0);
    pVVar11 = (Vector *)(*(int *)(iVar8 + 0x50) + 0x20);
    do {
      while (*(int *)(pVVar11 + -0x20) != -1) {
LAB_00197ef0:
        uVar12 = uVar12 + 1;
        pVVar11 = pVVar11 + 0x40;
        if (uVar4 == uVar12) goto LAB_00197f50;
      }
      if (((*(float *)pVVar11 <= 50.0) && (*(float *)(pVVar11 + 4) <= 50.0)) &&
         (*(float *)(pVVar11 + 8) <= 50.0)) {
        MarkSmallNode(*(mnode_t **)(pVVar11 + 0x14));
        MarkSmallNode(*(mnode_t **)(pVVar11 + 0x18));
        goto LAB_00197ef0;
      }
      if (*(int *)*(mnode_t **)(pVVar11 + 0x14) < 0) {
        CheckSmallVolumeDifferences(*(mnode_t **)(pVVar11 + 0x14),pVVar11);
      }
      if (-1 < *(int *)*(mnode_t **)(pVVar11 + 0x18)) goto LAB_00197ef0;
      uVar12 = uVar12 + 1;
      CheckSmallVolumeDifferences(*(mnode_t **)(pVVar11 + 0x18),pVVar11);
      pVVar11 = pVVar11 + 0x40;
    } while (uVar4 != uVar12);
  }
LAB_00197f50:
  if (local_134 != 0) {
    (**(code **)(*g_pFileSystem + 0x150))(g_pFileSystem,local_134);
  }
  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)