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"