broadcast and ping times will show up now in the join game list

origin
stpohle 21 years ago
parent bc8c6ab65c
commit 441ffa7c71

@ -1,4 +1,4 @@
/* $Id: bomberclone.h,v 1.30 2004/11/07 04:13:09 stpohle Exp $ */ /* $Id: bomberclone.h,v 1.31 2005/03/28 16:38:29 stpohle Exp $ */
/* bomberclone.h */ /* bomberclone.h */
#ifndef _BOMBERCLONE_H_ #ifndef _BOMBERCLONE_H_
@ -147,6 +147,7 @@ extern int config_read();
extern int config_write(); extern int config_write();
extern void ReadPrgArgs (int argc, char **argv); extern void ReadPrgArgs (int argc, char **argv);
extern void ReadPrgArgs_Jump (int argc, char **argv); extern void ReadPrgArgs_Jump (int argc, char **argv);
extern int check_version (int ma, int mi, int su, char *ver);
// debug.c // debug.c
extern void d_in_pl_detail (char *head); extern void d_in_pl_detail (char *head);

@ -1,8 +1,9 @@
/* $id:$ */ /* $Id: broadcast.h,v 1.2 2005/03/28 16:38:29 stpohle Exp $ */
#define BC_MAXENTRYS 64 #define BC_MAXENTRYS 64
#define BC_REQUESTTIME 2500 #define BC_REQUESTTIME 2500
#define BC_REQUESTTIMEOUT 7500 #define BC_REQUESTTIMEOUT 7500
#define BC_MAXREQUEST 3
struct broadcast_entry { struct broadcast_entry {
char port[LEN_PORT]; char port[LEN_PORT];
@ -14,6 +15,8 @@ struct broadcast_entry {
int curplayers; int curplayers;
int maxplayers; int maxplayers;
int timestamp; int timestamp;
int try;
int lan; // the broadcasted packet indicates a lan game
}; };
extern struct broadcast_entry broadcast_list []; extern struct broadcast_entry broadcast_list [];

@ -1,8 +1,11 @@
/* $id:$ /* $Id: broadcast.c,v 1.3 2005/03/28 16:38:34 stpohle Exp $
* find broadcasted games */ * find broadcasted games and also hold in this list
* all games which the ogc reports us */
#include "bomberclone.h" #include "bomberclone.h"
#include "network.h" #include "network.h"
#include "packets.h" #include "packets.h"
#include "ogcache-client.h"
#include "broadcast.h" #include "broadcast.h"
static int bc_lastrequest; static int bc_lastrequest;
@ -33,20 +36,60 @@ int broadcast_findfree () {
} }
/* delete entry from the broadcasted list */
void broadcast_del (int nr) {
if (nr < (BC_MAXENTRYS -1))
memcpy (&broadcast_list[nr], &broadcast_list[nr+1], sizeof (struct broadcast_entry) * (BC_MAXENTRYS - (nr+1)));
broadcast_list[BC_MAXENTRYS-1].host[0] = 0;
}
/* check for old not seen games */ /* check for old not seen games */
void broadcast_check () { void broadcast_check () {
int i; int i, j;
/* check for a new update request on a single game and if a game had timed
* out */
for (i = 0; i < BC_MAXENTRYS; i++) { for (i = 0; i < BC_MAXENTRYS; i++) {
while ((broadcast_list[i].host[0] != 0) while (broadcast_list[i].host[0] != 0
&& (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIMEOUT)) { && ((broadcast_list[i].try > BC_MAXREQUEST && broadcast_list[i].lan == 0)
/* delete entry */ || (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIMEOUT && broadcast_list[i].lan == 1)))
if (i < (BC_MAXENTRYS -1)) broadcast_del (i);
memcpy (&broadcast_list[i], &broadcast_list[i+1], sizeof (struct broadcast_entry) * (BC_MAXENTRYS - (i+1)));
if (timestamp - broadcast_list[i].timestamp > BC_REQUESTTIME
broadcast_list[BC_MAXENTRYS-1].host[0] = 0; && broadcast_list[i].lan == 0 && broadcast_list[i].host[0] != 0) {
} broadcast_send (broadcast_list[i].host, broadcast_list[i].port);
broadcast_list[i].timestamp = timestamp;
broadcast_list[i].try++;
}
if (((broadcast_list[i].timestamp < 0) || (timestamp - broadcast_list[i].timestamp < 0))
&& broadcast_list[i].host[0] != 0 && broadcast_list[i].lan == 0) {
broadcast_send (broadcast_list[i].host, broadcast_list[i].port);
broadcast_list[i].timestamp = timestamp;
}
} }
/* check for games in the OGC list which are not in the broadcast_list */
for (i = 0; i < MAX_OGC_ENTRYS; i++)
if ((ogc_array[i].serial != -1) && (broadcast_find (ogc_array[i].host, ogc_array[i].port) == -1)) {
j = broadcast_findfree ();
if ((check_version (0,11,6, ogc_array[i].version) >= 0) && j >= 0) {
strncpy (broadcast_list[j].host, ogc_array[i].host, LEN_SERVERNAME);
strncpy (broadcast_list[j].port, ogc_array[i].port, LEN_PORT);
strncpy (broadcast_list[j].version, ogc_array[i].version, LEN_VERSION);
strncpy (broadcast_list[j].gamename, ogc_array[i].gamename, LEN_GAMENAME);
d_printf ("broadcast_check: Add: nr:%d game:%s %s:%s\n", j,
broadcast_list[j].gamename, broadcast_list[j].host, broadcast_list[j].port);
broadcast_list[j].timestamp = timestamp;
broadcast_list[j].ping = -1;
broadcast_list[j].lan = 0;
broadcast_list[j].try = 0;
}
}
} }
@ -95,7 +138,7 @@ void broadcast_loop () {
broadcast_send (NULL, NULL); broadcast_send (NULL, NULL);
bc_lastrequest = timestamp; bc_lastrequest = timestamp;
} }
pgi = (struct pkg_gameinfo*) &indata; pgi = (struct pkg_gameinfo*) &indata;
pgi->gamename[0] = 0; pgi->gamename[0] = 0;
addr.port[0] = addr.host[0] = 0; addr.port[0] = addr.host[0] = 0;
@ -122,6 +165,9 @@ void broadcast_loop () {
broadcast_list[nr].gamename, broadcast_list[nr].host, broadcast_list[nr].gamename, broadcast_list[nr].host,
broadcast_list[nr].port); broadcast_list[nr].port);
broadcast_list[nr].timestamp = timestamp; broadcast_list[nr].timestamp = timestamp;
broadcast_list[nr].ping = timestamp - pgi->timestamp;
broadcast_list[nr].lan = pgi->broadcast;
} }
} }
@ -134,5 +180,4 @@ void broadcast_loop () {
} }
broadcast_check (); broadcast_check ();
}; };

@ -1,4 +1,4 @@
/* $Id: configuration.c,v 1.71 2005/03/27 19:22:42 stpohle Exp $ /* $Id: configuration.c,v 1.72 2005/03/28 16:38:34 stpohle Exp $
* configuration */ * configuration */
#include <SDL.h> #include <SDL.h>
@ -710,3 +710,27 @@ ReadPrgArgs_Jump (int argc, char **argv)
} }
} }
}; };
/* check the version number, return [ 0 =] [-1 <] [ 1 >] */
int check_version (int ma, int mi, int su, char *ver) {
int v1, v2, v3, res = 0;
sscanf (ver, "%d.%d.%d", &v1, &v2, &v3);
if (v1 < ma)
res = -1;
else if (v1 > ma)
res = 1;
else if (v2 < mi)
res = -1;
else if (v2 > mi)
res = 1;
else if (v3 < su)
res = -1;
else if (v3 > su)
res = 1;
// d_printf ("version_check (%d.%d.%d, %s = %d\n" , ma, mi, su, ver, res);
return res;
};

@ -1,4 +1,4 @@
/* $Id: netsrvlist.c,v 1.12 2005/03/28 02:48:34 stpohle Exp $ /* $Id: netsrvlist.c,v 1.13 2005/03/28 16:38:35 stpohle Exp $
* netsrvlist.c - shows a list of possible servers.*/ * netsrvlist.c - shows a list of possible servers.*/
#include "basic.h" #include "basic.h"
@ -21,6 +21,7 @@ struct __srvlst_entry {
int maxplayers; int maxplayers;
int curplayers; int curplayers;
int ai_family; int ai_family;
int ping;
char comment[32]; char comment[32];
} srvlst_dat[MAX_SRVLIST]; } srvlst_dat[MAX_SRVLIST];
int srvlst_cnt = 0; int srvlst_cnt = 0;
@ -28,7 +29,7 @@ int srvlst_cnt = 0;
/* will build up our srvlst list with /* will build up our srvlst list with
* all servers we have in there */ * all servers we have in there */
void srvlist_rebuildlist () { void srvlist_rebuildlist () {
int ogclst, i; int ogclst, i, j;
char txt1[255]; char txt1[255];
char txt2[255]; char txt2[255];
@ -41,31 +42,36 @@ void srvlist_rebuildlist () {
srvlst_dat[i].version[0] = 0; srvlst_dat[i].version[0] = 0;
srvlst_dat[i].gamename[0] = 0; srvlst_dat[i].gamename[0] = 0;
srvlst_dat[i].comment[0] = 0; srvlst_dat[i].comment[0] = 0;
srvlst_dat[i].ping = 0;
} }
srvlst_cnt = 0; srvlst_cnt = 0;
/* add broadcasted list */ /* add broadcasted list (j == LAN GAME) */
for (i = 0; i < BC_MAXENTRYS; i++) { for (j = 1; j >= 0; j--) for (i = 0; i < BC_MAXENTRYS; i++) {
if (broadcast_list[i].host[0] != 0) { if (broadcast_list[i].host[0] != 0 && broadcast_list[i].lan == j) {
strncpy (srvlst_dat[srvlst_cnt].host, broadcast_list[i].host, LEN_SERVERNAME); strncpy (srvlst_dat[srvlst_cnt].host, broadcast_list[i].host, LEN_SERVERNAME);
strncpy (srvlst_dat[srvlst_cnt].port, broadcast_list[i].port, LEN_PORT); strncpy (srvlst_dat[srvlst_cnt].port, broadcast_list[i].port, LEN_PORT);
strncpy (srvlst_dat[srvlst_cnt].version, broadcast_list[i].version, LEN_VERSION); strncpy (srvlst_dat[srvlst_cnt].version, broadcast_list[i].version, LEN_VERSION);
strncpy (srvlst_dat[srvlst_cnt].gamename, broadcast_list[i].gamename, LEN_GAMENAME); strncpy (srvlst_dat[srvlst_cnt].gamename, broadcast_list[i].gamename, LEN_GAMENAME);
srvlst_dat[srvlst_cnt].ai_family = bman.net_ai_family; srvlst_dat[srvlst_cnt].ai_family = bman.net_ai_family;
sprintf (srvlst_dat[srvlst_cnt].comment, "LAN"); if (broadcast_list[i].lan)
sprintf (srvlst_dat[srvlst_cnt].comment, "LAN");
else
sprintf (srvlst_dat[srvlst_cnt].comment, "Inet");
srvlst_cnt++; srvlst_cnt++;
} }
} }
/* add the OpenGameCache Entrys */ /* add the OpenGameCache Entrys which are not in the broadcasted list */
if (bman.notifygamemaster) { if (bman.notifygamemaster) {
for (ogclst = 0; (ogclst < MAX_OGC_ENTRYS && srvlst_cnt < MAX_SRVLIST); ogclst++) for (ogclst = 0; (ogclst < MAX_OGC_ENTRYS && srvlst_cnt < MAX_SRVLIST); ogclst++)
if (ogc_array[ogclst].serial != -1) { if ((ogc_array[ogclst].serial != -1) && (broadcast_find (ogc_array[ogclst].host, ogc_array[ogclst].port) == -1)) {
srvlst_dat[srvlst_cnt].host[0] = 0; srvlst_dat[srvlst_cnt].host[0] = 0;
srvlst_dat[srvlst_cnt].port[0] = 0; srvlst_dat[srvlst_cnt].port[0] = 0;
srvlst_dat[srvlst_cnt].version[0] = 0; srvlst_dat[srvlst_cnt].version[0] = 0;
srvlst_dat[srvlst_cnt].gamename[0] = 0; srvlst_dat[srvlst_cnt].gamename[0] = 0;
srvlst_dat[srvlst_cnt].ping = -2;
srvlst_dat[srvlst_cnt].ai_family = ogc_array[ogclst].ai_family; srvlst_dat[srvlst_cnt].ai_family = ogc_array[ogclst].ai_family;
strncpy (srvlst_dat[srvlst_cnt].host,ogc_array[ogclst].host, LEN_SERVERNAME); strncpy (srvlst_dat[srvlst_cnt].host,ogc_array[ogclst].host, LEN_SERVERNAME);
@ -81,11 +87,18 @@ void srvlist_rebuildlist () {
/* make the list viewable */ /* make the list viewable */
for (i = 0; i < srvlst_cnt; i++) { for (i = 0; i < srvlst_cnt; i++) {
if (srvlst_dat[i].gamename[0] != 0) /* gamename is present */ if (srvlst_dat[i].ping == -2)
sprintf (txt1, "%-28s %-11s %-4s", srvlst_dat[i].gamename, srvlst_dat[i].version, srvlst_dat[i].comment); txt2[0] = 0;
else if (srvlst_dat[i].ping == -1)
sprintf (txt2, "NoCon");
else
sprintf (txt2, "%dms", srvlst_dat[i].ping);
if (srvlst_dat[i].gamename[0] != 0) /* gamename is present */
sprintf (txt1, "%-20s %5s %-11s %-4s", srvlst_dat[i].gamename, txt2, srvlst_dat[i].version, srvlst_dat[i].comment);
else { else {
sprintf (txt2, "%s:%s", srvlst_dat[i].host, srvlst_dat[i].port); sprintf (txt1, "%s:%s", srvlst_dat[i].host, srvlst_dat[i].port);
sprintf (txt1, "%-28s %-11s %-4s", txt2, srvlst_dat[i].version, srvlst_dat[i].comment); sprintf (txt1, "%-20s %5s %-11s %-4s", txt1,txt2, srvlst_dat[i].version, srvlst_dat[i].comment);
} }
strncpy (srvlst_text[i].text, txt1, LEN_CHARENTRY); strncpy (srvlst_text[i].text, txt1, LEN_CHARENTRY);
} }

@ -1640,7 +1640,7 @@ void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr) {
***/ ***/
void do_gameinfo (struct pkg_gameinfo *pgi, _net_addr *addr) { void do_gameinfo (struct pkg_gameinfo *pgi, _net_addr *addr) {
if (GT_MP_PTPM && pgi->password == -1) { if (GT_MP_PTPM && pgi->password == -1) {
d_printf ("do_gameinfo (from: %s:%s)\n", addr->host, addr->port); d_printf ("do_gameinfo (from: %s:%s) Broadcast Req: %d\n", addr->host, addr->port, pgi->broadcast);
strncpy (pgi->version, VERSION, LEN_VERSION); strncpy (pgi->version, VERSION, LEN_VERSION);
pgi->maxplayers = bman.maxplayer; pgi->maxplayers = bman.maxplayer;

Loading…
Cancel
Save