summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt
diff options
context:
space:
mode:
authorDico Karssiens <dico.karssiens@gmail.com>2018-07-30 04:49:43 +0100
committerDico Karssiens <dico.karssiens@gmail.com>2018-07-30 04:49:43 +0100
commitdee994b992b1c6df15f6c24b49cd27c25e0657d6 (patch)
tree0cdc22b00b1823b13468864ce0fc7a30fd9d7f79 /src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt
parent33bb19a54779547726165fa47d20f222cbe1e0a6 (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.kt45
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 }
+ }
+ }
+
+}