diff options
Diffstat (limited to 'src/game/g_cmds.c')
-rw-r--r-- | src/game/g_cmds.c | 129 |
1 files changed, 73 insertions, 56 deletions
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 1b2c2be0..d6eb998b 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -419,12 +419,15 @@ Cmd_Kill_f ================= */ void Cmd_Kill_f( gentity_t *ent ) { - if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + if( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) return; - } - if (ent->health <= 0) { + + if( ent->client->ps.stats[ STAT_STATE ] & SS_INFESTING ) return; - } + + if (ent->health <= 0) + return; + ent->flags &= ~FL_GODMODE; ent->client->ps.stats[STAT_HEALTH] = ent->health = 0; player_die (ent, ent, ent, 100000, MOD_SUICIDE); @@ -1541,26 +1544,23 @@ Cmd_Class_f */ void Cmd_Class_f( gentity_t *ent ) { - char s[ MAX_TOKEN_CHARS ]; - qboolean dontSpawn = qfalse; - int clientNum; + char s[ MAX_TOKEN_CHARS ]; + qboolean dontSpawn = qfalse; + int clientNum; gentity_t *body, *victim; vec3_t distance; int length = 4096; int i; + trace_t tr; + vec3_t infestOrigin, infestAngles; clientNum = ent->client - level.clients; trap_Argv( 1, s, sizeof( s ) ); - if( !strlen( s ) && ( ent->client->pers.pteam != PTE_HUMANS ) ) - { - trap_SendServerCommand( ent-g_entities, va("print \"class number: %i\n\"", ent->client->pers.pclass ) ); - return; - } - if( ent->client->pers.pteam == PTE_DROIDS ) { - if( ent->client->pers.pclass ) + //if we are not currently spectating, we are attempting evolution + if( ent->client->pers.pclass != PCL_NONE ) { for ( i = 1, body = g_entities + i; i < level.num_entities; i++, body++ ) { @@ -1575,58 +1575,72 @@ void Cmd_Class_f( gentity_t *ent ) } } + //if a human corpse is nearby... if( length <= 200 ) { - if( !Q_stricmp(s, "0") ) - ent->client->pers.pclass = PCL_D_B_BASE; - else if( !Q_stricmp(s, "1") ) - ent->client->pers.pclass = PCL_D_O_BASE; - else if( !Q_stricmp(s, "2") ) - ent->client->pers.pclass = PCL_D_D_BASE; - else + ent->client->pers.pclass = BG_FindClassNumForName( s ); + + //...check we can evolve to that class + if( !BG_ClassCanEvolveFromTo( ent->client->ps.stats[ STAT_PCLASS ], + ent->client->pers.pclass ) ) { - trap_SendServerCommand( ent-g_entities, va("print \"Unknown class\n\"" ) ); - dontSpawn = qtrue; + trap_SendServerCommand( ent-g_entities, va("print \"You cannot evolve from your current class\n\"" ) ); + return; } - if( !dontSpawn ) + if( ent->client->pers.pclass != PCL_NONE ) { + //evolve + ent->client->ps.stats[ STAT_PCLASS ] = PCL_NONE; ent->client->sess.sessionTeam = TEAM_FREE; ClientUserinfoChanged( clientNum ); - ClientSpawn( ent, victim ); + ent->client->ps.stats[ STAT_STATE ] |= SS_INFESTING; + ent->client->lastInfestTime = level.time; + ent->client->infestBody = victim; + + VectorCopy( victim->s.pos.trBase, infestOrigin ); + infestOrigin[ 2 ] += 128; + + /*trap_Trace( &tr, victim->s.pos.trBase, NULL, NULL, infestOrigin, victim->s.number, MASK_PLAYERSOLID ); + VectorCopy( tr.endpos, infestOrigin );*/ + VectorCopy( victim->s.angles, infestAngles ); + + infestAngles[ PITCH ] = 90; + + G_SetOrigin( ent, infestOrigin ); + VectorCopy( infestOrigin, ent->client->ps.origin ); + + SetClientViewAngle( ent, infestAngles ); + } + else + { + trap_SendServerCommand( ent-g_entities, va("print \"Unknown class\n\"" ) ); + return; } } - - return; - } - else if( ent->client->pers.pclass != 0 ) - { - trap_SendServerCommand( ent-g_entities, va("print \"You must be dead to spawn from a bioegg\n\"" ) ); - return; } - - if( !Q_stricmp(s, "0") ) - ent->client->pers.pclass = PCL_D_B_BASE; - else if( !Q_stricmp(s, "1") ) - ent->client->pers.pclass = PCL_D_O_BASE; - else if( !Q_stricmp(s, "2") ) - ent->client->pers.pclass = PCL_D_D_BASE; else { - trap_SendServerCommand( ent-g_entities, va("print \"Unknown class\n\"" ) ); - dontSpawn = qtrue; - } + //spawing from a bioegg + ent->client->pers.pclass = BG_FindClassNumForName( s ); - if( !dontSpawn ) - { - ent->client->sess.sessionTeam = TEAM_FREE; - ClientUserinfoChanged( clientNum ); - ClientSpawn( ent, NULL ); + if( ent->client->pers.pclass != PCL_NONE ) + { + ent->client->sess.sessionTeam = TEAM_FREE; + ClientUserinfoChanged( clientNum ); + ClientSpawn( ent, NULL ); + } + else + { + trap_SendServerCommand( ent-g_entities, va("print \"Unknown class\n\"" ) ); + return; + } } } else if( ent->client->pers.pteam == PTE_HUMANS ) { - if( ent->client->pers.pclass != 0 ) + //humans cannot use this command whilst alive + if( ent->client->pers.pclass != PCL_NONE ) { trap_SendServerCommand( ent-g_entities, va("print \"You must be dead to use the class command\n\"" ) ); return; @@ -1634,26 +1648,29 @@ void Cmd_Class_f( gentity_t *ent ) ent->client->pers.pclass = PCL_H_BASE; - if( !Q_stricmp( s, "0" ) ) + //set the item to spawn with + if( !Q_stricmp( s, "rifle" ) ) ent->client->pers.pitem = WP_MACHINEGUN; - else if( !Q_stricmp( s, "1" ) ) + else if( !Q_stricmp( s, "ckit" ) ) ent->client->pers.pitem = WP_HBUILD; - + else + { + trap_SendServerCommand( ent-g_entities, va("print \"Unknown starting item\n\"" ) ); + return; + } + ent->client->sess.sessionTeam = TEAM_FREE; ClientUserinfoChanged( clientNum ); ClientSpawn( ent, NULL ); } else if( ent->client->pers.pteam == PTE_NONE ) { - ent->client->pers.pclass = 0; + //can't use this command unless on a team + ent->client->pers.pclass = PCL_NONE; ent->client->sess.sessionTeam = TEAM_FREE; ClientSpawn( ent, NULL ); trap_SendServerCommand( ent-g_entities, va("print \"Join a team first\n\"" ) ); } - else - { - trap_SendServerCommand( ent-g_entities, va("print \"?\n\"" ) ); - } } |