private boolean makeChunkAvailable(final ReadyChunkInfo readyChunkInfo) { final Chunk chunk = chunkCache.get(readyChunkInfo.getPos()); if (chunk == null) { return false; } for (Vector3i pos : Region3i.createFromCenterExtents(readyChunkInfo.getPos(), 1)) { if (chunkCache.get(pos) == null) { return false; } } chunkFinalizer.beginFinalization(chunk, readyChunkInfo); return true; }
private void sendOnChunkGenerated(final ReadyChunkInfo readyChunkInfo) { worldEntity.send(new OnChunkGenerated(readyChunkInfo.getPos())); }
private OnChunkLoaded sendOnChunkLoaded(final ReadyChunkInfo readyChunkInfo) { return worldEntity.send(new OnChunkLoaded(readyChunkInfo.getPos())); }
private void makeChunksAvailable() { List<ReadyChunkInfo> newReadyChunks = Lists.newArrayListWithExpectedSize(readyChunks.size()); readyChunks.drainTo(newReadyChunks); for (ReadyChunkInfo readyChunkInfo : newReadyChunks) { chunkCache.put(readyChunkInfo.getPos(), readyChunkInfo.getChunk()); preparingChunks.remove(readyChunkInfo.getPos()); } updateRelevanceRegionsWithNewChunks(newReadyChunks); if (!newReadyChunks.isEmpty()) { sortedReadyChunks.addAll(newReadyChunks); Collections.sort(sortedReadyChunks, new ReadyChunkRelevanceComparator()); } if (!sortedReadyChunks.isEmpty()) { boolean loaded = false; for (int i = sortedReadyChunks.size() - 1; i >= 0 && !loaded; i--) { ReadyChunkInfo chunkInfo = sortedReadyChunks.get(i); PerformanceMonitor.startActivity("Make Chunk Available"); if (makeChunkAvailable(chunkInfo)) { sortedReadyChunks.remove(i); loaded = true; } PerformanceMonitor.endActivity(); } } }
private boolean unloadChunkInternal(Vector3i pos) { Chunk chunk = chunkCache.get(pos); if (!chunk.isReady()) { // Chunk hasn't been finished or changed, so just drop it. Iterator<ReadyChunkInfo> infoIterator = sortedReadyChunks.iterator(); while (infoIterator.hasNext()) { ReadyChunkInfo next = infoIterator.next(); if (next.getPos().equals(chunk.getPosition())) { infoIterator.remove(); break; } } return true; } worldEntity.send(new BeforeChunkUnload(pos)); for (ChunkRelevanceRegion region : regions.values()) { region.chunkUnloaded(pos); } storageManager.deactivateChunk(chunk); chunk.dispose(); try { unloadRequestTaskMaster.put(new ChunkUnloadRequest(chunk, this)); } catch (InterruptedException e) { logger.error("Failed to enqueue unload request for {}", chunk.getPosition(), e); } return true; }