--- a/src/Network/Client.cc Sat Dec 06 17:51:19 2008 +0000
+++ b/src/Network/Client.cc Sat Dec 06 18:49:51 2008 +0000
@@ -11,33 +11,15 @@
state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) {
// connect slots
- slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create);
+ slots.connect(netobjs.sig_create(NETMSG_SERVER_HELLO), this, &NetworkClient::on_server_hello);
+ slots.connect(netobjs.sig_create(NETMSG_PLAYER_INFO), this, &NetworkClient::on_player_info);
+ slots.connect(netobjs.sig_create(NETMSG_PLAYER_JOIN), this, &NetworkClient::on_player_join);
+ slots.connect(netobjs.sig_create(NETMSG_PROJECTILE_CREATE), this, &NetworkClient::on_projectile_create);
+
slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array);
// XXX: sig_disconnected
}
-
-void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacketInput &pkt) {
- switch (msg_id) {
- case NETMSG_SERVER_HELLO:
- on_server_hello(obj, pkt);
-
- break;
-
- case NETMSG_PLAYER_INFO:
- on_player_info(obj, pkt);
-
- break;
-
- case NETMSG_PLAYER_JOIN:
- on_player_join(obj, pkt);
-
- break;
-
- default:
- Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj;
- }
-}
void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacketInput &pkt) {
// read the packet
@@ -79,6 +61,18 @@
state.newPlayer(player);
}
+void NetworkClient::on_projectile_create (NetworkObject_Client *obj, NetworkPacketInput &pkt) {
+ // read the packet
+ Vector position = pkt.read_vector();
+ Vector velocity = pkt.read_vector();
+ float explosionRadius = pkt.read_float32();
+
+ Engine::log(INFO, "client.on_projectile_create") << "obj=" << obj << ", pos=" << position << ", velocity=" << velocity;
+
+ // create the NetworkClientPorjectile object
+ new NetworkClientProjectile(*this, obj, position, velocity, explosionRadius);
+}
+
void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
// ignore if not from server
if (node != server)
@@ -110,9 +104,21 @@
// delete player;
}
+/*
+ * NetworkClientObjectHelper
+ */
+NetworkClientObjectHelper::NetworkClientObjectHelper (NetworkClient &client, NetworkObject_Client *obj) :
+ client(client), obj(obj)
+{
+
+}
+
+/*
+ * NetworkClientPlayerHelper
+ */
NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) :
- Player(client.state, position, true), client(client), obj(obj) {
-
+ NetworkClientObjectHelper(client, obj), Player(client.state, position, true)
+{
// 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);
@@ -150,7 +156,7 @@
NetworkPacket pkt;
pkt.write_uint16(input);
- obj->send(NETMSG_CLIENT_MOVE, pkt, false);
+ obj->send(NETMSG_CLIENT_INPUT, pkt, false);
// do not handle locally
}
@@ -171,4 +177,10 @@
client.player_quit(this);
}
+NetworkClientProjectile::NetworkClientProjectile (NetworkClient &client, NetworkObject_Client *obj, Vector position,
+ Vector velocity, float explosionRadius) :
+ NetworkClientObjectHelper(client, obj), Projectile(client.state, position, velocity, true, explosionRadius)
+{
+ // XXX: register messages
+}