mirror of
https://github.com/UberGames/EF2GameSource.git
synced 2024-11-12 23:44:08 +00:00
256 lines
5.9 KiB
C++
256 lines
5.9 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /Code/DLLs/game/mp_modeDm.cpp $
|
|
// $Revision:: 19 $
|
|
// $Author:: Steven $
|
|
// $Date:: 8/08/03 1:26p $
|
|
//
|
|
// Copyright (C) 2002 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
// Description:
|
|
//
|
|
|
|
#include "_pch_cpp.h"
|
|
|
|
#include "mp_manager.hpp"
|
|
#include "mp_modeDm.hpp"
|
|
|
|
|
|
CLASS_DECLARATION( MultiplayerModeBase, ModeDeathmatch, NULL )
|
|
{
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
//================================================================
|
|
// Name: ModeDeathmatch
|
|
// Class: ModeDeathmatch
|
|
//
|
|
// Description: Constructor
|
|
//
|
|
// Parameters: const str& -- name of the arena
|
|
//
|
|
// Returns: None
|
|
//
|
|
//================================================================
|
|
ModeDeathmatch::ModeDeathmatch()
|
|
{
|
|
}
|
|
|
|
//================================================================
|
|
// Name: ~ModeDeathmatch
|
|
// Class: ModeDeathmatch
|
|
//
|
|
// Description: Destructor
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//
|
|
//================================================================
|
|
ModeDeathmatch::~ModeDeathmatch()
|
|
{
|
|
}
|
|
|
|
void ModeDeathmatch::respawnPlayer( Player *player )
|
|
{
|
|
Entity *spawnPoint;
|
|
|
|
assert(player);
|
|
|
|
if ( !player )
|
|
{
|
|
warning("ModeDeathmatch::respawnPlayer", "NULL player\n");
|
|
return ;
|
|
}
|
|
|
|
// Make sure we are allowed to respawn the player
|
|
|
|
if ( !multiplayerManager.checkRule( "respawnPlayer", true, player ) )
|
|
{
|
|
if ( multiplayerManager.checkRule( "allowSpectator", true ) )
|
|
{
|
|
multiplayerManager.makePlayerSpectator( player );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// Respawn the player
|
|
|
|
MultiplayerModeBase::respawnPlayer(player);
|
|
|
|
multiplayerManager.initPlayer( player );
|
|
|
|
// Warp the player to a spawn point
|
|
|
|
spawnPoint = getSpawnPoint( player );
|
|
|
|
if ( spawnPoint )
|
|
{
|
|
player->WarpToPoint( spawnPoint );
|
|
}
|
|
|
|
KillBox( player );
|
|
|
|
ActivatePlayer(player);
|
|
}
|
|
|
|
|
|
//================================================================
|
|
// Name: AddPlayer
|
|
// Class: ModeDeathmatch
|
|
//
|
|
// Description: Adds a player to the arena. In deathmatch, this
|
|
// also sets their spawn point and immediately sets
|
|
// them up for fighting.
|
|
//
|
|
// Parameters: Player* -- Player to add and prepare for fighting
|
|
//
|
|
// Returns: None
|
|
//
|
|
//================================================================
|
|
void ModeDeathmatch::AddPlayer( Player *player )
|
|
{
|
|
Entity *spawnPoint;
|
|
|
|
assert(player);
|
|
|
|
if ( !player )
|
|
{
|
|
warning("ModeDeathmatch::AddPlayer", "NULL Player\n");
|
|
return ;
|
|
}
|
|
|
|
if ( !needToAddPlayer( player ) )
|
|
return;
|
|
|
|
MultiplayerModeBase::AddPlayer(player);
|
|
|
|
if ( !multiplayerManager.checkRule( "spawnPlayer", true, player ) )
|
|
{
|
|
if ( multiplayerManager.checkRule( "allowSpectator", true ) )
|
|
{
|
|
multiplayerManager.makePlayerSpectator( player );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// Warp the player to a spawn point
|
|
|
|
spawnPoint = getSpawnPoint( player );
|
|
|
|
if ( spawnPoint )
|
|
{
|
|
player->WarpToPoint( spawnPoint );
|
|
}
|
|
|
|
KillBox( player );
|
|
|
|
ActivatePlayer(player);
|
|
|
|
// If the game hasn't started yet just make the player a spectator
|
|
|
|
if ( !_gameStarted )
|
|
{
|
|
multiplayerManager.makePlayerSpectator( player );
|
|
}
|
|
}
|
|
|
|
void ModeDeathmatch::init( int maxPlayers )
|
|
{
|
|
MultiplayerModeBase::init( maxPlayers );
|
|
|
|
readMultiplayerConfig( "global/mp_dm.cfg" );
|
|
|
|
multiplayerManager.cacheMultiplayerFiles( "mp_dm" );
|
|
}
|
|
|
|
bool ModeDeathmatch::checkGameType( const char *gameType )
|
|
{
|
|
if ( stricmp( gameType, "dm" ) == 0 )
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
int ModeDeathmatch::getHighestPoints( int entnum )
|
|
{
|
|
int highestPoints = -999999999;
|
|
|
|
for ( unsigned i = 0 ; i < _maxPlayers ; i++ )
|
|
{
|
|
if ( _playerGameData[ i ]._playing && ( _playerGameData[ i ]._entnum != entnum ) )
|
|
{
|
|
if ( _playerGameData[ i ]._points > highestPoints )
|
|
{
|
|
highestPoints = _playerGameData[ i ]._points;
|
|
}
|
|
}
|
|
}
|
|
|
|
return highestPoints;
|
|
}
|
|
|
|
bool ModeDeathmatch::checkRule( const char *rule, bool defaultValue, Player *player )
|
|
{
|
|
Q_UNUSED(player);
|
|
|
|
if ( stricmp( rule, "usingIndividualScore" ) == 0 )
|
|
return true;
|
|
else
|
|
return defaultValue;
|
|
}
|
|
|
|
void ModeDeathmatch::update( float frameTime )
|
|
{
|
|
Player *player;
|
|
int place;
|
|
bool tied;
|
|
|
|
MultiplayerModeBase::update( frameTime );
|
|
|
|
// Update the players about their ranking
|
|
|
|
if ( _gameStarted )
|
|
{
|
|
for ( unsigned i = 0 ; i < _maxPlayers ; i++ )
|
|
{
|
|
player = multiplayerManager.getPlayer( i );
|
|
|
|
if ( !player )
|
|
continue;
|
|
|
|
place = getPlace( player, &tied );
|
|
|
|
if ( ( place != _playerGameData[ i ]._lastPlace ) || ( tied != _playerGameData[ i ]._lastTied ) )
|
|
{
|
|
if ( _playerGameData[ i ]._lastPlace != -1 )
|
|
{
|
|
if ( ( place == 1 ) && ( !tied ) )
|
|
{
|
|
// Now in first place
|
|
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_1stplace.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
|
|
}
|
|
else if ( ( place == 1 ) && ( tied ) )
|
|
{
|
|
// Now tied for the lead
|
|
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_tiedlead.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
|
|
}
|
|
else if ( ( _playerGameData[ i ]._lastPlace == 1 ) && ( ( place != 1 ) || ( tied ) ) )
|
|
{
|
|
// No longer in the lead
|
|
multiplayerManager.playerSound( _playerGameData[ i ]._entnum, "localization/sound/dialog/dm/comp_nolead.mp3", CHAN_AUTO, DEFAULT_VOL, DEFAULT_MIN_DIST, 1.0f );
|
|
}
|
|
}
|
|
|
|
_playerGameData[ i ]._lastPlace = place;
|
|
_playerGameData[ i ]._lastTied = tied;
|
|
}
|
|
}
|
|
}
|
|
}
|