--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/NetworkClient.cc Wed Dec 03 19:16:32 2008 +0000
@@ -0,0 +1,143 @@
+
+#include "NetworkClient.hh"
+#include "Engine.hh"
+#include "Logger.hh"
+
+#include <cassert>
+
+NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) :
+ NetworkCore(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);
+
+ // XXX: sig_disconnected
+}
+
+void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacket &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, NetworkPacket &pkt) {
+ // read the packet
+ Vector position = pkt.read_vector();
+
+ Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position;
+
+ // create the LocalPlayer object
+ NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position);
+
+ // inform state
+ state.newLocalPlayer(player);
+}
+
+void NetworkClient::on_player_info (NetworkObject_Client *obj, NetworkPacket &pkt) {
+ // read the packet
+ Vector position = pkt.read_vector();
+
+ Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position;
+
+ // create the LocalPlayer object
+ NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
+
+ // inform state
+ state.newRemotePlayer(player);
+
+}
+
+void NetworkClient::on_player_join (NetworkObject_Client *obj, NetworkPacket &pkt) {
+ // read the packet
+ Vector position = pkt.read_vector();
+
+ Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position;
+
+ // create the RemotePlayer object
+ NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
+
+ // inform state
+ state.newRemotePlayer(player);
+}
+
+void NetworkClient::player_quit (NetworkClientRemotePlayer *player) {
+ // inform state
+ state.removePlayer(player);
+
+ // delete
+ // XXX: leak because deleting the slot while it's being called breaks ClanLib
+ // delete player;
+}
+
+NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
+ LocalPlayer(client.state, position, true), client(client), obj(obj) {
+
+ // receive messages
+ slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
+}
+
+void NetworkClientLocalPlayer::handleMove (PlayerInput_Move input) {
+ // always send move, in all cases
+ NetworkPacket pkt;
+ pkt.write_uint16(input);
+
+ obj->send(NETMSG_CLIENT_MOVE, pkt, false);
+
+ // do not handle locally
+}
+
+void NetworkClientLocalPlayer::on_position (NetworkPacket &pkt) {
+ Vector position = pkt.read_vector();
+ Vector velocity = pkt.read_vector();
+ uint8_t flags = pkt.read_uint8();
+
+ Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
+
+ // just update...
+ updatePhysics(position, velocity, flags & NETWORK_PHYSICS_INAIR);
+}
+
+NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
+ RemotePlayer(client.state, position, true), client(client), obj(obj) {
+
+ // receive messages
+ slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
+ slots.connect(obj->sig_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
+}
+
+void NetworkClientRemotePlayer::on_position (NetworkPacket &pkt) {
+ Vector position = pkt.read_vector();
+ Vector velocity = pkt.read_vector();
+ uint8_t flags = pkt.read_uint8();
+
+ Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
+
+ // just update...
+ updatePhysics(position, velocity, flags & NETWORK_PHYSICS_INAIR);
+}
+
+void NetworkClientRemotePlayer::on_quit (NetworkPacket &pkt) {
+ // pkt is empty
+ (void) pkt;
+
+ Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
+
+ client.player_quit(this);
+}
+