summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt
new file mode 100644
index 0000000..c3d7c22
--- /dev/null
+++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt
@@ -0,0 +1,163 @@
+package io.dico.parcels2.defaultimpl
+
+import io.dico.dicore.Formatting
+import io.dico.parcels2.*
+import io.dico.parcels2.util.Vec2i
+import io.dico.parcels2.util.getPlayerName
+import org.bukkit.OfflinePlayer
+import org.joda.time.DateTime
+import java.util.UUID
+import kotlin.reflect.KProperty
+
+class ParcelImpl(override val world: ParcelWorld,
+ override val x: Int,
+ override val z: Int) : Parcel, ParcelId {
+ override val id: ParcelId = this
+ override val pos get() = Vec2i(x, z)
+ override var data: ParcelDataHolder = ParcelDataHolder(); private set
+ override val infoString by ParcelInfoStringComputer
+ override var hasBlockVisitors: Boolean = false; private set
+ override val worldId: ParcelWorldId get() = world.id
+
+ override fun copyDataIgnoringDatabase(data: ParcelData) {
+ this.data = ((data as? Parcel)?.data ?: data) as ParcelDataHolder
+ }
+
+ override fun copyData(data: ParcelData) {
+ copyDataIgnoringDatabase(data)
+ world.storage.setParcelData(this, data)
+ }
+
+ override fun dispose() {
+ copyDataIgnoringDatabase(ParcelDataHolder())
+ world.storage.setParcelData(this, null)
+ }
+
+ 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): 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
+
+ override var owner: ParcelOwner?
+ get() = data.owner
+ set(value) {
+ if (data.owner != value) {
+ world.storage.setParcelOwner(this, value)
+ data.owner = value
+ }
+ }
+
+ override fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean {
+ return data.setAddedStatus(uuid, status).also {
+ if (it) world.storage.setParcelPlayerStatus(this, uuid, status)
+ }
+ }
+
+ override var allowInteractInputs: Boolean
+ get() = data.allowInteractInputs
+ set(value) {
+ if (data.allowInteractInputs == value) return
+ world.storage.setParcelAllowsInteractInputs(this, value)
+ data.allowInteractInputs = value
+ }
+
+ override var allowInteractInventory: Boolean
+ get() = data.allowInteractInventory
+ set(value) {
+ if (data.allowInteractInventory == value) return
+ world.storage.setParcelAllowsInteractInventory(this, value)
+ data.allowInteractInventory = value
+ }
+
+
+}
+
+private object ParcelInfoStringComputer {
+ val infoStringColor1 = Formatting.GREEN
+ val infoStringColor2 = Formatting.AQUA
+
+ private inline fun StringBuilder.appendField(field: StringBuilder.() -> Unit, value: StringBuilder.() -> Unit) {
+ append(infoStringColor1)
+ field()
+ append(": ")
+ append(infoStringColor2)
+ value()
+ append(' ')
+ }
+
+ private inline fun StringBuilder.appendField(name: String, value: StringBuilder.() -> Unit) {
+ append(infoStringColor1)
+ append(name)
+ append(": ")
+ append(infoStringColor2)
+ value()
+ append(' ')
+ }
+
+ private fun StringBuilder.appendAddedList(local: Map<UUID, AddedStatus>, global: Map<UUID, AddedStatus>, status: AddedStatus, fieldName: String) {
+ val globalSet = global.filterValues { it == status }.keys
+ val localList = local.filterValues { it == status }.keys.filter { it !in globalSet }
+ val stringList = globalSet.map(::getPlayerName).map { "(G)$it" } + localList.map(::getPlayerName)
+ if (stringList.isEmpty()) return
+
+ appendField({
+ append(fieldName)
+ append('(')
+ append(infoStringColor2)
+ append(stringList.size)
+ append(infoStringColor1)
+ append(')')
+ }) {
+ stringList.joinTo(this,
+ separator = infoStringColor1.toString() + ", " + infoStringColor2,
+ limit = 150)
+ }
+ }
+
+ operator fun getValue(parcel: Parcel, property: KProperty<*>): String = buildString {
+ appendField("ID") {
+ append(parcel.x)
+ append(',')
+ append(parcel.z)
+ }
+
+ val owner = parcel.owner
+ appendField("Owner") {
+ if (owner == null) {
+ append(infoStringColor1)
+ append("none")
+ } else {
+ append(owner.notNullName)
+ }
+ }
+
+ // plotme appends biome here
+
+ append('\n')
+
+ val global = owner?.let { parcel.world.globalAddedData[owner].addedMap } ?: emptyMap()
+ val local = parcel.addedMap
+ appendAddedList(local, global, AddedStatus.ALLOWED, "Allowed")
+ append('\n')
+ appendAddedList(local, global, AddedStatus.BANNED, "Banned")
+
+ 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