public static WorldChunk CreateWorldChunk(ChunkLocation l, BlockWorld w) { WorldChunk c = pool.Get(); c.SetUp(l, w); return(c); }
private void LoadChunks() { while (currentlyLoading.Count <= MaxLoadTasks && chunkLoadQueue.Count > 0) { ChunkLocation l = chunkLoadQueue.Dequeue(); if (GetDistanceSquared(l) > UnloadDistance * UnloadDistance) { continue; } currentlyLoading.Add(l); WorldChunk chunk = WorldChunk.CreateWorldChunk(l, this); Task.Run(() => { generator.FillChunk(chunk); loadedChunks.Enqueue(chunk); }); } while (!loadedChunks.IsEmpty) { loadedChunks.TryDequeue(out WorldChunk chunk); for (int d = 0; d < 6; d++) { chunk.SetNeighbor(d, GetChunk(chunk.Location.GetAdjecent(d))); } chunk.SetMeshUpdates(true); chunkMap.Add(chunk.Location, chunk); currentlyLoading.Remove(chunk.Location); } }
private void UpdateChunkQueues() { for (int x = -LoadDistance; x <= LoadDistance; x++) { for (int z = -LoadDistance; z <= LoadDistance; z++) { for (int y = 0; y < Height; y++) { ChunkLocation l = new ChunkLocation(centerX + x, y, centerZ + z); if (GetDistanceSquared(l) <= LoadDistance * LoadDistance && !currentlyLoading.Contains(l) && !chunkMap.ContainsKey(l)) { if (chunkLoadQueue.Contains(l)) { chunkLoadQueue.TryUpdatePriority(l, GetDistanceSquared(l, true)); } else { chunkLoadQueue.Enqueue(l, GetDistanceSquared(l, true)); } } } } } foreach (Chunk chunk in chunkMap.Values.Where(c => GetDistanceSquared(c.Location) > UnloadDistance * UnloadDistance)) { chunkUnloadStack.Push(chunk); } }
private void SetUp(ChunkLocation l, BlockWorld world) { location = l; this.world = world; renderedblocks = 0; meshready = false; for (int i = 0; i < blocks.Length; i++) { blocks[i] = Blocks.Air; } for (int i = 0; i < metadata.Length; i++) { metadata[i] = 0; } }
public Block GetBlock(int x, int y, int z) { ChunkLocation l = ChunkLocation.FromPos(x, y, z); return(GetChunk(l).GetBlockDirect(x - l.WX, y - l.WY, z - l.WZ)); }
private int GetDistanceSquared(ChunkLocation l, bool y = false) { return((l.X - centerX) * (l.X - centerX) + (l.Z - centerZ) * (l.Z - centerZ) + (y ? (l.Y - Height / 2) * (l.Y - Height / 2) : 0)); }
private Chunk GetChunk(ChunkLocation l) { return(chunkMap.TryGetValue(l, out Chunk c) ? c : BorderChunk.Instance); }
public bool SetBlock(int x, int y, int z, Block b, byte m) { ChunkLocation l = ChunkLocation.FromPos(x, y, z); return(GetChunk(l).SetBlockDirect(x - l.WX, y - l.WY, z - l.WZ, b, m)); }