src/Network/Client.cc
changeset 223 2fcaf54ed37b
parent 221 fbc5db6fce45
child 224 e6faefba2ec1
equal deleted inserted replaced
222:293ddf4c067d 223:2fcaf54ed37b
     9 
     9 
    10 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : 
    10 NetworkClient::NetworkClient (GameState &state, const NetworkAddress &connect_to) : 
    11     state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) {
    11     state(state), netsession(NETWORK_MAGIC_ID), server(netsession.connect(connect_to)), netobjs(netsession, NETCHAN_CORE, server) {
    12     
    12     
    13     // connect slots
    13     // connect slots
    14     slots.connect(netobjs.sig_create(), this, &NetworkClient::on_create);
    14     slots.connect(netobjs.sig_create(NETMSG_SERVER_HELLO), this, &NetworkClient::on_server_hello);
       
    15     slots.connect(netobjs.sig_create(NETMSG_PLAYER_INFO), this, &NetworkClient::on_player_info);
       
    16     slots.connect(netobjs.sig_create(NETMSG_PLAYER_JOIN), this, &NetworkClient::on_player_join);
       
    17     slots.connect(netobjs.sig_create(NETMSG_PROJECTILE_CREATE), this, &NetworkClient::on_projectile_create);
       
    18 
    15     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array);
    19     slots.connect(netsession.sig_chan_message(NETCHAN_TERRAIN_ARRAY), this, &NetworkClient::on_terrain_array);
    16 
    20 
    17     // XXX: sig_disconnected
    21     // XXX: sig_disconnected
    18 }
       
    19 
       
    20 void NetworkClient::on_create (NetworkObject_Client *obj, NetworkMessageID msg_id, NetworkPacketInput &pkt) {
       
    21     switch (msg_id) {
       
    22         case NETMSG_SERVER_HELLO:
       
    23             on_server_hello(obj, pkt);
       
    24 
       
    25             break;
       
    26         
       
    27         case NETMSG_PLAYER_INFO:
       
    28             on_player_info(obj, pkt);
       
    29 
       
    30             break;
       
    31         
       
    32         case NETMSG_PLAYER_JOIN:
       
    33             on_player_join(obj, pkt);
       
    34 
       
    35             break;
       
    36 
       
    37         default:
       
    38             Engine::log(WARN, "client.on_create_object") << "unknown msg_id=" << msg_id << " for obj=" << obj;
       
    39     }
       
    40 }
    22 }
    41         
    23         
    42 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacketInput &pkt) {
    24 void NetworkClient::on_server_hello (NetworkObject_Client *obj, NetworkPacketInput &pkt) {
    43     // read the packet
    25     // read the packet
    44     Vector position = pkt.read_vector();
    26     Vector position = pkt.read_vector();
    77 
    59 
    78     // inform state
    60     // inform state
    79     state.newPlayer(player);
    61     state.newPlayer(player);
    80 }
    62 }
    81         
    63         
       
    64 void NetworkClient::on_projectile_create (NetworkObject_Client *obj, NetworkPacketInput &pkt) {
       
    65     // read the packet
       
    66     Vector position = pkt.read_vector();
       
    67     Vector velocity = pkt.read_vector();
       
    68     float explosionRadius = pkt.read_float32();
       
    69 
       
    70     Engine::log(INFO, "client.on_projectile_create") << "obj=" << obj << ", pos=" << position << ", velocity=" << velocity;
       
    71 
       
    72     // create the NetworkClientPorjectile object
       
    73     new NetworkClientProjectile(*this, obj, position, velocity, explosionRadius);
       
    74 }
       
    75         
    82 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
    76 void NetworkClient::on_terrain_array (NetworkPacketInput &pkt, NetworkNode *node) {
    83     // ignore if not from server
    77     // ignore if not from server
    84     if (node != server)
    78     if (node != server)
    85         return;
    79         return;
    86 
    80 
   108     // delete
   102     // delete
   109     // XXX: leak because deleting the slot while it's being called breaks ClanLib
   103     // XXX: leak because deleting the slot while it's being called breaks ClanLib
   110     //  delete player;
   104     //  delete player;
   111 }
   105 }
   112 
   106 
       
   107 /*
       
   108  * NetworkClientObjectHelper
       
   109  */
       
   110 NetworkClientObjectHelper::NetworkClientObjectHelper (NetworkClient &client, NetworkObject_Client *obj) :
       
   111     client(client), obj(obj)
       
   112 {
       
   113 
       
   114 }
       
   115 
       
   116 /*
       
   117  * NetworkClientPlayerHelper
       
   118  */
   113 NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) :
   119 NetworkClientPlayerHelper::NetworkClientPlayerHelper (NetworkClient &client, Vector position, NetworkObject_Client *obj) :
   114     Player(client.state, position, true), client(client), obj(obj) {
   120     NetworkClientObjectHelper(client, obj), Player(client.state, position, true) 
   115 
   121 {
   116     // receive position updates
   122     // receive position updates
   117     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position);
   123     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientPlayerHelper::on_position);
   118     slots.connect(obj->sig_message(NETMSG_PLAYER_DIG), this, &NetworkClientPlayerHelper::on_dig);
   124     slots.connect(obj->sig_message(NETMSG_PLAYER_DIG), this, &NetworkClientPlayerHelper::on_dig);
   119 }
   125 }
   120 
   126 
   148 void NetworkClientLocalPlayer::handleInput (PlayerInput input) {
   154 void NetworkClientLocalPlayer::handleInput (PlayerInput input) {
   149     // always send move, in all cases
   155     // always send move, in all cases
   150     NetworkPacket pkt;
   156     NetworkPacket pkt;
   151     pkt.write_uint16(input);
   157     pkt.write_uint16(input);
   152 
   158 
   153     obj->send(NETMSG_CLIENT_MOVE, pkt, false);
   159     obj->send(NETMSG_CLIENT_INPUT, pkt, false);
   154     
   160     
   155     // do not handle locally
   161     // do not handle locally
   156 }
   162 }
   157         
   163         
   158 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
   164 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position) :
   169     Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
   175     Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
   170 
   176 
   171     client.player_quit(this);
   177     client.player_quit(this);
   172 }
   178 }
   173 
   179 
       
   180 NetworkClientProjectile::NetworkClientProjectile (NetworkClient &client, NetworkObject_Client *obj, Vector position,
       
   181         Vector velocity, float explosionRadius) :
       
   182     NetworkClientObjectHelper(client, obj), Projectile(client.state, position, velocity, true, explosionRadius)
       
   183 {
       
   184     // XXX: register messages
       
   185 }
   174 
   186