# HG changeset patch # User Tero Marttila # Date 1233007354 -7200 # Node ID a8ba81432dddaec7fa3a91a7306381a24288f47e # Parent 4ee797e09383ab23fa1c51b34950c2224deeed68 move write_object to NetworkMessage, fix player sync, and implement projectile sync diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Client.cc --- 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; } } diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Message.cc --- 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); +} diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Message.hh --- 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 */ diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Object.cc --- 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 */ diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Object.hh --- 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); }; /** diff -r 4ee797e09383 -r a8ba81432ddd src/Network/Server.cc --- 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::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::iterator it = server.state.projectiles.begin(); it != server.state.projectiles.end(); it++) { NetworkServerProjectile *proj = dynamic_cast(*it); - + // all projectiles should be under the control of the server assert(proj); - // XXX: send info + const NetworkServerPlayer *player = dynamic_cast(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); diff -r 4ee797e09383 -r a8ba81432ddd src/Projectile.cc --- 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); } diff -r 4ee797e09383 -r a8ba81432ddd src/Projectile.hh --- 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: /**