send initial rope state on join, fixing #5 for now
authorTero Marttila <terom@fixme.fi>
Tue, 27 Jan 2009 00:12:07 +0200
changeset 435 7bad24ab668e
parent 434 a8ba81432ddd
child 436 49f94c4bdf0d
send initial rope state on join, fixing #5 for now
src/Network/Server.cc
src/Network/Server.hh
--- 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