|
|
@ -61,19 +61,19 @@ send_error (_net_addr * addr, char *text)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
void
|
|
|
|
do_error (struct pkg_error *data, _net_addr * addr)
|
|
|
|
do_error (struct pkg_error *data, _net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
d_printf ("Network Error from %s:%s : '%s'\n", addr->host, addr->port, data->text);
|
|
|
|
d_printf ("Network Error from %s:%s : '%s'\n", addr->host, addr->port, data->text);
|
|
|
|
|
|
|
|
|
|
|
|
network_shutdown ();
|
|
|
|
/* check if the packet comes from the server, the server
|
|
|
|
|
|
|
|
* never gets errormessages from a client, if a client has
|
|
|
|
menu_displaymessage ("Network Error", "Got Error from: %s:%s\nMessage:%s", addr->host,
|
|
|
|
* some trouble the client will just disconnect */
|
|
|
|
addr->port, data->text);
|
|
|
|
if (GT_MP_PTPS && addr->pl_nr == bman.p_servnr) {
|
|
|
|
if (data->nr == 1)
|
|
|
|
menu_displaymessage ("Network Error", "Got Error from: %s:%s\nMessage:%s", addr->host,
|
|
|
|
return -1;
|
|
|
|
addr->port, data->text);
|
|
|
|
else
|
|
|
|
network_shutdown ();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -98,7 +98,7 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
vsu;
|
|
|
|
vsu;
|
|
|
|
char text[255];
|
|
|
|
char text[255];
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("do_joingame (From:%s:%s Player(name:%s)\n", addr->host, addr->port, p_jg->name);
|
|
|
|
d_printf ("do_joingame (From:%s:%s Player(name:%s) addr:%p\n", addr->host, addr->port, p_jg->name, addr);
|
|
|
|
|
|
|
|
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
|
|
|
|
|
|
|
@ -185,9 +185,12 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
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 */
|
|
|
|
|
|
|
|
printf ("ADDR: %p\n", addr);
|
|
|
|
if ((!p_jg->secondplayer) && !(players[j].net.flags & NETF_local2))
|
|
|
|
if ((!p_jg->secondplayer) && !(players[j].net.flags & NETF_local2))
|
|
|
|
send_mapinfo (addr);
|
|
|
|
send_mapinfo (addr);
|
|
|
|
|
|
|
|
printf ("ADDR: %p\n", addr);
|
|
|
|
send_servermode (addr, i); // with this packet the client know it'S pl_nr
|
|
|
|
send_servermode (addr, i); // with this packet the client know it'S pl_nr
|
|
|
|
|
|
|
|
printf ("ADDR: %p\n", addr);
|
|
|
|
|
|
|
|
|
|
|
|
addr->pl_nr = i;
|
|
|
|
addr->pl_nr = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -611,30 +614,32 @@ void
|
|
|
|
send_servermode (_net_addr * addr, int pl_nr)
|
|
|
|
send_servermode (_net_addr * addr, int pl_nr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct pkg_servermode s_mod;
|
|
|
|
struct pkg_servermode s_mod;
|
|
|
|
|
|
|
|
|
|
|
|
switch (bman.state) {
|
|
|
|
switch (bman.state) {
|
|
|
|
case (GS_startup):
|
|
|
|
case (GS_startup):
|
|
|
|
d_printf ("Send ServerMode : startup\n");
|
|
|
|
d_printf ("Send ServerMode : startup");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (GS_ready):
|
|
|
|
case (GS_ready):
|
|
|
|
d_printf ("Send ServerMode : ready\n");
|
|
|
|
d_printf ("Send ServerMode : ready");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (GS_running):
|
|
|
|
case (GS_running):
|
|
|
|
d_printf ("Send ServerMode : running\n");
|
|
|
|
d_printf ("Send ServerMode : running");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (GS_quit):
|
|
|
|
case (GS_quit):
|
|
|
|
d_printf ("Send ServerMode : quit\n");
|
|
|
|
d_printf ("Send ServerMode : quit");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (GS_wait):
|
|
|
|
case (GS_wait):
|
|
|
|
d_printf ("Send ServerMode : wait\n");
|
|
|
|
d_printf ("Send ServerMode : wait");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (GS_update):
|
|
|
|
case (GS_update):
|
|
|
|
d_printf ("Send ServerMode : update\n");
|
|
|
|
d_printf ("Send ServerMode : update");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
d_printf ("Send ServerMode : mode %d\n", s_mod.state);
|
|
|
|
d_printf ("Send ServerMode : mode %d", s_mod.state);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("Addr: %p\n", addr);
|
|
|
|
|
|
|
|
|
|
|
|
s_mod.h.typ = PKG_servermode;
|
|
|
|
s_mod.h.typ = PKG_servermode;
|
|
|
|
s_mod.h.len = HTON16 (sizeof (struct pkg_servermode));
|
|
|
|
s_mod.h.len = HTON16 (sizeof (struct pkg_servermode));
|
|
|
|
s_mod.h.flags = PKGF_ackreq;
|
|
|
|
s_mod.h.flags = PKGF_ackreq;
|
|
|
@ -1467,10 +1472,7 @@ void
|
|
|
|
do_pkgack (struct pkg_pkgack *p_ack, _net_addr * addr)
|
|
|
|
do_pkgack (struct pkg_pkgack *p_ack, _net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
d_printf ("do_pkgack (%s:%s)\n", addr->host, addr->port);
|
|
|
|
d_printf ("do_pkgack (%s:%s)\n", addr->host, addr->port);
|
|
|
|
if (rscache_getpos (addr, p_ack->typ, NTOH16 (p_ack->id)) == -1)
|
|
|
|
rscache_del (addr, p_ack->typ, NTOH16 (p_ack->id));
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rscache_del ();
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1573,7 +1575,9 @@ void
|
|
|
|
send_mapinfo (_net_addr * addr)
|
|
|
|
send_mapinfo (_net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct pkg_mapinfo map_pkg;
|
|
|
|
struct pkg_mapinfo map_pkg;
|
|
|
|
|
|
|
|
#ifndef BUG_MAPINFO
|
|
|
|
|
|
|
|
_net_addr *test; // VERY DIRTY WORKAROUND WHY IS HERE A BUG
|
|
|
|
|
|
|
|
#endif
|
|
|
|
map_pkg.h.typ = PKG_mapinfo;
|
|
|
|
map_pkg.h.typ = PKG_mapinfo;
|
|
|
|
map_pkg.h.len = HTON16 (sizeof (struct pkg_mapinfo));
|
|
|
|
map_pkg.h.len = HTON16 (sizeof (struct pkg_mapinfo));
|
|
|
|
map_pkg.h.flags = PKGF_ackreq;
|
|
|
|
map_pkg.h.flags = PKGF_ackreq;
|
|
|
@ -1589,17 +1593,25 @@ send_mapinfo (_net_addr * addr)
|
|
|
|
map_pkg.sp_push = map.sp_push;
|
|
|
|
map_pkg.sp_push = map.sp_push;
|
|
|
|
map_pkg.start_bombs = bman.start_bombs;
|
|
|
|
map_pkg.start_bombs = bman.start_bombs;
|
|
|
|
map_pkg.start_range = bman.start_range;
|
|
|
|
map_pkg.start_range = bman.start_range;
|
|
|
|
sprintf (map_pkg.start_speed, "%6f", bman.start_speed);
|
|
|
|
sprintf (map_pkg.start_speed, "%4f", bman.start_speed);
|
|
|
|
sprintf (map_pkg.bomb_tickingtime, "%6f", bman.bomb_tickingtime);
|
|
|
|
sprintf (map_pkg.bomb_tickingtime, "%4f", bman.bomb_tickingtime);
|
|
|
|
|
|
|
|
|
|
|
|
if (map.random_tileset)
|
|
|
|
if (map.random_tileset)
|
|
|
|
map_pkg.tileset[0] = 0;
|
|
|
|
map_pkg.tileset[0] = 0;
|
|
|
|
else
|
|
|
|
else
|
|
|
|
strcpy (map_pkg.tileset, map.tileset);
|
|
|
|
strncpy (map_pkg.tileset, map.tileset, LEN_TILESETNAME);
|
|
|
|
map_pkg.map_selection = map.map_selection;
|
|
|
|
map_pkg.map_selection = map.map_selection;
|
|
|
|
strcpy (map_pkg.mapname, map.map);
|
|
|
|
strncpy (map_pkg.mapname, map.map, LEN_FILENAME);
|
|
|
|
d_printf ("send_mapinfo: Tileset: %s\n", map.tileset);
|
|
|
|
d_printf ("send_mapinfo: Tileset: %s\n", map.tileset);
|
|
|
|
|
|
|
|
#ifndef BUG_MAPINFO
|
|
|
|
|
|
|
|
test = addr; // VERY DIRTY WORKAROUND WHY IS HERE A BUG
|
|
|
|
send_pkg ((struct pkg *) &map_pkg, addr);
|
|
|
|
send_pkg ((struct pkg *) &map_pkg, addr);
|
|
|
|
|
|
|
|
addr = test; // VERY DIRTY WORKAROUND WHY IS HERE A BUG
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
printf ("Addr before send: %p\n", addr);
|
|
|
|
|
|
|
|
send_pkg ((struct pkg *) &map_pkg, addr);
|
|
|
|
|
|
|
|
printf ("Addr after send: %p\n", addr);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1618,9 +1630,9 @@ do_mapinfo (struct pkg_mapinfo *map_pkg, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
map.random_tileset = 0;
|
|
|
|
map.random_tileset = 0;
|
|
|
|
strcpy (map.tileset, map_pkg->tileset);
|
|
|
|
strncpy (map.tileset, map_pkg->tileset, LEN_TILESETNAME);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
strcpy (map.map, map_pkg->mapname);
|
|
|
|
strncpy (map.map, map_pkg->mapname, LEN_FILENAME);
|
|
|
|
map.map_selection = map_pkg->map_selection;
|
|
|
|
map.map_selection = map_pkg->map_selection;
|
|
|
|
map.size.x = map_pkg->size_x;
|
|
|
|
map.size.x = map_pkg->size_x;
|
|
|
|
map.size.y = map_pkg->size_y;
|
|
|
|
map.size.y = map_pkg->size_y;
|
|
|
@ -1703,6 +1715,7 @@ do_gameinfo (struct pkg_gameinfo *pgi, _net_addr * addr)
|
|
|
|
strncpy (pgi->version, VERSION, LEN_VERSION);
|
|
|
|
strncpy (pgi->version, VERSION, LEN_VERSION);
|
|
|
|
pgi->maxplayers = bman.maxplayer;
|
|
|
|
pgi->maxplayers = bman.maxplayer;
|
|
|
|
pgi->curplayers = bman.players_nr_s;
|
|
|
|
pgi->curplayers = bman.players_nr_s;
|
|
|
|
|
|
|
|
pgi->h.len = HTON16 (sizeof (struct pkg_gameinfo));
|
|
|
|
strncpy (pgi->gamename, bman.gamename, LEN_GAMENAME);
|
|
|
|
strncpy (pgi->gamename, bman.gamename, LEN_GAMENAME);
|
|
|
|
send_pkg ((struct pkg *) pgi, addr);
|
|
|
|
send_pkg ((struct pkg *) pgi, addr);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1711,7 +1724,6 @@ do_gameinfo (struct pkg_gameinfo *pgi, _net_addr * addr)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** WE ARE NOT THE MASTER OF THIS GAME **\n",
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** WE ARE NOT THE MASTER OF THIS GAME **\n",
|
|
|
|
addr->host, addr->port);
|
|
|
|
addr->host, addr->port);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1807,10 +1819,8 @@ send_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
/* if PKGF_ackreq is set add the packet to the resendcache
|
|
|
|
/* if PKGF_ackreq is set add the packet to the resendcache
|
|
|
|
* so we can resend it if no PKF_ackreq returned for the packet. */
|
|
|
|
* so we can resend it if no PKF_ackreq returned for the packet. */
|
|
|
|
if (packet->h.flags & PKGF_ackreq) {
|
|
|
|
if (packet->h.flags & PKGF_ackreq)
|
|
|
|
if (rscache_add (addr, packet) == -1)
|
|
|
|
rscache_add (addr, packet);
|
|
|
|
d_printf ("resend_cache overrun.... packet throw away.\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1841,15 +1851,22 @@ fwd_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
forward it to all needed functions, like inpkg_check()--> send answer if needed,
|
|
|
|
forward it to all needed functions, like inpkg_check()--> send answer if needed,
|
|
|
|
if we are the server then forward the packet if needed
|
|
|
|
if we are the server then forward the packet if needed
|
|
|
|
and go into the do_PACKETTYP function */
|
|
|
|
and go into the do_PACKETTYP function */
|
|
|
|
int
|
|
|
|
void
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr, int len)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
d_printf ("do_pkg: addr %p, pkg %p\n", addr, packet);
|
|
|
|
if (((packet->h.flags & PKGF_ipv6) == 0 && bman.net_ai_family != PF_INET)
|
|
|
|
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.flags & PKGF_ipv6) != 0 && bman.net_ai_family == PF_INET)) {
|
|
|
|
d_printf ("do_pkg: packet comes from the wrong network type\n");
|
|
|
|
d_printf ("do_pkg: packet comes from the wrong network type\n");
|
|
|
|
return 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Check the size of the incoming packet */
|
|
|
|
|
|
|
|
if (len != NTOH16(packet->h.len)) {
|
|
|
|
|
|
|
|
d_printf ("do_pkg: len of the incoming packet is not the same as in pkg->h.len\n");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* get the addr and set the ping timeout value
|
|
|
|
/* get the addr and set the ping timeout value
|
|
|
|
* check if the packet is from a player in the game and not from someone else
|
|
|
|
* check if the packet is from a player in the game and not from someone else
|
|
|
|
* this exception is only for PKG_joingame, PKG_error */
|
|
|
|
* this exception is only for PKG_joingame, PKG_error */
|
|
|
@ -1857,7 +1874,7 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
if ((addr->pl_nr < 0 || addr->pl_nr >= MAX_PLAYERS) && packet->h.typ > PKG_joingame
|
|
|
|
if ((addr->pl_nr < 0 || addr->pl_nr >= MAX_PLAYERS) && packet->h.typ > PKG_joingame
|
|
|
|
&& PS_IS_netplayer (players[addr->pl_nr].state)) {
|
|
|
|
&& PS_IS_netplayer (players[addr->pl_nr].state)) {
|
|
|
|
d_printf ("do_pkg: error addr->pl_nr out of range\n");
|
|
|
|
d_printf ("do_pkg: error addr->pl_nr out of range\n");
|
|
|
|
return 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
@ -1881,7 +1898,7 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
d_printf ("do_pkg: double packet ignoring addr->pl_nr=%d\n", addr->pl_nr);
|
|
|
|
d_printf ("do_pkg: double packet ignoring addr->pl_nr=%d\n", addr->pl_nr);
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
players[addr->pl_nr].net.pkgopt.to_2sec++;
|
|
|
|
players[addr->pl_nr].net.pkgopt.to_2sec++;
|
|
|
|
return 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1891,9 +1908,8 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
case (PKG_error):
|
|
|
|
case (PKG_error):
|
|
|
|
if (do_error ((struct pkg_error *) packet, addr) < 0)
|
|
|
|
do_error ((struct pkg_error *) packet, addr);
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case (PKG_gameinfo):
|
|
|
|
case (PKG_gameinfo):
|
|
|
|
do_gameinfo ((struct pkg_gameinfo *) packet, addr);
|
|
|
|
do_gameinfo ((struct pkg_gameinfo *) packet, addr);
|
|
|
@ -1977,6 +1993,4 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|