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
enum _networkflags {
NETF_firewall = 1
};
enum _backgound { // to load some diffrent logos..
BG_start = 0,
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 */
#ifndef _BOMBERCLONE_H_
@ -153,6 +153,7 @@ struct __bomberclone {
_serverlist serverlist[MAX_SERVERENTRYS]; // ** CONFIG name of the server we are connected to
char gamename[LEN_GAMENAME]; // this will hold the game name
char gamemaster[LEN_SERVERNAME + LEN_PORT + 2]; // ** CONFIG ... GameMaster Address
unsigned char firewall;
unsigned char notifygamemaster;
unsigned char askplayername; // ask player for name at startup
signed char debug; // 0 = off 1 = on

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

@ -79,7 +79,8 @@ networkmenu_options ()
{2, "Network"},
{3, "Notify Masterserver"},
{4, "Masterserver"},
{5, "Return To Multiplayer Menu"},
{5, "Behind a Firewall"},
{6, "Return To Multiplayer Menu"},
{-1, ""}
};
#ifdef _WIN32
@ -95,6 +96,11 @@ networkmenu_options ()
else
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)
sprintf (menu[3].text, "Notify MasterServer: Yes");
else
@ -141,7 +147,14 @@ networkmenu_options ()
LEN_SERVERNAME + LEN_PORT + 2);
break;
case (5):
case (5): // Firewall Option
if (bman.firewall)
bman.firewall = 0;
else
bman.firewall = 1;
break;
case (6):
menuselect = -1;
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.
*/
@ -159,7 +159,11 @@ network_init ()
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,
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;
@ -365,7 +369,7 @@ net_change_playerid (int pl_nr, unsigned char senddata)
if (bman.players[i].net.addr.host[0] != 0)
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,
pl_nr, bman.players[pl_nr].gfx_nr);
pl_nr, bman.players[pl_nr].gfx_nr, bman.players[pl_nr].net.flags);
}
else {
/*
@ -374,7 +378,7 @@ net_change_playerid (int pl_nr, unsigned char senddata)
if (pl_nr == bman.p_nr && senddata)
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,
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);
@ -542,7 +546,7 @@ net_game_send_player (int p_nr)
}
else if (p_nr == bman.p_nr) {
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]);
}
};
@ -559,7 +563,7 @@ net_game_send_playermove (int p_nr, int mustsend)
pl = &bman.players[p_nr];
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);
/* network packet send control */
@ -583,7 +587,7 @@ net_game_send_bomb (int p, int b)
return;
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]);
};
@ -599,7 +603,7 @@ net_game_send_field (int x, int y)
return;
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]);
};
@ -670,7 +674,7 @@ net_send_servermode ()
int 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);
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++)
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].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;
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);
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);
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]);
};
@ -797,6 +801,6 @@ net_game_send_special (int pl_nr, int ex_nr)
return;
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);
};

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

@ -104,6 +104,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
pl->net.timestamp = timestamp;
pl->net.pingreq = pl->net.pingack + 5;
pl->net.flags = p_id->netflags;
if (p_id->host[0] != 0) {
pl->net.addr.pl_nr = addr->pl_nr;
@ -154,6 +155,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
strncpy (pl->net.addr.port, 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);
pl->net.flags = p_id->netflags;
pl->net.addr.pl_nr = i;
bman.players_nr_s++;
@ -162,13 +164,14 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
for (j = 0; j < MAX_PLAYERS; j++)
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,
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;
for (j = 0, i = 0; i < bman.maxplayer; i++)
if (PS_IS_used (bman.players[i].state))
j++;
bman.updatestatusbar=1;
bman.updatestatusbar = 1;
if (bman.notifygamemaster)
gamesrv_sendmode (bman.maxplayer, j);
}
@ -193,11 +196,13 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
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;
int vmi,
vma, vsu;
vma,
vsu;
d_printf ("send_playerid SendTo: %s:%s (Name:%16s p_nr:%d)\n", addr->host, addr->port, name,
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_major = vma;
p_id.ver_minor = vmi;
p_id.netflags = netflags;
strncpy (p_id.name, name, LEN_PLAYERNAME);
if (pladdr == NULL)
@ -355,7 +361,8 @@ do_ping (struct pkg_ping *p_dat, _net_addr * addr)
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,
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,8 +389,9 @@ send_ping (_net_addr * addr, int data, unsigned char typ)
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,
bman.players[addr->pl_nr].net.pingreq, bman.players[addr->pl_nr].net.pingack);
d_printf ("send_ping Player[%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);
bman.players[addr->pl_nr].net.timestamp = timestamp; /* we need to set it here, so we can check
for the timeout again */
@ -593,13 +601,13 @@ do_bombdata (struct pkg_bombdata *b_dat, _net_addr * addr)
&& b_dat->state != BS_exploding)
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
draw_stone(bomb->pos.x,bomb->pos.y);
field_update(bomb->pos.x,bomb->pos.y);
draw_stone (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);
bomb->pos.x = b_dat->x;
@ -612,7 +620,7 @@ do_bombdata (struct pkg_bombdata *b_dat, _net_addr * addr)
bomb->ex_nr = b_dat->ex_nr;
bomb->state = b_dat->state;
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)
bman.last_ex_nr = bomb->ex_nr;
@ -751,7 +759,8 @@ send_fieldline (_net_addr * addr, int line)
void
do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr)
{
int i, d;
int i,
d;
if (addr->pl_nr == -1)
return;
@ -914,7 +923,9 @@ do_pkgack (struct pkg_pkgack *p_ack, _net_addr * addr)
/* Player Special
* moves/bombs... whatever will be send as we use it */
void do_special (struct pkg_special *sp_pkg, _net_addr *addr) {
void
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)
return;
@ -932,7 +943,9 @@ void do_special (struct pkg_special *sp_pkg, _net_addr *addr) {
};
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;
sp_dat.h.typ = PKG_special;
@ -949,7 +962,7 @@ void
do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr * addr)
{
packet->data[127] = 0;
if (strstr (packet->data,"BC:BC:") == packet->data)
if (strstr (packet->data, "BC:BC:") == packet->data)
return; // ignore packet
chat_addline (packet->data);
net_send_chat (packet->data, 0);
@ -997,11 +1010,27 @@ send_pkg (struct pkg *packet, _net_addr * addr)
}
};
/* forward the packet to all who are behind a firewall */
void
fwd_pkg (struct pkg *packet)
{
int pl;
if (GT_MP_PTPS) /* clients don't forward anything */
return;
int
do_pkg (struct pkg *packet, _net_addr * addr)
{
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) {
@ -1019,7 +1048,8 @@ do_pkg (struct pkg *packet, _net_addr * addr)
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) {
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)
@ -1031,6 +1061,11 @@ do_pkg (struct pkg *packet, _net_addr * addr)
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)
@ -1096,4 +1131,4 @@ do_pkg (struct pkg *packet, _net_addr * addr)
}
return 0;
};
};

@ -110,6 +110,7 @@ struct pkg_playerid {
signed char state;
short int points;
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 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_error (_net_addr *addr, char *text);
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_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 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 */
#include "basic.h"
@ -409,12 +409,8 @@ ai_findbestbombdir (_point pos, int dir, int range)
if (dir != -1 && (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],
points[1], points[2], points[3], points[4]);
if (debug) {
d_bitprint (bestd, 5);
printf ("\n");
}
// 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]);
return bestd;
}

Loading…
Cancel
Save