From 009545a4708d7b6ec06ab854472da5ad7e1b1e4a Mon Sep 17 00:00:00 2001 From: Fortern Date: Mon, 24 Feb 2025 03:34:56 +0800 Subject: [PATCH] init 23 --- .../kotlin/xyz/fortern/minehunt/Console.kt | 26 ++++---- .../minehunt/command/MinehuntCommand.kt | 59 ++++++++++++++++--- .../minehunt/listener/PlayerListener.kt | 16 +++-- 3 files changed, 76 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index b0f1e1b..77ea69a 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -3,8 +3,6 @@ package xyz.fortern.minehunt import net.kyori.adventure.text.Component import net.kyori.adventure.text.TextComponent import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.Style -import net.kyori.adventure.text.format.TextDecoration import net.kyori.adventure.title.Title import net.kyori.adventure.util.Ticks import org.bukkit.Bukkit @@ -517,9 +515,9 @@ class Console { val speedrunner = Bukkit.getPlayer(uuid) if (!outPlayers.contains(uuid) && speedrunner != null) { trackRunnerMap[hunter.uniqueId] = j - val location = speedrunner.location // hunter操作指南针时立即刷新位置 refreshCompassTrack(hunter, speedrunner) + hunter.sendActionBar(Component.text("指向 ${speedrunner.name}")) break } } @@ -529,12 +527,11 @@ class Console { * 使hunter的指南针指向此时speedrunner的位置 */ private fun refreshCompassTrack(hunter: Player, speedrunner: Player) { - val items = hunter.inventory.all(hunterCompass) - items.firstNotNullOf { (_, itemStack) -> - val lore = itemStack.lore() - if (lore.isNullOrEmpty()) return@firstNotNullOf + val items = hunter.inventory.all(Material.COMPASS) + items.firstNotNullOfOrNull { (_, itemStack) -> + if (itemStack.lore().isNullOrEmpty()) return@firstNotNullOfOrNull - val component = lore[0] + val component = itemStack.lore()!![0] if (component is TextComponent && component.content() == compassFlag) { // 让指南针指向某一个猎人 val meta = itemStack.itemMeta as CompassMeta @@ -557,10 +554,6 @@ class Console { // 速通者置为旁观者模式,加入淘汰名单 player.gameMode = GameMode.SPECTATOR outPlayers.add(uuid) - // 给淘汰的玩家名字上加删除线 - val playerListName = player.playerListName() - playerListName.style(Style.style(TextDecoration.STRIKETHROUGH)) - player.playerListName(playerListName) // 如给所有hunter都淘汰,则游戏结束 if (outPlayers.size == speedrunnerSet.size) { Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { end("Hunter") }, 0) @@ -632,6 +625,15 @@ class Console { } } + /** + * 给予猎人追踪指南针 + */ + fun giveCompassIfNeed(player: Player) { + if (stage == GameStage.PROCESSING && isHunter(player)) { + player.give(hunterCompass) + } + } + /** * 游戏阶段 */ diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt index 46b5b9e..598433d 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt @@ -17,9 +17,10 @@ class MinehuntCommand( private val console: Console ) : TabExecutor { - private val subCommands: List = listOf("help", "join", "leave", "rule", "start", "stop") + private val subCommands: List = listOf("help", "join", "leave", "rule", "start", "stop", "give") private val teams: List = listOf("hunter", "speedrunner", "spectator") private val rules: List = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire") + private val items: List = listOf("compass") private val helpMessages = listOf( Component.text("Minehunt v${Minehunt.instance().pluginMeta.version}", NamedTextColor.GREEN), @@ -29,18 +30,20 @@ class MinehuntCommand( .append(Component.text("加入一个阵营", NamedTextColor.WHITE)), Component.text("/minehunt leave ", NamedTextColor.GOLD) .append(Component.text("加入观察者阵营", NamedTextColor.WHITE)), - Component.text("/minehunt rule ", NamedTextColor.GOLD) + Component.text("/minehunt rule ", NamedTextColor.GOLD) .append(Component.text("查看或修改游戏规则", NamedTextColor.WHITE)), Component.text("/minehunt start ", NamedTextColor.GOLD) .append(Component.text("开始游戏", NamedTextColor.WHITE)), Component.text("/minehunt stop ", NamedTextColor.GOLD) - .append(Component.text("进行中止游戏的投票", NamedTextColor.WHITE)) + .append(Component.text("进行中止游戏的投票", NamedTextColor.WHITE)), + Component.text("/minehunt give ", NamedTextColor.GOLD) + .append(Component.text("给予游戏中所需的特殊物品", NamedTextColor.WHITE)), ) private val ruleHelpMessages = listOf( Component.text("/minehunt rule ", NamedTextColor.GREEN) .append(Component.text("查看一项规则的详情", NamedTextColor.WHITE)), Component.text("/minehunt rule ", NamedTextColor.GREEN) - .append(Component.text("为一项规则设置新的值", NamedTextColor.WHITE)) + .append(Component.text("为一项规则设置新的值", NamedTextColor.WHITE)), ) /** @@ -112,6 +115,10 @@ class MinehuntCommand( onStop(sender, flag) } + "give" -> { + onGive(sender, args, flag) + } + else -> { if (flag) { sender.sendMessage(Component.text("错误的子命令")) @@ -301,14 +308,50 @@ class MinehuntCommand( return null } + /** + * 给予玩家特殊物品 + */ + private fun onGive(sender: CommandSender, args: List, flag: Boolean): List? { + // args[0] == give + if (args.size == 1) { + if (flag) { + sender.sendMessage("缺少参数") + } + return null + } + + val item = args[1] + if (flag) { + if (sender !is Player) { + sender.sendMessage(Component.text("The sender is not a player.", NamedTextColor.RED)) + return null + } + when (item) { + "compass" -> { + console.giveCompassIfNeed(sender) + } + + else -> { + sender.sendMessage(Component.text("输入正确的队伍名称", NamedTextColor.RED)) + } + } + return null + } else { + if (args.size == 2) { + return items.filter { it.startsWith(item) } + } + } + return null + } + /** * 发送规则详情 */ private fun sendRuleInfo(sender: CommandSender, ruleKey: RuleKey<*>) { - sender.sendMessage("游戏规则: " + ruleKey.name) - sender.sendMessage("描述: " + ruleKey.info) - sender.sendMessage("值类型: " + ruleKey.typeInfo) - sender.sendMessage("数值: " + console.gameRules.getRuleValue(ruleKey)) + sender.sendMessage(Component.text("游戏规则: ${ruleKey.name}")) + sender.sendMessage(Component.text("描述: ${ruleKey.info}")) + sender.sendMessage(Component.text("值类型: ${ruleKey.typeInfo}")) + sender.sendMessage(Component.text("数值: ${console.gameRules.getRuleValue(ruleKey)}")) } /** diff --git a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt index ae5d9be..8ad52cd 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt @@ -12,6 +12,7 @@ import org.bukkit.event.player.PlayerMoveEvent import org.bukkit.event.player.PlayerPortalEvent import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.event.player.PlayerTeleportEvent +import org.spigotmc.event.player.PlayerSpawnLocationEvent import xyz.fortern.minehunt.Console import xyz.fortern.minehunt.Console.GameStage @@ -25,8 +26,7 @@ class PlayerListener( @EventHandler fun onPlayerJoin(event: PlayerJoinEvent) { val player = event.player - val stage = console.stage - if (stage == GameStage.PREPARING && console.beginningCountdown == null) { + if (console.stage == GameStage.PREPARING && console.beginningCountdown == null) { // 在准备阶段,玩家设为冒险模式 player.gameMode = GameMode.ADVENTURE // 自动加入观察者队伍 @@ -40,15 +40,21 @@ class PlayerListener( @EventHandler fun onPlayerQuit(event: PlayerQuitEvent) { val player = event.player - val stage = console.stage - if (stage == GameStage.PREPARING) { + if (console.stage == GameStage.PREPARING) { if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) { console.interruptCountdownToStart() } // 将离开的玩家从team中移除 player.scoreboard.teams.forEach { it.removePlayer(player) } } - + } + + /** + * 猎人重生时给予追踪指南针 + */ + @EventHandler + fun onPlayerSpawn(event: PlayerSpawnLocationEvent) { + console.giveCompassIfNeed(event.player) } /**