CTankClaw::OnPlayerHit
0x0055d320 · 1236 bytes · __thiscall
_ZN9CTankClaw11OnPlayerHitEP13CTerrorPlayerb
Decompiled
undefined (3 params)
/* CTankClaw::OnPlayerHit(CTerrorPlayer*, bool) */
void __thiscall CTankClaw::OnPlayerHit(CTankClaw *this,CTerrorPlayer *param_1,bool param_2)
{
code *pcVar1;
char cVar2;
CTerrorPlayer *this_00;
int iVar3;
uint uVar4;
undefined1 uVar5;
float local_a0;
float local_9c;
float local_98;
undefined4 local_94;
undefined4 local_90;
float local_8c;
undefined4 local_88;
undefined4 local_84;
float local_80;
float local_7c;
float local_78;
float local_74;
CGameTrace local_70 [12];
Vector local_64 [32];
float local_44;
char local_3a;
char local_39;
this_00 = (CTerrorPlayer *)CTerrorWeapon::GetPlayerOwner((CTerrorWeapon *)this);
iVar3 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
cVar2 = IsASurvivorTeam(iVar3);
if (cVar2 == '\0') goto LAB_0055d359;
cVar2 = CTerrorGameRules::IsSurvivalMode();
if (cVar2 == '\0') {
LAB_0055d3dd:
cVar2 = (**(code **)(*(int *)this_00 + 0x778))(this_00);
if (((cVar2 != '\0') && (cVar2 = (**(code **)(*(int *)param_1 + 0x7e8))(param_1), cVar2 == '\0')
) && (uVar5 = param_2, *(int *)(param_1 + 0x100) < 0x21)) goto LAB_0055d768;
cVar2 = (**(code **)(*(int *)this_00 + 0x778))(this_00);
if ((cVar2 == '\0') && (param_2)) {
uVar5 = 1;
goto LAB_0055d768;
}
}
else {
iVar3 = *(int *)(this + 0x1788);
cVar2 = CTerrorWeapon::HasBeenPreviouslyHit((CTerrorWeapon *)this,(CBaseEntity *)param_1);
uVar5 = 1;
if ((int)(iVar3 + (uint)(cVar2 == '\0')) < 2) goto LAB_0055d3dd;
LAB_0055d768:
(**(code **)(*(int *)this_00 + 0x8fc))(this_00,param_1,uVar5);
}
CTerrorPlayer::OnHitSurvivorWithClaw(this_00,*(undefined4 *)(param_1 + 0x2ba0));
LAB_0055d359:
iVar3 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
cVar2 = IsASurvivorTeam(iVar3);
if ((cVar2 == '\0') || (cVar2 = (**(code **)(*(int *)param_1 + 0x7e8))(param_1), cVar2 == '\0')) {
CBaseEntity::EmitSound((CBaseEntity *)this_00,"HulkZombie.Punch",0.0,(float *)0x0);
}
else {
if ((((byte)param_1[0x14d] & 8) != 0) &&
(CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1), ((byte)param_1[0x14d] & 8) != 0))
{
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
DispatchParticleEffect
("tank_survivor_pound",*(undefined4 *)(param_1 + 0x2e0),
*(undefined4 *)(param_1 + 0x2e4),*(undefined4 *)(param_1 + 0x2e8),
*(undefined4 *)(param_1 + 0x37c),*(undefined4 *)(param_1 + 0x380),
*(undefined4 *)(param_1 + 900),0,0,0xffffffff);
CBaseEntity::EmitSound((CBaseEntity *)this_00,"HulkZombie.PunchIncap",0.0,(float *)0x0);
pcVar1 = *(code **)(*(int *)param_1 + 0x7b4);
CAI_Concept::CAI_Concept((CAI_Concept *)local_70,"PlayerGroundPoundedByTank");
(*pcVar1)(param_1,(CAI_Concept *)local_70,1,0,0,0,0);
}
iVar3 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
cVar2 = IsASurvivorTeam(iVar3);
if ((cVar2 != '\0') && (cVar2 = (**(code **)(*(int *)param_1 + 0x7e8))(param_1), cVar2 == '\0')) {
if (((byte)this_00[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this_00);
}
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
local_98 = 0.0;
local_a0 = *(float *)(param_1 + 0x2e0) - *(float *)(this_00 + 0x2e0);
local_9c = *(float *)(param_1 + 0x2e4) - *(float *)(this_00 + 0x2e4);
VectorNormalize((Vector *)&local_a0);
local_98 = 0.2;
VectorNormalize((Vector *)&local_a0);
if (param_1[0x186] == (CTerrorPlayer)0x9) {
CBaseEntity::SetMoveType((CBaseEntity *)param_1,2,0);
}
CBaseEntity::SetGroundEntity((CBaseEntity *)param_1,(CBaseEntity *)0x0);
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
local_94 = *(undefined4 *)(param_1 + 0x2e0);
local_90 = *(undefined4 *)(param_1 + 0x2e4);
local_8c = *(float *)(param_1 + 0x2e8);
local_80 = local_8c + 18.0;
local_88 = local_94;
local_84 = local_90;
uVar4 = (**(code **)(*(int *)param_1 + 0x7a0))(param_1,0);
UTIL_TraceEntity((CBaseEntity *)param_1,(Vector *)&local_94,(Vector *)&local_88,uVar4,
(IHandleEntity *)param_1,8,local_70);
if (((local_44 == 1.0) && (local_39 == '\0')) && (local_3a == '\0')) {
CBaseEntity::SetAbsOrigin((CBaseEntity *)param_1,local_64);
}
local_74 = *(float *)(ZombieTankThrowForce._28_4_ + 0x2c);
local_7c = local_a0 * local_74;
local_78 = local_9c * local_74;
local_74 = local_74 * local_98;
CBaseEntity::ApplyAbsVelocityImpulse((CBaseEntity *)param_1,(Vector *)&local_7c);
CTerrorPlayer::SetResponsibleForAirMovement(param_1,(CBaseCombatCharacter *)this_00);
(**(code **)(*(int *)param_1 + 0x7fc))(param_1,0x60,0);
CBasePlayer::ClearUseEntity((CBasePlayer *)param_1);
}
CTerrorWeapon::StartAttackTimer
((CTerrorWeapon *)this,*(float *)(ZombieTankAttackInterval._28_4_ + 0x2c));
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.