CBreakableSurface::Die
0x006b75e0 · 3011 bytes · __thiscall
_ZN17CBreakableSurface3DieEP11CBaseEntityRK6Vector.part.45
Decompiled
undefined (3 params)
/* CBreakableSurface::Die(CBaseEntity*, Vector const&) [clone .part.45] */
void __thiscall CBreakableSurface::Die(CBreakableSurface *this,CBaseEntity *param_1,Vector *param_2)
{
float fVar1;
float fVar2;
float fVar3;
CBaseEdict *pCVar4;
CBreakableSurface CVar5;
CBreakableSurface *in_EAX;
int iVar6;
int iVar7;
float *in_ECX;
CBaseEntity *in_EDX;
CBreakableSurface *pCVar8;
CBreakableSurface *pCVar9;
int iVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float local_78;
float local_5c;
float local_58;
float local_54;
float local_50;
QAngle local_40 [12];
float local_34;
float local_30;
float local_2c;
float local_28;
float local_24;
float local_20;
if (((byte)in_EAX[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)in_EAX);
}
PhysBreakSound();
if (in_EAX[0x524] != (CBreakableSurface)0x1) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
}
in_EAX[0x524] = (CBreakableSurface)0x1;
}
if (*(int *)(in_EAX + 0x100) == 0) {
if (in_EDX == (CBaseEntity *)0x0) goto LAB_006b7f8f;
LAB_006b7686:
COutputEvent::FireOutput((COutputEvent *)(in_EAX + 0x48c),in_EDX,(CBaseEntity *)in_EAX,0.0);
}
else {
(**(code **)(*(int *)in_EAX + 0x214))();
*(undefined4 *)(in_EAX + 0x100) = 0;
if (in_EDX != (CBaseEntity *)0x0) goto LAB_006b7686;
LAB_006b7f8f:
COutputEvent::FireOutput
((COutputEvent *)(in_EAX + 0x48c),(CBaseEntity *)in_EAX,(CBaseEntity *)in_EAX,0.0);
}
fVar12 = in_ECX[1];
fVar14 = in_ECX[2];
fVar16 = *in_ECX;
if (0.001 < fVar14 * fVar14 + fVar12 * fVar12 + fVar16 * fVar16) {
fVar1 = *(float *)(in_EAX + 0x50c);
fVar2 = *(float *)(in_EAX + 0x510);
fVar3 = *(float *)(in_EAX + 0x514);
if (0.0 <= fVar12 * fVar2 + fVar16 * fVar1 + fVar14 * fVar3) goto LAB_006b76df;
local_58 = *(float *)(in_EAX + 0x944) + fVar2;
local_50 = *(float *)(in_EAX + 0x934) + fVar1;
fVar12 = *(float *)(in_EAX + 0x94c) + fVar1;
*(float *)(in_EAX + 0x944) = local_58;
fVar14 = *(float *)(in_EAX + 0x938) + fVar2;
*(float *)(in_EAX + 0x934) = local_50;
local_5c = *(float *)(in_EAX + 0x948) + fVar3;
*(float *)(in_EAX + 0x94c) = fVar12;
*(float *)(in_EAX + 0x938) = fVar14;
*(float *)(in_EAX + 0x948) = local_5c;
fVar16 = *(float *)(in_EAX + 0x950) + fVar2;
fVar15 = *(float *)(in_EAX + 0x93c) + fVar3;
*(float *)(in_EAX + 0x950) = fVar16;
*(float *)(in_EAX + 0x93c) = fVar15;
*(float *)(in_EAX + 0x958) = *(float *)(in_EAX + 0x958) + fVar1;
fVar13 = *(float *)(in_EAX + 0x954) + fVar3;
*(float *)(in_EAX + 0x954) = fVar13;
*(float *)(in_EAX + 0x95c) = *(float *)(in_EAX + 0x95c) + fVar2;
fVar11 = *(float *)(in_EAX + 0x940) + fVar1;
*(float *)(in_EAX + 0x940) = fVar11;
*(float *)(in_EAX + 0x960) = *(float *)(in_EAX + 0x960) + fVar3;
if (((fVar1 == -fVar1) && (fVar2 == -fVar2)) && (fVar3 == -fVar3)) {
CVar5 = in_EAX[0x6c];
}
else {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 == (CBaseEdict *)0x0) {
CVar5 = (CBreakableSurface)0x0;
}
else {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
local_58 = *(float *)(in_EAX + 0x944);
CVar5 = in_EAX[0x6c];
local_5c = *(float *)(in_EAX + 0x948);
local_50 = *(float *)(in_EAX + 0x934);
fVar12 = *(float *)(in_EAX + 0x94c);
fVar14 = *(float *)(in_EAX + 0x938);
fVar16 = *(float *)(in_EAX + 0x950);
fVar15 = *(float *)(in_EAX + 0x93c);
fVar13 = *(float *)(in_EAX + 0x954);
fVar11 = *(float *)(in_EAX + 0x940);
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
CVar5 = (CBreakableSurface)0x1;
}
*(float *)(in_EAX + 0x50c) = -fVar1;
*(float *)(in_EAX + 0x510) = -fVar2;
*(float *)(in_EAX + 0x514) = -fVar3;
}
local_78 = 1.0;
}
else {
LAB_006b76df:
local_58 = *(float *)(in_EAX + 0x944);
CVar5 = in_EAX[0x6c];
local_5c = *(float *)(in_EAX + 0x948);
local_50 = *(float *)(in_EAX + 0x934);
fVar12 = *(float *)(in_EAX + 0x94c);
local_78 = -1.0;
fVar14 = *(float *)(in_EAX + 0x938);
fVar16 = *(float *)(in_EAX + 0x950);
fVar15 = *(float *)(in_EAX + 0x93c);
fVar13 = *(float *)(in_EAX + 0x954);
fVar11 = *(float *)(in_EAX + 0x940);
}
fVar11 = local_50 - fVar11;
local_50 = local_50 - fVar12;
fVar16 = fVar14 - fVar16;
fVar13 = fVar15 - fVar13;
fVar14 = fVar14 - local_58;
fVar15 = fVar15 - local_5c;
if (CVar5 == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 == (CBaseEdict *)0x0) {
*(float *)(in_EAX + 0x50c) = fVar15 * fVar16 - fVar14 * fVar13;
*(float *)(in_EAX + 0x510) = fVar11 * fVar13 - fVar15 * local_50;
*(float *)(in_EAX + 0x514) = fVar14 * local_50 - fVar11 * fVar16;
goto LAB_006b7866;
}
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
*(float *)(in_EAX + 0x50c) = fVar15 * fVar16 - fVar14 * fVar13;
*(float *)(in_EAX + 0x510) = fVar11 * fVar13 - fVar15 * local_50;
*(float *)(in_EAX + 0x514) = fVar14 * local_50 - fVar11 * fVar16;
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
goto LAB_006b7866;
}
}
else {
*(float *)(in_EAX + 0x50c) = fVar15 * fVar16 - fVar14 * fVar13;
*(float *)(in_EAX + 0x510) = fVar11 * fVar13 - fVar15 * local_50;
*(float *)(in_EAX + 0x514) = fVar14 * local_50 - fVar11 * fVar16;
}
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
LAB_006b7866:
VectorNormalize((Vector *)(in_EAX + 0x50c));
local_28 = -*(float *)(in_EAX + 0x50c);
local_24 = -*(float *)(in_EAX + 0x510);
local_20 = -*(float *)(in_EAX + 0x514);
VectorAngles((Vector *)&local_28,local_40);
AngleVectors(local_40,(Vector *)0x0,(Vector *)&local_34,(Vector *)&local_28);
fVar12 = fVar16 * local_30 + local_50 * local_34 + fVar13 * local_2c;
local_5c = fVar15;
local_58 = fVar14;
local_54 = fVar11;
if (ABS(fVar12) < 0.5) {
local_58 = fVar16 * local_78;
local_5c = fVar13 * local_78;
local_54 = local_50 * local_78;
local_50 = fVar11 * local_78;
fVar13 = fVar15 * local_78;
fVar16 = fVar14 * local_78;
fVar12 = local_30 * fVar16 + local_34 * local_50 + local_2c * fVar13;
}
pCVar9 = in_EAX + 0x934;
pCVar8 = in_EAX + 0x940;
if (0.0 <= fVar12) {
pCVar9 = in_EAX + 0x94c;
pCVar8 = in_EAX + 0x958;
}
if (0.0 <= local_58 * local_24 + local_54 * local_28 + local_5c * local_20) {
pCVar9 = pCVar8;
}
fVar12 = *(float *)pCVar9;
if (((fVar12 != *(float *)(in_EAX + 0x518)) ||
(*(float *)(pCVar9 + 4) != *(float *)(in_EAX + 0x51c))) ||
(*(float *)(pCVar9 + 8) != *(float *)(in_EAX + 0x520))) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
fVar12 = *(float *)pCVar9;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
fVar12 = *(float *)pCVar9;
}
*(float *)(in_EAX + 0x518) = fVar12;
*(float *)(in_EAX + 0x51c) = *(float *)(pCVar9 + 4);
*(float *)(in_EAX + 0x520) = *(float *)(pCVar9 + 8);
}
fVar12 = SQRT(fVar16 * fVar16 + fVar13 * fVar13 + local_50 * local_50);
fVar14 = SQRT(local_58 * local_58 + local_5c * local_5c + local_54 * local_54);
iVar6 = (int)(fVar12 * 0.083333336);
if (iVar6 != *(int *)(in_EAX + 0x4fc)) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar7 + 2) = 0;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
}
*(int *)(in_EAX + 0x4fc) = iVar6;
}
iVar6 = (int)(fVar14 * 0.083333336);
if (iVar6 != *(int *)(in_EAX + 0x500)) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar7 + 2) = 0;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
}
*(int *)(in_EAX + 0x500) = iVar6;
}
if (0x10 < *(int *)(in_EAX + 0x4fc)) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
}
*(undefined4 *)(in_EAX + 0x4fc) = 0x10;
}
if (0x10 < *(int *)(in_EAX + 0x500)) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
}
*(undefined4 *)(in_EAX + 0x500) = 0x10;
}
fVar12 = fVar12 / (float)*(int *)(in_EAX + 0x4fc);
if (fVar12 != *(float *)(in_EAX + 0x504)) {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
*(float *)(in_EAX + 0x504) = fVar12;
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
*(float *)(in_EAX + 0x504) = fVar12;
}
}
fVar14 = fVar14 / (float)*(int *)(in_EAX + 0x500);
if (fVar14 == *(float *)(in_EAX + 0x508)) {
iVar6 = 0;
}
else {
if (in_EAX[0x6c] == (CBreakableSurface)0x0) {
pCVar4 = *(CBaseEdict **)(in_EAX + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar6 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar6 + 2) = 0;
}
*(float *)(in_EAX + 0x508) = fVar14;
}
else {
in_EAX[0x70] = (CBreakableSurface)((byte)in_EAX[0x70] | 1);
*(float *)(in_EAX + 0x508) = fVar14;
}
iVar6 = 0;
}
do {
iVar7 = 0;
do {
iVar10 = iVar7 + 1;
SetSupport(in_EAX,iVar6,iVar7,1.0);
iVar7 = iVar10;
} while (iVar10 != 0x10);
iVar6 = iVar6 + 1;
} while (iVar6 != 0x10);
CBreakable::ResetOnGroundFlags((CBreakable *)in_EAX);
(**(code **)(*(int *)in_EAX + 0x298))();
CCollisionProperty::SetSolidFlags
((CCollisionProperty *)(in_EAX + 0x194),(uint)(*(ushort *)(in_EAX + 0x1b4) | 8));
CCollisionProperty::SetSolidFlags
((CCollisionProperty *)(in_EAX + 0x194),(uint)(*(ushort *)(in_EAX + 0x1b4) | 4));
*(code **)(in_EAX + 0xd8) = SurfaceTouch;
*(undefined4 *)(in_EAX + 0xdc) = 0;
return;
}
SourceMod gamedata
paste intoaddons/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.
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.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.