summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDico <dico.karssiens@gmail.com>2018-09-26 15:25:17 +0100
committerDico <dico.karssiens@gmail.com>2018-09-26 15:25:17 +0100
commitc486e99f1aa1cf02e3d5ffea4b13916010578cee (patch)
tree061eed09187e73fabfd4d1dc9e036ae52ca02afe
parented3c85951a768a4f151d44a8b9c63f4a6175c756 (diff)
Small fixes
-rw-r--r--src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt6
-rw-r--r--src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt2
-rw-r--r--src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt37
-rw-r--r--src/main/kotlin/io/dico/parcels2/util/Region.kt5
-rw-r--r--src/main/kotlin/io/dico/parcels2/util/Vec3i.kt2
5 files changed, 40 insertions, 12 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt
index 5326baa..c49faa2 100644
--- a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt
+++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt
@@ -218,8 +218,8 @@ inline class TraverseDirection(val bits: Int) {
fun comesFirst(current: Vec3i, block: Vec3i) =
comesFirst(current, block, Dimension.X)
- && comesFirst(current, block, Dimension.Y)
- && comesFirst(current, block, Dimension.Z)
+ && comesFirst(current, block, Dimension.Y)
+ && comesFirst(current, block, Dimension.Z)
companion object {
operator fun invoke(x: Int, y: Int, z: Int) = invoke(Vec3i(x, y, z))
@@ -229,7 +229,7 @@ inline class TraverseDirection(val bits: Int) {
var bits = 0
if (block.x > 0) bits = bits or 1
if (block.y > 0) bits = bits or 2
- if (block.z > 0) bits = bits or 3
+ if (block.z > 0) bits = bits or 4
return TraverseDirection(bits)
}
}
diff --git a/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt b/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
index 9975535..9c3ca4f 100644
--- a/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
+++ b/src/main/kotlin/io/dico/parcels2/command/CommandsAdmin.kt
@@ -51,7 +51,7 @@ class CommandsAdmin(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
val parcel2 = (target as ParcelTarget.ByID).getParcel()
?: throw CommandException("Invalid parcel target")
- Validate.isTrue(parcel2.world == world, "Parcel must be in the same world")
+ // Validate.isTrue(parcel2.world == world, "Parcel must be in the same world")
Validate.isTrue(!parcel2.hasBlockVisitors, "A process is already running in this parcel")
val data = parcel.data
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> {
diff --git a/src/main/kotlin/io/dico/parcels2/util/Region.kt b/src/main/kotlin/io/dico/parcels2/util/Region.kt
index f786693..1801b4e 100644
--- a/src/main/kotlin/io/dico/parcels2/util/Region.kt
+++ b/src/main/kotlin/io/dico/parcels2/util/Region.kt
@@ -10,4 +10,9 @@ data class Region(val origin: Vec3i, val size: Vec3i) {
val z = (origin.z + size.z) / 2.0
return Vec3d(x, y, z)
}
+
+ fun withSize(size: Vec3i): Region {
+ if (size == this.size) return this
+ return Region(origin, size)
+ }
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/util/Vec3i.kt b/src/main/kotlin/io/dico/parcels2/util/Vec3i.kt
index af71dc4..8608e13 100644
--- a/src/main/kotlin/io/dico/parcels2/util/Vec3i.kt
+++ b/src/main/kotlin/io/dico/parcels2/util/Vec3i.kt
@@ -1,5 +1,6 @@
package io.dico.parcels2.util
+import io.dico.parcels2.util.ext.clampMax
import org.bukkit.World
import org.bukkit.block.Block
import org.bukkit.block.BlockFace
@@ -35,6 +36,7 @@ data class Vec3i(
infix fun withZ(o: Int) = Vec3i(x, y, o)
fun add(ox: Int, oy: Int, oz: Int) = Vec3i(x + ox, y + oy, z + oz)
fun neg() = Vec3i(-x, -y, -z)
+ fun clampMax(o: Vec3i) = Vec3i(x.clampMax(o.x), y.clampMax(o.y), z.clampMax(o.z))
companion object {
private operator fun invoke(face: BlockFace) = Vec3i(face.modX, face.modY, face.modZ)