diff --git a/build.gradle.kts b/build.gradle.kts index 0cb9dad9d..7cef26e30 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,6 +20,9 @@ allprojects { maven("https://repo.codemc.io/repository/maven-releases/") { name = "CodeMC" } + maven("https://repo.extendedclip.com/releases/") { + name = "PlaceholderAPI" + } } } diff --git a/rebar/build.gradle.kts b/rebar/build.gradle.kts index e50a1b9bf..6d303eb20 100644 --- a/rebar/build.gradle.kts +++ b/rebar/build.gradle.kts @@ -1,4 +1,5 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription +import net.minecrell.pluginyml.paper.PaperPluginDescription import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode plugins { @@ -41,6 +42,7 @@ dependencies { paperLibraryApi("xyz.xenondevs.invui:invui:2.0.0-beta.5") paperLibraryApi("xyz.xenondevs.invui:invui-kotlin:2.0.0-beta.5") + compileOnly("me.clip:placeholderapi:2.12.2") implementation("com.github.Tofaa2.EntityLib:spigot:2.4.11") implementation("com.github.retrooper:packetevents-spigot:2.11.2") implementation("info.debatty:java-string-similarity:2.0.0") @@ -163,6 +165,13 @@ paper { authors = listOf("Rebar team") apiVersion = minecraftVersion load = BukkitPluginDescription.PluginLoadOrder.STARTUP + + serverDependencies { + register("PlaceholderAPI") { + load = PaperPluginDescription.RelativeLoadOrder.BEFORE + required = false + } + } } tasks.withType { diff --git a/rebar/src/main/kotlin/io/github/pylonmc/rebar/Rebar.kt b/rebar/src/main/kotlin/io/github/pylonmc/rebar/Rebar.kt index 4cb2dd53e..966dfbf02 100644 --- a/rebar/src/main/kotlin/io/github/pylonmc/rebar/Rebar.kt +++ b/rebar/src/main/kotlin/io/github/pylonmc/rebar/Rebar.kt @@ -47,6 +47,7 @@ import io.github.pylonmc.rebar.resourcepack.armor.ArmorTextureEngine import io.github.pylonmc.rebar.util.delayTicks import io.github.pylonmc.rebar.util.mergeGlobalConfig import io.github.pylonmc.rebar.waila.Waila +import io.github.pylonmc.rebar.waila.WailaPlaceholders import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder import io.papermc.paper.ServerBuildInfo import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents @@ -258,6 +259,9 @@ object Rebar : JavaPlugin(), RebarAddon { if (RebarConfig.WailaConfig.ENABLED) { pm.registerEvents(Waila, this) + if (pm.getPlugin("PlaceholderAPI") != null) { + WailaPlaceholders.register() + } } if (RebarConfig.ArmorTextureConfig.ENABLED) { diff --git a/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/Waila.kt b/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/Waila.kt index 5e563a68e..e9a93d6fc 100644 --- a/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/Waila.kt +++ b/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/Waila.kt @@ -58,23 +58,32 @@ class Waila private constructor(private val player: Player, playerConfig: Player RebarConfig.WailaConfig.DEFAULT_DISPLAY.overlay ) + var lastText: Component? = null + private set + var lastColor: BossBar.Color? = null + private set + var lastOverlay: BossBar.Overlay? = null + private set + var lastProgress: Float? = null + private set + private var wasVisible = false; private fun send(display: WailaDisplay) { + val color = if (display.color in RebarConfig.WailaConfig.ALLOWED_BOSS_BAR_COLORS) { + display.color + } else { + RebarConfig.WailaConfig.DEFAULT_DISPLAY.color + } + val overlay = if (display.overlay in RebarConfig.WailaConfig.ALLOWED_BOSS_BAR_OVERLAYS) { + display.overlay + } else { + RebarConfig.WailaConfig.DEFAULT_DISPLAY.overlay + } + when (config.type) { Type.BOSSBAR -> { player.hideBossBar(bossBar) - val color = if (display.color in RebarConfig.WailaConfig.ALLOWED_BOSS_BAR_COLORS) { - display.color - } else { - RebarConfig.WailaConfig.DEFAULT_DISPLAY.color - } - val overlay = if (display.overlay in RebarConfig.WailaConfig.ALLOWED_BOSS_BAR_OVERLAYS) { - display.overlay - } else { - RebarConfig.WailaConfig.DEFAULT_DISPLAY.overlay - } - bossBar.name(display.text) bossBar.color(color) bossBar.overlay(overlay) @@ -83,6 +92,11 @@ class Waila private constructor(private val player: Player, playerConfig: Player } Type.ACTIONBAR -> player.sendActionBar(display.text) } + + lastText = display.text + lastColor = color + lastOverlay = overlay + lastProgress = display.progress wasVisible = true } @@ -95,6 +109,10 @@ class Waila private constructor(private val player: Player, playerConfig: Player Type.BOSSBAR -> player.hideBossBar(bossBar) Type.ACTIONBAR -> player.sendActionBar(Component.empty()) } + lastText = null + lastColor = null + lastOverlay = null + lastProgress = null wasVisible = false } @@ -195,6 +213,11 @@ class Waila private constructor(private val player: Player, playerConfig: Player private val blockOverrides = mutableMapOf WailaDisplay?>() private val entityOverrides = mutableMapOf WailaDisplay?>() + @JvmStatic + fun getWaila(player: Player): Waila? { + return wailas[player.uniqueId] + } + /** * Forcibly adds a WAILA display for the given player. */ diff --git a/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/WailaPlaceholders.kt b/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/WailaPlaceholders.kt new file mode 100644 index 000000000..fcb3e1db3 --- /dev/null +++ b/rebar/src/main/kotlin/io/github/pylonmc/rebar/waila/WailaPlaceholders.kt @@ -0,0 +1,35 @@ +package io.github.pylonmc.rebar.waila + +import io.github.pylonmc.rebar.i18n.customMiniMessage +import io.github.pylonmc.rebar.util.plainText +import io.github.pylonmc.rebar.waila.WailaPlaceholders.placeholders +import me.clip.placeholderapi.expansion.PlaceholderExpansion +import net.kyori.adventure.bossbar.BossBar +import org.bukkit.OfflinePlayer +import org.bukkit.entity.Player + +object WailaPlaceholders : PlaceholderExpansion() { + @JvmField + val placeholders: List = listOf("text", "plain_text", "color", "overlay", "progress") + + override fun onRequest(player: OfflinePlayer?, params: String): String? { + if (player == null || player !is Player) return null + val waila = Waila.getWaila(player) ?: return null + return when(params) { + "text" -> waila.lastText?.let { customMiniMessage.serialize(it) } ?: "" + "plain_text" -> waila.lastText?.plainText ?: "" + "color" -> waila.lastColor?.let { BossBar.Color.NAMES.key(it) } ?: "" + "overlay" -> waila.lastOverlay?.let { BossBar.Overlay.NAMES.key(it) } ?: "" + "progress" -> waila.lastProgress?.toString() ?: "" + else -> null + } + } + + override fun getPlaceholders(): List = placeholders + + override fun getIdentifier(): String = "rebarwaila" + + override fun getAuthor(): String = "Rebar" + + override fun getVersion(): String = "1.0.0" +} \ No newline at end of file