|
|
|
@ -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,
|
|
|
|
@ -143,18 +144,19 @@ 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);
|
|
|
|
|
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.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);
|
|
|
|
@ -593,26 +601,26 @@ 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
|
|
|
|
|
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_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_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,7 +685,7 @@ 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;
|
|
|
|
@ -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,8 +923,10 @@ 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;
|
|
|
|
|
|
|
|
|
@ -926,21 +937,23 @@ void do_special (struct pkg_special *sp_pkg, _net_addr *addr) {
|
|
|
|
|
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);
|
|
|
|
|
};
|
|
|
|
@ -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;
|
|
|
|
|
};
|
|
|
|
|