Files
VnUtest/garrysmod/addons/tacrp/lua/effects/tacrp_shelleffect.lua
2026-03-31 10:27:04 +03:00

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