mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-25 21:51:30 +00:00
886 lines
28 KiB
C
886 lines
28 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Id$
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Log$
|
|
// Revision 1.41 2007/02/03 19:37:19 jbravo
|
|
// Adding CVS headers to new files in CVS.
|
|
//
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "g_local.h"
|
|
// JBravo: for warnings
|
|
int ClientNumberFromString(gentity_t * to, char *s);
|
|
|
|
gentity_t *refVotes[2]; // refVotes[0] is the clientnumber red team voted
|
|
|
|
// refVotes[1] is the clientnumber blue team voted
|
|
|
|
void SendEndMessage( void )
|
|
{
|
|
|
|
int mins, secs;
|
|
|
|
mins = (int) floor(level.matchTime / 60.0f);
|
|
secs = level.matchTime - (mins * 60);
|
|
|
|
trap_SendServerCommand(-1, "cp \"Match is Over!\n\"");
|
|
trap_SendServerCommand(-1,
|
|
va("print \"Scores: Team1 [%d] - Team2 [%d] \n\"", level.teamScores[TEAM_RED],
|
|
level.teamScores[TEAM_BLUE]));
|
|
trap_SendServerCommand(-1, va("print \"Total Match Time: %d:%02d \n\"", mins, secs));
|
|
}
|
|
|
|
int getNumberOfRefs( void ) {
|
|
gentity_t *ent;
|
|
int i,count;
|
|
count = 0;
|
|
for (i = 0; i < level.maxclients; i++) {
|
|
//Blaze: Prit out some Debug info
|
|
if (&g_entities[i] == NULL) G_Printf("Ln 0030\n");
|
|
ent = &g_entities[i];
|
|
if (!ent->inuse)
|
|
continue;
|
|
if(ent->client->sess.referee)
|
|
++count;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
gentity_t *getEntByName(char *name)
|
|
{
|
|
gentity_t *ent;
|
|
int i;
|
|
|
|
for (i = 0; i < level.maxclients; i++) {
|
|
//Blaze: Prit out some Debug info
|
|
if (&g_entities[i] == NULL) G_Printf("Ln 0047\n");
|
|
ent = &g_entities[i];
|
|
if (!ent->inuse)
|
|
continue;
|
|
if (!Q_stricmp(ent->client->pers.netname, name))
|
|
return ent;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
qboolean checkCaptain(team_t team)
|
|
{
|
|
gentity_t *ent;
|
|
int i;
|
|
|
|
for (i = 0; i < level.maxclients; i++) {
|
|
//Blaze: Prit out some Debug info
|
|
if (&g_entities[i] == NULL) G_Printf("Ln 0059\n");
|
|
ent = &g_entities[i];
|
|
if (!ent->client)
|
|
continue;
|
|
if (ent->client->sess.savedTeam == team && ent->client->sess.captain == team)
|
|
return qtrue;
|
|
}
|
|
return qfalse;
|
|
}
|
|
|
|
void MM_RunFrame(void)
|
|
{
|
|
int fps;
|
|
|
|
fps = trap_Cvar_VariableIntegerValue("sv_fps");
|
|
|
|
switch (g_gametype.integer) {
|
|
//Each Type has different ways of dealing things..
|
|
case (GT_TEAMPLAY):
|
|
case (GT_CTF):
|
|
case (GT_TEAM):
|
|
if (level.team_game_going && level.inGame)
|
|
level.matchTime += 1.0f / (float) fps;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void MM_Sub_f(gentity_t * ent)
|
|
{
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
if (ent->client->sess.savedTeam == TEAM_SPECTATOR || ent->client->sess.savedTeam == TEAM_FREE) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \"" MM_DENY_COLOR "You need to be on a team for that\n\""));
|
|
return;
|
|
}
|
|
if (ent->client->sess.sub == TEAM_FREE) {
|
|
// if (ent->client->ps.pm_type == PM_NORMAL) {
|
|
if (ent->client->sess.sessionTeam != TEAM_SPECTATOR) {
|
|
ent->flags &= ~FL_GODMODE;
|
|
ent->client->ps.stats[STAT_HEALTH] = ent->health = 0;
|
|
player_die(ent, ent, ent, 100000, MOD_SUICIDE);
|
|
}
|
|
ent->client->sess.sub = ent->client->sess.savedTeam;
|
|
trap_SendServerCommand(-1, va("print \"%s" MM_OK_COLOR " is now a Substitute for %s.\n\"",
|
|
ent->client->pers.netname,
|
|
ent->client->sess.savedTeam ==
|
|
TEAM_BLUE ? g_RQ3_team2name.string : g_RQ3_team1name.string));
|
|
} else {
|
|
if(g_RQ3_maxplayers.integer > 0 && (RQ3TeamCount(-1, ent->client->sess.savedTeam) >= g_RQ3_maxplayers.integer)) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \"" MM_DENY_COLOR "Your team is full.\n\""));
|
|
return;
|
|
}
|
|
else {
|
|
ent->client->sess.sub = TEAM_FREE;
|
|
trap_SendServerCommand(-1, va("print \"%s" MM_OK_COLOR " is no longer a Substitute for %s.\n\"",
|
|
ent->client->pers.netname,
|
|
ent->client->sess.savedTeam ==
|
|
TEAM_BLUE ? g_RQ3_team2name.string : g_RQ3_team1name.string));
|
|
}
|
|
}
|
|
}
|
|
|
|
void MM_Captain_f(gentity_t * ent)
|
|
{
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
if (ent->client->sess.savedTeam == TEAM_SPECTATOR || ent->client->sess.savedTeam == TEAM_FREE) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \"" MM_DENY_COLOR "You need to be on a team for that\n\""));
|
|
return;
|
|
}
|
|
if (ent->client->sess.captain == TEAM_RED) {
|
|
level.team1ready = qfalse;
|
|
trap_SendServerCommand(-1, va("print \"%s" MM_OK_COLOR " is no longer %s's Captain.\n\"",
|
|
ent->client->pers.netname, g_RQ3_team1name.string));
|
|
ent->client->sess.captain = TEAM_FREE;
|
|
} else if (ent->client->sess.captain == TEAM_BLUE) {
|
|
level.team2ready = qfalse;
|
|
trap_SendServerCommand(-1, va("print \"%s" MM_OK_COLOR " is no longer %s's Captain.\n\"",
|
|
ent->client->pers.netname, g_RQ3_team2name.string));
|
|
ent->client->sess.captain = TEAM_FREE;
|
|
} else {
|
|
if (!checkCaptain(ent->client->sess.savedTeam)) {
|
|
ent->client->sess.captain = ent->client->sess.savedTeam;
|
|
trap_SendServerCommand(-1, va("print \"%s" MM_OK_COLOR " is now %s's Captain.\n\"",
|
|
ent->client->pers.netname,
|
|
ent->client->sess.savedTeam ==
|
|
TEAM_BLUE ? g_RQ3_team2name.string : g_RQ3_team1name.string));
|
|
} else
|
|
trap_SendServerCommand(ent - g_entities, va("print \"" MM_DENY_COLOR "Your team already has a Captain\n\""));
|
|
}
|
|
}
|
|
|
|
void MM_Ready_f(gentity_t * ent)
|
|
{
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
|
|
if (level.inGame && (g_RQ3_mmflags.integer & MMF_UNREADY) != MMF_UNREADY) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This server does not allow you to un-ready your team after the match started\n\""));
|
|
return;
|
|
}
|
|
|
|
if (level.inGame && (g_gametype.integer == GT_CTF || g_gametype.integer == GT_TEAM)) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This gametype does not yet support un-readying your team after the match started\n\""));
|
|
return;
|
|
}
|
|
|
|
if (ent->client->sess.captain != TEAM_FREE) {
|
|
if (ent->client->sess.savedTeam == TEAM_RED) {
|
|
trap_SendServerCommand(-1, va("cp \"%s is%s Ready.\n\"",
|
|
g_RQ3_team1name.string, level.team1ready ? " no longer" : ""));
|
|
|
|
if (level.team1ready)
|
|
level.team1ready = qfalse;
|
|
else
|
|
level.team1ready = qtrue;
|
|
} else {
|
|
trap_SendServerCommand(-1, va("cp \"%s is%s Ready.\n\"",
|
|
g_RQ3_team2name.string, level.team2ready ? " no longer" : ""));
|
|
|
|
if (level.team2ready)
|
|
level.team2ready = qfalse;
|
|
else
|
|
level.team2ready = qtrue;
|
|
}
|
|
} else
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "You need to be a captain for that\n\""));
|
|
}
|
|
|
|
void MM_TeamModel_f(gentity_t * ent)
|
|
{
|
|
int args;
|
|
team_t team;
|
|
char buff[MAX_TOKEN_CHARS];
|
|
|
|
team = ent->client->sess.savedTeam;
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
if (team == TEAM_SPECTATOR) {
|
|
return;
|
|
}
|
|
|
|
args = trap_Argc();
|
|
|
|
if (args < 2) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \"Your current team model is:"MM_OK_COLOR" %s\n\"",
|
|
ent->client->sess.savedTeam ==
|
|
TEAM_RED ? g_RQ3_team1model.string : g_RQ3_team2model.
|
|
string));
|
|
return;
|
|
} else {
|
|
if((g_RQ3_mmflags.integer & MMF_TEAMMODEL) != MMF_TEAMMODEL) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This server does not allow you to change team model\n\""));
|
|
return;
|
|
}
|
|
if (ent->client->sess.captain == TEAM_FREE) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You need to be a captain for that\n\""));
|
|
return;
|
|
}
|
|
|
|
if (level.team_game_going || level.team_round_going) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You cannot change your team's model while playing or ready.\n\""));
|
|
return;
|
|
}
|
|
|
|
trap_Argv(1, buff, sizeof(buff));
|
|
|
|
if (team == TEAM_RED) {
|
|
if (level.team1ready) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \"You need to un-ready your team for that..\n\""));
|
|
return;
|
|
}
|
|
trap_Cvar_Set("g_RQ3_team1model", buff);
|
|
trap_SendServerCommand(-1, va("print \"New Team %s Model: "MM_OK_COLOR"%s\n\"", g_RQ3_team1name.string, buff));
|
|
} else {
|
|
if (level.team2ready) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You need to un-ready your team for that..\n\""));
|
|
return;
|
|
}
|
|
trap_Cvar_Set("g_RQ3_team2model", buff);
|
|
trap_SendServerCommand(-1, va("print \"New Team %s Model: "MM_OK_COLOR"%s\n\"", g_RQ3_team2name.string, buff));
|
|
}
|
|
}
|
|
}
|
|
|
|
void MM_TeamName_f(gentity_t * ent)
|
|
{
|
|
int args;
|
|
team_t team;
|
|
char *buff;
|
|
|
|
team = ent->client->sess.savedTeam;
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
if (team == TEAM_SPECTATOR) {
|
|
return;
|
|
}
|
|
|
|
args = trap_Argc();
|
|
|
|
if (args < 2) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \"Your Team Name: " MM_OK_COLOR "%s\n\"",
|
|
ent->client->sess.savedTeam ==
|
|
TEAM_RED ? g_RQ3_team1name.string : g_RQ3_team2name.
|
|
string));
|
|
return;
|
|
} else {
|
|
|
|
if((g_RQ3_mmflags.integer & MMF_TEAMNAME) != MMF_TEAMNAME) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This server does not allow you to change team name\n\""));
|
|
return;
|
|
}
|
|
if (ent->client->sess.captain == TEAM_FREE) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You need to be a captain for that\n\""));
|
|
return;
|
|
}
|
|
|
|
if (level.team_game_going || level.team_round_going) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You cannot change your team's name while playing or ready.\n\""));
|
|
return;
|
|
}
|
|
|
|
buff = ConcatArgs(1);
|
|
|
|
if (strlen(buff) > TEAM_NAME_SIZE)
|
|
buff[TEAM_NAME_SIZE] = 0;
|
|
|
|
if (team == TEAM_RED) {
|
|
if (level.team1ready) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You need to un-ready your team for that..\n\""));
|
|
return;
|
|
}
|
|
trap_Cvar_Set("g_RQ3_team1name", buff);
|
|
trap_SendServerCommand(-1, va("print \"New Team 1 Name: %s\n\"", buff));
|
|
} else {
|
|
if (level.team2ready) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You need to un-ready your team for that..\n\""));
|
|
return;
|
|
}
|
|
trap_Cvar_Set("g_RQ3_team2name", buff);
|
|
trap_SendServerCommand(-1, va("print \"New Team 2 Name: %s\n\"", buff));
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// aasimon: Referee Functions Definition, with some aid functions first
|
|
//
|
|
|
|
void checkRefVotes( void )
|
|
{
|
|
// gentity_t *ent;
|
|
// char nr[4];
|
|
|
|
//G_Printf("Vote Red: %i Vote Blue %i \n", refVotes[0], refVotes[1]);
|
|
if (refVotes[0] == refVotes[1]) {
|
|
// ent = g_entities + refVotes[0];
|
|
refVotes[0]->client->sess.referee = 1;
|
|
trap_SendServerCommand(-1, va("cp \"%s" MM_OK_COLOR " is now a Referee.\n\"", refVotes[0]->client->pers.netname));
|
|
refVotes[0] = refVotes[1] = NULL;
|
|
}
|
|
}
|
|
|
|
/* Slicer - MM_Referee_f
|
|
For captains to vote a referee*/
|
|
void MM_Referee_f(gentity_t * ent)
|
|
{
|
|
gentity_t *ref;
|
|
char cmd[MAX_TOKEN_CHARS];
|
|
int clientNr;
|
|
team_t captain;
|
|
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
|
|
captain = ent->client->sess.captain;
|
|
|
|
if (!g_RQ3_AllowRef.integer) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"No Referee Allowed on this server\n\""));
|
|
return;
|
|
}
|
|
if (captain == TEAM_FREE) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Only captains can vote a referee\n\""));
|
|
return;
|
|
}
|
|
if (trap_Argc() < 2) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Use referee <player number> to vote a referee\n\""));
|
|
return;
|
|
}
|
|
trap_Argv(1, cmd, sizeof(cmd));
|
|
clientNr = atoi(cmd);
|
|
if(clientNr < 0 || clientNr > level.maxclients) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Invalid Player Number - use <playerlist>\n\""));
|
|
return;
|
|
}
|
|
ref = &g_entities[clientNr];
|
|
|
|
if (!ref->inuse || !ref->client) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Invalid Player Number - use <playerlist>\n\""));
|
|
return;
|
|
}
|
|
|
|
|
|
if((g_RQ3_mmflags.integer & MMF_VOTEREF) != MMF_VOTEREF) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This server does not allow captains to vote for a Referee\n\""));
|
|
return;
|
|
}
|
|
if(getNumberOfRefs() == g_RQ3_maxRefs.integer) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Too many referees already on the server\n\""));
|
|
return;
|
|
}
|
|
|
|
refVotes[captain - 1] = ref;
|
|
trap_SendServerCommand(-1,va("print \"%s"MM_OK_COLOR" has voted %s"MM_OK_COLOR" for referee\n\"",
|
|
ent->client->pers.netname, ref->client->pers.netname));
|
|
checkRefVotes();
|
|
|
|
}
|
|
void MM_ClearScores(qboolean clearTeamFlags)
|
|
{
|
|
gentity_t *ent;
|
|
int i;
|
|
|
|
for (i = 0; i < level.maxclients; i++) {
|
|
//Blaze: Prit out some Debug info
|
|
if (&g_entities[i] == NULL) G_Printf("Ln 1241\n");
|
|
ent = &g_entities[i];
|
|
if (!ent->inuse)
|
|
continue;
|
|
if(clearTeamFlags) {
|
|
ent->client->sess.captain = TEAM_FREE;
|
|
ent->client->sess.sub = TEAM_FREE;
|
|
}
|
|
// aasimon: Clear only PERS info. Lata clear all REC information. See if more info is needed to be clean
|
|
ent->client->ps.persistant[PERS_SCORE] = 0;
|
|
ent->client->ps.persistant[PERS_KILLED] = 0;
|
|
ent->client->ps.persistant[PERS_DAMAGE_DELT] = 0;
|
|
}
|
|
if (g_gametype.integer >= GT_TEAM) {
|
|
level.teamScores[TEAM_RED] = 0;
|
|
level.teamScores[TEAM_BLUE] = 0;
|
|
}
|
|
}
|
|
|
|
// aasimon: checks for a ref
|
|
/*qboolean Ref_Exists(void)
|
|
{
|
|
|
|
if (g_RQ3_RefID.integer == -1)
|
|
return qfalse;
|
|
else
|
|
return qtrue;
|
|
}
|
|
*/
|
|
//
|
|
// aasimon: Ref Auth. Do some kind of logging (ip's etc)
|
|
//
|
|
qboolean Ref_Auth(gentity_t * ent)
|
|
{
|
|
char pass[MAX_TOKEN_CHARS];
|
|
// int cn;
|
|
// char teste[2];
|
|
|
|
if (!g_RQ3_AllowRef.integer) {
|
|
// No ref allowed on the server - HELLO!!!!! FIREMAN CARS????
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"No Referee Allowed on this server\n\""));
|
|
return qfalse;
|
|
}
|
|
if(!g_RQ3_matchmode.integer) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"This server is not running match mode\n\""));
|
|
return qfalse;
|
|
}
|
|
|
|
if (Q_stricmp(g_RQ3_RefPassword.string, "") == 0) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"No Referee Password Set on this server\n\""));
|
|
return qfalse;
|
|
}
|
|
if(getNumberOfRefs() == g_RQ3_maxRefs.integer) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Too many referees already on the server\n\""));
|
|
return qfalse;
|
|
}
|
|
if (ent->client->sess.referee) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You are already the referee\n\""));
|
|
return qfalse;
|
|
}
|
|
if (trap_Argc() < 2) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Use reflogin <password> to become a referee\n\""));
|
|
return qfalse;
|
|
}
|
|
trap_Argv(1, pass, sizeof(pass));
|
|
|
|
|
|
// Does a simple plain text auth
|
|
|
|
if (Q_stricmp(pass, g_RQ3_RefPassword.string) == 0) {
|
|
ent->client->sess.referee = 1;
|
|
++level.refAmmount;
|
|
trap_SendServerCommand(-1,
|
|
va("print \"%s "MM_OK_COLOR"is now a Referee\n\"",
|
|
ent->client->pers.netname));
|
|
return qtrue;
|
|
}
|
|
/* if (Q_stricmp(pass, g_RQ3_RefPassword.string) == 0) {
|
|
cn = ent - g_entities;
|
|
Com_sprintf(teste, 3, "%i", cn);
|
|
trap_Cvar_Set("g_RQ3_RefID", teste);
|
|
trap_SendServerCommand(-1,
|
|
va("print \"%s "MM_OK_COLOR"is the new Referee\n\"",
|
|
ent->client->pers.netname));
|
|
return qtrue;
|
|
}
|
|
*/
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Invalid Referee Password\n\""));
|
|
|
|
return qfalse;
|
|
}
|
|
// MM_ResetMatch by Slicer
|
|
// Used by admin or rcon to reset Match settings, that is subs, captains, scores, teams's status and game status
|
|
//
|
|
void MM_ResetMatch( void ) {
|
|
trap_SendServerCommand(-1, va("print \""MM_OK_COLOR" Reseting Server Match Status...\n\""));
|
|
// CleanUp Scores and Team Status
|
|
MM_ClearScores(qtrue);
|
|
// Just in case
|
|
MakeAllLivePlayersObservers();
|
|
level.team1ready = qfalse;
|
|
level.team2ready = qfalse;
|
|
level.inGame = qfalse;
|
|
level.team_game_going = 0;
|
|
level.team_round_going = 0;
|
|
level.team_round_countdown = 0;
|
|
level.matchTime = 0;
|
|
}
|
|
|
|
void refReadyStatus( void ) {
|
|
gentity_t *ent;
|
|
int i;
|
|
|
|
for (i = 0; i < level.maxclients; i++) {
|
|
ent = &g_entities[i];
|
|
if (!ent || !ent->inuse)
|
|
continue;
|
|
if(ent->client->sess.refReady) {
|
|
level.refStatus = 1;
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// aasimon: processes comands sent from the referee
|
|
//
|
|
void Ref_Command(gentity_t * ent)
|
|
{
|
|
char com[MAX_TOKEN_CHARS];
|
|
char param[MAX_TOKEN_CHARS];
|
|
char arg2[MAX_STRING_CHARS];
|
|
int cn, i,args;
|
|
gentity_t *p;
|
|
char *buff;
|
|
|
|
args = trap_Argc();
|
|
//cn = ent - g_entities;
|
|
if (!ent->client->sess.referee) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You are not a referee\n\""));
|
|
return;
|
|
}
|
|
if(args < 2) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You need to specify a command. Use \"ref help\" to list available commands\n\""));
|
|
return;
|
|
}
|
|
|
|
trap_Argv(1, com, sizeof(com));
|
|
|
|
// nice strcmp for each comand (borring, wheres my beer?)
|
|
if (Q_stricmp(com, "help") == 0) {
|
|
/* // Theres a clean way to do this - add more help here (this is for example only)
|
|
trap_SendServerCommand(ent - g_entities, "print \"kick <player number>\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"map_restart\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"clearscores\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"pause\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"cyclemap\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"lockSettings\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"resetMatch\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"map <map_to_go>\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"say <text>\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"hearAll\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"ready\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"forceReady\n\"");*/
|
|
trap_SendServerCommand(ent - g_entities, "print \"kick <player number>\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"map_restart\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"clearscores\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"pause\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"cyclemap\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"lockSettings\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"resetMatch\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"map <map_to_go>\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print\"say <text>\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"hearAll\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"ready\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"teamReady <team1/team2>\n\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"teamName <team1/team2> <name>\t\t\"");
|
|
trap_SendServerCommand(ent - g_entities, "print \"teamModel <team1/team2> <model>\t\t\"");
|
|
return;
|
|
} else if (Q_stricmp(com, "teamModel") == 0) {
|
|
if (args < 3) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Please specify which Team and Model Name: ref <team1 / team2> <model>\n\""));
|
|
return;
|
|
}
|
|
if (level.team_game_going || level.team_round_going) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You cannot change Models while game is occuring.\n\""));
|
|
return;
|
|
}
|
|
trap_Argv(2, com, sizeof(com));
|
|
if (Q_stricmp(com, "team1") == 0) {
|
|
buff = ConcatArgs(2);
|
|
|
|
trap_Cvar_Set("g_RQ3_team1model", buff);
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"New Team1 Model: %s\n\"",g_RQ3_team1model.string));
|
|
}
|
|
else if (Q_stricmp(com, "team2") == 0) {
|
|
buff = ConcatArgs(2);
|
|
|
|
trap_Cvar_Set("g_RQ3_team2model", buff);
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"New Team2 Model: %s\n\"",g_RQ3_team2model.string));
|
|
}
|
|
else {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Invalid Team. Available teams are: \"team1\" or \"team2\"\n\""));
|
|
}
|
|
return;
|
|
} else if (Q_stricmp(com, "teamName") == 0) {
|
|
if (args < 3) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Please specify which Team and Name: ref <team1 / team2> <name>\n\""));
|
|
return;
|
|
}
|
|
trap_Argv(2, com, sizeof(com));
|
|
if (Q_stricmp(com, "team1") == 0) {
|
|
buff = ConcatArgs(2);
|
|
|
|
if (strlen(buff) > TEAM_NAME_SIZE)
|
|
buff[TEAM_NAME_SIZE] = 0;
|
|
|
|
trap_Cvar_Set("g_RQ3_team1name", buff);
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"New Team1 Name: %s\n\"",g_RQ3_team1name.string));
|
|
}
|
|
else if (Q_stricmp(com, "team2") == 0) {
|
|
buff = ConcatArgs(2);
|
|
|
|
if (strlen(buff) > TEAM_NAME_SIZE)
|
|
buff[TEAM_NAME_SIZE] = 0;
|
|
|
|
trap_Cvar_Set("g_RQ3_team2name", buff);
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"New Team2 Name: %s\n\"",g_RQ3_team2name.string));
|
|
}
|
|
else {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Invalid Team. Available teams are: \"team1\" or \"team2\"\n\""));
|
|
}
|
|
return;
|
|
} else if (Q_stricmp(com, "teamReady") == 0) {
|
|
if (args < 2) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Please specify which team: ref <team1 / team2>\n\""));
|
|
return;
|
|
}
|
|
trap_Argv(2, com, sizeof(com));
|
|
if (Q_stricmp(com, "team1") == 0) {
|
|
trap_SendServerCommand(-1, va("cp \"%s forced %s to be%s Ready.\n\"",
|
|
ent->client->pers.netname,g_RQ3_team1name.string, level.team1ready ? " no longer" : ""));
|
|
|
|
if (level.team1ready)
|
|
level.team1ready = qfalse;
|
|
else
|
|
level.team1ready = qtrue;
|
|
}
|
|
else if (Q_stricmp(com, "team2") == 0) {
|
|
trap_SendServerCommand(-1, va("cp \"%s forced %s to be%s Ready.\n\"",
|
|
ent->client->pers.netname,g_RQ3_team2name.string, level.team2ready ? " no longer" : ""));
|
|
|
|
if (level.team2ready)
|
|
level.team2ready = qfalse;
|
|
else
|
|
level.team2ready = qtrue;
|
|
}
|
|
else {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Invalid Team. Available teams are: \"team1\" or \"team2\"\n\""));
|
|
}
|
|
return;
|
|
} else if (Q_stricmp(com, "ready") == 0) {
|
|
if(ent->client->sess.refReady) {
|
|
ent->client->sess.refReady = 0;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"You are no longer Ready\n\""));
|
|
}
|
|
else {
|
|
ent->client->sess.refReady = 1;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"You are now Ready\n\""));
|
|
}
|
|
refReadyStatus();
|
|
return;
|
|
} else if (Q_stricmp(com, "hearall") == 0) {
|
|
if(ent->client->sess.refHear) {
|
|
ent->client->sess.refHear = qfalse;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"Hear All Disabled\n\""));
|
|
}
|
|
else{
|
|
if(ent->client->sess.savedTeam != TEAM_SPECTATOR) {
|
|
ent->client->sess.refHear = qtrue;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"Hear All Enabled\n\""));
|
|
}
|
|
else
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You cannot use hear all when on a team\n\""));
|
|
|
|
}
|
|
return;
|
|
} else if (Q_stricmp(com, "resetMatch") == 0) {
|
|
MM_ResetMatch();
|
|
return;
|
|
} else if (Q_stricmp(com, "lockSettings") == 0) {
|
|
if(level.settingsLocked) {
|
|
level.settingsLocked = qfalse;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"Settings are now unLocked\n\""));
|
|
}
|
|
else {
|
|
level.settingsLocked = qtrue;
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"Settings are now Locked\n\""));
|
|
}
|
|
return;
|
|
} else if (Q_stricmp(com, "kick") == 0) { // kick kick kick
|
|
trap_Argv(2, com, sizeof(com));
|
|
if (Q_stricmp(com, "") == 0) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"You must specify a player number - use <playerlist>\n\""));
|
|
return;
|
|
}
|
|
|
|
/*cn = ClientNumberFromString(ent, com);
|
|
if (cn == -1) {
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \"%s "MM_DENY_COLOR"is not on the server\n\"", com));
|
|
return;
|
|
}
|
|
trap_DropClient(cn, "was kicked by the referee");*/
|
|
cn = atoi(com);
|
|
if(cn < 0 || cn > level.maxclients) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Invalid Player Number - use <playerlist>\n\""));
|
|
return;
|
|
}
|
|
p = &g_entities[cn];
|
|
|
|
if (!p->inuse || !p->client) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Invalid Player Number - use <playerlist>\n\""));
|
|
return;
|
|
}
|
|
trap_DropClient(p - g_entities,"was kicked by the referee");
|
|
|
|
} else if (Q_stricmp(com, "clearscores") == 0) {
|
|
MM_ClearScores(qfalse);
|
|
return;
|
|
} else if (Q_stricmp(com, "map_restart") == 0) {
|
|
// this is having problems, namely diference from rcon map_restart or using this trap
|
|
// Ok here it goes: doing map_restart with players IN THE GAME forces them to specs but
|
|
// the scoreboard still shows the players in the team.
|
|
// Second thing is: remove the stupid 5-4-3-2-1 if doing map_restart i (with i > 0)
|
|
|
|
trap_SendConsoleCommand(EXEC_APPEND, "map_restart 0\n");
|
|
return;
|
|
} else if (Q_stricmp(com, "pause") == 0) {
|
|
if (level.paused) {
|
|
trap_SendServerCommand(-1, "cp \"Game resumed by Referee.\n\"");
|
|
level.paused = qfalse;
|
|
} else {
|
|
if (level.team_game_going) {
|
|
if (level.inGame)
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_OK_COLOR"Game will be paused at the end of the round"));
|
|
else
|
|
trap_SendServerCommand(-1, va("cp \"Game is now paused by the Referee\""));
|
|
level.paused = qtrue;
|
|
} else
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"No game is going.."));
|
|
}
|
|
} else if (Q_stricmp(com, "cyclemap") == 0){
|
|
BeginIntermission();
|
|
} else if (Q_stricmp(com, "map") == 0){
|
|
// get map name
|
|
trap_Argv(2, param, sizeof(param));
|
|
|
|
if ( !G_FileExists(va("maps/%s.bsp", param)) ) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"The map %s does not exist.\n\"", param));
|
|
return;
|
|
}
|
|
else{
|
|
trap_Cvar_Set("g_RQ3_ValidIniFile", "3");
|
|
g_RQ3_ValidIniFile.integer = 3;
|
|
trap_SendServerCommand(-1, va("print \""MM_OK_COLOR"Referee changed next map to: %s\n\"", param));
|
|
Com_sprintf(level.voteMap, sizeof(level.voteMap), "map %s",param);
|
|
BeginIntermission();
|
|
}
|
|
}
|
|
else if (Q_stricmp(com, "say") == 0) {
|
|
arg2[0] = '\0';
|
|
for (i = 2; i < trap_Argc(); i++) {
|
|
if (i > 2)
|
|
strcat(arg2, " ");
|
|
trap_Argv(i, &arg2[strlen(arg2)], sizeof(arg2) - strlen(arg2));
|
|
}
|
|
|
|
G_Say(ent, NULL, SAY_REF, arg2);
|
|
}
|
|
else
|
|
trap_SendServerCommand(ent - g_entities,
|
|
va("print \""MM_DENY_COLOR"Invalid Referee comand. Type ref help to see a list of available commands\n\""));
|
|
}
|
|
|
|
void Ref_Resign(gentity_t * ent)
|
|
{
|
|
if (ent->client->sess.referee) {
|
|
--level.refAmmount;
|
|
ent->client->sess.referee = 0;
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_OK_COLOR"You resign from your referee status\n\""));
|
|
}
|
|
}
|
|
|
|
/*
|
|
Timelimit
|
|
RoundLimit
|
|
RoundTimeLimit
|
|
Fraglimit
|
|
Max Players
|
|
Friendly Fire
|
|
Chase Cam
|
|
Team Grenades
|
|
---> Irvision Doesnt Exist.
|
|
Force Team Talk
|
|
*/
|
|
#define NR_SETTVARS 9
|
|
|
|
const char *settings[] = {"timelimit", "g_RQ3_roundlimit", "g_RQ3_roundtimelimit", "fraglimit", "g_RQ3_maxplayers",
|
|
"g_RQ3_forceteamtalk", "g_RQ3_limchasecam","g_RQ3_tgren","g_friendlyFire"};
|
|
// JBravo: adding settings2 for cvars to set in the client for the MM ingame menu.
|
|
//Makro - changed cg_RQ3_timelimit/fraglimit cvars - they were causing problems on local servers
|
|
const char *settings2[] = {"timelimit", "cg_RQ3_roundlimit", "cg_RQ3_roundtimelimit", "fraglimit",
|
|
"cg_RQ3_maxplayers", "cg_RQ3_forceteamtalk", "cg_RQ3_limchasecam", "cg_RQ3_tgren", "cg_RQ3_friendlyFire"};
|
|
|
|
void MM_Settings_f(gentity_t * ent) {
|
|
int i;
|
|
char str[MAX_TOKEN_CHARS];
|
|
|
|
if (!g_RQ3_matchmode.integer)
|
|
return;
|
|
|
|
//Invalid Data SENT
|
|
if (trap_Argc() -1 != NR_SETTVARS) {
|
|
return;
|
|
}
|
|
|
|
if ((g_RQ3_mmflags.integer & MMF_SETTINGS) != MMF_SETTINGS && !ent->client->sess.referee) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR "This server does not allow you to change settings\n\""));
|
|
return;
|
|
}
|
|
if (ent->client->sess.captain == TEAM_FREE && !ent->client->sess.referee) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Only Captains and Referees can change match Settings\n\""));
|
|
return;
|
|
}
|
|
//Game has begun
|
|
if (level.inGame) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Settings can only be changed before a game starts\n\""));
|
|
return;
|
|
}
|
|
//Referee locked settings
|
|
if (level.settingsLocked && !ent->client->sess.referee) {
|
|
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Settings are currently locked, only Referee can unlock them\n\""));
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < NR_SETTVARS; ++i) {
|
|
trap_Argv(i+1, str, sizeof(str));
|
|
trap_Cvar_Set(settings[i],str);
|
|
// JBravo: setting the cvars in cgame now.
|
|
trap_SendServerCommand(-1, va("rq3_cmd %i %s %s", CVARSET, settings2[i], str));
|
|
}
|
|
|
|
trap_SendServerCommand(-1,va("print \""MM_OK_COLOR"Match Settings have been changed by %s\n\"",ent->client->pers.netname));
|
|
|
|
}
|