<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39614 >
Second step: notify to the clients all changes about connections:
+ new created players names when a client joins.
+ lost detached connections.
+ when a player get detached after a /remove usage.
+ when a game is loaded with /load, notify all changes. Don't change the
page if there are many connected users: the chat is removed, then the
people cannot communicate or type commands.
Patch attached
Index: server/connecthand.c
===================================================================
--- server/connecthand.c (révision 13752)
+++ server/connecthand.c (copie de travail)
@@ -136,8 +136,6 @@
notify_conn(dest, NULL, E_CONNECTION,
_("Couldn't attach your connection to new player."));
freelog(LOG_VERBOSE, "%s is not attached to a player", pconn->username);
- } else {
- sz_strlcpy(pconn->player->name, pconn->username);
}
}
@@ -428,6 +426,7 @@
pplayer = &game.players[game.info.nplayers];
server_player_init(pplayer, FALSE, TRUE);
game.info.nplayers++;
+ sz_strlcpy(pplayer->name, pconn->username);
}
}
Index: server/sernet.c
===================================================================
--- server/sernet.c (révision 13752)
+++ server/sernet.c (copie de travail)
@@ -211,6 +211,8 @@
pconn->player = NULL;
pconn->access_level = ALLOW_NONE;
connection_common_close(pconn);
+
+ send_conn_info(pconn->self, game.est_connections);
}
/*****************************************************************************
Index: server/stdinhand.c
===================================================================
--- server/stdinhand.c (révision 13752)
+++ server/stdinhand.c (copie de travail)
@@ -3266,6 +3266,15 @@
return TRUE;
}
+ /* Detach all connection to prevent client crashes. */
+ conn_list_iterate(game.est_connections, pconn) {
+ if (pconn->player) {
+ unattach_connection_from_player(pconn);
+ }
+ } conn_list_iterate_end;
+ send_conn_info(game.est_connections, game.est_connections);
+ send_player_info(NULL, NULL);
+
/* we found it, free all structures */
server_game_free();
@@ -3290,16 +3299,17 @@
send_game_info(game.est_connections);
send_rulesets(game.est_connections);
- /* Everything seemed to load ok; spread the good news. */
- send_load_game_info(TRUE);
+ /* send_load_game_info() don't work well for multi-players games. */
+ if (conn_list_size(game.all_connections) == 1) {
+ send_load_game_info(TRUE);
+ } else {
+ send_player_info(NULL, NULL);
+ }
/* attach connections to players. currently, this applies only
* to connections that have the correct username. Any attachments
* made before the game load are unattached. */
conn_list_iterate(game.est_connections, pconn) {
- if (pconn->player) {
- unattach_connection_from_player(pconn);
- }
players_iterate(pplayer) {
if (strcmp(pconn->username, pplayer->username) == 0) {
attach_connection_to_player(pconn, pplayer);
@@ -3307,6 +3316,8 @@
}
} players_iterate_end;
} conn_list_iterate_end;
+ send_conn_info(game.est_connections, game.est_connections);
+
return TRUE;
}
Index: server/plrhand.c
===================================================================
--- server/plrhand.c (révision 13752)
+++ server/plrhand.c (copie de travail)
@@ -1127,6 +1127,7 @@
if (!unattach_connection_from_player(pconn)) {
die("player had a connection attached that didn't belong to it!");
}
+ send_conn_info(pconn->self, game.est_connections);
} conn_list_iterate_end;
team_remove_player(pplayer);
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev