diff --git a/src/basic.h b/src/basic.h index c81675f..39d1edd 100644 --- a/src/basic.h +++ b/src/basic.h @@ -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, diff --git a/src/bomberclone.h b/src/bomberclone.h index 96a706b..f53bb7d 100644 --- a/src/bomberclone.h +++ b/src/bomberclone.h @@ -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 diff --git a/src/configuration.c b/src/configuration.c index b94c5eb..e5bab16 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -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); diff --git a/src/netmenu.c b/src/netmenu.c index 00f50f5..ae7f03d 100644 --- a/src/netmenu.c +++ b/src/netmenu.c @@ -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; } diff --git a/src/network.c b/src/network.c index cb39c40..2cbbc30 100644 --- a/src/network.c +++ b/src/network.c @@ -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; @@ -356,7 +360,7 @@ void net_change_playerid (int pl_nr, unsigned char senddata) { int i; - + if (GT_MP_PTPM) { /* 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) 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); }; diff --git a/src/network.h b/src/network.h index e408ec0..51b23c8 100644 --- a/src/network.h +++ b/src/network.h @@ -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; diff --git a/src/packets.c b/src/packets.c index 4113c0e..fc835de 100644 --- a/src/packets.c +++ b/src/packets.c @@ -11,9 +11,9 @@ extern _point debug_field; extern int debug_lastping; -static short int pkg_lastid; /* the packet id, this will only counted - up nothing more.. if we are at 0x10000 - we will start at 0 */ +static short int pkg_lastid; /* the packet id, this will only counted + up nothing more.. if we are at 0x10000 + we will start at 0 */ struct _resend_cache resend_cache; struct _inpkg_index inpkg_index[PKG_IN_INDEX_NUM]; @@ -75,7 +75,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr) j, vma, vmi, - vsu; + vsu; char text[255]; 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); 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; + pl->net.addr.pl_nr = addr->pl_nr; strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME); strncpy (pl->net.addr.port, p_id->port, LEN_PORT); 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); player_set_gfx (pl, p_id->gfx_nr); - - /* Reset the network data */ + + /* Reset the network data */ pl->net.timestamp = timestamp; - pl->net.pkgopt.to_timestamp = timestamp; - pl->net.pkgopt.to_2sec = 0; - pl->net.pkgopt.send_to = 0; - pl->net.pkgopt.send_set = PKG_SENDSETOPT; - + pl->net.pkgopt.to_timestamp = timestamp; + pl->net.pkgopt.to_2sec = 0; + pl->net.pkgopt.send_to = 0; + pl->net.pkgopt.send_set = PKG_SENDSETOPT; + strncpy (pl->net.addr.host, addr->host, LEN_SERVERNAME); 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.addr.pl_nr = i; + pl->net.flags = p_id->netflags; + pl->net.addr.pl_nr = i; bman.players_nr_s++; /* 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++) 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; - if (bman.notifygamemaster) - gamesrv_sendmode (bman.maxplayer, j); + bman.updatestatusbar = 1; + if (bman.notifygamemaster) + gamesrv_sendmode (bman.maxplayer, j); } else if (GS_WAITRUNNING) { @@ -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) @@ -269,9 +275,9 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr) bman.fieldsize.x = s_mod->fieldsize_x; bman.fieldsize.y = s_mod->fieldsize_y; } - strncpy (gfx.tileset, s_mod->tileset, LEN_TILESETNAME); - - bman.updatestatusbar = 1; + strncpy (gfx.tileset, s_mod->tileset, LEN_TILESETNAME); + + bman.updatestatusbar = 1; }; @@ -293,7 +299,7 @@ send_servermode (_net_addr * addr, int pl_nr) s_mod.last_winner = bman.lastwinner; s_mod.fieldsize_x = bman.fieldsize.x; 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); }; @@ -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,11 +389,12 @@ 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 */ + for the timeout again */ }; @@ -432,7 +440,7 @@ do_playerdata (struct pkg_playerdata *p_dat, _net_addr * addr) return; 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]; 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 && 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 - 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); - } - - if (bomb->state==BS_off && (b_dat->state == BS_ticking || b_dat->state == BS_trigger)) - snd_play (SND_bombdrop); - + + 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); + } + + 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; bomb->pos.y = b_dat->y; if (bomb->state != BS_ticking) bomb->to = b_dat->to; - else - bman.bfield[bomb->pos.x][bomb->pos.y] = 1; // keep the bfield up to date + else + bman.bfield[bomb->pos.x][bomb->pos.y] = 1; // keep the bfield up to date bomb->r = b_dat->r; 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; - + }; @@ -677,11 +685,11 @@ do_quit (struct pkg_quit *q_dat, _net_addr * addr) /* the player who send this quit */ net_delplayer (addr->pl_nr); 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); if (pl_nr == -1) return; - + net_delplayer (pl_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; @@ -774,7 +783,7 @@ do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr) 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].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; } }; @@ -914,33 +923,37 @@ 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) { - d_printf ("do_special (addr %d, pl_nr %d, typ %d)\n", addr->pl_nr, sp_pkg->pl_nr, sp_pkg->typ); +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; if (sp_pkg->pl_nr == -1) 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) return; - bman.players[sp_pkg->pl_nr].special = sp_pkg->typ; - bman.last_ex_nr = sp_pkg->ex_nr; - special_use (sp_pkg->pl_nr); + bman.players[sp_pkg->pl_nr].special = sp_pkg->typ; + bman.last_ex_nr = sp_pkg->ex_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; sp_dat.h.typ = PKG_special; sp_dat.h.len = sizeof (struct pkg_special); sp_dat.h.flags = PKGF_ackreq; sp_dat.pl_nr = p_nr; - sp_dat.typ = typ; - sp_dat.ex_nr = ex_nr; + sp_dat.typ = typ; + sp_dat.ex_nr = ex_nr; send_pkg ((struct pkg *) &sp_dat, addr); }; @@ -949,8 +962,8 @@ void do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr * addr) { packet->data[127] = 0; - if (strstr (packet->data,"BC:BC:") == packet->data) - return; // ignore packet + if (strstr (packet->data, "BC:BC:") == packet->data) + return; // ignore packet chat_addline (packet->data); net_send_chat (packet->data, 0); }; @@ -961,7 +974,7 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr) { int i, pos; - + /* find packet */ for (i = 0, pos = -1; (i < PKG_IN_INDEX_NUM && pos == -1); i++) 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 */ if (++inpkg_index_pos >= PKG_IN_INDEX_NUM) inpkg_index_pos = 0; - + inpkg_index[inpkg_index_pos].pl_nr = addr->pl_nr; inpkg_index[inpkg_index_pos].typ = typ; inpkg_index[inpkg_index_pos].id = id; @@ -997,103 +1010,125 @@ send_pkg (struct pkg *packet, _net_addr * addr) } }; - - -int -do_pkg (struct pkg *packet, _net_addr * addr) +/* forward the packet to all who are behind a firewall */ +void +fwd_pkg (struct pkg *packet) { - 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; - } + int pl; - /* 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."); - - 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; - } + if (GT_MP_PTPS) /* clients don't forward anything */ + return; - 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; + }; diff --git a/src/packets.h b/src/packets.h index f3afd5e..9a62645 100644 --- a/src/packets.h +++ b/src/packets.h @@ -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); diff --git a/src/single.c b/src/single.c index aca9c4c..6050c0d 100644 --- a/src/single.c +++ b/src/single.c @@ -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; }