Revision Difference
GM:HandlePlayerArmorReduction#563725
<function name="HandlePlayerArmorReduction" parent="GM" type="hook">
<description>Called to handle player armor reduction, when player receives damage.
<validate>Clarify hook order with other damage hooks.</validate>
</description>
<added>2023.11.03</added>⤶
<realm>Server</realm>
<file line="829-L861">gamemodes/base/gamemode/player.lua</file>⤶
<args>
<arg type="Player" name="ply">The player that took damage.</arg>
<arg type="CTakeDamageInfo" name="dmginfo">The taken damage.</arg>
</args>
</function>
<example>
<description>The default Half-Life 2 armor reduction system.</description>
<code>
function GM:HandlePlayerArmorReduction( ply, dmginfo )
-- If no armor, or special damage types, bypass armor
if ( ply:Armor() <= 0 || bit.band( dmginfo:GetDamageType(), DMG_FALL + DMG_DROWN + DMG_POISON + DMG_RADIATION ) != 0 ) then return end
local flBonus = 1.0 -- Each Point of Armor is worth 1/x points of health
local flRatio = 0.2 -- Armor Takes 80% of the damage
if ( GetConVar( "player_old_armor" ):GetBool() ) then
flBonus = 0.5
end
local flNew = dmginfo:GetDamage() * flRatio
local flArmor = (dmginfo:GetDamage() - flNew) * flBonus
if ( !GetConVar( "player_old_armor" ):GetBool() ) then
if ( flArmor < 1.0 ) then flArmor = 1.0 end
end
-- Does this use more armor than we have?
if ( flArmor > ply:Armor() ) then
flArmor = ply:Armor() * ( 1 / flBonus )
flNew = dmginfo:GetDamage() - flArmor
ply:SetArmor( 0 )
else
ply:SetArmor( ply:Armor() - flArmor )
end
dmginfo:SetDamage( flNew )
end
</code>
</example>