233 lines
6.5 KiB
C++
233 lines
6.5 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;
|
|
}
|