L L4D2node

CEnvEntityMaker::SpawnEntity

0x00690ad0 · 2185 bytes · __cdecl

_ZN15CEnvEntityMaker11SpawnEntityE6Vector6QAngle

Decompiled

undefined (2 params)

/* CEnvEntityMaker::SpawnEntity(Vector, QAngle) */

void CEnvEntityMaker::SpawnEntity
               (CEnvEntityMaker *param_1,float param_2,float param_3,float param_4,
               undefined4 param_5,undefined4 param_6,undefined4 param_7)

{
  float fVar1;
  int *piVar2;
  float fVar3;
  float fVar4;
  char cVar5;
  CPointTemplate *this;
  undefined4 *puVar6;
  uint uVar7;
  undefined *puVar8;
  CBaseEntity *pCVar9;
  int iVar10;
  CBaseEntity *pCVar11;
  longdouble lVar12;
  undefined1 local_94 [16];
  float local_84;
  float local_80;
  float local_7c;
  undefined4 local_78;
  undefined4 local_74;
  undefined4 local_70;
  float local_6c;
  float local_68;
  float local_64;
  float local_60;
  float local_5c;
  float local_58;
  float local_54;
  float local_50;
  float local_4c;
  float local_48;
  float local_44;
  float local_40;
  float local_3c;
  float local_38;
  float local_34;
  int *local_30;
  undefined4 local_2c;
  undefined4 local_28;
  int local_24;
  int *local_20;
  
  this = (CPointTemplate *)FindTemplate(param_1);
  if (this != (CPointTemplate *)0x0) {
    if (((byte)param_1[0x14d] & 8) == 0) {
      local_84 = *(float *)(param_1 + 0x2e0);
      local_80 = *(float *)(param_1 + 0x2e4);
      local_7c = *(float *)(param_1 + 0x2e8);
    }
    else {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      local_84 = *(float *)(param_1 + 0x2e0);
      local_80 = *(float *)(param_1 + 0x2e4);
      local_7c = *(float *)(param_1 + 0x2e8);
      if ((*(uint *)(param_1 + 0x14c) & 0x800) != 0) {
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      }
    }
    local_78 = *(undefined4 *)(param_1 + 0x37c);
    local_74 = *(undefined4 *)(param_1 + 0x380);
    local_70 = *(undefined4 *)(param_1 + 900);
    if (((param_2 != vec3_invalid) || (param_3 != DAT_01053d24)) || (param_4 != DAT_01053d28)) {
      local_84 = param_2;
      local_80 = param_3;
      local_78 = param_5;
      local_7c = param_4;
      local_74 = param_6;
      local_70 = param_7;
    }
    local_30 = (int *)0x0;
    local_2c = 0;
    local_28 = 0;
    local_24 = 0;
    local_20 = (int *)0x0;
                    /* try { // try from 00690be8 to 006910a7 has its CatchHandler @ 00691377 */
    cVar5 = (**(code **)(*(int *)this + 0x324))(this,&local_84,&local_78,&local_30,param_1,0);
    if ((cVar5 != '\0') && (local_24 != 0)) {
      piVar2 = (int *)*local_30;
      if (piVar2 == (int *)0x0) {
        *(undefined4 *)(param_1 + 0x458) = 0xffffffff;
      }
      else {
        puVar6 = (undefined4 *)(**(code **)(*piVar2 + 0xc))(piVar2);
        *(undefined4 *)(param_1 + 0x458) = *puVar6;
      }
      puVar8 = g_pEntityList;
      uVar7 = *(uint *)(param_1 + 0x458);
      pCVar9 = (CBaseEntity *)0x0;
      *(uint *)(param_1 + 0x45c) = uVar7;
      if (((uVar7 != 0xffffffff) &&
          (puVar8 = puVar8 + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
        pCVar9 = *(CBaseEntity **)(puVar8 + 4);
      }
      if (((byte)pCVar9[0x14d] & 8) != 0) {
        CBaseEntity::CalcAbsolutePosition(pCVar9);
      }
      *(undefined4 *)(param_1 + 0x460) = *(undefined4 *)(pCVar9 + 0x2e0);
      *(undefined4 *)(param_1 + 0x464) = *(undefined4 *)(pCVar9 + 0x2e4);
      *(undefined4 *)(param_1 + 0x468) = *(undefined4 *)(pCVar9 + 0x2e8);
      if (((vec3_origin == *(float *)(param_1 + 0x440)) &&
          (DAT_01053d4c == *(float *)(param_1 + 0x444))) &&
         (DAT_01053d50 == *(float *)(param_1 + 0x448))) {
        uVar7 = *(uint *)(param_1 + 0x458);
        iVar10 = 0;
        if (((uVar7 != 0xffffffff) &&
            (puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
           (*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
          iVar10 = *(int *)(puVar8 + 4);
        }
                    /* try { // try from 00691189 to 00691353 has its CatchHandler @ 00691377 */
        CCollisionProperty::CollisionAABBToWorldAABB
                  ((CCollisionProperty *)(iVar10 + 0x194),(Vector *)(iVar10 + 0x19c),
                   (Vector *)(iVar10 + 0x1a8),(Vector *)(param_1 + 0x440),
                   (Vector *)(param_1 + 0x44c));
        uVar7 = *(uint *)(param_1 + 0x458);
        pCVar9 = (CBaseEntity *)0x0;
        if (((uVar7 != 0xffffffff) &&
            (puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
           (*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
          pCVar9 = *(CBaseEntity **)(puVar8 + 4);
        }
        if (((byte)pCVar9[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(pCVar9);
          uVar7 = *(uint *)(param_1 + 0x458);
        }
        puVar8 = g_pEntityList;
        *(float *)(param_1 + 0x440) = *(float *)(param_1 + 0x440) - *(float *)(pCVar9 + 0x2e0);
        *(float *)(param_1 + 0x444) = *(float *)(param_1 + 0x444) - *(float *)(pCVar9 + 0x2e4);
        pCVar11 = (CBaseEntity *)0x0;
        *(float *)(param_1 + 0x448) = *(float *)(param_1 + 0x448) - *(float *)(pCVar9 + 0x2e8);
        if (((uVar7 != 0xffffffff) &&
            (puVar8 = puVar8 + (uVar7 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
           (*(uint *)(puVar8 + 8) == uVar7 >> 0xc)) {
          pCVar11 = *(CBaseEntity **)(puVar8 + 4);
        }
        if (((byte)pCVar11[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(pCVar11);
        }
        *(float *)(param_1 + 0x44c) = *(float *)(param_1 + 0x44c) - *(float *)(pCVar11 + 0x2e0);
        *(float *)(param_1 + 0x450) = *(float *)(param_1 + 0x450) - *(float *)(pCVar11 + 0x2e4);
        *(float *)(param_1 + 0x454) = *(float *)(param_1 + 0x454) - *(float *)(pCVar11 + 0x2e8);
      }
      COutputEvent::FireOutput
                ((COutputEvent *)(param_1 + 0x488),(CBaseEntity *)param_1,(CBaseEntity *)param_1,0.0
                );
      if (((byte)param_1[0x148] & 1) != 0) {
        CBaseEntity::ThinkSet((_func_void *)local_94,(float)param_1,(char *)CheckSpawnThink);
        CBaseEntity::SetNextThink
                  ((CBaseEntity *)param_1,*(float *)(gpGlobals + 0xc) + 0.5,(char *)0x0);
      }
      if ((*(float *)(param_1 + 0x47c) != 0.0) && (0 < local_24)) {
        iVar10 = 0;
        do {
          while (pCVar9 = (CBaseEntity *)local_30[iVar10], pCVar9[0x186] == (CBaseEntity)0x0) {
LAB_00690d17:
            iVar10 = iVar10 + 1;
            if (local_24 <= iVar10) goto LAB_00690fd8;
          }
          local_48 = *(float *)(param_1 + 0x46c);
          local_44 = *(float *)(param_1 + 0x470);
          local_40 = *(float *)(param_1 + 0x474);
          if (param_1[0x480] != (CEnvEntityMaker)0x0) {
            uVar7 = *(uint *)(param_1 + 0x180);
            if (((uVar7 == 0xffffffff) ||
                (puVar8 = g_pEntityList + (uVar7 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)
                ) || ((*(uint *)(puVar8 + 8) != uVar7 >> 0xc ||
                      (pCVar11 = *(CBaseEntity **)(puVar8 + 4), pCVar11 == (CBaseEntity *)0x0)))) {
              if (((byte)param_1[0x14d] & 8) != 0) {
                CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
              }
              local_48 = local_48 + *(float *)(param_1 + 0x37c);
              local_44 = local_44 + *(float *)(param_1 + 0x380);
              local_40 = local_40 + *(float *)(param_1 + 900);
            }
            else {
              if (((byte)pCVar11[0x14d] & 8) != 0) {
                CBaseEntity::CalcAbsolutePosition(pCVar11);
              }
              local_48 = local_48 + *(float *)(pCVar11 + 0x37c);
              local_44 = local_44 + *(float *)(pCVar11 + 0x380);
              local_40 = local_40 + *(float *)(pCVar11 + 900);
            }
          }
          AngleVectors((QAngle *)&local_48,(Vector *)&local_6c,(Vector *)&local_60,
                       (Vector *)&local_54);
          fVar3 = *(float *)(param_1 + 0x478);
          local_3c = local_6c;
          local_38 = local_68;
          local_34 = local_64;
          lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
          fVar1 = (float)lVar12;
          fVar4 = *(float *)(param_1 + 0x478);
          local_38 = fVar3 * local_5c * fVar1 + local_38;
          local_34 = fVar3 * local_58 * fVar1 + local_34;
          local_3c = fVar3 * local_60 * fVar1 + local_3c;
          lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
          fVar1 = (float)lVar12;
          fVar3 = *(float *)(param_1 + 0x478);
          local_38 = fVar4 * local_68 * fVar1 + local_38;
          local_34 = fVar4 * local_64 * fVar1 + local_34;
          local_3c = fVar4 * local_6c * fVar1 + local_3c;
          lVar12 = (longdouble)(**(code **)(*random_valve + 4))(random_valve,0xbf800000,0x3f800000);
          fVar1 = (float)lVar12;
          local_38 = fVar3 * local_50 * fVar1 + local_38;
          local_34 = fVar3 * local_4c * fVar1 + local_34;
          local_3c = fVar3 * local_54 * fVar1 + local_3c;
          VectorNormalize((Vector *)&local_3c);
          fVar1 = *(float *)(param_1 + 0x47c);
          local_3c = local_3c * fVar1;
          piVar2 = *(int **)(pCVar9 + 0x238);
          local_38 = local_38 * fVar1;
          local_34 = fVar1 * local_34;
          if (piVar2 != (int *)0x0) {
            (**(code **)(*piVar2 + 0xd8))(piVar2,(Vector *)&local_3c,0);
            goto LAB_00690d17;
          }
          CBaseEntity::SetAbsVelocity(pCVar9,(Vector *)&local_3c);
          iVar10 = iVar10 + 1;
        } while (iVar10 < local_24);
      }
LAB_00690fd8:
      CPointTemplate::CreationComplete(this,(CUtlVector *)&local_30);
    }
    local_24 = 0;
    CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)&local_30);
    local_20 = local_30;
    CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)&local_30);
  }
  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)