From 6be77e9f08b963f7ca27132ee8318a2c43dc5f9a Mon Sep 17 00:00:00 2001 From: Fortern Date: Tue, 18 Feb 2025 03:09:21 +0800 Subject: [PATCH] init 11 --- .../kotlin/xyz/fortern/minehunt/Console.kt | 56 +++++++++++-------- .../fortern/minehunt/command/TestCommand.kt | 20 ++++++- .../minehunt/listener/PlayerListener.kt | 12 ++++ 3 files changed, 65 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index 92f7ba9..4916fe9 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -17,6 +17,7 @@ import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitTask import org.bukkit.scoreboard.Team import xyz.fortern.minehunt.rule.RuleItem +import java.util.* import java.util.concurrent.ConcurrentHashMap /** @@ -61,6 +62,11 @@ class Console { */ private val spectatorSet: MutableSet = HashSet() + /** + * 淘汰玩家集合 + */ + private val outPlayers: MutableSet = HashSet() + /** * 终止游戏的投票统计 */ @@ -360,7 +366,7 @@ class Console { // 统计参与投票的玩家 speedrunnerSet.forEach { // 生存模式的速通者统计进来 - if (it.isOnline && it.gameMode == GameMode.SURVIVAL) { + if (it.isOnline && !outPlayers.contains(it.uniqueId)) { votingEndMap[it.name] = false } } @@ -386,29 +392,31 @@ class Console { } // 投票完成,游戏结束 Bukkit.getOnlinePlayers().forEach { - it.sendMessage(Component.text("投票完成,游戏结束", NamedTextColor.GOLD)) + it.sendMessage(Component.text("--------投票完成--------", NamedTextColor.GOLD)) } - end() + end(null) } /** * 结束处理 */ - private fun end() { - // TODO 延迟传送至出生点 - - // 取消剩余的复活任务 - val iterator = hunterRespawnTasks.iterator() - while (iterator.hasNext()) { - iterator.next().value.cancel() - iterator.remove() - } - // 所有人传送至出生点,设为生存模式 - Bukkit.getOnlinePlayers().forEach { - it.gameMode = GameMode.SURVIVAL - it.teleport(overworld.spawnLocation) - } + fun end(winner: String?) { stage = GameStage.OVER + // 所有人设为生存模式 + Bukkit.getOnlinePlayers().forEach { + it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN)) + if (winner != null) { + it.sendMessage(Component.text("获胜者:$winner", NamedTextColor.GOLD)) + } else { + it.sendMessage(Component.text("没有赢家", NamedTextColor.GOLD)) + } + it.gameMode = GameMode.SURVIVAL + } + // 取消剩余的复活任务 + hunterRespawnTasks.forEach { + it.value.cancel() + } + hunterRespawnTasks.clear() } /** @@ -429,7 +437,7 @@ class Console { j++ j %= speedrunnerList.size val speedrunner = speedrunnerList[i] - if (speedrunner.gameMode == GameMode.SURVIVAL && speedrunner.isOnline || i == j) { + if (!outPlayers.contains(speedrunner.uniqueId) && speedrunner.isOnline || i == j) { trackRunnerMap[playerName] = j break } @@ -440,11 +448,15 @@ class Console { * 处理玩家死亡 */ fun handlePlayerDeath(player: Player) { - if (isHunter(player)) { - // 猎人置为旁观者模式 + if (isSpeedrunner(player)) { + // 速通者置为旁观者模式,加入淘汰名单 player.gameMode = GameMode.SPECTATOR - } else if (isSpeedrunner(player)) { - // 猎人置为旁观者模式 + outPlayers.add(player.uniqueId) + if (outPlayers.size == hunterSet.size) { + end("hunter") + } + } else if (isHunter(player)) { + // 猎人置为旁观者模式,稍后复活 player.gameMode = GameMode.SPECTATOR val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { player.gameMode = GameMode.SURVIVAL diff --git a/src/main/kotlin/xyz/fortern/minehunt/command/TestCommand.kt b/src/main/kotlin/xyz/fortern/minehunt/command/TestCommand.kt index 8fe95ce..d073490 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/command/TestCommand.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/command/TestCommand.kt @@ -2,9 +2,13 @@ package xyz.fortern.minehunt.command import net.kyori.adventure.text.Component import org.bukkit.Bukkit +import org.bukkit.Material import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender +import org.bukkit.enchantments.Enchantment +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack /** * 开发过程中的测试命令 @@ -39,7 +43,21 @@ class TestCommand : CommandExecutor { else sender.sendMessage("玩家 $name 不存在") } + // 获得32k + "get32k" -> { + if (sender is Player) { + sender.give( + // 锋利等级被限制为255 + ItemStack(Material.DIAMOND_SWORD).apply { + this.addUnsafeEnchantment( + Enchantment.SHARPNESS, + 32000 + ) + } + ) + } + } } return true } -} \ No newline at end of file +} diff --git a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt index c55cf29..52e22ad 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt @@ -1,8 +1,10 @@ package xyz.fortern.minehunt.listener import org.bukkit.GameMode +import org.bukkit.entity.EnderDragon import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityDeathEvent import org.bukkit.event.entity.PlayerDeathEvent import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerJoinEvent @@ -74,4 +76,14 @@ class PlayerListener( console.handlePlayerDeath(player) } + /** + * 末影龙死亡事件 + */ + @EventHandler + fun onDragonDeath(event: EntityDeathEvent) { + if (event.entity is EnderDragon && console.stage == GameStage.PROCESSING) { + console.end("speedrunner") + } + } + }