L L4D2node

CRagdollProp::InitRagdoll

0x00798dd0 · 1891 bytes · __thiscall

_ZN12CRagdollProp11InitRagdollERK6VectoriS2_P11matrix3x4_tS4_fibb

Decompiled

undefined (10 params)

/* CRagdollProp::InitRagdoll(Vector const&, int, Vector const&, matrix3x4_t*, matrix3x4_t*, float,
   int, bool, bool) */

void __thiscall
CRagdollProp::InitRagdoll
          (CRagdollProp *this,Vector *param_1,int param_2,Vector *param_3,matrix3x4_t *param_4,
          matrix3x4_t *param_5,float param_6,int param_7,bool param_8,bool param_9)

{
  ragdoll_t *prVar1;
  float fVar2;
  int *piVar3;
  code *pcVar4;
  code *pcVar5;
  int iVar6;
  undefined4 uVar7;
  long lVar8;
  undefined4 uVar9;
  matrix3x4_t *pmVar10;
  int iVar11;
  int *piVar12;
  undefined1 *puVar13;
  CRagdollProp *pCVar14;
  int *piVar15;
  CRagdollProp *pCVar16;
  int in_GS_OFFSET;
  double dVar17;
  double dVar18;
  int aiStack_9f4 [2];
  undefined1 *local_9a8;
  undefined1 local_9a4 [20];
  undefined1 local_990 [12];
  undefined4 local_984;
  undefined4 local_980;
  undefined4 local_97c;
  undefined4 local_974;
  undefined4 local_970;
  undefined4 local_96c;
  CRagdollProp *local_964;
  int local_960;
  int *local_95c;
  undefined4 local_958;
  undefined4 local_954;
  undefined4 local_950;
  undefined4 local_94c;
  undefined4 local_948;
  undefined4 local_944;
  undefined4 local_940;
  int local_93c;
  matrix3x4_t *local_938;
  undefined4 local_934;
  byte local_930;
  undefined1 local_92c [5];
  undefined1 local_927 [263];
  char local_820 [2048];
  int local_20;
  
  piVar15 = (int *)&stack0xfffff614;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  CBaseEntity::SetCollisionGroup((CBaseEntity *)this,param_7);
  if (param_7 == 3) {
    CBaseEntity::ThinkSet((_func_void *)local_9a4,(float)this,(char *)SetDebrisThink);
  }
  CBaseEntity::SetMoveType();
  CCollisionProperty::SetSolid();
  CCollisionProperty::SetSolidFlags
            ((CCollisionProperty *)(this + 0x194),(uint)(*(ushort *)(this + 0x1b4) | 3));
  if (this[0x105] != (CRagdollProp)0x1) {
    (**(code **)(*(int *)this + 0x224))();
    this[0x105] = (CRagdollProp)0x1;
  }
  local_964 = this;
  local_958 = (**(code **)(*(int *)this + 0x1c))();
  local_960 = (**(code **)(*modelinfo + 0x18))();
  piVar12 = *(int **)(this + 0x13e0);
  if (piVar12 == (int *)0x0) {
    iVar6 = CBaseEntity::GetModel((CBaseEntity *)this);
    if (iVar6 == 0) {
      piVar12 = *(int **)(this + 0x13e0);
    }
    else {
      CBaseAnimating::LockStudioHdr((CBaseAnimating *)this);
      piVar12 = *(int **)(this + 0x13e0);
    }
    local_95c = (int *)0x0;
    if (piVar12 == (int *)0x0) goto LAB_00798ee8;
  }
  local_95c = (int *)0x0;
  if (*piVar12 != 0) {
    local_95c = piVar12;
  }
LAB_00798ee8:
  local_934 = 0x3f800000;
  local_948 = *(undefined4 *)param_1;
  local_944 = *(undefined4 *)(param_1 + 4);
  local_93c = param_2;
  local_940 = *(undefined4 *)(param_1 + 8);
  local_954 = *(undefined4 *)param_3;
  local_930 = (byte)(*(uint *)(this + 0x148) >> 0xf) & 1;
  local_950 = *(undefined4 *)(param_3 + 4);
  prVar1 = (ragdoll_t *)(this + 0x13f8);
  local_94c = *(undefined4 *)(param_3 + 8);
  local_938 = param_5;
  RagdollCreate(prVar1,(ragdollparams_t *)&local_964,physenv);
  RagdollApplyAnimationAsVelocity(prVar1,param_4,param_5,param_6);
  piVar12 = (int *)&stack0xfffff614;
  if ((*(char **)(this + 0x1ea0) != (char *)0x0) &&
     (iVar6 = _V_strlen(*(char **)(this + 0x1ea0)), piVar12 = (int *)&stack0xfffff614, 0 < iVar6)) {
    while( true ) {
      piVar15[1] = 0x800;
      *piVar15 = (int)local_820;
      piVar15[-1] = 0x7990bb;
      iVar6 = nexttoken((char *)*piVar15,piVar15[1],(char *)piVar15[2],(char)piVar15[3]);
      piVar12 = piVar15;
      if (local_820[0] == '\0') break;
      piVar15[2] = 10;
      piVar15[1] = 0;
      *piVar15 = (int)local_820;
      piVar15[-1] = 0x7990e8;
      lVar8 = strtol((char *)*piVar15,(char **)piVar15[1],piVar15[2]);
      piVar15[2] = iVar6;
      piVar15[3] = 0x2c;
      piVar15[1] = 0x800;
      *piVar15 = (int)local_820;
      piVar15[-1] = 0x79910c;
      uVar9 = nexttoken((char *)*piVar15,piVar15[1],(char *)piVar15[2],(char)piVar15[3]);
      if (lVar8 < *(int *)(this + 0x13f8)) {
        if (local_820[0] != '\0') {
          *piVar15 = (int)local_990;
          piVar15[1] = (int)local_820;
          piVar15[-1] = 0x799145;
          UTIL_StringToVector((float *)*piVar15,(char *)piVar15[1]);
          iVar6 = *(int *)(this + lVar8 * 4 + 0x1be4);
          *piVar15 = (int)local_990;
          pmVar10 = param_5 + iVar6 * 0x30;
          piVar15[1] = (int)pmVar10;
          piVar15[-1] = 0x799170;
          AngleMatrix((QAngle *)*piVar15,(matrix3x4_t *)piVar15[1]);
          pCVar16 = this + lVar8 * 0x54 + 0x1404;
          iVar6 = *(int *)(pCVar16 + 0x1c);
          if (iVar6 < 0) {
            if (((byte)this[0x14d] & 8) != 0) {
              *piVar15 = (int)this;
              piVar15[-1] = 0x799510;
              CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar15);
            }
            local_984 = *(undefined4 *)(this + 0x2e0);
            local_980 = *(undefined4 *)(this + 0x2e4);
            local_97c = *(undefined4 *)(this + 0x2e8);
          }
          else {
            piVar15[2] = (int)&local_984;
            iVar6 = *(int *)(this + iVar6 * 4 + 0x1be4);
            *piVar15 = (int)pCVar16;
            piVar15[1] = (int)(param_5 + iVar6 * 0x30);
            piVar15[-1] = 0x7991b9;
            VectorTransform((float *)*piVar15,(matrix3x4_t *)piVar15[1],(float *)piVar15[2]);
          }
          *piVar15 = (int)&local_984;
          piVar15[1] = 3;
          piVar15[2] = (int)pmVar10;
          piVar15[-1] = 0x7991d9;
          MatrixSetColumn((Vector *)*piVar15,piVar15[1],(matrix3x4_t *)piVar15[2]);
          piVar3 = *(int **)(pCVar16 + 0xc);
          iVar6 = *piVar3;
          piVar15[2] = 1;
          piVar15[1] = (int)pmVar10;
          *piVar15 = (int)piVar3;
          pcVar4 = *(code **)(iVar6 + 0xc0);
          piVar15[-1] = 0x7991f9;
          (*pcVar4)();
        }
      }
      else {
        if (((byte)this[0x14d] & 8) == 0) {
          dVar18 = (double)*(float *)(this + 0x2e8);
LAB_00799010:
          dVar17 = (double)*(float *)(this + 0x2e4);
        }
        else {
          *piVar15 = (int)this;
          piVar15[-1] = 0x7993c0;
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar15);
          dVar18 = (double)*(float *)(this + 0x2e8);
          if (((byte)this[0x14d] & 8) == 0) goto LAB_00799010;
          *piVar15 = (int)this;
          piVar15[-1] = 0x7993e8;
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar15);
          dVar17 = (double)*(float *)(this + 0x2e4);
          if (((byte)this[0x14d] & 8) != 0) {
            *piVar15 = (int)this;
            piVar15[-1] = 0x799420;
            CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar15);
          }
        }
        *(double *)(piVar15 + 6) = dVar18;
        *(double *)(piVar15 + 4) = dVar17;
        fVar2 = *(float *)(this + 0x2e0);
        *piVar15 = (int)local_92c;
        piVar15[1] = (int)"(%f, %f, %f)";
        *(double *)(piVar15 + 2) = (double)fVar2;
        piVar15[-1] = 0x799053;
        CFmtStrN<256>::CFmtStrN((CFmtStrN<256> *)*piVar15,(char *)piVar15[1]);
        iVar6 = *(int *)this;
        *piVar15 = (int)&local_9a8;
        piVar15[1] = (int)this;
        pcVar4 = *(code **)(iVar6 + 0x20);
        piVar15[-1] = 0x799065;
        (*pcVar4)();
        piVar12 = piVar15 + -1;
        piVar15[-1] = (int)this;
        puVar13 = &DAT_00d539c2;
        if (local_9a8 != (undefined1 *)0x0) {
          puVar13 = local_9a8;
        }
        piVar15[-2] = 0x79907b;
        uVar7 = CBaseEntity::GetDebugName((CBaseEntity *)piVar15[-1]);
        piVar15[-1] = (int)"Bad ragdoll pose in entity %s, model (%s) at %s, model changed?\n";
        piVar15[1] = (int)puVar13;
        piVar15[2] = (int)local_927;
        *piVar15 = uVar7;
        piVar15[-2] = 0x799099;
        Warning();
      }
      *(undefined4 *)((int)piVar12 + 0xc) = 0x2c;
      *(undefined4 *)((int)piVar12 + 8) = uVar9;
      piVar15 = piVar12;
    }
  }
  if (param_8) {
    iVar6 = *(int *)this;
    *piVar12 = (int)this;
    pcVar4 = *(code **)(iVar6 + 0x1c);
    piVar12[-1] = 0x799488;
    iVar6 = (*pcVar4)();
    piVar12[3] = 0;
    piVar12[2] = iVar6;
    iVar6 = local_960;
    piVar12[4] = (uint)param_9;
    piVar12[1] = iVar6;
    *piVar12 = (int)prVar1;
    piVar12[-1] = 0x7994b7;
    RagdollActivate((ragdoll_t *)*piVar12,(vcollide_t *)piVar12[1],piVar12[2],
                    (CCallQueue *)piVar12[3],SUB41(piVar12[4],0));
  }
  pCVar16 = this + 0x1410;
  iVar6 = 0;
  pCVar14 = this + 0x1edc;
  if (0 < *(int *)(this + 0x13f8)) {
    do {
      iVar11 = *(int *)pCVar16;
      if (iVar11 != 0) {
        piVar12[2] = iVar6;
        piVar12[1] = iVar11;
        *piVar12 = (int)this;
        piVar12[-1] = 0x7992d5;
        UpdateNetworkDataFromVPhysics
                  ((CRagdollProp *)*piVar12,(IPhysicsObject *)piVar12[1],piVar12[2]);
        pcVar4 = *(code **)(*g_pPhysSaveRestoreManager + 4);
        iVar11 = *(int *)this;
        *piVar12 = (int)this;
        pcVar5 = *(code **)(iVar11 + 0x1c);
        piVar12[-1] = 0x7992ed;
        iVar11 = (*pcVar5)();
        piVar12[2] = iVar11;
        piVar12[1] = *(int *)pCVar16;
        *piVar12 = (int)g_pPhysSaveRestoreManager;
        piVar12[-1] = 0x799307;
        (*pcVar4)();
        piVar15 = *(int **)(pCVar16 + 4);
        if (piVar15 == (int *)0x0) {
          pcVar4 = *(code **)(*physcollision + 0x60);
          iVar11 = **(int **)pCVar16;
          *piVar12 = (int)*(int **)pCVar16;
          pcVar5 = *(code **)(iVar11 + 300);
          piVar12[-1] = 0x79933b;
          iVar11 = (*pcVar5)();
          piVar12[5] = (int)&vec3_angle;
          piVar12[3] = iVar11;
          piVar12[2] = (int)(pCVar14 + 0x120);
          piVar12[4] = (int)&vec3_origin;
          piVar12[1] = (int)pCVar14;
          *piVar12 = (int)physcollision;
          piVar12[-1] = 0x79936d;
          (*pcVar4)();
        }
        else {
          iVar11 = *piVar15;
          piVar12[1] = (int)&local_984;
          *piVar12 = (int)piVar15;
          pcVar4 = *(code **)(iVar11 + 0x4c);
          piVar12[-1] = 0x799248;
          (*pcVar4)();
          *(undefined4 *)pCVar14 = local_984;
          *(undefined4 *)(pCVar14 + 4) = local_980;
          *(undefined4 *)(pCVar14 + 8) = local_97c;
          *(undefined4 *)(pCVar14 + 0x120) = local_974;
          *(undefined4 *)(pCVar14 + 0x124) = local_970;
          *(undefined4 *)(pCVar14 + 0x128) = local_96c;
        }
      }
      iVar6 = iVar6 + 1;
      pCVar16 = pCVar16 + 0x54;
      pCVar14 = pCVar14 + 0xc;
    } while (iVar6 < *(int *)(this + 0x13f8));
  }
  iVar6 = *(int *)(this + 0x1410);
  *piVar12 = (int)this;
  piVar12[1] = iVar6;
  piVar12[-1] = 0x799392;
  CBaseEntity::VPhysicsSetObject((CBaseEntity *)*piVar12,(IPhysicsObject *)piVar12[1]);
  *piVar12 = (int)this;
  piVar12[-1] = 0x79939a;
  CalcRagdollSize((CRagdollProp *)*piVar12);
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  piVar12[-1] = (int)&UNK_0079954c;
  __stack_chk_fail();
}

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)