GhostDisplays/main/kotlin/net/hareworks/ghostdisplays/display/ManagedDisplay.kt
2025-12-06 04:40:18 +09:00

90 lines
2.6 KiB
Kotlin

package net.hareworks.ghostdisplays.display
import java.time.Instant
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import net.hareworks.ghostdisplays.api.DisplayController
import net.hareworks.ghostdisplays.api.click.HandlerRegistration
import net.kyori.adventure.text.Component
import org.bukkit.Location
import org.bukkit.block.data.BlockData
import org.bukkit.entity.BlockDisplay
import org.bukkit.entity.Display
import org.bukkit.entity.ItemDisplay
import org.bukkit.entity.TextDisplay
import org.bukkit.inventory.ItemStack
enum class DisplayKind {
TEXT,
BLOCK,
ITEM
}
data class AudienceBinding(
val key: String,
val description: String,
private val registration: HandlerRegistration
) {
fun unregister() {
registration.unregister()
}
}
sealed class ManagedDisplay<T : Display>(
val id: String,
val kind: DisplayKind,
val controller: DisplayController<T>,
location: Location,
val createdAt: Instant,
val createdBy: UUID?
) {
val location: Location = location.clone()
private val audienceBindings = ConcurrentHashMap<String, AudienceBinding>()
fun audienceBindings(): Collection<AudienceBinding> = audienceBindings.values
fun registerAudienceBinding(binding: AudienceBinding) {
audienceBindings.put(binding.key, binding)?.unregister()
}
fun removeAudienceBinding(key: String): Boolean {
return audienceBindings.remove(key)?.let {
it.unregister()
true
} ?: false
}
fun clearAudiences() {
audienceBindings.values.forEach { it.unregister() }
audienceBindings.clear()
}
class Text(
id: String,
controller: DisplayController<TextDisplay>,
location: Location,
createdAt: Instant,
createdBy: UUID?,
var rawContent: String,
var component: Component
) : ManagedDisplay<TextDisplay>(id, DisplayKind.TEXT, controller, location, createdAt, createdBy)
class Block(
id: String,
controller: DisplayController<BlockDisplay>,
location: Location,
createdAt: Instant,
createdBy: UUID?,
var blockData: BlockData
) : ManagedDisplay<BlockDisplay>(id, DisplayKind.BLOCK, controller, location, createdAt, createdBy)
class Item(
id: String,
controller: DisplayController<ItemDisplay>,
location: Location,
createdAt: Instant,
createdBy: UUID?,
var itemStack: ItemStack
) : ManagedDisplay<ItemDisplay>(id, DisplayKind.ITEM, controller, location, createdAt, createdBy)
}