diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt | 110 |
1 files changed, 63 insertions, 47 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt index bfaeb09..243ec19 100644 --- a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt +++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt @@ -6,7 +6,6 @@ import io.dico.parcels2.Privilege.* import io.dico.parcels2.util.Vec2i import io.dico.parcels2.util.ext.alsoIfTrue import org.bukkit.Material -import org.bukkit.OfflinePlayer import org.joda.time.DateTime import java.util.concurrent.atomic.AtomicInteger @@ -36,25 +35,19 @@ class ParcelImpl( world.storage.setParcelData(this, null) } - override val privilegeMap: PrivilegeMap get() = data.privilegeMap - override fun getStoredPrivilege(key: PrivilegeKey) = data.getStoredPrivilege(key) - override fun setStoredPrivilege(key: PrivilegeKey, privilege: Privilege): Boolean { - return data.setStoredPrivilege(key, privilege).alsoIfTrue { - world.storage.setLocalPrivilege(this, key, privilege) + override var owner: PlayerProfile? + get() = data.owner + set(value) { + if (data.owner != value) { + world.storage.setParcelOwner(this, value) + world.blockManager.setOwnerBlock(this, value) + data.owner = value + } } - } - - override fun privilege(player: OfflinePlayer, adminPerm: String): Privilege { - val privilege = super.privilege(player, adminPerm) - return if (privilege == DEFAULT) globalPrivileges?.privilege(player, adminPerm) ?: DEFAULT - else privilege - } - override val globalPrivileges: GlobalPrivileges? - get() = keyOfOwner?.let { world.globalPrivileges[it] } - - override val lastClaimTime: DateTime? get() = data.lastClaimTime + override val lastClaimTime: DateTime? + get() = data.lastClaimTime override var ownerSignOutdated: Boolean get() = data.ownerSignOutdated @@ -65,21 +58,32 @@ class ParcelImpl( } } - override var owner: PlayerProfile? - get() = data.owner - set(value) { - if (data.owner != value) { - world.storage.setParcelOwner(this, value) - world.blockManager.setOwnerBlock(this, value) - data.owner = value - } + + override val privilegeMap: PrivilegeMap + get() = data.privilegeMap + + override val globalPrivileges: GlobalPrivileges? + get() = keyOfOwner?.let { world.globalPrivileges[it] } + + override fun getRawStoredPrivilege(key: PrivilegeKey) = data.getRawStoredPrivilege(key) + + override fun setRawStoredPrivilege(key: PrivilegeKey, privilege: Privilege) = + data.setRawStoredPrivilege(key, privilege).alsoIfTrue { + world.storage.setLocalPrivilege(this, key, privilege) } + override fun getStoredPrivilege(key: PrivilegeKey): Privilege = + super.getStoredPrivilege(key).takeIf { it != DEFAULT } + ?: globalPrivileges?.getStoredPrivilege(key) + ?: DEFAULT + + + private var _interactableConfig: InteractableConfiguration? = null + private fun updateInteractableConfigStorage() { world.storage.setParcelOptionsInteractConfig(this, data.interactableConfig) } - private var _interactableConfig: InteractableConfiguration? = null override var interactableConfig: InteractableConfiguration get() { if (_interactableConfig == null) { @@ -103,6 +107,7 @@ class ParcelImpl( } } + private var blockVisitors = AtomicInteger(0) override suspend fun withBlockVisitorPermit(block: suspend () -> Unit) { @@ -117,9 +122,6 @@ class ParcelImpl( override fun toString() = toStringExt() } -private operator fun Formatting.plus(other: Formatting) = toString() + other -private operator fun Formatting.plus(other: String) = toString() + other - private object ParcelInfoStringComputer { val infoStringColor1 = Formatting.GREEN val infoStringColor2 = Formatting.AQUA @@ -148,20 +150,34 @@ private object ParcelInfoStringComputer { }, value) } - private fun StringBuilder.appendAddedList(local: PrivilegeMap, global: PrivilegeMap, privilege: Privilege, fieldName: String) { - // local takes precedence over global + private fun processPrivileges(local: RawPrivileges, global: RawPrivileges?, + privilege: Privilege): Pair<LinkedHashMap<PrivilegeKey, Privilege>, Int> { + val map = linkedMapOf<PrivilegeKey, Privilege>() + local.privilegeOfStar.takeIf { it != DEFAULT }?.let { map[PlayerProfile.Star] = it } + map.values.retainAll { it.isDistanceGrEq(privilege) } + val localCount = map.size + + if (global != null) { + global.privilegeMap.forEach { + if (it.value.isDistanceGrEq(privilege)) + map.putIfAbsent(it.key, it.value) + } + + global.privilegeOfStar.takeIf { it != DEFAULT && it.isDistanceGrEq(privilege) } + ?.let { map.putIfAbsent(PlayerProfile.Star, it) } + } - val localFiltered = local.filterValues { it.isDistanceGrEq(privilege) } - // global keys are dropped here when merged with the local ones - val all = localFiltered + global.filterValues { it.isDistanceGrEq(privilege) } - if (all.isEmpty()) return + return map to localCount + } - appendFieldWithCount(fieldName, all.size) { - val separator = "$infoStringColor1, $infoStringColor2" + private fun StringBuilder.appendAddedList(local: RawPrivileges, global: RawPrivileges?, privilege: Privilege, fieldName: String) { + val (map, localCount) = processPrivileges(local, global, privilege) + if (map.isEmpty()) return + appendFieldWithCount(fieldName, map.size) { // first [localCount] entries are local - val localCount = localFiltered.size - val iterator = all.iterator() + val separator = "$infoStringColor1, $infoStringColor2" + val iterator = map.iterator() if (localCount != 0) { appendPrivilegeEntry(false, iterator.next().toPair()) @@ -185,17 +201,17 @@ private object ParcelInfoStringComputer { private fun StringBuilder.appendPrivilegeEntry(global: Boolean, pair: Pair<PrivilegeKey, Privilege>) { val (key, priv) = pair - // prefix. Maybe T should be M for mod or something. T means they have CAN_MANAGE privilege. + append(key.notNullName) + + // suffix. Maybe T should be M for mod or something. T means they have CAN_MANAGE privilege. append( when { - global && priv == CAN_MANAGE -> "(GT)" - global -> "(G)" - priv == CAN_MANAGE -> "(T)" + global && priv == CAN_MANAGE -> " (G) (T)" + global -> " (G)" + priv == CAN_MANAGE -> " (T)" else -> "" } ) - - append(key.notNullName) } fun getInfoString(parcel: Parcel): String = buildString { @@ -219,8 +235,8 @@ private object ParcelInfoStringComputer { append('\n') - val local = parcel.privilegeMap - val global = parcel.globalPrivileges?.privilegeMap ?: emptyMap() + val local: RawPrivileges = parcel.data + val global = parcel.globalPrivileges appendAddedList(local, global, CAN_BUILD, "Allowed") // includes CAN_MANAGE privilege append('\n') appendAddedList(local, global, BANNED, "Banned") |