L L4D2node

CalculatePhysicsImpactDamage

0x0078a4a0 · 2367 bytes · __cdecl

_Z28CalculatePhysicsImpactDamageiP21gamevcollisionevent_tRK19impactdamagetable_tfbRib

Decompiled

undefined (7 params)

/* CalculatePhysicsImpactDamage(int, gamevcollisionevent_t*, impactdamagetable_t const&, float,
   bool, int&, bool) */

longdouble
CalculatePhysicsImpactDamage
          (int param_1,gamevcollisionevent_t *param_2,impactdamagetable_t *param_3,float param_4,
          bool param_5,int *param_6,bool param_7)

{
  gamevcollisionevent_t *pgVar1;
  gamevcollisionevent_t *pgVar2;
  gamevcollisionevent_t *pgVar3;
  gamevcollisionevent_t *pgVar4;
  float fVar5;
  float fVar6;
  code *pcVar7;
  int iVar8;
  char cVar9;
  uint uVar10;
  int iVar11;
  int *piVar12;
  uint uVar13;
  int *piVar14;
  int iVar15;
  longdouble lVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  float local_1038;
  float local_1030;
  float local_102c;
  float local_1028;
  float local_101c [1027];
  
  *param_6 = 1;
  uVar13 = (uint)(param_1 == 0);
  pgVar1 = param_2 + uVar13 * 4;
  if (((*(int **)pgVar1 != (int *)0x0) && (*(int *)(param_2 + 0x68) != *(int *)(param_2 + 0x6c))) &&
     ((uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x800) == 0 ||
      ((cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x140))(), cVar9 == '\0' &&
       (cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x16c))(), cVar9 == '\0'))))
     )) {
    uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
    if (((uVar10 & 8) != 0) &&
       (cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x16c))(), cVar9 != '\0')) {
      (**(code **)(**(int **)pgVar1 + 0xe0))();
    }
    uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
    if (((uVar10 & 0x200) != 0) &&
       ((*(byte *)(*(int *)(param_2 + param_1 * 4 + 0x68) + 0x14f) & 8) == 0)) {
      *param_6 = *param_6 | 0x4000000;
      return (longdouble)1000.0;
    }
    if (((0.0 < param_4) &&
        (uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x402) == 0)) &&
       ((param_7 || (uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 4) == 0)))) {
      uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
      if ((uVar10 & 0x10) != 0) {
        iVar15 = 0;
        iVar11 = (**(code **)(**(int **)(pgVar1 + 0x68) + 0x2b8))();
        if (0 < iVar11) {
          do {
            uVar10 = (**(code **)(*(int *)local_101c[iVar15] + 0x50))();
            if ((uVar10 & 0x402) != 0) goto LAB_0078a5f0;
            iVar15 = iVar15 + 1;
          } while (iVar15 != iVar11);
        }
      }
      pgVar2 = param_2 + param_1 * 4;
      uVar10 = (**(code **)(**(int **)pgVar2 + 0x50))();
      if ((uVar10 & 4) != 0) {
        cVar9 = (**(code **)(**(int **)(pgVar1 + 0x68) + 0x16c))();
        if (cVar9 != '\0') goto LAB_0078a5f0;
        param_5 = false;
      }
      pgVar3 = param_2 + uVar13 * 0xc + 0x20;
      fVar17 = *(float *)pgVar3;
      fVar19 = *(float *)(pgVar3 + 4);
      fVar18 = *(float *)(pgVar3 + 8);
      uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
      local_1030 = 0.0;
      if ((uVar10 & 1) != 0) {
        pgVar4 = param_2 + uVar13 * 0xc + 0x50;
        local_1030 = *(float *)(pgVar4 + 4) * *(float *)(pgVar4 + 4) +
                     *(float *)(pgVar4 + 8) * *(float *)(pgVar4 + 8) +
                     *(float *)pgVar4 * *(float *)pgVar4;
      }
      lVar16 = (longdouble)(**(code **)(**(int **)pgVar1 + 0x78))();
      local_102c = (float)lVar16;
      uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
      if (((uVar10 & 4) != 0) && (piVar12 = (int *)UTIL_GetLocalPlayer(), piVar12 != (int *)0x0)) {
        lVar16 = (longdouble)(**(code **)(*piVar12 + 0x6f4))();
        local_102c = (float)lVar16;
      }
      if ((*(int *)(pgVar1 + 0x68) != 0) &&
         (uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x10) != 0)) {
        lVar16 = (longdouble)PhysGetEntityMass(*(CBaseEntity **)(pgVar1 + 0x68));
        local_102c = (float)lVar16;
      }
      uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
      if ((uVar10 & 0x20) != 0) {
        if (param_4 <= 2.0) {
          param_4 = 2.0;
        }
        local_102c = *(float *)(param_3 + 0x28);
      }
      if ((param_5 != false) ||
         (((*(float *)(param_3 + 0x18) <= local_102c &&
           ((fVar17 = fVar19 * fVar19 + fVar17 * fVar17 + fVar18 * fVar18,
            *(float *)(param_3 + 0x1c) <= local_102c || (*(float *)(param_3 + 0x24) <= fVar17)))) &&
          ((*(float *)(param_3 + 0x10) <= fVar17 || (*(float *)(param_3 + 0x14) <= local_1030))))))
      {
        cVar9 = CBaseEntity::IsFloating(*(CBaseEntity **)(pgVar2 + 0x68));
        if (((cVar9 != '\0') && (*(int *)(pgVar1 + 0x68) != g_WorldEntity)) && (param_4 <= 3.0)) {
          param_4 = 3.0;
        }
        if (*(float *)(param_3 + 0x14) <= local_1030 && local_1030 != *(float *)(param_3 + 0x14)) {
          (**(code **)(**(int **)pgVar1 + 0x80))();
          pgVar4 = param_2 + uVar13 * 0xc + 0x50;
          lVar16 = (longdouble)
                   ReadDamageTable(*(impactentry_t **)(param_3 + 4),*(int *)(param_3 + 0xc),
                                   (ABS(*(float *)(pgVar4 + 4) * local_101c[1]) +
                                    ABS(*(float *)pgVar4 * local_101c[0]) +
                                   ABS(*(float *)(pgVar4 + 8) * local_101c[2])) * param_4,false);
          local_1038 = (float)lVar16;
          piVar12 = (int *)&stack0xffffefa0;
          if (0.0 < local_1038) {
            *param_6 = *param_6 | 4;
            piVar12 = (int *)&stack0xffffefa0;
          }
        }
        else {
          local_1038 = 0.0;
          piVar12 = (int *)&stack0xffffefa4;
        }
        iVar11 = param_1 * 0xc;
        pgVar4 = param_2 + iVar11 + 0x20;
        fVar17 = *(float *)pgVar4;
        fVar19 = *(float *)(pgVar4 + 4);
        fVar18 = *(float *)(pgVar4 + 8);
        fVar20 = *(float *)(param_2 + iVar11 + 0x3c);
        fVar5 = *(float *)(param_2 + iVar11 + 0x40);
        fVar6 = *(float *)(param_2 + iVar11 + 0x38);
        iVar11 = **(int **)pgVar2;
        *piVar12 = (int)*(int **)pgVar2;
        fVar17 = SQRT(fVar17 * fVar17 + fVar19 * fVar19 + fVar18 * fVar18) -
                 SQRT(fVar6 * fVar6 + fVar20 * fVar20 + fVar5 * fVar5);
        pcVar7 = *(code **)(iVar11 + 0x78);
        piVar12[-1] = 0x78a914;
        lVar16 = (longdouble)(*pcVar7)();
        if ((fVar17 <= 0.0) || (fVar19 = 0.0, *(float *)(param_3 + 0x34) <= fVar17)) {
          fVar19 = fVar17 * fVar17 * (float)lVar16;
        }
        iVar11 = uVar13 * 0xc;
        fVar18 = SQRT(*(float *)(pgVar3 + 8) * *(float *)(pgVar3 + 8) +
                      *(float *)(pgVar3 + 4) * *(float *)(pgVar3 + 4) +
                      *(float *)pgVar3 * *(float *)pgVar3) -
                 SQRT(*(float *)(param_2 + iVar11 + 0x3c) * *(float *)(param_2 + iVar11 + 0x3c) +
                      *(float *)(param_2 + iVar11 + 0x38) * *(float *)(param_2 + iVar11 + 0x38) +
                      *(float *)(param_2 + iVar11 + 0x40) * *(float *)(param_2 + iVar11 + 0x40));
        fVar17 = fVar18 * fVar18 * local_102c;
        if (*(float *)(param_3 + 0x28) <= local_102c) {
          fVar17 = fVar17 * *(float *)(param_3 + 0x2c);
          fVar20 = *(float *)(param_2 + iVar11 + 0x28) - *(float *)(param_2 + iVar11 + 0x40);
          if (((0.0 < fVar18) && (fVar20 < 0.0)) && (*(float *)(param_2 + iVar11 + 0x28) < 0.0)) {
            fVar18 = ABS(fVar20 / fVar18);
            fVar17 = fVar17 * ((*(float *)(param_3 + 0x30) * fVar18 - fVar18) + 1.0);
          }
        }
        iVar11 = **(int **)pgVar2;
        *piVar12 = (int)*(int **)pgVar2;
        pcVar7 = *(code **)(iVar11 + 0x7c);
        piVar12[-1] = 0x78aa46;
        lVar16 = (longdouble)(*pcVar7)();
        local_1028 = (float)lVar16;
        iVar11 = **(int **)pgVar2;
        *piVar12 = (int)*(int **)pgVar2;
        pcVar7 = *(code **)(iVar11 + 0x2c);
        piVar12[-1] = 0x78aa56;
        cVar9 = (*pcVar7)();
        iVar11 = **(int **)pgVar2;
        *piVar12 = (int)*(int **)pgVar2;
        if (cVar9 == '\0') {
          pcVar7 = *(code **)(iVar11 + 0x78);
          piVar12[-1] = 0x78aa68;
          lVar16 = (longdouble)(*pcVar7)();
          local_1028 = 1.0 / (float)lVar16;
        }
        else {
          pcVar7 = *(code **)(iVar11 + 0x50);
          piVar12[-1] = 0x78ac33;
          uVar13 = (*pcVar7)();
          if ((uVar13 & 4) != 0) {
            iVar11 = 0;
            if (*(int *)(gpGlobals + 0x14) < 2) {
              piVar12[-1] = 0x78adbf;
              piVar14 = (int *)UTIL_GetLocalPlayer();
              if (piVar14 != (int *)0x0) {
                iVar11 = *(int *)pgVar2;
                iVar15 = *piVar14;
                *piVar12 = (int)piVar14;
                piVar12[1] = iVar11;
                pcVar7 = *(code **)(iVar15 + 0x6f4);
                piVar12[-1] = 0x78add8;
                lVar16 = (longdouble)(*pcVar7)();
                if (0.0 < (float)lVar16) {
                  local_1028 = 1.0 / (float)lVar16;
                }
              }
            }
            else {
              do {
                iVar11 = iVar11 + 1;
                *piVar12 = iVar11;
                piVar12[-1] = 0x78ac69;
                piVar14 = (int *)UTIL_PlayerByIndex(*piVar12);
                if (piVar14 != (int *)0x0) {
                  iVar15 = *(int *)pgVar2;
                  iVar8 = *piVar14;
                  *piVar12 = (int)piVar14;
                  piVar12[1] = iVar15;
                  pcVar7 = *(code **)(iVar8 + 0x6f4);
                  piVar12[-1] = 0x78ac7e;
                  lVar16 = (longdouble)(*pcVar7)();
                  if (0.0 < (float)lVar16) {
                    local_1028 = 1.0 / (float)lVar16;
                    break;
                  }
                }
              } while (iVar11 < *(int *)(gpGlobals + 0x14));
            }
          }
        }
        piVar12[3] = 0;
        piVar12[2] = (int)((fVar17 + fVar19) * param_4 * local_1028);
        piVar12[1] = *(int *)(param_3 + 8);
        *piVar12 = *(undefined4 *)param_3;
        piVar12[-1] = 0x78aac4;
        lVar16 = (longdouble)
                 ReadDamageTable((impactentry_t *)*piVar12,piVar12[1],(float)piVar12[2],
                                 SUB41(piVar12[3],0));
        iVar11 = **(int **)pgVar1;
        *piVar12 = (int)*(int **)pgVar1;
        local_1038 = (float)lVar16 + local_1038;
        pcVar7 = *(code **)(iVar11 + 8);
        piVar12[-1] = 0x78aaec;
        cVar9 = (*pcVar7)();
        if (cVar9 != '\0') {
          return (longdouble)local_1038;
        }
        if (*(float *)(param_3 + 0x1c) <= local_102c) {
          return (longdouble)local_1038;
        }
        fVar17 = *(float *)(param_3 + 0x20);
        if (0.0 < fVar17) {
          if (fVar17 < local_1038) {
            return (longdouble)fVar17;
          }
          if (local_1038 <= 0.0) {
            local_1038 = 0.0;
          }
        }
        return (longdouble)local_1038;
      }
    }
  }
LAB_0078a5f0:
  return (longdouble)0;
}

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)