Author: soliton
Date: Tue Mar 25 15:27:04 2008
New Revision: 25118

URL: http://svn.gna.org/viewcvs/wesnoth?rev=25118&view=rev
Log:
* handle non-player hosts better
* consider [advance_unit] and [choose] for out-of-turn players legal commands
* send server messages always in the [message] form since the client can handle 
that now

Modified:
    trunk/src/server/game.cpp
    trunk/src/server/game.hpp

Modified: trunk/src/server/game.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.cpp?rev=25118&r1=25117&r2=25118&view=diff
==============================================================================
--- trunk/src/server/game.cpp (original)
+++ trunk/src/server/game.cpp Tue Mar 25 15:27:04 2008
@@ -310,7 +310,7 @@
 
 void game::transfer_side_control(const network::connection sock, const 
simple_wml::node& cfg) {
        DBG_GAME << "transfer_side_control...\n";
-       if (!is_player(sock)) {
+       if (!is_player(sock) && sock != owner_) {
                send_server_message("You cannot change controllers: not a 
player.", sock);
                return;
        }
@@ -358,7 +358,7 @@
                std::stringstream msg;
                msg << "You can't give away side " << side_num << ". It's 
controlled by '"
                        << old_player_name << "' not you.";
-               DBG_GAME << msg << "\n";
+               DBG_GAME << msg.str() << "\n";
                send_server_message(msg.str().c_str(), sock);
                return;
        }
@@ -381,7 +381,7 @@
                observer_join.root().add_child("observer").set_attr_dup("name", 
old_player_name.c_str());
                send_data(observer_join, old_player);
                // If the old player was the host of the game, choose another 
player.
-               if (old_player == owner_) {
+               /*if (old_player == owner_) {
                        host_leave = true;
                        if (players_.empty()) {
                                owner_ = newplayer->first;
@@ -389,7 +389,7 @@
                                owner_ = players_.front();
                        }
                        notify_new_host();
-               }
+               }*/
        }
        side_controllers_[side_num - 1] = "network";
        sides_taken_[side_num - 1] = true;
@@ -399,15 +399,11 @@
        if (host_leave) transfer_ai_sides();
 
        // If we gave the new side to an observer add him to players_.
-       const user_vector::iterator itor = std::find(observers_.begin(),
-                       observers_.end(), newplayer->first);
-       if (itor != observers_.end()) {
-               players_.push_back(*itor);
-               observers_.erase(itor);
+       if (is_observer(newplayer->first)) {
+               players_.push_back(newplayer->first);
+               observers_.erase(std::remove(observers_.begin(), 
observers_.end(), newplayer->first), observers_.end());
                // Send everyone but the new player the observer_quit message.
-               simple_wml::document observer_quit;
-               
observer_quit.root().add_child("observer_quit").set_attr_dup("name", 
newplayer_name);
-               send_data(observer_quit, newplayer->first);
+               send_observerquit(newplayer);
        }
 }
 
@@ -699,7 +695,8 @@
                || command.child("clear_labels")
                || command.child("rename")
                || command.child("countdown_update")
-               /* || command.child("choose")*/))
+               || command.child("advance_unit")
+               || command.child("choose")))
        {
                return true;
        }
@@ -734,7 +731,7 @@
                                << ". Current player is: "
                                << (player_info_->find(current_player()) != 
player_info_->end()
                                        ? 
player_info_->find(current_player())->second.name()
-                                       : "(unfound) ") << nsides_ << "/" << 
end_turn_
+                                       : "(unfound) ")// << nsides_ << "/" << 
end_turn_
                                << ".\n";
                        LOG_GAME << msg.str();
                        send_and_record_server_message(msg.str().c_str());
@@ -966,13 +963,7 @@
        // games_and_users_list_.
        if (!disconnect) user->second.mark_available();
        if (observer) {
-               //they're just an observer, so send them having quit to clients
-               simple_wml::document observer_quit;
-
-               //don't need to dup the attribute because this document is
-               //short-lived.
-               
observer_quit.root().add_child("observer_quit").set_attr("name", 
user->second.name().c_str());
-               send_data(observer_quit);
+               send_observerquit(user);
        } else {
                send_and_record_server_message((user->second.name()
                                + (disconnect ? " has disconnected." : " has 
left the game.")).c_str(), player);
@@ -991,6 +982,13 @@
                side_controllers_[side_num] = "human";
                sides_taken_[side_num] = true;
                sides_[side_num] = owner_;
+               // Check whether the host is actually a player and make him one 
if not.
+               if (!is_player(owner_)) {
+                       DBG_GAME << "making the owner a player...\n";
+                       observers_.erase(std::remove(observers_.begin(), 
observers_.end(), owner_), observers_.end());
+                       players_.push_back(owner_);
+                       send_observerquit(player_info_->find(owner_));
+               }
                send_change_controller(side_num + 1, 
player_info_->find(owner_));
 
                //send the host a notification of removal of this side
@@ -1123,6 +1121,18 @@
        }
 }
 
+void game::send_observerquit(const player_map::const_iterator observer) const {
+       if (observer == player_info_->end()) {
+               return;
+       }
+       simple_wml::document observer_quit;
+
+       //don't need to dup the attribute because this document is
+       //short-lived.
+       observer_quit.root().add_child("observer_quit").set_attr("name", 
observer->second.name().c_str());
+       send_data(observer_quit, observer->first);
+}
+
 void game::send_history(const network::connection sock) const
 {
        for(std::vector<simple_wml::document*>::const_iterator i = 
history_.begin();
@@ -1240,17 +1250,9 @@
        }
 
        simple_wml::document& doc = *docptr;
-       if(started_) {
-               simple_wml::node& cmd = doc.root().add_child("turn");
-               simple_wml::node& cfg = cmd.add_child("command");
-               simple_wml::node& msg = cfg.add_child("speak");
-               msg.set_attr("id", "server");
-               msg.set_attr_dup("message", message);
-       } else {
-               simple_wml::node& msg = doc.root().add_child("message");
-               msg.set_attr("sender", "server");
-               msg.set_attr_dup("message", message);
-       }
+       simple_wml::node& msg = doc.root().add_child("message");
+       msg.set_attr("sender", "server");
+       msg.set_attr_dup("message", message);
 
        if(sock) {
                send_to_one(doc, sock);

Modified: trunk/src/server/game.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.hpp?rev=25118&r1=25117&r2=25118&view=diff
==============================================================================
--- trunk/src/server/game.hpp (original)
+++ trunk/src/server/game.hpp Tue Mar 25 15:27:04 2008
@@ -144,6 +144,7 @@
        //! Send [observer] tags of all the observers in the game to the user or
        //! everyone if none given.
        void send_observerjoins(const network::connection sock=0) const;
+       void send_observerquit(const player_map::const_iterator observer) const;
        void send_history(const network::connection sock) const;
        //! In case of a host transfer, notify the new host about its status.
        void notify_new_host();


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

Reply via email to