Author: martinxyz
Date: Sun Apr  6 09:56:14 2008
New Revision: 25612

URL: http://svn.gna.org/viewcvs/wesnoth?rev=25612&view=rev
Log:
this should fix bug #11281
If two players join at once the loser gets no longer kicked.
Also inform early observers via message.

Modified:
    branches/1.4/src/server/game.cpp
    branches/1.4/src/server/game.hpp

Modified: branches/1.4/src/server/game.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/game.cpp?rev=25612&r1=25611&r2=25612&view=diff
==============================================================================
--- branches/1.4/src/server/game.cpp (original)
+++ branches/1.4/src/server/game.cpp Sun Apr  6 09:56:14 2008
@@ -202,6 +202,7 @@
                {
                        side_num = (**side)["side"].to_int();
                        if (side_num < 1 || side_num > gamemap::MAX_PLAYERS) 
continue;
+                       if (sides_taken_[side_num - 1]) continue;
                        side_controllers_[side_num - 1] = "network";
                        sides_[side_num - 1] = user->first;
                        sides_taken_[side_num - 1] = true;
@@ -210,6 +211,7 @@
                        
                        simple_wml::string_span data = cfg.output_compressed();
                        network::send_raw_data(data.begin(), data.size(), 
owner_);
+                       DBG_GAME << "take_side: took side " << side_num << " 
because the name matched\n";
                        DBG_GAME << debug_player_info();
                        return true;
                }
@@ -222,6 +224,8 @@
                                side_num = (**side)["side"].to_int();
                        } catch (bad_lexical_cast&) { continue; }
                        if (side_num < 1 || side_num > gamemap::MAX_PLAYERS) 
continue;
+                       if (sides_taken_[side_num - 1]) continue;
+                       // we expect that the host will really use our proposed 
side number (he could do different)
                        side_controllers_[side_num - 1] = "network";
                        sides_[side_num - 1] = user->first;
                        sides_taken_[side_num - 1] = true;
@@ -229,10 +233,12 @@
                        // Tell the host which side the new player should take.
                        simple_wml::string_span data = cfg.output_compressed();
                        network::send_raw_data(data.begin(), data.size(), 
owner_);
+                       DBG_GAME << "take_side: took the first free network 
side which was " << side_num << "\n";
                        DBG_GAME << debug_player_info();
                        return true;
                }
        }
+       DBG_GAME << "take_side: there are no more sides available\n";
        //if we get here we couldn't find a side to take
        return false;
 }
@@ -855,7 +861,7 @@
        return true;
 }
 
-void game::add_player(const network::connection player, const bool observer) {
+void game::add_player(const network::connection player, bool observer) {
        if(is_member(player)) {
                ERR_GAME << "ERROR: Player is already in this game. (socket: "
                        << player << ")\n";
@@ -882,6 +888,7 @@
        } else if (!allow_observers()) {
                return; //false;
        } else {
+               observer = true;
                DBG_GAME << "adding observer...\n";
                observers_.push_back(player);
 
@@ -910,6 +917,11 @@
        } else {
                send_user_list();
        }
+
+       if (observer && end_turn_ == 0) {
+               // in case someone took the last slot right before this player
+               send_server_message("You are an observer.", player);
+       }
 }
 
 //! Removes a user from the game.

Modified: branches/1.4/src/server/game.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.4/src/server/game.hpp?rev=25612&r1=25611&r2=25612&view=diff
==============================================================================
--- branches/1.4/src/server/game.hpp (original)
+++ branches/1.4/src/server/game.hpp Sun Apr  6 09:56:14 2008
@@ -59,7 +59,7 @@
        //! Ban and kick a user by name. He doesn't need to be in this game.
        network::connection ban_user(const simple_wml::node& ban, const 
player_map::const_iterator banner);
 
-       void add_player(const network::connection player, const bool observer = 
false);
+       void add_player(const network::connection player, bool observer = 
false);
        bool remove_player(const network::connection player, const bool 
disconnect=false);
 
        //! Adds players and observers into one vector and returns that.


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to