src/Network/Server.cc
changeset 408 e6cfc44266af
parent 406 a2e35ca66c74
child 417 c503e0c6a740
--- a/src/Network/Server.cc	Tue Jan 20 23:24:04 2009 +0200
+++ b/src/Network/Server.cc	Tue Jan 20 23:30:18 2009 +0200
@@ -20,13 +20,56 @@
 }
 
 void NetworkServer::on_node_connected (NetworkNode *node) {
+    // send the terrain data
+    send_terrain_data(node);
+
     // create the player object (it logs it)
     NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
 
     // add to players
     players.push_back(player);
+
 }
-        
+ 
+void NetworkServer::send_terrain_data (NetworkNode *node) {
+    Terrain &terrain = state.world.terrain;
+    
+    // dimensions?
+    PixelCoordinate map = terrain.getDimensions();
+
+    // translate to a byte array
+    size_t terrain_size = map.x * map.y;
+    
+    // get terrain buffer
+    const uint8_t *terrain_buf = terrain.getTerrainBuffer();
+
+    // allocate our packet...
+    BigNetworkPacket pkt (
+        // NetworkChannel header
+        NETWORK_SESSION_HEADER_SIZE     
+
+        // our own header
+        + 2 * sizeof(uint32_t)          
+
+        // compressed terrain buffer
+        + NetworkPacketOutput::write_compressed_size(terrain_size)
+    );
+    
+    // write netsession header
+    node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
+
+    // write terrain dimensions
+    pkt.write_uint32(map.x);
+    pkt.write_uint32(map.y);
+
+    // write compressed terrain data
+    pkt.write_compressed(terrain_buf, terrain_size);
+
+    // send
+    node->send_raw(pkt, true);
+}
+
+       
 void NetworkServer::handle_disconnect (NetworkServerPlayer *player) {
     // remove from list
     players.remove(player);
@@ -80,9 +123,6 @@
 
     // broadcast NETMSG_PLAYER_JOIN to all clients except current
     this->send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
-
-    // send terrain data...
-    send_terrain_data();
 }
 
 void NetworkServerPlayer::handleDig (Vector position, float radius) {
@@ -232,44 +272,6 @@
     send_position_update();
 }
         
-void NetworkServerPlayer::send_terrain_data (void) {
-    Terrain &terrain = server.state.world;
-    
-    // dimensions?
-    PixelCoordinate map = terrain.getDimensions();
-
-    // translate to a byte array
-    size_t terrain_size = map.x * map.y;
-    
-    // get terrain buffer
-    const uint8_t *terrain_buf = terrain.getTerrainBuffer();
-
-    // allocate our packet...
-    BigNetworkPacket pkt (
-        // NetworkChannel header
-        NETWORK_SESSION_HEADER_SIZE     
-
-        // our own header
-        + 2 * sizeof(uint32_t)          
-
-        // compressed terrain buffer
-        + NetworkPacketOutput::write_compressed_size(terrain_size)
-    );
-    
-    // write netsession header
-    node->write_packet_header(pkt, NETCHAN_TERRAIN_ARRAY);
-
-    // write terrain dimensions
-    pkt.write_uint32(map.x);
-    pkt.write_uint32(map.y);
-
-    // write compressed terrain data
-    pkt.write_compressed(terrain_buf, terrain_size);
-
-    // send
-    node->send_raw(pkt, true);
-}
-
 void NetworkServerPlayer::send_position_update (void) {
     NetworkPacket pkt;