diff --git a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt index b0ae69a..abc3cb3 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/SpeedHG.kt @@ -4,6 +4,7 @@ import club.mcscrims.speedhg.client.LunarClientManager import club.mcscrims.speedhg.combat.KnockbackListener import club.mcscrims.speedhg.command.HelpCommand import club.mcscrims.speedhg.command.KitCommand +import club.mcscrims.speedhg.command.KitInfoCommand import club.mcscrims.speedhg.command.LeaderboardCommand import club.mcscrims.speedhg.command.PerksCommand import club.mcscrims.speedhg.command.RankingCommand @@ -270,6 +271,16 @@ class SpeedHG : JavaPlugin() { tabCompleter = kitCommand } + val kitInfoCommand = KitInfoCommand() + getCommand( "kitinfo" )?.apply { + setExecutor( kitInfoCommand ) + tabCompleter = kitInfoCommand + } + getCommand( "perkinfo" )?.apply { + setExecutor( kitInfoCommand ) + tabCompleter = kitInfoCommand + } + val timerCommand = TimerCommand( this ) getCommand( "timer" )?.apply { setExecutor( timerCommand ) diff --git a/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt b/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt index 8c9d563..8e49cfe 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/command/KitCommand.kt @@ -38,8 +38,13 @@ class KitCommand : CommandExecutor, TabCompleter { if ( state == GameState.ENDING ) return true - val ingame = state == GameState.INVINCIBILITY || - state == GameState.INGAME + val ingame = state == GameState.INGAME + + if ( state == GameState.INVINCIBILITY && selectedKit != null ) + { + player.sendMsg( "commands.kit.alreadySelected", mapOf(), "name" to selectedKit.displayName ) + return true + } if ( ingame && !isBackup ) { diff --git a/src/main/kotlin/club/mcscrims/speedhg/command/KitInfoCommand.kt b/src/main/kotlin/club/mcscrims/speedhg/command/KitInfoCommand.kt new file mode 100644 index 0000000..f2a8c9c --- /dev/null +++ b/src/main/kotlin/club/mcscrims/speedhg/command/KitInfoCommand.kt @@ -0,0 +1,117 @@ +package club.mcscrims.speedhg.command + +import club.mcscrims.speedhg.SpeedHG +import club.mcscrims.speedhg.util.sendMsg +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import org.bukkit.entity.Player + +/** + * ## KitInfoCommand + * + * Zeigt den Namen und die Beschreibung eines Kits oder Perks im Chat an. + * + * ## Verwendung + * | Command | Alias | Beschreibung | + * |---|---|---| + * | `/kitinfo ` | `/perkinfo ` | Zeigt Name + Lore des Kits/Perks | + * + * ## Lookup-Reihenfolge + * 1. Suche in `kitManager` (case-insensitive auf `kit.id`) + * 2. Falls nicht gefunden, suche in `perkManager` + * 3. Falls immer noch nicht gefunden, sende Fehlermeldung + */ +class KitInfoCommand : CommandExecutor, TabCompleter +{ + + private val plugin get() = SpeedHG.instance + private val mm = MiniMessage.miniMessage() + + override fun onCommand( + sender: CommandSender, + command: Command, + label: String, + args: Array + ): Boolean + { + val player = sender as? Player ?: run { + sender.sendMessage( "§cOnly players can execute this command." ) + return true + } + + if ( args.isEmpty() ) + { + player.sendMsg( "commands.kitinfo.usage" ) + return true + } + + val query = args[0].lowercase() + + // ── 1. Kit-Lookup ───────────────────────────────────────────────────── + val kit = plugin.kitManager.getKit( query ) + if ( kit != null ) + { + sendKitInfo( player, kit.displayName, kit.lore ) + return true + } + + // ── 2. Perk-Lookup ──────────────────────────────────────────────────── + val perk = plugin.perkManager.getPerk( query ) + if ( perk != null ) + { + sendKitInfo( player, perk.displayName, perk.lore ) + return true + } + + // ── 3. Nicht gefunden ───────────────────────────────────────────────── + player.sendMsg( "commands.kitinfo.notFound", "name" to args[0] ) + return true + } + + // ── Formatierungs-Helfer ────────────────────────────────────────────────── + + private fun sendKitInfo( + player: Player, + displayName: Component, + lore: List + ) { + val separator = mm.deserialize( plugin.languageManager.getRawMessage( player, "commands.kitinfo.separator" ) ) + val header = mm.deserialize( plugin.languageManager.getRawMessage( player, "commands.kitinfo.header" ) ) + + player.sendMessage( separator ) + player.sendMessage( header.append( displayName ) ) + + lore.forEach { line -> + player.sendMessage( mm.deserialize( line ) ) + } + + player.sendMessage( separator ) + } + + // ── Tab-Completion ──────────────────────────────────────────────────────── + + override fun onTabComplete( + sender: CommandSender, + command: Command, + label: String, + args: Array + ): List + { + if ( args.size != 1 ) + return emptyList() + + val input = args[0].lowercase() + + val kitIds = plugin.kitManager.getRegisteredKits().map { it.id } + val perkIds = plugin.perkManager.getRegisteredPerks().map { it.id } + + return ( kitIds + perkIds ) + .filter { it.startsWith( input ) } + .sorted() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt b/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt index 36e9113..2b39558 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt @@ -273,14 +273,11 @@ class GameStateListener : Listener { fun onPickupItem( event: PlayerAttemptPickupItemEvent ) { - val player = event.player - if ( gameManager.currentState == GameState.INVINCIBILITY || gameManager.currentState == GameState.INGAME ) return event.isCancelled = true - player.playSound( player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 1f, 1f ) } private val swordNerf = 0.75 diff --git a/src/main/resources/languages/en_US.yml b/src/main/resources/languages/en_US.yml index 7012e8a..6305d1f 100644 --- a/src/main/resources/languages/en_US.yml +++ b/src/main/resources/languages/en_US.yml @@ -148,12 +148,13 @@ team: commands: kit: - usage: 'Usage: /kit ' - kitNotFound: ' is not a registered kit!' - playstyleNotFound: ' is not an available playstyle!' - gameHasStarted: 'The game has already started. You cannot select a kit right now!' - cannotPickSameKit: 'You cannot pick the same kit!' - selected: 'You have selected as your Kit with playstyle !' + usage: 'Usage: /kit ' + kitNotFound: ' is not a registered kit!' + playstyleNotFound: ' is not an available playstyle!' + gameHasStarted: 'The game has already started. You cannot select a kit right now!' + cannotPickSameKit: 'You cannot pick the same kit!' + alreadySelected: 'You have already selected as a kit!' + selected: 'You have selected as your Kit with playstyle !' leaderboard: header: '====== Leaderboard ======' empty: 'There are currently no stats' @@ -173,6 +174,11 @@ commands: rank_usage: 'Usage: /ranking rank ' player_not_found: 'Player is not online.' rank_info: 'Player ( RR · games)' + kitinfo: + usage: 'Usage: /kitinfo ' + notFound: 'Kit/Perk not found.' + separator: '──────────────────────' + header: '[] ' help: message: '━━━━━ SpeedHG Help ━━━━━ Discord: discord.gg/HyZV4CdUgV Store: https://mcscrims.club /msg /r /report /leaderboard /team ━━━━━ SpeedHG Help ━━━━━' @@ -601,6 +607,7 @@ kits: # ── BlackPanther (neue Defensive-Leap Fähigkeit aus vorherigem Fix) ───────── blackpanther: + name: 'Black Panther' # Lore-Zeile für DEF aktualisieren: lore: - ' ' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 500bf50..14551e5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -41,4 +41,8 @@ commands: permission: speedhg.admin.ranking perks: description: 'Perk-Auswahl öffnen' - usage: '/perks' \ No newline at end of file + usage: '/perks' + kitinfo: + description: 'Shows the name and description of a kit or perk' + usage: '/kitinfo ' + aliases: [ perkinfo ] \ No newline at end of file