From c2d46988f400e45869bfb36538cbde0eeb0b1790 Mon Sep 17 00:00:00 2001 From: Fortern Date: Sat, 22 Feb 2025 20:32:15 +0800 Subject: [PATCH] init 16 --- .../kotlin/xyz/fortern/minehunt/Console.kt | 39 +++++++++++++++++-- .../minehunt/listener/PlayerListener.kt | 26 ++++++++++++- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index 7f581d8..f15b3a0 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -47,7 +47,12 @@ class Console { /** * 主世界 */ - private var overworld = Bukkit.getWorld("world")!! + val overworld = Bukkit.getWorld("world")!! + + /** + * 下界 + */ + val nether = Bukkit.getWorld("world_nether")!! /** * 速通者队伍 @@ -101,6 +106,16 @@ class Console { */ private lateinit var speedrunnerList: List + /** + * 玩家离开主世界时最后的位置 + */ + private val playerLocInWorld: MutableMap = HashMap() + + /** + * 玩家离开下界时最后的位置 + */ + private val playerLocInNether: MutableMap = HashMap() + /** * 猎人持有的指南针指向的速通者在speedrunnerList中的index */ @@ -133,13 +148,13 @@ class Console { itemMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, false) } + // bukkit task start + /** * 猎人重生Task,保留这些引用方便在游戏结束时取消这些任务 */ private val hunterRespawnTasks: MutableMap = HashMap() - // bukkit task start - /** * 游戏开始前的倒计时任务 */ @@ -354,7 +369,7 @@ class Console { it.inventory.addItem(hunterCompass) } - // 自动更新指南针任务开始运行 + // “自动更新指南针”任务开始运行 compassRefreshTask = compassTask.runTaskTimer(Minehunt.instance(), 0, 20) // 通知速通者 @@ -468,6 +483,7 @@ class Console { * 处理玩家死亡 */ fun handlePlayerDeath(player: Player) { + Bukkit.getPlayer(player.uniqueId) if (isSpeedrunner(player)) { // 速通者置为旁观者模式,加入淘汰名单 player.gameMode = GameMode.SPECTATOR @@ -514,6 +530,9 @@ class Console { ruleListObjective.displaySlot = DisplaySlot.SIDEBAR } + /** + * 更新规则时刷新对应规则项的后缀 + */ fun refreshEntry(ruleKey: RuleKey<*>) { val teamForOneRule = scoreboard.getTeam(ruleKey.name) ?: return teamForOneRule.suffix( @@ -523,6 +542,18 @@ class Console { ) } + /** + * 记录玩家进入传送门时的位置 + */ + fun recordLocAtPortal(player: Player, location: Location) { + val world = location.world + if (world.uid == overworld.uid) { + playerLocInWorld[player.uniqueId] = location + } else if (world.uid == nether.uid) { + playerLocInNether[player.uniqueId] = location + } + } + /** * 游戏阶段 */ diff --git a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt index f622a40..057f7cb 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt @@ -9,6 +9,8 @@ import org.bukkit.event.entity.PlayerDeathEvent import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerMoveEvent +import org.bukkit.event.player.PlayerPortalEvent +import org.bukkit.event.player.PlayerTeleportEvent import xyz.fortern.minehunt.Console import xyz.fortern.minehunt.Console.GameStage @@ -63,10 +65,21 @@ class PlayerListener( val player = event.player // 猎人等待出生时,或等待复活时,阻止其移动 - if (console.isHunter(player) && (console.hunterSpawnCD != null || player.gameMode == GameMode.SPECTATOR)) + if (console.isHunter(player) && player.gameMode == GameMode.SPECTATOR) event.isCancelled = true } + /** + * 玩家想要传送时,在特定情况下阻止玩家传送 + */ + @EventHandler + fun onHunterReadyTP(event: PlayerTeleportEvent) { + val player = event.player + if (console.isHunter(player) && player.gameMode == GameMode.SPECTATOR && event.cause != PlayerTeleportEvent.TeleportCause.PLUGIN) { + event.isCancelled = true + } + } + /** * 处理玩家死亡事件 */ @@ -86,6 +99,15 @@ class PlayerListener( } } - // TODO 改变维度时,记录最后的位置 + // 监听传送门传送事件。改变维度时,记录最后的位置。 + @EventHandler + fun onPlayerChangeWorld(event: PlayerPortalEvent) { + if (console.stage != GameStage.PROCESSING) return + + // 我们用了Kotlin有了更装B的写法 + event.from.world?.let { + console.recordLocAtPortal(event.player, event.from) + } + } }