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 intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.