Esempio n. 1
0
        public int MakeAirChunksAroundWorldToCompensateForBadRendering()
        {
            int       createdChunks = 0;
            Stopwatch sw            = new Stopwatch();

            sw.Start();

            foreach (KeyValuePair <ChunkCoordinates, ChunkColumn> valuePair in _chunkCache)
            {
                ChunkCoordinates chunkCoordinates = valuePair.Key;
                ChunkColumn      chunkColumn      = valuePair.Value;

                if (chunkColumn != null && !chunkColumn.isAllAir)
                {
                    for (int startX = chunkCoordinates.X - 1; startX <= chunkCoordinates.X + 1; startX++)
                    {
                        for (int startZ = chunkCoordinates.Z - 1; startZ <= chunkCoordinates.Z + 1; startZ++)
                        {
                            ChunkCoordinates surroundingChunkCoordinates = new ChunkCoordinates(startX, startZ);

                            if (surroundingChunkCoordinates.Equals(chunkCoordinates))
                            {
                                continue;
                            }

                            ChunkColumn surroundingChunkColumn;

                            _chunkCache.TryGetValue(surroundingChunkCoordinates, out surroundingChunkColumn);

                            if (surroundingChunkColumn == null)
                            {
                                ChunkColumn airColumn = new ChunkColumn
                                {
                                    x        = startX,
                                    z        = startZ,
                                    isAllAir = true
                                };

                                airColumn.GetBatch();

                                _chunkCache[surroundingChunkCoordinates] = airColumn;
                                createdChunks++;
                            }
                        }
                    }
                }
            }

            sw.Stop();
            Log.Info("Created " + createdChunks + " air chunks in " + sw.ElapsedMilliseconds + "ms");
            return(createdChunks);
        }
Esempio n. 2
0
        public McpeBatch GenerateChunk(ChunkCoordinates chunkPosition)
        {
            if (_worldProvider == null)
            {
                return(null);
            }

            ChunkColumn chunkColumn = _worldProvider.GenerateChunkColumn(chunkPosition);

            if (chunkColumn == null)
            {
                return(null);
            }

            McpeBatch chunk = chunkColumn.GetBatch();

            if (chunk == null)
            {
                return(null);
            }

            return(chunk);
        }
Esempio n. 3
0
        public ChunkColumn GenerateChunkColumn(ChunkCoordinates chunkCoordinates)
        {
            lock (_chunkCache)
            {
                ChunkColumn cachedChunk;
                if (_chunkCache.TryGetValue(chunkCoordinates, out cachedChunk))
                {
                    return(cachedChunk);
                }

                ChunkColumn chunk = new ChunkColumn();
                chunk.x = chunkCoordinates.X;
                chunk.z = chunkCoordinates.Z;
                //chunk.biomeId = ArrayOf<byte>.Create(256, (byte) rand.Next(0, 37));

                int h = PopulateChunk(chunk);

                //BuildStructures(chunk);


                //chunk.SetBlock(0, h + 1, 0, 7);
                //chunk.SetBlock(1, h + 1, 0, 41);
                //chunk.SetBlock(2, h + 1, 0, 41);
                //chunk.SetBlock(3, h + 1, 0, 41);
                //chunk.SetBlock(3, h + 1, 0, 41);

                ////chunk.SetBlock(6, h + 1, 6, 57);

                //chunk.SetBlock(9, h, 3, 31);
                //chunk.SetBiome(9, 3, 30);
                //chunk.SetBlock(0, h, 1, 161);
                //chunk.SetBlock(0, h, 2, 18);

                //chunk.SetBlock(0, h, 15, 31);
                //chunk.SetBlock(0, h, 14, 161);
                //chunk.SetBlock(5, h, 13, 18);
                //chunk.SetBiome(5, 13, 30);

                //chunk.SetBlock(6, h, 9, 63);
                //chunk.SetMetadata(6, h, 9, 12);
                //var blockEntity = GetBlockEntity((chunkCoordinates.X*16) + 6, h, (chunkCoordinates.Z*16) + 9);
                //chunk.SetBlockEntity(blockEntity.Coordinates, blockEntity.GetCompound());

                //if (chunkCoordinates.X == 1 && chunkCoordinates.Z == 1)
                //{
                //	for (int x = 0; x < 10; x++)
                //	{
                //		for (int z = 0; z < 10; z++)
                //		{
                //			for (int y = h - 2; y < h; y++)
                //			{
                //				chunk.SetBlock(x, y, z, 8);
                //			}
                //		}
                //	}
                //}

                //if (chunkCoordinates.X == 3 && chunkCoordinates.Z == 1)
                //{
                //	for (int x = 0; x < 10; x++)
                //	{
                //		for (int z = 0; z < 10; z++)
                //		{
                //			for (int y = h - 1; y < h; y++)
                //			{
                //				chunk.SetBlock(x, y, z, 10);
                //			}
                //		}
                //	}
                //}

                //for (int x = 0; x < 16; x++)
                //{
                //	for (int z = 0; z < 16; z++)
                //	{
                //		for (int y = 15; y > 0; y--)
                //		{
                //			if (chunk.GetBlock(x, y, z) == 0x00)
                //			{
                //				//chunk.SetSkylight(x, y, z, 0xff);
                //			}
                //			else
                //			{
                //				//chunk.SetSkylight(x, y, z, 0x00);
                //			}
                //		}
                //	}
                //}

                chunk.RecalcHeight();

                _spawnPoint.Y = h + 2;

                // Cache
                chunk.GetBatch();
                _chunkCache[chunkCoordinates] = chunk;

                return(chunk);
            }
        }
Esempio n. 4
0
        public IEnumerable <McpeBatch> GenerateChunks(ChunkCoordinates chunkPosition, Dictionary <Tuple <int, int>, McpeBatch> chunksUsed, double radius)
        {
            lock (chunksUsed)
            {
                Dictionary <Tuple <int, int>, double> newOrders = new Dictionary <Tuple <int, int>, double>();

                double radiusSquared = Math.Pow(radius, 2);

                int centerX = chunkPosition.X;
                int centerZ = chunkPosition.Z;

                for (double x = -radius; x <= radius; ++x)
                {
                    for (double z = -radius; z <= radius; ++z)
                    {
                        var distance = (x * x) + (z * z);
                        if (distance > radiusSquared)
                        {
                            //continue;
                        }
                        int chunkX             = (int)(x + centerX);
                        int chunkZ             = (int)(z + centerZ);
                        Tuple <int, int> index = new Tuple <int, int>(chunkX, chunkZ);
                        newOrders[index] = distance;
                    }
                }

                //if (newOrders.Count > viewArea)
                //{
                //	foreach (var pair in newOrders.OrderByDescending(pair => pair.Value))
                //	{
                //		if (newOrders.Count <= viewArea) break;
                //		newOrders.Remove(pair.Key);
                //	}
                //}

                foreach (var chunkKey in chunksUsed.Keys.ToArray())
                {
                    if (!newOrders.ContainsKey(chunkKey))
                    {
                        chunksUsed.Remove(chunkKey);
                    }
                }

                foreach (var pair in newOrders.OrderBy(pair => pair.Value))
                {
                    if (chunksUsed.ContainsKey(pair.Key))
                    {
                        continue;
                    }

                    if (_worldProvider == null)
                    {
                        continue;
                    }

                    ChunkColumn chunkColumn = _worldProvider.GenerateChunkColumn(new ChunkCoordinates(pair.Key.Item1, pair.Key.Item2));
                    McpeBatch   chunk       = null;
                    if (chunkColumn != null)
                    {
                        chunk = chunkColumn.GetBatch();
                    }

                    chunksUsed.Add(pair.Key, chunk);

                    yield return(chunk);
                }
            }
        }
Esempio n. 5
0
File: Level.cs Progetto: Eros/MiNET
        public IEnumerable <McpeBatch> GenerateChunks(ChunkCoordinates chunkPosition, Dictionary <Tuple <int, int>, McpeBatch> chunksUsed)
        {
            lock (chunksUsed)
            {
                Dictionary <Tuple <int, int>, double> newOrders = new Dictionary <Tuple <int, int>, double>();
                // ViewDistance is actually ViewArea
                // A = pi r^2
                // sqrt(A/pi) = r
                double radiusSquared = ViewDistance / Math.PI;
                double radius        = Math.Ceiling(Math.Sqrt(radiusSquared));
                int    centerX       = chunkPosition.X;
                int    centerZ       = chunkPosition.Z;

                for (double x = -radius; x <= radius; ++x)
                {
                    for (double z = -radius; z <= radius; ++z)
                    {
                        var distance = (x * x) + (z * z);
                        if (distance > radiusSquared)
                        {
                            continue;
                        }
                        int chunkX             = (int)(x + centerX);
                        int chunkZ             = (int)(z + centerZ);
                        Tuple <int, int> index = new Tuple <int, int>(chunkX, chunkZ);
                        newOrders[index] = distance;
                    }
                }

                if (newOrders.Count > ViewDistance)
                {
                    foreach (var pair in newOrders.OrderByDescending(pair => pair.Value))
                    {
                        if (newOrders.Count <= ViewDistance)
                        {
                            break;
                        }
                        newOrders.Remove(pair.Key);
                    }
                }

                foreach (var chunkKey in chunksUsed.Keys.ToArray())
                {
                    if (!newOrders.ContainsKey(chunkKey))
                    {
                        chunksUsed.Remove(chunkKey);
                    }
                }

                foreach (var pair in newOrders.OrderBy(pair => pair.Value))
                {
                    if (chunksUsed.ContainsKey(pair.Key))
                    {
                        continue;
                    }

                    if (_worldProvider == null)
                    {
                        continue;
                    }

                    ChunkColumn chunkColumn = _worldProvider.GenerateChunkColumn(new ChunkCoordinates(pair.Key.Item1, pair.Key.Item2));
                    McpeBatch   chunk       = null;
                    if (chunkColumn != null)
                    {
                        chunk = chunkColumn.GetBatch();
                    }

                    chunksUsed.Add(pair.Key, chunk);

                    yield return(chunk);
                }

                if (chunksUsed.Count > ViewDistance)
                {
                    Debug.WriteLine("Too many chunks used: {0}", chunksUsed.Count);
                }
            }
        }
Esempio n. 6
0
        public ChunkColumn GenerateChunkColumn(ChunkCoordinates chunkCoordinates)
        {
            lock (_chunkCache)
            {
                ChunkColumn cachedChunk;
                if (_chunkCache.TryGetValue(chunkCoordinates, out cachedChunk))
                {
                    return(cachedChunk);
                }

                ChunkColumn chunk = new ChunkColumn();
                chunk.x = chunkCoordinates.X;
                chunk.z = chunkCoordinates.Z;

                int h = PopulateChunk(chunk);

                chunk.SetBlock(0, h + 1, 0, 7);
                chunk.SetBlock(1, h + 1, 0, 41);
                chunk.SetBlock(2, h + 1, 0, 41);
                chunk.SetBlock(3, h + 1, 0, 41);
                chunk.SetBlock(3, h + 1, 0, 41);

                //chunk.SetBlock(6, h + 1, 6, 57);

                chunk.SetBlock(6, h, 9, 63);
                chunk.SetMetadata(6, h, 9, 12);
                var blockEntity = GetBlockEntity((chunkCoordinates.X * 16) + 6, h, (chunkCoordinates.Z * 16) + 9);
                chunk.SetBlockEntity(blockEntity.Coordinates, blockEntity.GetCompound());

                if (chunkCoordinates.X == 1 && chunkCoordinates.Z == 1)
                {
                    for (int x = 0; x < 10; x++)
                    {
                        for (int z = 0; z < 10; z++)
                        {
                            for (int y = h - 2; y < h; y++)
                            {
                                chunk.SetBlock(x, y, z, 8);
                            }
                        }
                    }
                }

                if (chunkCoordinates.X == 3 && chunkCoordinates.Z == 1)
                {
                    for (int x = 0; x < 10; x++)
                    {
                        for (int z = 0; z < 10; z++)
                        {
                            for (int y = h - 1; y < h; y++)
                            {
                                chunk.SetBlock(x, y, z, 10);
                            }
                        }
                    }
                }

                for (int x = 0; x < 16; x++)
                {
                    for (int z = 0; z < 16; z++)
                    {
                        for (int y = 127; y != 0; y--)
                        {
                            if (chunk.GetBlock(x, y, z) == 0x00)
                            {
                                chunk.SetSkylight(x, y, z, 0xff);
                            }
                            else
                            {
                                chunk.SetSkylight(x, y, z, 0x00);
                            }
                        }
                    }
                }

                // Cache
                chunk.GetBatch();
                _chunkCache[chunkCoordinates] = chunk;

                return(chunk);
            }
        }