L L4D2node

BreakModelCreateSingle

0x007f1be0 · 2394 bytes · __cdecl

_Z22BreakModelCreateSingleP11CBaseEntityP12breakmodel_tRK6VectorRK6QAngleS5_S5_iRK21breakablepropparams_t

Decompiled

undefined (8 params)

/* BreakModelCreateSingle(CBaseEntity*, breakmodel_t*, Vector const&, QAngle const&, Vector const&,
   Vector const&, int, breakablepropparams_t const&) */

CBreakableProp *
BreakModelCreateSingle
          (CBaseEntity *param_1,breakmodel_t *param_2,Vector *param_3,QAngle *param_4,
          Vector *param_5,Vector *param_6,int param_7,breakablepropparams_t *param_8)

{
  CBreakableProp CVar1;
  CBreakableProp CVar2;
  CBreakableProp CVar3;
  uint *puVar4;
  code *pcVar5;
  int iVar6;
  CBaseEdict *pCVar7;
  CBaseAnimating *pCVar8;
  int iVar9;
  int *piVar10;
  CEntityFlame *this;
  undefined *puVar11;
  int iVar12;
  uint uVar13;
  uint uVar14;
  undefined4 *puVar15;
  float fVar16;
  CBreakableProp *local_1028;
  CBreakableProp *local_1024;
  int local_1020;
  undefined4 local_101c [1027];
  
  if (g_ActiveGibCount < *(int *)(prop_active_gib_limit._28_4_ + 0x30)) {
    if (param_2[0x424] == (breakmodel_t)0x0) {
      local_1028 = (CBreakableProp *)
                   CBaseEntity::CreateNoSpawn("prop_physics",param_3,param_4,param_1);
      if (local_1028 == (CBreakableProp *)0x0) {
        return (CBreakableProp *)0x0;
      }
      if (param_1 == (CBaseEntity *)0x0) {
        local_1024 = (CBreakableProp *)0x0;
        *(undefined4 *)(local_1028 + 0x1444) = *(undefined4 *)(param_8 + 0x10);
      }
      else {
        uVar14 = *(uint *)(local_1028 + 0x148);
        uVar13 = *(uint *)(param_1 + 0x148) | uVar14;
        if (uVar14 != uVar13) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            pCVar7 = *(CBaseEdict **)(local_1028 + 0x30);
            if (pCVar7 != (CBaseEdict *)0x0) {
              *(uint *)pCVar7 = *(uint *)pCVar7 | 0x101;
              iVar9 = CBaseEdict::GetChangeAccessor(pCVar7);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
          }
          *(uint *)(local_1028 + 0x148) = uVar13;
          uVar14 = uVar13;
        }
        if ((*(int *)(local_1028 + 0x14a0) == 0) && (uVar13 = uVar14 & 0xffffcfff, uVar13 != uVar14)
           ) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            pCVar7 = *(CBaseEdict **)(local_1028 + 0x30);
            if (pCVar7 != (CBaseEdict *)0x0) {
              *(uint *)pCVar7 = *(uint *)pCVar7 | 0x101;
              iVar9 = CBaseEdict::GetChangeAccessor(pCVar7);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
          }
          *(uint *)(local_1028 + 0x148) = uVar13;
          uVar14 = uVar13;
        }
        if ((uVar14 & 0xfffffff7) != uVar14) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            pCVar7 = *(CBaseEdict **)(local_1028 + 0x30);
            if (pCVar7 != (CBaseEdict *)0x0) {
              *(uint *)pCVar7 = *(uint *)pCVar7 | 0x101;
              iVar9 = CBaseEdict::GetChangeAccessor(pCVar7);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
          }
          *(uint *)(local_1028 + 0x148) = uVar14 & 0xfffffff7;
        }
        *(undefined4 *)(local_1028 + 0x1444) = *(undefined4 *)(param_8 + 0x10);
        local_1024 = (CBreakableProp *)__dynamic_cast();
        if (local_1024 != (CBreakableProp *)0x0) {
          pcVar5 = *(code **)(*(int *)local_1028 + 0x3bc);
          (**(code **)(*(int *)local_1024 + 0x3cc))();
          (*pcVar5)();
          pcVar5 = *(code **)(*(int *)local_1028 + 0x3c0);
          (**(code **)(*(int *)local_1024 + 0x3d0))();
          (*pcVar5)();
          pcVar5 = *(code **)(*(int *)local_1028 + 0x3c4);
          (**(code **)(*(int *)local_1024 + 0x3d4))();
          (*pcVar5)();
          pcVar5 = *(code **)(*(int *)local_1028 + 0x3c8);
          (**(code **)(*(int *)local_1024 + 0x3d8))();
          (*pcVar5)();
          CBreakableProp::CopyFadeFrom(local_1028,local_1024);
        }
      }
      AllocPooledString((char *)&local_1020);
      *(int *)(local_1028 + 0x260) = local_1020;
      CBaseEntity::DispatchUpdateTransmitState((CBaseEntity *)local_1028);
      iVar9 = (**(code **)(*soundemitterbase + 0x88))();
      if (iVar9 != *(int *)(local_1028 + 0xf4)) {
        if (local_1028[0x6c] == (CBreakableProp)0x0) {
          pCVar7 = *(CBaseEdict **)(local_1028 + 0x30);
          if (pCVar7 != (CBaseEdict *)0x0) {
            *(uint *)pCVar7 = *(uint *)pCVar7 | 0x101;
            iVar12 = CBaseEdict::GetChangeAccessor(pCVar7);
            *(undefined2 *)(iVar12 + 2) = 0;
          }
        }
        else {
          local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
        }
        *(int *)(local_1028 + 0xf4) = iVar9;
      }
      pcVar5 = *(code **)(*(int *)local_1028 + 0x70);
      (**(code **)(*(int *)local_1028 + 0x20))();
      (*pcVar5)();
      CBaseEntity::SetCollisionGroup((CBaseEntity *)local_1028,*(int *)(param_2 + 0x420));
      fVar16 = *(float *)(param_2 + 0x410);
      if ((0.0 < fVar16) && (fVar16 <= *(float *)(param_2 + 0x414))) {
        CBaseEntity::SetFadeDistance((CBaseEntity *)local_1028,fVar16,*(float *)(param_2 + 0x414));
      }
      if ((*(float *)(param_2 + 0x40c) != 0.0) &&
         (uVar14 = *(uint *)(local_1028 + 0x148) | 0x400000, *(uint *)(local_1028 + 0x148) != uVar14
         )) {
        if (local_1028[0x6c] == (CBreakableProp)0x0) {
          pCVar7 = *(CBaseEdict **)(local_1028 + 0x30);
          if (pCVar7 != (CBaseEdict *)0x0) {
            *(uint *)pCVar7 = *(uint *)pCVar7 | 0x101;
            iVar9 = CBaseEdict::GetChangeAccessor(pCVar7);
            *(undefined2 *)(iVar9 + 2) = 0;
          }
        }
        else {
          local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
        }
        *(uint *)(local_1028 + 0x148) = uVar14;
      }
      (**(code **)(*(int *)local_1028 + 100))();
      if (local_1024 != (CBreakableProp *)0x0) {
        (**(code **)(*(int *)local_1024 + 0x458))();
      }
      puVar15 = (undefined4 *)&stack0xffffefb0;
      if (((param_1 != (CBaseEntity *)0x0) &&
          (iVar9 = __dynamic_cast(), puVar15 = (undefined4 *)&stack0xffffefb0, iVar9 != 0)) &&
         (puVar15 = (undefined4 *)&stack0xffffefb0, (*(byte *)(iVar9 + 0x153) & 8) != 0)) {
        uVar14 = *(uint *)(iVar9 + 0x224);
        if (((uVar14 == 0xffffffff) ||
            (puVar11 = g_pEntityList + (uVar14 & 0xfff) * 0x10, puVar11 == (undefined *)0xfffffffc))
           || ((*(uint *)(puVar11 + 8) != uVar14 >> 0xc ||
               ((*(int *)(puVar11 + 4) == 0 ||
                (this = (CEntityFlame *)__dynamic_cast(), this == (CEntityFlame *)0x0)))))) {
          pcVar5 = *(code **)(*(int *)local_1028 + 0x380);
          (**(code **)(*random_valve + 4))();
          (*pcVar5)();
          puVar15 = (undefined4 *)&stack0xffffefb0;
        }
        else {
          pcVar5 = *(code **)(*(int *)local_1028 + 0x380);
          CEntityFlame::GetRemainingLife(this);
          (*pcVar5)();
          puVar15 = (undefined4 *)&stack0xffffefb0;
        }
      }
    }
    else {
      iVar9 = *(int *)(param_2 + 0x420);
      if (param_1 == (CBaseEntity *)0x0) {
        pCVar8 = (CBaseAnimating *)0x0;
      }
      else {
        pCVar8 = (CBaseAnimating *)__dynamic_cast();
      }
      local_1028 = (CBreakableProp *)
                   CreateServerRagdollSubmodel(pCVar8,(char *)(param_2 + 0xc),param_3,param_4,iVar9)
      ;
      puVar15 = (undefined4 *)&stack0xffffefb4;
    }
    if (local_1028 != (CBreakableProp *)0x0) {
      if (param_7 != *(int *)(local_1028 + 0x458)) {
        if (local_1028[0x6c] == (CBreakableProp)0x0) {
          puVar4 = *(uint **)(local_1028 + 0x30);
          if (puVar4 != (uint *)0x0) {
            *puVar4 = *puVar4 | 0x101;
            *puVar15 = puVar4;
            puVar15[-1] = 0x7f1caf;
            iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*puVar15);
            *(undefined2 *)(iVar9 + 2) = 0;
          }
        }
        else {
          local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
        }
        *(int *)(local_1028 + 0x458) = param_7;
      }
      fVar16 = *(float *)(param_2 + 0x418);
      if ((int)fVar16 != *(int *)(local_1028 + 0x100)) {
        iVar9 = *(int *)local_1028;
        *puVar15 = local_1028;
        puVar15[1] = local_1028 + 0x100;
        pcVar5 = *(code **)(iVar9 + 0x214);
        puVar15[-1] = 0x7f1cf6;
        (*pcVar5)();
        *(int *)(local_1028 + 0x100) = (int)fVar16;
      }
      if (param_1 != (CBaseEntity *)0x0) {
        CVar1 = *(CBreakableProp *)(param_1 + 0x124);
        CVar2 = *(CBreakableProp *)(param_1 + 0x125);
        CVar3 = *(CBreakableProp *)(param_1 + 0x126);
        if (CVar1 != local_1028[0x124]) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            puVar4 = *(uint **)(local_1028 + 0x30);
            if (puVar4 != (uint *)0x0) {
              *puVar4 = *puVar4 | 0x101;
              *puVar15 = puVar4;
              puVar15[-1] = 0x7f1d5e;
              iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*puVar15);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
          }
          local_1028[0x124] = CVar1;
        }
        if (CVar2 != local_1028[0x125]) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            puVar4 = *(uint **)(local_1028 + 0x30);
            if (puVar4 != (uint *)0x0) {
              *puVar4 = *puVar4 | 0x101;
              *puVar15 = puVar4;
              puVar15[-1] = 0x7f1db7;
              iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*puVar15);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
          }
          local_1028[0x125] = CVar2;
        }
        if (CVar3 != local_1028[0x126]) {
          if (local_1028[0x6c] == (CBreakableProp)0x0) {
            puVar4 = *(uint **)(local_1028 + 0x30);
            if (puVar4 != (uint *)0x0) {
              *puVar4 = *puVar4 | 0x101;
              *puVar15 = puVar4;
              puVar15[-1] = 0x7f1e00;
              iVar9 = CBaseEdict::GetChangeAccessor((CBaseEdict *)*puVar15);
              *(undefined2 *)(iVar9 + 2) = 0;
            }
            local_1028[0x126] = CVar3;
          }
          else {
            local_1028[0x70] = (CBreakableProp)((byte)local_1028[0x70] | 1);
            local_1028[0x126] = CVar3;
          }
        }
      }
      fVar16 = *(float *)(param_2 + 0x40c);
      if (*(int *)(prop_active_gib_max_fade_time._28_4_ + 0x30) <= g_ActiveGibCount) {
        if (3.0 <= fVar16) {
          fVar16 = 3.0;
        }
        *(float *)(param_2 + 0x40c) = fVar16;
      }
      if (fVar16 != 0.0) {
        puVar15[1] = fVar16;
        puVar15[2] = 0;
        *puVar15 = local_1028;
        puVar15[-1] = 0x7f2393;
        CBaseEntity::SUB_StartFadeOut
                  ((CBaseEntity *)*puVar15,(float)puVar15[1],*(bool *)(puVar15 + 2));
        puVar15[3] = 0;
        puVar15[2] = &CBreakableProp::typeinfo;
        puVar15[1] = &CBaseAnimating::typeinfo;
        *puVar15 = local_1028;
        puVar15[-1] = 0x7f23b3;
        piVar10 = (int *)__dynamic_cast();
        if (((piVar10 != (int *)0x0) && (piVar10[0x528] == 0)) &&
           (*(char *)((int)piVar10 + 0x105) == '\x02')) {
          iVar9 = *piVar10;
          *puVar15 = piVar10;
          puVar15[1] = (int)piVar10 + 0x105;
          pcVar5 = *(code **)(iVar9 + 0x224);
          puVar15[-1] = 0x7f23f1;
          (*pcVar5)();
          *(undefined1 *)((int)piVar10 + 0x105) = 1;
        }
      }
      iVar9 = *(int *)local_1028;
      puVar15[2] = 0x400;
      puVar15[1] = local_101c;
      *puVar15 = local_1028;
      pcVar5 = *(code **)(iVar9 + 0x2b8);
      puVar15[-1] = 0x7f1e6d;
      iVar9 = (*pcVar5)();
      if (iVar9 != 0) {
        if (0 < iVar9) {
          iVar12 = 0;
          do {
            piVar10 = (int *)local_101c[iVar12];
            iVar12 = iVar12 + 1;
            iVar6 = *piVar10;
            puVar15[2] = param_6;
            puVar15[1] = param_5;
            *puVar15 = piVar10;
            pcVar5 = *(code **)(iVar6 + 0xcc);
            puVar15[-1] = 0x7f1e9c;
            (*pcVar5)();
          } while (iVar12 != iVar9);
        }
        return local_1028;
      }
      *puVar15 = local_1028;
      puVar15[-1] = 0x7f236d;
      UTIL_Remove((CBaseEntity *)*puVar15);
    }
  }
  return (CBreakableProp *)0x0;
}

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)