terom@21: terom@21: #include "NetworkClient.hh" terom@23: #include "Engine.hh" terom@23: #include "Logger.hh" terom@21: terom@25: #include terom@25: terom@36: NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : terom@36: NetworkCore(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) { terom@24: terom@24: // connect slots terom@36: slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create); terom@22: terom@24: // XXX: sig_disconnected terom@21: } terom@22: terom@36: void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacket &pkt) { terom@36: switch (msg_id) { terom@24: case NETMSG_SERVER_HELLO: terom@24: on_server_hello(obj, pkt); terom@22: terom@24: break; terom@24: terom@24: case NETMSG_PLAYER_INFO: terom@24: on_player_info(obj, pkt); terom@22: terom@24: break; terom@24: terom@24: case NETMSG_PLAYER_JOIN: terom@24: on_player_join(obj, pkt); terom@22: terom@24: break; terom@24: terom@24: default: terom@36: Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj; terom@24: } terom@22: } terom@24: terom@36: void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacket &pkt) { terom@24: // read the packet terom@36: Vector position = pkt.read_vector(); terom@24: terom@35: Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position; terom@22: terom@24: // create the LocalPlayer object terom@35: NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position); terom@22: terom@24: // inform state terom@24: state.newLocalPlayer(player); terom@22: } terom@24: terom@36: void NetworkClient::on_player_info (NetworkObject_Client *obj, NetworkPacket &pkt) { terom@24: // read the packet terom@36: Vector position = pkt.read_vector(); terom@24: terom@35: Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position; terom@22: terom@24: // create the LocalPlayer object terom@35: NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); terom@22: terom@24: // inform state terom@24: state.newRemotePlayer(player); terom@22: terom@22: } terom@24: terom@36: void NetworkClient::on_player_join (NetworkObject_Client *obj, NetworkPacket &pkt) { terom@24: // read the packet terom@36: Vector position = pkt.read_vector(); terom@24: terom@35: Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position; terom@24: terom@24: // create the RemotePlayer object terom@35: NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position); terom@22: terom@24: // inform state terom@24: state.newRemotePlayer(player); terom@22: } terom@24: terom@22: void NetworkClient::player_quit (NetworkClientRemotePlayer *player) { terom@24: // inform state terom@24: state.removePlayer(player); terom@22: terom@24: // delete terom@24: // XXX: leak because deleting the slot while it's being called breaks ClanLib terom@24: // delete player; terom@22: } terom@22: terom@36: NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : terom@35: LocalPlayer(client.state, position, true), client(client), obj(obj) { terom@24: terom@24: // receive messages terom@36: slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position); terom@22: } terom@24: terom@35: void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) { terom@25: // always send move, in all cases terom@36: NetworkPacket pkt; terom@36: pkt.write_vector(force); terom@36: pkt.write_uint16(dt); terom@22: terom@36: obj->send(NETMSG_CLIENT_MOVE, pkt, false); terom@35: terom@35: // do not handle locally terom@22: } terom@24: terom@36: void NetworkClientLocalPlayer::on_position (NetworkPacket &pkt) { terom@36: Vector position = pkt.read_vector(); terom@36: Vector velocity = pkt.read_vector(); terom@23: terom@36: Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity; terom@24: terom@35: // just update... terom@35: updatePhysics(position, velocity); terom@22: } terom@24: terom@36: NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) : terom@35: RemotePlayer(client.state, position, true), client(client), obj(obj) { terom@24: terom@24: // receive messages terom@36: slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position); terom@36: slots.connect(obj->sig_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit); terom@22: } terom@22: terom@36: void NetworkClientRemotePlayer::on_position (NetworkPacket &pkt) { terom@36: Vector position = pkt.read_vector(); terom@36: Vector velocity = pkt.read_vector(); terom@35: terom@36: Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity; terom@24: terom@35: // just update... terom@35: updatePhysics(position, velocity); terom@22: } terom@22: terom@36: void NetworkClientRemotePlayer::on_quit (NetworkPacket &pkt) { terom@24: // pkt is empty terom@24: (void) pkt; terom@22: terom@36: Engine::log(INFO, "client_player.on_quit") /* << "obj=" << obj */; terom@23: terom@24: client.player_quit(this); terom@22: } terom@36: