diff options
author | Dico Karssiens <dico.karssiens@gmail.com> | 2018-08-02 01:16:38 +0100 |
---|---|---|
committer | Dico Karssiens <dico.karssiens@gmail.com> | 2018-08-02 01:16:38 +0100 |
commit | 3917855a72c60d1c78632949b4fea21471873347 (patch) | |
tree | 4dcdbd770b1a74cc307adc0c5a020617d4233351 /src/main/kotlin/io/dico/parcels2/Parcel.kt | |
parent | 472e700e0422d1829aa26e04b74e2077807e75f0 (diff) |
Improve (ParcelTarget)ing for commands, ParcelOwner things, various little bits
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Parcel.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/Parcel.kt | 110 |
1 files changed, 85 insertions, 25 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Parcel.kt b/src/main/kotlin/io/dico/parcels2/Parcel.kt index c8e7713..712c32f 100644 --- a/src/main/kotlin/io/dico/parcels2/Parcel.kt +++ b/src/main/kotlin/io/dico/parcels2/Parcel.kt @@ -1,26 +1,14 @@ package io.dico.parcels2 +import io.dico.dicore.Formatting import io.dico.parcels2.util.Vec2i +import io.dico.parcels2.util.getPlayerName import io.dico.parcels2.util.hasBuildAnywhere -import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import org.joda.time.DateTime import java.util.* - -interface ParcelData : AddedData { - var owner: ParcelOwner? - val since: DateTime? - - fun canBuild(player: OfflinePlayer, checkAdmin: Boolean = true, checkGlobal: Boolean = true): Boolean - - var allowInteractInputs: Boolean - var allowInteractInventory: Boolean - - fun isOwner(uuid: UUID): Boolean { - return owner?.uuid == uuid - } -} +import kotlin.reflect.KProperty /** * Parcel implementation of ParcelData will update the database when changes are made. @@ -31,16 +19,12 @@ interface ParcelData : AddedData { * Therefore, database query callbacks should schedule their updates using the bukkit scheduler. */ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData { + var data: ParcelData = ParcelDataHolder(); private set + val id get() = "${pos.x}:${pos.z}" val homeLocation get() = world.generator.getHomeLocation(this) - private var blockVisitors = 0 - val infoString: String - get() { - return "$id; owned by ${owner?.let { it.name ?: Bukkit.getOfflinePlayer(it.uuid).name }}" - } - - var data: ParcelData = ParcelDataHolder(); private set + val infoString by ParcelInfoStringComputer fun copyDataIgnoringDatabase(data: ParcelData) { this.data = data @@ -48,14 +32,19 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData { fun copyData(data: ParcelData) { world.storage.setParcelData(this, data) - this.data = data + copyDataIgnoringDatabase(data) } - override val added: Map<UUID, AddedStatus> get() = data.added + override val addedMap: Map<UUID, AddedStatus> get() = data.addedMap override fun getAddedStatus(uuid: UUID) = data.getAddedStatus(uuid) override fun isBanned(uuid: UUID) = data.isBanned(uuid) override fun isAllowed(uuid: UUID) = data.isAllowed(uuid) - override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = data.canBuild(player) + override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean): Boolean { + return (data.canBuild(player, checkAdmin, false)) + || checkGlobal && world.globalAddedData[owner ?: return false].isAllowed(player) + } + + val globalAddedMap: Map<UUID, AddedStatus>? get() = owner?.let { world.globalAddedData[it].addedMap } override val since: DateTime? get() = data.since @@ -93,7 +82,22 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData { var hasBlockVisitors: Boolean = false; private set } +interface ParcelData : AddedData { + var owner: ParcelOwner? + val since: DateTime? + + fun canBuild(player: OfflinePlayer, checkAdmin: Boolean = true, checkGlobal: Boolean = true): Boolean + + var allowInteractInputs: Boolean + var allowInteractInventory: Boolean + + fun isOwner(uuid: UUID): Boolean { + return owner?.uuid == uuid + } +} + class ParcelDataHolder : AddedDataHolder(), ParcelData { + override var owner: ParcelOwner? = null override var since: DateTime? = null override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = isAllowed(player.uniqueId) @@ -104,3 +108,59 @@ class ParcelDataHolder : AddedDataHolder(), ParcelData { override var allowInteractInventory = true } +private object ParcelInfoStringComputer { + val infoStringColor1 = Formatting.GREEN + val infoStringColor2 = Formatting.AQUA + + private inline fun StringBuilder.appendField(name: String, value: StringBuilder.() -> Unit) { + append(infoStringColor1) + append(name) + append(": ") + append(infoStringColor2) + value() + append(' ') + } + + operator fun getValue(parcel: Parcel, property: KProperty<*>): String = buildString { + appendField("ID") { + append(parcel.pos.x) + append(':') + append(parcel.pos.z) + } + + appendField("Owner") { + val owner = parcel.owner + if (owner == null) { + append(infoStringColor1) + append("none") + } else { + append(owner.notNullName) + } + } + + // plotme appends biome here + + append('\n') + + val allowedMap = parcel.addedMap.filterValues { it.isAllowed } + if (allowedMap.isNotEmpty()) appendField("Allowed") { + allowedMap.keys.map(::getPlayerName).joinTo(this) + } + + val bannedMap = parcel.addedMap.filterValues { it.isBanned } + if (bannedMap.isNotEmpty()) appendField("Banned") { + bannedMap.keys.map(::getPlayerName).joinTo(this) + } + + if (!parcel.allowInteractInputs || !parcel.allowInteractInventory) { + appendField("Options") { + append("(") + appendField("inputs") { append(parcel.allowInteractInputs)} + append(", ") + appendField("inventory") { append(parcel.allowInteractInventory) } + append(")") + } + } + + } +}
\ No newline at end of file |