# HG changeset patch # User terom # Date 1228609650 0 # Node ID 550397d9d479f8dffc65b0e58bc54aaf38f560d6 # Parent 15193c2bbe2feb1a5a94e45cc1658017f7718627 implement network weapon changes and fix weapon firing diff -r 15193c2bbe2f -r 550397d9d479 src/Network/Client.cc --- 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) { diff -r 15193c2bbe2f -r 550397d9d479 src/Network/Client.hh --- 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 { diff -r 15193c2bbe2f -r 550397d9d479 src/Network/Protocol.hh --- 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 diff -r 15193c2bbe2f -r 550397d9d479 src/Network/Server.cc --- 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; diff -r 15193c2bbe2f -r 550397d9d479 src/Network/Server.hh --- 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); diff -r 15193c2bbe2f -r 550397d9d479 src/Player.cc --- 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 diff -r 15193c2bbe2f -r 550397d9d479 src/Player.hh --- 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 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