L L4D2node

RagdollCreate

0x004a3bf0 · 2667 bytes · __cdecl

_Z13RagdollCreateR9ragdoll_tRK15ragdollparams_tP19IPhysicsEnvironment

Decompiled

undefined (3 params)

/* RagdollCreate(ragdoll_t&, ragdollparams_t const&, IPhysicsEnvironment*) */

undefined4 RagdollCreate(ragdoll_t *param_1,ragdollparams_t *param_2,IPhysicsEnvironment *param_3)

{
  float fVar1;
  short sVar2;
  short sVar3;
  vcollide_t *pvVar4;
  code *pcVar5;
  ushort uVar6;
  undefined4 uVar7;
  int iVar8;
  int iVar9;
  int *piVar10;
  int *piVar11;
  int iVar12;
  matrix3x4_t *pmVar13;
  int iVar14;
  void *pvVar15;
  int iVar16;
  int iVar17;
  ragdoll_t *prVar18;
  longdouble lVar19;
  int local_104;
  int local_100;
  int local_f8;
  matrix3x4_t *local_f0;
  float local_e8;
  float local_e4;
  float local_e0;
  float local_dc;
  float local_d8;
  float local_d4;
  float local_d0;
  float local_cc;
  float local_c8;
  undefined4 local_c4;
  undefined4 local_c0;
  undefined1 local_bc;
  matrix3x4_t local_b8 [48];
  undefined4 local_88;
  undefined4 local_84;
  undefined4 local_80;
  undefined4 local_7c;
  undefined4 local_78;
  undefined4 local_74;
  undefined4 local_70;
  undefined4 local_6c;
  undefined4 local_68;
  undefined4 local_64;
  undefined4 local_60;
  undefined4 local_5c;
  int local_58;
  int local_54;
  undefined4 local_50;
  undefined4 local_4c;
  undefined4 local_48;
  float local_44;
  undefined4 local_40;
  undefined4 local_3c;
  undefined4 local_38;
  float local_34;
  undefined4 local_30;
  undefined4 local_2c;
  undefined4 local_28;
  float local_24;
  undefined1 local_20;
  undefined1 local_1f;
  undefined1 local_1e;
  
  *(undefined4 *)param_1 = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  param_1[4] = *(ragdoll_t *)(param_2 + 0x34);
  prVar18 = param_1 + 0xc;
  for (iVar12 = 0x1f8; iVar12 != 0; iVar12 = iVar12 + -1) {
    *(undefined4 *)prVar18 = 0;
    prVar18 = prVar18 + 4;
  }
  *(undefined4 *)(param_1 + 0x84c) = 0;
  *(undefined4 *)(param_1 + 0x850) = 0;
  *(undefined4 *)(param_1 + 0x854) = 0;
  *(undefined4 *)(param_1 + 0x858) = 0;
  *(undefined4 *)(param_1 + 0x85c) = 0;
  pvVar4 = *(vcollide_t **)(param_2 + 4);
  if ((pvVar4 != (vcollide_t *)0x0) && ((*(ushort *)pvVar4 & 0x7fff) < 0x19)) {
    local_104 = *(int *)(pvVar4 + 0xc);
    if (local_104 == 0) {
      local_104 = ParseRagdollIntoCache
                            (*(CStudioHdr **)(param_2 + 8),pvVar4,*(int *)(param_2 + 0xc));
    }
    if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
      local_d0 = 0.0;
      local_c8 = 6.0;
      local_cc = 2.8026e-44;
      uVar7 = (**(code **)(*(int *)param_3 + 0x60))(param_3,&local_d0);
      *(undefined4 *)(param_1 + 8) = uVar7;
    }
    iVar12 = local_104 + 0x20;
    sVar2 = *(short *)(local_104 + 0x1a);
    iVar8 = (int)*(short *)(local_104 + 0x18);
    iVar16 = **(int **)(param_2 + 8);
    if (0 < iVar8) {
      iVar9 = 0;
      do {
        *(undefined4 *)(param_1 + iVar9 + 0x28) = 0xffffffff;
        iVar9 = iVar9 + 0x54;
      } while (iVar9 != iVar8 * 0x54);
    }
    if (0 < sVar2) {
      iVar9 = 0;
      pmVar13 = (matrix3x4_t *)(iVar8 * 0x38 + iVar12 + 0x30);
      do {
        iVar9 = iVar9 + 1;
        *(int *)(param_1 + *(short *)(pmVar13 + 0x32) * 0x54 + 0x28) =
             (int)*(short *)(pmVar13 + 0x30);
        MatrixGetColumn(pmVar13,3,(Vector *)(param_1 + *(short *)(pmVar13 + 0x32) * 0x54 + 0xc));
        pmVar13 = pmVar13 + 100;
      } while (iVar9 < sVar2);
    }
    if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
      local_100 = 0;
    }
    else {
      local_100 = (**(code **)(*modelinfo + 0x1c))(modelinfo,*(undefined4 *)(param_2 + 0xc));
    }
    if (iVar8 < 1) {
      *(int *)param_1 = iVar8;
      sVar3 = *(short *)(local_104 + 0x1a);
      sVar2 = *(short *)(local_104 + 0x18);
      if (iVar8 == 0) {
        return 0;
      }
    }
    else {
      iVar17 = 0;
      iVar9 = iVar12;
      local_f0 = (matrix3x4_t *)(param_1 + 0x30);
      do {
        iVar14 = (int)*(short *)(iVar9 + 0x34);
        *(int *)(param_1 + iVar17 * 4 + 0x7ec) = (int)*(short *)(iVar9 + 0x30);
        *(int *)(iVar9 + 0x18) = iVar16 + 0xc;
        *(undefined4 *)(iVar9 + 0x1c) = *(undefined4 *)param_2;
        if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
          piVar11 = (int *)(**(code **)(*(int *)param_3 + 0x20))
                                     (param_3,*(undefined4 *)
                                               (*(int *)(*(int *)(param_2 + 4) + 4) +
                                               *(short *)(iVar9 + 0x32) * 4),
                                      *(undefined4 *)(iVar9 + 0x2c),&vec3_origin,&vec3_angle,iVar9);
LAB_004a3e2f:
          if (piVar11 != (int *)0x0) {
            (**(code **)(*piVar11 + 0x54))(piVar11,iVar17);
            iVar14 = *(int *)(local_f0 + -8);
            MatrixCopy((matrix3x4_t *)
                       (*(int *)(param_1 + iVar17 * 4 + 0x7ec) * 0x30 + *(int *)(param_2 + 0x2c)),
                       (matrix3x4_t *)&local_d0);
            if (-1 < iVar14) {
              (**(code **)(**(int **)(param_1 + iVar14 * 0x54 + 0x18) + 0xe4))
                        (*(int **)(param_1 + iVar14 * 0x54 + 0x18),&local_dc,local_f0 + -0x24);
              MatrixSetColumn((Vector *)&local_dc,3,(matrix3x4_t *)&local_d0);
            }
            (**(code **)(*piVar11 + 0xc0))(piVar11,&local_d0,1);
            MatrixCopy((matrix3x4_t *)&local_d0,local_f0);
            pcVar5 = *(code **)(*physcollision + 0xd8);
            uVar7 = (**(code **)(*piVar11 + 300))(piVar11);
            lVar19 = (longdouble)(*pcVar5)(physcollision,uVar7);
            *(float *)(local_f0 + -4) = (float)lVar19;
            uVar6 = (**(code **)(*piVar11 + 0x50))(piVar11);
            (**(code **)(*piVar11 + 0x4c))(piVar11,uVar6 | 8);
          }
        }
        else {
          piVar10 = (int *)(**(code **)(*g_pPhys2World + 0x54))
                                     (g_pPhys2World,
                                      *(undefined4 *)(*(int *)(local_100 + 8) + iVar14 * 4),
                                      &local_d0,0x3f800000,0x14,0,0);
          *(int **)(local_f0 + -0x14) = piVar10;
          if (piVar10 != (int *)0x0) {
            (**(code **)(*piVar10 + 0x3c))
                      (piVar10,"svRagdoll %s [%d->%d] %s",iVar16 + 0xc,iVar17,iVar14,
                       *(undefined4 *)(*(int *)(local_100 + 0x20) + iVar14 * 4));
            (**(code **)(*piVar10 + 0xc))(piVar10,*(undefined4 *)param_2);
            piVar11 = (int *)(**(code **)(*piVar10 + 0x60))(piVar10);
            *(int **)(local_f0 + -0x18) = piVar11;
            (**(code **)(*piVar10 + 0x7c))(piVar10,0x3f800000);
            goto LAB_004a3e2f;
          }
          piVar11 = (int *)0x0;
        }
        iVar17 = iVar17 + 1;
        iVar9 = iVar9 + 0x38;
        *(int **)(local_f0 + -0x18) = piVar11;
        local_f0 = local_f0 + 0x54;
      } while (iVar8 != iVar17);
      *(int *)param_1 = iVar8;
      sVar2 = *(short *)(local_104 + 0x18);
      sVar3 = *(short *)(local_104 + 0x1a);
    }
    local_f8 = (int)sVar3;
    pvVar15 = (void *)(sVar2 * 0x38 + iVar12);
    if (0 < local_f8) {
      local_f0 = (matrix3x4_t *)0x0;
      do {
        local_1f = 1;
        local_cc = 0.0;
        local_c8 = 0.0;
        local_d0 = 1.0;
        local_c4 = 0x3f800000;
        local_c0 = 0x3f800000;
        local_bc = 1;
        SetIdentityMatrix(local_b8);
        SetIdentityMatrix((matrix3x4_t *)&local_88);
        local_58 = 0xffffffff;
        local_54 = 0xffffffff;
        local_50 = 0;
        local_4c = 0;
        local_48 = 0;
        local_44 = 0.0;
        local_40 = 0;
        local_3c = 0;
        local_38 = 0;
        local_34 = 0.0;
        local_30 = 0;
        local_2c = 0;
        local_28 = 0;
        local_24 = 0.0;
        local_20 = 0;
        local_1e = 0;
        _V_memcpy(&local_50,pvVar15,0x30);
        fVar1 = *(float *)(param_2 + 0x30);
        if (0.0 < fVar1) {
          local_44 = local_44 * fVar1;
          local_34 = local_34 * fVar1;
          local_24 = fVar1 * local_24;
        }
        iVar12 = (int)*(short *)((int)pvVar15 + 0x60);
        iVar16 = (int)*(short *)((int)pvVar15 + 0x62);
        local_1e = 1;
        local_88 = *(undefined4 *)((int)pvVar15 + 0x30);
        local_84 = *(undefined4 *)((int)pvVar15 + 0x34);
        local_80 = *(undefined4 *)((int)pvVar15 + 0x38);
        local_7c = *(undefined4 *)((int)pvVar15 + 0x3c);
        local_78 = *(undefined4 *)((int)pvVar15 + 0x40);
        local_74 = *(undefined4 *)((int)pvVar15 + 0x44);
        local_70 = *(undefined4 *)((int)pvVar15 + 0x48);
        local_6c = *(undefined4 *)((int)pvVar15 + 0x4c);
        local_68 = *(undefined4 *)((int)pvVar15 + 0x50);
        local_64 = *(undefined4 *)((int)pvVar15 + 0x54);
        local_60 = *(undefined4 *)((int)pvVar15 + 0x58);
        local_5c = *(undefined4 *)((int)pvVar15 + 0x5c);
        local_58 = iVar12;
        local_54 = iVar16;
        SetIdentityMatrix(local_b8);
        if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
          uVar7 = (**(code **)(*(int *)param_3 + 0x40))
                            (param_3,*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x18),
                             *(undefined4 *)(param_1 + iVar12 * 0x54 + 0x18),
                             *(undefined4 *)(param_1 + 8),&local_d0);
          *(undefined4 *)(param_1 + iVar16 * 0x54 + 0x20) = uVar7;
        }
        else {
          uVar7 = (**(code **)(*g_pPhys2World + 0x20))
                            (g_pPhys2World,*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x1c),
                             *(undefined4 *)(param_1 + iVar12 * 0x54 + 0x1c),&local_d0,1);
          *(undefined4 *)(param_1 + iVar16 * 0x54 + 0x24) = uVar7;
        }
        local_f0 = (matrix3x4_t *)((int)local_f0 + 1);
        pvVar15 = (void *)((int)pvVar15 + 100);
      } while (local_f0 != (matrix3x4_t *)local_f8);
    }
  }
  iVar12 = *(int *)param_1;
  if (iVar12 == 0) {
    return 0;
  }
  iVar16 = *(int *)(param_2 + 0x28);
  if (iVar12 < 1) {
    local_f0 = (matrix3x4_t *)0x3f800000;
  }
  else {
    local_f0 = (matrix3x4_t *)0x0;
    prVar18 = param_1 + 0x18;
    iVar8 = 0;
    do {
      piVar11 = *(int **)prVar18;
      if (piVar11 != (int *)0x0) {
        lVar19 = (longdouble)(**(code **)(*piVar11 + 0x78))(piVar11);
        iVar12 = *(int *)param_1;
        local_f0 = (matrix3x4_t *)((float)lVar19 + (float)local_f0);
      }
      iVar8 = iVar8 + 1;
      prVar18 = prVar18 + 0x54;
    } while (iVar8 < iVar12);
    if ((float)local_f0 <= 1.0) {
      local_f0 = (matrix3x4_t *)0x3f800000;
    }
  }
  local_e8 = *(float *)(param_2 + 0x1c);
  local_e4 = *(float *)(param_2 + 0x20);
  local_e0 = *(float *)(param_2 + 0x24);
  local_dc = *(float *)(param_2 + 0x10);
  local_d8 = *(float *)(param_2 + 0x14);
  local_d4 = *(float *)(param_2 + 0x18);
  if (((-1 < iVar16) && (iVar16 < iVar12)) &&
     (piVar11 = *(int **)(param_1 + iVar16 * 0x54 + 0x18), piVar11 != (int *)0x0)) {
    (**(code **)(*piVar11 + 0xf4))(piVar11,&local_e8);
    (**(code **)(**(int **)(param_1 + iVar16 * 0x54 + 0x18) + 0xc4))
              (*(int **)(param_1 + iVar16 * 0x54 + 0x18),&local_dc,0);
  }
  if ((((vec3_origin != local_dc) || (DAT_01053d4c != local_d8)) || (DAT_01053d50 != local_d4)) &&
     (0 < *(int *)param_1)) {
    iVar12 = 0;
    prVar18 = param_1;
    do {
      if ((iVar16 != iVar12) && (piVar11 = *(int **)(prVar18 + 0x18), piVar11 != (int *)0x0)) {
        lVar19 = (longdouble)(**(code **)(*piVar11 + 0x78))(piVar11);
        local_c8 = (float)lVar19 * (1.0 / (float)local_f0);
        local_d0 = local_e8 * local_c8;
        local_cc = local_e4 * local_c8;
        local_c8 = local_c8 * local_e0;
        (**(code **)(**(int **)(prVar18 + 0x18) + 0xf8))
                  (*(int **)(prVar18 + 0x18),&local_d0,&local_dc);
      }
      iVar12 = iVar12 + 1;
      prVar18 = prVar18 + 0x54;
    } while (iVar12 < *(int *)param_1);
  }
  return 1;
}

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)