implement network weapon changes and fix weapon firing
authorterom
Sun, 07 Dec 2008 00:27:30 +0000
changeset 239 550397d9d479
parent 238 15193c2bbe2f
child 240 e8ca212a2739
implement network weapon changes and fix weapon firing
src/Network/Client.cc
src/Network/Client.hh
src/Network/Protocol.hh
src/Network/Server.cc
src/Network/Server.hh
src/Player.cc
src/Player.hh
--- a/src/Network/Client.cc	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Network/Client.cc	Sun Dec 07 00:27:30 2008 +0000
@@ -122,6 +122,7 @@
     // receive position updates
     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position);
     slots.connect(obj->sig_message(NETMSG_PLAYER_DIG), this, &NetworkClientPlayerHelper::on_dig);
+    slots.connect(obj->sig_message(NETMSG_PLAYER_WEAPON_CHANGE), this, &NetworkClientPlayerHelper::on_weapon_change);
 }
 
 void NetworkClientPlayerHelper::on_position (NetworkPacketInput &pkt) {
@@ -145,6 +146,14 @@
     // just update... 
     handleDig(position, radius);
 }
+        
+void NetworkClientPlayerHelper::on_weapon_change (NetworkPacketInput &pkt) {
+    uint8_t weapon_index = pkt.read_uint8();
+
+    Engine::log(INFO, "client_player.on_weapon_change") << "obj=" << obj << ", weapon_index=" << weapon_index;
+
+    handleChangeWeapon(weapon_index);
+}
 
 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
     Player(client.state, position, true), NetworkClientPlayerHelper(client, position, obj) {
--- a/src/Network/Client.hh	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Network/Client.hh	Sun Dec 07 00:27:30 2008 +0000
@@ -59,6 +59,7 @@
     private:
         void on_position (NetworkPacketInput &pkt);
         void on_dig (NetworkPacketInput &pkt);
+        void on_weapon_change (NetworkPacketInput &pkt);
 };
 
 class NetworkClientLocalPlayer : public NetworkClientPlayerHelper, public LocalPlayer {
--- a/src/Network/Protocol.hh	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Network/Protocol.hh	Sun Dec 07 00:27:30 2008 +0000
@@ -86,6 +86,13 @@
     NETMSG_PLAYER_DIG           = 0x0302,
 
     /*
+     * Player changed weapon
+     *
+     * uint8_t  weapon_index
+     */
+    NETMSG_PLAYER_WEAPON_CHANGE = 0x0303,
+
+    /*
      * New projectile spawned
      *
      * Vector   position
--- a/src/Network/Server.cc	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Network/Server.cc	Sun Dec 07 00:27:30 2008 +0000
@@ -89,11 +89,26 @@
     Player::handleDig(position, radius);
 }
 
-void NetworkServerPlayer::handleCreateProjectile (Weapon &weapon, Vector position, Vector velocity) {
-    Engine::log(INFO, "server_player.create_projectile") << /* "weapon=" << weapon << ", */ "position=" << position << ", velocity=" << velocity;
+void NetworkServerPlayer::handleCreateProjectile (Weapon *weapon, Vector position, Vector velocity) {
+    Engine::log(INFO, "server_player.create_projectile") << "weapon='" << weapon->getName() << "', position=" << position << ", velocity=" << velocity;
 
     // create new NetworkServerProjectile object
-    new NetworkServerProjectile(server, position, velocity, weapon.getExplosionRadius(), weapon.getExpireTicks());
+    new NetworkServerProjectile(server, position, velocity, weapon->getExplosionRadius(), weapon->getExpireTicks());
+}
+
+void NetworkServerPlayer::handleChangeWeapon (unsigned int weaponIndex) {
+    NetworkPacket pkt;
+
+    Engine::log(INFO, "server_player.change_weapon") << "weaponIndex=" << weaponIndex;
+    
+    // write packet
+    pkt.write_uint8(weaponIndex);
+    
+    // XXX: only tell the client itself?
+    obj.send_all(NETMSG_PLAYER_WEAPON_CHANGE, pkt, true);
+    
+    // pass through
+    Player::handleChangeWeapon(weaponIndex);
 }
 
 void NetworkServerPlayer::on_disconnected (void) {
@@ -118,6 +133,7 @@
         return;
     }
     
+    // read packet 
     PlayerInput input = pkt.read_uint16();
 
     Engine::log(INFO, "server_player.on_input") << "player=" << obj << ", old_pos=" << position << ", input=" << input;
--- a/src/Network/Server.hh	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Network/Server.hh	Sun Dec 07 00:27:30 2008 +0000
@@ -44,10 +44,12 @@
         
     public:
         NetworkServerPlayer (NetworkServer &server, NetworkNode *node);
-        
+    
+    protected:    
         // override from Player to replicate side effects of events to clients
         virtual void handleDig (Vector position, float radius);
-        virtual void handleCreateProjectile (Weapon &weapon, Vector position, Vector velocity);
+        virtual void handleCreateProjectile (Weapon *weapon, Vector position, Vector velocity);
+        virtual void handleChangeWeapon (unsigned int weaponIndex);
 
     private:
         void on_disconnected (void);
--- a/src/Player.cc	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Player.cc	Sun Dec 07 00:27:30 2008 +0000
@@ -21,7 +21,7 @@
 
 Player::Player(GameState &state, Vector position, bool visible) : 
     PhysicsObject(state.world, PLAYER_MASS, position, Vector(0, 0)), state(state), visible(visible),
-    weapons(buildWeaponsList()), selectedWeapon(0), changing(false), animation_step(0), rope(*this) 
+    weapons(buildWeaponsList()), selectedWeapon(0), animation_step(0), rope(*this) 
 {
     // XXX: populate weapons from somewhere else
 
--- a/src/Player.hh	Sun Dec 07 00:12:04 2008 +0000
+++ b/src/Player.hh	Sun Dec 07 00:27:30 2008 +0000
@@ -20,12 +20,19 @@
         GameState &state;
 
     protected:
+        // XXX: not used
         bool visible;
+
+        // our weapons
         std::vector<Weapon*> weapons;
-        unsigned int selectedWeapon; //unsigned for x%sW not to fail
-        bool changing;
 
+        // the index of the currently selected weapon
+        unsigned int selectedWeapon;
+        
+        // we have a rope
         Rope rope;
+
+        // XXX: hmm... updated where?
         int animation_step;
 
         // default constructor for use with virtual inheritance... it's not defined