L L4D2node

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 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)