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 intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.