From 5721a7820ae708cec319b900289e36369a5be3a2 Mon Sep 17 00:00:00 2001 From: Harry Young Date: Mon, 12 Dec 2011 13:27:05 +0100 Subject: [PATCH] Readded cooking_steam and added toggle-functionality to fire, particlefire and electricfire Signed-off-by: Harry Young --- cgame/cg_env.c | 36 ++++++------ cgame/cg_event.c | 6 +- cgame/cg_local.h | 2 +- game/g_fx.c | 139 +++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 152 insertions(+), 31 deletions(-) diff --git a/cgame/cg_env.c b/cgame/cg_env.c index 725e99f..c3fec76 100644 --- a/cgame/cg_env.c +++ b/cgame/cg_env.c @@ -1086,9 +1086,9 @@ qboolean ParticleFire_Think(localEntity_t *le) { return qtrue; } -void CG_ParticleFire(vec3_t origin, int size) { +void CG_ParticleFire(vec3_t origin, int killtime, int size) { localEntity_t *le; - le = FX_AddSpawner(origin, NULL, NULL, NULL, qfalse, 0, 0, 10000, ParticleFire_Think, 10); + le = FX_AddSpawner(origin, NULL, NULL, NULL, qfalse, 0, 0, killtime, ParticleFire_Think, 10); //le->data.spawner.data1 = size; } @@ -1328,7 +1328,7 @@ void CG_FireLaser( vec3_t start, vec3_t end, vec3_t normal, vec3_t laserRGB, flo alpha, 0.0f, laserRGB, laserRGB, 125, - cgs.media.whiteLaserShader ); /* FIXME: FX_AddLine3 not defined */ + cgs.media.whiteLaserShader ); FX_AddLine( start, end, 1.0f, @@ -1407,7 +1407,7 @@ void CG_AimLaser( vec3_t start, vec3_t end, vec3_t normal ) random() * 0.2 + 0.2, 0.1f, lRGB, lRGB, 150, - cgs.media.whiteLaserShader ); /* FIXME: FX_AddLine3 not defined */ + cgs.media.whiteLaserShader ); FX_AddLine( start, end, 1.0f, @@ -1450,7 +1450,7 @@ CG_CookingSteam Creates a basic cooking steam effect ====================== */ -/*void CG_CookingSteam( vec3_t origin, float radius ) +void CG_CookingSteam( vec3_t origin, float radius ) { vec3_t dir; @@ -1459,6 +1459,7 @@ Creates a basic cooking steam effect FX_AddSprite( origin, dir, qfalse, radius, radius * 2, 0.4F, 0.0, 0, 0, 1000, cgs.media.steamShader ); } + /* ====================== CG_ElectricFire @@ -1467,23 +1468,23 @@ Creates an electric fire effect ====================== */ -/*void CG_ElectricFire( vec3_t origin, vec3_t normal ) +void CG_ElectricFire( vec3_t origin, vec3_t normal ) { - FXTrail *particle; + void *particle; vec3_t dir, direction, start, end; - vec3_t velocity, accel; + vec3_t velocity; float scale, alpha; - int numSparks; + int numSparks, i, j; AngleVectors( normal, normal, NULL, NULL); numSparks = 4 + (random() * 8.0f); - for ( int i = 0; i < numSparks; i++ ) + for ( i = 0; i < numSparks; i++ ) { scale = 0.3f + (random() *0.4); - for ( int j = 0; j < 3; j ++ ) + for ( j = 0; j < 3; j ++ ) dir[j] = normal[j] + (0.4f * crandom()); VectorNormalize(dir); @@ -1505,11 +1506,10 @@ Creates an electric fire effect scale = 0.5f + (random() * 0.5f); VectorScale( normal, 300, velocity ); - VectorSet( accel, 0, 0, -600 ); particle = FX_AddTrail( start, velocity, - accel, + qtrue, 6.0f, -24.0f, scale, @@ -1518,13 +1518,15 @@ Creates an electric fire effect 0.5f, 0.0f, 200.0f, - cgs.media.sparkShader, - FXF_BOUNCE ); + cgs.media.sparkShader); if ( particle == NULL ) return; - FXE_Spray( dir, 200, 200, 0.2f, 300, (FXPrimitive *) particle ); + VectorMA( origin, 1, normal, direction ); + VectorSet( velocity, 0, 0, 8 ); + + FXE_Spray( dir, 200, 200, 0.2f, velocity); VectorMA( origin, 1, normal, direction ); VectorSet( velocity, 0, 0, 8 ); @@ -1536,7 +1538,7 @@ Creates an electric fire effect FX_AddSprite( direction, velocity, - NULL, + qfalse, scale, scale, alpha, diff --git a/cgame/cg_event.c b/cgame/cg_event.c index 7fdbf8f..f471d97 100644 --- a/cgame/cg_event.c +++ b/cgame/cg_event.c @@ -1729,7 +1729,7 @@ case EV_SHAKE_SOUND: case EV_FX_PARTICLEFIRE: DEBUGNAME("EV_FX_PARTICLEFIRE"); - CG_ParticleFire(cent->currentState.origin, cent->currentState.eventParm); + CG_ParticleFire(cent->currentState.origin, cent->currentState.time2, cent->currentState.eventParm); break; case EV_SHOOTER_SOUND: @@ -1793,7 +1793,7 @@ case EV_SHAKE_SOUND: case EV_FX_COOKING_STEAM: DEBUGNAME("EV_FX_COOKING_STEAM"); - //CG_CookingSteam( cent->lerpOrigin, cent->currentState.angles[0] ); + CG_CookingSteam( cent->currentState.origin, cent->currentState.angles[0] ); break; case EV_FX_ELECFIRE: @@ -1803,7 +1803,7 @@ case EV_SHAKE_SOUND: { //cgi_S_StartSound (NULL, es->number, CHAN_BODY, cgi_S_RegisterSound ( va("sound/ambience/spark%d.wav", Q_irand(1,6)) )); } - //CG_ElectricFire( cent->lerpOrigin, cent->currentState.angles ); + CG_ElectricFire( cent->currentState.origin, cent->currentState.angles ); break; case EV_FX_FORGE_BOLT: diff --git a/cgame/cg_local.h b/cgame/cg_local.h index b209ebc..820eac0 100644 --- a/cgame/cg_local.h +++ b/cgame/cg_local.h @@ -2056,7 +2056,7 @@ void CG_ElectricalExplosion( vec3_t start, vec3_t dir, float radius ); void CG_PhaserFX(centity_t *cent); void CG_DisruptorFX(centity_t *cent); //RPG-X | Harry Young | 03.12.2011 void CG_TorpedoFX(centity_t *cent); -void CG_ParticleFire(vec3_t origin, int size); +void CG_ParticleFire(vec3_t origin, int killtime, int size); void CG_ShowTrigger(centity_t *cent); // Additional ports from SP by Harry Young diff --git a/game/g_fx.c b/game/g_fx.c index e072c6d..a92725e 100644 --- a/game/g_fx.c +++ b/game/g_fx.c @@ -1018,15 +1018,35 @@ void SP_fx_torpedo(gentity_t *ent) { ent->nextthink = level.time + 1000; } -/*QUAKED fx_particle_fire (0 0 1) (-8 -8 -8) (8 8 8) +/*QUAKED fx_particle_fire (0 0 1) (-8 -8 -8) (8 8 8) STARTOFF A particle based fire effect. Use this sparingly as it is an fps killer. If you want to use a bunch of fires use fx_fire. +"targetname" - toggles effect on/off whenver used, requires 10x mor thinks "size" how big the fire shoud be (default: 10) */ void particleFire_think(gentity_t *ent) { G_AddEvent(ent, EV_FX_PARTICLEFIRE, ent->count); - ent->nextthink = level.time + 10000; //refresh every 10 seconds + if (ent->targetname) + ent->nextthink = level.time + 1000; + else + ent->nextthink = level.time + 10000; +} + +void particleFire_use( gentity_t *self, gentity_t *other, gentity_t *activator) +{ + if ( self->count ) + { + self->think = NULL; + self->nextthink = -1; + } + else + { + self->think = particleFire_think; + self->nextthink = level.time + 200; + } + + self->count = !self->count; } void SP_fx_particleFire(gentity_t *ent) { @@ -1036,23 +1056,65 @@ void SP_fx_particleFire(gentity_t *ent) { ent->count = 10; else ent->count = size; + + if (ent->targetname) + ent->s.time2 = 1000; + else + ent->s.time2 = 10000; + trap_LinkEntity(ent); - ent->nextthink = level.time + 1000; - ent->think = particleFire_think; + + if (ent->targetname) + { + ent->use = particleFire_use; + } + + ent->count = !(ent->spawnflags & 1); + + if (!ent->targetname || !(ent->spawnflags & 1) ) + { + ent->think = particleFire_think; + ent->nextthink = level.time + 2000; + } + else + { + ent->think = NULL; + ent->nextthink = -1; + } } -/*QUAKED fx_fire (0 0 1) (-8 -8 -8) (8 8 8) +/*QUAKED fx_fire (0 0 1) (-8 -8 -8) (8 8 8) STARTOFF A fire affect based on the adminguns fire effect. +"targetname" - toggles effect on/off whenver used, requires 10x mor thinks "size" how big the fire shoud be (default: 64) "angles" fires angles (default: 0 0 0 = UP) */ void fire_think(gentity_t *ent) { G_AddEvent(ent, EV_FX_FIRE, 1); + if (ent->targetname) + ent->nextthink = level.time + 1000; + else ent->nextthink = level.time + 10000; } +void fire_use( gentity_t *self, gentity_t *other, gentity_t *activator) +{ + if ( self->count ) + { + self->think = NULL; + self->nextthink = -1; + } + else + { + self->think = fire_think; + self->nextthink = level.time + 200; + } + + self->count = !self->count; +} + void SP_fx_fire(gentity_t *ent) { int size; G_SpawnInt("size", "64", &size); @@ -1061,10 +1123,31 @@ void SP_fx_fire(gentity_t *ent) { else ent->s.time = size; ent->s.angles2[2] = 1; - ent->s.time2 = 10000; + + if (ent->targetname) + ent->s.time2 = 1000; + else + ent->s.time2 = 10000; + trap_LinkEntity(ent); - ent->think = fire_think; - ent->nextthink = level.time + 1000; + + if (ent->targetname) + { + ent->use = fire_use; + } + + ent->count = !(ent->spawnflags & 1); + + if (!ent->targetname || !(ent->spawnflags & 1) ) + { + ent->think = fire_think; + ent->nextthink = level.time + 2000; + } + else + { + ent->think = NULL; + ent->nextthink = -1; + } } // Additional ports from SP by Harry Young @@ -1130,9 +1213,11 @@ void SP_fx_cooking_steam( gentity_t *ent ) VectorCopy( ent->s.origin, ent->s.pos.trBase ); } -/*QUAKED fx_elecfire (0 0 1) (-8 -8 -8) (8 8 8) +/*QUAKED fx_elecfire (0 0 1) (-8 -8 -8) (8 8 8) STARTOFF Emits sparks at the specified point in the specified direction Spawns smoke puffs. + + "targetname" - toggles effect on/off whenver used */ //------------------------------------------ @@ -1142,11 +1227,43 @@ void electric_fire_think( gentity_t *ent ) ent->nextthink = level.time + (750 + (random() * 300)); } +//------------------------------------------ +void electric_fire_use( gentity_t *self, gentity_t *other, gentity_t *activator) +{ + if ( self->count ) + { + self->think = NULL; + self->nextthink = -1; + } + else + { + self->think = electric_fire_think; + self->nextthink = level.time + 200; + } + + self->count = !self->count; +} + + //------------------------------------------ void SP_fx_electricfire( gentity_t *ent ) { - ent->think = electric_fire_think; + if (ent->targetname) + { + ent->use = electric_fire_use; + } + + ent->count = !(ent->spawnflags & 1); + + if (!ent->targetname || !(ent->spawnflags & 1) ) + {ent->think = electric_fire_think; ent->nextthink = level.time + 500; + } + else + { + ent->think = NULL; + ent->nextthink = -1; + } VectorCopy( ent->s.origin, ent->s.pos.trBase ); @@ -1886,6 +2003,8 @@ void SP_fx_shimmery_thing( gentity_t *ent ) G_SpawnFloat( "radius", "10", &ent->s.angles[1] ); if ( !ent->wait ) ent->wait = 2000; + if ( ent->spawnflags & 4 ) // backwards capability for sp, keep -1 in definitions for unity + ent->wait = -1; // ent->svFlags |= SVF_BROADCAST;