diff options
author | Dico Karssiens <dico.karssiens@gmail.com> | 2018-07-30 04:49:43 +0100 |
---|---|---|
committer | Dico Karssiens <dico.karssiens@gmail.com> | 2018-07-30 04:49:43 +0100 |
commit | dee994b992b1c6df15f6c24b49cd27c25e0657d6 (patch) | |
tree | 0cdc22b00b1823b13468864ce0fc7a30fd9d7f79 /src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt | |
parent | 33bb19a54779547726165fa47d20f222cbe1e0a6 (diff) |
Add WorktimeLimiter API, basic /parcel clear functionality
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt index b48e4f1..1c01571 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt @@ -1,13 +1,52 @@ package io.dico.parcels2.blockvisitor +import io.dico.parcels2.util.Region import io.dico.parcels2.util.Vec3i +import io.dico.parcels2.util.get +import org.bukkit.World import org.bukkit.block.data.BlockData -class Schematic(val origin: Vec3i, val size: Vec3i) { - private var data: Array<BlockData>? = null +class Schematic { + val size: Vec3i get() = _size!! + private var _size: Vec3i? = null + set(value) { + field?.let { throw IllegalStateException() } + field = value + } + private var _data: Array<BlockData?>? = null + //private var extra: Map<Vec3i, (Block) -> Unit>? = null + private var isLoaded = false; private set + fun getLoadTask(world: World, region: Region): TimeLimitedTask = { + val size = region.size.also { _size = it } + val data = arrayOfNulls<BlockData>(region.blockCount).also { _data = it } + //val extra = mutableMapOf<Vec3i, (Block) -> Unit>().also { extra = it } + val blocks = RegionTraversal.XZY.regionTraverser(region) + for ((index, vec) in blocks.withIndex()) { + markSuspensionPoint() + val block = world[vec] + if (block.y > 255) continue + val blockData = block.blockData + data[index] = blockData + } + isLoaded = true + } -}
\ No newline at end of file + fun getPasteTask(world: World, position: Vec3i): TimeLimitedTask = { + if (!isLoaded) throw IllegalStateException() + val region = Region(position, _size!!) + val blocks = RegionTraversal.XZY.regionTraverser(region) + val data = _data!! + + for ((index, vec) in blocks.withIndex()) { + markSuspensionPoint() + val block = world[vec] + if (block.y > 255) continue + data[index]?.let { block.blockData = it } + } + } + +} |