/** * @param unsavedEntities currently loaded persistent entities without owner that have not been saved yet. * This method removes entities it saves. */ private void prepareCompressedChunkBuilders(Set<EntityRef> unsavedEntities) { Map<Vector3i, Collection<EntityRef>> chunkPosToEntitiesMap = createChunkPosToUnsavedOwnerLessEntitiesMap(); allChunks = Maps.newHashMap(); allChunks.putAll(unloadedChunks); for (Map.Entry<Vector3i, ChunkImpl> chunkEntry : loadedChunks.entrySet()) { Collection<EntityRef> entitiesToStore = chunkPosToEntitiesMap.get(chunkEntry.getKey()); if (entitiesToStore == null) { entitiesToStore = Collections.emptySet(); } ChunkImpl chunk = chunkEntry.getValue(); unsavedEntities.removeAll(entitiesToStore); CompressedChunkBuilder compressedChunkBuilder = new CompressedChunkBuilder(privateEntityManager, chunk, entitiesToStore, false); unsavedEntities.removeAll(compressedChunkBuilder.getStoredEntities()); allChunks.put(chunkEntry.getKey(), compressedChunkBuilder); } }
@Override protected byte[] loadCompressedChunk(Vector3i chunkPos) { CompressedChunkBuilder disposedUnsavedChunk = unloadedAndUnsavedChunkMap.get(chunkPos); if (disposedUnsavedChunk != null) { return disposedUnsavedChunk.buildEncodedChunk(); } CompressedChunkBuilder disposedSavingChunk = unloadedAndSavingChunkMap.get(chunkPos); if (disposedSavingChunk != null) { return disposedSavingChunk.buildEncodedChunk(); } worldDirectoryReadLock.lock(); try { return super.loadCompressedChunk(chunkPos); } finally { worldDirectoryReadLock.unlock(); } }
@Override public void deactivateChunk(Chunk chunk) { Collection<EntityRef> entitiesOfChunk = getEntitiesOfChunk(chunk); ChunkImpl chunkImpl = (ChunkImpl) chunk; // storage manager only works with ChunkImpl unloadedAndUnsavedChunkMap.put(chunk.getPosition(), new CompressedChunkBuilder(getEntityManager(), chunkImpl, entitiesOfChunk, true)); entitiesOfChunk.forEach(this::deactivateOrDestroyEntityRecursive); }
public synchronized byte[] buildEncodedChunk() { if (result == null) { EntityData.ChunkStore.Builder encoded; if (viaSnapshot) { encoded = chunk.encodeAndReleaseSnapshot(); } else { encoded = chunk.encode(); } encoded.setStore(entityStore); EntityData.ChunkStore store = encoded.build(); result = compressChunkStore(store); } return result; }
byte[] compressedChunk = compressedChunkBuilder.buildEncodedChunk(); try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(chunkPath))) { bos.write(compressedChunk); Vector3i chunkPos = entry.getKey(); CompressedChunkBuilder compressedChunkBuilder = entry.getValue(); byte[] compressedChunk = compressedChunkBuilder.buildEncodedChunk(); Path chunkPath = storagePathProvider.getChunkTempPath(chunkPos); try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(chunkPath))) {