Files
wnsrc/lua/effects/arccw_uc_shelleffect.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

178 lines
5.7 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/
--]]
EFFECT.Sounds = {}
EFFECT.Pitch = 90
EFFECT.Scale = 1.5
EFFECT.PhysScale = 1
EFFECT.Model = "models/shells/shell_57.mdl"
EFFECT.Material = nil
EFFECT.JustOnce = true
EFFECT.AlreadyPlayedSound = false
EFFECT.ShellTime = 1
EFFECT.SpawnTime = 0
EFFECT.UC_ShellColor = color_white
function EFFECT:Init(data)
local att = data:GetAttachment()
local ent = data:GetEntity()
local mag = data:GetMagnitude()
local mdl = LocalPlayer():GetViewModel()
if LocalPlayer():ShouldDrawLocalPlayer() then
mdl = ent.WMModel or ent
end
if !IsValid(ent) then self:Remove() return end
local owner = ent:GetOwner()
if owner != LocalPlayer() then
mdl = ent.WMModel or ent
end
if owner != LocalPlayer() and !GetConVar("arccw_shelleffects"):GetBool() then self:Remove() return end
if !IsValid(mdl) then self:Remove() return end
if !mdl:GetAttachment(att) then self:Remove() return end
local origin, ang = mdl:GetAttachment(att).Pos, mdl:GetAttachment(att).Ang
ang:RotateAroundAxis(ang:Right(), -90 + ent.ShellRotate)
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])
local dir = ang:Up()
local st = GetConVar("arccw_shelltime"):GetFloat()
if ent then
self.Model = ent:GetBuff_Override("Override_ShellModel") or ent.ShellModel
self.Material = ent:GetBuff_Override("Override_ShellMaterial") or ent.ShellMaterial
self.Scale = ent:GetBuff("ShellScale") or 1--ent:GetBuff_Override("Override_ShellScale") or ent.ShellScale or 1
self.PhysScale = ent:GetBuff_Override("Override_ShellPhysScale") or ent.ShellPhysScale or 1
self.Pitch = ent:GetBuff_Override("Override_ShellPitch") or ent.ShellPitch or 100
self.Sounds = ent:GetBuff_Override("Override_ShellSounds") or ent.ShellSounds
self.ShellTime = (ent.ShellTime or 0) + st
if self.Sounds == "autocheck" and ent:GetPrimaryAmmoType() then
local t = ent:GetPrimaryAmmoType()
if t == game.GetAmmoID("buckshot") then
self.Sounds = ArcCW.ShotgunShellSoundsTable
elseif ent.Trivia_Calibre and string.find(ent.Trivia_Calibre, ".22") then
self.Sounds = ArcCW.TinyShellSoundsTable
elseif t == game.GetAmmoID("pistol") or t == game.GetAmmoID("357") or t == game.GetAmmoID("AlyxGun") then
self.Sounds = ArcCW.PistolShellSoundsTable
elseif t == game.GetAmmoID("ar2") then
self.Sounds = ArcCW.MediumShellSoundsTable
else
self.Sounds = ArcCW.ShellSoundsTable
end
end
self.UC_ShellColor = ent:GetBuff_Override("Override_UC_ShellColor") or ent.UC_ShellColor or self.UC_ShellColor
end
self:SetPos(origin)
self:SetModel(self.Model)
self:SetModelScale(self.Scale)
self:DrawShadow(true)
self:SetAngles(ang)
if self.Material then
self:SetMaterial(self.Material)
end
local pb_vert = 2 * self.Scale * self.PhysScale
local pb_hor = 0.5 * self.Scale * self.PhysScale
self:PhysicsInitBox(Vector(-pb_vert,-pb_hor,-pb_hor), Vector(pb_vert,pb_hor,pb_hor))
self:SetCollisionGroup(COLLISION_GROUP_INTERACTIVE_DEBRIS)
local phys = self:GetPhysicsObject()
local plyvel = Vector(0, 0, 0)
if IsValid(owner) then
plyvel = 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))
self.HitPitch = self.Pitch + math.Rand(-5,5)
local emitter = ParticleEmitter(origin)
for i = 1, 3 do
local particle = emitter:Add("particles/smokey", origin + (dir * 2))
if (particle) then
particle:SetVelocity(VectorRand() * 10 + (dir * i * math.Rand(48, 64)) + plyvel)
particle:SetLifeTime(0)
particle:SetDieTime(math.Rand(0.05, 0.15))
particle:SetStartAlpha(math.Rand(40, 60))
particle:SetEndAlpha(0)
particle:SetStartSize(0)
particle:SetEndSize(math.Rand(18, 24))
particle:SetRoll(math.rad(math.Rand(0, 360)))
particle:SetRollDelta(math.Rand(-1, 1))
particle:SetLighting(true)
particle:SetAirResistance(96)
particle:SetGravity(Vector(-7, 3, 20))
particle:SetColor(150, 150, 150)
end
end
self.SpawnTime = CurTime()
end
function EFFECT:PhysicsCollide()
if self.AlreadyPlayedSound and self.JustOnce then return end
sound.Play(self.Sounds[math.random(#self.Sounds)], self:GetPos(), 65, self.HitPitch, 1)
self.AlreadyPlayedSound = true
end
function EFFECT:Think()
if (self.SpawnTime + self.ShellTime) <= CurTime() then
if !IsValid(self) then return end
self:SetRenderFX( kRenderFxFadeFast )
if (self.SpawnTime + self.ShellTime + 1) <= CurTime() then
if !IsValid(self:GetPhysicsObject()) then return end
self:GetPhysicsObject():EnableMotion(false)
if (self.SpawnTime + self.ShellTime + 1.5) <= CurTime() then
self:Remove()
return
end
end
end
return true
end
function EFFECT:Render()
if !IsValid(self) then return end
self:DrawModel()
end