L L4D2node

CModelLoader::SetupSubModels

0x0019d180 · 966 bytes · __thiscall

_ZN12CModelLoader14SetupSubModelsEP7model_tR10CUtlVectorI8mmodel_t10CUtlMemoryIS3_iEE

Decompiled

undefined (3 params)

/* CModelLoader::SetupSubModels(model_t*, CUtlVector<mmodel_t, CUtlMemory<mmodel_t, int> >&) */

void __thiscall
CModelLoader::SetupSubModels(CModelLoader *this,model_t *param_1,CUtlVector *param_2)

{
  uint uVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  int iVar4;
  undefined4 *puVar5;
  char *pcVar6;
  model_t *pmVar7;
  char *pcVar8;
  byte bVar9;
  int local_20;
  
  bVar9 = 0;
  iVar4 = *(int *)(this + 0x68);
  *(undefined4 *)(this + 0x5c) = 0;
  if (iVar4 != 0) {
    CUtlVector<model_t,CUtlMemory<model_t,int>>::GrowVector
              ((CUtlVector<model_t,CUtlMemory<model_t,int>> *)(this + 0x50),iVar4);
    if ((*(int *)(this + 0x5c) - iVar4 < 1) || (iVar4 < 1)) {
      iVar4 = *(int *)(this + 0x68);
    }
    else {
      _V_memmove((void *)((int)*(void **)(this + 0x50) + iVar4 * 0x14c),*(void **)(this + 0x50),
                 (*(int *)(this + 0x5c) - iVar4) * 0x14c);
      iVar4 = *(int *)(this + 0x68);
    }
    if (0 < iVar4) {
      local_20 = 0;
      do {
        puVar2 = (undefined4 *)(local_20 * 0x34 + *(int *)param_2);
        puVar5 = (undefined4 *)(local_20 * 0x14c + *(int *)(this + 0x50));
        *puVar5 = *(undefined4 *)param_1;
        pcVar6 = (char *)(puVar5 + 1);
        pmVar7 = param_1 + 4;
        pcVar8 = pcVar6;
        for (iVar4 = 0x41; iVar4 != 0; iVar4 = iVar4 + -1) {
          *(undefined4 *)pcVar8 = *(undefined4 *)pmVar7;
          pmVar7 = pmVar7 + (uint)bVar9 * -8 + 4;
          pcVar8 = pcVar8 + (uint)bVar9 * -8 + 4;
        }
        puVar5[0x42] = *(undefined4 *)(param_1 + 0x108);
        puVar5[0x43] = *(undefined4 *)(param_1 + 0x10c);
        puVar5[0x44] = *(undefined4 *)(param_1 + 0x110);
        puVar5[0x45] = *(undefined4 *)(param_1 + 0x114);
        puVar5[0x46] = *(undefined4 *)(param_1 + 0x118);
        puVar5[0x47] = *(undefined4 *)(param_1 + 0x11c);
        puVar5[0x48] = *(undefined4 *)(param_1 + 0x120);
        puVar5[0x49] = *(undefined4 *)(param_1 + 0x124);
        puVar5[0x4a] = *(undefined4 *)(param_1 + 0x128);
        puVar5[0x4b] = *(undefined4 *)(param_1 + 300);
        puVar5[0x4c] = *(undefined4 *)(param_1 + 0x130);
        puVar5[0x4d] = *(undefined4 *)(param_1 + 0x134);
        puVar5[0x4e] = *(undefined4 *)(param_1 + 0x138);
        puVar5[0x4f] = *(undefined4 *)(param_1 + 0x13c);
        puVar5[0x50] = *(undefined4 *)(param_1 + 0x140);
        puVar5[0x51] = *(undefined4 *)(param_1 + 0x144);
        puVar5[0x52] = *(undefined4 *)(param_1 + 0x148);
        puVar5[0x4e] = puVar2[0xb];
        puVar5[0x4f] = puVar2[0xc];
        uVar1 = puVar2[10];
        *(short *)((int)puVar5 + 0x14a) = (short)uVar1;
        if (*(int *)(this + 0xb4) <= (int)(uVar1 & 0xffff)) {
          Sys_Error("Inline model %i has bad firstnode",local_20);
        }
        puVar5[0x49] = puVar2[3];
        puVar5[0x4a] = puVar2[4];
        puVar5[0x4b] = puVar2[5];
        puVar5[0x46] = *puVar2;
        puVar5[0x47] = puVar2[1];
        puVar5[0x48] = puVar2[2];
        puVar5[0x4c] = puVar2[9];
        if (local_20 == 0) {
          *(undefined4 *)param_1 = *puVar5;
          pmVar7 = param_1 + 4;
          for (iVar4 = 0x41; iVar4 != 0; iVar4 = iVar4 + -1) {
            *(undefined4 *)pmVar7 = *(undefined4 *)pcVar6;
            pcVar6 = pcVar6 + (uint)bVar9 * -8 + 4;
            pmVar7 = pmVar7 + (uint)bVar9 * -8 + 4;
          }
          *(undefined4 *)(param_1 + 0x108) = puVar5[0x42];
          *(undefined4 *)(param_1 + 0x10c) = puVar5[0x43];
          *(undefined4 *)(param_1 + 0x110) = puVar5[0x44];
          *(undefined4 *)(param_1 + 0x114) = puVar5[0x45];
          *(undefined4 *)(param_1 + 0x118) = puVar5[0x46];
          *(undefined4 *)(param_1 + 0x11c) = puVar5[0x47];
          *(undefined4 *)(param_1 + 0x120) = puVar5[0x48];
          *(undefined4 *)(param_1 + 0x124) = puVar5[0x49];
          *(undefined4 *)(param_1 + 0x128) = puVar5[0x4a];
          *(undefined4 *)(param_1 + 300) = puVar5[0x4b];
          *(undefined4 *)(param_1 + 0x130) = puVar5[0x4c];
          *(undefined4 *)(param_1 + 0x134) = puVar5[0x4d];
          *(undefined4 *)(param_1 + 0x138) = puVar5[0x4e];
          *(undefined4 *)(param_1 + 0x13c) = puVar5[0x4f];
          *(undefined4 *)(param_1 + 0x140) = puVar5[0x50];
          *(undefined4 *)(param_1 + 0x144) = puVar5[0x51];
          *(undefined4 *)(param_1 + 0x148) = puVar5[0x52];
        }
        else {
          V_snprintf(pcVar6,0x104,"*%d",local_20);
          uVar3 = (**(code **)(*g_pFileSystem + 0x94))(g_pFileSystem,pcVar6);
          *puVar5 = uVar3;
        }
        local_20 = local_20 + 1;
      } while (local_20 < *(int *)(this + 0x68));
    }
  }
  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)