src/Network/Server.cc
changeset 408 e6cfc44266af
parent 406 a2e35ca66c74
child 417 c503e0c6a740
equal deleted inserted replaced
407:443f6f7abcfb 408:e6cfc44266af
    18 
    18 
    19     Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr;
    19     Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr;
    20 }
    20 }
    21 
    21 
    22 void NetworkServer::on_node_connected (NetworkNode *node) {
    22 void NetworkServer::on_node_connected (NetworkNode *node) {
       
    23     // send the terrain data
       
    24     send_terrain_data(node);
       
    25 
    23     // create the player object (it logs it)
    26     // create the player object (it logs it)
    24     NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
    27     NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
    25 
    28 
    26     // add to players
    29     // add to players
    27     players.push_back(player);
    30     players.push_back(player);
    28 }
    31 
    29         
    32 }
       
    33  
       
    34 void NetworkServer::send_terrain_data (NetworkNode *node) {
       
    35     Terrain &terrain = state.world.terrain;
       
    36     
       
    37     // dimensions?
       
    38     PixelCoordinate map = terrain.getDimensions();
       
    39 
       
    40     // translate to a byte array
       
    41     size_t terrain_size = map.x * map.y;
       
    42     
       
    43     // get terrain buffer
       
    44     const uint8_t *terrain_buf = terrain.getTerrainBuffer();
       
    45 
       
    46     // allocate our packet...
       
    47     BigNetworkPacket pkt (
       
    48         // NetworkChannel header
       
    49         NETWORK_SESSION_HEADER_SIZE     
       
    50 
       
    51         // our own header
       
    52         + 2 * sizeof(uint32_t)          
       
    53 
       
    54         // compressed terrain buffer
       
    55         + NetworkPacketOutput::write_compressed_size(terrain_size)
       
    56     );
       
    57     
       
    58     // write netsession header
       
    59     node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
       
    60 
       
    61     // write terrain dimensions
       
    62     pkt.write_uint32(map.x);
       
    63     pkt.write_uint32(map.y);
       
    64 
       
    65     // write compressed terrain data
       
    66     pkt.write_compressed(terrain_buf, terrain_size);
       
    67 
       
    68     // send
       
    69     node->send_raw(pkt, true);
       
    70 }
       
    71 
       
    72        
    30 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) {
    73 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) {
    31     // remove from list
    74     // remove from list
    32     players.remove(player);
    75     players.remove(player);
    33 }
    76 }
    34 
    77 
    78 
   121 
    79     // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate?
   122     // XXX: send projectiles? Or let the client handle the events that the unknown projectiles generate?
    80 
   123 
    81     // broadcast NETMSG_PLAYER_JOIN to all clients except current
   124     // broadcast NETMSG_PLAYER_JOIN to all clients except current
    82     this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
   125     this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
    83 
       
    84     // send terrain data...
       
    85     send_terrain_data();
       
    86 }
   126 }
    87 
   127 
    88 void NetworkServerPlayer::handleDig (Vector position, float radius) {
   128 void NetworkServerPlayer::handleDig (Vector position, float radius) {
    89     NetworkPacket pkt;
   129     NetworkPacket pkt;
    90 
   130 
   230 
   270 
   231     // send position update
   271     // send position update
   232     send_position_update();
   272     send_position_update();
   233 }
   273 }
   234         
   274         
   235 void NetworkServerPlayer::send_terrain_data (void) {
       
   236     Terrain &terrain = server.state.world;
       
   237     
       
   238     // dimensions?
       
   239     PixelCoordinate map = terrain.getDimensions();
       
   240 
       
   241     // translate to a byte array
       
   242     size_t terrain_size = map.x * map.y;
       
   243     
       
   244     // get terrain buffer
       
   245     const uint8_t *terrain_buf = terrain.getTerrainBuffer();
       
   246 
       
   247     // allocate our packet...
       
   248     BigNetworkPacket pkt (
       
   249         // NetworkChannel header
       
   250         NETWORK_SESSION_HEADER_SIZE     
       
   251 
       
   252         // our own header
       
   253         + 2 * sizeof(uint32_t)          
       
   254 
       
   255         // compressed terrain buffer
       
   256         + NetworkPacketOutput::write_compressed_size(terrain_size)
       
   257     );
       
   258     
       
   259     // write netsession header
       
   260     node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
       
   261 
       
   262     // write terrain dimensions
       
   263     pkt.write_uint32(map.x);
       
   264     pkt.write_uint32(map.y);
       
   265 
       
   266     // write compressed terrain data
       
   267     pkt.write_compressed(terrain_buf, terrain_size);
       
   268 
       
   269     // send
       
   270     node->send_raw(pkt, true);
       
   271 }
       
   272 
       
   273 void NetworkServerPlayer::send_position_update (void) {
   275 void NetworkServerPlayer::send_position_update (void) {
   274     NetworkPacket pkt;
   276     NetworkPacket pkt;
   275     
   277     
   276     int flags = 
   278     int flags = 
   277         (inAir ? NETWORK_PHYSICS_INAIR : 0) | 
   279         (inAir ? NETWORK_PHYSICS_INAIR : 0) |