|
|
@ -67,7 +67,8 @@ do_error (struct pkg_error *data, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
network_shutdown ();
|
|
|
|
network_shutdown ();
|
|
|
|
|
|
|
|
|
|
|
|
menu_displaymessage ("Network Error", "Got Error from: %s:%s\nMessage:%s", addr->host, addr->port, data->text);
|
|
|
|
menu_displaymessage ("Network Error", "Got Error from: %s:%s\nMessage:%s", addr->host,
|
|
|
|
|
|
|
|
addr->port, data->text);
|
|
|
|
if (data->nr == 1)
|
|
|
|
if (data->nr == 1)
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -115,25 +116,31 @@ do_joingame (struct pkg_joingame *p_jg, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 3) check if we have a password */
|
|
|
|
/* 3) check if we have a password */
|
|
|
|
d_printf ("Password Check Server:\"%s\" Client:\"%s\" %d, %d\n", bman.password, p_jg->password, strlen (bman.password), strlen (p_jg->password));
|
|
|
|
d_printf ("Password Check Server:\"%s\" Client:\"%s\" %d, %d\n", bman.password,
|
|
|
|
if (bman.passwordenabled && (strncmp (bman.password, p_jg->password, LEN_PASSWORD) || strlen (bman.password) != strlen (p_jg->password))) {
|
|
|
|
p_jg->password, strlen (bman.password), strlen (p_jg->password));
|
|
|
|
|
|
|
|
if (bman.passwordenabled && (strncmp (bman.password, p_jg->password, LEN_PASSWORD)
|
|
|
|
|
|
|
|
|| strlen (bman.password) != strlen (p_jg->password))) {
|
|
|
|
send_error (addr, "This game is Password protected. Your Password is wrong.");
|
|
|
|
send_error (addr, "This game is Password protected. Your Password is wrong.");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* find a free place for the player and add the player to the game */
|
|
|
|
/* find a free place for the player and add the player to the game */
|
|
|
|
if (GS_WAITRUNNING && GT_MP_PTPM) {
|
|
|
|
if (GS_WAITRUNNING && GT_MP_PTPM) {
|
|
|
|
int j, freeslot;
|
|
|
|
int j,
|
|
|
|
|
|
|
|
freeslot;
|
|
|
|
/* find a free playerslot and check if this player isn't already in the list */
|
|
|
|
/* find a free playerslot and check if this player isn't already in the list */
|
|
|
|
for (i = -1, freeslot = -1, j = 0; j < MAX_PLAYERS; j++) {
|
|
|
|
for (i = -1, freeslot = -1, j = 0; j < MAX_PLAYERS; j++) {
|
|
|
|
if (!PS_IS_used (players[j].state) && freeslot == -1) freeslot = j;
|
|
|
|
if (!PS_IS_used (players[j].state) && freeslot == -1)
|
|
|
|
|
|
|
|
freeslot = j;
|
|
|
|
if (strncmp (players[j].net.addr.host, addr->host, LEN_SERVERNAME) == 0
|
|
|
|
if (strncmp (players[j].net.addr.host, addr->host, LEN_SERVERNAME) == 0
|
|
|
|
&& strncmp (players[j].net.addr.port, addr->port, LEN_PORT) == 0
|
|
|
|
&& strncmp (players[j].net.addr.port, addr->port, LEN_PORT) == 0
|
|
|
|
&& ((p_jg->secondplayer && (players[j].net.flags & NETF_local2) != 0)
|
|
|
|
&& ((p_jg->secondplayer && (players[j].net.flags & NETF_local2) != 0)
|
|
|
|
|| (!p_jg->secondplayer && (players[j].net.flags & NETF_local2) == 0))) i = j;
|
|
|
|
|| (!p_jg->secondplayer && (players[j].net.flags & NETF_local2) == 0)))
|
|
|
|
|
|
|
|
i = j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (i == -1) i = freeslot;
|
|
|
|
if (i == -1)
|
|
|
|
|
|
|
|
i = freeslot;
|
|
|
|
|
|
|
|
|
|
|
|
if ((i >= 0) && (i < MAX_PLAYERS) && (i < bman.maxplayer)) {
|
|
|
|
if ((i >= 0) && (i < MAX_PLAYERS) && (i < bman.maxplayer)) {
|
|
|
|
/* free player slot found ... fill in data */
|
|
|
|
/* free player slot found ... fill in data */
|
|
|
@ -234,7 +241,9 @@ send_joingame (_net_addr * addr, char *name, int secondplayer)
|
|
|
|
*** This packet will be send from one player to the other the
|
|
|
|
*** 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
|
|
|
|
*** current server will only get this packet if a connection test was positive
|
|
|
|
***/
|
|
|
|
***/
|
|
|
|
void do_contest (struct pkg_contest *ct_pkg, _net_addr *addr) {
|
|
|
|
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);
|
|
|
|
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
|
|
|
|
if (addr->pl_nr >= MAX_PLAYERS
|
|
|
@ -264,14 +273,18 @@ void do_contest (struct pkg_contest *ct_pkg, _net_addr *addr) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void send_contest (_net_addr * addr, int from, int to, int ackreq) {
|
|
|
|
void
|
|
|
|
|
|
|
|
send_contest (_net_addr * addr, int from, int to, int ackreq)
|
|
|
|
|
|
|
|
{
|
|
|
|
struct pkg_contest ct_pkg;
|
|
|
|
struct pkg_contest ct_pkg;
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("send_contest addr->id:%d, from:%d, to:%d\n", addr->pl_nr, from, to);
|
|
|
|
d_printf ("send_contest addr->id:%d, from:%d, to:%d\n", addr->pl_nr, from, to);
|
|
|
|
|
|
|
|
|
|
|
|
ct_pkg.h.typ = PKG_contest;
|
|
|
|
ct_pkg.h.typ = PKG_contest;
|
|
|
|
if (ackreq) ct_pkg.h.flags = PKGF_ackreq;
|
|
|
|
if (ackreq)
|
|
|
|
else ct_pkg.h.flags = 0;
|
|
|
|
ct_pkg.h.flags = PKGF_ackreq;
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
ct_pkg.h.flags = 0;
|
|
|
|
ct_pkg.h.len = HTON16 (sizeof (struct pkg_contest));
|
|
|
|
ct_pkg.h.len = HTON16 (sizeof (struct pkg_contest));
|
|
|
|
|
|
|
|
|
|
|
|
ct_pkg.from = from;
|
|
|
|
ct_pkg.from = from;
|
|
|
@ -312,7 +325,9 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
pl->team_nr, pl->net.flags);
|
|
|
|
pl->team_nr, pl->net.flags);
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_PLAYERS; i++)
|
|
|
|
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);
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -326,7 +341,8 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
pl->net.timestamp = timestamp;
|
|
|
|
pl->net.timestamp = timestamp;
|
|
|
|
pl->net.pingreq = pl->net.pingack + 5;
|
|
|
|
pl->net.pingreq = pl->net.pingack + 5;
|
|
|
|
if (GT_MP_PTPS) pl->net.flags = p_id->netflags;
|
|
|
|
if (GT_MP_PTPS)
|
|
|
|
|
|
|
|
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;
|
|
|
|
strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME);
|
|
|
|
strncpy (pl->net.addr.host, p_id->host, LEN_SERVERNAME);
|
|
|
@ -339,7 +355,8 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
else if (PS_IS_used (p_id->state)) {
|
|
|
|
else if (PS_IS_used (p_id->state)) {
|
|
|
|
strncpy (pl->net.addr.host, players[bman.p_servnr].net.addr.host, LEN_SERVERNAME);
|
|
|
|
strncpy (pl->net.addr.host, players[bman.p_servnr].net.addr.host, LEN_SERVERNAME);
|
|
|
|
strncpy (pl->net.addr.port, players[bman.p_servnr].net.addr.port, LEN_PORT);
|
|
|
|
strncpy (pl->net.addr.port, players[bman.p_servnr].net.addr.port, LEN_PORT);
|
|
|
|
memcpy (&pl->net.addr.sAddr, &players[bman.p_servnr].net.addr.sAddr, sizeof (struct _sockaddr));
|
|
|
|
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
|
|
|
|
/* Check if we have to make a network test.. only client to client
|
|
|
@ -362,7 +379,8 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
|
|
|
|
|
|
|
|
if (pl->gfx_nr != p_id->gfx_nr) player_set_gfx (pl, p_id->gfx_nr);
|
|
|
|
if (pl->gfx_nr != p_id->gfx_nr)
|
|
|
|
|
|
|
|
player_set_gfx (pl, p_id->gfx_nr);
|
|
|
|
strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
|
|
|
|
strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
|
|
|
|
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
@ -457,13 +475,16 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport,
|
|
|
|
*** Client Side:
|
|
|
|
*** Client Side:
|
|
|
|
*** Get all Teamdata
|
|
|
|
*** Get all Teamdata
|
|
|
|
***/
|
|
|
|
***/
|
|
|
|
void do_teamdata (struct pkg_teamdata *td, _net_addr * addr) {
|
|
|
|
void
|
|
|
|
|
|
|
|
do_teamdata (struct pkg_teamdata *td, _net_addr * addr)
|
|
|
|
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("do_teamdata (addr->pl_nr: %d): team:%d col:%d wins:%d\n", addr->pl_nr, td->team_nr, td->col, td->wins);
|
|
|
|
d_printf ("do_teamdata (addr->pl_nr: %d): team:%d col:%d wins:%d\n", addr->pl_nr, td->team_nr,
|
|
|
|
|
|
|
|
td->col, td->wins);
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr == bman.p_servnr) { /* packet comes from the server */
|
|
|
|
if (addr->pl_nr == bman.p_servnr) { /* packet comes from the server */
|
|
|
|
if (td->team_nr >= 0 && td->team_nr < MAX_TEAMS) {
|
|
|
|
if (td->team_nr >= 0 && td->team_nr < MAX_TEAMS) {
|
|
|
@ -485,7 +506,9 @@ void do_teamdata (struct pkg_teamdata *td, _net_addr * addr) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void send_teamdata (_net_addr * addr, int team_nr) {
|
|
|
|
void
|
|
|
|
|
|
|
|
send_teamdata (_net_addr * addr, int team_nr)
|
|
|
|
|
|
|
|
{
|
|
|
|
struct pkg_teamdata td;
|
|
|
|
struct pkg_teamdata td;
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("send_teamdata (%s:%s) team:%d\n", addr->host, addr->port, team_nr);
|
|
|
|
d_printf ("send_teamdata (%s:%s) team:%d\n", addr->host, addr->port, team_nr);
|
|
|
@ -523,17 +546,20 @@ 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
|
|
|
|
/* if we just have connected the bman.p_nr is still -1, so we handle the
|
|
|
|
servermode packet still alittle diffrent */
|
|
|
|
servermode packet still alittle diffrent */
|
|
|
|
if ((!s_mod->lplayer2 && bman.p_nr == -1) || (s_mod->lplayer2 && bman.p2_nr == -1)) {
|
|
|
|
if ((!s_mod->lplayer2 && bman.p_nr == -1) || (s_mod->lplayer2 && bman.p2_nr == -1)) {
|
|
|
|
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);
|
|
|
|
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 */
|
|
|
|
/* set the p_servnr to the playerslot which is the server */
|
|
|
|
if (bman.p_servnr != s_mod->p_servnr) {
|
|
|
|
if (bman.p_servnr != s_mod->p_servnr) {
|
|
|
|
memcpy (&players[s_mod->p_servnr].net, &players[bman.p_servnr].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));
|
|
|
|
bzero (&players[bman.p_servnr], sizeof (_net_player));
|
|
|
|
bman.p_servnr = s_mod->p_servnr;
|
|
|
|
bman.p_servnr = s_mod->p_servnr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* set now the new p_nr number */
|
|
|
|
/* 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) {
|
|
|
|
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.p_nr = s_mod->p_nr;
|
|
|
|
bman.firewall = 1;
|
|
|
|
bman.firewall = 1;
|
|
|
|
players[bman.p_nr].net.flags = NETF_firewall;
|
|
|
|
players[bman.p_nr].net.flags = NETF_firewall;
|
|
|
@ -545,7 +571,8 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr)
|
|
|
|
send_playerid (addr, NULL, NULL, NULL, -1, -1, -1, 0);
|
|
|
|
send_playerid (addr, NULL, NULL, NULL, -1, -1, -1, 0);
|
|
|
|
send_teamdata (addr, -1);
|
|
|
|
send_teamdata (addr, -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (s_mod->p_nr >= 0 && s_mod->p_nr < MAX_PLAYERS && bman.p2_nr == -1 && s_mod->lplayer2 == 1) {
|
|
|
|
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;
|
|
|
|
bman.p2_nr = s_mod->p_nr;
|
|
|
|
players[bman.p2_nr].net.flags = NETF_firewall + NETF_local2;
|
|
|
|
players[bman.p2_nr].net.flags = NETF_firewall + NETF_local2;
|
|
|
|
players[bman.p2_nr].state &= (0xFF - PSF_net);
|
|
|
|
players[bman.p2_nr].state &= (0xFF - PSF_net);
|
|
|
@ -615,9 +642,11 @@ send_servermode (_net_addr * addr, int pl_nr)
|
|
|
|
s_mod.players = bman.players_nr_s;
|
|
|
|
s_mod.players = bman.players_nr_s;
|
|
|
|
s_mod.maxplayer = bman.maxplayer;
|
|
|
|
s_mod.maxplayer = bman.maxplayer;
|
|
|
|
s_mod.p_nr = pl_nr;
|
|
|
|
s_mod.p_nr = pl_nr;
|
|
|
|
if (pl_nr >= 0 && pl_nr < MAX_PLAYERS && (players[pl_nr].net.flags & NETF_local2) == NETF_local2)
|
|
|
|
if (pl_nr >= 0 && pl_nr < MAX_PLAYERS
|
|
|
|
|
|
|
|
&& (players[pl_nr].net.flags & NETF_local2) == NETF_local2)
|
|
|
|
s_mod.lplayer2 = 1;
|
|
|
|
s_mod.lplayer2 = 1;
|
|
|
|
else s_mod.lplayer2 = 0;
|
|
|
|
else
|
|
|
|
|
|
|
|
s_mod.lplayer2 = 0;
|
|
|
|
s_mod.p_servnr = bman.p_servnr;
|
|
|
|
s_mod.p_servnr = bman.p_servnr;
|
|
|
|
s_mod.last_winner = bman.lastwinner;
|
|
|
|
s_mod.last_winner = bman.lastwinner;
|
|
|
|
s_mod.fieldsize_x = map.size.x;
|
|
|
|
s_mod.fieldsize_x = map.size.x;
|
|
|
@ -832,7 +861,8 @@ do_playerdata (struct pkg_playerdata *p_dat, _net_addr * addr)
|
|
|
|
/* player just died */
|
|
|
|
/* player just died */
|
|
|
|
if (p_dat->p_nr != p_dat->dead_by) {
|
|
|
|
if (p_dat->p_nr != p_dat->dead_by) {
|
|
|
|
players[p_dat->dead_by].points++;
|
|
|
|
players[p_dat->dead_by].points++;
|
|
|
|
if (bman.gametype == GT_team && players[p_dat->dead_by].team_nr >= 0 && players[p_dat->dead_by].team_nr < MAX_TEAMS)
|
|
|
|
if (bman.gametype == GT_team && players[p_dat->dead_by].team_nr >= 0
|
|
|
|
|
|
|
|
&& players[p_dat->dead_by].team_nr < MAX_TEAMS)
|
|
|
|
teams[players[p_dat->dead_by].team_nr].points++;
|
|
|
|
teams[players[p_dat->dead_by].team_nr].points++;
|
|
|
|
net_game_send_player (p_dat->dead_by);
|
|
|
|
net_game_send_player (p_dat->dead_by);
|
|
|
|
player_died (pl, p_dat->dead_by, 1);
|
|
|
|
player_died (pl, p_dat->dead_by, 1);
|
|
|
@ -1107,6 +1137,9 @@ send_quit (_net_addr * addr, int pl_nr, int new_server)
|
|
|
|
q_dat.h.typ = PKG_quit;
|
|
|
|
q_dat.h.typ = PKG_quit;
|
|
|
|
q_dat.h.flags = 0;
|
|
|
|
q_dat.h.flags = 0;
|
|
|
|
q_dat.h.len = HTON16 (sizeof (struct pkg_quit));
|
|
|
|
q_dat.h.len = HTON16 (sizeof (struct pkg_quit));
|
|
|
|
|
|
|
|
if (pl_nr == -1)
|
|
|
|
|
|
|
|
q_dat.pl_nr = bman.p_nr;
|
|
|
|
|
|
|
|
else
|
|
|
|
q_dat.pl_nr = pl_nr;
|
|
|
|
q_dat.pl_nr = pl_nr;
|
|
|
|
q_dat.new_server = new_server;
|
|
|
|
q_dat.new_server = new_server;
|
|
|
|
send_pkg ((struct pkg *) &q_dat, addr);
|
|
|
|
send_pkg ((struct pkg *) &q_dat, addr);
|
|
|
@ -1116,7 +1149,8 @@ send_quit (_net_addr * addr, int pl_nr, int new_server)
|
|
|
|
void
|
|
|
|
void
|
|
|
|
do_quit (struct pkg_quit *q_dat, _net_addr * addr)
|
|
|
|
do_quit (struct pkg_quit *q_dat, _net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
d_printf ("do_quit (%s:%s) pl_nr=%d new_server=%d\n", addr->host, addr->port, q_dat->pl_nr, q_dat->new_server);
|
|
|
|
d_printf ("do_quit (%s:%s) pl_nr=%d new_server=%d\n", addr->host, addr->port, q_dat->pl_nr,
|
|
|
|
|
|
|
|
q_dat->new_server);
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -1141,7 +1175,8 @@ do_quit (struct pkg_quit *q_dat, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (q_dat->pl_nr == bman.p_servnr && q_dat->new_server == bman.p_servnr)
|
|
|
|
else if (q_dat->pl_nr == bman.p_servnr && q_dat->new_server == bman.p_servnr)
|
|
|
|
menu_displaymessage ("Server Quit", "The game closed because you are the only one who is left."
|
|
|
|
menu_displaymessage ("Server Quit",
|
|
|
|
|
|
|
|
"The game closed because you are the only one who is left."
|
|
|
|
" Or the server could not find any other possible new server.");
|
|
|
|
" Or the server could not find any other possible new server.");
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -1488,7 +1523,8 @@ void
|
|
|
|
do_special (struct pkg_special *sp_pkg, _net_addr * addr)
|
|
|
|
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 || sp_pkg->pl_nr == -1 || sp_pkg->pl_nr == bman.p_nr || sp_pkg->pl_nr == bman.p2_nr)
|
|
|
|
if (addr->pl_nr == -1 || sp_pkg->pl_nr == -1 || sp_pkg->pl_nr == bman.p_nr
|
|
|
|
|
|
|
|
|| sp_pkg->pl_nr == bman.p2_nr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
/* set or use special */
|
|
|
|
/* set or use special */
|
|
|
@ -1596,7 +1632,9 @@ do_mapinfo (struct pkg_mapinfo *map_pkg, _net_addr * addr)
|
|
|
|
/***
|
|
|
|
/***
|
|
|
|
*** Respawn Date Handling
|
|
|
|
*** Respawn Date Handling
|
|
|
|
***/
|
|
|
|
***/
|
|
|
|
void send_respawn (_net_addr * addr, int plnr) {
|
|
|
|
void
|
|
|
|
|
|
|
|
send_respawn (_net_addr * addr, int plnr)
|
|
|
|
|
|
|
|
{
|
|
|
|
struct pkg_respawn r_dat;
|
|
|
|
struct pkg_respawn r_dat;
|
|
|
|
|
|
|
|
|
|
|
|
r_dat.h.typ = PKG_respawn;
|
|
|
|
r_dat.h.typ = PKG_respawn;
|
|
|
@ -1610,8 +1648,11 @@ void send_respawn (_net_addr * addr, int plnr) {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr) {
|
|
|
|
void
|
|
|
|
d_printf ("do_respawn (addr %d, pl_nr %d, pos %d,%d)\n", addr->pl_nr, r_pkg->pl_nr, r_pkg->x, r_pkg->y);
|
|
|
|
do_respawn (struct pkg_respawn *r_pkg, _net_addr * addr)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
d_printf ("do_respawn (addr %d, pl_nr %d, pos %d,%d)\n", addr->pl_nr, r_pkg->pl_nr, r_pkg->x,
|
|
|
|
|
|
|
|
r_pkg->y);
|
|
|
|
if (addr->pl_nr == -1 || r_pkg->pl_nr == -1)
|
|
|
|
if (addr->pl_nr == -1 || r_pkg->pl_nr == -1)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
@ -1641,9 +1682,12 @@ void do_respawn (struct pkg_respawn *r_pkg, _net_addr *addr) {
|
|
|
|
*** gameinfo packet is used to get some data from a running game
|
|
|
|
*** gameinfo packet is used to get some data from a running game
|
|
|
|
*** just fill in the informations we need and send this packet back.
|
|
|
|
*** just fill in the informations we need and send this packet back.
|
|
|
|
***/
|
|
|
|
***/
|
|
|
|
void do_gameinfo (struct pkg_gameinfo *pgi, _net_addr *addr) {
|
|
|
|
void
|
|
|
|
|
|
|
|
do_gameinfo (struct pkg_gameinfo *pgi, _net_addr * addr)
|
|
|
|
|
|
|
|
{
|
|
|
|
if (GT_MP_PTPM && pgi->password == -1) {
|
|
|
|
if (GT_MP_PTPM && pgi->password == -1) {
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) Broadcast Req: %d\n", addr->host, addr->port, pgi->broadcast);
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) Broadcast Req: %d\n", addr->host, addr->port,
|
|
|
|
|
|
|
|
pgi->broadcast);
|
|
|
|
|
|
|
|
|
|
|
|
strncpy (pgi->version, VERSION, LEN_VERSION);
|
|
|
|
strncpy (pgi->version, VERSION, LEN_VERSION);
|
|
|
|
pgi->maxplayers = bman.maxplayer;
|
|
|
|
pgi->maxplayers = bman.maxplayer;
|
|
|
@ -1654,12 +1698,15 @@ void do_gameinfo (struct pkg_gameinfo *pgi, _net_addr *addr) {
|
|
|
|
else if (pgi->password != -1)
|
|
|
|
else if (pgi->password != -1)
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** NO REQUEST **\n", addr->host, addr->port);
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** NO REQUEST **\n", addr->host, addr->port);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** WE ARE NOT THE MASTER OF THIS GAME **\n", addr->host, addr->port);
|
|
|
|
d_printf ("do_gameinfo (from: %s:%s) ** WE ARE NOT THE MASTER OF THIS GAME **\n",
|
|
|
|
|
|
|
|
addr->host, addr->port);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void send_gameinfo (_net_addr * addr, int sock, int broadcast) {
|
|
|
|
void
|
|
|
|
|
|
|
|
send_gameinfo (_net_addr * addr, int sock, int broadcast)
|
|
|
|
|
|
|
|
{
|
|
|
|
struct pkg_gameinfo pgi;
|
|
|
|
struct pkg_gameinfo pgi;
|
|
|
|
|
|
|
|
|
|
|
|
pgi.h.typ = PKG_gameinfo;
|
|
|
|
pgi.h.typ = PKG_gameinfo;
|
|
|
@ -1674,7 +1721,8 @@ void send_gameinfo (_net_addr * addr, int sock, int broadcast) {
|
|
|
|
if (bman.net_ai_family != PF_INET)
|
|
|
|
if (bman.net_ai_family != PF_INET)
|
|
|
|
pgi.h.flags = pgi.h.flags | PKGF_ipv6;
|
|
|
|
pgi.h.flags = pgi.h.flags | PKGF_ipv6;
|
|
|
|
if (broadcast)
|
|
|
|
if (broadcast)
|
|
|
|
udp_sendbroadcast (sock, (char *) &pgi, NTOH16 (pgi.h.len), &addr->sAddr, bman.net_ai_family);
|
|
|
|
udp_sendbroadcast (sock, (char *) &pgi, NTOH16 (pgi.h.len), &addr->sAddr,
|
|
|
|
|
|
|
|
bman.net_ai_family);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
udp_send (sock, (char *) &pgi, NTOH16 (pgi.h.len), &addr->sAddr, bman.net_ai_family);
|
|
|
|
udp_send (sock, (char *) &pgi, NTOH16 (pgi.h.len), &addr->sAddr, bman.net_ai_family);
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -1700,8 +1748,7 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr)
|
|
|
|
/* find packet */
|
|
|
|
/* find packet */
|
|
|
|
for (i = 0, pos = -1; (i < PKG_IN_INDEX_NUM && pos == -1); i++)
|
|
|
|
for (i = 0, pos = -1; (i < PKG_IN_INDEX_NUM && pos == -1); i++)
|
|
|
|
if (inpkg_index[i].pl_nr == addr->pl_nr
|
|
|
|
if (inpkg_index[i].pl_nr == addr->pl_nr
|
|
|
|
&& inpkg_index[i].typ == typ
|
|
|
|
&& inpkg_index[i].typ == typ && inpkg_index[i].id == id)
|
|
|
|
&& inpkg_index[i].id == id)
|
|
|
|
|
|
|
|
pos = i;
|
|
|
|
pos = i;
|
|
|
|
|
|
|
|
|
|
|
|
if (pos == -1) {
|
|
|
|
if (pos == -1) {
|
|
|
@ -1719,11 +1766,13 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
/* delete all old pkg indexes about a player */
|
|
|
|
/* delete all old pkg indexes about a player */
|
|
|
|
void
|
|
|
|
void
|
|
|
|
inpkg_delplayer (int pl_nr) {
|
|
|
|
inpkg_delplayer (int pl_nr)
|
|
|
|
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < PKG_IN_INDEX_NUM; i++)
|
|
|
|
for (i = 0; i < PKG_IN_INDEX_NUM; i++)
|
|
|
|
if (inpkg_index[i].pl_nr == pl_nr) inpkg_index[i].pl_nr = -1;
|
|
|
|
if (inpkg_index[i].pl_nr == pl_nr)
|
|
|
|
|
|
|
|
inpkg_index[i].pl_nr = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1733,7 +1782,8 @@ send_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/* check if the packet would be send to
|
|
|
|
/* check if the packet would be send to
|
|
|
|
* an AI_Player, so ignore it. */
|
|
|
|
* an AI_Player, so ignore it. */
|
|
|
|
if ((addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS) && PS_IS_aiplayer (players[addr->pl_nr].state))
|
|
|
|
if ((addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
|
|
|
|
&& PS_IS_aiplayer (players[addr->pl_nr].state))
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
/* set the id for the packet and the network flags
|
|
|
|
/* set the id for the packet and the network flags
|
|
|
@ -1767,8 +1817,7 @@ fwd_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
if ((!PS_IS_aiplayer (players[pl].state)) && PS_IS_netplayer (players[pl].state)
|
|
|
|
if ((!PS_IS_aiplayer (players[pl].state)) && PS_IS_netplayer (players[pl].state)
|
|
|
|
&& ((players[addr->pl_nr].net.flags & NETF_firewall) == NETF_firewall
|
|
|
|
&& ((players[addr->pl_nr].net.flags & NETF_firewall) == NETF_firewall
|
|
|
|
|| (players[pl].net.flags & NETF_firewall) == NETF_firewall)
|
|
|
|
|| (players[pl].net.flags & NETF_firewall) == NETF_firewall)
|
|
|
|
&& pl != addr->pl_nr
|
|
|
|
&& pl != addr->pl_nr && (players[pl].net.flags & NETF_local2) == 0)
|
|
|
|
&& (players[pl].net.flags & NETF_local2) == 0)
|
|
|
|
|
|
|
|
send_pkg (packet, &players[pl].net.addr);
|
|
|
|
send_pkg (packet, &players[pl].net.addr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (packet->h.typ > PKG_quit)
|
|
|
|
else if (packet->h.typ > PKG_quit)
|
|
|
@ -1794,7 +1843,8 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
* 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 */
|
|
|
|
addr->pl_nr = get_player_nr (addr->host, addr->port);
|
|
|
|
addr->pl_nr = get_player_nr (addr->host, addr->port);
|
|
|
|
if ((addr->pl_nr < 0 || addr->pl_nr >= MAX_PLAYERS) && packet->h.typ > PKG_joingame && PS_IS_netplayer (players[addr->pl_nr].state)) {
|
|
|
|
if ((addr->pl_nr < 0 || addr->pl_nr >= MAX_PLAYERS) && packet->h.typ > PKG_joingame
|
|
|
|
|
|
|
|
&& 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 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|