diff options
-rw-r--r-- | inc/common/protocol.h | 3 | ||||
-rw-r--r-- | inc/server/server.h | 2 | ||||
-rw-r--r-- | src/client/client.h | 1 | ||||
-rw-r--r-- | src/client/parse.c | 19 | ||||
-rw-r--r-- | src/server/mvd/game.c | 30 | ||||
-rw-r--r-- | src/server/user.c | 2 |
6 files changed, 43 insertions, 14 deletions
diff --git a/inc/common/protocol.h b/inc/common/protocol.h index 1c3aaa3..d4a67fb 100644 --- a/inc/common/protocol.h +++ b/inc/common/protocol.h @@ -44,7 +44,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #define PROTOCOL_VERSION_Q2PRO_RESERVED 1016 // r364 #define PROTOCOL_VERSION_Q2PRO_BEAM_ORIGIN 1017 // r1037-8 #define PROTOCOL_VERSION_Q2PRO_SHORT_ANGLES 1018 // r1037-44 -#define PROTOCOL_VERSION_Q2PRO_CURRENT 1018 // r1037-44 +#define PROTOCOL_VERSION_Q2PRO_SERVER_STATE 1019 // r1302 +#define PROTOCOL_VERSION_Q2PRO_CURRENT 1019 // r1302 #define PROTOCOL_VERSION_MVD_MINIMUM 2009 // r168 #define PROTOCOL_VERSION_MVD_CURRENT 2010 // r177 diff --git a/inc/server/server.h b/inc/server/server.h index 4e74f19..182e2fb 100644 --- a/inc/server/server.h +++ b/inc/server/server.h @@ -25,9 +25,7 @@ typedef enum { ss_dead, // no map loaded ss_loading, // spawning level edicts ss_game, // actively running -#if USE_MVD_CLIENT ss_broadcast // running MVD client -#endif } server_state_t; #if USE_ICMP diff --git a/src/client/client.h b/src/client/client.h index 070274f..d63a763 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -242,6 +242,7 @@ typedef struct client_state_s { // // server state information // + int serverstate; // ss_* constants int servercount; // server identification for prespawns char gamedir[MAX_QPATH]; int clientNum; // never changed during gameplay, set by serverdata packet diff --git a/src/client/parse.c b/src/client/parse.c index bbff5c7..29bc8d2 100644 --- a/src/client/parse.c +++ b/src/client/parse.c @@ -545,6 +545,9 @@ static void CL_ParseServerData(void) cl.framediv = 1; #endif + // setup default server state + cl.serverstate = ss_game; + if (cls.serverProtocol == PROTOCOL_VERSION_R1Q2) { i = MSG_ReadByte(); if (i) { @@ -583,7 +586,11 @@ static void CL_ParseServerData(void) } Com_DPrintf("Using minor Q2PRO protocol version %d\n", i); cls.protocolVersion = i; - MSG_ReadByte(); // used to be gametype + i = MSG_ReadByte(); + if (cls.protocolVersion >= PROTOCOL_VERSION_Q2PRO_SERVER_STATE) { + Com_DPrintf("Q2PRO server state %d\n", i); + cl.serverstate = i; + } i = MSG_ReadByte(); if (i) { Com_DPrintf("Q2PRO strafejump hack enabled\n"); @@ -931,7 +938,7 @@ static void CL_ParsePrint(void) if (level != PRINT_CHAT) { Com_Printf("%s", s); - if (!cls.demo.playback) { + if (!cls.demo.playback && cl.serverstate != ss_broadcast) { COM_strclr(s); Cmd_ExecTrigger(s); } @@ -943,7 +950,7 @@ static void CL_ParsePrint(void) } #if USE_AUTOREPLY - if (!cls.demo.playback) { + if (!cls.demo.playback && cl.serverstate != ss_broadcast) { CL_CheckForVersion(s); } #endif @@ -971,6 +978,10 @@ static void CL_ParsePrint(void) SCR_AddToChatHUD(s); #endif + // silence MVD spectator chat + if (cl.serverstate == ss_broadcast && !strncmp(s, "[MVD] ", 6)) + return; + // play sound if (cl_chat_sound->integer > 1) S_StartLocalSound_("misc/talk1.wav"); @@ -986,7 +997,7 @@ static void CL_ParseCenterPrint(void) SHOWNET(2, " \"%s\"\n", s); SCR_CenterPrint(s); - if (!cls.demo.playback) { + if (!cls.demo.playback && cl.serverstate != ss_broadcast) { COM_strclr(s); Cmd_ExecTrigger(s); } diff --git a/src/server/mvd/game.c b/src/server/mvd/game.c index e2eb54c..7f8e914 100644 --- a/src/server/mvd/game.c +++ b/src/server/mvd/game.c @@ -862,7 +862,9 @@ static void MVD_Say_f(mvd_client_t *client, int argnum) mvd_t *mvd = client->mvd; unsigned delta, delay = mvd_flood_waitdelay->value * 1000; unsigned treshold = mvd_flood_persecond->value * 1000; - char text[150], *p; + char text[150], hightext[150]; + mvd_client_t *other; + client_t *cl; unsigned i, j; if (mvd_flood_mute->integer && !client->admin) { @@ -903,12 +905,28 @@ static void MVD_Say_f(mvd_client_t *client, int argnum) Q_snprintf(text, sizeof(text), "[MVD] %s: %s", client->cl->name, Cmd_ArgsFrom(argnum)); - for (p = text; *p; p++) { - *p |= 128; - } - MVD_BroadcastPrintf(mvd, PRINT_HIGH, client->admin ? - 0 : UF_MUTE_OBSERVERS, "%s\n", text); + // color text for legacy clients + for (i = 0; text[i]; i++) + hightext[i] = text[i] | 128; + hightext[i] = 0; + + FOR_EACH_MVDCL(other, mvd) { + cl = other->cl; + if (cl->state < cs_spawned) { + continue; + } + if (!client->admin && (other->uf & UF_MUTE_OBSERVERS)) { + continue; + } + + if (cl->protocol == PROTOCOL_VERSION_Q2PRO && + cl->version >= PROTOCOL_VERSION_Q2PRO_SERVER_STATE) { + SV_ClientPrintf(cl, PRINT_CHAT, "%s\n", text); + } else { + SV_ClientPrintf(cl, PRINT_HIGH, "%s\n", hightext); + } + } } static void MVD_Observe_f(mvd_client_t *client) diff --git a/src/server/user.c b/src/server/user.c index d5ba9a2..36df361 100644 --- a/src/server/user.c +++ b/src/server/user.c @@ -421,7 +421,7 @@ void SV_New_f(void) break; case PROTOCOL_VERSION_Q2PRO: MSG_WriteShort(sv_client->version); - MSG_WriteByte(2); // used to be GT_DEATHMATCH + MSG_WriteByte(sv.state); MSG_WriteByte(sv_client->pmp.strafehack); MSG_WriteByte(sv_client->pmp.qwmode); if (sv_client->version >= PROTOCOL_VERSION_Q2PRO_WATERJUMP_HACK) { |