mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
89 lines
2.1 KiB
Lua
89 lines
2.1 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
ENT.ShieldRechargeDelay = 5
|
|
ENT.ShieldRechargeRate = 1
|
|
ENT.ShieldBlockableTypes = {
|
|
[1] = DMG_BULLET,
|
|
[2] = DMG_AIRBOAT,
|
|
[3] = DMG_BUCKSHOT,
|
|
[4] = DMG_SNIPER,
|
|
}
|
|
|
|
function ENT:CalcShieldDamage( dmginfo )
|
|
local MaxShield = self:GetMaxShield()
|
|
|
|
if MaxShield <= 0 then return end
|
|
|
|
local DMG_ENUM = DMG_GENERIC
|
|
for _, ENUM in ipairs( self.ShieldBlockableTypes ) do
|
|
DMG_ENUM = DMG_ENUM + ENUM
|
|
end
|
|
|
|
if not dmginfo:IsDamageType( DMG_ENUM ) then return end
|
|
|
|
self:DelayNextShieldRecharge( self.ShieldRechargeDelay )
|
|
|
|
local DamageRemaining = self:TakeShieldDamage( dmginfo:GetDamage() )
|
|
|
|
dmginfo:SetDamage( DamageRemaining )
|
|
|
|
self:OnTakeShieldDamage( dmginfo )
|
|
end
|
|
|
|
function ENT:CanShieldRecharge()
|
|
return (self.NextShieldRecharge or 0) < CurTime()
|
|
end
|
|
|
|
function ENT:DelayNextShieldRecharge( delay )
|
|
self.NextShieldRecharge = CurTime() + delay
|
|
end
|
|
|
|
function ENT:ShieldThink()
|
|
local MaxShield = self:GetMaxShield()
|
|
|
|
if MaxShield <= 0 or self:GetShieldPercent() == 1 then return end
|
|
|
|
if not self:CanShieldRecharge() then return end
|
|
|
|
local Cur = self:GetShield()
|
|
local Rate = FrameTime() * 20 * self.ShieldRechargeRate
|
|
|
|
self:SetShield( Cur + math.Clamp(MaxShield - Cur,-Rate,Rate) )
|
|
end
|
|
|
|
function ENT:TakeShieldDamage( damage )
|
|
local cur = self:GetShield()
|
|
local sub = cur - damage
|
|
local new = math.Clamp( sub , 0, self:GetMaxShield() )
|
|
|
|
self:SetShield( new )
|
|
|
|
if sub < 0 then
|
|
return math.abs( sub )
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
|
|
function ENT:OnTakeShieldDamage( dmginfo )
|
|
if dmginfo:GetDamage() ~= 0 then return end
|
|
|
|
local dmgNormal = -dmginfo:GetDamageForce():GetNormalized()
|
|
local dmgPos = dmginfo:GetDamagePosition()
|
|
|
|
dmginfo:SetDamagePosition( dmgPos + dmgNormal * 250 * self:GetShieldPercent() )
|
|
|
|
local effectdata = EffectData()
|
|
effectdata:SetOrigin( dmginfo:GetDamagePosition() )
|
|
effectdata:SetEntity( self )
|
|
util.Effect( "lvs_shield_impact", effectdata )
|
|
end |