Code:
public plugin_init()
{
set_task(0.1, "HandleFallDamageTask", TASK_FALLDAMAGE, .flags = "b");
RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage");
}
public HandleFallDamageTask(iTaskId)
{
new Players[MAX_PLAYERS], iPlayerCount;
get_players(Players, iPlayerCount, "ach");
new Float:vecOrigin[3], Float:vecEnd[3], Float:flFallVelocity, Float:flFraction, i, pPlayer, hTr;
hTr = create_tr2();
for (i = 0; i < iPlayerCount; i++)
{
pPlayer = Players[i];
pev(pPlayer, pev_flFallVelocity, flFallVelocity);
if (flFallVelocity > 0.0)
continue;
if (!(pev(pPlayer, pev_flags) & FL_ONGROUND))
continue;
pev(pPlayer, pev_origin, vecOrigin);
xs_vec_copy(vecOrigin, vecEnd);
if (pev(pPlayer, pev_flags) & FL_DUCKING)
vecEnd[2] -= 36.0;
else
vecEnd[2] -= 74.0;
engfunc(EngFunc_TraceLine, vecOrigin, vecEnd, IGNORE_MONSTERS, pPlayer, hTr);
get_tr2(hTr, TR_flFraction, flFraction);
if (flFraction >= 0.9)
continue;
xs_vec_copy(vecOrigin, g_vecOrigin[pPlayer]);
}
free_tr2(hTr);
}
public CBasePlayer_TakeDamage(this, pInflictor, pAttacker, Float:flDamage, bitsDamageType)
{
if (!(bitsDamageType & DMG_FALL))
return HAM_IGNORED;
set_pev(this, pev_velocity, Float:{0.0, 0.0, 0.0});
set_pev(this, pev_punchangle, Float:{0.0,0.0,0.0});
engfunc(EngFunc_SetOrigin, this, g_vecOrigin[this]);
SetHamReturnInteger(false);
return HAM_SUPERCEDE;
}