Fixes n tweaks
This commit is contained in:
@@ -3,12 +3,12 @@ package io.dico.parcels2.defaultimpl
|
||||
import io.dico.parcels2.*
|
||||
import io.dico.parcels2.blockvisitor.*
|
||||
import io.dico.parcels2.options.DefaultGeneratorOptions
|
||||
import io.dico.parcels2.util.Region
|
||||
import io.dico.parcels2.util.Vec2i
|
||||
import io.dico.parcels2.util.Vec3i
|
||||
import io.dico.parcels2.util.ext.even
|
||||
import io.dico.parcels2.util.ext.umod
|
||||
import io.dico.parcels2.util.get
|
||||
import io.dico.parcels2.util.math.Region
|
||||
import io.dico.parcels2.util.math.Vec2i
|
||||
import io.dico.parcels2.util.math.Vec3i
|
||||
import io.dico.parcels2.util.math.ext.even
|
||||
import io.dico.parcels2.util.math.ext.umod
|
||||
import io.dico.parcels2.util.math.get
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.CoroutineStart.UNDISPATCHED
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -121,9 +121,9 @@ class DefaultParcelGenerator(
|
||||
worldId: ParcelWorldId,
|
||||
container: ParcelContainer,
|
||||
coroutineScope: CoroutineScope,
|
||||
workDispatcher: WorkDispatcher
|
||||
jobDispatcher: JobDispatcher
|
||||
): Pair<ParcelLocator, ParcelBlockManager> {
|
||||
return ParcelLocatorImpl(worldId, container) to ParcelBlockManagerImpl(worldId, coroutineScope, workDispatcher)
|
||||
return ParcelLocatorImpl(worldId, container) to ParcelBlockManagerImpl(worldId, coroutineScope, jobDispatcher)
|
||||
}
|
||||
|
||||
private inline fun <T> convertBlockLocationToId(x: Int, z: Int, mapper: (Int, Int) -> T): T? {
|
||||
@@ -158,7 +158,7 @@ class DefaultParcelGenerator(
|
||||
private inner class ParcelBlockManagerImpl(
|
||||
val worldId: ParcelWorldId,
|
||||
coroutineScope: CoroutineScope,
|
||||
override val workDispatcher: WorkDispatcher
|
||||
override val jobDispatcher: JobDispatcher
|
||||
) : ParcelBlockManagerBase(), CoroutineScope by coroutineScope {
|
||||
override val world: World = this@DefaultParcelGenerator.world
|
||||
override val parcelTraverser: RegionTraverser = RegionTraverser.convergingTo(o.floorHeight)
|
||||
@@ -177,7 +177,10 @@ class DefaultParcelGenerator(
|
||||
|
||||
override fun getRegion(parcel: ParcelId): Region {
|
||||
val bottom = getBottomBlock(parcel)
|
||||
return Region(Vec3i(bottom.x, 0, bottom.z), Vec3i(o.parcelSize, maxHeight, o.parcelSize))
|
||||
return Region(
|
||||
Vec3i(bottom.x, 0, bottom.z),
|
||||
Vec3i(o.parcelSize, maxHeight, o.parcelSize)
|
||||
)
|
||||
}
|
||||
|
||||
private fun getRegionConsideringWorld(parcel: ParcelId): Region {
|
||||
@@ -234,12 +237,12 @@ class DefaultParcelGenerator(
|
||||
return world.getParcelById(parcelId)
|
||||
}
|
||||
|
||||
override fun submitBlockVisitor(vararg parcelIds: ParcelId, task: WorkerTask): Worker {
|
||||
override fun submitBlockVisitor(vararg parcelIds: ParcelId, task: JobFunction): Job {
|
||||
val parcels = parcelIds.mapNotNull { getParcel(it) }
|
||||
if (parcels.isEmpty()) return workDispatcher.dispatch(task)
|
||||
if (parcels.isEmpty()) return jobDispatcher.dispatch(task)
|
||||
if (parcels.any { it.hasBlockVisitors }) throw IllegalArgumentException("This parcel already has a block visitor")
|
||||
|
||||
val worker = workDispatcher.dispatch(task)
|
||||
val worker = jobDispatcher.dispatch(task)
|
||||
|
||||
for (parcel in parcels) {
|
||||
launch(start = UNDISPATCHED) {
|
||||
@@ -252,7 +255,7 @@ class DefaultParcelGenerator(
|
||||
return worker
|
||||
}
|
||||
|
||||
override fun setBiome(parcel: ParcelId, biome: Biome): Worker = submitBlockVisitor(parcel) {
|
||||
override fun setBiome(parcel: ParcelId, biome: Biome): Job = submitBlockVisitor(parcel) {
|
||||
val world = world
|
||||
val b = getBottomBlock(parcel)
|
||||
val parcelSize = o.parcelSize
|
||||
@@ -264,7 +267,7 @@ class DefaultParcelGenerator(
|
||||
}
|
||||
}
|
||||
|
||||
override fun clearParcel(parcel: ParcelId): Worker = submitBlockVisitor(parcel) {
|
||||
override fun clearParcel(parcel: ParcelId): Job = submitBlockVisitor(parcel) {
|
||||
val region = getRegion(parcel)
|
||||
val blocks = parcelTraverser.traverseRegion(region)
|
||||
val blockCount = region.blockCount.toDouble()
|
||||
@@ -288,7 +291,7 @@ class DefaultParcelGenerator(
|
||||
}
|
||||
}
|
||||
|
||||
override fun swapParcels(parcel1: ParcelId, parcel2: ParcelId): Worker = submitBlockVisitor(parcel1, parcel2) {
|
||||
override fun swapParcels(parcel1: ParcelId, parcel2: ParcelId): Job = submitBlockVisitor(parcel1, parcel2) {
|
||||
var region1 = getRegionConsideringWorld(parcel1)
|
||||
var region2 = getRegionConsideringWorld(parcel2)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package io.dico.parcels2.defaultimpl
|
||||
import io.dico.dicore.Formatting
|
||||
import io.dico.parcels2.*
|
||||
import io.dico.parcels2.Privilege.*
|
||||
import io.dico.parcels2.util.Vec2i
|
||||
import io.dico.parcels2.util.math.Vec2i
|
||||
import io.dico.parcels2.util.ext.alsoIfTrue
|
||||
import org.bukkit.Material
|
||||
import org.joda.time.DateTime
|
||||
|
||||
@@ -58,8 +58,10 @@ class ParcelProviderImpl(val plugin: ParcelsPlugin) : ParcelProvider {
|
||||
if (worldExists) Bukkit.getWorld(worldName)!!
|
||||
else WorldCreator(worldName).generator(generator).createWorld().also { logger.info("Creating world $worldName") }
|
||||
|
||||
parcelWorld = ParcelWorldImpl(bukkitWorld, generator, worldOptions.runtime, plugin.storage,
|
||||
plugin.globalPrivileges, ::DefaultParcelContainer, plugin, plugin.workDispatcher)
|
||||
parcelWorld = ParcelWorldImpl(
|
||||
bukkitWorld, generator, worldOptions.runtime, plugin.storage,
|
||||
plugin.globalPrivileges, ::DefaultParcelContainer, plugin, plugin.jobDispatcher
|
||||
)
|
||||
|
||||
if (!worldExists) {
|
||||
val time = DateTime.now()
|
||||
@@ -95,11 +97,18 @@ class ParcelProviderImpl(val plugin: ParcelsPlugin) : ParcelProvider {
|
||||
|
||||
logger.info("Loading all parcel data...")
|
||||
val channel = plugin.storage.transmitAllParcelData()
|
||||
do {
|
||||
val pair = channel.receiveOrNull() ?: break
|
||||
val parcel = getParcelById(pair.first) ?: continue
|
||||
pair.second?.let { parcel.copyDataIgnoringDatabase(it) }
|
||||
} while (true)
|
||||
while (true) {
|
||||
val (id, data) = channel.receiveOrNull() ?: break
|
||||
val parcel = getParcelById(id) ?: continue
|
||||
data?.let { parcel.copyDataIgnoringDatabase(it) }
|
||||
}
|
||||
|
||||
val channel2 = plugin.storage.transmitAllGlobalPrivileges()
|
||||
while (true) {
|
||||
val (profile, data) = channel2.receiveOrNull() ?: break
|
||||
val key = profile as? PrivilegeKey ?: continue
|
||||
(plugin.globalPrivileges[key] as PrivilegesHolder).copyPrivilegesFrom(data)
|
||||
}
|
||||
|
||||
logger.info("Loading data completed")
|
||||
_dataIsLoaded = true
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
package io.dico.parcels2.defaultimpl
|
||||
|
||||
import io.dico.parcels2.*
|
||||
import io.dico.parcels2.blockvisitor.WorkDispatcher
|
||||
import io.dico.parcels2.blockvisitor.JobDispatcher
|
||||
import io.dico.parcels2.options.RuntimeWorldOptions
|
||||
import io.dico.parcels2.storage.Storage
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -18,7 +18,7 @@ class ParcelWorldImpl(override val world: World,
|
||||
override val globalPrivileges: GlobalPrivilegesManager,
|
||||
containerFactory: ParcelContainerFactory,
|
||||
coroutineScope: CoroutineScope,
|
||||
workDispatcher: WorkDispatcher)
|
||||
jobDispatcher: JobDispatcher)
|
||||
: ParcelWorld,
|
||||
ParcelWorldId,
|
||||
ParcelContainer, /* missing delegation */
|
||||
@@ -39,7 +39,7 @@ class ParcelWorldImpl(override val world: World,
|
||||
override val blockManager: ParcelBlockManager
|
||||
|
||||
init {
|
||||
val pair = generator.makeParcelLocatorAndBlockManager(id, container, coroutineScope, workDispatcher)
|
||||
val pair = generator.makeParcelLocatorAndBlockManager(id, container, coroutineScope, jobDispatcher)
|
||||
locator = pair.first
|
||||
blockManager = pair.second
|
||||
|
||||
|
||||
Reference in New Issue
Block a user