|
|
@ -104,6 +104,7 @@ 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;
|
|
|
@ -154,6 +155,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
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.flags = p_id->netflags;
|
|
|
|
pl->net.addr.pl_nr = i;
|
|
|
|
pl->net.addr.pl_nr = i;
|
|
|
|
bman.players_nr_s++;
|
|
|
|
bman.players_nr_s++;
|
|
|
|
|
|
|
|
|
|
|
@ -162,7 +164,8 @@ 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++)
|
|
|
@ -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)
|
|
|
@ -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,8 +389,9 @@ 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 */
|
|
|
@ -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;
|
|
|
@ -914,7 +923,9 @@ 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
|
|
|
|
|
|
|
|
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);
|
|
|
|
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;
|
|
|
@ -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;
|
|
|
|
struct pkg_special sp_dat;
|
|
|
|
|
|
|
|
|
|
|
|
sp_dat.h.typ = PKG_special;
|
|
|
|
sp_dat.h.typ = PKG_special;
|
|
|
@ -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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
int
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
do_pkg (struct pkg *packet, _net_addr * addr) {
|
|
|
|
{
|
|
|
|
|
|
|
|
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)) &&
|
|
|
|
packet->h.typ != PKG_bcmservchat) {
|
|
|
|
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);
|
|
|
|
send_pkgack (addr, packet->h.typ, packet->h.id);
|
|
|
|
|
|
|
|
|
|
|
|
/* check the packet with the index */
|
|
|
|
/* 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 */
|
|
|
|
/* we have got this packet already */
|
|
|
|
d_printf ("-----packet ignored\n");
|
|
|
|
d_printf ("-----packet ignored\n");
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
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))
|
|
|
|
if (packet->h.typ == PKG_servermode && packet->h.len != sizeof (struct pkg_servermode))
|
|
|
|
send_error (addr, "pkg_servermode: packetsize incorrect.");
|
|
|
|
send_error (addr, "pkg_servermode: packetsize incorrect.");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* forward packet */
|
|
|
|
|
|
|
|
if (GT_MP_PTPM)
|
|
|
|
|
|
|
|
fwd_pkg (packet);
|
|
|
|
|
|
|
|
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
switch (packet->h.typ) {
|
|
|
|
case (PKG_error):
|
|
|
|
case (PKG_error):
|
|
|
|
if (do_error ((struct pkg_error *) packet, addr) < 0)
|
|
|
|
if (do_error ((struct pkg_error *) packet, addr) < 0)
|
|
|
|