Network Option added.. for people behind a firewall ... needs some tests

origin
stpohle 23 years ago
parent 228c4884f7
commit 418de30c29

@ -71,6 +71,11 @@
#define BUF_SIZE 1024 #define BUF_SIZE 1024
enum _networkflags {
NETF_firewall = 1
};
enum _backgound { // to load some diffrent logos.. enum _backgound { // to load some diffrent logos..
BG_start = 0, BG_start = 0,
BG_net, BG_net,

@ -1,4 +1,4 @@
/* $Id: bomberclone.h,v 1.29 2003/05/29 17:43:37 stpohle Exp $ */ /* $Id: bomberclone.h,v 1.30 2003/05/29 20:49:53 stpohle Exp $ */
/* bomberclone.h */ /* bomberclone.h */
#ifndef _BOMBERCLONE_H_ #ifndef _BOMBERCLONE_H_
@ -153,6 +153,7 @@ struct __bomberclone {
_serverlist serverlist[MAX_SERVERENTRYS]; // ** CONFIG name of the server we are connected to _serverlist serverlist[MAX_SERVERENTRYS]; // ** CONFIG name of the server we are connected to
char gamename[LEN_GAMENAME]; // this will hold the game name char gamename[LEN_GAMENAME]; // this will hold the game name
char gamemaster[LEN_SERVERNAME + LEN_PORT + 2]; // ** CONFIG ... GameMaster Address char gamemaster[LEN_SERVERNAME + LEN_PORT + 2]; // ** CONFIG ... GameMaster Address
unsigned char firewall;
unsigned char notifygamemaster; unsigned char notifygamemaster;
unsigned char askplayername; // ask player for name at startup unsigned char askplayername; // ask player for name at startup
signed char debug; // 0 = off 1 = on signed char debug; // 0 = off 1 = on

@ -52,6 +52,7 @@ game_init (int argc, char **argv)
sprintf (bman.datapath, PACKAGE_DATA_DIR); sprintf (bman.datapath, PACKAGE_DATA_DIR);
bman.fieldpath[0] = 0; bman.fieldpath[0] = 0;
bman.random_map = 2; bman.random_map = 2;
bman.firewall = 0;
snd.inited = 0; snd.inited = 0;
init_map_tileset(); init_map_tileset();
@ -164,6 +165,9 @@ ReadConfig ()
value[511] = 0; value[511] = 0;
strcpy(bman.fieldpath,value); strcpy(bman.fieldpath,value);
} }
if (!strcmp (keyword, "firewall")) {
bman.firewall = atoi (value);
}
if (!strcmp (keyword, "fieldsizex")) { if (!strcmp (keyword, "fieldsizex")) {
bman.fieldsize.x = atoi (value); bman.fieldsize.x = atoi (value);
} }
@ -229,6 +233,7 @@ WriteConfig ()
fprintf (config, "fullscreen=%d\n", gfx.fullscreen); fprintf (config, "fullscreen=%d\n", gfx.fullscreen);
fprintf (config, "tileset=%s\n", gfx.tileset); fprintf (config, "tileset=%s\n", gfx.tileset);
fprintf (config, "fieldpath=%s\n", bman.fieldpath); fprintf (config, "fieldpath=%s\n", bman.fieldpath);
fprintf (config, "firewall=%d\n", bman.firewall);
fprintf (config, "fieldsizex=%d\n", bman.fieldsize.x); fprintf (config, "fieldsizex=%d\n", bman.fieldsize.x);
fprintf (config, "fieldsizey=%d\n", bman.fieldsize.y); fprintf (config, "fieldsizey=%d\n", bman.fieldsize.y);
fprintf (config, "notify=%d\n", bman.notifygamemaster); fprintf (config, "notify=%d\n", bman.notifygamemaster);

@ -79,7 +79,8 @@ networkmenu_options ()
{2, "Network"}, {2, "Network"},
{3, "Notify Masterserver"}, {3, "Notify Masterserver"},
{4, "Masterserver"}, {4, "Masterserver"},
{5, "Return To Multiplayer Menu"}, {5, "Behind a Firewall"},
{6, "Return To Multiplayer Menu"},
{-1, ""} {-1, ""}
}; };
#ifdef _WIN32 #ifdef _WIN32
@ -95,6 +96,11 @@ networkmenu_options ()
else else
sprintf (menu[2].text, "Network: IPv6"); sprintf (menu[2].text, "Network: IPv6");
if (bman.firewall)
sprintf (menu[5].text, "Firewall: ON");
else
sprintf (menu[5].text, "Firewall: OFF");
if (bman.notifygamemaster) if (bman.notifygamemaster)
sprintf (menu[3].text, "Notify MasterServer: Yes"); sprintf (menu[3].text, "Notify MasterServer: Yes");
else else
@ -141,7 +147,14 @@ networkmenu_options ()
LEN_SERVERNAME + LEN_PORT + 2); LEN_SERVERNAME + LEN_PORT + 2);
break; break;
case (5): case (5): // Firewall Option
if (bman.firewall)
bman.firewall = 0;
else
bman.firewall = 1;
break;
case (6):
menuselect = -1; menuselect = -1;
break; break;
} }

@ -1,4 +1,4 @@
/* $Id: network.c,v 1.25 2003/05/17 01:12:33 stpohle Exp $ */ /* $Id: network.c,v 1.26 2003/05/29 20:49:53 stpohle Exp $ */
/* /*
network routines. network routines.
*/ */
@ -159,7 +159,11 @@ network_init ()
bman.players[0].net.addr.port[0] = bman.players[0].net.addr.host[0] = 0; bman.players[0].net.addr.port[0] = bman.players[0].net.addr.host[0] = 0;
dns_filladdr (bman.players[0].net.addr.host, LEN_SERVERNAME, bman.players[0].net.addr.port, dns_filladdr (bman.players[0].net.addr.host, LEN_SERVERNAME, bman.players[0].net.addr.port,
LEN_PORT, bman.net_ai_family, &bman.players[0].net.addr.sAddr); LEN_PORT, bman.net_ai_family, &bman.players[0].net.addr.sAddr);
send_playerid (&bman.players[0].net.addr, bman.playername, NULL, NULL, -1, -1); if (bman.firewall)
i = NETF_firewall;
else
i = 0;
send_playerid (&bman.players[0].net.addr, bman.playername, NULL, NULL, -1, -1, i);
} }
return 0; return 0;
@ -356,7 +360,7 @@ void
net_change_playerid (int pl_nr, unsigned char senddata) net_change_playerid (int pl_nr, unsigned char senddata)
{ {
int i; int i;
if (GT_MP_PTPM) { if (GT_MP_PTPM) {
/* /*
Send to all connected clients the update Send to all connected clients the update
@ -365,7 +369,7 @@ net_change_playerid (int pl_nr, unsigned char senddata)
if (bman.players[i].net.addr.host[0] != 0) if (bman.players[i].net.addr.host[0] != 0)
send_playerid (&bman.players[i].net.addr, bman.players[pl_nr].name, send_playerid (&bman.players[i].net.addr, bman.players[pl_nr].name,
bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port, bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port,
pl_nr, bman.players[pl_nr].gfx_nr); pl_nr, bman.players[pl_nr].gfx_nr, bman.players[pl_nr].net.flags);
} }
else { else {
/* /*
@ -374,7 +378,7 @@ net_change_playerid (int pl_nr, unsigned char senddata)
if (pl_nr == bman.p_nr && senddata) if (pl_nr == bman.p_nr && senddata)
send_playerid (&bman.players[0].net.addr, bman.players[pl_nr].name, send_playerid (&bman.players[0].net.addr, bman.players[pl_nr].name,
bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port, bman.players[pl_nr].net.addr.host, bman.players[pl_nr].net.addr.port,
pl_nr, bman.players[pl_nr].gfx_nr); pl_nr, bman.players[pl_nr].gfx_nr, bman.players[pl_nr].net.flags);
} }
player_set_gfx (&bman.players[pl_nr], bman.players[pl_nr].gfx_nr); player_set_gfx (&bman.players[pl_nr], bman.players[pl_nr].gfx_nr);
@ -542,7 +546,7 @@ net_game_send_player (int p_nr)
} }
else if (p_nr == bman.p_nr) { else if (p_nr == bman.p_nr) {
for (p = 0; p < MAX_PLAYERS; p++) for (p = 0; p < MAX_PLAYERS; p++)
if (PS_IS_netplayer (bman.players[p].state) && p != bman.p_nr) if (PS_IS_netplayer (bman.players[p].state) && p != bman.p_nr && (bman.players[p].net.flags & NETF_firewall) == 0)
send_playerdata (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]); send_playerdata (&bman.players[p].net.addr, p_nr, &bman.players[p_nr]);
} }
}; };
@ -559,7 +563,7 @@ net_game_send_playermove (int p_nr, int mustsend)
pl = &bman.players[p_nr]; pl = &bman.players[p_nr];
pl->net.pkgopt.send_to--; pl->net.pkgopt.send_to--;
if (pl->net.pkgopt.send_to <= 0 || mustsend) if ((pl->net.pkgopt.send_to <= 0 || mustsend) && ( GT_MP_PTPM || (bman.players[p].net.flags & NETF_firewall) == 0))
send_playermove (&bman.players[p].net.addr, p_nr, pl); send_playermove (&bman.players[p].net.addr, p_nr, pl);
/* network packet send control */ /* network packet send control */
@ -583,7 +587,7 @@ net_game_send_bomb (int p, int b)
return; return;
for (pl = 0; pl < MAX_PLAYERS; pl++) for (pl = 0; pl < MAX_PLAYERS; pl++)
if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr) if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && ( GT_MP_PTPM || (bman.players[p].net.flags & NETF_firewall) == 0))
send_bombdata (&bman.players[pl].net.addr, p, b, &bman.players[p].bombs[b]); send_bombdata (&bman.players[pl].net.addr, p, b, &bman.players[p].bombs[b]);
}; };
@ -599,7 +603,7 @@ net_game_send_field (int x, int y)
return; return;
for (pl = 0; pl < MAX_PLAYERS; pl++) for (pl = 0; pl < MAX_PLAYERS; pl++)
if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr) if (PS_IS_netplayer (bman.players[pl].state) && pl != bman.p_nr && ( GT_MP_PTPM || (bman.players[pl].net.flags & NETF_firewall) == 0))
send_field (&bman.players[pl].net.addr, x, y, &bman.field[x][y]); send_field (&bman.players[pl].net.addr, x, y, &bman.field[x][y]);
}; };
@ -670,7 +674,7 @@ net_send_servermode ()
int i; int i;
for (i = 0; i < MAX_PLAYERS; i++) for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr) if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0))
send_servermode (&bman.players[i].net.addr, i); send_servermode (&bman.players[i].net.addr, i);
if (GT_MP_PTPM && bman.notifygamemaster) /* send notification the the gamemaster */ if (GT_MP_PTPM && bman.notifygamemaster) /* send notification the the gamemaster */
@ -691,7 +695,7 @@ net_send_players ()
for (i = 0; i < MAX_PLAYERS; i++) for (i = 0; i < MAX_PLAYERS; i++)
send_playerid (&bman.players[j].net.addr, bman.players[i].name, send_playerid (&bman.players[j].net.addr, bman.players[i].name,
bman.players[i].net.addr.host, bman.players[i].net.addr.port, i, bman.players[i].net.addr.host, bman.players[i].net.addr.port, i,
bman.players[i].gfx_nr); bman.players[i].gfx_nr, bman.players[i].net.flags);
}; };
@ -703,7 +707,7 @@ net_send_chat (char *text, signed char notigamesrv)
int i; int i;
for (i = 0; i < MAX_PLAYERS; i++) for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr) if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0))
send_chat (&bman.players[i].net.addr, text); send_chat (&bman.players[i].net.addr, text);
if (GT_MP_PTPM && bman.notifygamemaster && notigamesrv == 1) /* send notification the the gamemaster */ if (GT_MP_PTPM && bman.notifygamemaster && notigamesrv == 1) /* send notification the the gamemaster */
@ -719,7 +723,7 @@ net_game_send_ill (int p_nr)
d_printf ("net_game_send_ill (%d)\n", p_nr); d_printf ("net_game_send_ill (%d)\n", p_nr);
for (i = 0; i < MAX_PLAYERS; i++) for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr) if (PS_IS_netplayer (bman.players[i].state) && i != bman.p_nr && ( GT_MP_PTPM || (bman.players[i].net.flags & NETF_firewall) == 0))
send_ill (&bman.players[i].net.addr, p_nr, &bman.players[p_nr]); send_ill (&bman.players[i].net.addr, p_nr, &bman.players[p_nr]);
}; };
@ -797,6 +801,6 @@ net_game_send_special (int pl_nr, int ex_nr)
return; return;
for (pl = 0; pl < MAX_PLAYERS; pl++) for (pl = 0; pl < MAX_PLAYERS; pl++)
if (PS_IS_netplayer (bman.players[pl].state) && pl != pl_nr) if (PS_IS_netplayer (bman.players[pl].state) && pl != pl_nr && ( GT_MP_PTPM || (bman.players[pl].net.flags & NETF_firewall) == 0))
send_special (&bman.players[pl].net.addr, pl_nr, bman.players[pl_nr].special, ex_nr); send_special (&bman.players[pl].net.addr, pl_nr, bman.players[pl_nr].special, ex_nr);
}; };

@ -50,6 +50,7 @@ struct __net_player {
Uint32 timestamp; // time of the last incoming package Uint32 timestamp; // time of the last incoming package
signed char net_istep; signed char net_istep;
signed char net_status; signed char net_status;
unsigned char flags; // keep some flags.. like NETF_firewall
_net_pkgopt pkgopt; // packet and network controll data _net_pkgopt pkgopt; // packet and network controll data
} typedef _net_player; } typedef _net_player;

@ -11,9 +11,9 @@
extern _point debug_field; extern _point debug_field;
extern int debug_lastping; extern int debug_lastping;
static short int pkg_lastid; /* the packet id, this will only counted static short int pkg_lastid; /* the packet id, this will only counted
up nothing more.. if we are at 0x10000 up nothing more.. if we are at 0x10000
we will start at 0 */ we will start at 0 */
struct _resend_cache resend_cache; struct _resend_cache resend_cache;
struct _inpkg_index inpkg_index[PKG_IN_INDEX_NUM]; struct _inpkg_index inpkg_index[PKG_IN_INDEX_NUM];
@ -75,7 +75,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
j, j,
vma, vma,
vmi, vmi,
vsu; vsu;
char text[255]; char text[255];
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu); sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
@ -104,9 +104,10 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
strncpy (pl->name, p_id->name, LEN_PLAYERNAME); strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
pl->net.timestamp = timestamp; pl->net.timestamp = timestamp;
pl->net.pingreq = pl->net.pingack + 5; pl->net.pingreq = pl->net.pingack + 5;
pl->net.flags = p_id->netflags;
if (p_id->host[0] != 0) { if (p_id->host[0] != 0) {
pl->net.addr.pl_nr = addr->pl_nr; pl->net.addr.pl_nr = addr->pl_nr;
strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME); strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME);
strncpy (pl->net.addr.port, p_id->port, LEN_PORT); strncpy (pl->net.addr.port, p_id->port, LEN_PORT);
dns_filladdr (pl->net.addr.host, LEN_SERVERNAME, dns_filladdr (pl->net.addr.host, LEN_SERVERNAME,
@ -142,19 +143,20 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
} }
strncpy (pl->name, p_id->name, LEN_PLAYERNAME); strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
player_set_gfx (pl, p_id->gfx_nr); player_set_gfx (pl, p_id->gfx_nr);
/* Reset the network data */ /* Reset the network data */
pl->net.timestamp = timestamp; pl->net.timestamp = timestamp;
pl->net.pkgopt.to_timestamp = timestamp; pl->net.pkgopt.to_timestamp = timestamp;
pl->net.pkgopt.to_2sec = 0; pl->net.pkgopt.to_2sec = 0;
pl->net.pkgopt.send_to = 0; pl->net.pkgopt.send_to = 0;
pl->net.pkgopt.send_set = PKG_SENDSETOPT; pl->net.pkgopt.send_set = PKG_SENDSETOPT;
strncpy (pl->net.addr.host, addr->host, LEN_SERVERNAME); strncpy (pl->net.addr.host, addr->host, LEN_SERVERNAME);
strncpy (pl->net.addr.port, addr->port, LEN_PORT); strncpy (pl->net.addr.port, addr->port, LEN_PORT);
dns_filladdr (pl->net.addr.host, LEN_SERVERNAME, pl->net.addr.port, LEN_PORT, dns_filladdr (pl->net.addr.host, LEN_SERVERNAME, pl->net.addr.port, LEN_PORT,
bman.net_ai_family, &pl->net.addr.sAddr); bman.net_ai_family, &pl->net.addr.sAddr);
pl->net.addr.pl_nr = i; pl->net.flags = p_id->netflags;
pl->net.addr.pl_nr = i;
bman.players_nr_s++; bman.players_nr_s++;
/* send to the new client the servermode and the complete playerlist */ /* send to the new client the servermode and the complete playerlist */
@ -162,15 +164,16 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
for (j = 0; j < MAX_PLAYERS; j++) for (j = 0; j < MAX_PLAYERS; j++)
if (bman.players[j].net.addr.host[0] != 0 || bman.players[j].name[0] != 0) if (bman.players[j].net.addr.host[0] != 0 || bman.players[j].name[0] != 0)
send_playerid (addr, bman.players[j].name, bman.players[j].net.addr.host, send_playerid (addr, bman.players[j].name, bman.players[j].net.addr.host,
bman.players[j].net.addr.port, j, bman.players[j].gfx_nr); bman.players[j].net.addr.port, j, bman.players[j].gfx_nr,
bman.players[i].net.flags);
addr->pl_nr = i; addr->pl_nr = i;
for (j = 0, i = 0; i < bman.maxplayer; i++) for (j = 0, i = 0; i < bman.maxplayer; i++)
if (PS_IS_used (bman.players[i].state)) if (PS_IS_used (bman.players[i].state))
j++; j++;
bman.updatestatusbar=1; bman.updatestatusbar = 1;
if (bman.notifygamemaster) if (bman.notifygamemaster)
gamesrv_sendmode (bman.maxplayer, j); gamesrv_sendmode (bman.maxplayer, j);
} }
else if (GS_WAITRUNNING) { else if (GS_WAITRUNNING) {
@ -193,11 +196,13 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
void void
send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport, int pl_nr, int gfx_nr) send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport, int pl_nr, int gfx_nr,
signed char netflags)
{ {
struct pkg_playerid p_id; struct pkg_playerid p_id;
int vmi, int vmi,
vma, vsu; vma,
vsu;
d_printf ("send_playerid SendTo: %s:%s (Name:%16s p_nr:%d)\n", addr->host, addr->port, name, d_printf ("send_playerid SendTo: %s:%s (Name:%16s p_nr:%d)\n", addr->host, addr->port, name,
pl_nr); pl_nr);
@ -209,6 +214,7 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport, int pl_
p_id.ver_sub = vsu; p_id.ver_sub = vsu;
p_id.ver_major = vma; p_id.ver_major = vma;
p_id.ver_minor = vmi; p_id.ver_minor = vmi;
p_id.netflags = netflags;
strncpy (p_id.name, name, LEN_PLAYERNAME); strncpy (p_id.name, name, LEN_PLAYERNAME);
if (pladdr == NULL) if (pladdr == NULL)
@ -269,9 +275,9 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr)
bman.fieldsize.x = s_mod->fieldsize_x; bman.fieldsize.x = s_mod->fieldsize_x;
bman.fieldsize.y = s_mod->fieldsize_y; bman.fieldsize.y = s_mod->fieldsize_y;
} }
strncpy (gfx.tileset, s_mod->tileset, LEN_TILESETNAME); strncpy (gfx.tileset, s_mod->tileset, LEN_TILESETNAME);
bman.updatestatusbar = 1; bman.updatestatusbar = 1;
}; };
@ -293,7 +299,7 @@ send_servermode (_net_addr * addr, int pl_nr)
s_mod.last_winner = bman.lastwinner; s_mod.last_winner = bman.lastwinner;
s_mod.fieldsize_x = bman.fieldsize.x; s_mod.fieldsize_x = bman.fieldsize.x;
s_mod.fieldsize_y = bman.fieldsize.y; s_mod.fieldsize_y = bman.fieldsize.y;
strncpy (s_mod.tileset, gfx.tileset, LEN_TILESETNAME); strncpy (s_mod.tileset, gfx.tileset, LEN_TILESETNAME);
send_pkg ((struct pkg *) &s_mod, addr); send_pkg ((struct pkg *) &s_mod, addr);
}; };
@ -355,7 +361,8 @@ do_ping (struct pkg_ping *p_dat, _net_addr * addr)
send_ping (addr, p_dat->data, PKG_pingack); send_ping (addr, p_dat->data, PKG_pingack);
d_printf ("do_ping pl_nr[%d] (%s:%s) req=%d, ack=%d\n", addr->pl_nr, addr->host, d_printf ("do_ping pl_nr[%d] (%s:%s) req=%d, ack=%d\n", addr->pl_nr, addr->host,
addr->port, bman.players[addr->pl_nr].net.pingreq, bman.players[addr->pl_nr].net.pingack); addr->port, bman.players[addr->pl_nr].net.pingreq,
bman.players[addr->pl_nr].net.pingack);
}; };
@ -382,11 +389,12 @@ send_ping (_net_addr * addr, int data, unsigned char typ)
send_pkg ((struct pkg *) &p_dat, addr); send_pkg ((struct pkg *) &p_dat, addr);
} }
d_printf ("send_ping Player[%d] (%s:%s) req=%d, ack=%d\n", addr->pl_nr, addr->host, addr->port, d_printf ("send_ping Player[%d] (%s:%s) req=%d, ack=%d\n", addr->pl_nr, addr->host,
bman.players[addr->pl_nr].net.pingreq, bman.players[addr->pl_nr].net.pingack); addr->port, bman.players[addr->pl_nr].net.pingreq,
bman.players[addr->pl_nr].net.pingack);
bman.players[addr->pl_nr].net.timestamp = timestamp; /* we need to set it here, so we can check bman.players[addr->pl_nr].net.timestamp = timestamp; /* we need to set it here, so we can check
for the timeout again */ for the timeout again */
}; };
@ -432,7 +440,7 @@ do_playerdata (struct pkg_playerdata *p_dat, _net_addr * addr)
return; return;
d_printf ("do_playerdata (From: %d) p_nr: %d\n", addr->pl_nr, p_dat->p_nr); d_printf ("do_playerdata (From: %d) p_nr: %d\n", addr->pl_nr, p_dat->p_nr);
bman.updatestatusbar = 1; // force an update bman.updatestatusbar = 1; // force an update
pl = &bman.players[p_dat->p_nr]; pl = &bman.players[p_dat->p_nr];
player_set_gfx (pl, p_dat->gfx_nr); player_set_gfx (pl, p_dat->gfx_nr);
@ -592,31 +600,31 @@ do_bombdata (struct pkg_bombdata *b_dat, _net_addr * addr)
if ((bomb->pos.x != b_dat->x || bomb->pos.y != b_dat->y) && bomb->state == BS_exploding if ((bomb->pos.x != b_dat->x || bomb->pos.y != b_dat->y) && bomb->state == BS_exploding
&& b_dat->state != BS_exploding) && b_dat->state != BS_exploding)
d_printf ("do_bombdata WARNING : bomb explosion haven't finished\n"); d_printf ("do_bombdata WARNING : bomb explosion haven't finished\n");
if (bomb->state==BS_ticking && b_dat->state==BS_ticking) { // handle push & kick special if (bomb->state == BS_ticking && b_dat->state == BS_ticking) { // handle push & kick special
bman.bfield[bomb->pos.x][bomb->pos.y] = 0; //remove bomb at old location bman.bfield[bomb->pos.x][bomb->pos.y] = 0; //remove bomb at old location
draw_stone(bomb->pos.x,bomb->pos.y); draw_stone (bomb->pos.x, bomb->pos.y);
field_update(bomb->pos.x,bomb->pos.y); field_update (bomb->pos.x, bomb->pos.y);
} }
if (bomb->state==BS_off && (b_dat->state == BS_ticking || b_dat->state == BS_trigger)) if (bomb->state == BS_off && (b_dat->state == BS_ticking || b_dat->state == BS_trigger))
snd_play (SND_bombdrop); snd_play (SND_bombdrop);
bomb->pos.x = b_dat->x; bomb->pos.x = b_dat->x;
bomb->pos.y = b_dat->y; bomb->pos.y = b_dat->y;
if (bomb->state != BS_ticking) if (bomb->state != BS_ticking)
bomb->to = b_dat->to; bomb->to = b_dat->to;
else else
bman.bfield[bomb->pos.x][bomb->pos.y] = 1; // keep the bfield up to date bman.bfield[bomb->pos.x][bomb->pos.y] = 1; // keep the bfield up to date
bomb->r = b_dat->r; bomb->r = b_dat->r;
bomb->ex_nr = b_dat->ex_nr; bomb->ex_nr = b_dat->ex_nr;
bomb->state = b_dat->state; bomb->state = b_dat->state;
if (bomb->state == BS_exploding) if (bomb->state == BS_exploding)
bomb_explode (b_dat->p_nr, b_dat->b_nr,0); bomb_explode (b_dat->p_nr, b_dat->b_nr, 0);
if (bomb->ex_nr > bman.last_ex_nr) if (bomb->ex_nr > bman.last_ex_nr)
bman.last_ex_nr = bomb->ex_nr; bman.last_ex_nr = bomb->ex_nr;
}; };
@ -677,11 +685,11 @@ do_quit (struct pkg_quit *q_dat, _net_addr * addr)
/* the player who send this quit */ /* the player who send this quit */
net_delplayer (addr->pl_nr); net_delplayer (addr->pl_nr);
else { else {
/* delete the player with the giving address */ /* delete the player with the giving address */
int pl_nr = get_player_nr (q_dat->host, q_dat->port); int pl_nr = get_player_nr (q_dat->host, q_dat->port);
if (pl_nr == -1) if (pl_nr == -1)
return; return;
net_delplayer (pl_nr); net_delplayer (pl_nr);
} }
}; };
@ -751,7 +759,8 @@ send_fieldline (_net_addr * addr, int line)
void void
do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr) do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr)
{ {
int i, d; int i,
d;
if (addr->pl_nr == -1) if (addr->pl_nr == -1)
return; return;
@ -774,7 +783,7 @@ do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr)
for (i = 0; i < MAX_FIELDSIZE_X; i++) { for (i = 0; i < MAX_FIELDSIZE_X; i++) {
bman.field[i][f_dat->line].type = f_dat->type[i]; bman.field[i][f_dat->line].type = f_dat->type[i];
bman.field[i][f_dat->line].special = f_dat->special[i]; bman.field[i][f_dat->line].special = f_dat->special[i];
for (d = 0; d < 4; d++) for (d = 0; d < 4; d++)
bman.field[i][f_dat->line].ex[d].frame = bman.field[i][f_dat->line].ex[d].count = 0; bman.field[i][f_dat->line].ex[d].frame = bman.field[i][f_dat->line].ex[d].count = 0;
} }
}; };
@ -914,33 +923,37 @@ do_pkgack (struct pkg_pkgack *p_ack, _net_addr * addr)
/* Player Special /* Player Special
* moves/bombs... whatever will be send as we use it */ * moves/bombs... whatever will be send as we use it */
void do_special (struct pkg_special *sp_pkg, _net_addr *addr) { void
d_printf ("do_special (addr %d, pl_nr %d, typ %d)\n", addr->pl_nr, sp_pkg->pl_nr, sp_pkg->typ); do_special (struct pkg_special *sp_pkg, _net_addr * addr)
{
d_printf ("do_special (addr %d, pl_nr %d, typ %d)\n", addr->pl_nr, sp_pkg->pl_nr, sp_pkg->typ);
if (addr->pl_nr == -1) if (addr->pl_nr == -1)
return; return;
if (sp_pkg->pl_nr == -1) if (sp_pkg->pl_nr == -1)
return; return;
/* check if the right player is sending the information */ /* check if the right player is sending the information */
if (addr->pl_nr != 0 && addr->pl_nr != sp_pkg->pl_nr) if (addr->pl_nr != 0 && addr->pl_nr != sp_pkg->pl_nr)
return; return;
bman.players[sp_pkg->pl_nr].special = sp_pkg->typ; bman.players[sp_pkg->pl_nr].special = sp_pkg->typ;
bman.last_ex_nr = sp_pkg->ex_nr; bman.last_ex_nr = sp_pkg->ex_nr;
special_use (sp_pkg->pl_nr); special_use (sp_pkg->pl_nr);
}; };
void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr) { void
send_special (_net_addr * addr, int p_nr, int typ, int ex_nr)
{
struct pkg_special sp_dat; struct pkg_special sp_dat;
sp_dat.h.typ = PKG_special; sp_dat.h.typ = PKG_special;
sp_dat.h.len = sizeof (struct pkg_special); sp_dat.h.len = sizeof (struct pkg_special);
sp_dat.h.flags = PKGF_ackreq; sp_dat.h.flags = PKGF_ackreq;
sp_dat.pl_nr = p_nr; sp_dat.pl_nr = p_nr;
sp_dat.typ = typ; sp_dat.typ = typ;
sp_dat.ex_nr = ex_nr; sp_dat.ex_nr = ex_nr;
send_pkg ((struct pkg *) &sp_dat, addr); send_pkg ((struct pkg *) &sp_dat, addr);
}; };
@ -949,8 +962,8 @@ void
do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr * addr) do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr * addr)
{ {
packet->data[127] = 0; packet->data[127] = 0;
if (strstr (packet->data,"BC:BC:") == packet->data) if (strstr (packet->data, "BC:BC:") == packet->data)
return; // ignore packet return; // ignore packet
chat_addline (packet->data); chat_addline (packet->data);
net_send_chat (packet->data, 0); net_send_chat (packet->data, 0);
}; };
@ -961,7 +974,7 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr)
{ {
int i, int i,
pos; pos;
/* find packet */ /* find packet */
for (i = 0, pos = -1; (i < PKG_IN_INDEX_NUM && pos == -1); i++) for (i = 0, pos = -1; (i < PKG_IN_INDEX_NUM && pos == -1); i++)
if (inpkg_index[i].pl_nr == addr->pl_nr && if (inpkg_index[i].pl_nr == addr->pl_nr &&
@ -971,7 +984,7 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr)
/* packet unknown ... add to index */ /* packet unknown ... add to index */
if (++inpkg_index_pos >= PKG_IN_INDEX_NUM) if (++inpkg_index_pos >= PKG_IN_INDEX_NUM)
inpkg_index_pos = 0; inpkg_index_pos = 0;
inpkg_index[inpkg_index_pos].pl_nr = addr->pl_nr; inpkg_index[inpkg_index_pos].pl_nr = addr->pl_nr;
inpkg_index[inpkg_index_pos].typ = typ; inpkg_index[inpkg_index_pos].typ = typ;
inpkg_index[inpkg_index_pos].id = id; inpkg_index[inpkg_index_pos].id = id;
@ -997,103 +1010,125 @@ send_pkg (struct pkg *packet, _net_addr * addr)
} }
}; };
/* forward the packet to all who are behind a firewall */
void
int fwd_pkg (struct pkg *packet)
do_pkg (struct pkg *packet, _net_addr * addr)
{ {
if ((((packet->h.flags & PKGF_ipv6) == 0 && bman.net_ai_family != PF_INET) || int pl;
((packet->h.flags & PKGF_ipv6) != 0 && bman.net_ai_family == PF_INET)) &&
packet->h.typ != PKG_bcmservchat) {
d_printf ("-----packet comes from the wrong network type\n");
return 0;
}
/* get the addr and set the ping timeout value */
addr->pl_nr = get_player_nr (addr->host, addr->port);
bman.players[addr->pl_nr].net.timestamp = timestamp;
bman.players[addr->pl_nr].net.pingreq = bman.players[addr->pl_nr].net.pingack + 5;
/* test if we have any important packet */
if (packet->h.flags & PKGF_ackreq && packet->h.typ != PKG_bcmservchat)
send_pkgack (addr, packet->h.typ, packet->h.id);
/* check the packet with the index */
if (packet->h.typ != PKG_bcmservchat && inpkg_check (packet->h.typ, packet->h.id, addr) != -1) {
/* we have got this packet already */
d_printf ("-----packet ignored\n");
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
bman.players[addr->pl_nr].net.pkgopt.to_2sec++;
return 0;
}
/* check if the incoming packet have the right size */ if (GT_MP_PTPS) /* clients don't forward anything */
if (packet->h.typ == PKG_servermode && packet->h.len != sizeof (struct pkg_servermode)) return;
send_error (addr, "pkg_servermode: packetsize incorrect.");
switch (packet->h.typ) {
case (PKG_error):
if (do_error ((struct pkg_error *) packet, addr) < 0)
return -1;
break;
case (PKG_playerid):
do_playerid ((struct pkg_playerid *) packet, addr);
break;
case (PKG_servermode):
do_servermode ((struct pkg_servermode *) packet, addr);
break;
case (PKG_field):
do_field ((struct pkg_field *) packet, addr);
break;
case (PKG_pingreq):
do_ping ((struct pkg_ping *) packet, addr);
break;
case (PKG_pingack):
do_ping ((struct pkg_ping *) packet, addr);
break;
case (PKG_bombdata):
do_bombdata ((struct pkg_bombdata *) packet, addr);
break;
case (PKG_playerdata):
do_playerdata ((struct pkg_playerdata *) packet, addr);
break;
case (PKG_quit):
do_quit ((struct pkg_quit *) packet, addr);
break;
case (PKG_getfield):
do_getfield ((struct pkg_getfield *) packet, addr);
break;
case (PKG_getplayerdata):
do_getplayerdata ((struct pkg_getplayerdata *) packet, addr);
break;
case (PKG_fieldline):
do_fieldline ((struct pkg_fieldline *) packet, addr);
break;
case (PKG_playerstatus):
do_playerstatus ((struct pkg_playerstatus *) packet, addr);
break;
case (PKG_pkgack):
do_pkgack ((struct pkg_pkgack *) packet, addr);
break;
case (PKG_chat):
do_chat ((struct pkg_chat *) packet, addr);
break;
case (PKG_playermove):
do_playermove ((struct pkg_playermove *) packet, addr);
break;
case (PKG_bcmservchat):
do_bcmservchat ((struct pkg_bcmservchat *) packet, addr);
break;
case (PKG_ill):
do_ill ((struct pkg_ill *) packet, addr);
break;
case (PKG_special):
do_special ((struct pkg_special *) packet, addr);
break;
default:
send_error (addr, "BomberClone: unknown data packet");
break;
}
return 0; if (packet->h.typ == PKG_field || packet->h.typ == PKG_playerdata
|| packet->h.typ == PKG_playermove || packet->h.typ == PKG_ill
|| packet->h.typ == PKG_bombdata || packet->h.typ == PKG_chat
|| packet->h.typ == PKG_special)
for (pl = 1; pl < MAX_PLAYERS; pl++)
if (PS_IS_netplayer (bman.players[pl].state)
&& (bman.players[pl].net.flags & NETF_firewall) == NETF_firewall)
send_pkg (packet, &bman.players[pl].net.addr);
}; };
int
do_pkg (struct pkg *packet, _net_addr * addr) {
if ((((packet->h.flags & PKGF_ipv6) == 0 && bman.net_ai_family != PF_INET) ||
((packet->h.flags & PKGF_ipv6) != 0 && bman.net_ai_family == PF_INET)) &&
packet->h.typ != PKG_bcmservchat) {
d_printf ("-----packet comes from the wrong network type\n");
return 0;
}
/* get the addr and set the ping timeout value */
addr->pl_nr = get_player_nr (addr->host, addr->port);
bman.players[addr->pl_nr].net.timestamp = timestamp;
bman.players[addr->pl_nr].net.pingreq = bman.players[addr->pl_nr].net.pingack + 5;
/* test if we have any important packet */
if (packet->h.flags & PKGF_ackreq && packet->h.typ != PKG_bcmservchat)
send_pkgack (addr, packet->h.typ, packet->h.id);
/* check the packet with the index */
if (packet->h.typ != PKG_bcmservchat
&& inpkg_check (packet->h.typ, packet->h.id, addr) != -1) {
/* we have got this packet already */
d_printf ("-----packet ignored\n");
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
bman.players[addr->pl_nr].net.pkgopt.to_2sec++;
return 0;
}
/* check if the incoming packet have the right size */
if (packet->h.typ == PKG_servermode && packet->h.len != sizeof (struct pkg_servermode))
send_error (addr, "pkg_servermode: packetsize incorrect.");
/* forward packet */
if (GT_MP_PTPM)
fwd_pkg (packet);
switch (packet->h.typ) {
case (PKG_error):
if (do_error ((struct pkg_error *) packet, addr) < 0)
return -1;
break;
case (PKG_playerid):
do_playerid ((struct pkg_playerid *) packet, addr);
break;
case (PKG_servermode):
do_servermode ((struct pkg_servermode *) packet, addr);
break;
case (PKG_field):
do_field ((struct pkg_field *) packet, addr);
break;
case (PKG_pingreq):
do_ping ((struct pkg_ping *) packet, addr);
break;
case (PKG_pingack):
do_ping ((struct pkg_ping *) packet, addr);
break;
case (PKG_bombdata):
do_bombdata ((struct pkg_bombdata *) packet, addr);
break;
case (PKG_playerdata):
do_playerdata ((struct pkg_playerdata *) packet, addr);
break;
case (PKG_quit):
do_quit ((struct pkg_quit *) packet, addr);
break;
case (PKG_getfield):
do_getfield ((struct pkg_getfield *) packet, addr);
break;
case (PKG_getplayerdata):
do_getplayerdata ((struct pkg_getplayerdata *) packet, addr);
break;
case (PKG_fieldline):
do_fieldline ((struct pkg_fieldline *) packet, addr);
break;
case (PKG_playerstatus):
do_playerstatus ((struct pkg_playerstatus *) packet, addr);
break;
case (PKG_pkgack):
do_pkgack ((struct pkg_pkgack *) packet, addr);
break;
case (PKG_chat):
do_chat ((struct pkg_chat *) packet, addr);
break;
case (PKG_playermove):
do_playermove ((struct pkg_playermove *) packet, addr);
break;
case (PKG_bcmservchat):
do_bcmservchat ((struct pkg_bcmservchat *) packet, addr);
break;
case (PKG_ill):
do_ill ((struct pkg_ill *) packet, addr);
break;
case (PKG_special):
do_special ((struct pkg_special *) packet, addr);
break;
default:
send_error (addr, "BomberClone: unknown data packet");
break;
}
return 0;
};

@ -110,6 +110,7 @@ struct pkg_playerid {
signed char state; signed char state;
short int points; short int points;
short int wins; short int wins;
signed char netflags;
}; };
@ -253,7 +254,7 @@ extern void do_ill (struct pkg_ill *ill_pkg, _net_addr *addr);
extern void do_special (struct pkg_special *sp_pkg, _net_addr *addr); extern void do_special (struct pkg_special *sp_pkg, _net_addr *addr);
extern void send_pkg (struct pkg *packet, _net_addr *addr); extern void send_pkg (struct pkg *packet, _net_addr *addr);
extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr); extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr, signed char netflags);
extern void send_servermode (_net_addr *addr, int pl_nr); extern void send_servermode (_net_addr *addr, int pl_nr);
extern void send_error (_net_addr *addr, char *text); extern void send_error (_net_addr *addr, char *text);
extern void send_field (_net_addr *addr, int x, int y, _field * field); extern void send_field (_net_addr *addr, int x, int y, _field * field);
@ -271,6 +272,8 @@ extern void send_chat (_net_addr *addr, char *text);
extern void send_ill (_net_addr *addr, int p_nr, _player *pl); extern void send_ill (_net_addr *addr, int p_nr, _player *pl);
extern void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr); extern void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr);
extern void fwd_pkg (struct pkg *packet);
extern int get_player_nr (char *host, char *port); extern int get_player_nr (char *host, char *port);
extern int inpkg_check (unsigned char typ, short int id, _net_addr *addr); extern int inpkg_check (unsigned char typ, short int id, _net_addr *addr);

@ -1,4 +1,4 @@
/* $Id: single.c,v 1.25 2003/05/29 17:48:11 stpohle Exp $ */ /* $Id: single.c,v 1.26 2003/05/29 20:49:53 stpohle Exp $ */
/* single player */ /* single player */
#include "basic.h" #include "basic.h"
@ -409,12 +409,8 @@ ai_findbestbombdir (_point pos, int dir, int range)
if (dir != -1 && (bestd & (0xFF -(1 << ai_invertdir(dir))))) if (dir != -1 && (bestd & (0xFF -(1 << ai_invertdir(dir)))))
bestd &= (0xFF - (1 << ai_invertdir(dir))); bestd &= (0xFF - (1 << ai_invertdir(dir)));
d_printf ("ai_bestbombdir (%d,%d) [%d, %d, %d, %d, %d] = ", pos.x, pos.y, points[0], // d_printf ("ai_bestbombdir (%d,%d) [%d, %d, %d, %d, %d]\n", pos.x, pos.y, points[0],
points[1], points[2], points[3], points[4]); // points[1], points[2], points[3], points[4]);
if (debug) {
d_bitprint (bestd, 5);
printf ("\n");
}
return bestd; return bestd;
} }

Loading…
Cancel
Save