mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
89
lua/entities/lvs_base/sv_shieldsystem.lua
Normal file
89
lua/entities/lvs_base/sv_shieldsystem.lua
Normal file
@@ -0,0 +1,89 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user