CFuelBarrelPiece::VPhysicsCollision
0x00903a40 · 1390 bytes · __thiscall
_ZN16CFuelBarrelPiece17VPhysicsCollisionEiP21gamevcollisionevent_t
Decompiled
undefined (3 params)
/* CFuelBarrelPiece::VPhysicsCollision(int, gamevcollisionevent_t*) */
void __thiscall
CFuelBarrelPiece::VPhysicsCollision
(CFuelBarrelPiece *this,int param_1,gamevcollisionevent_t *param_2)
{
char *pcVar1;
int *piVar2;
uint uVar3;
undefined4 *puVar4;
char *pcVar5;
int iVar6;
undefined1 local_104 [16];
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
float local_e0;
CTraceFilterSimple local_dc [16];
float local_cc;
float local_c8;
float local_c4;
float local_bc;
float local_b8;
float local_b4;
undefined4 local_ac;
undefined4 local_a8;
undefined4 local_a4;
undefined4 local_9c;
undefined4 local_98;
undefined4 local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
Vector local_70 [12];
Vector local_64 [54];
byte local_2e;
CPhysicsProp::VPhysicsCollision((CPhysicsProp *)this,param_1,param_2);
if (*(int *)(fuel_barrel_debug._28_4_ + 0x30) < 2) {
iVar6 = (param_1 == 0) + 0x18;
}
else {
Msg("====> prop_fuel_barrel_piece collision <====\n");
uVar3 = (uint)(param_1 == 0);
iVar6 = uVar3 + 0x18;
if (*(int *)(param_2 + iVar6 * 4 + 8) == 0) {
pcVar5 = "NULL";
}
else {
pcVar1 = *(char **)(*(int *)(param_2 + iVar6 * 4 + 8) + 0x7c);
pcVar5 = "";
if (pcVar1 != (char *)0x0) {
pcVar5 = pcVar1;
}
}
Msg("other: %s\n",pcVar5);
Msg("preVelocity this : %f, %f, %f\n",(double)*(float *)(param_2 + param_1 * 0xc + 0x20),
(double)*(float *)(param_2 + param_1 * 0xc + 0x24),
(double)*(float *)(param_2 + param_1 * 0xc + 0x28));
Msg("preVelocity other : %f, %f, %f\n",(double)*(float *)(param_2 + uVar3 * 0xc + 0x20),
(double)*(float *)(param_2 + uVar3 * 0xc + 0x24),
(double)*(float *)(param_2 + uVar3 * 0xc + 0x28));
Msg("postVelocity this : %f, %f, %f\n",(double)*(float *)(param_2 + param_1 * 0xc + 0x38),
(double)*(float *)(param_2 + param_1 * 0xc + 0x3c),
(double)*(float *)(param_2 + param_1 * 0xc + 0x40));
Msg("postVelocity other: %f, %f, %f\n",(double)*(float *)(param_2 + uVar3 * 0xc + 0x38),
(double)*(float *)(param_2 + uVar3 * 0xc + 0x3c),
(double)*(float *)(param_2 + uVar3 * 0xc + 0x40));
}
piVar2 = *(int **)(param_2 + iVar6 * 4 + 8);
if (piVar2 != (int *)0x0) {
(**(code **)(**(int **)(param_2 + 0x1c) + 4))(*(int **)(param_2 + 0x1c),&local_f4);
(**(code **)**(undefined4 **)(param_2 + 0x1c))(*(undefined4 **)(param_2 + 0x1c),&local_e8);
if (param_1 == 0) {
local_e0 = -local_e0;
local_e4 = -local_e4;
local_e8 = -local_e8;
}
local_88 = 1;
local_c8 = local_e4 + local_f0;
local_c4 = local_ec + local_e0;
local_cc = local_e8 + local_f4;
local_94 = 0;
local_b8 = (local_f0 - local_e4) - local_c8;
local_98 = 0;
local_b4 = (local_ec - local_e0) - local_c4;
local_9c = 0;
local_a4 = 0;
local_bc = (local_f4 - local_e8) - local_cc;
local_a8 = 0;
local_ac = 0;
local_8c = 0;
local_87 = local_b4 * local_b4 + local_b8 * local_b8 + local_bc * local_bc != 0.0;
CTraceFilterSimple::CTraceFilterSimple
(local_dc,(IHandleEntity *)this,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))(enginetrace,(Vector *)&local_cc,0x200400b,local_dc);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,local_64,0xff,0,0,true,-1.0);
}
if (((local_2e & 4) == 0) && ((*(byte *)(piVar2 + 0x6d) & 0x28) == 0)) {
if (*(int *)(fuel_barrel_debug._28_4_ + 0x30) != 0) {
NDebugOverlay::Cross3D((Vector *)&local_f4,10.0,0xff,0,0,true,5.0);
local_c8 = local_e4 * 20.0 + local_f0;
local_c4 = local_e0 * 20.0 + local_ec;
local_cc = local_e8 * 20.0 + local_f4;
NDebugOverlay::Line((Vector *)&local_f4,(Vector *)&local_cc,0xff,0,0,true,5.0);
}
if ((*(float *)(param_2 + param_1 * 0xc + 0x28) < 0.0) &&
(*(float *)(param_2 + param_1 * 0xc + 0x28) < *(float *)(param_2 + param_1 * 0xc + 0x40)))
{
puVar4 = (undefined4 *)(**(code **)(*piVar2 + 0xc))(piVar2);
*(undefined4 *)(this + 0x1464) = *puVar4;
CBaseEntity::ThinkSet
((_func_void *)local_104,(float)this,(char *)CBreakableProp::BreakThink);
CBaseEntity::SetNextThink((CBaseEntity *)this,*(float *)(gpGlobals + 0xc),(char *)0x0);
}
}
}
return;
}
SourceMod gamedata
paste intoaddons/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.
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.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.