summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Parcel.kt
diff options
context:
space:
mode:
authorDico Karssiens <dico.karssiens@gmail.com>2018-08-02 01:16:38 +0100
committerDico Karssiens <dico.karssiens@gmail.com>2018-08-02 01:16:38 +0100
commit3917855a72c60d1c78632949b4fea21471873347 (patch)
tree4dcdbd770b1a74cc307adc0c5a020617d4233351 /src/main/kotlin/io/dico/parcels2/Parcel.kt
parent472e700e0422d1829aa26e04b74e2077807e75f0 (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.kt110
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