Add PlaceholderAPI support

This commit is contained in:
2025-04-03 01:21:31 -07:00
parent f8eef33127
commit 82c23476b5
7 changed files with 169 additions and 21 deletions

View File

@@ -2,4 +2,4 @@
Static MiniMessage based tablist plugin for servers like Auth and Limbo in Galaxy Network!
Placeholders not supported, this is designed to be the most lightweight it can possibily be.
Placeholders are now supported, you can choose to enable or disable that though

View File

@@ -5,7 +5,7 @@ plugins {
}
group = "xyz.lncvrt"
version = "1.0.2"
version = "1.1.0"
repositories {
mavenCentral()
@@ -15,10 +15,14 @@ repositories {
maven("https://oss.sonatype.org/content/groups/public/") {
name = "sonatype"
}
maven("https://repo.extendedclip.com/releases/") {
name = "placeholderapi"
}
}
dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.6")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.incendo:cloud-paper:2.0.0-beta.10")
implementation("org.incendo:cloud-kotlin-extensions:2.0.0")
@@ -34,10 +38,10 @@ tasks.build {
}
tasks.processResources {
val props = mapOf("version" to version)
val props = mapOf("version" to project.version)
inputs.properties(props)
filteringCharset = "UTF-8"
filesMatching("plugin.yml") {
filesMatching(listOf("paper-plugin.yml", "config.yml")) {
expand(props)
}
}

View File

@@ -1,39 +1,147 @@
package xyz.lncvrt.galaxytab
import me.clip.placeholderapi.PlaceholderAPI
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.plugin.java.JavaPlugin
import xyz.lncvrt.galaxytab.commands.GalaxyTabCommand
import xyz.lncvrt.galaxytab.events.PlayerJoinEventListener
import java.io.File
import java.io.InputStreamReader
import java.lang.String
import kotlin.Exception
import kotlin.Int
import kotlin.Suppress
import kotlin.let
class GalaxyTab : JavaPlugin(), Listener {
private val miniMessage = MiniMessage.miniMessage()
var configFile: FileConfiguration? = null
var mainConfig: FileConfiguration? = null
var usePlaceholderAPI = false
var placeholderTask: Int? = null
override fun onEnable() {
instance = this
saveDefaultConfig()
configFile = config
server.pluginManager.registerEvents(this, this)
logger.info("Loading plugin")
//misc
loadConfig()
//events
server.pluginManager.registerEvents(PlayerJoinEventListener(), this)
//commands
GalaxyTabCommand()
if (usePlaceholderAPI) {
startPlaceholderTask()
}
}
@EventHandler
fun onPlayerJoinEvent(event: PlayerJoinEvent) {
setTab(event.player)
fun loadConfig() {
if (!dataFolder.exists()) {
dataFolder.mkdirs()
}
val configFile = File(dataFolder, "config.yml")
if (!configFile.exists()) {
saveResource(configFile.name, false)
logger.info("${configFile.name} doesn't exist, creating it...")
}
mainConfig = YamlConfiguration()
mainConfig?.load(configFile)
updateYamlFile(configFile)
logger.info("Loaded config!")
hookPlaceholderAPI()
}
fun hookPlaceholderAPI() {
if (mainConfig?.getBoolean("placeholderapi-hook") == true) {
if (server.pluginManager.isPluginEnabled("PlaceholderAPI")) {
usePlaceholderAPI = true
logger.info("Hooked into PlaceholderAPI!")
} else {
logger.warning("Failed to hook into PlaceholderAPI")
}
} else {
usePlaceholderAPI = false
}
}
fun setTab(player: Player) {
val header: Component = miniMessage.deserialize(String.join("\n", configFile?.getStringList("header")))
val footer: Component = miniMessage.deserialize(String.join("\n", configFile?.getStringList("footer")))
val headerRaw = String.join("\n", mainConfig?.getStringList("header") ?: listOf())
val footerRaw = String.join("\n", mainConfig?.getStringList("footer") ?: listOf())
val header: Component = miniMessage.deserialize(if (usePlaceholderAPI) PlaceholderAPI.setPlaceholders(player, headerRaw) else headerRaw)
val footer: Component = miniMessage.deserialize(if (usePlaceholderAPI) PlaceholderAPI.setPlaceholders(player, footerRaw) else footerRaw)
player.sendPlayerListHeaderAndFooter(header, footer)
}
fun updateYamlFile(file: File) {
@Suppress("DEPRECATION") val pluginVersion = description.version
val oldConfig = YamlConfiguration()
if (file.exists()) {
try {
oldConfig.load(file)
} catch (e: Exception) {
e.printStackTrace()
return
}
}
var configVersion = oldConfig.getString("config-version")
if (configVersion == pluginVersion) return
val defaultConfigStream = getResource(file.name) ?: return
val defaultConfig = YamlConfiguration()
try {
defaultConfig.load(InputStreamReader(defaultConfigStream))
} catch (e: Exception) {
e.printStackTrace()
return
}
for (key in defaultConfig.getKeys(true)) {
if (oldConfig.contains(key)) {
defaultConfig.set(key, oldConfig.get(key))
}
}
defaultConfig.set("config-version", pluginVersion)
defaultConfig.save(file)
if (file.name == "config.yml") mainConfig = defaultConfig
if (configVersion == null) configVersion = "n/a (Legacy)"
logger.info("Updated ${file.name} from $configVersion to $pluginVersion")
}
fun startPlaceholderTask() {
stopTask()
val delay = mainConfig?.getLong("placeholder-update-delay", 500) ?: 500
val validDelay = if (delay == 0L) 500L else maxOf(delay / 50, 1)
placeholderTask = server.scheduler.runTaskTimer(this, Runnable {
for (player in server.onlinePlayers) {
setTab(player)
}
}, 0L, validDelay).taskId
}
fun restartTask() {
startPlaceholderTask()
}
fun stopTask() {
placeholderTask?.let { server.scheduler.cancelTask(it) }
}
companion object {
private lateinit var instance: GalaxyTab

View File

@@ -25,10 +25,13 @@ class GalaxyTabCommand : BukkitCommand(GalaxyTab.getInstance(), "galaxytab", arr
val miniMessage = MiniMessage.miniMessage()
val instance = GalaxyTab.getInstance()
instance.saveDefaultConfig()
instance.reloadConfig()
instance.configFile = instance.config
instance.loadConfig()
if (instance.usePlaceholderAPI) {
instance.restartTask()
} else {
instance.stopTask()
for (player in instance.server.onlinePlayers) instance.setTab(player)
}
sender.sendMessage(miniMessage.deserialize("<rainbow>GalaxyTab</rainbow> <light_purple>has been reloaded!</light_purple>"))
}

View File

@@ -0,0 +1,13 @@
package xyz.lncvrt.galaxytab.events
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import xyz.lncvrt.galaxytab.GalaxyTab
class PlayerJoinEventListener : Listener {
@EventHandler
fun onPlayerJoinEvent(event: PlayerJoinEvent) {
GalaxyTab.getInstance().setTab(event.player)
}
}

View File

@@ -1,4 +1,19 @@
config-version: '${version}' # Don't touch :)
##########################################################################
# Header and Footer
##########################################################################
header:
- "Header"
- "Header content"
footer:
- "Footer"
- "Footer content"
##########################################################################
# Placeholders
##########################################################################
# Weather we should enable PlaceholderAPI hook, if found on the server
placeholderapi-hook: false
# The delay between updating Placeholders in tab, if enabled
placeholder-update-delay: 500 # 500 = 0.5s

View File

@@ -2,3 +2,8 @@ name: GalaxyTab
version: '${version}'
main: xyz.lncvrt.galaxytab.GalaxyTab
api-version: '1.20'
dependencies:
server:
PlaceholderAPI:
load: BEFORE
required: false