New MM features and bug fixes

This commit is contained in:
Daniel Simoes 2002-10-21 21:00:39 +00:00
parent 4449216cdb
commit eae88c0b04
8 changed files with 227 additions and 32 deletions

Binary file not shown.

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.118 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.117 2002/09/29 16:06:44 jbravo
// Work done at the HPWorld expo
//
@ -1871,6 +1874,8 @@ void ClientDisconnect(int clientNum)
}
//Slicer: matchmode
if (g_RQ3_matchmode.integer) {
if(ent->client->sess.referee)
--level.refAmmount;
switch (ent->client->sess.captain) {
case TEAM_RED:
level.team1ready = qfalse;

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.171 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.170 2002/09/30 01:32:30 jbravo
// Fixing the vote and callvote cmd's so dead players in CTB can use them.
//
@ -502,10 +505,10 @@ void DeathmatchScoreboardMessage(gentity_t * ent)
stringlength += j;
}
trap_SendServerCommand(ent - g_entities, va("scores %i %i %i %i %i %i%s", i,
trap_SendServerCommand(ent - g_entities, va("scores %i %i %i %i %i %i %i%s", i,
level.teamScores[TEAM_RED], level.teamScores[TEAM_BLUE],
level.team1ready, level.team2ready,
(int) level.matchTime, string));
(int) level.matchTime, level.refAmmount ? level.refStatus : -1,string));
}
/*
@ -1050,6 +1053,9 @@ void SetTeam(gentity_t * ent, char *s)
//
// execute the team change
//
//sLiCeR: Matchmode referee hear all protection
if(g_gametype.integer == GT_TEAMPLAY && (oldTeam == TEAM_FREE || oldTeam == TEAM_SPECTATOR) && (team == TEAM_RED || team == TEAM_BLUE))
ent->client->sess.refHear = qfalse;
// if the player was dead leave the body
if (client->ps.stats[STAT_HEALTH] <= 0) {
@ -1375,7 +1381,7 @@ static void G_SayTo(gentity_t * ent, gentity_t * other, int mode, int color, con
if (other->client->pers.connected != CON_CONNECTED) {
return;
}
if (mode == SAY_TEAM && !OnSameTeam(ent, other)) {
if (mode == SAY_TEAM && !OnSameTeam(ent, other) && !ent->client->sess.refHear) { //Slicer: This makes referees read say_team stuff if Hear all
return;
}
// no chatting to players in tournements
@ -1453,10 +1459,10 @@ void G_Say(gentity_t * ent, gentity_t * target, int mode, const char *chatText)
Q_COLOR_ESCAPE, COLOR_WHITE);
else {
if (ent->client->sess.savedTeam == TEAM_SPECTATOR)
Com_sprintf(name, sizeof(name), "[SPECTATOR] %s%c%c" EC ": ", ent->client->pers.netname,
Com_sprintf(name, sizeof(name), "%s %s%c%c" EC ": ",ent->client->sess.referee ? "[REFEREE]":"[SPECTATOR]", ent->client->pers.netname,
Q_COLOR_ESCAPE, COLOR_WHITE);
else
Com_sprintf(name, sizeof(name), "[DEAD] %s%c%c" EC ": ", ent->client->pers.netname,
Com_sprintf(name, sizeof(name), "%s %s%c%c" EC ": ",ent->client->sess.referee ? "[REFEREE]":"[DEAD]", ent->client->pers.netname,
Q_COLOR_ESCAPE, COLOR_WHITE);
}
} else {
@ -1472,7 +1478,7 @@ void G_Say(gentity_t * ent, gentity_t * target, int mode, const char *chatText)
ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE);
else {
if (ent->client->sess.savedTeam == TEAM_SPECTATOR)
Com_sprintf(name, sizeof(name), EC "[SPECTATOR] (%s%c%c" EC ")" EC ": ",
Com_sprintf(name, sizeof(name), EC "%s (%s%c%c" EC ")" EC ": ",ent->client->sess.referee ? "[REFEREE]":"[SPECTATOR]",
ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE);
else
Com_sprintf(name, sizeof(name), EC "[DEAD] (%s%c%c" EC ")" EC ": ",

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.126 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.125 2002/09/29 16:06:44 jbravo
// Work done at the HPWorld expo
//
@ -550,6 +553,8 @@ typedef gentity_t *ignorelist_t[MAXIGNORE];
// MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData()
typedef struct {
//Slicer Matchmode
qboolean refHear;
int refReady;
int referee;
team_t captain;
team_t sub;
@ -844,6 +849,8 @@ typedef struct {
gentity_t *bodyQue[BODY_QUEUE_SIZE];
// Slicer: Matchmode
float matchTime;
int refStatus;
int refAmmount;
qboolean team1ready;
qboolean team2ready;
qboolean inGame;
@ -1377,7 +1384,7 @@ extern vmCvar_t g_RQ3_ctb_respawndelay; // JBravo: delay in seconds for ctb resp
//extern vmCvar_t g_RQ3_team2ready;
//aasimon: Ref System for MM
extern vmCvar_t g_RQ3_AllowRef;
extern vmCvar_t g_RQ3_RefPass;
extern vmCvar_t g_RQ3_RefPassword;
//extern vmCvar_t g_RQ3_RefID;
extern vmCvar_t g_RQ3_maxRefs;

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.121 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.120 2002/09/29 16:06:44 jbravo
// Work done at the HPWorld expo
//
@ -445,7 +448,7 @@ vmCvar_t g_RQ3_ctb_respawndelay;
// aasimon: Ref System for MM
vmCvar_t g_RQ3_AllowRef;
vmCvar_t g_RQ3_RefPass;
vmCvar_t g_RQ3_RefPassword;
vmCvar_t g_RQ3_maxRefs;
// aasimon: ini stuff
@ -591,7 +594,7 @@ static cvarTable_t gameCvarTable[] = {
//{ &g_RQ3_team2ready, "g_RQ3_team2ready", "0", 0, 0, qfalse},
// aasimon: Ref system for MM,added infor for referee id (clientnumber)
{&g_RQ3_AllowRef, "g_RQ3_AllowRef", "0", CVAR_SERVERINFO, 0, qtrue},
{&g_RQ3_RefPass, "g_RQ3_RefPassword", "", CVAR_ARCHIVE, 0, qfalse},
{&g_RQ3_RefPassword, "g_RQ3_RefPasswordword", "", CVAR_ARCHIVE, 0, qfalse},
//{&g_RQ3_RefID, "g_RQ3_RefID", "-1", CVAR_SYSTEMINFO | CVAR_ROM, 0, qfalse},
{&g_RQ3_maxRefs, "g_RQ3_maxRefs", "1", CVAR_SERVERINFO, 0, qtrue},
// aasimon: stuff for da ini file
@ -952,6 +955,7 @@ void G_InitGame(int levelTime, int randomSeed, int restart)
int i;
char model[MAX_STRING_CHARS], model2[MAX_STRING_CHARS];
char *s;
gentity_t *ent;
G_Printf("------- Game Initialization -------\n");
G_Printf("gamename: %s\n", GAMEVERSION);
@ -1101,6 +1105,15 @@ void G_InitGame(int levelTime, int randomSeed, int restart)
}
// Slicer: reset matchmode vars
if (g_RQ3_matchmode.integer && (g_gametype.integer == GT_TEAMPLAY || g_gametype.integer == GT_CTF)) {
level.refAmmount = 0;
for (i = 0; i < level.maxclients; i++) {
ent = &g_entities[i];
if (!ent || !ent->inuse)
continue;
if(ent->client->sess.referee)
++level.refAmmount ;
}
level.refStatus = 0;
level.matchTime = 0;
level.inGame = qfalse;
level.team1ready = qfalse;

View file

@ -223,6 +223,7 @@ void MM_TeamModel_f(gentity_t * ent)
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));
@ -271,8 +272,8 @@ void MM_TeamName_f(gentity_t * ent)
} 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;
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\""));
@ -282,6 +283,7 @@ void MM_TeamName_f(gentity_t * ent)
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);
@ -438,23 +440,10 @@ qboolean Ref_Auth(gentity_t * ent)
return qfalse;
}
if (Q_stricmp(g_RQ3_RefPass.string, "") == 0) {
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 (Ref_Exists()) {
// One ref per match
cn = ent - g_entities;
if (cn == g_RQ3_RefID.integer) {
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"You are already the referee\n\""));
return qfalse;
}
trap_SendServerCommand(ent - g_entities, va("print \""MM_DENY_COLOR"Referee already 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;
@ -473,14 +462,15 @@ qboolean Ref_Auth(gentity_t * ent)
// Does a simple plain text auth
if (Q_stricmp(pass, g_RQ3_RefPass.string) == 0) {
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_RefPass.string) == 0) {
/* 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);
@ -512,6 +502,22 @@ void MM_ResetMatch() {
level.matchTime = 0;
}
void refReadyStatus() {
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
//
@ -520,20 +526,26 @@ void Ref_Command(gentity_t * ent)
char com[MAX_TOKEN_CHARS];
char param[MAX_TOKEN_CHARS];
char arg2[MAX_STRING_CHARS];
int cn, i;
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)
/* // 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\"");
@ -543,6 +555,147 @@ void Ref_Command(gentity_t * ent)
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();
@ -649,6 +802,7 @@ void Ref_Command(gentity_t * ent)
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\""));
}
@ -686,7 +840,7 @@ void MM_Settings_f(gentity_t * ent) {
return;
}
if ((g_RQ3_mmflags.integer & MMF_SETTINGS) != MMF_SETTINGS) {
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;
}
@ -700,7 +854,7 @@ void MM_Settings_f(gentity_t * ent) {
return;
}
//Referee locked settings
if (level.settingsLocked) {
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;
}

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.22 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.21 2002/09/29 16:06:45 jbravo
// Work done at the HPWorld expo
//
@ -189,6 +192,8 @@ void G_InitSessionData(gclient_t * client, char *userinfo)
sess->captain = TEAM_FREE;
sess->sub = TEAM_FREE;
sess->referee = 0;
sess->refHear = qfalse;
sess->refReady = 0;
// JBravo: adding PERS_SAVEDTEAM
client->ps.persistant[PERS_SAVEDTEAM] = TEAM_SPECTATOR;

View file

@ -5,6 +5,9 @@
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.140 2002/10/21 21:00:39 slicer
// New MM features and bug fixes
//
// Revision 1.139 2002/09/29 16:06:45 jbravo
// Work done at the HPWorld expo
//
@ -527,6 +530,8 @@ void CheckTeamRules()
trap_SendServerCommand(-1, "cp \"Referee has paused the Game!\n\"");
else if (level.team1ready && level.team2ready)
trap_SendServerCommand(-1, "cp \"Not enough players to play!\n\"");
else if (level.refAmmount && !level.refStatus)
trap_SendServerCommand(-1, "cp \"At least one Referee needs to be ready!\n\"");
else
trap_SendServerCommand(-1, "cp \"Both Teams Must Be Ready!\n\"");
} else
@ -653,7 +658,7 @@ qboolean BothTeamsHavePlayers()
int onteam1 = 0, onteam2 = 0;
//Slicer: Matchmode
if (g_RQ3_matchmode.integer && (!level.team1ready || !level.team2ready || level.paused))
if (g_RQ3_matchmode.integer && ((level.refAmmount && !level.refStatus) || !level.team1ready || !level.team2ready || level.paused))
return 0;
onteam1 = RQ3TeamCount(-1, TEAM_RED);