2014-10-02 08:49:54 +08:00
|
|
|
util.PrecacheSound("physics/flesh/flesh_bloody_impact_hard1.wav")
|
|
|
|
util.PrecacheSound("physics/flesh/flesh_squishy_impact_hard1.wav")
|
|
|
|
util.PrecacheSound("physics/flesh/flesh_squishy_impact_hard2.wav")
|
|
|
|
util.PrecacheSound("physics/flesh/flesh_squishy_impact_hard3.wav")
|
|
|
|
util.PrecacheSound("physics/flesh/flesh_squishy_impact_hard4.wav")
|
|
|
|
|
|
|
|
local function CollideCallbackSmall(particle, hitpos, hitnormal)
|
|
|
|
if particle:GetDieTime() == 0 then return end
|
|
|
|
particle:SetDieTime(0)
|
|
|
|
|
|
|
|
if math.random(3) == 3 then
|
|
|
|
sound.Play("physics/flesh/flesh_bloody_impact_hard1.wav", hitpos, 50, math.Rand(95, 105))
|
|
|
|
util.Decal("Impact.Flesh", hitpos + hitnormal, hitpos - hitnormal)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
local num = math.random(-4, 4)
|
|
|
|
if num < 1 then return end
|
|
|
|
|
|
|
|
local nhitnormal = hitnormal * 90
|
|
|
|
|
|
|
|
local emitter = ParticleEmitter(pos)
|
|
|
|
for i=1, num do
|
2018-05-02 06:32:59 +08:00
|
|
|
local particle = emitter:Add("!sprite_bloodspray"..math.random(8), pos)
|
2014-10-02 08:49:54 +08:00
|
|
|
particle:SetLighting(true)
|
|
|
|
particle:SetVelocity(VectorRand():GetNormalized() * math.Rand(75, 150) + nhitnormal)
|
|
|
|
particle:SetDieTime(3)
|
|
|
|
particle:SetStartAlpha(255)
|
|
|
|
particle:SetEndAlpha(255)
|
|
|
|
particle:SetStartSize(math.Rand(1.5, 2.5))
|
|
|
|
particle:SetEndSize(1.5)
|
|
|
|
particle:SetRoll(math.Rand(-25, 25))
|
|
|
|
particle:SetRollDelta(math.Rand(-25, 25))
|
|
|
|
particle:SetAirResistance(5)
|
|
|
|
particle:SetGravity(Vector(0, 0, -600))
|
|
|
|
particle:SetCollide(true)
|
|
|
|
particle:SetColor(255, 0, 0)
|
|
|
|
particle:SetCollideCallback(CollideCallbackSmall)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
emitter:Finish() emitter = nil collectgarbage("step", 64)
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function EFFECT:Init(data)
|
|
|
|
local pos = data:GetOrigin() + Vector(0, 0, 10)
|
|
|
|
|
|
|
|
local dir = data:GetNormal()
|
|
|
|
local force = data:GetScale()
|
|
|
|
|
|
|
|
local emitter = ParticleEmitter(pos)
|
|
|
|
for i=1, data:GetMagnitude() do
|
|
|
|
local heading = (VectorRand():GetNormalized() * 3 + dir) / 4
|
2018-05-02 06:32:59 +08:00
|
|
|
local particle = emitter:Add("!sprite_bloodspray"..math.random(8), pos + heading)
|
2014-10-02 08:49:54 +08:00
|
|
|
particle:SetVelocity(force * math.Rand(0.8, 1) * heading)
|
|
|
|
particle:SetDieTime(math.Rand(3, 6))
|
|
|
|
particle:SetStartAlpha(200)
|
|
|
|
particle:SetEndAlpha(200)
|
|
|
|
particle:SetStartSize(math.Rand(3, 5))
|
|
|
|
particle:SetEndSize(3)
|
|
|
|
particle:SetRoll(math.Rand(0, 360))
|
|
|
|
particle:SetRollDelta(math.Rand(-20, 20))
|
|
|
|
particle:SetAirResistance(5)
|
|
|
|
particle:SetGravity(Vector(0, 0, -600))
|
|
|
|
particle:SetCollide(true)
|
|
|
|
particle:SetLighting(true)
|
|
|
|
particle:SetColor(255, 0, 0)
|
|
|
|
particle:SetCollideCallback(CollideCallback)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
emitter:Finish() emitter = nil collectgarbage("step", 64)
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function EFFECT:Think()
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
function EFFECT:Render()
|
|
|
|
end
|