ef2gamesource/dlls/game/mp_modeTeamDm.cpp

234 lines
6.3 KiB
C++

//------------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/mp_modeTeamDm.cpp $
// $Revision:: 26 $
// $Author:: Singlis $
// $Date:: 5/17/03 6:41p $
//
// 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_modeTeamDm.hpp"
#include "mp_manager.hpp"
CLASS_DECLARATION( ModeTeamBase, ModeTeamDeathmatch, NULL )
{
{ NULL, NULL }
};
ModeTeamDeathmatch::ModeTeamDeathmatch()
{
_redTeam = AddTeam("Red");
_blueTeam = AddTeam("Blue");
}
ModeTeamDeathmatch::~ModeTeamDeathmatch()
{
}
void ModeTeamDeathmatch::playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath )
{
Team *team;
int points;
bool goodKill;
if ( attackingPlayer && ( killedPlayer != attackingPlayer ) &&
( _playerGameData[ attackingPlayer->entnum ]._currentTeam != _playerGameData[ killedPlayer->entnum ]._currentTeam ) )
goodKill = true;
else
goodKill = false;
handleKill( killedPlayer, attackingPlayer, inflictor, meansOfDeath, goodKill );
//MultiplayerModeBase::playerKilled( killedPlayer, attackingPlayer, inflictor, meansOfDeath );
if ( !attackingPlayer )
attackingPlayer = killedPlayer;
team = _playerGameData[ attackingPlayer->entnum ]._currentTeam;
if ( team )
{
if ( multiplayerManager.checkRule( "team-pointsForKills", true, attackingPlayer ) )
{
// Setup the default points for this kill - 1 point to the attacking player's team (if victim's not
// on same team), or lose 1 point if on the same team
if ( _playerGameData[ killedPlayer->entnum ]._currentTeam != _playerGameData[ attackingPlayer->entnum ]._currentTeam )
{
points = _defaultPointsPerKill;
// Get the real points to give (the modifiers can change it)
points = multiplayerManager.getPointsForKill( killedPlayer, attackingPlayer, inflictor, meansOfDeath, points );
// Give points to the team
team->addPoints( attackingPlayer, points );
}
}
}
}
bool ModeTeamDeathmatch::isEndOfMatch( void )
{
// TODO: move this to ModeTeamBase ?
// See if we have a gone over the point limit
if ( getPointLimit() > 0 )
{
// Check team points
if ( _redTeam->getPoints() >= getPointLimit() )
return true;
else if ( _blueTeam->getPoints() >= getPointLimit() )
return true;
}
// See if we have a gone over the time limit
if ( ( getTimeLimit() > 0.0f ) && ( multiplayerManager.getTime() - _gameStartTime > getTimeLimit() ) )
return true;
return false;
}
int ModeTeamDeathmatch::getTeamPoints( Player *player )
{
Team *team;
// Return the points for this team
team = _playerGameData[ player->entnum ]._currentTeam;
if ( team )
return team->getPoints();
else
return 0;
}
void ModeTeamDeathmatch::setupMultiplayerUI( Player *player )
{
// Todo: make this a function in MultiplayerModeBase, each subclass just sets a string to the hud name
gi.SendServerCommand( player->entnum, "stufftext \"ui_removehuds all\"\n" );
gi.SendServerCommand( player->entnum, "stufftext \"ui_addhud mp_console\"\n" );
gi.SendServerCommand( player->entnum, "stufftext \"ui_addhud mp_teamhud\"\n" );
if(mp_timelimit->integer)
{
gi.SendServerCommand( player->entnum, "stufftext \"globalwidgetcommand dmTimer enable\"\n");
}
else
{
gi.SendServerCommand( player->entnum, "stufftext \"globalwidgetcommand dmTimer disable\"\n");
}
}
void ModeTeamDeathmatch::init( int maxPlayers )
{
ModeTeamBase::init( maxPlayers );
readMultiplayerConfig( "global/mp_team.cfg" );
}
void ModeTeamDeathmatch::score( const Player *player )
{
char string[1400];
char entry[1024];
int i;
int tempStringlength;
int count = 0;
int stringlength = 0;
Team *team;
str teamName;
//int teamPoints;
Player *currentPlayer;
int redScore;
int blueScore;
assert( player );
if ( !player )
{
warning( "MultiplayerModeBase::score", "Null Player specified.\n" );
return;
}
string[0] = 0;
entry[0] = 0;
// This for loop builds a string containing all the players scores.
for ( i = 0 ; i < _maxPlayers ; i++ )
{
currentPlayer = multiplayerManager.getPlayer( i );
if ( !currentPlayer )
continue;
team = multiplayerManager.getPlayersTeam( currentPlayer );
if ( team )
{
teamName = team->getName();
//teamPoints = team->getPoints();
}
else
{
teamName = "spectator";
//teamPoints = 0;
}
Com_sprintf( entry, sizeof( entry ), "%i %i %i %i %s %i %i %d %d %d %d %d %d ",
multiplayerManager.getClientNum( _playerGameData[ i ]._entnum ),
_playerGameData[ i ]._points,
_playerGameData[ i ]._numKills,
_playerGameData[ i ]._numDeaths,
//0 /*pl->GetMatchesWon() */,
//0 /*pl->GetMatchesLost()*/,
teamName.c_str(),
//teamPoints,
(int)(multiplayerManager.getTime() - _playerGameData[ i ]._startTime ),
multiplayerManager.getClientPing( _playerGameData[ i ]._entnum ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON1 ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON2 ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON3 ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON4 ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON5 ),
multiplayerManager.getScoreIcon( currentPlayer, SCOREICON6 ) );
tempStringlength = strlen( entry );
// Make sure the string is not too big (take into account other stuff that gets prepended below also)
if ( stringlength + tempStringlength > 975 )
break;
strcpy( string + stringlength, entry );
stringlength += tempStringlength;
count++;
}
redScore = multiplayerManager.getTeamPoints( "Red" );
blueScore = multiplayerManager.getTeamPoints( "Blue" );
gi.SendServerCommand( player->edict-g_entities, "scores 1 %i %d %d %s", count, redScore, blueScore, string );
}
bool ModeTeamDeathmatch::checkGameType( const char *gameType )
{
if ( stricmp( gameType, "teamdm" ) == 0 )
return true;
else
return false;
}