117 lines
3.8 KiB
Lua
117 lines
3.8 KiB
Lua
|
-- 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
|