summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
index 90cadc6..1c513f8 100644
--- a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
+++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
@@ -32,9 +32,11 @@ class DefaultParcelGenerator(
private var _world: World? = null
override val world: World
get() {
- if (_world == null) _world = Bukkit.getWorld(worldName)!!.also {
- maxHeight = it.maxHeight
- return it
+ if (_world == null) {
+ val world = Bukkit.getWorld(worldName)
+ maxHeight = world.maxHeight
+ _world = world
+ return world
}
return _world!!
}
@@ -175,7 +177,17 @@ class DefaultParcelGenerator(
override fun getRegion(parcel: ParcelId): Region {
val bottom = getBottomBlock(parcel)
- return Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight + 1, o.parcelSize))
+ return Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight, o.parcelSize))
+ }
+
+ private fun getRegionConsideringWorld(parcel: ParcelId): Region {
+ if (parcel.worldId != worldId) {
+ (parcel.worldId as? ParcelWorld)?.let {
+ return it.blockManager.getRegion(parcel)
+ }
+ throw IllegalArgumentException()
+ }
+ return getRegion(parcel)
}
override fun setOwnerBlock(parcel: ParcelId, owner: PlayerProfile?) {
@@ -277,10 +289,19 @@ class DefaultParcelGenerator(
}
override fun swapParcels(parcel1: ParcelId, parcel2: ParcelId): Worker = submitBlockVisitor(parcel1, parcel2) {
- val schematicOf1 = delegateWork(0.25) { Schematic().apply { load(world, getRegion(parcel1)) } }
- val schematicOf2 = delegateWork(0.25) { Schematic().apply { load(world, getRegion(parcel2)) } }
- delegateWork(0.25) { with(schematicOf1) { paste(world, getRegion(parcel2).origin) } }
- delegateWork(0.25) { with(schematicOf2) { paste(world, getRegion(parcel1).origin) } }
+ var region1 = getRegionConsideringWorld(parcel1)
+ var region2 = getRegionConsideringWorld(parcel2)
+
+ val size = region1.size.clampMax(region2.size)
+ if (size != region1.size) {
+ region1 = region1.withSize(size)
+ region2 = region2.withSize(size)
+ }
+
+ val schematicOf1 = delegateWork(0.25) { Schematic().apply { load(world, region1) } }
+ val schematicOf2 = delegateWork(0.25) { Schematic().apply { load(world, region2) } }
+ delegateWork(0.25) { with(schematicOf1) { paste(world, region2.origin) } }
+ delegateWork(0.25) { with(schematicOf2) { paste(world, region1.origin) } }
}
override fun getParcelsWithOwnerBlockIn(chunk: Chunk): Collection<Vec2i> {