foxygit / doom Log in
commit edc20cc64e1930bdcc9466063e17f91519492a37
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Tue Mar 7 12:46:52 2006 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Tue Mar 7 12:46:52 2006 +0000

    Generic console message mechanism. Inform all players when recording
    a low-res demo.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 410
---
 src/net_client.c | 34 +++++++++++++++++++++++++++++++++-
 src/net_defs.h   |  3 ++-
 src/net_server.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 82 insertions(+), 6 deletions(-)

diff --git a/src/net_client.c b/src/net_client.c
index 38e40017..379a5a78 100644
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_client.c 401 2006-03-01 20:02:53Z fraggle $
+// $Id: net_client.c 410 2006-03-07 12:46:52Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -143,6 +143,7 @@
 // Network client code
 //

+#include <ctype.h>
 #include <stdlib.h>
 #include <string.h>

@@ -884,6 +885,33 @@ static void NET_CL_ParseResendRequest(net_packet_t *packet)
     NET_CL_SendTics(start, start + num_tics - 1);
 }

+// Console message that the server wants the client to print
+
+static void NET_CL_ParseConsoleMessage(net_packet_t *packet)
+{
+    char *msg;
+    char *p;
+
+    msg = NET_ReadString(packet);
+
+    if (msg == NULL)
+    {
+        return;
+    }
+
+    // Do not do a straight "puts" of the string, as this could be
+    // dangerous (sending control codes to terminals can do all
+    // kinds of things)
+
+    for (p=msg; *p; ++p)
+    {
+        if (isprint(*p))
+            putchar(*p);
+    }
+
+    putchar('\n');
+}
+
 // parse a received packet

 static void NET_CL_ParsePacket(net_packet_t *packet)
@@ -919,6 +947,10 @@ static void NET_CL_ParsePacket(net_packet_t *packet)
                 NET_CL_ParseResendRequest(packet);
                 break;

+            case NET_PACKET_TYPE_CONSOLE_MESSAGE:
+                NET_CL_ParseConsoleMessage(packet);
+                break;
+
             default:
                 break;
         }
diff --git a/src/net_defs.h b/src/net_defs.h
index 856a113c..ba5b769c 100644
--- a/src/net_defs.h
+++ b/src/net_defs.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_defs.h 401 2006-03-01 20:02:53Z fraggle $
+// $Id: net_defs.h 410 2006-03-07 12:46:52Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -166,6 +166,7 @@ typedef enum
     NET_PACKET_TYPE_DISCONNECT_ACK,
     NET_PACKET_TYPE_RELIABLE_ACK,
     NET_PACKET_TYPE_GAMEDATA_RESEND,
+    NET_PACKET_TYPE_CONSOLE_MESSAGE,
 } net_packet_type_t;

 typedef struct
diff --git a/src/net_server.c b/src/net_server.c
index 66efa142..4fb91d6e 100644
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*-
 //-----------------------------------------------------------------------------
 //
-// $Id: net_server.c 409 2006-03-06 20:48:07Z fraggle $
+// $Id: net_server.c 410 2006-03-07 12:46:52Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -158,6 +158,7 @@
 // Network server code
 //

+#include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>

@@ -262,6 +263,48 @@ static boolean ClientConnected(net_client_t *client)
         && client->connection.state == NET_CONN_STATE_CONNECTED;
 }

+// Send a message to be displayed on a client's console
+
+static void NET_SV_SendConsoleMessage(net_client_t *client, char *s, ...)
+{
+    char buf[1024];
+    va_list args;
+    net_packet_t *packet;
+
+    va_start(args, s);
+    vsnprintf(buf, sizeof(buf), s, args);
+    va_end(args);
+
+    packet = NET_Conn_NewReliable(&client->connection,
+                                  NET_PACKET_TYPE_CONSOLE_MESSAGE);
+
+    NET_WriteString(packet, buf);
+}
+
+// Send a message to all clients
+
+static void NET_SV_BroadcastMessage(char *s, ...)
+{
+    char buf[1024];
+    va_list args;
+    int i;
+
+    va_start(args, s);
+    vsnprintf(buf, sizeof(buf), s, args);
+    va_end(args);
+
+    for (i=0; i<MAXNETNODES; ++i)
+    {
+        if (ClientConnected(&clients[i]))
+        {
+            NET_SV_SendConsoleMessage(&clients[i], buf);
+        }
+    }
+}
+
+
+// Assign player numbers to connected clients
+
 static void NET_SV_AssignPlayers(void)
 {
     int i;
@@ -661,9 +704,9 @@ static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client)
     {
         if (sv_players[i] != NULL && sv_players[i]->recording_lowres)
         {
-            printf("SV: Playing in low resolution turning mode, "
-                   "because player %i is recording a Vanilla demo.\n",
-                   i + 1);
+            NET_SV_BroadcastMessage("Playing in low resolution turning mode, "
+                                    "because player %i is recording a Vanilla demo.\n",
+                                    i + 1);

             settings.lowres_turn = true;
         }