L L4D2node

CCollisionEvent::ShouldCollide

0x00778a10 · 1725 bytes · __cdecl

_ZN15CCollisionEvent13ShouldCollideEP14IPhysicsObjectS1_PvS2_RK28PhysicsCollisionRulesCache_tS5_

Decompiled

undefined (6 params)

/* CCollisionEvent::ShouldCollide(IPhysicsObject*, IPhysicsObject*, void*, void*,
   PhysicsCollisionRulesCache_t const&, PhysicsCollisionRulesCache_t const&) */

byte CCollisionEvent::ShouldCollide
               (IPhysicsObject *param_1,IPhysicsObject *param_2,void *param_3,void *param_4,
               PhysicsCollisionRulesCache_t *param_5,PhysicsCollisionRulesCache_t *param_6)

{
  PhysicsCollisionRulesCache_t PVar1;
  code *pcVar2;
  uint uVar3;
  char cVar4;
  byte bVar5;
  char cVar6;
  ushort uVar7;
  ushort uVar8;
  undefined2 uVar9;
  undefined2 uVar10;
  int iVar11;
  uint uVar12;
  undefined4 uVar13;
  int *piVar14;
  int iVar15;
  uint uVar16;
  int iVar17;
  undefined *puVar18;
  bool bVar19;
  bool bVar20;
  
  iVar11 = *(int *)(param_1 + 0x15c) + 1;
  *(int *)(param_1 + 0x15c) = iVar11;
  if ((param_4 == (void *)0x0) || (param_5 == (PhysicsCollisionRulesCache_t *)0x0)) {
LAB_00778a32:
    bVar5 = 1;
  }
  else {
                    /* try { // try from 00778a62 to 007790c0 has its CatchHandler @ 007790ed */
    uVar7 = (**(code **)(*(int *)param_2 + 0x50))(param_2);
    uVar8 = (**(code **)(*(int *)param_3 + 0x50))(param_3);
    if (param_4 == param_5) {
      if (-1 < (short)(uVar8 | uVar7)) {
        pcVar2 = *(code **)(*physics + 0x2c);
        uVar13 = (**(code **)(*(int *)param_4 + 0x1c))(param_4);
        piVar14 = (int *)(*pcVar2)(physics,uVar13);
        if (piVar14 == (int *)0x0) {
          iVar11 = *(int *)(param_1 + 0x15c);
          bVar5 = 1;
          goto LAB_00778a37;
        }
        pcVar2 = *(code **)(*piVar14 + 8);
        uVar9 = (**(code **)(*(int *)param_3 + 0x58))(param_3);
        uVar10 = (**(code **)(*(int *)param_2 + 0x58))(param_2);
        bVar5 = (*pcVar2)(piVar14,uVar10,uVar9);
LAB_00778b6a:
        iVar11 = *(int *)(param_1 + 0x15c);
        goto LAB_00778a37;
      }
    }
    else if ((((uVar7 & 2 & uVar8) == 0) &&
             ((uVar12 = (**(code **)(*(int *)param_2 + 0x60))(param_2), (uVar12 & 0x40) == 0 ||
              (cVar4 = WheelCollidesWith(param_3,(CBaseEntity *)param_5), cVar4 != '\0')))) &&
            ((uVar12 = (**(code **)(*(int *)param_3 + 0x60))(param_3), (uVar12 & 0x40) == 0 ||
             (cVar4 = WheelCollidesWith(param_2,param_4), cVar4 != '\0')))) {
      cVar4 = (**(code **)(*(int *)param_4 + 0x294))(param_4,param_5);
      if ((cVar4 != '\0') ||
         (cVar4 = (**(code **)(*(int *)param_5 + 0x294))(param_5,param_4), cVar4 != '\0')) {
LAB_00778aeb:
        iVar11 = *(int *)(param_1 + 0x15c);
        goto LAB_00778a32;
      }
      if (((*(int *)((int)param_4 + 0x30) == 0) || (*(int *)(param_5 + 0x30) == 0)) ||
         (((((uVar12 = *(uint *)((int)param_4 + 0x220), uVar12 == 0xffffffff ||
             (puVar18 = g_pEntityList + (uVar12 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)
             ) || (*(uint *)(puVar18 + 8) != uVar12 >> 0xc)) ||
           (param_5 != *(PhysicsCollisionRulesCache_t **)(puVar18 + 4))) &&
          ((((uVar12 = *(uint *)(param_5 + 0x220), uVar12 == 0xffffffff ||
             (puVar18 = g_pEntityList + (uVar12 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)
             ) || (*(uint *)(puVar18 + 8) != uVar12 >> 0xc)) || (param_4 != *(void **)(puVar18 + 4))
           ))))) {
        uVar12 = *(uint *)((int)param_4 + 0x188);
        if ((((uVar12 == 0xffffffff) ||
             (puVar18 = g_pEntityList + (uVar12 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)
             ) || ((*(uint *)(puVar18 + 8) != uVar12 >> 0xc || (*(int *)(puVar18 + 4) == 0)))) &&
           ((((uVar12 = *(uint *)(param_5 + 0x188), uVar12 == 0xffffffff ||
              (puVar18 = g_pEntityList + (uVar12 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc
              )) || (*(uint *)(puVar18 + 8) != uVar12 >> 0xc)) || (*(int *)(puVar18 + 4) == 0)))) {
LAB_00778c70:
          iVar11 = (**(code **)(*(int *)((int)param_4 + 0x194) + 0x2c))((int)param_4 + 0x194);
          iVar15 = (**(code **)(*(int *)(param_5 + 0x194) + 0x2c))(param_5 + 0x194);
          uVar12 = (**(code **)(*(int *)((int)param_4 + 0x194) + 0x30))((int)param_4 + 0x194);
          uVar16 = (**(code **)(*(int *)(param_5 + 0x194) + 0x30))(param_5 + 0x194);
          cVar4 = *(char *)((int)param_4 + 0x186);
          PVar1 = param_5[0x186];
          bVar19 = cVar4 == '\a';
          bVar20 = PVar1 == (PhysicsCollisionRulesCache_t)0x7;
          if (cVar4 == '\v') {
            iVar17 = (**(code **)(*(int *)param_2 + 0x120))(param_2);
            bVar19 = iVar17 != 0;
          }
          if (PVar1 == (PhysicsCollisionRulesCache_t)0xb) {
            iVar17 = (**(code **)(*(int *)param_3 + 0x120))(param_3);
            bVar20 = iVar17 != 0;
          }
          uVar3 = *(uint *)((int)param_4 + 0x188);
          if ((((uVar3 != 0xffffffff) &&
               (puVar18 = g_pEntityList + (uVar3 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc
               )) && (*(uint *)(puVar18 + 8) == uVar3 >> 0xc)) &&
             ((*(int *)(puVar18 + 4) != 0 &&
              ((cVar4 != '\x06' ||
               (iVar17 = CBaseEntity::GetRootMoveParent(param_4),
               *(char *)(iVar17 + 0x186) != '\x06')))))) {
            bVar19 = true;
          }
          uVar3 = *(uint *)(param_5 + 0x188);
          if ((((uVar3 != 0xffffffff) &&
               (puVar18 = g_pEntityList + (uVar3 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc
               )) && ((*(uint *)(puVar18 + 8) == uVar3 >> 0xc && (*(int *)(puVar18 + 4) != 0)))) &&
             ((PVar1 != (PhysicsCollisionRulesCache_t)0x6 ||
              (iVar17 = CBaseEntity::GetRootMoveParent((CBaseEntity *)param_5),
              *(char *)(iVar17 + 0x186) != '\x06')))) {
            bVar20 = true;
          }
          if ((((!bVar19) || (cVar6 = (**(code **)(*(int *)param_3 + 0x2c))(param_3), cVar6 != '\0')
               ) && ((!bVar20 ||
                     ((cVar6 = (**(code **)(*(int *)param_2 + 0x2c))(param_2), cVar6 != '\0' &&
                      (!bVar19)))))) &&
             (((iVar17 = (**(code **)(*(int *)param_2 + 0x120))(param_2), iVar17 == 0 ||
               (iVar17 = (**(code **)(*(int *)param_3 + 0x120))(param_3), iVar17 == 0)) &&
              ((iVar15 != 0 && (iVar11 != 0)))))) {
            if (((uVar16 | uVar12) & 4) == 0) {
              if ((((((uVar12 & 8) == 0) || (iVar15 == 6)) || (iVar15 == 1)) ||
                  (PVar1 == (PhysicsCollisionRulesCache_t)0x6)) &&
                 ((((uVar16 & 8) == 0 || (iVar11 == 6)) || ((iVar11 == 1 || (cVar4 == '\x06')))))) {
                cVar4 = (**(code **)(*g_pGameRules + 0x74))
                                  (g_pGameRules,*(undefined4 *)((int)param_4 + 0x234),
                                   *(undefined4 *)(param_5 + 0x234));
                bVar5 = 0;
                if (cVar4 != '\0') {
                  uVar12 = (**(code **)(*(int *)param_2 + 0xa4))(param_2);
                  uVar16 = (**(code **)(*(int *)param_5 + 0x2c8))(param_5);
                  if ((uVar12 & uVar16) != 0) {
                    uVar12 = (**(code **)(*(int *)param_3 + 0xa4))(param_3);
                    uVar16 = (**(code **)(*(int *)param_4 + 0x2c8))(param_4);
                    if (((uVar12 & uVar16) != 0) &&
                       (cVar4 = (**(code **)(*g_EntityCollisionHash + 0x10))
                                          (g_EntityCollisionHash,param_4,param_5), cVar4 == '\0')) {
                      bVar5 = (**(code **)(*g_EntityCollisionHash + 0x10))
                                        (g_EntityCollisionHash,param_2,param_3);
                      bVar5 = bVar5 ^ 1;
                    }
                  }
                }
                goto LAB_00778b6a;
              }
            }
            else {
              cVar4 = (**(code **)(*(int *)param_2 + 0x10))(param_2);
              if ((cVar4 != '\0') && ((uVar16 & 4) == 0)) goto LAB_00778aeb;
              cVar4 = (**(code **)(*(int *)param_3 + 0x10))(param_3);
              if (cVar4 != '\0') {
                bVar5 = (uVar12 & 4) == 0;
                iVar11 = *(int *)(param_1 + 0x15c);
                goto LAB_00778a37;
              }
            }
          }
        }
        else {
          iVar11 = CBaseEntity::GetRootMoveParent(param_4);
          iVar15 = CBaseEntity::GetRootMoveParent((CBaseEntity *)param_5);
          if ((iVar11 != iVar15) &&
             (cVar4 = (**(code **)(*g_EntityCollisionHash + 0x10))
                                (g_EntityCollisionHash,iVar11,iVar15), cVar4 == '\0')) {
            if ((*(int *)(iVar15 + 0x238) == 0) ||
               ((*(int *)(iVar11 + 0x238) == 0 ||
                (cVar4 = (**(code **)(*g_EntityCollisionHash + 0x10))
                                   (g_EntityCollisionHash,*(int *)(iVar11 + 0x238),
                                    *(int *)(iVar15 + 0x238)), cVar4 == '\0')))) goto LAB_00778c70;
          }
        }
      }
    }
    iVar11 = *(int *)(param_1 + 0x15c);
    bVar5 = 0;
  }
LAB_00778a37:
  *(int *)(param_1 + 0x15c) = iVar11 + -1;
  return bVar5;
}

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)