zombiesurvival-evolved/gamemodes/zombiesurvival/entities/effects/tracer_colossus.lua

117 lines
3.8 KiB
Lua
Raw Permalink Normal View History

-- Partially based on the Railgun from AS:S, and the Gluon
EFFECT.LifeTime = 0.3
function EFFECT:GetDelta()
return math.Clamp(self.DieTime - CurTime(), 0, self.LifeTime) / self.LifeTime
end
function EFFECT:Init(data)
self.StartPos = self:GetTracerShootPos(data:GetStart(), data:GetEntity(), data:GetAttachment())
self.EndPos = data:GetOrigin()
self.HitNormal = data:GetNormal() * -1
self.Color = Color(150,155,255)
self.LifeTime = 0.15 + 0.013 * ((self.StartPos - self.EndPos):Length() ^ 0.5) -- Keep the particle relatively constant speed
self.DieTime = CurTime() + self.LifeTime
local emitter = ParticleEmitter(self.EndPos)
emitter:SetNearClip(24, 32)
local r, g, b = self.Color.r, self.Color.g, self.Color.b
local randmin, randmax = -40, 40
local normal = (self.EndPos - self.StartPos)
normal:Normalize()
for i = -100, self.EndPos:Distance(self.StartPos), 20 do
local pos = self.StartPos + normal * i + VectorRand():GetNormalized() * math.Rand(randmin, randmax)
local dietime = math.Rand(1, 2)
local startsize = 1 + math.Rand(0.5, 1.5) * 2
local rolldelta = math.Rand(-16, 16)
local roll = math.Rand(0, 360)
local vel = math.Rand(192, 256) * normal
local particle = emitter:Add("sprites/glow04_noz", pos)
particle:SetDieTime(dietime)
particle:SetStartAlpha(255)
particle:SetEndAlpha(0)
particle:SetStartSize(startsize)
particle:SetRoll(roll)
particle:SetRollDelta(rolldelta)
particle:SetVelocity(vel * 4)
particle:SetGravity(vel * -7)
particle:SetAirResistance(20)
particle:SetColor(r, g, b)
end
self.QuadPos = self.EndPos + self.HitNormal
for i=1, 20 do
local particle = emitter:Add("effects/blueflare1", self.QuadPos)
local vel = VectorRand():GetNormal() * 160
particle:SetDieTime(1.5)
particle:SetColor(130,200,230)
particle:SetStartAlpha(200)
particle:SetEndAlpha(0)
particle:SetStartSize(11)
particle:SetEndSize(0)
particle:SetVelocity(vel)
particle:SetGravity(vel * -0.7)
end
emitter:Finish()
end
function EFFECT:Think()
return CurTime() < self.DieTime
end
local matBeam2 = Material("trails/physbeam")
local matGlow = Material("effects/select_ring")
local matFlare = Material("sprites/glow04_noz")
function EFFECT:Render()
local delta = self:GetDelta()
if delta <= 0 then return end
self.Color.a = delta * 155
local startpos = self.StartPos
local endpos = self.QuadPos
local size = delta * 50
render.SetMaterial(matBeam2)
render.DrawBeam(startpos, endpos, size * 0.5, 1, 0, self.Color)
render.DrawBeam(startpos, endpos, size, 1, 0, self.Color)
local texcoord = math.Rand( 0, 1 )
local distancevector = (startpos - endpos)
local dir = distancevector:Angle()
local dfwd = dir:Forward()
local dup = dir:Up()
local drgt = dir:Right()
local nlen = distancevector:Length()
local prevspinpos, prevspinpos2 = startpos, startpos
for i = 0, nlen * (1 - delta), 32 do
local set = i - CurTime() * 7
local spinbeamsize = (1 - delta) * 15
local basebeampos = startpos - dfwd * i
local spinbeampos = basebeampos + dup * math.sin(set) * spinbeamsize + drgt * math.cos(set) * spinbeamsize
local spinbeampos2 = basebeampos - dup * math.sin(set) * spinbeamsize - drgt * math.cos(set) * spinbeamsize
render.DrawBeam(prevspinpos, spinbeampos, 4, texcoord + i, texcoord + 1 + i, Color(90, 90, 255, self.Color.a))
render.DrawBeam(prevspinpos2, spinbeampos2, 4, texcoord + i, texcoord + 1 + i, Color(90, 90, 255, self.Color.a))
prevspinpos = spinbeampos
prevspinpos2 = spinbeampos2
end
local ringpos = startpos - (dfwd * (1 - delta) * nlen)
render.SetMaterial(matGlow)
render.DrawSprite(ringpos, 24, 24, self.Color)
render.SetMaterial(matFlare)
render.DrawSprite(ringpos, 150, 150, self.Color)
render.DrawSprite(ringpos, 20, 170, self.Color)
render.DrawSprite(ringpos, 220, 20, self.Color)
render.DrawSprite(self.QuadPos, 255-self.Color.a, 255-self.Color.a, self.Color)
end