|
|
@ -70,13 +70,13 @@ do_error (struct pkg_error *data, _net_addr * addr)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
/***
|
|
|
|
*** Packettype: pingack/pingreq
|
|
|
|
*** Packettype: joingame
|
|
|
|
*** Update Playerinformation, add players into the current game
|
|
|
|
*** client sends this to the server if he want's to join
|
|
|
|
***/
|
|
|
|
***/
|
|
|
|
void
|
|
|
|
void
|
|
|
|
do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
do_joingame (struct pkg_joingame *p_jg, _net_addr * addr) {
|
|
|
|
{
|
|
|
|
|
|
|
|
_player *pl;
|
|
|
|
_player *pl;
|
|
|
|
int i,
|
|
|
|
int i,
|
|
|
|
j,
|
|
|
|
j,
|
|
|
@ -87,50 +87,22 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
|
|
|
|
|
|
|
|
if (p_id->ver_sub != vsu || p_id->ver_major != vma || p_id->ver_minor != vmi) {
|
|
|
|
if (p_jg->ver_sub != vsu || p_jg->ver_major != vma || p_jg->ver_minor != vmi) {
|
|
|
|
sprintf (text, "Version Error - Host/Server Version: %s", VERSION);
|
|
|
|
sprintf (text, "Version Error - Host/Server Version: %s", VERSION);
|
|
|
|
send_error (addr, text);
|
|
|
|
send_error (addr, text);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
|
|
|
sprintf (text, "Sorry this is a client and not a server.");
|
|
|
|
|
|
|
|
send_error (addr, text);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
d_printf
|
|
|
|
d_printf
|
|
|
|
("do_playerid (From:%s:%s pl_nr=%d) Player(name:%s [%s:%s], pl_nr:%d)\n",
|
|
|
|
("do_joingame (From:%s:%s Player(name:%s)\n", addr->host, addr->port, p_jg->name);
|
|
|
|
addr->host, addr->port, addr->pl_nr, p_id->name, p_id->host, p_id->port, p_id->pl_nr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* As Server/Master Only change settings, or do ignore them if we are not in GS_wait */
|
|
|
|
|
|
|
|
if (((GT_MP_PTPM && (bman.state == GS_wait && addr->pl_nr != -1)) || // PTPM change setting
|
|
|
|
|
|
|
|
(GT_MP_PTPS && addr->pl_nr == 0)) && p_id->pl_nr >= 0 && p_id->pl_nr < MAX_PLAYERS) { // PTPS and information send by PTPM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (p_id->host[0] != 0) {
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
|
|
|
pl->net.addr.port, LEN_PORT, bman.net_ai_family, &pl->net.addr.sAddr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
|
|
|
pl->points = NTOH16 (p_id->points);
|
|
|
|
|
|
|
|
pl->wins = NTOH16 (p_id->wins);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* add player into the list if there is something free */
|
|
|
|
|
|
|
|
else if ((addr->pl_nr == -1 || p_id->pl_nr == -1) && GS_WAITRUNNING && GT_MP_PTPM) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* find a free place for the player and add the player to the game*/
|
|
|
|
|
|
|
|
if ((addr->pl_nr == -1) && GS_WAITRUNNING && GT_MP_PTPM) {
|
|
|
|
/* find free player slot */
|
|
|
|
/* find free player slot */
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
for (i = 0; (i < MAX_PLAYERS && PS_IS_used (players[i].state)); i++);
|
|
|
|
for (i = 0; (i < MAX_PLAYERS && PS_IS_used (players[i].state)); i++);
|
|
|
@ -138,19 +110,19 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
i = addr->pl_nr;
|
|
|
|
i = addr->pl_nr;
|
|
|
|
|
|
|
|
|
|
|
|
if ((i < MAX_PLAYERS) && (i < bman.maxplayer)) {
|
|
|
|
if ((i < MAX_PLAYERS) && (i < bman.maxplayer)) {
|
|
|
|
/* free in_pl slot ... fill in data */
|
|
|
|
/* free player slot found ... fill in data */
|
|
|
|
pl = &players[i];
|
|
|
|
pl = &players[i];
|
|
|
|
|
|
|
|
|
|
|
|
pl->state = PSF_used + PSF_net;
|
|
|
|
pl->state = PSF_used + PSF_net;
|
|
|
|
if (strncmp (pl->name, p_id->name, LEN_PLAYERNAME) == 0)
|
|
|
|
if (strncmp (pl->name, p_jg->name, LEN_PLAYERNAME) == 0)
|
|
|
|
d_printf ("***** Player ReJoined : Nr:[%d] Name:%10s\n", i, p_id->name);
|
|
|
|
d_printf (" Player ReJoined : Nr:[%d] Name:%10s\n", i, p_jg->name);
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
d_printf ("***** Player Added : Nr:[%d] Name:%10s\n", i, p_id->name);
|
|
|
|
d_printf (" Player Added : Nr:[%d] Name:%10s\n", i, p_jg->name);
|
|
|
|
pl->points = 0;
|
|
|
|
pl->points = 0;
|
|
|
|
pl->wins = 0;
|
|
|
|
pl->wins = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
strncpy (pl->name, p_id->name, LEN_PLAYERNAME);
|
|
|
|
strncpy (pl->name, p_jg->name, LEN_PLAYERNAME);
|
|
|
|
player_set_gfx (pl, p_id->gfx_nr);
|
|
|
|
player_set_gfx (pl, -1);
|
|
|
|
|
|
|
|
|
|
|
|
/* Reset the network data */
|
|
|
|
/* Reset the network data */
|
|
|
|
pl->net.timestamp = timestamp;
|
|
|
|
pl->net.timestamp = timestamp;
|
|
|
@ -163,26 +135,28 @@ 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,
|
|
|
|
dns_filladdr (pl->net.addr.host, LEN_SERVERNAME, pl->net.addr.port,
|
|
|
|
LEN_PORT, bman.net_ai_family, &pl->net.addr.sAddr);
|
|
|
|
LEN_PORT, bman.net_ai_family, &pl->net.addr.sAddr);
|
|
|
|
pl->net.flags = p_id->netflags;
|
|
|
|
pl->net.flags = p_jg->netflags;
|
|
|
|
pl->net.addr.pl_nr = i;
|
|
|
|
pl->net.addr.pl_nr = i;
|
|
|
|
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 */
|
|
|
|
send_servermode (addr, i);
|
|
|
|
send_servermode (addr, i);
|
|
|
|
send_mapinfo (addr);
|
|
|
|
send_mapinfo (addr);
|
|
|
|
for (j = 0; j < MAX_PLAYERS; j++)
|
|
|
|
|
|
|
|
if (players[j].net.addr.host[0] != 0 || players[j].name[0] != 0)
|
|
|
|
addr->pl_nr = i;
|
|
|
|
send_playerid (addr, players[j].name,
|
|
|
|
|
|
|
|
players[j].net.addr.host,
|
|
|
|
|
|
|
|
players[j].net.addr.port, j,
|
|
|
|
|
|
|
|
players[j].gfx_nr, players[i].net.flags);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr->pl_nr = i;
|
|
|
|
|
|
|
|
for (j = 0, i = 0; i < bman.maxplayer; i++)
|
|
|
|
for (j = 0, i = 0; i < bman.maxplayer; i++)
|
|
|
|
if (PS_IS_used (players[i].state))
|
|
|
|
if (PS_IS_used (players[i].state))
|
|
|
|
j++;
|
|
|
|
j++;
|
|
|
|
if (bman.notifygamemaster)
|
|
|
|
|
|
|
|
|
|
|
|
if (bman.notifygamemaster)
|
|
|
|
gamesrv_sendmode (bman.maxplayer, j);
|
|
|
|
gamesrv_sendmode (bman.maxplayer, j);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Send all connected players the new PlayerID */
|
|
|
|
|
|
|
|
for (i = 0; i < MAX_PLAYERS; i++)
|
|
|
|
|
|
|
|
if (i != bman.p_servnr && i != pl->net.addr.pl_nr && PS_IS_netplayer (players[i].state))
|
|
|
|
|
|
|
|
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->net.flags);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
else if (GS_WAITRUNNING) {
|
|
|
|
else if (GS_WAITRUNNING) {
|
|
|
@ -191,17 +165,100 @@ do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
else if (!GS_WAITRUNNING) {
|
|
|
|
else if (!GS_WAITRUNNING) {
|
|
|
|
send_error (addr, "Game is in the wrong mode.\n");
|
|
|
|
send_error (addr, "Update mode, please try again.\n");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Send all connected players the new PlayerID */
|
|
|
|
d_playerdetail ("*** PLAYER List ***");
|
|
|
|
if (GS_WAITRUNNING && addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
net_change_playerid (addr->pl_nr, (GT_MP_PTPM));
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
d_playerdetail ("*** PLAYER List ***");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
send_joingame (_net_addr * addr, char *name) {
|
|
|
|
|
|
|
|
struct pkg_joingame p_jg;
|
|
|
|
|
|
|
|
int vmi,
|
|
|
|
|
|
|
|
vma,
|
|
|
|
|
|
|
|
vsu;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("send_joingame SendTo: %s:%s (Name:%16s)\n", addr->host,
|
|
|
|
|
|
|
|
addr->port, name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sscanf (VERSION, "%d.%d.%d", &vma, &vmi, &vsu);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p_jg.h.typ = PKG_joingame;
|
|
|
|
|
|
|
|
p_jg.h.flags = PKGF_ackreq;
|
|
|
|
|
|
|
|
p_jg.h.len = HTON16 (sizeof (struct pkg_joingame));
|
|
|
|
|
|
|
|
p_jg.ver_sub = vsu;
|
|
|
|
|
|
|
|
p_jg.ver_major = vma;
|
|
|
|
|
|
|
|
p_jg.ver_minor = vmi;
|
|
|
|
|
|
|
|
if (bman.firewall)
|
|
|
|
|
|
|
|
p_jg.netflags = NETF_firewall;
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
p_jg.netflags = 0;
|
|
|
|
|
|
|
|
strncpy (p_jg.name, bman.playername, LEN_PLAYERNAME);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
send_pkg ((struct pkg *)&p_jg, addr);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
*** Packettype: pingack/pingreq
|
|
|
|
|
|
|
|
*** Update Playerinformation, add players into the current game
|
|
|
|
|
|
|
|
***/
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
do_playerid (struct pkg_playerid *p_id, _net_addr * addr)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_player *pl;
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d_printf
|
|
|
|
|
|
|
|
("do_playerid (From:%s:%s pl_nr=%d) Player(name:%s [%s:%s], pl_nr:%d)\n",
|
|
|
|
|
|
|
|
addr->host, addr->port, addr->pl_nr, p_id->name, p_id->host, p_id->port, p_id->pl_nr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* As Server/Master Only change settings */
|
|
|
|
|
|
|
|
if (((GT_MP_PTPM && (bman.state == GS_wait && addr->pl_nr != -1)) || // PTPM change setting
|
|
|
|
|
|
|
|
(GT_MP_PTPS && addr->pl_nr == bman.p_servnr)) && p_id->pl_nr >= 0 && p_id->pl_nr < MAX_PLAYERS) { // PTPS and information send by PTPM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (p_id->host[0] != 0) {
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
|
|
|
pl->net.addr.port, LEN_PORT, bman.net_ai_family, &pl->net.addr.sAddr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
|
|
|
pl->points = NTOH16 (p_id->points);
|
|
|
|
|
|
|
|
pl->wins = NTOH16 (p_id->wins);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Send all connected players the new PlayerID */
|
|
|
|
|
|
|
|
if (GS_WAITRUNNING && addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS)
|
|
|
|
|
|
|
|
net_change_playerid (addr->pl_nr, (GT_MP_PTPM));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* send the whole playerlist to the client to update the playerlist */
|
|
|
|
|
|
|
|
else if (p_id->pl_nr == -1 && addr->pl_nr >= 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
|
|
|
|
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].net.flags);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d_playerdetail ("*** PLAYER List ***");
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -222,12 +279,12 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport,
|
|
|
|
p_id.h.typ = PKG_playerid;
|
|
|
|
p_id.h.typ = PKG_playerid;
|
|
|
|
p_id.h.flags = PKGF_ackreq;
|
|
|
|
p_id.h.flags = PKGF_ackreq;
|
|
|
|
p_id.h.len = HTON16 (sizeof (struct pkg_playerid));
|
|
|
|
p_id.h.len = HTON16 (sizeof (struct pkg_playerid));
|
|
|
|
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 (name != NULL)
|
|
|
|
|
|
|
|
strncpy (p_id.name, name, LEN_PLAYERNAME);
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
p_id.name[0] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (pladdr == NULL)
|
|
|
|
if (pladdr == NULL)
|
|
|
|
p_id.host[0] = 0;
|
|
|
|
p_id.host[0] = 0;
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -235,7 +292,6 @@ send_playerid (_net_addr * addr, char *name, char *pladdr, char *plport,
|
|
|
|
|
|
|
|
|
|
|
|
if (plport == NULL)
|
|
|
|
if (plport == NULL)
|
|
|
|
p_id.port[0] = 0;
|
|
|
|
p_id.port[0] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
else
|
|
|
|
strncpy (p_id.port, plport, LEN_PORT);
|
|
|
|
strncpy (p_id.port, plport, LEN_PORT);
|
|
|
|
|
|
|
|
|
|
|
@ -267,24 +323,46 @@ do_servermode (struct pkg_servermode *s_mod, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("do_servermode (%s:%s) state = %d\n", addr->host, addr->port, s_mod->state);
|
|
|
|
d_printf ("do_servermode (%s:%s) state = %d\n", addr->host, addr->port, s_mod->state);
|
|
|
|
|
|
|
|
|
|
|
|
if (s_mod->pl_nr >= 0 && s_mod->pl_nr < MAX_PLAYERS) {
|
|
|
|
/* if we just have connected the bman.p_nr is still -1, so we handle the
|
|
|
|
bman.p_nr = s_mod->pl_nr;
|
|
|
|
servermode packet still alittle diffrent */
|
|
|
|
players[bman.p_nr].state &= (0xFF - PSF_net);
|
|
|
|
if (bman.p_nr == -1) {
|
|
|
|
strncpy (players[s_mod->pl_nr].name, bman.playername, LEN_PLAYERNAME);
|
|
|
|
d_printf (" Server gave us: p_nr: %d, p_servnr: %d\n", s_mod->p_nr, s_mod->p_servnr);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* set the p_servnr to the playerslot which is the server */
|
|
|
|
bman.state = s_mod->state;
|
|
|
|
if (bman.p_servnr != s_mod->p_servnr) {
|
|
|
|
map.state = s_mod->mapstate;
|
|
|
|
bman.p_servnr = s_mod->p_servnr;
|
|
|
|
|
|
|
|
memcpy (&players[bman.p_servnr].net, &players[0].net, sizeof (_net_player));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* set now the new p_nr number */
|
|
|
|
|
|
|
|
if (s_mod->p_nr >= 0 && s_mod->p_nr < MAX_PLAYERS && bman.p_nr == -1) {
|
|
|
|
|
|
|
|
bman.p_nr = s_mod->p_nr;
|
|
|
|
|
|
|
|
players[bman.p_nr].state &= (0xFF - PSF_net);
|
|
|
|
|
|
|
|
strncpy (players[s_mod->p_nr].name, bman.playername, LEN_PLAYERNAME);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* send playerid with p_nr -1 so we get the whole playerlist */
|
|
|
|
|
|
|
|
send_playerid (addr, NULL, NULL, NULL, -1, -1, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* the server changed */
|
|
|
|
|
|
|
|
if (bman.p_servnr != s_mod->p_servnr) {
|
|
|
|
|
|
|
|
menu_displaymessage ("Server Quit", "FIXME: Server Quit the game and code is not finished");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* do the normal update */
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
|
|
|
bman.state = s_mod->state;
|
|
|
|
|
|
|
|
map.state = s_mod->mapstate;
|
|
|
|
|
|
|
|
|
|
|
|
bman.players_nr_s = s_mod->players;
|
|
|
|
bman.players_nr_s = s_mod->players;
|
|
|
|
bman.lastwinner = s_mod->last_winner;
|
|
|
|
bman.lastwinner = s_mod->last_winner;
|
|
|
|
|
|
|
|
|
|
|
|
if (GT_MP_PTPS) {
|
|
|
|
|
|
|
|
map.size.x = s_mod->fieldsize_x;
|
|
|
|
map.size.x = s_mod->fieldsize_x;
|
|
|
|
map.size.y = s_mod->fieldsize_y;
|
|
|
|
map.size.y = s_mod->fieldsize_y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strncpy (map.tileset, s_mod->tileset, LEN_TILESETNAME);
|
|
|
|
strncpy (map.tileset, s_mod->tileset, LEN_TILESETNAME);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
bman.updatestatusbar = 1;
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -308,7 +386,8 @@ send_servermode (_net_addr * addr, int pl_nr)
|
|
|
|
s_mod.multitype = bman.multitype;
|
|
|
|
s_mod.multitype = bman.multitype;
|
|
|
|
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.pl_nr = pl_nr;
|
|
|
|
s_mod.p_nr = pl_nr;
|
|
|
|
|
|
|
|
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;
|
|
|
|
s_mod.fieldsize_y = map.size.y;
|
|
|
|
s_mod.fieldsize_y = map.size.y;
|
|
|
@ -519,8 +598,10 @@ do_playerdata (struct pkg_playerdata *p_dat, _net_addr * addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* set the state of the player */
|
|
|
|
/* set the state of the player */
|
|
|
|
if (p_dat->p_nr != bman.p_nr && PS_IS_used (pl->state))
|
|
|
|
if (p_dat->p_nr != bman.p_nr && PS_IS_used (pl->state)) {
|
|
|
|
pl->state |= PSF_net;
|
|
|
|
pl->state |= PSF_net;
|
|
|
|
|
|
|
|
pl->state &= (0xff - PSF_ai);
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
pl->state &= (0xff - PSF_net);
|
|
|
|
|
|
|
|
|
|
|
@ -607,7 +688,7 @@ do_playermove (struct pkg_playermove *p_dat, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
/* check if the right player is sending the information */
|
|
|
|
/* check if the right player is sending the information */
|
|
|
|
pl = &players[p_dat->p_nr];
|
|
|
|
pl = &players[p_dat->p_nr];
|
|
|
|
if (addr->pl_nr != 0 && addr->pl_nr != p_dat->p_nr)
|
|
|
|
if (addr->pl_nr != bman.p_servnr && addr->pl_nr != p_dat->p_nr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
pl->m = p_dat->m;
|
|
|
|
pl->m = p_dat->m;
|
|
|
@ -721,14 +802,14 @@ do_tunneldata (struct pkg_tunneldata *tun_pkg, _net_addr * addr)
|
|
|
|
addr->pl_nr, addr->host, addr->port, tun_pkg->tunnel_nr,
|
|
|
|
addr->pl_nr, addr->host, addr->port, tun_pkg->tunnel_nr,
|
|
|
|
NTOH16 (tun_pkg->target.x), NTOH16 (tun_pkg->target.y));
|
|
|
|
NTOH16 (tun_pkg->target.x), NTOH16 (tun_pkg->target.y));
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr != 0 && GT_MP_PTPM && NTOH16 (tun_pkg->target.y) == -1
|
|
|
|
if (addr->pl_nr != bman.p_servnr && GT_MP_PTPM && NTOH16 (tun_pkg->target.y) == -1
|
|
|
|
&& NTOH16 (tun_pkg->target.x) == -1) {
|
|
|
|
&& NTOH16 (tun_pkg->target.x) == -1) {
|
|
|
|
send_tunneldata (addr, tun_pkg->tunnel_nr,
|
|
|
|
send_tunneldata (addr, tun_pkg->tunnel_nr,
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].x, map.tunnel[tun_pkg->tunnel_nr].y);
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].x, map.tunnel[tun_pkg->tunnel_nr].y);
|
|
|
|
players[addr->pl_nr].net.net_status = tun_pkg->tunnel_nr;
|
|
|
|
players[addr->pl_nr].net.net_status = tun_pkg->tunnel_nr;
|
|
|
|
players[addr->pl_nr].net.net_istep = 3;
|
|
|
|
players[addr->pl_nr].net.net_istep = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (addr->pl_nr == 0 && tun_pkg->tunnel_nr < GAME_MAX_TUNNELS) {
|
|
|
|
else if (addr->pl_nr == bman.p_servnr && tun_pkg->tunnel_nr < GAME_MAX_TUNNELS) {
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].x = NTOH16 (tun_pkg->target.x);
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].x = NTOH16 (tun_pkg->target.x);
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].y = NTOH16 (tun_pkg->target.y);
|
|
|
|
map.tunnel[tun_pkg->tunnel_nr].y = NTOH16 (tun_pkg->target.y);
|
|
|
|
players[bman.p_nr].net.net_status = tun_pkg->tunnel_nr;
|
|
|
|
players[bman.p_nr].net.net_status = tun_pkg->tunnel_nr;
|
|
|
@ -832,7 +913,7 @@ do_getfield (struct pkg_getfield *gf_dat, _net_addr * addr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr != -1 && bman.state == GS_update && GT_MP_PTPM) {
|
|
|
|
if (addr->pl_nr != -1 && bman.state == GS_update && GT_MP_PTPM) {
|
|
|
|
if (addr->pl_nr > 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
if (addr->pl_nr != bman.p_servnr && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
players[addr->pl_nr].net.net_status = gf_dat->line;
|
|
|
|
players[addr->pl_nr].net.net_status = gf_dat->line;
|
|
|
|
players[addr->pl_nr].net.net_istep = 2;
|
|
|
|
players[addr->pl_nr].net.net_istep = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -882,7 +963,7 @@ do_fieldline (struct pkg_fieldline *f_dat, _net_addr * addr)
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
if (addr->pl_nr == -1)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr != 0) {
|
|
|
|
if (addr->pl_nr != bman.p_servnr ) {
|
|
|
|
/* the data we have got are not from the server */
|
|
|
|
/* the data we have got are not from the server */
|
|
|
|
d_printf ("do_fieldline: the data we have got are not from the server\n");
|
|
|
|
d_printf ("do_fieldline: the data we have got are not from the server\n");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -934,7 +1015,7 @@ do_getplayerdata (struct pkg_getplayerdata *gp_dat, _net_addr * addr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr != -1 && bman.state == GS_update && GT_MP_PTPM) {
|
|
|
|
if (addr->pl_nr != -1 && bman.state == GS_update && GT_MP_PTPM) {
|
|
|
|
if (addr->pl_nr > 0 && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
if (addr->pl_nr != bman.p_servnr && addr->pl_nr < MAX_PLAYERS) {
|
|
|
|
players[addr->pl_nr].net.net_status = gp_dat->pl_nr;
|
|
|
|
players[addr->pl_nr].net.net_status = gp_dat->pl_nr;
|
|
|
|
players[addr->pl_nr].net.net_istep = 1;
|
|
|
|
players[addr->pl_nr].net.net_istep = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -953,7 +1034,7 @@ do_playerstatus (struct pkg_playerstatus *stat, _net_addr * addr)
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("do_playerstatus (%s,%s)\n", addr->host, addr->port);
|
|
|
|
d_printf ("do_playerstatus (%s,%s)\n", addr->host, addr->port);
|
|
|
|
|
|
|
|
|
|
|
|
if (addr->pl_nr != 0 && !(GT_MP_PTPM)) {
|
|
|
|
if (addr->pl_nr != bman.p_servnr && !(GT_MP_PTPM)) {
|
|
|
|
/* the data we have got are not from the server */
|
|
|
|
/* the data we have got are not from the server */
|
|
|
|
d_printf ("do_playerstatus: the data we have got are not from the server\n");
|
|
|
|
d_printf ("do_playerstatus: the data we have got are not from the server\n");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -1067,7 +1148,7 @@ do_special (struct pkg_special *sp_pkg, _net_addr * addr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
/* check if the right player is sending the information */
|
|
|
|
/* check if the right player is sending the information */
|
|
|
|
if (addr->pl_nr != 0 && addr->pl_nr != sp_pkg->pl_nr)
|
|
|
|
if (addr->pl_nr != bman.p_servnr && addr->pl_nr != sp_pkg->pl_nr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
players[sp_pkg->pl_nr].special.type = sp_pkg->typ;
|
|
|
|
players[sp_pkg->pl_nr].special.type = sp_pkg->typ;
|
|
|
@ -1146,7 +1227,7 @@ do_mapinfo (struct pkg_mapinfo *map_pkg, _net_addr * addr)
|
|
|
|
d_printf ("do_mapinfo (addr %d) size[%d,%d]\n", addr->pl_nr, map_pkg->size_x, map_pkg->size_y);
|
|
|
|
d_printf ("do_mapinfo (addr %d) size[%d,%d]\n", addr->pl_nr, map_pkg->size_x, map_pkg->size_y);
|
|
|
|
|
|
|
|
|
|
|
|
/* check if the server send this information */
|
|
|
|
/* check if the server send this information */
|
|
|
|
if (addr->pl_nr != 0)
|
|
|
|
if (addr->pl_nr != bman.p_servnr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (map_pkg->tileset[0] == 0) {
|
|
|
|
if (map_pkg->tileset[0] == 0) {
|
|
|
@ -1207,6 +1288,10 @@ inpkg_check (unsigned char typ, short int id, _net_addr * addr)
|
|
|
|
void
|
|
|
|
void
|
|
|
|
send_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
send_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
/* if the packet would be send to the ai player so ignore it */
|
|
|
|
|
|
|
|
if (PS_IS_aiplayer (players[addr->pl_nr].state))
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
packet->h.id = HTON16 (pkg_lastid++);
|
|
|
|
packet->h.id = HTON16 (pkg_lastid++);
|
|
|
|
if (bman.net_ai_family != PF_INET)
|
|
|
|
if (bman.net_ai_family != PF_INET)
|
|
|
|
packet->h.flags = packet->h.flags | PKGF_ipv6;
|
|
|
|
packet->h.flags = packet->h.flags | PKGF_ipv6;
|
|
|
@ -1234,7 +1319,7 @@ fwd_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
|| packet->h.typ == PKG_bombdata || packet->h.typ == PKG_chat
|
|
|
|
|| packet->h.typ == PKG_bombdata || packet->h.typ == PKG_chat
|
|
|
|
|| packet->h.typ == PKG_special)
|
|
|
|
|| packet->h.typ == PKG_special)
|
|
|
|
for (pl = 1; pl < MAX_PLAYERS; pl++)
|
|
|
|
for (pl = 1; pl < MAX_PLAYERS; pl++)
|
|
|
|
if (PS_IS_netplayer (players[pl].state)
|
|
|
|
if ((!PS_IS_aiplayer (players[pl].state)) && PS_IS_netplayer (players[pl].state)
|
|
|
|
&& ((players[pl].net.flags & NETF_firewall) == NETF_firewall
|
|
|
|
&& ((players[pl].net.flags & NETF_firewall) == NETF_firewall
|
|
|
|
|| (players[addr->pl_nr].net.flags & NETF_firewall) ==
|
|
|
|
|| (players[addr->pl_nr].net.flags & NETF_firewall) ==
|
|
|
|
NETF_firewall) && pl != addr->pl_nr)
|
|
|
|
NETF_firewall) && pl != addr->pl_nr)
|
|
|
@ -1346,6 +1431,9 @@ do_pkg (struct pkg *packet, _net_addr * addr)
|
|
|
|
case (PKG_tunneldata):
|
|
|
|
case (PKG_tunneldata):
|
|
|
|
do_tunneldata ((struct pkg_tunneldata *) packet, addr);
|
|
|
|
do_tunneldata ((struct pkg_tunneldata *) packet, addr);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case (PKG_joingame):
|
|
|
|
|
|
|
|
do_joingame ((struct pkg_joingame *) packet, addr);
|
|
|
|
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
send_error (addr, "BomberClone: unknown data packet");
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|