L L4D2node

CalculateObjectStress

0x0078aee0 · 2761 bytes · __cdecl

_Z21CalculateObjectStressP14IPhysicsObjectP11CBaseEntityP23vphysics_objectstress_t

Decompiled

undefined (3 params)

/* CalculateObjectStress(IPhysicsObject*, CBaseEntity*, vphysics_objectstress_t*) */

longdouble
CalculateObjectStress(IPhysicsObject *param_1,CBaseEntity *param_2,vphysics_objectstress_t *param_3)

{
  float fVar1;
  char cVar2;
  int *piVar3;
  int *piVar4;
  int *piVar5;
  CBaseEntity *pCVar6;
  int iVar7;
  CBaseEntity *pCVar8;
  uint uVar9;
  undefined *puVar10;
  float *pfVar11;
  int iVar12;
  longdouble lVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  vphysics_objectstress_t local_a1;
  float local_98;
  float local_94;
  float local_90;
  float local_8c [6];
  float local_74 [3];
  float local_68 [3];
  CBaseEntity *local_5c;
  float local_58;
  float local_54;
  CBaseEntity *local_50;
  float local_4c;
  float local_48;
  int local_44 [5];
  int local_30 [8];
  
  local_44[0] = 0;
  local_44[1] = 0;
  local_44[2] = 0;
  local_44[3] = 0;
  local_44[4] = 0;
  local_30[0] = 0;
  local_30[1] = 0;
  local_30[2] = 0;
  local_30[3] = 0;
  local_30[4] = 0;
  local_50 = (CBaseEntity *)0x0;
                    /* try { // try from 0078af57 to 0078b36d has its CatchHandler @ 0078b9e3 */
  CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
            ((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,0,&local_50);
  CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
            ((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
             (Vector *)&vec3_origin);
  local_50 = (CBaseEntity *)0x0;
  CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
            ((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,local_44[3],&local_50
            );
  CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
            ((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
             (Vector *)&vec3_origin);
  piVar3 = (int *)(**(code **)(*(int *)param_2 + 0x144))(param_2);
  piVar4 = (int *)(**(code **)(*(int *)param_1 + 0x144))(param_1);
  lVar13 = (longdouble)(**(code **)(*(int *)param_1 + 0x78))(param_1);
  fVar1 = (float)lVar13;
  local_a1 = (vphysics_objectstress_t)0x0;
  if (piVar4 != (int *)0x0) {
    while (cVar2 = (**(code **)(*piVar4 + 8))(piVar4), cVar2 != '\0') {
      lVar13 = (longdouble)(**(code **)(*piVar4 + 0x1c))(piVar4);
      local_94 = (float)lVar13;
      if (0.0 < local_94) {
        piVar5 = (int *)(**(code **)(*piVar4 + 0xc))(piVar4,1);
        pCVar6 = (CBaseEntity *)(**(code **)(*piVar5 + 0x48))(piVar5);
        if (pCVar6 == (CBaseEntity *)0x0) {
          pCVar6 = (CBaseEntity *)GetWorldEntity();
        }
        uVar9 = *(uint *)(pCVar6 + 0x220);
        local_5c = pCVar6;
        if ((((uVar9 != 0xffffffff) &&
             (puVar10 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc))
            && (*(uint *)(puVar10 + 8) == uVar9 >> 0xc)) &&
           (*(CBaseEntity **)(puVar10 + 4) != (CBaseEntity *)0x0)) {
          local_5c = *(CBaseEntity **)(puVar10 + 4);
        }
        cVar2 = (**(code **)(*piVar5 + 0x2c))(piVar5);
        if (cVar2 == '\0') {
          local_90 = 0.0;
        }
        else {
          if (((piVar3 != (int *)0x0) &&
              ((iVar12 = (**(code **)(*piVar3 + 0x4f4))(piVar3,local_5c), iVar12 == 3 ||
               (*(float *)(gpGlobals + 0xc) <= *(float *)(pCVar6 + 0x254))))) ||
             (uVar9 = (**(code **)(*piVar5 + 0x50))(piVar5), (uVar9 & 4) != 0)) {
            local_90 = 1.4013e-45;
          }
          else {
            lVar13 = (longdouble)(**(code **)(*piVar5 + 0x78))(piVar5);
            if ((500.0 <= (float)lVar13) &&
               (pCVar8 = (CBaseEntity *)CBaseEntity::GetGroundEntity(param_2), pCVar6 != pCVar8)) {
              local_a1 = (vphysics_objectstress_t)0x1;
            }
            local_90 = (float)(local_44[3] + -1);
            if ((int)local_90 < 2) {
              local_90 = (float)local_44[3];
            }
            else {
              pCVar8 = *(CBaseEntity **)(local_44[0] + (int)local_90 * 4);
              while (pCVar8 != local_5c) {
                local_90 = (float)((int)local_90 + -1);
                if (local_90 == 1.4013e-45) {
                  local_90 = (float)local_44[3];
                  goto LAB_0078b7ff;
                }
                pCVar8 = *(CBaseEntity **)(local_44[0] + (int)local_90 * 4);
              }
              if (local_90 != (float)local_44[3]) goto LAB_0078b05e;
            }
LAB_0078b7ff:
            CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
                      ((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,local_44[3]
                       ,&local_5c);
            CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
                      ((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
                       (Vector *)&vec3_origin);
            if (local_90 == 0.0) goto LAB_0078b0a8;
          }
LAB_0078b05e:
          if ((param_2[0x186] != (CBaseEntity)0x6) && (pCVar6[0x186] != (CBaseEntity)0x6)) {
            iVar12 = (**(code **)(*piVar5 + 0x120))(piVar5);
            if (iVar12 != 0) {
              piVar5 = (int *)(**(code **)(*piVar5 + 0x120))(piVar5);
              cVar2 = (**(code **)(*piVar5 + 0x24))(piVar5);
              if (cVar2 != '\0') goto LAB_0078b0a8;
            }
            local_94 = 0.0;
          }
        }
LAB_0078b0a8:
        (**(code **)(*piVar4 + 0x18))(piVar4,&local_50);
        pfVar11 = (float *)(local_30[0] + (int)local_90 * 0xc);
        pfVar11[1] = local_4c * local_94 + pfVar11[1];
        pfVar11[2] = local_48 * local_94 + pfVar11[2];
        *pfVar11 = local_94 * (float)local_50 + *pfVar11;
      }
      (**(code **)(*piVar4 + 0x34))(piVar4);
    }
  }
  (**(code **)(*(int *)param_1 + 0x148))(param_1,piVar4);
  local_8c[1] = DAT_01053d4c;
  local_74[0] = vec3_origin;
  *(undefined4 *)(local_30[0] + 0xc) = 0;
  local_8c[2] = DAT_01053d50;
  *(undefined4 *)(local_30[0] + 0x10) = 0;
  *(undefined4 *)(local_30[0] + 0x14) = 0;
  local_8c[0] = local_74[0];
  iVar12 = local_44[3] + -1;
  local_8c[3] = local_74[0];
  local_8c[4] = DAT_01053d4c;
  local_8c[5] = DAT_01053d50;
  if (iVar12 < 0) {
    local_90 = 0.0;
  }
  else {
    local_90 = 0.0;
    pfVar11 = (float *)(local_30[0] + iVar12 * 0xc);
    do {
      iVar7 = 0;
      local_90 = local_90 +
                 SQRT(pfVar11[1] * pfVar11[1] + *pfVar11 * *pfVar11 + pfVar11[2] * pfVar11[2]);
      do {
        fVar14 = pfVar11[iVar7];
        if (fVar14 < 0.0) {
          local_8c[iVar7] = local_8c[iVar7] - fVar14;
        }
        else {
          local_8c[iVar7 + 3] = fVar14 + local_8c[iVar7 + 3];
        }
        iVar7 = iVar7 + 1;
      } while (iVar7 != 3);
      iVar12 = iVar12 + -1;
      pfVar11 = pfVar11 + -3;
    } while (iVar12 != -1);
  }
  local_68[0] = local_74[0];
  local_74[1] = DAT_01053d4c;
  local_74[2] = DAT_01053d50;
  local_68[1] = DAT_01053d4c;
  local_68[2] = DAT_01053d50;
  iVar12 = 0;
  do {
    fVar14 = local_8c[iVar12];
    fVar15 = local_8c[iVar12 + 3];
    if (fVar15 <= fVar14) {
      local_68[iVar12] = fVar15;
      local_8c[iVar12 + 6] = fVar14 - fVar15;
    }
    else {
      local_68[iVar12] = fVar14;
      local_8c[iVar12 + 6] = fVar15 - fVar14;
    }
    iVar12 = iVar12 + 1;
  } while (iVar12 != 3);
  (**(code **)(*physenv + 0x14))(physenv,&local_5c);
  fVar14 = SQRT(local_58 * local_58 + (float)local_5c * (float)local_5c + local_54 * local_54);
  if ((param_2[0x186] == (CBaseEntity)0x6) ||
     (cVar2 = (**(code **)(*(int *)param_1 + 0x2c))(param_1), cVar2 == '\0')) {
    local_98 = local_68[2];
  }
  else {
    local_50 = (CBaseEntity *)0x0;
    local_4c = 0.0;
    local_48 = 0.0;
                    /* try { // try from 0078b396 to 0078b518 has its CatchHandler @ 0078ba33 */
    iVar12 = (**(code **)(*(int *)param_1 + 0x120))(param_1);
    if (iVar12 == 0) {
                    /* try { // try from 0078b981 to 0078b9c5 has its CatchHandler @ 0078ba33 */
      uVar9 = (**(code **)(*(int *)param_1 + 0x60))(param_1);
      if ((((uVar9 & 0x2000) != 0) &&
          (cVar2 = (**(code **)(*(int *)param_2 + 0x16c))(param_2), cVar2 != '\0')) &&
         (piVar3 = *(int **)(param_2 + 0x1dd4), piVar3 != (int *)0x0)) {
        (**(code **)(*piVar3 + 0x30))(piVar3,&local_50);
      }
    }
    else {
      piVar3 = (int *)(**(code **)(*(int *)param_1 + 0x120))(param_1);
      (**(code **)(*piVar3 + 0x28))(piVar3,&local_50);
    }
    fVar15 = (float)local_50 * (float)local_50;
    fVar17 = local_48 * local_48;
    fVar16 = local_4c * local_4c;
    lVar13 = (longdouble)(**(code **)(*physenv + 0x94))(physenv);
    fVar15 = (SQRT(fVar15 + fVar17 + fVar16) * fVar1) / (float)lVar13;
    if ((fVar15 <= 0.0) ||
       (fVar16 = SQRT(local_74[0] * local_74[0] + local_74[1] * local_74[1] +
                      local_74[2] * local_74[2]), fVar15 <= fVar16)) {
      local_98 = local_68[2];
    }
    else {
      fVar16 = 1.0 - fVar16 / fVar15;
      fVar17 = fVar16 * local_74[0];
      fVar15 = fVar16 * local_74[1];
      fVar16 = fVar16 * local_74[2];
      local_74[0] = local_74[0] + fVar17;
      local_74[1] = local_74[1] + fVar15;
      local_74[2] = local_74[2] + fVar16;
      fVar15 = SQRT(fVar15 * fVar15 + fVar17 * fVar17 + fVar16 * fVar16);
      local_90 = local_90 - fVar15;
      lVar13 = (longdouble)VectorNormalize((Vector *)local_68);
      fVar15 = (float)lVar13 - fVar15;
      if (fVar15 <= 0.0) {
        fVar15 = 0.0;
      }
      local_98 = local_68[2] * fVar15;
      local_68[1] = local_68[1] * fVar15;
      local_68[0] = fVar15 * local_68[0];
    }
  }
  local_68[2] = 1.0;
  if (0.0 < fVar14) {
    local_68[2] = 1.0 / fVar14;
  }
  local_74[0] = local_74[0] * local_68[2];
  local_74[1] = local_74[1] * local_68[2];
  local_74[2] = local_74[2] * local_68[2];
  local_90 = local_90 * local_68[2];
  local_68[0] = local_68[0] * local_68[2];
  local_68[1] = local_68[1] * local_68[2];
  local_68[2] = local_68[2] * local_98;
                    /* try { // try from 0078b60d to 0078b923 has its CatchHandler @ 0078b9e3 */
  cVar2 = (**(code **)(*(int *)param_1 + 0x2c))(param_1);
  fVar15 = local_74[1];
  fVar14 = local_74[0];
  if (cVar2 == '\0') {
    local_74[0] = 0.0;
    local_68[0] = fVar14;
    local_74[1] = 0.0;
    local_68[1] = fVar15;
    local_68[2] = local_74[2];
    local_74[2] = 0.0;
    cVar2 = (**(code **)(*(int *)param_1 + 8))(param_1);
    if (cVar2 == '\0') {
      local_90 = local_90 + fVar1;
    }
  }
  else if (fVar1 < local_90) {
    local_90 = (local_90 - fVar1) * 0.5 + fVar1;
  }
  if (param_3 != (vphysics_objectstress_t *)0x0) {
    param_3[8] = (vphysics_objectstress_t)(2 < local_44[3]);
    *(float *)param_3 =
         SQRT(local_74[1] * local_74[1] + local_74[2] * local_74[2] + local_74[0] * local_74[0]);
    *(float *)(param_3 + 4) =
         SQRT(local_68[1] * local_68[1] + local_68[2] * local_68[2] + local_68[0] * local_68[0]);
    param_3[9] = local_a1;
  }
  local_30[3] = 0;
  CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)local_30);
  local_30[4] = local_30[0];
  CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)local_30);
  local_44[3] = 0;
  CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_44);
  local_44[4] = local_44[0];
  CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_44);
  return (longdouble)local_90;
}

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)