public void SendLevel(Level prev, Level level) { int volume = level.blocks.Length; if (player.Supports(CpeExt.FastMap)) { Send(Packet.LevelInitaliseExt(volume)); } else { Send(Packet.LevelInitalise()); } if (player.hasBlockDefs) { if (prev != null && prev != level) { RemoveOldLevelCustomBlocks(prev); } BlockDefinition.SendLevelCustomBlocks(player); if (player.Supports(CpeExt.InventoryOrder)) { BlockDefinition.SendLevelInventoryOrder(player); } } using (LevelChunkStream dst = new LevelChunkStream(player)) using (Stream stream = LevelChunkStream.CompressMapHeader(player, volume, dst)) { if (level.MightHaveCustomBlocks()) { LevelChunkStream.CompressMap(player, stream, dst); } else { LevelChunkStream.CompressMapSimple(player, stream, dst); } } // Force players to read the MOTD (clamped to 3 seconds at most) if (level.Config.LoadDelay > 0) { Thread.Sleep(level.Config.LoadDelay); } Send(Packet.LevelFinalise(level.Width, level.Height, level.Length)); }