L L4D2node

Mod_LoadOcclusion

0x0019b300 · 2833 bytes · unknown

_Z17Mod_LoadOcclusionv

Decompiled

undefined (0 params)

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

void Mod_LoadOcclusion(void)

{
  int iVar1;
  char cVar2;
  void *pvVar3;
  undefined4 uVar4;
  undefined4 *puVar5;
  int iVar6;
  uint *puVar7;
  uint uVar8;
  undefined1 *puVar9;
  int in_GS_OFFSET;
  int local_1d4;
  uint local_1c8;
  uint local_1c4;
  uint local_1c0;
  uint local_1bc;
  uint local_1b8;
  uint local_1b4;
  undefined4 local_1b0;
  undefined4 local_1ac;
  undefined4 local_1a8;
  undefined4 local_1a4;
  undefined4 local_1a0;
  undefined4 local_19c;
  undefined4 local_198;
  undefined4 local_194;
  undefined4 local_190;
  undefined4 local_18c;
  undefined4 local_188;
  undefined4 local_184;
  undefined4 local_180;
  undefined4 local_17c;
  int local_178 [3];
  int local_16c;
  byte local_163;
  int local_158;
  byte local_144;
  int local_140 [2];
  int local_138;
  int local_134;
  void *local_130;
  int local_128;
  undefined1 local_124 [260];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  CMapLoadHelper::CMapLoadHelper((CMapLoadHelper *)local_140,9);
  iVar1 = s_pMap;
  *(undefined4 *)(s_pMap + 0x24) = 0;
  *(undefined4 *)(iVar1 + 0x28) = 0;
  *(undefined4 *)(iVar1 + 0x2c) = 0;
  *(undefined4 *)(iVar1 + 0x30) = 0;
  *(undefined4 *)(iVar1 + 0x34) = 0;
  *(undefined4 *)(iVar1 + 0x38) = 0;
  if (local_140[0] == 0) {
    if (local_134 != 0) {
      (**(code **)(*g_pFileSystem + 0x150))(g_pFileSystem,local_134);
    }
    goto LAB_0019b386;
  }
                    /* try { // try from 0019b3c7 to 0019b3cb has its CatchHandler @ 0019be90 */
  CUtlBuffer::CUtlBuffer((CUtlBuffer *)local_178,local_130,local_140[0],8);
  if (local_138 == 1) {
    if ((local_163 & 1) == 0) {
      cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
      if (cVar2 != '\0') {
        if ((local_144 & 1) == 0) {
          uVar8 = *(uint *)(local_178[0] + (local_16c - local_158));
        }
        else {
          puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
          if (puVar7 == (uint *)0x0) {
            puVar7 = &local_1bc;
          }
          local_1a4 = local_1bc;
          local_1a4 = CONCAT31((int3)(local_1bc >> 8),*(undefined1 *)((int)puVar7 + 3));
          local_1a4._2_2_ = (undefined2)(local_1bc >> 0x10);
          local_1a4._0_2_ =
               CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
          local_1a4._3_1_ = (undefined1)(local_1bc >> 0x18);
          local_1a4._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_1a4);
          local_1a4 = CONCAT13((char)*puVar7,(undefined3)local_1a4);
          _V_memcpy(&local_1bc,&local_1a4,4);
          uVar8 = local_1bc;
        }
        local_16c = local_16c + 4;
        goto LAB_0019b65d;
      }
      *(undefined4 *)(iVar1 + 0x24) = 0;
    }
    else {
      local_1bc = 0;
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1bc);
      uVar8 = local_1bc;
LAB_0019b65d:
      *(uint *)(iVar1 + 0x24) = uVar8;
      if (uVar8 != 0) {
        puVar9 = local_124;
        if ((&s_MapLumpFiles)[local_128 * 7] == 0) {
          puVar9 = s_szMapPathName;
        }
        if ((((int)uVar8 >> 0x1f) << 3 | uVar8 >> 0x1d) +
            (((int)uVar8 >> 0x1f) << 5 | uVar8 >> 0x1b) + (uint)CARRY4(uVar8 * 8,uVar8 * 0x20) !=
            (int)(uVar8 * 0x28) >> 0x1f) {
          Sys_Error("Couldn\'t load corrupted map %s",puVar9);
        }
        uVar4 = Hunk_AllocName(uVar8 * 0x28,"occluder data",true);
        *(undefined4 *)(iVar1 + 0x28) = uVar4;
        iVar6 = 0;
        local_1d4 = 0;
        if (0 < *(int *)(iVar1 + 0x24)) {
          do {
            CUtlBuffer::Get((CUtlBuffer *)local_178,&local_19c,0x24);
            local_1d4 = local_1d4 + 1;
            puVar5 = (undefined4 *)(*(int *)(iVar1 + 0x28) + iVar6);
            *puVar5 = local_19c;
            puVar5[1] = local_198;
            puVar5[2] = local_194;
            puVar5[3] = local_190;
            puVar5[4] = local_18c;
            puVar5[5] = local_188;
            puVar5[6] = local_184;
            puVar5[7] = local_180;
            puVar5[8] = local_17c;
            *(undefined4 *)(*(int *)(iVar1 + 0x28) + 0x24 + iVar6) = 1;
            iVar6 = iVar6 + 0x28;
          } while (local_1d4 < *(int *)(iVar1 + 0x24));
        }
      }
    }
    if ((local_163 & 1) == 0) {
      cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
      if (cVar2 != '\0') {
        if ((local_144 & 1) == 0) {
          uVar8 = *(uint *)(local_178[0] + (local_16c - local_158));
        }
        else {
          puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
          if (puVar7 == (uint *)0x0) {
            puVar7 = &local_1b8;
          }
          local_1a0 = local_1b8;
          local_1a0 = CONCAT31((int3)(local_1b8 >> 8),*(undefined1 *)((int)puVar7 + 3));
          local_1a0._2_2_ = (undefined2)(local_1b8 >> 0x10);
          local_1a0._0_2_ =
               CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
          local_1a0._3_1_ = (undefined1)(local_1b8 >> 0x18);
          local_1a0._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_1a0);
          local_1a0 = CONCAT13((char)*puVar7,(undefined3)local_1a0);
          _V_memcpy(&local_1b8,&local_1a0,4);
          uVar8 = local_1b8;
        }
        local_16c = local_16c + 4;
        goto LAB_0019b7b0;
      }
      *(undefined4 *)(iVar1 + 0x2c) = 0;
    }
    else {
      local_1b8 = 0;
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1b8);
      uVar8 = local_1b8;
LAB_0019b7b0:
      *(uint *)(iVar1 + 0x2c) = uVar8;
      if (uVar8 != 0) {
        puVar9 = s_szMapPathName;
        if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
          puVar9 = local_124;
        }
        iVar6 = uVar8 * 0xc;
        if (((((int)uVar8 >> 0x1f) << 4 | uVar8 >> 0x1c) -
            (((int)uVar8 >> 0x1f) << 2 | uVar8 >> 0x1e)) - (uint)(uVar8 * 0x10 < uVar8 * 4) !=
            iVar6 >> 0x1f) {
          Sys_Error("Couldn\'t load corrupted map %s",puVar9);
        }
        pvVar3 = (void *)Hunk_AllocName(iVar6,"occluder poly data",true);
        *(void **)(iVar1 + 0x30) = pvVar3;
        CUtlBuffer::Get((CUtlBuffer *)local_178,pvVar3,iVar6);
      }
    }
    if ((local_163 & 1) != 0) {
      local_1b4 = 0;
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1b4);
      uVar8 = local_1b4;
      goto LAB_0019b87f;
    }
    cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
    if (cVar2 != '\0') {
      if ((local_144 & 1) == 0) {
LAB_0019bbe8:
        uVar8 = *(uint *)(local_178[0] + (local_16c - local_158));
      }
      else {
        puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
        if (puVar7 == (uint *)0x0) {
          puVar7 = &local_1b4;
        }
        local_19c = local_1b4;
        local_19c = CONCAT31((int3)(local_1b4 >> 8),*(undefined1 *)((int)puVar7 + 3));
        local_19c._2_2_ = (undefined2)(local_1b4 >> 0x10);
        local_19c._0_2_ =
             CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
        local_19c._3_1_ = (undefined1)(local_1b4 >> 0x18);
        local_19c._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_19c);
        local_19c = CONCAT13((char)*puVar7,(undefined3)local_19c);
        _V_memcpy(&local_1b4,&local_19c,4);
        uVar8 = local_1b4;
      }
      goto LAB_0019bab8;
    }
LAB_0019bad0:
    *(undefined4 *)(iVar1 + 0x34) = 0;
  }
  else if (local_138 == 2) {
    if ((local_163 & 1) == 0) {
      cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
      if (cVar2 != '\0') {
        if ((local_144 & 1) == 0) {
          uVar8 = *(uint *)(local_178[0] + (local_16c - local_158));
        }
        else {
          puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
          if (puVar7 == (uint *)0x0) {
            puVar7 = &local_1c8;
          }
          local_1b0 = local_1c8;
          local_1b0 = CONCAT31((int3)(local_1c8 >> 8),*(undefined1 *)((int)puVar7 + 3));
          local_1b0._2_2_ = (undefined2)(local_1c8 >> 0x10);
          local_1b0._0_2_ =
               CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
          local_1b0._3_1_ = (undefined1)(local_1c8 >> 0x18);
          local_1b0._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_1b0);
          local_1b0 = CONCAT13((char)*puVar7,(undefined3)local_1b0);
          _V_memcpy(&local_1c8,&local_1b0,4);
          uVar8 = local_1c8;
        }
        local_16c = local_16c + 4;
        goto LAB_0019b46d;
      }
      *(undefined4 *)(iVar1 + 0x24) = 0;
    }
    else {
      local_1c8 = 0;
                    /* try { // try from 0019b462 to 0019be12 has its CatchHandler @ 0019be5a */
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1c8);
      uVar8 = local_1c8;
LAB_0019b46d:
      *(uint *)(iVar1 + 0x24) = uVar8;
      if (uVar8 != 0) {
        puVar9 = local_124;
        if ((&s_MapLumpFiles)[local_128 * 7] == 0) {
          puVar9 = s_szMapPathName;
        }
        iVar6 = uVar8 * 0x28;
        if ((((int)uVar8 >> 0x1f) << 3 | uVar8 >> 0x1d) +
            (((int)uVar8 >> 0x1f) << 5 | uVar8 >> 0x1b) + (uint)CARRY4(uVar8 * 8,uVar8 * 0x20) !=
            iVar6 >> 0x1f) {
          Sys_Error("Couldn\'t load corrupted map %s",puVar9);
        }
        pvVar3 = (void *)Hunk_AllocName(iVar6,"occluder data",true);
        *(void **)(iVar1 + 0x28) = pvVar3;
        CUtlBuffer::Get((CUtlBuffer *)local_178,pvVar3,iVar6);
      }
    }
    if ((local_163 & 1) == 0) {
      cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
      if (cVar2 != '\0') {
        if ((local_144 & 1) == 0) {
          uVar8 = *(uint *)(local_178[0] + (local_16c - local_158));
        }
        else {
          puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
          if (puVar7 == (uint *)0x0) {
            puVar7 = &local_1c4;
          }
          local_1ac = local_1c4;
          local_1ac = CONCAT31((int3)(local_1c4 >> 8),*(undefined1 *)((int)puVar7 + 3));
          local_1ac._2_2_ = (undefined2)(local_1c4 >> 0x10);
          local_1ac._0_2_ =
               CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
          local_1ac._3_1_ = (undefined1)(local_1c4 >> 0x18);
          local_1ac._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_1ac);
          local_1ac = CONCAT13((char)*puVar7,(undefined3)local_1ac);
          _V_memcpy(&local_1c4,&local_1ac,4);
          uVar8 = local_1c4;
        }
        local_16c = local_16c + 4;
        goto LAB_0019b544;
      }
      *(undefined4 *)(iVar1 + 0x2c) = 0;
    }
    else {
      local_1c4 = 0;
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1c4);
      uVar8 = local_1c4;
LAB_0019b544:
      *(uint *)(iVar1 + 0x2c) = uVar8;
      if (uVar8 != 0) {
        puVar9 = s_szMapPathName;
        if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
          puVar9 = local_124;
        }
        iVar6 = uVar8 * 0xc;
        if (((((int)uVar8 >> 0x1f) << 4 | uVar8 >> 0x1c) -
            (((int)uVar8 >> 0x1f) << 2 | uVar8 >> 0x1e)) - (uint)(uVar8 * 0x10 < uVar8 * 4) !=
            iVar6 >> 0x1f) {
          Sys_Error("Couldn\'t load corrupted map %s",puVar9);
        }
        pvVar3 = (void *)Hunk_AllocName(iVar6,"occluder poly data",true);
        *(void **)(iVar1 + 0x30) = pvVar3;
        CUtlBuffer::Get((CUtlBuffer *)local_178,pvVar3,iVar6);
      }
    }
    if ((local_163 & 1) == 0) {
      cVar2 = CUtlBuffer::CheckGet((CUtlBuffer *)local_178,4);
      if (cVar2 == '\0') goto LAB_0019bad0;
      if ((local_144 & 1) == 0) goto LAB_0019bbe8;
      puVar7 = (uint *)((local_16c - local_158) + local_178[0]);
      if (puVar7 == (uint *)0x0) {
        puVar7 = &local_1c0;
      }
      local_1a8 = local_1c0;
      local_1a8 = CONCAT31((int3)(local_1c0 >> 8),*(undefined1 *)((int)puVar7 + 3));
      local_1a8._2_2_ = (undefined2)(local_1c0 >> 0x10);
      local_1a8._0_2_ = CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
      local_1a8._3_1_ = (undefined1)(local_1c0 >> 0x18);
      local_1a8._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_1a8);
      local_1a8 = CONCAT13((char)*puVar7,(undefined3)local_1a8);
      _V_memcpy(&local_1c0,&local_1a8,4);
      uVar8 = local_1c0;
LAB_0019bab8:
      local_16c = local_16c + 4;
    }
    else {
      local_1c0 = 0;
      CUtlBuffer::Scanf((CUtlBuffer *)local_178,"%d",&local_1c0);
      uVar8 = local_1c0;
    }
LAB_0019b87f:
    *(uint *)(iVar1 + 0x34) = uVar8;
    if (uVar8 != 0) {
      puVar9 = s_szMapPathName;
      if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
        puVar9 = local_124;
      }
      iVar6 = uVar8 << 2;
      if ((((int)uVar8 >> 0x1f) << 2 | uVar8 >> 0x1e) != iVar6 >> 0x1f) {
        Sys_Error("Couldn\'t load corrupted map %s",puVar9);
      }
      pvVar3 = (void *)Hunk_AllocName(iVar6,"occluder vertices",true);
      *(void **)(iVar1 + 0x38) = pvVar3;
      CUtlBuffer::Get((CUtlBuffer *)local_178,pvVar3,iVar6);
    }
  }
  else if (local_138 != 0) {
                    /* try { // try from 0019b3eb to 0019b3ef has its CatchHandler @ 0019be5a */
    Host_Error("Invalid occlusion lump version!\n");
  }
  CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)local_178);
  if (local_134 != 0) {
    (**(code **)(*g_pFileSystem + 0x150))(g_pFileSystem,local_134);
  }
LAB_0019b386:
  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)