src/proto2/NetworkClient.cc
branchno-netsession
changeset 36 785d220fc6b7
parent 35 e21cfda0edde
equal deleted inserted replaced
35:e21cfda0edde 36:785d220fc6b7
     3 #include "Engine.hh"
     3 #include "Engine.hh"
     4 #include "Logger.hh"
     4 #include "Logger.hh"
     5 
     5 
     6 #include <cassert>
     6 #include <cassert>
     7 
     7 
     8 NetworkClient::NetworkClient (GameState &state, const CL_IPAddress &connect_to) : 
     8 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : 
     9     NetworkCore(state), server(netsession.connect(connect_to)) {
     9     NetworkCore(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) {
    10     
    10     
    11     // connect slots
    11     // connect slots
    12     slots.connect(netobjs.sig_create_object(), this, &NetworkClient::on_create_object);
    12     slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create);
    13 
    13 
    14     // XXX: sig_disconnected
    14     // XXX: sig_disconnected
    15 }
    15 }
    16 
    16 
    17 void NetworkClient::on_create_object (CL_NetObject_Client &obj, int msg_type, CL_NetPacket &pkt) {
    17 void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacket &pkt) {
    18     switch (msg_type) {
    18     switch (msg_id) {
    19         case NETMSG_SERVER_HELLO:
    19         case NETMSG_SERVER_HELLO:
    20             on_server_hello(obj, pkt);
    20             on_server_hello(obj, pkt);
    21 
    21 
    22             break;
    22             break;
    23         
    23         
    30             on_player_join(obj, pkt);
    30             on_player_join(obj, pkt);
    31 
    31 
    32             break;
    32             break;
    33 
    33 
    34         default:
    34         default:
    35             Engine::log(WARN, "client.on_create_object") << "unknown msg_type=" << msg_type << " for obj=" << obj;
    35             Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj;
    36     }
    36     }
    37 }
    37 }
    38         
    38         
    39 void NetworkClient::on_server_hello (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    39 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacket &pkt) {
    40     // read the packet
    40     // read the packet
    41     Vector position = readVector(pkt);
    41     Vector position = pkt.read_vector();
    42     
    42     
    43     Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position;
    43     Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position;
    44 
    44 
    45     // create the LocalPlayer object
    45     // create the LocalPlayer object
    46     NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position);
    46     NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position);
    47 
    47 
    48     // inform state
    48     // inform state
    49     state.newLocalPlayer(player);
    49     state.newLocalPlayer(player);
    50 }
    50 }
    51         
    51         
    52 void NetworkClient::on_player_info (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    52 void NetworkClient::on_player_info (NetworkObject_Client *obj, NetworkPacket &pkt) {
    53     // read the packet
    53     // read the packet
    54     Vector position = readVector(pkt);
    54     Vector position = pkt.read_vector();
    55     
    55     
    56     Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position;
    56     Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position;
    57 
    57 
    58     // create the LocalPlayer object
    58     // create the LocalPlayer object
    59     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
    59     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
    61     // inform state
    61     // inform state
    62     state.newRemotePlayer(player);
    62     state.newRemotePlayer(player);
    63 
    63 
    64 }
    64 }
    65         
    65         
    66 void NetworkClient::on_player_join (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    66 void NetworkClient::on_player_join (NetworkObject_Client *obj, NetworkPacket &pkt) {
    67     // read the packet
    67     // read the packet
    68     Vector position = readVector(pkt);
    68     Vector position = pkt.read_vector();
    69     
    69     
    70     Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position;
    70     Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position;
    71     
    71     
    72     // create the RemotePlayer object
    72     // create the RemotePlayer object
    73     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
    73     NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);
    83     // delete
    83     // delete
    84     // XXX: leak because deleting the slot while it's being called breaks ClanLib
    84     // XXX: leak because deleting the slot while it's being called breaks ClanLib
    85     //  delete player;
    85     //  delete player;
    86 }
    86 }
    87 
    87 
    88 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) :
    88 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
    89     LocalPlayer(client.state, position, true), client(client), obj(obj) {
    89     LocalPlayer(client.state, position, true), client(client), obj(obj) {
    90     
    90     
    91     // receive messages
    91     // receive messages
    92     slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
    92     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
    93 }
    93 }
    94         
    94         
    95 void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) {
    95 void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) {
    96     // always send move, in all cases
    96     // always send move, in all cases
    97     CL_NetPacket pkt;
    97     NetworkPacket pkt;
    98     writeVector(pkt, force);
    98     pkt.write_vector(force);
    99     pkt.output.write_uint16(dt);
    99     pkt.write_uint16(dt);
   100 
   100 
   101     obj.send(NETMSG_CLIENT_MOVE, pkt, false);
   101     obj->send(NETMSG_CLIENT_MOVE, pkt, false);
   102     
   102     
   103     // do not handle locally
   103     // do not handle locally
   104 }
   104 }
   105         
   105         
   106 void NetworkClientLocalPlayer::on_position (CL_NetPacket &pkt) {
   106 void NetworkClientLocalPlayer::on_position (NetworkPacket &pkt) {
   107     Vector position = readVector(pkt);
   107     Vector position = pkt.read_vector();
   108     Vector velocity = readVector(pkt);
   108     Vector velocity = pkt.read_vector();
   109 
   109 
   110     Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
   110     Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity;
   111     
   111     
   112     // just update... 
   112     // just update... 
   113     updatePhysics(position, velocity);
   113     updatePhysics(position, velocity);
   114 }
   114 }
   115         
   115         
   116 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) :
   116 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
   117     RemotePlayer(client.state, position, true), client(client), obj(obj) {
   117     RemotePlayer(client.state, position, true), client(client), obj(obj) {
   118     
   118     
   119     // receive messages
   119     // receive messages
   120     slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
   120     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
   121     slots.connect(obj.sig_received_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
   121     slots.connect(obj->sig_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
   122 }
   122 }
   123 
   123 
   124 void NetworkClientRemotePlayer::on_position (CL_NetPacket &pkt) {
   124 void NetworkClientRemotePlayer::on_position (NetworkPacket &pkt) {
   125     Vector position = readVector(pkt);
   125     Vector position = pkt.read_vector();
   126     Vector velocity = readVector(pkt);
   126     Vector velocity = pkt.read_vector();
   127 
   127 
   128     Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
   128     Engine::log(INFO, "client_player.on_position") /* << "obj=" << obj */ << ", position=" << position << ", velocity=" << velocity;
   129     
   129     
   130     // just update... 
   130     // just update... 
   131     updatePhysics(position, velocity);
   131     updatePhysics(position, velocity);
   132 }
   132 }
   133 
   133 
   134 void NetworkClientRemotePlayer::on_quit (CL_NetPacket &pkt) {
   134 void NetworkClientRemotePlayer::on_quit (NetworkPacket &pkt) {
   135     // pkt is empty
   135     // pkt is empty
   136     (void) pkt;
   136     (void) pkt;
   137 
   137 
   138     Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
   138     Engine::log(INFO, "client_player.on_quit") /* << "obj=" << obj */;
   139 
   139 
   140     client.player_quit(this);
   140     client.player_quit(this);
   141 }
   141 }
       
   142