package net.hareworks.ghostdisplays.api import net.hareworks.ghostdisplays.api.audience.AudienceAction import net.hareworks.ghostdisplays.api.audience.AudiencePredicate import net.hareworks.ghostdisplays.api.click.ClickPriority import net.hareworks.ghostdisplays.api.click.DisplayClickHandler import net.hareworks.ghostdisplays.api.click.HandlerRegistration import net.hareworks.ghostdisplays.internal.fake.FakeBlockDisplay import net.hareworks.ghostdisplays.internal.fake.FakeDisplay import net.hareworks.ghostdisplays.internal.fake.FakeItemDisplay import net.hareworks.ghostdisplays.internal.fake.FakeTextDisplay import org.bukkit.Location import org.bukkit.entity.Player import java.util.UUID interface DisplayController { val entityId: Int val displayType: DisplayType val location: Location fun show(player: Player) fun hide(player: Player) fun isViewing(playerId: UUID): Boolean fun viewerIds(): Set fun updateText(mutator: (FakeTextDisplay) -> Unit) fun updateBlock(mutator: (FakeBlockDisplay) -> Unit) fun updateItem(mutator: (FakeItemDisplay) -> Unit) fun updateDisplay(mutator: (FakeDisplay) -> Unit) fun teleport(location: Location) fun setBaseVisibility(visible: Boolean) fun addAudience(predicate: AudiencePredicate): HandlerRegistration fun addAudienceRule(predicate: AudiencePredicate, action: AudienceAction): HandlerRegistration fun clearAudienceRules() fun refreshAudience(target: Player? = null) fun needsPeriodicUpdate(): Boolean = false fun destroy() fun onClick(priority: ClickPriority = ClickPriority.NORMAL, handler: DisplayClickHandler): HandlerRegistration }