--- 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