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 | 88 |
1 files changed, 65 insertions, 23 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt index 16136e9..db5d193 100644 --- a/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt +++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/ParcelImpl.kt @@ -3,59 +3,84 @@ package io.dico.parcels2.defaultimpl import io.dico.parcels2.* import io.dico.parcels2.Privilege.* import io.dico.parcels2.util.ext.alsoIfTrue +import io.dico.parcels2.util.isServerThread import io.dico.parcels2.util.math.Vec2i import org.bukkit.Material import org.joda.time.DateTime -import java.util.concurrent.atomic.AtomicInteger +import java.lang.IllegalStateException -class ParcelImpl( +class ParcelImpl ( override val world: ParcelWorld, override val x: Int, override val z: Int ) : Parcel, ParcelId { - override val id: ParcelId = this + override val id: ParcelId get() = this override val pos get() = Vec2i(x, z) - override var data: ParcelDataHolder = ParcelDataHolder(); private set - override val hasBlockVisitors get() = blockVisitors.get() > 0 + override var data = ParcelDataHolder(); 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(newData: ParcelDataHolder, callerIsDatabase: Boolean) { + if (callerIsDatabase) { + data = newData + return + } - override fun copyData(data: ParcelData) { - copyDataIgnoringDatabase(data) - world.storage.setParcelData(this, data) - } + val ownerChanged = owner != newData.owner + if (ownerChanged) { + updateOwnerSign(true, false, true) + } - override fun dispose() { - copyDataIgnoringDatabase(ParcelDataHolder()) - world.storage.setParcelData(this, null) - } + val ownerSignWasOutdated = if (callerIsDatabase) newData.isOwnerSignOutdated else isOwnerSignOutdated + val ownerChanged = owner != newData.owner + + data = newData + + if (ownerChanged && isServerThread()) { + updateOwnerSign(true, false, updateDatabase = callerIsDatabase) + } else { + newData.isOwnerSignOutdated = ownerChanged || ownerSignWasOutdated + } + + world.storage.setParcelData(this, data) + } 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 + updateOwnerSign(true, false, true) } } override val lastClaimTime: DateTime? get() = data.lastClaimTime - override var ownerSignOutdated: Boolean - get() = data.ownerSignOutdated + override var isOwnerSignOutdated: Boolean + get() = data.isOwnerSignOutdated set(value) { - if (data.ownerSignOutdated != value) { + if (data.isOwnerSignOutdated != value) { world.storage.setParcelOwnerSignOutdated(this, value) - data.ownerSignOutdated = value + data.isOwnerSignOutdated = value } } + override fun updateOwnerSign(force: Boolean) { + updateOwnerSign(false, force, true) + } + + private fun updateOwnerSign(ownerChanged: Boolean, force: Boolean, updateDatabase: Boolean) { + if (!ownerChanged && !isOwnerSignOutdated && !force) return + + val update = force || world.blockManager.isParcelInfoSectionLoaded(this) + if (update) world.blockManager.updateParcelInfo(this, owner) + + if (updateDatabase) isOwnerSignOutdated = !update + else data.isOwnerSignOutdated = !update + } + override val privilegeMap: PrivilegeMap get() = data.privilegeMap @@ -106,7 +131,24 @@ class ParcelImpl( } } + override val hasBlockVisitors: Boolean + get() = permit != null + private var permit: Permit? = null + + fun acquireBlockVisitorPermit(with: Permit): Boolean { + if (permit === with) return true + if (permit != null) return false + permit = with + return true + } + + fun releaseBlockVisitorPermit(with: Permit) { + if (permit !== with) throw IllegalStateException() + permit = null + } + + /* private var blockVisitors = AtomicInteger(0) override suspend fun withBlockVisitorPermit(block: suspend () -> Unit) { @@ -116,9 +158,9 @@ class ParcelImpl( } finally { blockVisitors.getAndDecrement() } - } + }*/ - override fun toString() = toStringExt() + override fun toString() = parcelIdToString() override val infoString: String get() = getInfoString() |