78 lines
2.3 KiB
Lua
78 lines
2.3 KiB
Lua
|
util.PrecacheSound("physics/flesh/flesh_bloody_break.wav")
|
||
|
|
||
|
local function CollideCallback(oldparticle, hitpos, hitnormal)
|
||
|
if oldparticle:GetDieTime() == 0 then return end
|
||
|
oldparticle:SetDieTime(0)
|
||
|
|
||
|
local pos = hitpos + hitnormal
|
||
|
|
||
|
if math.random(3) == 3 then
|
||
|
sound.Play("physics/flesh/flesh_squishy_impact_hard"..math.random(4)..".wav", hitpos, 50, math.Rand(95, 105))
|
||
|
end
|
||
|
util.Decal("Blood", pos, hitpos - hitnormal)
|
||
|
end
|
||
|
|
||
|
local vecGravity = Vector(0, 0, -500)
|
||
|
function EFFECT:Init(data)
|
||
|
local ent = data:GetEntity()
|
||
|
if not ent:IsValid() then return end
|
||
|
|
||
|
ent:EmitSound("physics/flesh/flesh_bloody_break.wav")
|
||
|
|
||
|
local basepos = ent:GetPos()
|
||
|
local vel = ent:GetVelocity()
|
||
|
local dir = vel:GetNormalized()
|
||
|
local up = ent:GetUp()
|
||
|
local speed = math.Clamp(vel:Length() * 2, 512, 2048)
|
||
|
|
||
|
local emitter = ParticleEmitter(ent:LocalToWorld(ent:OBBCenter()))
|
||
|
emitter:SetNearClip(24, 32)
|
||
|
|
||
|
for boneid = 1, ent:GetBoneCount() - 1 do
|
||
|
local pos, ang = ent:GetBonePositionMatrixed(boneid)
|
||
|
if pos and pos ~= basepos then
|
||
|
for i=1, math.random(1, 3) do
|
||
|
local heading = (VectorRand():GetNormalized() + up + dir * 2) / 4
|
||
|
local particle = emitter:Add("noxctf/sprite_bloodspray"..math.random(8), pos + heading)
|
||
|
particle:SetVelocity(speed * math.Rand(0.5, 1) * heading)
|
||
|
particle:SetDieTime(math.Rand(3, 6))
|
||
|
particle:SetStartAlpha(200)
|
||
|
particle:SetEndAlpha(200)
|
||
|
particle:SetStartSize(math.Rand(3, 4))
|
||
|
particle:SetEndSize(2)
|
||
|
particle:SetRoll(math.Rand(0, 360))
|
||
|
particle:SetRollDelta(math.Rand(-20, 20))
|
||
|
particle:SetAirResistance(8)
|
||
|
particle:SetGravity(vecGravity)
|
||
|
particle:SetCollide(true)
|
||
|
particle:SetLighting(true)
|
||
|
particle:SetColor(255, 0, 0)
|
||
|
particle:SetCollideCallback(CollideCallback)
|
||
|
end
|
||
|
|
||
|
for i=1, 4 do
|
||
|
local particle = emitter:Add("noxctf/sprite_bloodspray"..math.random(8), pos)
|
||
|
particle:SetVelocity(math.Rand(0.5, 4) * (VectorRand():GetNormalized() + dir))
|
||
|
particle:SetDieTime(math.Rand(0.75, 2))
|
||
|
particle:SetStartAlpha(230)
|
||
|
particle:SetEndAlpha(0)
|
||
|
particle:SetStartSize(math.Rand(4, 5))
|
||
|
particle:SetEndSize(3)
|
||
|
particle:SetRoll(math.Rand(0, 360))
|
||
|
particle:SetRollDelta(math.Rand(-1, 1))
|
||
|
particle:SetLighting(true)
|
||
|
particle:SetColor(255, 0, 0)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
emitter:Finish()
|
||
|
end
|
||
|
|
||
|
function EFFECT:Think()
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function EFFECT:Render()
|
||
|
end
|