diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5cbd396..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Project exclude paths -/.gradle/ -/build/ -/build/classes/kotlin/main/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index d390bd5..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml deleted file mode 100644 index 104c42f..0000000 --- a/.idea/discord.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index f2c1963..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index 5c8730f..0000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index ae05034..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index a8af73e..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/TagsX.main.iml b/.idea/modules/TagsX.main.iml deleted file mode 100644 index bbeeb3e..0000000 --- a/.idea/modules/TagsX.main.iml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - PAPER - ADVENTURE - - 1 - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 9f9d561..2ef9495 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - kotlin("jvm") version "2.1.20-RC" + kotlin("jvm") version "2.1.20-Beta2" id("com.gradleup.shadow") version "9.0.0-beta8" } diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/TagsX.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/TagsX.kt index 9f85fcf..03f495c 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/TagsX.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/TagsX.kt @@ -1,22 +1,32 @@ package pl.syntaxdevteam.tagsx +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import org.bukkit.command.CommandSender import org.bukkit.plugin.java.JavaPlugin import pl.syntaxdevteam.tagsx.commands.CommandManager +import pl.syntaxdevteam.tagsx.data.TagList import pl.syntaxdevteam.tagsx.gui.TagsGui import pl.syntaxdevteam.tagsx.listeners.PlayerJoinListener import pl.syntaxdevteam.tagsx.placeholders.TagPlaceholder import pl.syntaxdevteam.tagsx.storage.TagStorage class TagsX : JavaPlugin() { + val tagStorage = TagStorage(this) private val commandManager = CommandManager(this) + val mm = MiniMessage.miniMessage() + + companion object { + val PREFIX = MiniMessage.miniMessage().deserialize("[TagsX] ") + } + override fun onEnable() { saveDefaultConfig() - tagStorage.loadTags() - - commandManager.registerCommands(this) + TagList.loadTags(this) + commandManager.registerCommands() server.pluginManager.registerEvents(PlayerJoinListener(this), this) server.pluginManager.registerEvents(TagsGui(this), this) @@ -32,4 +42,9 @@ class TagsX : JavaPlugin() { tagStorage.saveTags() logger.info("🛑 TagsX został wyłączony.") } -} \ No newline at end of file + + fun sendMessageWithPrefix(receiver: CommandSender, message: String) { + val formattedMessage = LegacyComponentSerializer.legacySection().serialize(PREFIX) + message + receiver.sendMessage(formattedMessage) + } +} diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/CommandManager.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/CommandManager.kt index 12924ed..c36475b 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/CommandManager.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/CommandManager.kt @@ -1,27 +1,63 @@ package pl.syntaxdevteam.tagsx.commands -import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.command.Command import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import org.bukkit.command.defaults.BukkitCommand import org.bukkit.entity.Player import pl.syntaxdevteam.tagsx.TagsX import pl.syntaxdevteam.tagsx.gui.TagsGui class CommandManager(private val plugin: TagsX) { - private val mm = MiniMessage.miniMessage() private val gui = TagsGui(plugin) - fun registerCommands(plugin: TagsX) { - plugin.server.commandMap.register("tagsx", object : org.bukkit.command.Command("tags") { + fun registerCommands() { + val tagsCommand = object : BukkitCommand("tags") { override fun execute(sender: CommandSender, label: String, args: Array): Boolean { - if (sender is Player) { - gui.open(sender) // ✅ Otwiera GUI + if (sender !is Player) { + sender.sendMessage("§cTa komenda jest tylko dla graczy!") + return false + } + gui.open(sender) + return true + } + } + + val tagsxCommand = object : BukkitCommand("tagsx"), TabCompleter { + override fun execute(sender: CommandSender, label: String, args: Array): Boolean { + if (args.isEmpty() || args[0].lowercase() != "reload") { + sender.sendMessage("§cUżycie: /tagsx reload") + return true + } + + if (!sender.hasPermission("tagsx.reload")) { + if (sender is Player) { + plugin.sendMessageWithPrefix(sender, "§cNie masz uprawnień do tej komendy!") + } else { + sender.sendMessage("§cNie masz uprawnień do tej komendy!") + } return true } - sender.sendMessage(mm.deserialize("Ta komenda jest tylko dla graczy!")) - return false + plugin.reloadConfig() + plugin.sendMessageWithPrefix(sender, "§aPlugin TagsX został poprawnie przeładowany!") + return true } - }) + + override fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array + ): MutableList { + return if (args.size == 1) { + mutableListOf("reload").filter { it.startsWith(args[0], ignoreCase = true) }.toMutableList() + } else mutableListOf() + } + } + + plugin.server.commandMap.register("tags", tagsCommand) + plugin.server.commandMap.register("tagsx", tagsxCommand) } } diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/ReloadCommand.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/ReloadCommand.kt new file mode 100644 index 0000000..bf00c8f --- /dev/null +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/ReloadCommand.kt @@ -0,0 +1,23 @@ +package pl.syntaxdevteam.tagsx.commands + +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player +import pl.syntaxdevteam.tagsx.TagsX + +class ReloadCommand(private val plugin: TagsX) : CommandExecutor { + + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (sender is Player) { + plugin.sendMessageWithPrefix(sender, "§cNie masz dostępu do tej komendy!") + } else { + sender.sendMessage("§cTę komendę może wykonać tylko gracz!") + } + + + plugin.reloadConfig() + plugin.sendMessageWithPrefix(sender, "§aPlugin TagsX został poprawnie przeładowany!") + return true + } +} diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/TagsCommand.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/TagsCommand.kt index 7ebb49c..b084d0a 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/TagsCommand.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/commands/TagsCommand.kt @@ -11,15 +11,14 @@ import pl.syntaxdevteam.tagsx.gui.TagsGui class TagsCommand(private val plugin: TagsX) : CommandExecutor { private val gui = TagsGui(plugin) - private val mm = MiniMessage.miniMessage() override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { if (sender is Player) { - gui.open(sender) // ✅ Otwieranie GUI + gui.open(sender) return true } - sender.sendMessage(mm.deserialize("Tę komendę może użyć tylko gracz!")) + plugin.sendMessageWithPrefix(sender, "Tę komendę może użyć tylko gracz!") return false } } diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/data/TagList.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/data/TagList.kt index 5356e98..341feb5 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/data/TagList.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/data/TagList.kt @@ -1,18 +1,25 @@ package pl.syntaxdevteam.tagsx.data import org.bukkit.Material +import pl.syntaxdevteam.tagsx.TagsX object TagList { - val tags = listOf( - TagItem(Material.RED_DYE, "§cWojownik§r"), - TagItem(Material.BLUE_DYE, "§dMag§r"), - TagItem(Material.BLACK_DYE, "§0Mroczny§r"), - TagItem(Material.YELLOW_DYE, "§bBłyskawica§r"), - TagItem(Material.PURPLE_DYE, "§6Król§r"), - TagItem(Material.GREEN_DYE, "§aSzczęściarz§r") + val tags = mutableListOf() - ) + fun loadTags(plugin: TagsX) { + tags.clear() + val config = plugin.config.getConfigurationSection("tags") ?: return + + for (key in config.getKeys(false)) { + val display = config.getString("tags.$key.display") ?: continue + val material = Material.matchMaterial(config.getString("tags.$key.material") ?: "NAME_TAG") ?: Material.NAME_TAG + + tags.add(TagItem(material, display)) + } + plugin.logger.info("✅ Załadowano ${tags.size} tagów z config.yml!") + } } -// §§§ data class TagItem(val material: Material, val name: String) + +// §§§ diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/gui/TagsGui.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/gui/TagsGui.kt index 2eda492..6cb70bc 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/gui/TagsGui.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/gui/TagsGui.kt @@ -9,41 +9,84 @@ import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack import pl.syntaxdevteam.tagsx.TagsX -import pl.syntaxdevteam.tagsx.data.TagList +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer class TagsGui(private val plugin: TagsX) : Listener { + private val legacySerializer = LegacyComponentSerializer.legacySection() + fun open(player: Player) { - val gui: Inventory = Bukkit.createInventory(null, 27, "Wybierz swój tag") + val availableTags = plugin.config.getConfigurationSection("tags")?.getKeys(false) + ?.filter { tag -> + val permission = plugin.config.getString("tags.$tag.permission") + permission == null || player.hasPermission(permission) // Sprawdzanie uprawnień + } ?: return + + // Zmieniamy wielkość GUI, żeby pasowała do ilości dostępnych tagów + val guiSize = 9 * ((availableTags.size / 9) + 1) + val gui: Inventory = Bukkit.createInventory(null, guiSize, "Wybierz swój tag") + + // Tworzymy przedmioty dla każdego tagu + availableTags.forEachIndexed { index, tagKey -> + val tagDisplayName = plugin.config.getString("tags.$tagKey.display") ?: "§7[$tagKey]" + val tagMaterial = Material.matchMaterial(plugin.config.getString("tags.$tagKey.material") ?: "STONE") ?: Material.STONE - TagList.tags.forEachIndexed { index, tagItem -> - gui.setItem(11 + index, createTagItem(tagItem.material, tagItem.name)) + // Tworzymy przedmiot tagu + gui.setItem(index, createTagItem(tagMaterial, tagKey, player)) } + // Otwieramy GUI dla gracza player.openInventory(gui) } - private fun createTagItem(material: Material, tagName: String): ItemStack { + // Funkcja do tworzenia przedmiotu z tagiem + private fun createTagItem(material: Material, tagKey: String, player: Player): ItemStack { val item = ItemStack(material) - val meta = item.itemMeta!! - meta.setDisplayName("§7TAG: §r[$tagName]") - item.itemMeta = meta + val meta = item.itemMeta?.clone() // Tworzymy kopię, aby uniknąć modyfikacji oryginału + + // Pobieramy nazwę tagu z konfiguracji + val tagDisplayName = plugin.config.getString("tags.$tagKey.display") ?: "[Brak]" + + // Ustawiamy nazwę przedmiotu w formacie: [TAG] Nick + val fullDisplayName = "§f[$tagDisplayName§f] §r${player.name}" // Zmieniliśmy z player.displayName na player.name + + if (meta != null) { + meta.setDisplayName(fullDisplayName) + + // Dodanie opisu przedmiotu + meta.lore = listOf("§7Naciśnij, aby ustawić ten tag") + + item.itemMeta = meta + } + return item } @EventHandler fun onInventoryClick(event: InventoryClickEvent) { + // Sprawdzamy, czy to kliknięcie dotyczy okna wyboru tagu if (event.view.title != "Wybierz swój tag") return - event.isCancelled = true + event.isCancelled = true // Anulujemy domyślne zachowanie kliknięcia val player = event.whoClicked as Player val clickedItem = event.currentItem ?: return - val selectedTag = TagList.tags.find { it.material == clickedItem.type } ?: return + // Sprawdzamy, który tag został kliknięty + val selectedTag = plugin.config.getConfigurationSection("tags")?.getKeys(false) + ?.find { tagKey -> + val tagMaterial = Material.matchMaterial(plugin.config.getString("tags.$tagKey.material") ?: "STONE") + tagMaterial == clickedItem.type + } ?: return - plugin.tagStorage.setTag(player.name, selectedTag.name) + // Ustawiamy tag gracza + val tagDisplay = plugin.config.getString("tags.$selectedTag.display") ?: "[Brak]" + plugin.tagStorage.setTag(player.name, tagDisplay) plugin.tagStorage.saveTags() - player.sendMessage("§aTwój nowy tag: §f[${selectedTag.name}]") + + // Wysyłamy wiadomość do gracza z prefiksem + plugin.sendMessageWithPrefix(player, "§aTwój nowy tag: §f$tagDisplay") + + // Zamykamy GUI player.closeInventory() } -} +} \ No newline at end of file diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/listeners/PlayerJoinListener.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/listeners/PlayerJoinListener.kt index f37dbdd..e9e0d74 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/listeners/PlayerJoinListener.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/listeners/PlayerJoinListener.kt @@ -1,8 +1,5 @@ package pl.syntaxdevteam.tagsx.listeners -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.TextColor -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerJoinEvent @@ -12,16 +9,11 @@ class PlayerJoinListener(private val plugin: TagsX) : Listener { @EventHandler fun onJoin(event: PlayerJoinEvent) { val player = event.player - val tag = plugin.tagStorage.getTag(player.name) ?: "Gracz" + val tag = plugin.tagStorage.getTag(player.name) ?: plugin.config.getString("settings.default-tag", "none") + val displayName = "$tag §r${player.name}" - val displayComponent = Component.text("[$tag] ${player.name}") - - - val legacyDisplayName = LegacyComponentSerializer.legacySection().serialize(displayComponent) - - player.customName = legacyDisplayName - var playerListName = legacyDisplayName - player.setDisplayName(legacyDisplayName) + player.setDisplayName(displayName) + player.setPlayerListName(displayName) } -} +} \ No newline at end of file diff --git a/src/main/kotlin/pl/syntaxdevteam/tagsx/placeholders/TagPlaceholder.kt b/src/main/kotlin/pl/syntaxdevteam/tagsx/placeholders/TagPlaceholder.kt index a2d4d65..9919220 100644 --- a/src/main/kotlin/pl/syntaxdevteam/tagsx/placeholders/TagPlaceholder.kt +++ b/src/main/kotlin/pl/syntaxdevteam/tagsx/placeholders/TagPlaceholder.kt @@ -22,8 +22,13 @@ class TagPlaceholder(private val plugin: TagsX) : PlaceholderExpansion() { override fun onRequest(player: OfflinePlayer?, @NotNull params: String): String? { if (player == null) return null + return when (params.lowercase()) { - "tag" -> plugin.tagStorage.getTag(player.name ?: "") ?: "" + "tag" -> { + val tag = plugin.tagStorage.getTag(player.name ?: "") ?: "" + if (tag.isNotEmpty()) "§f[§r$tag§f]§r" else "" + + } else -> null } } @@ -31,4 +36,4 @@ class TagPlaceholder(private val plugin: TagsX) : PlaceholderExpansion() { override fun onPlaceholderRequest(player: Player, @NotNull params: String): String? { return onRequest(player as OfflinePlayer, params) } -} +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f8e47cb..33d98eb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,24 +1,25 @@ -# Configuracja pluginu TagsX -settings: - prefix: "&6[TagsX] " # Prefiks wiadomości - default-tag: "none" # Domyślny tag dla nowych graczy - enable-default-tag: false # Czy przypisywać domyślny tag? +# If you want to add your own tags, here is a pattern: +# name1: +# display-name: "§bname1" +# display: "§bNAME1" +# material: "BLUE_DYE" +# permission: "tagsx.tag.name1" +# +# name2: +# display-name: "§dNAME2" +# display: "§dNAME2" +# material: "BLACK_DYE" +# permission: "tagsx.tag.name2" +# ---------------------------------------- tags: - admin: - display: "&c[Admin]" - permission: "tagsx.tag.admin" - moderator: - display: "&b[Mod]" - permission: "tagsx.tag.moderator" - vip: - display: "&6[VIP]" - permission: "tagsx.tag.vip" + syntaxdevteam: + display-name: "§bSyntaxDevTeam" + display: "§bSyntaxDevTeam" + material: "BLUE_DYE" + permission: "tag.syntaxdevteam" + -messages: - no-permission: "&cNie masz uprawnień do tej komendy!" - tag-changed: "&aZmieniono twój tag na: %tag%" - invalid-tag: "&cNie znaleziono takiego taga!" database: type: "sqlite" # "mysql" lub "sqlite"