Before I start, I just want to say that I have little coding experience, and this request is something way out of my knowledge. I was just wondering how difficult it would be for someone to do this and how much time it would take. I don't want to bother anyone with this request if it's too much of an effort.
Basically, I want to try and have a physical blood system in the likes of Half Life 2 SMOD. For those that are not familiar with it, let me try and explain the best I can. I drew a shitty comic:
[IMG]http://i34.photobucket.com/albums/d146/JakeSpringhorn/bloodparticle_zps9909c73a.png[/IMG]
The first panel illustrates an [B]"invisible" entity[/B] that seems to appear when you shoot an NPC. This entity has gravity, and it seems that little [B]blood droplet particles[/B] appear out of it as it falls.
In the second panel, the entity hits the world and paints a blood decal while also emitting another [B]misty[/B] particle. When it hits the world, it also plays a sound. The entity could also hit other npcs or ragdolls and paint them with the blood decal.
Would this be difficult to accomplish? As someone with very little coding knowledge, I know it's already way out of my hands, but would someone be able to do this for me or lead me in the right direction? I'm already making the particles. I would really appreciate it.
Straight-forward. Use ParticleEmitter to emit effects. Basically when it is hit you start it and SetGravity on the blood droplets, and make a ploof of blood appear. Enable collision on the blood droplets so that when they hit the ground, you can util.AddDecal on the ground or player.
Using [url=http://wiki.garrysmod.com/page/GM/PlayerTraceAttack]PlayerTraceAttack[/url], the trace for the attack is provided so you can use trace.HitPos to get where the blood will start. Like Acecool said, use a [url=http://wiki.garrysmod.com/page/Global/ParticleEmitter]ParticleEmitter[/url]. For each particle, you will need to define the [url=http://wiki.garrysmod.com/page/CLuaParticle/SetCollideCallback]callback when it collides[/url] to [url=http://wiki.garrysmod.com/page/util/Decal]create a decal.[/url]
I think this might help. I appreciate your guys' posts, but I don't know where to go from there. I already have something really rough implemented, but it's not exactly what I want.
[CODE]
local function CollideCallback(particle, hitpos, hitnormal)
if not particle.HitAlready then
particle.HitAlready = true
local pos = hitpos + hitnormal
util.Decal("Blood", pos, hitpos - hitnormal)
particle:SetDieTime(0)
end
end
function EFFECT:Init(data)
local Pos = data:GetOrigin() + Vector(0,0,10)
local emitter = ParticleEmitter(Pos)
for i=1, data:GetMagnitude() do
local particle = emitter:Add("archysaw/sprite_bloodspray"..math.random(1,8), Pos + VectorRand() * 8)
particle:SetDieTime(math.Rand(3, 6))
particle:SetStartAlpha(230)
particle:SetEndAlpha(230)
particle:SetStartSize(math.Rand(10, 14))
particle:SetEndSize(10)
particle:SetRoll(math.Rand(0, 360))
particle:SetRollDelta(math.Rand(-20, 20))
particle:SetAirResistance(5)
particle:SetBounce(0)
particle:SetGravity(Vector(0, 0, -600))
particle:SetCollide(true)
particle:SetCollideCallback(CollideCallback)
particle:SetLighting(true)
particle:SetColor(255, 0, 0)
end
emitter:Finish()
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end
[/CODE]
This seems to simply create a decal with physical properties, but I'd like for it to be an actual particle effect (like the droplets). It creates a splatter on the world (but not on ragdolls..), but it does not emit a mist when it hits the ground nor does it create a sound...which I guess is obvious since there's nothing about sound in this snippet.
On collision for it to create a mist, you simply do the same thing as with the normal particles. On callback emit another particle before or after the decal.
I'll show you an example of something I do which is not quite what you're doing, but similar. Exhaust effects on a car; when the exhaust hits a wall it creates a stationary puff at the collision point. I did this so it doesn't look like exhaust going through the wall. You want essentially the same thing.
Take a look at the flamelet where it spawns; that is on collide.
[img]http://cloud-4.steampowered.com/ugc/3278933507608918053/82945479A938ACA5909ABAAD732FB996A3861FD8/[/img]
[lua]//
// Exhaust Effects - Josh 'Acecool' Moser
//
// Helper function
local function ExhaustEffect( ent, _e, _pos, _mat, _tab )
local p = _e:Add( _mat, _pos )
p:SetLifeTime(0);
p:SetDieTime( 0.5 );
p:SetStartSize( 10 );
p:SetEndSize( 25 );
p:SetStartSize( _tab.startsize );
p:SetStartAlpha( _tab.alpha );
p:SetEndAlpha( 0 );
p:SetStartLength( 35 );
p:SetEndLength( 10 );
p:SetVelocity( ent:GetAngles( ):Right( ) * 55 );
-- p:SetVelocityScale( -100 );
p:SetGravity( Vector( 0, 0, 100 ) );
p:SetRoll( 15 )
p:SetRollDelta( 1 )
p:SetBounce( 1 )
p:SetAirResistance( 0 )
p:SetCollide( true );
p:SetCollideCallback( function( part, hitpos, hitnormal )
local _e = LocalPlayer( ):GetEmitter( hitpos );
local p = _e:Add(_mat, hitpos)
p:SetLifeTime(0)
p:SetDieTime(math.Rand(0.25, 0.50))
p:SetStartSize(10)
p:SetEndSize(0)
p:SetStartAlpha(55)
p:SetEndAlpha(0)
p:SetStartLength(10)
p:SetEndLength(10)
-- //p:SetColor( COLOR_BLUE )
p:SetVelocity(Vector(0,0,10) + (VectorRand() * 5))
p:SetGravity(Vector(0,0,-100))
part:SetDieTime( 0.5 )
_e:Finish( );
end );
end[/lua]
And I call them using that helper-function like this:
[lua] local _pos = _v:LocalToWorld( v.pos );
local _e = LocalPlayer( ):GetEmitter( _pos );
local _ang = v.ang or ANGLE_REAR;
ExhaustEffect( _v, _e, _pos, "particles/smokey.vmt", { ang = _ang, startsize = math.random( 1, 10 ), alpha = math.random( 15, 25 ) } );
ExhaustEffect( _v, _e, _pos, "particle/particle_smokegrenade", { ang = _ang, startsize = math.random( 1, 10 ), alpha = math.random( 15, 25 ) } );
ExhaustEffect( _v, _e, _pos, "sprites/heatwave", { ang = _ang, startsize = 25, alpha = math.random( 50, 255 ) } );
if ( math.random( 1, 20 ) == 1 ) then
ExhaustEffect( _v, _e, _pos, "particles/flamelet" .. math.random( 1,5 ) .. ".vmt", { ang = _ang, startsize = 10, alpha = 15 } );
end
_e:Finish( );[/lua]
I use a particle-emitter manager I wrote to fix the new particle crash I was experiencing. It looks like this: [url]https://dl.dropboxusercontent.com/u/26074909/tutoring/particle_emitter_fix_new.lua.html[/url]
Use your on-collide, it is very useful for creating additional effects.
Sorry, you need to Log In to post a reply to this thread.