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.kt27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
index 8c8f303..dddb221 100644
--- a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
+++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt
@@ -1,10 +1,7 @@
package io.dico.parcels2.defaultimpl
import io.dico.parcels2.*
-import io.dico.parcels2.blockvisitor.RegionTraverser
-import io.dico.parcels2.blockvisitor.TimeLimitedTask
-import io.dico.parcels2.blockvisitor.Worker
-import io.dico.parcels2.blockvisitor.WorktimeLimiter
+import io.dico.parcels2.blockvisitor.*
import io.dico.parcels2.options.DefaultGeneratorOptions
import io.dico.parcels2.util.Region
import io.dico.parcels2.util.Vec2i
@@ -225,15 +222,18 @@ class DefaultParcelGenerator(
return world.getParcelById(parcelId)
}
- override fun submitBlockVisitor(parcelId: ParcelId, task: TimeLimitedTask): Worker {
- val parcel = getParcel(parcelId) ?: return worktimeLimiter.submit(task)
- if (parcel.hasBlockVisitors) throw IllegalArgumentException("This parcel already has a block visitor")
+ override fun submitBlockVisitor(vararg parcelIds: ParcelId, task: TimeLimitedTask): Worker {
+ val parcels = parcelIds.mapNotNull { getParcel(it) }
+ if (parcels.isEmpty()) return worktimeLimiter.submit(task)
+ if (parcels.any { it.hasBlockVisitors }) throw IllegalArgumentException("This parcel already has a block visitor")
val worker = worktimeLimiter.submit(task)
- launch(start = UNDISPATCHED) {
- parcel.withBlockVisitorPermit {
- worker.awaitCompletion()
+ for (parcel in parcels) {
+ launch(start = UNDISPATCHED) {
+ parcel.withBlockVisitorPermit {
+ worker.awaitCompletion()
+ }
}
}
@@ -276,6 +276,13 @@ class DefaultParcelGenerator(
}
}
+ override fun swapParcels(parcel1: ParcelId, parcel2: ParcelId): Worker = submitBlockVisitor(parcel1, parcel2) {
+ val schematicOf1 = delegateWork(0.15) { Schematic().apply { load(world, getRegion(parcel1)) } }
+ val schematicOf2 = delegateWork(0.15) { Schematic().apply { load(world, getRegion(parcel2)) } }
+ delegateWork(0.35) { with(schematicOf1) { paste(world, getRegion(parcel2).origin) } }
+ delegateWork(0.35) { with(schematicOf2) { paste(world, getRegion(parcel1).origin) } }
+ }
+
override fun getParcelsWithOwnerBlockIn(chunk: Chunk): Collection<Vec2i> {
/*
* Get the offsets for the world out of the way