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