summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt
diff options
context:
space:
mode:
authorDico <dico.karssiens@gmail.com>2018-08-02 18:22:36 +0100
committerDico <dico.karssiens@gmail.com>2018-08-02 18:22:36 +0100
commit0af2e615d3fa1d8509be46e14f99d40dc9cdb342 (patch)
tree3864043218969a67b5df17784a05c6af424e3617 /src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt
parent6513ad9237dbda0244a52608ae639fee5822b3ee (diff)
Refactor and improve a lot of the API. Move default implementations into a package. Reformatting.
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt
new file mode 100644
index 0000000..590794d
--- /dev/null
+++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelWorldImpl.kt
@@ -0,0 +1,94 @@
+@file:Suppress("CanBePrimaryConstructorProperty", "UsePropertyAccessSyntax")
+
+package io.dico.parcels2.defaultimpl
+
+import io.dico.parcels2.*
+import io.dico.parcels2.blockvisitor.WorktimeLimiter
+import io.dico.parcels2.storage.Storage
+import org.bukkit.World
+import java.util.UUID
+
+class ParcelWorldImpl private
+constructor(override val world: World,
+ override val generator: ParcelGenerator,
+ override var options: WorldOptions,
+ override val storage: Storage,
+ override val globalAddedData: GlobalAddedDataManager,
+ containerFactory: ParcelContainerFactory,
+ blockManager: ParcelBlockManager)
+ : ParcelWorld,
+ ParcelWorldId,
+ ParcelContainer, // missing delegation
+ ParcelLocator, // missing delegation
+ ParcelBlockManager by blockManager {
+ override val id: ParcelWorldId get() = this
+ override val uid: UUID? get() = world.uid
+
+ init {
+ if (generator.world != world) {
+ throw IllegalArgumentException()
+ }
+ }
+
+ override val name: String = world.name!!
+ override val container: ParcelContainer = containerFactory(this)
+ override val locator: ParcelLocator = generator.makeParcelLocator(container)
+ override val blockManager: ParcelBlockManager = blockManager
+
+ init {
+ enforceOptions()
+ }
+
+ fun enforceOptions() {
+ if (options.dayTime) {
+ world.setGameRuleValue("doDaylightCycle", "false")
+ world.setTime(6000)
+ }
+
+ if (options.noWeather) {
+ world.setStorm(false)
+ world.setThundering(false)
+ world.weatherDuration = Integer.MAX_VALUE
+ }
+
+ world.setGameRuleValue("doTileDrops", "${options.doTileDrops}")
+ }
+
+ /*
+ Interface delegation needs to be implemented manually because JetBrains has yet to fix it.
+ */
+
+ companion object {
+ // Use this to be able to delegate blockManager and assign it to a property too, at least.
+ operator fun invoke(world: World,
+ generator: ParcelGenerator,
+ options: WorldOptions,
+ storage: Storage,
+ globalAddedData: GlobalAddedDataManager,
+ containerFactory: ParcelContainerFactory,
+ worktimeLimiter: WorktimeLimiter): ParcelWorldImpl {
+ val blockManager = generator.makeParcelBlockManager(worktimeLimiter)
+ return ParcelWorldImpl(world, generator, options, storage, globalAddedData, containerFactory, blockManager)
+ }
+ }
+
+ // ParcelLocator interface
+ override fun getParcelAt(x: Int, z: Int): Parcel? {
+ return locator.getParcelAt(x, z)
+ }
+
+ override fun getParcelIdAt(x: Int, z: Int): ParcelId? {
+ return locator.getParcelIdAt(x, z)
+ }
+
+ // ParcelContainer interface
+ override fun getParcelById(x: Int, z: Int): Parcel? {
+ return container.getParcelById(x, z)
+ }
+
+ override fun nextEmptyParcel(): Parcel? {
+ return container.nextEmptyParcel()
+ }
+
+
+}