diff -r 561892e2a30e -r 25becd2cb026 src/NetworkClient.cc --- /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 + +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); +} +