L L4D2node

CPointTemplate::CreateInstance

0x007e0390 · 1059 bytes · __thiscall

_ZN14CPointTemplate14CreateInstanceERK6VectorRK6QAngleP10CUtlVectorIP11CBaseEntity10CUtlMemoryIS8_iEES8_b

Decompiled

undefined (6 params)

/* CPointTemplate::CreateInstance(Vector const&, QAngle const&, CUtlVector<CBaseEntity*,
   CUtlMemory<CBaseEntity*, int> >*, CBaseEntity*, bool) */

undefined4 __thiscall
CPointTemplate::CreateInstance
          (CPointTemplate *this,Vector *param_1,QAngle *param_2,CUtlVector *param_3,
          CBaseEntity *param_4,bool param_5)

{
  uint *puVar1;
  int iVar2;
  int *piVar3;
  CUtlVector *pCVar4;
  undefined4 uVar5;
  char cVar6;
  undefined4 uVar7;
  undefined1 *puVar8;
  int iVar9;
  float fVar10;
  int *piVar11;
  char **ppcVar12;
  float fVar13;
  int iVar14;
  int in_GS_OFFSET;
  float fVar15;
  undefined3 in_stack_00000019;
  undefined4 uStack_100;
  char *local_fc [2];
  int aiStack_f4 [4];
  undefined4 local_e4;
  int *local_e0;
  CUtlVector *local_dc;
  QAngle *local_d8;
  Vector *local_d4;
  float local_d0;
  undefined1 *local_cc;
  float local_c8;
  float local_c4;
  undefined1 *local_c0;
  int local_bc;
  undefined4 local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined1 local_ac [12];
  undefined1 local_a0 [64];
  undefined1 local_60 [12];
  undefined4 local_54;
  undefined4 local_44;
  undefined4 local_34;
  int local_20;
  
  local_d4 = param_1;
  local_d8 = param_2;
  local_dc = param_3;
  local_e4 = _param_5;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_d0 = *(float *)(this + 0x4a0);
  if (local_d0 == 0.0) {
    local_fc[0] = "CreateInstance called on a point_template that has no templates: %s\n";
    local_fc[1] = &DAT_00d539c2;
    if (*(undefined1 **)(this + 0x154) != (undefined1 *)0x0) {
      local_fc[1] = *(undefined1 **)(this + 0x154);
    }
    uStack_100 = 0x7e03fe;
    Msg();
    uVar7 = 0;
    ppcVar12 = local_fc;
    goto LAB_007e0400;
  }
  uStack_100 = 0x7e0425;
  Templates_StartUniqueInstance();
  iVar2 = -((int)local_d0 * 0x10 + 0x10);
  ppcVar12 = (char **)((int)local_fc + iVar2);
  piVar11 = (int *)((int)aiStack_f4 + iVar2 + 4);
  local_e0 = piVar11;
  if ((int)local_d0 < 1) {
    *(undefined4 *)((int)aiStack_f4 + iVar2) = 1;
    *(int **)((int)aiStack_f4 + iVar2 + -4) = piVar11;
    *(float *)((int)local_fc + iVar2) = local_d0;
    *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0770;
    SpawnHierarchicalList
              (*(int *)((int)local_fc + iVar2),
               *(HierarchicalSpawn_t **)((int)aiStack_f4 + iVar2 + -4),
               *(bool *)((int)aiStack_f4 + iVar2));
    if ((char)local_e4 != '\0') goto LAB_007e06c1;
LAB_007e077d:
    uVar7 = 1;
    ppcVar12 = (char **)((int)local_fc + iVar2);
  }
  else {
    local_c8 = 0.0;
    do {
      local_bc = 0;
      iVar14 = (int)local_c8 * 0x44;
      local_c4 = *(float *)(*(int *)(this + 0x494) + iVar14);
      if (((byte)this[0x148] & 2) == 0) {
        *(float *)((int)local_fc + iVar2) = local_c4;
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e062d;
        cVar6 = Templates_IndexRequiresEntityIOFixup(*(int *)((int)local_fc + iVar2));
        if ((cVar6 == '\0') && (*(int *)(this + 1000) == -1)) goto LAB_007e0468;
        *(float *)((int)local_fc + iVar2) = local_c4;
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e064c;
        puVar8 = (undefined1 *)Templates_GetEntityIOFixedMapData(*(int *)((int)local_fc + iVar2));
      }
      else {
LAB_007e0468:
        *(float *)((int)aiStack_f4 + iVar2 + -4) = local_c4;
        *(undefined1 ***)((int)local_fc + iVar2) = &local_c0;
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0480;
        Templates_FindByIndex(*(int *)((int)local_fc + iVar2));
        puVar8 = local_c0;
        if (local_c0 == (undefined1 *)0x0) {
          puVar8 = &DAT_00d539c2;
        }
      }
      *(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = puVar8;
      *(undefined4 *)((int)aiStack_f4 + iVar2) = 0;
      *(int **)((int)local_fc + iVar2) = &local_bc;
      local_cc = puVar8;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e04b3;
      MapEntity_ParseEntity
                (*(CBaseEntity ***)((int)local_fc + iVar2),*(char **)((int)aiStack_f4 + iVar2 + -4),
                 *(IMapEntityFilter **)((int)aiStack_f4 + iVar2));
      if (local_bc == 0) {
        *(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_cc;
        *(char **)((int)local_fc + iVar2) =
             "Failed to initialize templated entity with mapdata: %s\n";
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0688;
        Msg();
        uVar7 = 0;
        goto LAB_007e0400;
      }
      *(QAngle **)((int)aiStack_f4 + iVar2) = local_d8;
      *(Vector **)((int)aiStack_f4 + iVar2 + -4) = local_d4;
      *(undefined1 **)((int)local_fc + iVar2) = local_a0;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e04e9;
      VMatrix::SetupMatrixOrgAngles
                (*(VMatrix **)((int)local_fc + iVar2),*(Vector **)((int)aiStack_f4 + iVar2 + -4),
                 *(QAngle **)((int)aiStack_f4 + iVar2));
      *(undefined1 **)((int)aiStack_f4 + iVar2) = local_60;
      iVar9 = *(int *)(this + 0x494);
      local_cc = local_60;
      *(undefined1 **)((int)local_fc + iVar2) = local_a0;
      *(int *)((int)aiStack_f4 + iVar2 + -4) = iVar14 + iVar9 + 4;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0517;
      MatrixMultiply(*(VMatrix **)((int)local_fc + iVar2),
                     *(VMatrix **)((int)aiStack_f4 + iVar2 + -4),
                     *(VMatrix **)((int)aiStack_f4 + iVar2));
      uVar7 = local_54;
      *(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_ac;
      uVar5 = local_34;
      local_b8 = uVar7;
      local_b4 = local_44;
      *(undefined1 **)((int)local_fc + iVar2) = local_cc;
      local_b0 = uVar5;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0550;
      MatrixToAngles(*(VMatrix **)((int)local_fc + iVar2),*(QAngle **)((int)aiStack_f4 + iVar2 + -4)
                    );
      *(undefined4 **)((int)aiStack_f4 + iVar2 + -4) = &local_b8;
      *(int *)((int)local_fc + iVar2) = local_bc;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0568;
      CBaseEntity::SetAbsOrigin
                (*(CBaseEntity **)((int)local_fc + iVar2),*(Vector **)((int)aiStack_f4 + iVar2 + -4)
                );
      iVar14 = local_bc;
      *(undefined1 **)((int)aiStack_f4 + iVar2 + -4) = local_ac;
      *(int *)((int)local_fc + iVar2) = iVar14;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e057a;
      CBaseEntity::SetAbsAngles
                (*(CBaseEntity **)((int)local_fc + iVar2),*(QAngle **)((int)aiStack_f4 + iVar2 + -4)
                );
      *(float *)((int)aiStack_f4 + iVar2 + -4) = local_c4;
      *(undefined1 ***)((int)local_fc + iVar2) = &local_c0;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0592;
      Templates_FindByIndex(*(int *)((int)local_fc + iVar2));
      *(undefined1 **)((int)aiStack_f4 + iVar2) = local_c0;
      *(int *)((int)aiStack_f4 + iVar2 + -4) = local_bc;
      *(CPointTemplate **)((int)local_fc + iVar2) = this + 1000;
      *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e05b7;
      cVar6 = ScriptPreInstanceSpawn();
      if (cVar6 == '\0') {
        *piVar11 = 0;
        *(int *)((int)local_fc + iVar2) = local_bc;
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e066c;
        UTIL_RemoveImmediate(*(CBaseEntity **)((int)local_fc + iVar2));
      }
      else {
        *piVar11 = local_bc;
      }
      piVar3 = local_e0;
      piVar11[1] = 0;
      local_c8 = (float)((int)local_c8 + 1);
      piVar11[2] = 0;
      piVar11 = piVar11 + 4;
    } while (local_c8 != local_d0);
    *(undefined4 *)((int)aiStack_f4 + iVar2) = 1;
    *(int **)((int)aiStack_f4 + iVar2 + -4) = piVar3;
    *(float *)((int)local_fc + iVar2) = local_d0;
    *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e06b4;
    SpawnHierarchicalList
              (*(int *)((int)local_fc + iVar2),
               *(HierarchicalSpawn_t **)((int)aiStack_f4 + iVar2 + -4),
               *(bool *)((int)aiStack_f4 + iVar2));
    if ((char)local_e4 != '\0') {
LAB_007e06c1:
      fVar15 = *(float *)(gpGlobals + 0xc);
      if ((int)local_d0 < 1) goto LAB_007e077d;
      fVar13 = 0.0;
      fVar10 = local_d0;
      piVar11 = local_e0;
      do {
        iVar14 = *piVar11;
        if ((iVar14 != 0) && (fVar15 != *(float *)(iVar14 + 0x98))) {
          if (*(char *)(iVar14 + 0x6c) == '\0') {
            puVar1 = *(uint **)(iVar14 + 0x30);
            if (puVar1 != (uint *)0x0) {
              *puVar1 = *puVar1 | 0x101;
              *(uint **)((int)local_fc + iVar2) = puVar1;
              local_c8 = fVar15;
              local_c4 = fVar10;
              *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e0732;
              iVar9 = CBaseEdict::GetChangeAccessor(*(CBaseEdict **)((int)local_fc + iVar2));
              *(undefined2 *)(iVar9 + 2) = 0;
              fVar10 = local_c4;
              fVar15 = local_c8;
            }
          }
          else {
            *(byte *)(iVar14 + 0x70) = *(byte *)(iVar14 + 0x70) | 1;
          }
          *(float *)(iVar14 + 0x98) = fVar15;
        }
        fVar13 = (float)((int)fVar13 + 1);
        piVar11 = piVar11 + 4;
      } while (fVar13 != fVar10);
    }
    pCVar4 = local_dc;
    iVar14 = 0;
    piVar11 = local_e0;
    do {
      if (*piVar11 != 0) {
        *(int **)((int)aiStack_f4 + iVar2) = piVar11;
        uVar7 = *(undefined4 *)(pCVar4 + 0xc);
        *(CUtlVector **)((int)local_fc + iVar2) = pCVar4;
        *(undefined4 *)((int)aiStack_f4 + iVar2 + -4) = uVar7;
        *(undefined4 *)((int)&uStack_100 + iVar2) = 0x7e07b9;
        CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
                  (*(CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> **)
                    ((int)local_fc + iVar2),*(int *)((int)aiStack_f4 + iVar2 + -4),
                   *(CBaseEntity ***)((int)aiStack_f4 + iVar2));
      }
      iVar14 = iVar14 + 1;
      piVar11 = piVar11 + 4;
    } while (iVar14 < (int)local_d0);
    uVar7 = 1;
    ppcVar12 = (char **)((int)local_fc + iVar2);
  }
LAB_007e0400:
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return uVar7;
  }
                    /* WARNING: Subroutine does not return */
  *(undefined4 *)((int)ppcVar12 + -4) = 0x7e0694;
  __stack_chk_fail();
}

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)