summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Options.kt
blob: c349d8bdaff81e80cd9a47d26ba735439ba94f2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package io.dico.parcels2


import com.fasterxml.jackson.annotation.JsonIgnore
import io.dico.parcels2.blockvisitor.TickWorktimeOptions
import io.dico.parcels2.storage.Storage
import io.dico.parcels2.storage.StorageFactory
import io.dico.parcels2.storage.yamlObjectMapper
import org.bukkit.Bukkit.createBlockData
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.block.Biome
import org.bukkit.block.data.BlockData
import java.io.Reader
import java.io.Writer
import java.util.*

class Options {
    var worlds: Map<String, WorldOptions> = HashMap()
        private set
    var storage: StorageOptions = StorageOptions("postgresql", DataConnectionOptions())
    var tickWorktime: TickWorktimeOptions = TickWorktimeOptions(20, 1)

    fun addWorld(name: String, options: WorldOptions) = (worlds as MutableMap).put(name, options)

    fun writeTo(writer: Writer) = yamlObjectMapper.writeValue(writer, this)

    fun mergeFrom(reader: Reader) = yamlObjectMapper.readerForUpdating(this).readValue<Options>(reader)

    override fun toString(): String = yamlObjectMapper.writeValueAsString(this)

}

data class WorldOptions(var gameMode: GameMode? = GameMode.CREATIVE,
                        var dayTime: Boolean = true,
                        var noWeather: Boolean = true,
                        var preventWeatherBlockChanges: Boolean = true,
                        var preventBlockSpread: Boolean = true, // TODO
                        var dropEntityItems: Boolean = true,
                        var doTileDrops: Boolean = false,
                        var disableExplosions: Boolean = true,
                        var blockPortalCreation: Boolean = true,
                        var blockMobSpawning: Boolean = true,
                        var blockedItems: Set<Material> = EnumSet.of(Material.FLINT_AND_STEEL, Material.SNOWBALL),
                        var axisLimit: Int = 10,
                        var generator: GeneratorOptions = DefaultGeneratorOptions()) {

}

abstract class GeneratorOptions {

    abstract fun generatorFactory(): GeneratorFactory

    fun getGenerator(worlds: Worlds, worldName: String) = generatorFactory().newParcelGenerator(worlds, worldName, this)

}

data class DefaultGeneratorOptions(var defaultBiome: Biome = Biome.JUNGLE,
                                   var wallType: BlockData = createBlockData(Material.STONE_SLAB),
                                   var floorType: BlockData = createBlockData(Material.QUARTZ_BLOCK),
                                   var fillType: BlockData = createBlockData(Material.QUARTZ_BLOCK),
                                   var pathMainType: BlockData = createBlockData(Material.SANDSTONE),
                                   var pathAltType: BlockData = createBlockData(Material.REDSTONE_BLOCK),
                                   var parcelSize: Int = 101,
                                   var pathSize: Int = 9,
                                   var floorHeight: Int = 64,
                                   var offsetX: Int = 0,
                                   var offsetZ: Int = 0) : GeneratorOptions() {

    override fun generatorFactory(): GeneratorFactory = DefaultParcelGenerator.Factory

}

class StorageOptions(val dialect: String,
                     val options: Any) {

    @get:JsonIgnore
    val factory = StorageFactory.getFactory(dialect)
        ?: throw IllegalArgumentException("Invalid storage dialect: $dialect")

    fun newStorageInstance(): Storage = factory.newStorageInstance(dialect, options)

}

data class DataConnectionOptions(val address: String = "localhost",
                                 val database: String = "parcels",
                                 val username: String = "root",
                                 val password: String = "",
                                 val poolSize: Int = 4) {

    fun splitAddressAndPort(defaultPort: Int = 3306): Pair<String, Int>? {
        val idx = address.indexOf(":").takeUnless { it == -1 } ?: return Pair(address, defaultPort)

        val addressName = address.substring(0, idx).takeUnless { it.isBlank() } ?: return null.also {
            logger.error("(Invalidly) blank address in data storage options")
        }

        val port = address.substring(idx + 1).toIntOrNull() ?: return null.also {
            logger.error("Invalid port number in data storage options: $it, using $defaultPort as default")
        }

        return Pair(addressName, port)
    }

}

data class DataFileOptions(val location: String = "/flatfile-storage/")