示例#1
0
        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));
        }