|
|
|
@ -128,8 +128,7 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
|
for (i = -1, freeslot = -1, j = 0; j < MAX_PLAYERS; j++) {
|
|
|
|
|
if (!PS_IS_used (players[j].state) && freeslot == -1) freeslot = j;
|
|
|
|
|
if (strncmp (players[j].net.addr.host, addr->host, LEN_SERVERNAME) == 0
|
|
|
|
|
&& strncmp (players[j].net.addr.port, addr->port, LEN_PORT) == 0
|
|
|
|
|
&& p_jg->netflags == players[j].net.flags) i = j;
|
|
|
|
|
&& strncmp (players[j].net.addr.port, addr->port, LEN_PORT) == 0) i = j;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i == -1) i = freeslot;
|
|
|
|
@ -150,7 +149,9 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
|
team_choose (pl);
|
|
|
|
|
}
|
|
|
|
|
strncpy (pl->name, p_jg->name, LEN_PLAYERNAME);
|
|
|
|
|
player_set_gfx (pl, -1);
|
|
|
|
|
pl->gfx_nr = -1;
|
|
|
|
|
pl->gfx = NULL;
|
|
|
|
|
pl->state &= (0xFF - (PSF_alife + PSF_playing));
|
|
|
|
|
|
|
|
|
|
/* Reset the network data */
|
|
|
|
|
pl->net.timestamp = timestamp;
|
|
|
|
@ -163,7 +164,10 @@ do_joingame (struct pkg_joingame *p_jg, _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_jg->netflags;
|
|
|
|
|
if (p_jg->secondplayer)
|
|
|
|
|
pl->net.flags = NETF_local2 + NETF_firewall;
|
|
|
|
|
else
|
|
|
|
|
pl->net.flags = NETF_firewall;
|
|
|
|
|
pl->net.addr.pl_nr = i;
|
|
|
|
|
bman.players_nr_s++;
|
|
|
|
|
|
|
|
|
@ -173,9 +177,9 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
addr->pl_nr = i;
|
|
|
|
|
|
|
|
|
|
/* Send all connected players the new PlayerID */
|
|
|
|
|
/* Send all connected players the new PlayerID, except to the new player */
|
|
|
|
|
for (i = 0; i < MAX_PLAYERS; i++)
|
|
|
|
|
if (NET_CANSEND(i))
|
|
|
|
|
if (NET_CANSEND(i) && addr->pl_nr != i)
|
|
|
|
|
send_playerid (&players[i].net.addr, pl->name, pl->net.addr.host,
|
|
|
|
|
pl->net.addr.port, pl->net.addr.pl_nr, pl->gfx_nr,
|
|
|
|
|
pl->team_nr, pl->net.flags);
|
|
|
|
@ -198,7 +202,7 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
send_joingame (_net_addr * addr, char *name, int flags)
|
|
|
|
|
send_joingame (_net_addr * addr, char *name, int secondplayer)
|
|
|
|
|
{
|
|
|
|
|
struct pkg_joingame p_jg;
|
|
|
|
|
int vmi,
|
|
|
|
@ -215,7 +219,7 @@ send_joingame (_net_addr * addr, char *name, int flags)
|
|
|
|
|
p_jg.ver_sub = vsu;
|
|
|
|
|
p_jg.ver_major = vma;
|
|
|
|
|
p_jg.ver_minor = vmi;
|
|
|
|
|
p_jg.netflags = flags;
|
|
|
|
|
p_jg.secondplayer = secondplayer;
|
|
|
|
|
strncpy (p_jg.name, name, LEN_PLAYERNAME);
|
|
|
|
|
strncpy (p_jg.password, bman.password, LEN_PASSWORD);
|
|
|
|
|
|
|
|
|
@ -223,6 +227,58 @@ send_joingame (_net_addr * addr, char *name, int flags)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
*** Packettype: contest
|
|
|
|
|
*** Test the connection from a new player for the firewall flag.
|
|
|
|
|
*** This packet will be send from one player to the other the
|
|
|
|
|
*** current server will only get this packet if a connection test was positive
|
|
|
|
|
***/
|
|
|
|
|
void do_contest (struct pkg_contest *ct_pkg, _net_addr *addr) {
|
|
|
|
|
d_printf ("do_contest (pl_nr = %d) from=%d to=%d\n", addr->pl_nr, ct_pkg->from, ct_pkg->to);
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr >= MAX_PLAYERS
|
|
|
|
|
|| (addr->pl_nr == -1 && PS_IS_netplayer(players[ct_pkg->from].state))) {
|
|
|
|
|
d_printf (" addr->pl_nr out of range (0-MAX_PLAYERS)\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* master will have to change the firewall flag on a player */
|
|
|
|
|
if (GT_MP_PTPM) {
|
|
|
|
|
if (ct_pkg->from < 0 || ct_pkg->from >= MAX_PLAYERS) {
|
|
|
|
|
if ((ct_pkg->to < 0 || ct_pkg->to >= MAX_PLAYERS) && addr->pl_nr != ct_pkg->from)
|
|
|
|
|
d_printf (" from or to value out of range (0-MAX_PLAYERS)\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
players[ct_pkg->to].net.flags &= (0xFF - NETF_firewall);
|
|
|
|
|
net_game_send_player (ct_pkg->to);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* if a client get this packet we send a packet
|
|
|
|
|
* to the server that we have got this packet. */
|
|
|
|
|
else
|
|
|
|
|
send_contest (&players[bman.p_servnr].net.addr, ct_pkg->from, bman.p_nr, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void send_contest (_net_addr * addr, int from, int to, int ackreq) {
|
|
|
|
|
struct pkg_contest ct_pkg;
|
|
|
|
|
|
|
|
|
|
d_printf ("send_contest addr->id%d, from:%d, to:%d\n", addr->pl_nr, from, to);
|
|
|
|
|
|
|
|
|
|
ct_pkg.h.typ = PKG_contest;
|
|
|
|
|
if (ackreq) ct_pkg.h.flags = PKGF_ackreq;
|
|
|
|
|
else ct_pkg.h.flags = 0;
|
|
|
|
|
ct_pkg.h.len = HTON16 (sizeof (struct pkg_contest));
|
|
|
|
|
|
|
|
|
|
ct_pkg.from = from;
|
|
|
|
|
ct_pkg.to = to;
|
|
|
|
|
|
|
|
|
|
send_pkg ((struct pkg *) &ct_pkg, addr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
*** Packettype: playerid
|
|
|
|
|
*** Update Playerinformation, Teampoints of a Player, Points
|
|
|
|
@ -248,6 +304,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
for (i = 0; i < MAX_PLAYERS; i++)
|
|
|
|
|
send_playerid (addr, players[i].name, players[i].net.addr.host, players[i].net.addr.port, i, players[i].gfx_nr, players[i].team_nr, players[i].net.flags);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* check if we have to update someones data
|
|
|
|
|
*/
|
|
|
|
@ -256,17 +313,9 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
pl = &players[p_id->pl_nr];
|
|
|
|
|
|
|
|
|
|
pl->state = p_id->state;
|
|
|
|
|
if (p_id->pl_nr != bman.p_nr && PS_IS_used (pl->state))
|
|
|
|
|
pl->state |= PSF_net;
|
|
|
|
|
else
|
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
|
|
|
|
|
|
if (pl->gfx_nr != p_id->gfx_nr) player_set_gfx (pl, p_id->gfx_nr);
|
|
|
|
|
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 (GT_MP_PTPS) pl->net.flags = p_id->netflags;
|
|
|
|
|
if (p_id->host[0] != 0) {
|
|
|
|
|
pl->net.addr.pl_nr = addr->pl_nr;
|
|
|
|
|
strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME);
|
|
|
|
@ -282,6 +331,24 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
memcpy (&pl->net.addr.sAddr, &players[bman.p_servnr].net.addr.sAddr, sizeof (struct _sockaddr));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check if we have to make a network test.. only client to client */
|
|
|
|
|
if (GT_MP_PTPS && !(PS_IS_netplayer (pl->state)) && (PS_IS_netplayer (p_id->state))
|
|
|
|
|
&& p_id->pl_nr != bman.p_servnr && p_id->pl_nr != bman.p_nr) {
|
|
|
|
|
|
|
|
|
|
send_contest (&pl->net.addr, bman.p_nr, -1, 0); // send contest without ackreq.
|
|
|
|
|
/* make sure we still get messages from the server, this is a
|
|
|
|
|
* work around for some hardware routers */
|
|
|
|
|
send_contest (&players[bman.p_servnr].net.addr, bman.p_nr, -1, 1);
|
|
|
|
|
}
|
|
|
|
|
pl->state = p_id->state;
|
|
|
|
|
if (p_id->pl_nr != bman.p_nr && PS_IS_used (pl->state))
|
|
|
|
|
pl->state |= PSF_net;
|
|
|
|
|
else
|
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
|
|
|
|
|
|
if (pl->gfx_nr != p_id->gfx_nr) player_set_gfx (pl, p_id->gfx_nr);
|
|
|
|
|
strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
|
|
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
pl->points = NTOH16 (p_id->points);
|
|
|
|
|
pl->wins = NTOH16 (p_id->wins);
|
|
|
|
@ -297,7 +364,7 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
net_change_playerid (addr->pl_nr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d_playerdetail ("*** PLAYER List ***");
|
|
|
|
|
// d_playerdetail ("*** PLAYER List ***");
|
|
|
|
|
team_update ();
|
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
|
};
|
|
|
|
@ -308,13 +375,9 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport,
|
|
|
|
|
int pl_nr, int gfx_nr, int team_nr, signed char netflags)
|
|
|
|
|
{
|
|
|
|
|
struct pkg_playerid p_id;
|
|
|
|
|
int vmi,
|
|
|
|
|
vma,
|
|
|
|
|
vsu;
|
|
|
|
|
|
|
|
|
|
d_printf ("send_playerid SendTo: %s:%s (Name:%16s p_nr:%d)\n", addr->host,
|
|
|
|
|
addr->port, name, pl_nr);
|
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
|
|
|
|
|
|
p_id.h.typ = PKG_playerid;
|
|
|
|
|
p_id.h.flags = PKGF_ackreq;
|
|
|
|
@ -375,22 +438,26 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr)
|
|
|
|
|
/* if we just have connected the bman.p_nr is still -1, so we handle the
|
|
|
|
|
servermode packet still alittle diffrent */
|
|
|
|
|
if ((!s_mod->lplayer2 && bman.p_nr == -1) || (s_mod->lplayer2 && bman.p2_nr == -1)) {
|
|
|
|
|
d_printf (" Server gave us: p_nr: %d, p_servnr: %d\n", s_mod->p_nr, s_mod->p_servnr);
|
|
|
|
|
d_printf (" Server gave us: p_nr: %d(old:%d), p_servnr: %d(old:%d)\n", s_mod->p_nr,bman.p_nr, s_mod->p_servnr, bman.p_servnr);
|
|
|
|
|
|
|
|
|
|
/* set the p_servnr to the playerslot which is the server */
|
|
|
|
|
if (bman.p_servnr != s_mod->p_servnr) {
|
|
|
|
|
bman.p_servnr = s_mod->p_servnr;
|
|
|
|
|
memcpy (&players[bman.p_servnr].net, &players[0].net, sizeof (_net_player));
|
|
|
|
|
memcpy (&players[s_mod->p_servnr].net, &players[bman.p_servnr].net, sizeof (_net_player));
|
|
|
|
|
bzero (&players[bman.p_servnr], sizeof (_net_player));
|
|
|
|
|
bman.p_servnr = s_mod->p_servnr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* set now the new p_nr number */
|
|
|
|
|
if (s_mod->p_nr >= 0 && s_mod->p_nr < MAX_PLAYERS && bman.p_nr == -1 && s_mod->lplayer2 == 0) {
|
|
|
|
|
bman.p_nr = s_mod->p_nr;
|
|
|
|
|
bman.firewall = 1;
|
|
|
|
|
players[bman.p_nr].net.flags = NETF_firewall;
|
|
|
|
|
players[bman.p_nr].state &= (0xFF - PSF_net);
|
|
|
|
|
strncpy (players[s_mod->p_nr].name, bman.playername, LEN_PLAYERNAME);
|
|
|
|
|
}
|
|
|
|
|
else if (s_mod->p_nr >= 0 && s_mod->p_nr < MAX_PLAYERS && bman.p2_nr == -1 && s_mod->lplayer2 == 1) {
|
|
|
|
|
bman.p2_nr = s_mod->p_nr;
|
|
|
|
|
players[bman.p2_nr].net.flags = NETF_firewall + NETF_local2;
|
|
|
|
|
players[bman.p2_nr].state &= (0xFF - PSF_net);
|
|
|
|
|
strncpy (players[s_mod->p_nr].name, bman.player2name, LEN_PLAYERNAME);
|
|
|
|
|
}
|
|
|
|
@ -1576,8 +1643,15 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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
|
|
|
|
|
* this exception is only for PKG_joingame, PKG_error and PKG_contest */
|
|
|
|
|
addr->pl_nr = get_player_nr (addr->host, addr->port);
|
|
|
|
|
if ((addr->pl_nr < 0 || addr->pl_nr >= MAX_PLAYERS) && packet->h.typ > PKG_contest && PS_IS_netplayer (players[addr->pl_nr].state)) {
|
|
|
|
|
d_printf ("do_pkg: error addr->pl_nr out of range\n");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
|
players[addr->pl_nr].net.timestamp = timestamp;
|
|
|
|
|
players[addr->pl_nr].net.pingreq = players[addr->pl_nr].net.pingack + 5;
|
|
|
|
@ -1622,6 +1696,9 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|
case (PKG_field):
|
|
|
|
|
do_field ((struct pkg_field *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_contest):
|
|
|
|
|
do_contest ((struct pkg_contest *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|
case (PKG_pingreq):
|
|
|
|
|
do_ping ((struct pkg_ping *) packet, addr);
|
|
|
|
|
break;
|
|
|
|
|