L L4D2node

CChangeLevel::AddDependentEntities

0x00b18f80 · 726 bytes · __cdecl

_ZN12CChangeLevel20AddDependentEntitiesEiPP11CBaseEntityPii

Decompiled

undefined (4 params)

/* CChangeLevel::AddDependentEntities(int, CBaseEntity**, int*, int) */

uint CChangeLevel::AddDependentEntities(int param_1,CBaseEntity **param_2,int *param_3,int param_4)

{
  byte bVar1;
  code *pcVar2;
  int *piVar3;
  CBaseEntity *pCVar4;
  undefined4 *puVar5;
  uint *puVar6;
  uint uVar7;
  uint uVar8;
  uint uVar9;
  undefined4 uVar10;
  byte bVar11;
  int iVar12;
  undefined1 *puVar13;
  uint uVar14;
  CBaseEntity **ppCVar15;
  CBaseEntity **ppCVar16;
  uint uVar17;
  byte *pbVar18;
  int in_GS_OFFSET;
  CBaseEntity *local_25c [5];
  int *local_248;
  int *local_244;
  CBaseEntity **local_240;
  int local_23c;
  uint local_238;
  CBaseEntity *local_234;
  uint local_230;
  byte local_220 [512];
  int local_20;
  
  ppCVar16 = local_25c;
  local_240 = param_2;
  local_248 = param_3;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  pbVar18 = local_220;
  for (iVar12 = 0x80; iVar12 != 0; iVar12 = iVar12 + -1) {
    pbVar18[0] = 0;
    pbVar18[1] = 0;
    pbVar18[2] = 0;
    pbVar18[3] = 0;
    pbVar18 = pbVar18 + 4;
  }
  if (param_1 < 1) {
    GetEntitySaveUtils();
  }
  else {
    iVar12 = 0;
    do {
      local_25c[0] = param_2[iVar12];
      iVar12 = iVar12 + 1;
      puVar6 = (uint *)(**(code **)(*(int *)local_25c[0] + 0xc))();
      local_220[(int)(*puVar6 & 0xfff) >> 3] =
           local_220[(int)(*puVar6 & 0xfff) >> 3] | (byte)(1 << ((byte)*puVar6 & 7));
    } while (iVar12 != param_1);
    local_244 = (int *)GetEntitySaveUtils();
    local_23c = 0;
    ppCVar15 = local_25c;
    do {
      piVar3 = local_244;
      local_234 = local_240[local_23c];
      iVar12 = *local_244;
      ppCVar15[1] = local_234;
      *ppCVar15 = (CBaseEntity *)piVar3;
      pcVar2 = *(code **)(iVar12 + 4);
      ppCVar15[-1] = (CBaseEntity *)0xb19057;
      uVar7 = (*pcVar2)();
      pCVar4 = local_234;
      piVar3 = local_244;
      puVar5 = ppCVar15;
      if (uVar7 != 0) {
        uVar8 = ((uVar7 * 4 + 0xf & 0xfffffff0) + 0x1e) / 0x10;
        ppCVar16 = ppCVar15 + uVar8 * -4;
        iVar12 = *local_244;
        ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar7;
        uVar17 = (int)ppCVar15 + uVar8 * -0x10 + 0x1f & 0xfffffff0;
        ppCVar15[uVar8 * -4 + 1] = pCVar4;
        ppCVar15[uVar8 * -4 + 3] = (CBaseEntity *)uVar17;
        ppCVar15[uVar8 * -4] = (CBaseEntity *)piVar3;
        pcVar2 = *(code **)(iVar12 + 8);
        ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb190a1;
        (*pcVar2)();
        puVar5 = ppCVar15 + uVar8 * -4;
        if (0 < (int)uVar7) {
          uVar14 = 0;
          local_230 = uVar7;
          do {
            piVar3 = *(int **)(uVar17 + uVar14 * 4);
            if (piVar3 != (int *)0x0) {
              iVar12 = *piVar3;
              ppCVar15[uVar8 * -4] = (CBaseEntity *)piVar3;
              pcVar2 = *(code **)(iVar12 + 0xc);
              ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb190dc;
              puVar6 = (uint *)(*pcVar2)();
              bVar11 = (byte)*puVar6 & 7;
              bVar1 = local_220[(int)(*puVar6 & 0xfff) >> 3];
              local_238 = (int)(char)bVar1 >> bVar11 & 1;
              if (local_238 == 0) {
                local_220[(int)(*puVar6 & 0xfff) >> 3] = bVar1 | (byte)(1 << bVar11);
                ppCVar15[uVar8 * -4] = local_234;
                ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19119;
                uVar9 = ComputeEntitySaveFlags(ppCVar15[uVar8 * -4]);
                pCVar4 = local_234;
                uVar7 = local_238;
                if (uVar9 == 0) {
                  ppCVar15[uVar8 * -4] =
                       (CBaseEntity *)
                       "Warning!! Save dependency is linked to an entity that doesn\'t want to be saved!\n"
                  ;
                  ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191c4;
                  Warning();
                }
                else {
                  if (param_4 <= param_1) {
                    ppCVar15[uVar8 * -4] = (CBaseEntity *)"Too many entities across a transition!\n"
                    ;
                    local_230 = uVar7;
                    ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19252;
                    Warning();
                    param_1 = local_230;
                    goto LAB_00b19224;
                  }
                  if (*(int *)(g_debug_transitions._28_4_ + 0x30) != 0) {
                    local_238 = uVar9;
                    ppCVar15[uVar8 * -4] = local_234;
                    ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191e4;
                    uVar10 = CBaseEntity::GetDebugName(ppCVar15[uVar8 * -4]);
                    puVar13 = *(undefined1 **)(pCVar4 + 0x7c);
                    ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar10;
                    ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED DEPENDANCY: %s (%s)\n";
                    if (puVar13 == (undefined1 *)0x0) {
                      puVar13 = &DAT_00d539c2;
                    }
                    ppCVar15[uVar8 * -4 + 1] = (CBaseEntity *)puVar13;
                    ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19205;
                    Msg();
                    uVar9 = local_238;
                  }
                  pCVar4 = local_234;
                  iVar12 = param_1 + 1;
                  local_240[param_1] = local_234;
                  local_248[param_1] = uVar9;
                  param_1 = iVar12;
                  if (g_iDebuggingTransition != 0) {
                    if (g_iDebuggingTransition == 2) {
                      ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED.\n";
                      ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb1921c;
                      Msg();
                    }
                    else {
                      ppCVar15[uVar8 * -4] = local_234;
                      ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb19182;
                      uVar10 = CBaseEntity::GetDebugName(ppCVar15[uVar8 * -4]);
                      puVar13 = *(undefined1 **)(pCVar4 + 0x7c);
                      ppCVar15[uVar8 * -4 + 2] = (CBaseEntity *)uVar10;
                      ppCVar15[uVar8 * -4] = (CBaseEntity *)"ADDED %s (%s) to transition.\n";
                      if (puVar13 == (undefined1 *)0x0) {
                        puVar13 = &DAT_00d539c2;
                      }
                      ppCVar15[uVar8 * -4 + 1] = (CBaseEntity *)puVar13;
                      ppCVar15[uVar8 * -4 + -1] = (CBaseEntity *)0xb191a3;
                      Msg();
                    }
                    *(uint *)(local_234 + 0x110) = *(uint *)(local_234 + 0x110) | 6;
                  }
                }
              }
            }
            uVar14 = uVar14 + 1;
            puVar5 = ppCVar15 + uVar8 * -4;
          } while (uVar14 != local_230);
        }
      }
      ppCVar16 = (CBaseEntity **)puVar5;
      local_23c = local_23c + 1;
      ppCVar15 = ppCVar16;
    } while (local_23c < param_1);
  }
LAB_00b19224:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(undefined **)((int)ppCVar16 + -4) = &UNK_00b19269;
    __stack_chk_fail();
  }
  return param_1;
}

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)