Kind of un-race-conditioned chunk saving
This commit is contained in:
parent
2e5214ef12
commit
6ffa54fb27
@ -111,7 +111,14 @@ sealed class LegacyWorldStorage() : WorldStorage() {
|
||||
}, Starbound.EXECUTOR)
|
||||
}
|
||||
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
|
||||
if (now) {
|
||||
val chunkX = pos.x
|
||||
val chunkY = pos.y
|
||||
val key = ByteKey(2, (chunkX shr 8).toByte(), chunkX.toByte(), (chunkY shr 8).toByte(), chunkY.toByte())
|
||||
|
||||
write(key, writeEntities(data))
|
||||
} else {
|
||||
Starbound.EXECUTOR.execute {
|
||||
val chunkX = pos.x
|
||||
val chunkY = pos.y
|
||||
@ -119,12 +126,12 @@ sealed class LegacyWorldStorage() : WorldStorage() {
|
||||
|
||||
write(key, writeEntities(data))
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
|
||||
Starbound.EXECUTOR.execute {
|
||||
private fun saveCells0(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState) {
|
||||
val buff = FastByteArrayOutputStream()
|
||||
val stream = DataOutputStream(BufferedOutputStream(DeflaterOutputStream(buff)))
|
||||
|
||||
@ -154,6 +161,15 @@ sealed class LegacyWorldStorage() : WorldStorage() {
|
||||
write(key, buff.array.copyOf(buff.length))
|
||||
}
|
||||
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
|
||||
if (now) {
|
||||
saveCells0(pos, data, state)
|
||||
} else {
|
||||
Starbound.EXECUTOR.execute {
|
||||
saveCells0(pos, data, state)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -23,12 +23,12 @@ class NativeWorldStorage() : WorldStorage() {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
|
||||
return super.saveEntities(pos, data)
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
|
||||
return super.saveEntities(pos, data, now)
|
||||
}
|
||||
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
|
||||
return super.saveCells(pos, data, state)
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
|
||||
return super.saveCells(pos, data, state, now)
|
||||
}
|
||||
|
||||
override fun saveMetadata(data: Metadata): Boolean {
|
||||
|
@ -546,7 +546,7 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
|
||||
}
|
||||
}
|
||||
|
||||
private fun writeToStorage(): Collection<AbstractEntity> {
|
||||
private fun writeToStorage(now: Boolean = false): Collection<AbstractEntity> {
|
||||
if (!cells.isInitialized() || state <= ChunkState.EMPTY)
|
||||
return emptyList()
|
||||
|
||||
@ -555,8 +555,8 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
|
||||
aabbd,
|
||||
filter = Predicate { it.isPersistent && !it.isRemote && aabbd.isInside(it.position) })
|
||||
|
||||
world.storage.saveCells(pos, copyCells(), state)
|
||||
world.storage.saveEntities(pos, unloadable)
|
||||
world.storage.saveCells(pos, copyCells(), state, now)
|
||||
world.storage.saveEntities(pos, unloadable, now)
|
||||
|
||||
return unloadable
|
||||
}
|
||||
@ -580,7 +580,7 @@ class ServerChunk(world: ServerWorld, pos: ChunkPos) : Chunk<ServerWorld, Server
|
||||
world.chunkMap.remove(pos)
|
||||
flushTask.cancel(false)
|
||||
|
||||
writeToStorage().forEach {
|
||||
writeToStorage(true).forEach {
|
||||
it.remove(AbstractEntity.RemovalReason.UNLOADED)
|
||||
}
|
||||
}
|
||||
|
@ -79,11 +79,11 @@ abstract class WorldStorage : Closeable {
|
||||
return buff.array.copyOf(buff.length)
|
||||
}
|
||||
|
||||
open fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
|
||||
open fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean = false): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
open fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
|
||||
open fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean = false): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
@ -148,12 +148,12 @@ abstract class WorldStorage : Closeable {
|
||||
return chainOptionalFutures(children) { it.loadMetadata() }
|
||||
}
|
||||
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>): Boolean {
|
||||
return children.any { it.saveEntities(pos, data) }
|
||||
override fun saveEntities(pos: ChunkPos, data: Collection<AbstractEntity>, now: Boolean): Boolean {
|
||||
return children.any { it.saveEntities(pos, data, now) }
|
||||
}
|
||||
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState): Boolean {
|
||||
return children.any { it.saveCells(pos, data, state) }
|
||||
override fun saveCells(pos: ChunkPos, data: Object2DArray<out AbstractCell>, state: ChunkState, now: Boolean): Boolean {
|
||||
return children.any { it.saveCells(pos, data, state, now) }
|
||||
}
|
||||
|
||||
override fun saveMetadata(data: Metadata): Boolean {
|
||||
|
Loading…
Reference in New Issue
Block a user