diff options
author | Dico200 <dico.karssiens@gmail.com> | 2018-07-27 23:20:44 +0100 |
---|---|---|
committer | Dico200 <dico.karssiens@gmail.com> | 2018-07-27 23:20:44 +0100 |
commit | 2a726e1b618b38e635b249d7d09000ec2ea9ac17 (patch) | |
tree | c370942595e36ffce24e0873c710c06110973a17 /src/main/kotlin/io/dico/parcels2/Parcel.kt | |
parent | a9c19ff5cfbf6d99d46cc38d0e294275cdc7f61e (diff) |
Work on commands a bit more
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Parcel.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/Parcel.kt | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Parcel.kt b/src/main/kotlin/io/dico/parcels2/Parcel.kt index 4df60b1..0bdaafd 100644 --- a/src/main/kotlin/io/dico/parcels2/Parcel.kt +++ b/src/main/kotlin/io/dico/parcels2/Parcel.kt @@ -3,19 +3,41 @@ package io.dico.parcels2 import io.dico.parcels2.math.Vec2i import io.dico.parcels2.util.getPlayerName import io.dico.parcels2.util.hasBuildAnywhere +import io.dico.parcels2.util.isValid +import io.dico.parcels2.util.uuid import org.bukkit.Bukkit +import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import java.util.* -interface ParcelData { - var owner: ParcelOwner? +interface AddedData { val added: Map<UUID, AddedStatus> fun getAddedStatus(uuid: UUID): AddedStatus fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean - fun isBanned(uuid: UUID): Boolean - fun isAllowed(uuid: UUID): Boolean - fun canBuild(player: Player): Boolean + + fun compareAndSetAddedStatus(uuid: UUID, expect: AddedStatus, status: AddedStatus): Boolean = + (getAddedStatus(uuid) == expect).also { if (it) setAddedStatus(uuid, status) } + + fun isAllowed(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.ALLOWED + fun allow(uuid: UUID) = setAddedStatus(uuid, AddedStatus.ALLOWED) + fun disallow(uuid: UUID) = compareAndSetAddedStatus(uuid, AddedStatus.ALLOWED, AddedStatus.DEFAULT) + fun isBanned(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.BANNED + fun ban(uuid: UUID) = setAddedStatus(uuid, AddedStatus.BANNED) + fun unban(uuid: UUID) = compareAndSetAddedStatus(uuid, AddedStatus.BANNED, AddedStatus.DEFAULT) + + fun isAllowed(player: OfflinePlayer) = isAllowed(player.uuid) + fun allow(player: OfflinePlayer) = allow(player.uuid) + fun disallow(player: OfflinePlayer) = disallow(player.uuid) + fun isBanned(player: OfflinePlayer) = isBanned(player.uuid) + fun ban(player: OfflinePlayer) = ban(player.uuid) + fun unban(player: OfflinePlayer) = unban(player.uuid) +} + +interface ParcelData : AddedData { + var owner: ParcelOwner? + + fun canBuild(player: OfflinePlayer, checkAdmin: Boolean = true, checkGlobal: Boolean = true): Boolean var allowInteractInputs: Boolean var allowInteractInventory: Boolean @@ -23,7 +45,6 @@ interface ParcelData { fun isOwner(uuid: UUID): Boolean { return owner?.uuid == uuid } - } /** @@ -58,7 +79,7 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData { 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: Player) = data.canBuild(player) + override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = data.canBuild(player) override var owner: ParcelOwner? get() = data.owner @@ -94,20 +115,19 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData { var hasBlockVisitors: Boolean = false; private set } -class ParcelDataHolder : ParcelData { +open class AddedDataHolder : AddedData { override var added = mutableMapOf<UUID, AddedStatus>() - override var owner: ParcelOwner? = null - override fun getAddedStatus(uuid: UUID): AddedStatus = added.getOrDefault(uuid, AddedStatus.DEFAULT) override fun setAddedStatus(uuid: UUID, status: AddedStatus): Boolean = status.takeIf { it != AddedStatus.DEFAULT } ?.let { added.put(uuid, it) != it } ?: added.remove(uuid) != null +} - override fun isBanned(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.BANNED - override fun isAllowed(uuid: UUID) = getAddedStatus(uuid) == AddedStatus.ALLOWED - override fun canBuild(player: Player) = isAllowed(player.uniqueId) - || owner?.matches(player, allowNameMatch = false) ?: false - || player.hasBuildAnywhere +class ParcelDataHolder : AddedDataHolder(), ParcelData { + override var owner: ParcelOwner? = null + override fun canBuild(player: OfflinePlayer, checkAdmin: Boolean, checkGlobal: Boolean) = isAllowed(player.uniqueId) + || owner.let { it != null && it.matches(player, allowNameMatch = false) } + || (checkAdmin && player is Player && player.hasBuildAnywhere) override var allowInteractInputs = true override var allowInteractInventory = true @@ -144,14 +164,14 @@ class ParcelOwner(val uuid: UUID? = null, if (name != null) this.name = name else { - val offlinePlayer = Bukkit.getOfflinePlayer(uuid).takeIf { it.isOnline() || it.hasPlayedBefore() } + val offlinePlayer = Bukkit.getOfflinePlayer(uuid).takeIf { it.isValid } this.name = offlinePlayer?.name } } val playerName get() = getPlayerName(uuid, name) - fun matches(player: Player, allowNameMatch: Boolean = false): Boolean { + fun matches(player: OfflinePlayer, allowNameMatch: Boolean = false): Boolean { return uuid?.let { it == player.uniqueId } ?: false || (allowNameMatch && name?.let { it == player.name } ?: false) } @@ -162,5 +182,5 @@ class ParcelOwner(val uuid: UUID? = null, @Suppress("DEPRECATION") val offlinePlayer get() = (uuid?.let { Bukkit.getOfflinePlayer(it) } ?: Bukkit.getOfflinePlayer(name)) - ?.takeIf { it.isOnline() || it.hasPlayedBefore() } + ?.takeIf { it.isValid } } |