summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/g_buildable.c282
1 files changed, 147 insertions, 135 deletions
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index e83bc265..2e906115 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -1702,8 +1702,12 @@ void ATrapper_Think( gentity_t *self )
+
//==================================================================================
+
+
+
/*
================
G_SuicideIfNoPower
@@ -1730,8 +1734,147 @@ static void G_SuicideIfNoPower( gentity_t *self )
}
}
-void HSpawn_Blast( gentity_t *ent );
-void HSpawn_Disappear( gentity_t *ent );
+
+
+
+//==================================================================================
+
+
+
+
+/*
+================
+HSpawn_Disappear
+
+Called when a human spawn is destroyed before it is spawned
+think function
+================
+*/
+void HSpawn_Disappear( gentity_t *self )
+{
+ self->s.eFlags |= EF_NODRAW; //don't draw the model once its destroyed
+ self->timestamp = level.time;
+ G_QueueBuildPoints( self );
+
+ G_FreeEntity( self );
+}
+
+
+/*
+================
+HSpawn_blast
+
+Called when a human spawn explodes
+think function
+================
+*/
+void HSpawn_Blast( gentity_t *self )
+{
+ vec3_t dir;
+
+ // we don't have a valid direction, so just point straight up
+ dir[ 0 ] = dir[ 1 ] = 0;
+ dir[ 2 ] = 1;
+
+ self->timestamp = level.time;
+
+ //do some radius damage
+ G_RadiusDamage( self->s.pos.trBase, self, self->splashDamage,
+ self->splashRadius, self, self->splashMethodOfDeath );
+
+ // begin freeing build points
+ G_QueueBuildPoints( self );
+ // turn into an explosion
+ self->s.eType = ET_EVENTS + EV_HUMAN_BUILDABLE_EXPLOSION;
+ self->freeAfterEvent = qtrue;
+ G_AddEvent( self, EV_HUMAN_BUILDABLE_EXPLOSION, DirToByte( dir ) );
+}
+
+
+/*
+================
+HSpawn_die
+
+Called when a human spawn dies
+================
+*/
+void HSpawn_Die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod )
+{
+ G_RewardAttackers( self );
+ G_SetBuildableAnim( self, BANIM_DESTROY1, qtrue );
+ G_SetIdleBuildableAnim( self, BANIM_DESTROYED );
+
+ self->die = nullDieFunction;
+ self->powered = qfalse; //free up power
+ self->s.eFlags &= ~EF_FIRING; //prevent any firing effects
+
+ if( self->spawned )
+ {
+ self->think = HSpawn_Blast;
+ self->nextthink = level.time + HUMAN_DETONATION_DELAY;
+ }
+ else
+ {
+ self->think = HSpawn_Disappear;
+ self->nextthink = level.time; //blast immediately
+ }
+
+ G_LogDestruction( self, attacker, mod );
+}
+
+/*
+================
+HSpawn_Think
+
+Think for human spawn
+================
+*/
+void HSpawn_Think( gentity_t *self )
+{
+ gentity_t *ent;
+
+ G_SuicideIfNoPower( self );
+
+ // set parentNode
+ self->powered = G_FindPower( self );
+
+ if( self->spawned )
+ {
+ //only suicide if at rest
+ if( self->s.groundEntityNum )
+ {
+ if( ( ent = G_CheckSpawnPoint( self->s.number, self->s.origin,
+ self->s.origin2, BA_H_SPAWN, NULL ) ) != NULL )
+ {
+ // If the thing blocking the spawn is a buildable, kill it.
+ // If it's part of the map, kill self.
+ if( ent->s.eType == ET_BUILDABLE )
+ {
+ G_Damage( ent, NULL, NULL, NULL, NULL, self->health, 0, MOD_SUICIDE );
+ G_SetBuildableAnim( self, BANIM_SPAWN1, qtrue );
+ }
+ else if( ent->s.number == ENTITYNUM_WORLD || ent->s.eType == ET_MOVER )
+ {
+ G_Damage( self, NULL, NULL, NULL, NULL, self->health, 0, MOD_SUICIDE );
+ return;
+ }
+
+ if( ent->s.eType == ET_CORPSE )
+ G_FreeEntity( ent ); //quietly remove
+ }
+ }
+ }
+
+ self->nextthink = level.time + BG_Buildable( self->s.modelindex )->nextthink;
+}
+
+
+
+
+//==================================================================================
+
+
+
/*
================
@@ -1998,8 +2141,8 @@ void HDCC_Think( gentity_t *self )
//==================================================================================
-void HSpawn_Die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker,
- int damage, int mod );
+
+
/*
================
@@ -2430,137 +2573,6 @@ void HTeslaGen_Think( gentity_t *self )
/*
-================
-HSpawn_Disappear
-
-Called when a human spawn is destroyed before it is spawned
-think function
-================
-*/
-void HSpawn_Disappear( gentity_t *self )
-{
- self->s.eFlags |= EF_NODRAW; //don't draw the model once its destroyed
- self->timestamp = level.time;
- G_QueueBuildPoints( self );
-
- G_FreeEntity( self );
-}
-
-
-/*
-================
-HSpawn_blast
-
-Called when a human spawn explodes
-think function
-================
-*/
-void HSpawn_Blast( gentity_t *self )
-{
- vec3_t dir;
-
- // we don't have a valid direction, so just point straight up
- dir[ 0 ] = dir[ 1 ] = 0;
- dir[ 2 ] = 1;
-
- self->timestamp = level.time;
-
- //do some radius damage
- G_RadiusDamage( self->s.pos.trBase, self, self->splashDamage,
- self->splashRadius, self, self->splashMethodOfDeath );
-
- // begin freeing build points
- G_QueueBuildPoints( self );
- // turn into an explosion
- self->s.eType = ET_EVENTS + EV_HUMAN_BUILDABLE_EXPLOSION;
- self->freeAfterEvent = qtrue;
- G_AddEvent( self, EV_HUMAN_BUILDABLE_EXPLOSION, DirToByte( dir ) );
-}
-
-
-/*
-================
-HSpawn_die
-
-Called when a human spawn dies
-================
-*/
-void HSpawn_Die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod )
-{
- G_RewardAttackers( self );
- G_SetBuildableAnim( self, BANIM_DESTROY1, qtrue );
- G_SetIdleBuildableAnim( self, BANIM_DESTROYED );
-
- self->die = nullDieFunction;
- self->powered = qfalse; //free up power
- self->s.eFlags &= ~EF_FIRING; //prevent any firing effects
-
- if( self->spawned )
- {
- self->think = HSpawn_Blast;
- self->nextthink = level.time + HUMAN_DETONATION_DELAY;
- }
- else
- {
- self->think = HSpawn_Disappear;
- self->nextthink = level.time; //blast immediately
- }
-
- G_LogDestruction( self, attacker, mod );
-}
-
-/*
-================
-HSpawn_Think
-
-Think for human spawn
-================
-*/
-void HSpawn_Think( gentity_t *self )
-{
- gentity_t *ent;
-
- G_SuicideIfNoPower( self );
-
- // set parentNode
- self->powered = G_FindPower( self );
-
- if( self->spawned )
- {
- //only suicide if at rest
- if( self->s.groundEntityNum )
- {
- if( ( ent = G_CheckSpawnPoint( self->s.number, self->s.origin,
- self->s.origin2, BA_H_SPAWN, NULL ) ) != NULL )
- {
- // If the thing blocking the spawn is a buildable, kill it.
- // If it's part of the map, kill self.
- if( ent->s.eType == ET_BUILDABLE )
- {
- G_Damage( ent, NULL, NULL, NULL, NULL, self->health, 0, MOD_SUICIDE );
- G_SetBuildableAnim( self, BANIM_SPAWN1, qtrue );
- }
- else if( ent->s.number == ENTITYNUM_WORLD || ent->s.eType == ET_MOVER )
- {
- G_Damage( self, NULL, NULL, NULL, NULL, self->health, 0, MOD_SUICIDE );
- return;
- }
-
- if( ent->s.eType == ET_CORPSE )
- G_FreeEntity( ent ); //quietly remove
- }
- }
- }
-
- self->nextthink = level.time + BG_Buildable( self->s.modelindex )->nextthink;
-}
-
-
-
-
-//==================================================================================
-
-/*
============
G_QueueBuildPoints
============