L L4D2node

RagdollSolveSeparation

0x004a4dc0 · 1222 bytes · __cdecl

_Z22RagdollSolveSeparationR9ragdoll_tP11CBaseEntity

Decompiled

undefined (2 params)

/* RagdollSolveSeparation(ragdoll_t&, CBaseEntity*) */

void RagdollSolveSeparation(ragdoll_t *param_1,CBaseEntity *param_2)

{
  int *piVar1;
  char cVar2;
  int iVar3;
  ragdoll_t *prVar4;
  ragdoll_t *prVar5;
  int iVar6;
  int in_GS_OFFSET;
  int local_214;
  float local_200;
  float local_1fc;
  float local_1f8;
  float local_1f4;
  float local_1f0;
  float local_1ec;
  float local_1e8;
  float local_1e4;
  float local_1e0;
  Vector local_1dc [16];
  float local_1cc;
  float local_1c8;
  float local_1c4;
  float local_1bc;
  float local_1b8;
  float local_1b4;
  undefined4 local_1ac;
  undefined4 local_1a8;
  undefined4 local_1a4;
  undefined4 local_19c;
  undefined4 local_198;
  undefined4 local_194;
  undefined4 local_18c;
  undefined1 local_188;
  undefined1 local_187;
  matrix3x4_t local_174 [12];
  Vector local_168 [32];
  float local_148;
  char local_13e;
  char local_13d;
  char acStack_120 [256];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (0 < *(int *)param_1) {
    prVar5 = param_1 + 0xc;
    iVar6 = 0;
    local_214 = 0;
    prVar4 = param_1 + 0x18;
    do {
      while ((((iVar3 = *(int *)(prVar4 + 8), acStack_120[iVar6] = '\0', iVar3 == 0 ||
               (*(int *)(prVar4 + 0x10) < 0)) || (piVar1 = *(int **)prVar4, piVar1 == (int *)0x0))
             || (*(int *)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18) == 0))) {
LAB_004a4e98:
        iVar3 = *(int *)param_1;
        iVar6 = iVar6 + 1;
        prVar4 = prVar4 + 0x54;
        if (iVar3 <= iVar6) goto LAB_004a4f4c;
      }
      (**(code **)(*piVar1 + 0xc4))(piVar1,&local_200,0);
      (**(code **)(**(int **)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18) + 0xe4))
                (*(int **)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18),&local_1f4,prVar4 + -0xc
                );
      if (acStack_120[*(int *)(prVar4 + 0x10)] == '\0') {
        local_1e4 = local_1f0 - local_1fc;
        local_1e0 = local_1ec - local_1f8;
        local_1e8 = local_1f4 - local_200;
        if ((local_1e4 * local_1e4 + local_1e0 * local_1e0 + local_1e8 * local_1e8 <= 1.0) ||
           (cVar2 = PhysHasContactWithOtherInDirection
                              (*(IPhysicsObject **)prVar4,(Vector *)&local_1e8), cVar2 == '\0'))
        goto LAB_004a4e98;
        local_1c8 = local_1f0;
        local_1c4 = local_1ec;
        local_1b8 = local_1fc - local_1f0;
        local_18c = 0;
        local_1b4 = local_1f8 - local_1ec;
        local_188 = 1;
        local_1cc = local_1f4;
        local_1bc = local_200 - local_1f4;
        local_194 = 0;
        local_198 = 0;
        local_19c = 0;
        local_187 = local_1b8 * local_1b8 + local_1b4 * local_1b4 + local_1bc * local_1bc != 0.0;
        local_1a4 = 0;
        local_1a8 = 0;
        local_1ac = 0;
        CTraceFilterSimple::CTraceFilterSimple
                  ((CTraceFilterSimple *)local_1dc,(IHandleEntity *)param_2,0,
                   (_func_bool_IHandleEntity_ptr_int *)0x0);
        (**(code **)(*enginetrace + 0x14))
                  (enginetrace,&local_1cc,0x200400b,(CTraceFilterSimple *)local_1dc,local_174);
        if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
          DebugDrawLine((Vector *)local_174,local_168,0xff,0,0,true,-1.0);
        }
        if ((local_148 < 1.0) || (local_13e != '\0')) goto LAB_004a4f2d;
        if (local_13d == '\0') goto LAB_004a4e98;
        acStack_120[iVar6] = '\x01';
      }
      else {
LAB_004a4f2d:
        acStack_120[iVar6] = '\x01';
      }
      local_214 = local_214 + 1;
      iVar3 = *(int *)param_1;
      iVar6 = iVar6 + 1;
      prVar4 = prVar4 + 0x54;
    } while (iVar6 < iVar3);
LAB_004a4f4c:
    if (local_214 != 0) {
      if (0 < iVar3) {
        iVar6 = 0;
        do {
          if (((acStack_120[iVar6] != '\0') &&
              (piVar1 = *(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18),
              piVar1 != (int *)0x0)) && (*(int *)(prVar5 + 0xc) != 0)) {
            (**(code **)(*piVar1 + 0xe4))(piVar1,local_1dc,prVar5);
            (**(code **)(**(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18) + 0xdc))
                      (*(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18),local_1dc,
                       &local_1cc);
            (**(code **)(**(int **)(prVar5 + 0xc) + 200))(*(int **)(prVar5 + 0xc),local_174);
            MatrixSetColumn(local_1dc,3,local_174);
            (**(code **)(**(int **)(prVar5 + 0xc) + 0xc0))(*(int **)(prVar5 + 0xc),local_174,1);
            (**(code **)(**(int **)(prVar5 + 0xc) + 0xcc))
                      (*(int **)(prVar5 + 0xc),&local_1cc,&vec3_origin);
          }
          iVar6 = iVar6 + 1;
          prVar5 = prVar5 + 0x54;
        } while (iVar6 < *(int *)param_1);
      }
      DevMsg(2,"TICK:%5d:Ragdoll separation count: %d\n",*(undefined4 *)(gpGlobals + 0x18),local_214
            );
      goto LAB_004a509d;
    }
  }
  (**(code **)(**(int **)(param_1 + 8) + 0x10))(*(int **)(param_1 + 8));
LAB_004a509d:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  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)