diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt index 7e109c8..8d2084b 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/Schematic.kt @@ -3,9 +3,13 @@ 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.Bukkit +import org.bukkit.Material import org.bukkit.World import org.bukkit.block.data.BlockData +private val air = Bukkit.createBlockData(Material.AIR) + // TODO order paste such that attachables are placed after the block they depend on class Schematic { val size: Vec3i get() = _size!! @@ -15,15 +19,17 @@ class Schematic { field = value } - private var _data: Array<BlockData?>? = null + private var blockDatas: Array<BlockData?>? = null //private var extra: Map<Vec3i, (Block) -> Unit>? = null private var isLoaded = false; private set + private val traverser: RegionTraverser = RegionTraverser.upward fun getLoadTask(world: World, region: Region): TimeLimitedTask = { - val size = region.size.also { _size = it } - val data = arrayOfNulls<BlockData>(region.blockCount).also { _data = it } + _size = region.size + + val data = arrayOfNulls<BlockData>(region.blockCount).also { blockDatas = it } //val extra = mutableMapOf<Vec3i, (Block) -> Unit>().also { extra = it } - val blocks = RegionTraverser.downward.traverseRegion(region) + val blocks = traverser.traverseRegion(region) for ((index, vec) in blocks.withIndex()) { markSuspensionPoint() @@ -39,14 +45,26 @@ class Schematic { fun getPasteTask(world: World, position: Vec3i): TimeLimitedTask = { if (!isLoaded) throw IllegalStateException() val region = Region(position, _size!!) - val blocks = RegionTraverser.downward.traverseRegion(region) - val data = _data!! + val blocks = traverser.traverseRegion(region, worldHeight = world.maxHeight) + val blockDatas = blockDatas!! + + val postponed = mutableListOf<Pair<Vec3i, BlockData>>() for ((index, vec) in blocks.withIndex()) { markSuspensionPoint() val block = world[vec] - if (block.y > 255) continue - data[index]?.let { block.blockData = it } + val type = blockDatas[index] ?: air + if (type !== air && isAttachable(type.material)) { + + + postponed += vec to type + } else { + block.blockData = type + } + } + + for ((vec, data) in postponed) { + } } |