src/Network/Client.cc
changeset 223 2fcaf54ed37b
parent 221 fbc5db6fce45
child 224 e6faefba2ec1
--- 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
+}