diff --git a/build.gradle.kts b/build.gradle.kts index 4e0693a..a283686 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "xyz.lncvrt" -version = "1.0.1" +version = "1.0.2" repositories { mavenCentral() @@ -20,6 +20,8 @@ repositories { dependencies { compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") 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 diff --git a/src/main/kotlin/xyz/lncvrt/galaxytab/GalaxyTab.kt b/src/main/kotlin/xyz/lncvrt/galaxytab/GalaxyTab.kt index 12f486c..c9867f2 100644 --- a/src/main/kotlin/xyz/lncvrt/galaxytab/GalaxyTab.kt +++ b/src/main/kotlin/xyz/lncvrt/galaxytab/GalaxyTab.kt @@ -3,26 +3,42 @@ package xyz.lncvrt.galaxytab import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.configuration.file.FileConfiguration +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 java.lang.String class GalaxyTab : JavaPlugin(), Listener { private val miniMessage = MiniMessage.miniMessage() - private var configFile: FileConfiguration? = null + var configFile: FileConfiguration? = null override fun onEnable() { + instance = this saveDefaultConfig() configFile = config server.pluginManager.registerEvents(this, this) + GalaxyTabCommand() } @EventHandler fun onPlayerJoinEvent(event: PlayerJoinEvent) { - val header: Component = miniMessage.deserialize(String.join("\n", config.getStringList("header"))) - val footer: Component = miniMessage.deserialize(String.join("\n", config.getStringList("footer"))) - event.getPlayer().sendPlayerListHeaderAndFooter(header, footer) + setTab(event.player) + } + + 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 + } } } diff --git a/src/main/kotlin/xyz/lncvrt/galaxytab/commands/GalaxyTabCommand.kt b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/GalaxyTabCommand.kt new file mode 100644 index 0000000..7896e0c --- /dev/null +++ b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/GalaxyTabCommand.kt @@ -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) { + builder.handler { context -> + val sender = context.sender().platformSender() + val miniMessage = MiniMessage.miniMessage() + + sender.sendMessage(miniMessage.deserialize("GalaxyTab by Lncvrt")) + } + } + + 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("GalaxyTab has been reloaded!")) + } + } + } +} diff --git a/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitCommand.kt b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitCommand.kt new file mode 100644 index 0000000..07f5732 --- /dev/null +++ b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitCommand.kt @@ -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 +) { + private val manager = LegacyPaperCommandManager( + plugin, + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create({ commandSender: CommandSender -> BukkitSender(commandSender) }, { bukkitSender: BukkitSender -> bukkitSender.platformSender() }) + ) + private val command: MutableCommandBuilder + + 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) { } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitSender.kt b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitSender.kt new file mode 100644 index 0000000..511a5ce --- /dev/null +++ b/src/main/kotlin/xyz/lncvrt/galaxytab/commands/api/BukkitSender.kt @@ -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 + } +} \ No newline at end of file