mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 18:01:15 +00:00
whee, clients now get spammed with text messages when "connected" to a
server
This commit is contained in:
parent
84dd9c1a13
commit
88ae6de8bf
5 changed files with 121 additions and 16 deletions
|
@ -36,11 +36,17 @@
|
|||
#include "qw/msg_backbuf.h"
|
||||
|
||||
typedef struct client_s {
|
||||
struct client_s *next;
|
||||
struct client_s **prev;
|
||||
struct info_s *userinfo;
|
||||
struct connection_s *con;
|
||||
int drop;
|
||||
netchan_t netchan;
|
||||
backbuf_t backbuf;
|
||||
sizebuf_t datagram;
|
||||
byte datagram_buf[MAX_DATAGRAM];
|
||||
|
||||
struct server_s *server;
|
||||
} client_t;
|
||||
|
||||
typedef struct challenge_s {
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#include "netchan.h"
|
||||
#include "qw/pmove.h"
|
||||
|
||||
struct client_s;
|
||||
|
||||
typedef struct player_s {
|
||||
struct player_s *next; // for multicast messages
|
||||
struct info_s *info;
|
||||
|
@ -77,6 +79,8 @@ typedef struct server_s {
|
|||
int sounds;
|
||||
struct info_s *info;
|
||||
|
||||
struct client_s *clients;
|
||||
|
||||
int delta;
|
||||
|
||||
frame_t frames[UPDATE_BACKUP];
|
||||
|
@ -91,6 +95,9 @@ typedef struct server_s {
|
|||
|
||||
void Server_Init (void);
|
||||
void Server_Frame (void);
|
||||
void Server_List (void);
|
||||
void Server_Connect (const char *name, struct client_s *client);
|
||||
void Server_Disconnect (struct client_s *client);
|
||||
|
||||
struct qmsg_s;
|
||||
void sv_parse (server_t *sv, struct msg_s *msg, int reliable);
|
||||
|
|
|
@ -58,6 +58,7 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
#include "client.h"
|
||||
#include "connection.h"
|
||||
#include "qtv.h"
|
||||
#include "server.h"
|
||||
|
||||
typedef struct ucmd_s {
|
||||
const char *name;
|
||||
|
@ -158,6 +159,28 @@ cl_ptrack_f (client_t *cl, void *unused)
|
|||
static void
|
||||
cl_list_f (client_t *cl, void *unused)
|
||||
{
|
||||
Server_List ();
|
||||
}
|
||||
|
||||
static void
|
||||
cl_connect_f (client_t *cl, void *unused)
|
||||
{
|
||||
if (cl->server) {
|
||||
qtv_printf ("already connected to server %s\n", cl->server->name);
|
||||
qtv_printf ("\"cmd disconnect\" first\n");
|
||||
return;
|
||||
}
|
||||
Server_Connect (Cmd_Argv (1), cl);
|
||||
}
|
||||
|
||||
static void
|
||||
cl_disconnect_f (client_t *cl, void *unused)
|
||||
{
|
||||
if (!cl->server) {
|
||||
qtv_printf ("not connected to a server\n");
|
||||
return;
|
||||
}
|
||||
Server_Disconnect (cl);
|
||||
}
|
||||
|
||||
static ucmd_t ucmds[] = {
|
||||
|
@ -168,7 +191,7 @@ static ucmd_t ucmds[] = {
|
|||
{"spawn", cl_spawn_f, 0, 0},
|
||||
{"begin", cl_begin_f, 1, 0},
|
||||
|
||||
{"drop", cl_drop_f, 0, 0},
|
||||
{"drop", cl_drop_f, 1, 0},
|
||||
{"pings", cl_pings_f, 0, 0},
|
||||
|
||||
// issued by hand at client consoles
|
||||
|
@ -192,6 +215,8 @@ static ucmd_t ucmds[] = {
|
|||
{"snap", 0, 0, 0},
|
||||
|
||||
{"list", cl_list_f, 0, 0},
|
||||
{"connect", cl_connect_f, 0, 0},
|
||||
{"disconnect", cl_disconnect_f, 0, 0},
|
||||
};
|
||||
|
||||
static hashtab_t *ucmd_table;
|
||||
|
@ -331,15 +356,6 @@ client_handler (connection_t *con, void *object)
|
|||
qtv_printf ("%s: Runt packet\n", NET_AdrToString (net_from));
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
// read the qport out of the message so we can fix up
|
||||
// stupid address translating routers
|
||||
MSG_ReadLong (net_message); // sequence number
|
||||
MSG_ReadLong (net_message); // sequence number
|
||||
qport = MSG_ReadShort (net_message) & 0xffff;
|
||||
if (cl->netchan.qport != qport)
|
||||
return;
|
||||
#endif
|
||||
if (Netchan_Process (&cl->netchan)) {
|
||||
// this is a valid, sequenced packet, so process it
|
||||
//svs.stats.packets++;
|
||||
|
@ -348,7 +364,9 @@ client_handler (connection_t *con, void *object)
|
|||
client_parse_message (cl);
|
||||
if (cl->backbuf.num_backbuf)
|
||||
MSG_Reliable_Send (&cl->backbuf);
|
||||
Netchan_Transmit (&cl->netchan, 0, NULL);
|
||||
Netchan_Transmit (&cl->netchan, cl->datagram.cursize,
|
||||
cl->datagram.data);
|
||||
SZ_Clear (&cl->datagram);
|
||||
if (cl->drop) {
|
||||
Connection_Del (cl->con);
|
||||
Info_Destroy (cl->userinfo);
|
||||
|
@ -411,6 +429,10 @@ client_connect (connection_t *con, void *object)
|
|||
con->object = cl;
|
||||
con->handler = client_handler;
|
||||
|
||||
cl->datagram.allowoverflow = true;
|
||||
cl->datagram.maxsize = sizeof (cl->datagram_buf);
|
||||
cl->datagram.data = cl->datagram_buf;
|
||||
|
||||
qtv_printf ("client %s (%s) connected\n",
|
||||
Info_ValueForKey (userinfo, "name"),
|
||||
NET_AdrToString (con->address));
|
||||
|
|
|
@ -57,6 +57,7 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
|
||||
#include "qw/protocol.h"
|
||||
|
||||
#include "client.h"
|
||||
#include "connection.h"
|
||||
#include "qtv.h"
|
||||
#include "server.h"
|
||||
|
@ -429,10 +430,12 @@ sv_list_f (void)
|
|||
return;
|
||||
}
|
||||
list = malloc (count * sizeof (server_t **));
|
||||
for (l = &servers, count = 0; *l; l = &(*l)->next)
|
||||
for (l = &servers, count = 0; *l; l = &(*l)->next, count++)
|
||||
list[count] = *l;
|
||||
qsort (list, count, sizeof (*list), server_compare);
|
||||
for (l = list; *l; l++) {
|
||||
qtv_printf ("Name Address\n");
|
||||
qtv_printf ("-------------------- --------------------\n");
|
||||
for (l = list; count--; l++) {
|
||||
sv = *l;
|
||||
qtv_printf ("%-20s %s(%s)\n", sv->name, sv->address,
|
||||
NET_AdrToString (sv->adr));
|
||||
|
@ -490,3 +493,36 @@ Server_Frame (void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Server_List (void)
|
||||
{
|
||||
sv_list_f ();
|
||||
}
|
||||
|
||||
void
|
||||
Server_Connect (const char *name, struct client_s *client)
|
||||
{
|
||||
server_t *sv;
|
||||
|
||||
if (!(sv = Hash_Find (server_hash, name))) {
|
||||
qtv_printf ("server not found: %s\n", name);
|
||||
return;
|
||||
}
|
||||
client->server = sv;
|
||||
|
||||
client->prev = &sv->clients;
|
||||
client->next = sv->clients;
|
||||
if (sv->clients)
|
||||
sv->clients->prev = &client->next;
|
||||
sv->clients = client;
|
||||
}
|
||||
|
||||
void
|
||||
Server_Disconnect (struct client_s *client)
|
||||
{
|
||||
client->server = 0;
|
||||
if (client->next)
|
||||
client->next->prev = client->prev;
|
||||
*client->prev = client->next;
|
||||
}
|
||||
|
|
|
@ -58,10 +58,32 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
#include "qw/msg_ucmd.h"
|
||||
#include "qw/protocol.h"
|
||||
|
||||
#include "client.h"
|
||||
#include "connection.h"
|
||||
#include "qtv.h"
|
||||
#include "server.h"
|
||||
|
||||
static void
|
||||
sv_broadcast (server_t *sv, int reliable, byte *msg, int len)
|
||||
{
|
||||
client_t *cl;
|
||||
byte svc;
|
||||
|
||||
if (len < 1)
|
||||
return;
|
||||
svc = *msg++;
|
||||
len--;
|
||||
for (cl = sv->clients; cl; cl = cl->next) {
|
||||
if (reliable) {
|
||||
MSG_ReliableWrite_Begin (&cl->backbuf, svc, len + 1);
|
||||
MSG_ReliableWrite_SZ (&cl->backbuf, msg, len);
|
||||
} else {
|
||||
MSG_WriteByte (&cl->datagram, svc);
|
||||
SZ_Write (&cl->datagram, msg, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sv_serverdata (server_t *sv, qmsg_t *msg)
|
||||
{
|
||||
|
@ -754,6 +776,20 @@ sv_nails (server_t *sv, qmsg_t *msg, int nails2)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sv_print (server_t *sv, qmsg_t *msg)
|
||||
{
|
||||
byte *data;
|
||||
int len;
|
||||
|
||||
len = msg->readcount - 1;
|
||||
data = msg->message->data + len;
|
||||
MSG_ReadByte (msg);
|
||||
qtv_printf ("%s", MSG_ReadString (msg));
|
||||
len = msg->readcount - len;
|
||||
sv_broadcast (sv, 1, data, len);
|
||||
}
|
||||
|
||||
void
|
||||
sv_parse (server_t *sv, qmsg_t *msg, int reliable)
|
||||
{
|
||||
|
@ -779,9 +815,7 @@ sv_parse (server_t *sv, qmsg_t *msg, int reliable)
|
|||
sv_sound (sv, msg, 0);
|
||||
break;
|
||||
case svc_print:
|
||||
//XXX
|
||||
MSG_ReadByte (msg);
|
||||
qtv_printf ("%s", MSG_ReadString (msg));
|
||||
sv_print (sv, msg);
|
||||
break;
|
||||
case svc_setangle:
|
||||
sv_setangle (sv, msg);
|
||||
|
|
Loading…
Reference in a new issue