--- a/src/Network/Server.cc Tue Jan 27 00:02:34 2009 +0200
+++ b/src/Network/Server.cc Tue Jan 27 00:12:07 2009 +0200
@@ -110,16 +110,8 @@
// player is not in players list yet
assert(player != this);
- // we send a NETMSG_PLAYER_INFO message for the player object
- NetworkMessage player_msg(*player, NETMSG_PLAYER_INFO);
-
- // write packet
- player_msg.write_vector(player->getPosition());
-
- // send message to client
- node.send(player_msg);
-
- // XXX: send rope info...
+ // send info
+ player->send_info(node);
}
// sync projectiles
@@ -198,43 +190,12 @@
void NetworkServerPlayer::handleRopeState (RopeState state) {
Engine::log(DEBUG, "server_player.rope_state") << "state=" << rope.getState() << ", position=" << rope.getPosition() << ", velocity=" << rope.getVelocity() << ", length=" << rope.getLength() << ", pivotPlayer=" << rope.getPivotPlayer();
-
- switch (state) {
- case ROPE_FLYING: {
- NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_THROW);
-
- msg.write_vector(rope.getPosition());
- msg.write_vector(rope.getVelocity());
- msg.write_float32(rope.getLength());
-
- server.netsession.all_nodes().send(msg);
-
- } break;
-
- case ROPE_FIXED: {
- NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_FIXED);
-
- Player *player_base = rope.getPivotPlayer();
- NetworkServerPlayer *player = NULL;
-
- if (player_base != NULL && (player = dynamic_cast<NetworkServerPlayer*>(player_base)) == NULL)
- throw Error("NetworkServerPlayer::handleRopeState: rope's pivotPlayer is not a NetworkServerPlayer");
-
- msg.write_vector(rope.getPosition());
- msg.write_float32(rope.getLength());
- msg.write_object(player); // may be NULL
-
- server.netsession.all_nodes().send(msg);
-
- } break;
- case ROPE_FOLDED: {
- NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_RELEASED);
-
- server.netsession.all_nodes().send(msg);
-
- } break;
- }
+ // the NetworkGroup to send to
+ NetworkGroup all = server.netsession.all_nodes();
+
+ // send new rope state
+ send_rope_state(all, state);
}
void NetworkServerPlayer::handleRopeLength (float length) {
@@ -274,6 +235,60 @@
Player::die(start_timer);
}
+void NetworkServerPlayer::send_info (NetworkNode &node) {
+ // we send a NETMSG_PLAYER_INFO message for the player object
+ NetworkMessage player_msg(*this, NETMSG_PLAYER_INFO);
+
+ // write packet
+ player_msg.write_vector(getPosition());
+
+ // send message to client
+ node.send(player_msg);
+
+ // then send rope state, unless folded
+ if (rope.getState() != ROPE_FOLDED)
+ send_rope_state(node, rope.getState());
+}
+
+void NetworkServerPlayer::send_rope_state (NetworkTarget &target, RopeState state) {
+ switch (state) {
+ case ROPE_FLYING: {
+ NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_THROW);
+
+ msg.write_vector(rope.getPosition());
+ msg.write_vector(rope.getVelocity());
+ msg.write_float32(rope.getLength());
+
+ target.send(msg);
+
+ } break;
+
+ case ROPE_FIXED: {
+ NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_FIXED);
+
+ Player *player_base = rope.getPivotPlayer();
+ NetworkServerPlayer *player = NULL;
+
+ if (player_base != NULL && (player = dynamic_cast<NetworkServerPlayer*>(player_base)) == NULL)
+ throw Error("NetworkServerPlayer::handleRopeState: rope's pivotPlayer is not a NetworkServerPlayer");
+
+ msg.write_vector(rope.getPosition());
+ msg.write_float32(rope.getLength());
+ msg.write_object(player); // may be NULL
+
+ target.send(msg);
+
+ } break;
+
+ case ROPE_FOLDED: {
+ NetworkMessage msg(*this, NETMSG_PLAYER_ROPE_RELEASED);
+
+ target.send(msg);
+
+ } break;
+ }
+}
+
void NetworkServerPlayer::on_disconnected (void) {
NetworkMessage msg(*this, NETMSG_PLAYER_QUIT);
--- a/src/Network/Server.hh Tue Jan 27 00:02:34 2009 +0200
+++ b/src/Network/Server.hh Tue Jan 27 00:12:07 2009 +0200
@@ -130,7 +130,18 @@
virtual void die (bool start_timer = true);
// @}
//
-
+
+ public:
+ /**
+ * Sends the initial player info to the given node
+ */
+ void send_info (NetworkNode &node);
+
+ /**
+ * Sends the current rope state to the given target
+ */
+ void send_rope_state (NetworkTarget &target, RopeState state);
+
private:
/**
* Our NetworkNode::sig_disconnected handler. This calls NetworkServer::handle_disconnect, sends a