--- 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;