Add a reload command for Config

This commit is contained in:
2025-04-02 23:10:16 -07:00
parent 48c608b77b
commit f8eef33127
5 changed files with 139 additions and 5 deletions

View File

@@ -5,7 +5,7 @@ plugins {
} }
group = "xyz.lncvrt" group = "xyz.lncvrt"
version = "1.0.1" version = "1.0.2"
repositories { repositories {
mavenCentral() mavenCentral()
@@ -20,6 +20,8 @@ repositories {
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") 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")
} }
val targetJavaVersion = 17 val targetJavaVersion = 17

View File

@@ -3,26 +3,42 @@ package xyz.lncvrt.galaxytab
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.MiniMessage import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.configuration.file.FileConfiguration import org.bukkit.configuration.file.FileConfiguration
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.plugin.java.JavaPlugin import org.bukkit.plugin.java.JavaPlugin
import xyz.lncvrt.galaxytab.commands.GalaxyTabCommand
import java.lang.String import java.lang.String
class GalaxyTab : JavaPlugin(), Listener { class GalaxyTab : JavaPlugin(), Listener {
private val miniMessage = MiniMessage.miniMessage() private val miniMessage = MiniMessage.miniMessage()
private var configFile: FileConfiguration? = null var configFile: FileConfiguration? = null
override fun onEnable() { override fun onEnable() {
instance = this
saveDefaultConfig() saveDefaultConfig()
configFile = config configFile = config
server.pluginManager.registerEvents(this, this) server.pluginManager.registerEvents(this, this)
GalaxyTabCommand()
} }
@EventHandler @EventHandler
fun onPlayerJoinEvent(event: PlayerJoinEvent) { fun onPlayerJoinEvent(event: PlayerJoinEvent) {
val header: Component = miniMessage.deserialize(String.join("\n", config.getStringList("header"))) setTab(event.player)
val footer: Component = miniMessage.deserialize(String.join("\n", config.getStringList("footer"))) }
event.getPlayer().sendPlayerListHeaderAndFooter(header, footer)
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")))
player.sendPlayerListHeaderAndFooter(header, footer)
}
companion object {
private lateinit var instance: GalaxyTab
fun getInstance(): GalaxyTab {
return instance
}
} }
} }

View File

@@ -0,0 +1,37 @@
package xyz.lncvrt.galaxytab.commands
import net.kyori.adventure.text.minimessage.MiniMessage
import org.incendo.cloud.kotlin.MutableCommandBuilder
import xyz.lncvrt.galaxytab.GalaxyTab
import xyz.lncvrt.galaxytab.commands.api.BukkitCommand
import xyz.lncvrt.galaxytab.commands.api.BukkitSender
class GalaxyTabCommand : BukkitCommand(GalaxyTab.getInstance(), "galaxytab", arrayOf("tab")) {
override fun rootBuilder(builder: MutableCommandBuilder<BukkitSender>) {
builder.handler { context ->
val sender = context.sender().platformSender()
val miniMessage = MiniMessage.miniMessage()
sender.sendMessage(miniMessage.deserialize("<rainbow>GalaxyTab</rainbow> <light_purple>by Lncvrt</light_purple>"))
}
}
init {
rawCommandBuilder().registerCopy {
literal("reload")
permission("${GalaxyTab.getInstance().name.lowercase()}.reload")
handler { context ->
val sender = context.sender().platformSender()
val miniMessage = MiniMessage.miniMessage()
val instance = GalaxyTab.getInstance()
instance.saveDefaultConfig()
instance.reloadConfig()
instance.configFile = instance.config
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,38 @@
package xyz.lncvrt.galaxytab.commands.api
import org.bukkit.command.CommandSender
import org.bukkit.plugin.java.JavaPlugin
import org.incendo.cloud.SenderMapper
import org.incendo.cloud.description.Description
import org.incendo.cloud.execution.ExecutionCoordinator
import org.incendo.cloud.kotlin.MutableCommandBuilder
import org.incendo.cloud.kotlin.extension.buildAndRegister
import org.incendo.cloud.kotlin.extension.commandBuilder
import org.incendo.cloud.paper.LegacyPaperCommandManager
import org.incendo.cloud.setting.ManagerSetting
abstract class BukkitCommand(
plugin: JavaPlugin,
private val name: String,
private val aliases: Array<String>
) {
private val manager = LegacyPaperCommandManager(
plugin,
ExecutionCoordinator.simpleCoordinator(),
SenderMapper.create({ commandSender: CommandSender -> BukkitSender(commandSender) }, { bukkitSender: BukkitSender -> bukkitSender.platformSender() })
)
private val command: MutableCommandBuilder<BukkitSender>
init {
manager.settings().set(ManagerSetting.OVERRIDE_EXISTING_COMMANDS, true)
// manager.registerAsynchronousCompletions()
command = manager.buildAndRegister(name, Description.empty(), aliases) {
rootBuilder(this)
}
}
fun rawCommandBuilder() = manager.commandBuilder(name, Description.empty(), aliases) { }
open fun rootBuilder(builder: MutableCommandBuilder<BukkitSender>) { }
}

View File

@@ -0,0 +1,41 @@
package xyz.lncvrt.galaxytab.commands.api
import net.kyori.adventure.audience.Audience
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.TextColor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
open class BukkitSender(
private var commandSender: CommandSender,
) {
private var onlinePlayersMessage = Component.text("Only players can use this command.")
.color(TextColor.color(192, 32, 16))
.asComponent()
fun player(): Player? {
if (commandSender is Player) return (commandSender as Player)
if (onlinePlayersMessage != Component.empty()) {
commandSender.sendMessage(onlinePlayersMessage)
}
return null
}
fun audience(): Audience {
return commandSender
}
fun platformSender(): CommandSender {
return commandSender
}
fun platformSender(commandSender: CommandSender) {
this.commandSender = commandSender
}
fun onlyPlayersComponent(onlinePlayersMessage: Component) {
this.onlinePlayersMessage = onlinePlayersMessage
}
}