Files
wnsrc/lua/weapons/arccw_base/sv_shield.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

145 lines
4.4 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/
--]]
SWEP.Shields = {}
function SWEP:SetupShields()
self:KillShields()
for i, k in pairs(self.Attachments) do
if !k then continue end
if !k.Installed then continue end
local atttbl = ArcCW.AttachmentTable[k.Installed]
if atttbl.ModelIsShield then
for _, e in pairs(self:GetActiveElements()) do
local ele = self.AttachmentElements[e]
if !ele then continue end
if ((ele.AttPosMods or {})[i] or {}).wpos then
wmelemod = ele.AttPosMods[i].wpos
end
if ((ele.AttPosMods or {})[i] or {}).slide then
slidemod = ele.AttPosMods[i].slide
end
-- Refer to sh_model Line 837
if ((ele.AttPosMods or {})[i] or {}).SlideAmount then
slidemod = ele.AttPosMods[i].SlideAmount
end
end
local bonename = atttbl.ShieldBone or "ValveBiped.Bip01_R_Hand"
local boneindex = self:GetOwner():LookupBone(bonename)
local bpos, bang = self:GetOwner():GetBonePosition(boneindex)
local delta = k.SlidePos or 0.5
local offset = wmelemod or k.Offset.wpos or Vector(0, 0, 0)
if k.SlideAmount then
offset = LerpVector(delta, (slidemod or k.SlideAmount).wmin, (slidemod or k.SlideAmount).wmax)
end
local pos = offset + (atttbl.ShieldCorrectPos or Vector(0, 0, 0))
local ang = k.Offset.wang or Angle(0, 0, 0)
local apos = LocalToWorld(pos, ang, bpos, bang)
local shield = ents.Create("physics_prop")
if !shield then
print("!!! Unable to spawn shield!")
continue
end
shield.mmRHAe = atttbl.ShieldResistance
shield:SetModel( atttbl.Model )
shield:FollowBone( self:GetOwner(), boneindex )
shield:SetPos( apos )
shield:SetAngles( self:GetOwner():GetAngles() + ang + (atttbl.ShieldCorrectAng or Angle(0, 0, 0)) )
shield:SetCollisionGroup( COLLISION_GROUP_WORLD )
shield.Weapon = self
if GetConVar("developer"):GetBool() then
shield:SetColor( Color(0, 0, 0, 255) )
else
shield:SetColor( Color(0, 0, 0, 0) )
shield:SetRenderMode(RENDERMODE_NONE)
end
table.insert(self.Shields, shield)
shield:Spawn()
shield:Activate()
table.insert(ArcCW.ShieldPropPile, {Weapon = self, Model = shield})
local phys = shield:GetPhysicsObject()
phys:SetMass(1000)
end
end
for i, k in pairs(self.ShieldProps or {}) do
if !k then continue end
if !k.Model then continue end
local bonename = k.Bone or "ValveBiped.Bip01_R_Hand"
local boneindex = self:GetOwner():LookupBone(bonename)
local bpos, bang = self:GetOwner():GetBonePosition(boneindex)
local pos = k.Pos or Vector(0, 0, 0)
local ang = k.Ang or Angle(0, 0, 0)
local apos = LocalToWorld(pos, ang, bpos, bang)
local shield = ents.Create("physics_prop")
if !shield then
print("!!! Unable to spawn shield!")
continue
end
shield.mmRHAe = k.Resistance
shield:SetModel( k.Model )
shield:FollowBone( self:GetOwner(), boneindex )
shield:SetPos( apos )
shield:SetAngles( self:GetOwner():GetAngles() + ang )
shield:SetCollisionGroup( COLLISION_GROUP_WORLD )
shield.Weapon = self
if GetConVar("developer"):GetBool() then
shield:SetColor( Color(0, 0, 0, 255) )
else
shield:SetColor( Color(0, 0, 0, 0) )
shield:SetRenderMode(RENDERMODE_NONE)
end
table.insert(self.Shields, shield)
shield:Spawn()
shield:Activate()
table.insert(ArcCW.ShieldPropPile, {Weapon = self, Model = shield})
local phys = shield:GetPhysicsObject()
phys:SetMass(1000)
end
end
function SWEP:KillShields()
for i, k in pairs(self.Shields) do
SafeRemoveEntity(k)
end
end