AvoidPushawayProps
0x004710a0 · 1410 bytes · __cdecl
_Z18AvoidPushawayPropsP20CBaseCombatCharacterP8CUserCmd
Decompiled
undefined (2 params)
/* AvoidPushawayProps(CBaseCombatCharacter*, CUserCmd*) */
void AvoidPushawayProps(CBaseCombatCharacter *param_1,CUserCmd *param_2)
{
char cVar1;
QAngle *pQVar2;
int iVar3;
Vector *pVVar4;
int *piVar5;
int iVar6;
float *pfVar7;
int iVar8;
CBaseEntity *pCVar9;
longdouble lVar10;
float fVar11;
float fVar12;
float fVar13;
float local_858;
float local_854;
float local_850;
float local_84c;
float local_848;
float local_844;
float local_840;
float local_83c;
float local_838;
float local_834;
float local_830;
float local_82c;
float local_828;
float local_824;
float local_820;
CBaseEntity *local_81c [515];
cVar1 = (**(code **)(*g_pGameRules + 0x21c))(g_pGameRules);
if (cVar1 == '\0') {
AngleVectors((QAngle *)(param_2 + 0xc),(Vector *)&local_858,(Vector *)&local_84c,(Vector *)0x0);
}
else {
pQVar2 = (QAngle *)(**(code **)(*g_pGameRules + 0x220))(g_pGameRules);
AngleVectors(pQVar2,(Vector *)&local_858,(Vector *)&local_84c,(Vector *)0x0);
}
iVar3 = GetPushawayEnts(param_1,local_81c,0x200,0.0,1,(CPushAwayEnumerator *)0x0);
pVVar4 = (Vector *)(**(code **)(*(int *)param_1 + 0x288))(param_1);
if (iVar3 < 1) {
return;
}
iVar8 = 0;
do {
while ((pCVar9 = local_81c[iVar8], pCVar9 != (CBaseEntity *)0x0 &&
(piVar5 = (int *)__dynamic_cast(pCVar9,&CBaseEntity::typeinfo,
&IMultiplayerPhysics::typeinfo,0xfffffffe),
piVar5 != (int *)0x0))) {
iVar6 = (**(code **)*piVar5)(piVar5);
if (iVar6 == 1) {
lVar10 = (longdouble)(**(code **)(*piVar5 + 4))(piVar5);
pCVar9 = local_81c[iVar8];
fVar12 = (float)lVar10;
if (fVar12 <= 10.0) {
fVar12 = 10.0;
}
if (30.0 <= fVar12) {
fVar12 = 30.0;
}
if (fVar12 <= 0.0) {
fVar12 = 0.0;
}
fVar12 = fVar12 * 0.033333335;
goto LAB_004711f1;
}
LAB_00471160:
iVar8 = iVar8 + 1;
if (iVar8 == iVar3) {
return;
}
}
fVar12 = 1.0;
LAB_004711f1:
CCollisionProperty::CalcNearestPoint
((CCollisionProperty *)(pCVar9 + 0x194),pVVar4,(Vector *)&local_840);
CCollisionProperty::CalcNearestPoint
((CCollisionProperty *)(param_1 + 0x194),(Vector *)&local_840,(Vector *)&local_834);
local_828 = local_834 - local_840;
local_824 = local_830 - local_83c;
local_820 = local_82c - local_838;
lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
fVar11 = (float)lVar10;
if ((5.0 < fVar11) &&
(cVar1 = CCollisionProperty::IsPointInBounds
((CCollisionProperty *)(param_1 + 0x194),(Vector *)&local_840),
cVar1 == '\0')) goto LAB_00471160;
if ((-0.01 < local_828) && (((local_828 < 0.01 && (-0.01 < local_824)) && (local_824 < 0.01))))
{
if ((-0.01 < local_820) && (local_820 < 0.01)) {
local_824 = *(float *)(pVVar4 + 4) - local_83c;
local_820 = *(float *)(pVVar4 + 8) - local_838;
local_828 = *(float *)pVVar4 - local_840;
lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
fVar11 = (float)lVar10;
if ((local_828 <= -0.01) ||
(((0.01 <= local_828 || (local_824 <= -0.01)) || (0.01 <= local_824))))
goto LAB_004713e0;
}
if ((-0.01 < local_820) && (local_820 < 0.01)) {
pfVar7 = (float *)(**(code **)(*(int *)local_81c[iVar8] + 0x288))(local_81c[iVar8]);
local_828 = *(float *)pVVar4 - *pfVar7;
local_824 = *(float *)(pVVar4 + 4) - pfVar7[1];
local_820 = *(float *)(pVVar4 + 8) - pfVar7[2];
lVar10 = (longdouble)VectorNormalize((Vector *)&local_828);
fVar11 = (float)lVar10;
}
}
LAB_004713e0:
fVar13 = 1.0;
if (1.0 <= fVar11) {
fVar13 = fVar11;
}
fVar12 = (*(float *)(sv_pushaway_player_force._28_4_ + 0x2c) / fVar13) * fVar12;
if (*(float *)(sv_pushaway_max_player_force._28_4_ + 0x2c) <= fVar12) {
fVar12 = *(float *)(sv_pushaway_max_player_force._28_4_ + 0x2c);
}
(**(code **)(*(int *)param_1 + 0x4f0))(param_1,local_81c[iVar8]);
if ((((*(char **)(local_81c[iVar8] + 0x7c) == "func_door_rotating") ||
(cVar1 = CBaseEntity::ClassMatchesComplex(local_81c[iVar8],"func_door_rotating"),
cVar1 != '\0')) || (*(char **)(local_81c[iVar8] + 0x7c) == "prop_door_rotating")) ||
(cVar1 = CBaseEntity::ClassMatchesComplex(local_81c[iVar8],"prop_door_rotating"),
cVar1 != '\0')) {
fVar12 = fVar12 * 0.25;
}
iVar8 = iVar8 + 1;
*(float *)(param_2 + 0x18) =
local_858 * local_828 * fVar12 + local_854 * local_824 * fVar12 +
*(float *)(param_2 + 0x18) + local_850 * fVar12 * local_820;
*(float *)(param_2 + 0x1c) =
local_828 * fVar12 * local_84c + local_824 * fVar12 * local_848 +
*(float *)(param_2 + 0x1c) + fVar12 * local_820 * local_844;
if (iVar8 == iVar3) {
return;
}
} while( true );
}
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.