move write_object to NetworkMessage, fix player sync, and implement projectile sync
authorTero Marttila <terom@fixme.fi>
Tue, 27 Jan 2009 00:02:34 +0200
changeset 434 a8ba81432ddd
parent 433 4ee797e09383
child 435 7bad24ab668e
move write_object to NetworkMessage, fix player sync, and implement projectile sync
src/Network/Client.cc
src/Network/Message.cc
src/Network/Message.hh
src/Network/Object.cc
src/Network/Object.hh
src/Network/Server.cc
src/Projectile.cc
src/Projectile.hh
--- a/src/Network/Client.cc	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Client.cc	Tue Jan 27 00:02:34 2009 +0200
@@ -118,7 +118,8 @@
             break;
 
         default:
-            Engine::log(WARN, "client.handle_create") << "Unknown object create message: obj_id=" << obj_id << ", msg_id=" << msg_id;
+            Engine::log(WARN, "client.handle_create") 
+                << "Unknown object create message: obj_id=" << obj_id << ", msg_id=" << std::hex << msg_id;
     }
 }
         
--- a/src/Network/Message.cc	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Message.cc	Tue Jan 27 00:02:34 2009 +0200
@@ -8,3 +8,8 @@
     write_uint32(obj.obj_id);
     write_uint16(msg_id);
 }
+        
+void NetworkMessage::write_object (const NetworkObject *obj) {
+    // NULL or obj->obj_id
+    write_uint32(obj ? obj->obj_id : 0);
+}
--- a/src/Network/Message.hh	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Message.hh	Tue Jan 27 00:02:34 2009 +0200
@@ -19,6 +19,13 @@
          * Create a message of the given type to be sent on the given object
          */
         NetworkMessage (NetworkObject &obj, NetworkMessageID msg_id);
+
+        /**
+         * Write the given Object's NetworkObjectID (or 0, if the obj is NULL) to this p acket
+         *
+         * @param obj the NetworkObject* whose NetworkObjectID to write to the packet, or NULL to write zero
+         */
+        void write_object (const NetworkObject *obj);
 };
 
 #endif /* NETWORK_MESSAGE_HH */
--- a/src/Network/Object.cc	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Object.cc	Tue Jan 27 00:02:34 2009 +0200
@@ -38,10 +38,6 @@
     return obj;
 }
         
-void NetworkObjectController::write_object (NetworkPacketOutput &pkt, NetworkObject *obj) {
-    pkt.write_uint32(obj ? obj->obj_id : 0);
-}
-
 /* 
  * NetworkObject_ServerController 
  */
--- a/src/Network/Object.hh	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Object.hh	Tue Jan 27 00:02:34 2009 +0200
@@ -95,13 +95,6 @@
          * @return the NetworkObject* corresponding to the NetworkObjectID in the packet, or NULL if zero/not found
          */
         NetworkObject* read_object (NetworkPacketInput &pkt);
-
-        /**
-         * Write the given Object's NetworkObjectID (or 0, if the obj is NULL) to the given packet
-         *
-         * @param the NetworkObject* whose NetworkObjectID to write to the packet, or NULL to write zero
-         */
-        void write_object (NetworkPacketOutput &pkt, NetworkObject *obj);
 };
 
 /**
--- a/src/Network/Server.cc	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Network/Server.cc	Tue Jan 27 00:02:34 2009 +0200
@@ -105,12 +105,14 @@
 
     // sync other players
     for (std::list<NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
-        NetworkMessage player_msg(*this, NETMSG_PLAYER_INFO);
         NetworkServerPlayer *player = *it;
-        
+
         // 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());
         
@@ -123,11 +125,26 @@
     // sync projectiles
     for (std::list<Projectile*>::iterator it = server.state.projectiles.begin(); it != server.state.projectiles.end(); it++) {
         NetworkServerProjectile *proj = dynamic_cast<NetworkServerProjectile*>(*it);
-        
+
         // all projectiles should be under the control of the server
         assert(proj);
 
-        // XXX: send info
+        const NetworkServerPlayer *player = dynamic_cast<const NetworkServerPlayer*>(proj->getOwner());
+
+        // as should players
+        assert(player);
+        
+        // send info
+        NetworkMessage proj_msg(*proj, NETMSG_PROJECTILE_INFO);
+
+        // write out packet
+        proj_msg.write_object(player);
+        proj_msg.write_vector(proj->getPosition());
+        proj_msg.write_vector(proj->getVelocity());
+        proj_msg.write_uint8(proj->getWeapon()->getID());
+        
+        // send to given target
+        node.send(proj_msg);
     }
 
     // broadcast NETMSG_PLAYER_JOIN to all clients except current
@@ -205,7 +222,7 @@
         
         msg.write_vector(rope.getPosition());
         msg.write_float32(rope.getLength());
-        controller.write_object(msg, player);    // may be NULL
+        msg.write_object(player);    // may be NULL
         
         server.netsession.all_nodes().send(msg);
 
@@ -319,7 +336,7 @@
     NetworkMessage msg(*this, NETMSG_PROJECTILE_PLAYER_FIRED);
 
     // write out packet
-    server.controller.write_object(msg, player);
+    msg.write_object(player);
     msg.write_vector(getPosition());
     msg.write_vector(getVelocity());
     msg.write_uint8(weapon->getID());
@@ -356,7 +373,7 @@
     Engine::log(DEBUG, "server_projectile.hit_player") << this << ": player=" << player;
     
     // write packet
-    controller.write_object(msg, player);
+    msg.write_object(player);
 
     // send packet
     server.netsession.all_nodes().send(msg);
--- a/src/Projectile.cc	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Projectile.cc	Tue Jan 27 00:02:34 2009 +0200
@@ -36,18 +36,14 @@
     destroy();
 }
 
-Health Projectile::getDamage () {
+Health Projectile::getDamage (void) {
     return weapon->getDamage();
 }
 
-void Projectile::addKillToOwner () {
+void Projectile::addKillToOwner (void) {
     player->addKill();
 } 
 
-const Player* Projectile::getOwner () {
-    return player;
-}
-   
 void Projectile::onHitPlayer (Player *player) {
     player->takeDamage(this);
 }
--- a/src/Projectile.hh	Mon Jan 26 23:39:08 2009 +0200
+++ b/src/Projectile.hh	Tue Jan 27 00:02:34 2009 +0200
@@ -52,17 +52,26 @@
      *
      * @return Damage inflicted by projectile.
      */
-    Health getDamage ();
+    Health getDamage (void);
 
     /**
      * Adds one kill to projectile owner.
      */
-    void addKillToOwner ();
+    void addKillToOwner (void);
 
     /**
      * Return the owner of the projectile.
      */
-    const Player* getOwner (); 
+    const Player* getOwner (void) const {
+        return player;
+    }
+
+    /**
+     * Return the weapon that fired this Projectile
+     */
+    const Weapon* getWeapon (void) const {
+        return weapon;
+    }
 
 protected:
     /**