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