diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index edf3483..be02153 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -5,6 +5,7 @@ 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 import org.bukkit.Difficulty import org.bukkit.GameMode @@ -245,21 +246,30 @@ class Console { * 加入猎人阵营 */ fun joinHunter(player: Player) { - hunterTeam.addEntry(player.name) + if (stage == GameStage.PREPARING && beginningCountdown == null) { + hunterTeam.addEntry(player.name) + player.sendMessage(Component.text("你已加入[猎人]")) + } } /** * 加入速通者阵营 */ fun joinSpeedrunner(player: Player) { - speedrunnerTeam.addEntry(player.name) + if (stage == GameStage.PREPARING && beginningCountdown == null) { + speedrunnerTeam.addEntry(player.name) + player.sendMessage(Component.text("你已加入[速通者]")) + } } /** * 加入观察者阵营 */ fun joinSpectator(player: Player) { - spectatorTeam.addEntry(player.name) + if (stage == GameStage.PREPARING && beginningCountdown == null) { + spectatorTeam.addEntry(player.name) + player.sendMessage(Component.text("你已加入[观众]")) + } } /** @@ -286,7 +296,8 @@ class Console { Bukkit.getOnlinePlayers().forEach { val title = Title.title( Component.text(countdown.toString(), NamedTextColor.DARK_PURPLE), - Component.text("开始倒计时", NamedTextColor.GRAY) + Component.text("开始倒计时", NamedTextColor.GRAY), + Title.Times.times(Ticks.duration(5), Ticks.duration(20), Ticks.duration(5)) ) it.showTitle(title) } @@ -311,6 +322,10 @@ class Console { * 游戏阶段由 PREPARING 变为 PROCESSING */ private fun start() { + // 速通者更改为生存模式,并加入speedrunnerList + speedrunnerTeam.entries.forEach { entry -> + Bukkit.getPlayer(entry)?.let { speedrunnerSet.add(it.uniqueId) } + } if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner") // 修改游戏规则 @@ -321,6 +336,7 @@ class Console { world.setGameRule(GameRule.KEEP_INVENTORY, false) world.setGameRule(GameRule.SPAWN_RADIUS, 10) world.difficulty = Difficulty.HARD + overworld.worldBorder.size = 9999999.0 val spawnLocation = world.spawnLocation @@ -337,12 +353,9 @@ class Console { // 速通者更改为生存模式,并加入speedrunnerList speedrunnerTeam.entries.forEach { entry -> - Bukkit.getPlayer(entry)?.let { - speedrunnerSet.add(it.uniqueId) - it.gameMode = GameMode.SURVIVAL - } + Bukkit.getPlayer(entry)?.let { it.gameMode = GameMode.SURVIVAL } } - speedrunnerSet.toList() + speedrunnerList = speedrunnerSet.toList() // 将猎人传送到世界底部,且指南针开始有所指向 hunterTeam.entries.forEach { entry -> @@ -387,6 +400,7 @@ class Console { } }, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L) + stage = GameStage.PROCESSING } /** @@ -536,7 +550,7 @@ class Console { playerListName.style(Style.style(TextDecoration.STRIKETHROUGH)) player.playerListName(playerListName) // 如给所有hunter都淘汰,则游戏结束 - if (outPlayers.size == hunterSet.size) { + if (outPlayers.size == speedrunnerSet.size) { end("hunter") } } else if (isHunter(player)) { diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt index 650d38f..46b5b9e 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/command/MinehuntCommand.kt @@ -17,7 +17,7 @@ class MinehuntCommand( private val console: Console ) : TabExecutor { - private val subCommands: List = listOf("help", "join", "leave", "rule", "stat", "stop") + private val subCommands: List = listOf("help", "join", "leave", "rule", "start", "stop") private val teams: List = listOf("hunter", "speedrunner", "spectator") private val rules: List = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire") @@ -276,9 +276,12 @@ class MinehuntCommand( private fun onStart(sender: CommandSender, flag: Boolean): List? { if (flag) { if (console.stage == Console.GameStage.PREPARING) { - console.tryStart() + val result = console.tryStart() + if (result.isNotEmpty()) { + sender.sendMessage(Component.text("游戏开始失败,原因:${result}", NamedTextColor.RED)) + } } else { - sender.sendMessage("游戏已经开始或已经结束") + sender.sendMessage(Component.text("游戏已经开始或已经结束")) } } return null diff --git a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt index ea5383f..4cbe43e 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt @@ -29,8 +29,6 @@ class PlayerListener( if (stage == GameStage.PREPARING && console.beginningCountdown == null) { // 在准备阶段,玩家设为冒险模式 player.gameMode = GameMode.ADVENTURE - // 重置队伍信息 - player.scoreboard.teams.forEach { it.removeEntry(player.name) } // 自动加入观察者队伍 console.spectatorTeam.addEntry(player.name) } @@ -40,15 +38,17 @@ class PlayerListener( * 参与游戏的玩家在倒计时阶段退出,则中断倒计时 */ @EventHandler - fun onPlayerJoin(event: PlayerQuitEvent) { + fun onPlayerQuit(event: PlayerQuitEvent) { val player = event.player val stage = console.stage - if (stage == GameStage.PREPARING - && console.beginningCountdown != null - && (console.isHunter(player) || console.isSpeedrunner(player)) - ) { - console.interruptCountdownToStart() + if (stage == GameStage.PREPARING) { + // 重置队伍信息 + player.scoreboard.teams.forEach { it.removeEntry(player.name) } + if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) { + console.interruptCountdownToStart() + } } + } /**