move write_object to NetworkMessage, fix player sync, and implement projectile sync
--- 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:
/**