171 lines
4.6 KiB
Lua
171 lines
4.6 KiB
Lua
EFFECT.Type = 1
|
|
|
|
EFFECT.Pitch = 100
|
|
|
|
EFFECT.Model = "models/shells/shell_57.mdl"
|
|
|
|
EFFECT.AlreadyPlayedSound = false
|
|
EFFECT.ShellTime = 0.5
|
|
EFFECT.SpawnTime = 0
|
|
|
|
EFFECT.VMContext = true
|
|
|
|
function EFFECT:Init(data)
|
|
|
|
local att = data:GetAttachment()
|
|
local ent = data:GetEntity()
|
|
|
|
self.Type = data:GetFlags() or self.Type
|
|
|
|
local typetbl = TacRP.ShellTypes[self.Type]
|
|
|
|
if !IsValid(ent) then self:Remove() return end
|
|
if !IsValid(ent:GetOwner()) then self:Remove() return end
|
|
|
|
local origin, ang, dir
|
|
|
|
if ent:GetOwner() == LocalPlayer() and ent:GetValue("ScopeHideWeapon") and ent:IsInScope() then
|
|
origin = EyePos()
|
|
+ EyeAngles():Right() * ent.PassivePos.x
|
|
+ EyeAngles():Forward() * ent.PassivePos.y
|
|
+ EyeAngles():Up() * ent.PassivePos.z
|
|
ang = EyeAngles()
|
|
dir = ang:Right() -- not exactly correct but we can't rely on weapon model here
|
|
else
|
|
if LocalPlayer():ShouldDrawLocalPlayer() or ent:GetOwner() != LocalPlayer() then
|
|
mdl = ent
|
|
att = data:GetHitBox()
|
|
self.VMContext = false
|
|
else
|
|
mdl = LocalPlayer():GetViewModel()
|
|
table.insert(ent.ActiveEffects, self)
|
|
end
|
|
|
|
if !IsValid(ent) then self:Remove() return end
|
|
if !mdl or !IsValid(mdl) then self:Remove() return end
|
|
if !mdl:GetAttachment(att) then self:Remove() return end
|
|
if !typetbl then return end
|
|
|
|
origin = mdl:GetAttachment(att).Pos
|
|
ang = mdl:GetAttachment(att).Ang
|
|
|
|
-- ang:RotateAroundAxis(ang:Up(), -90)
|
|
|
|
-- ang:RotateAroundAxis(ang:Right(), (ent.ShellRotateAngle or Angle(0, 0, 0))[1])
|
|
-- ang:RotateAroundAxis(ang:Up(), (ent.ShellRotateAngle or Angle(0, 0, 0))[2])
|
|
-- ang:RotateAroundAxis(ang:Forward(), (ent.ShellRotateAngle or Angle(0, 0, 0))[3])
|
|
|
|
dir = ang:Forward()
|
|
|
|
ang:RotateAroundAxis(ang:Forward(), 0)
|
|
ang:RotateAroundAxis(ang:Up(), 0)
|
|
end
|
|
|
|
self:SetPos(origin)
|
|
self:SetModel(typetbl.Model)
|
|
self:SetModelScale(data:GetScale(), 0)
|
|
self:DrawShadow(true)
|
|
self:SetAngles(ang)
|
|
|
|
self:SetNoDraw(true)
|
|
|
|
self.Sounds = typetbl.Sounds
|
|
|
|
local pb_vert = 2
|
|
local pb_hor = 0.25
|
|
|
|
local mag = 150
|
|
|
|
self:PhysicsInitBox(Vector(-pb_vert,-pb_hor,-pb_hor), Vector(pb_vert,pb_hor,pb_hor))
|
|
|
|
self:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
|
|
|
local phys = self:GetPhysicsObject()
|
|
|
|
local plyvel = Vector(0, 0, 0)
|
|
|
|
if IsValid(ent.Owner) then
|
|
plyvel = ent.Owner:GetAbsVelocity()
|
|
end
|
|
|
|
phys:Wake()
|
|
phys:SetDamping(0, 0)
|
|
phys:SetMass(1)
|
|
phys:SetMaterial("gmod_silent")
|
|
|
|
phys:SetVelocity((dir * mag * math.Rand(1, 2)) + plyvel)
|
|
|
|
phys:AddAngleVelocity(VectorRand() * 100)
|
|
phys:AddAngleVelocity(ang:Up() * -2500 * math.Rand(0.75, 1.25))
|
|
|
|
local smoke = true
|
|
|
|
if smoke and IsValid(mdl) then
|
|
local pcf = CreateParticleSystem(mdl, "port_smoke", PATTACH_POINT_FOLLOW, att)
|
|
|
|
if IsValid(pcf) then
|
|
pcf:StartEmission()
|
|
end
|
|
|
|
local smkpcf = CreateParticleSystem(self, "shellsmoke", PATTACH_ABSORIGIN_FOLLOW, 0)
|
|
|
|
if IsValid(smkpcf) then
|
|
smkpcf:StartEmission()
|
|
end
|
|
|
|
if self.VMContext then
|
|
table.insert(ent.PCFs, pcf)
|
|
table.insert(ent.PCFs, smkpcf)
|
|
|
|
pcf:SetShouldDraw(false)
|
|
smkpcf:SetShouldDraw(false)
|
|
end
|
|
end
|
|
|
|
self.SpawnTime = CurTime()
|
|
end
|
|
|
|
function EFFECT:PhysicsCollide(colData)
|
|
if self.AlreadyPlayedSound then return end
|
|
local phys = self:GetPhysicsObject()
|
|
phys:SetVelocityInstantaneous(colData.HitNormal * -150)
|
|
|
|
sound.Play(self.Sounds[math.random(#self.Sounds)], self:GetPos(), 65, 100, 1)
|
|
self:StopSound("Default.ImpactHard")
|
|
self.VMContext = false
|
|
self:SetNoDraw(false)
|
|
|
|
self.AlreadyPlayedSound = true
|
|
end
|
|
|
|
function EFFECT:Think()
|
|
if self:GetVelocity():Length() > 0 then self.SpawnTime = CurTime() end
|
|
self:StopSound("Default.ScrapeRough")
|
|
|
|
if (self.SpawnTime + self.ShellTime) <= CurTime() then
|
|
if !IsValid(self) then return end
|
|
self:SetRenderFX( kRenderFxFadeFast )
|
|
if (self.SpawnTime + self.ShellTime + 0.25) <= CurTime() then
|
|
if !IsValid(self:GetPhysicsObject()) then return end
|
|
self:GetPhysicsObject():EnableMotion(false)
|
|
if (self.SpawnTime + self.ShellTime + 0.5) <= CurTime() then
|
|
self:Remove()
|
|
return
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function EFFECT:Render()
|
|
if !IsValid(self) then return end
|
|
|
|
self:DrawModel()
|
|
end
|
|
|
|
function EFFECT:DrawTranslucent()
|
|
if !IsValid(self) then return end
|
|
|
|
self:DrawModel()
|
|
end
|