mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
145 lines
4.4 KiB
Lua
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 |