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