This commit is contained in:
2025-02-22 20:32:15 +08:00
parent 989bbf85e3
commit c2d46988f4
2 changed files with 59 additions and 6 deletions

View File

@@ -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<Player> private lateinit var speedrunnerList: List<Player>
/**
* 玩家离开主世界时最后的位置
*/
private val playerLocInWorld: MutableMap<UUID, Location> = HashMap()
/**
* 玩家离开下界时最后的位置
*/
private val playerLocInNether: MutableMap<UUID, Location> = HashMap()
/** /**
* 猎人持有的指南针指向的速通者在speedrunnerList中的index * 猎人持有的指南针指向的速通者在speedrunnerList中的index
*/ */
@@ -133,13 +148,13 @@ class Console {
itemMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, false) itemMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, false)
} }
// bukkit task start
/** /**
* 猎人重生Task保留这些引用方便在游戏结束时取消这些任务 * 猎人重生Task保留这些引用方便在游戏结束时取消这些任务
*/ */
private val hunterRespawnTasks: MutableMap<Player, BukkitTask> = HashMap() private val hunterRespawnTasks: MutableMap<Player, BukkitTask> = HashMap()
// bukkit task start
/** /**
* 游戏开始前的倒计时任务 * 游戏开始前的倒计时任务
*/ */
@@ -354,7 +369,7 @@ class Console {
it.inventory.addItem(hunterCompass) it.inventory.addItem(hunterCompass)
} }
// 自动更新指南针任务开始运行 // 自动更新指南针任务开始运行
compassRefreshTask = compassTask.runTaskTimer(Minehunt.instance(), 0, 20) compassRefreshTask = compassTask.runTaskTimer(Minehunt.instance(), 0, 20)
// 通知速通者 // 通知速通者
@@ -468,6 +483,7 @@ class Console {
* 处理玩家死亡 * 处理玩家死亡
*/ */
fun handlePlayerDeath(player: Player) { fun handlePlayerDeath(player: Player) {
Bukkit.getPlayer(player.uniqueId)
if (isSpeedrunner(player)) { if (isSpeedrunner(player)) {
// 速通者置为旁观者模式,加入淘汰名单 // 速通者置为旁观者模式,加入淘汰名单
player.gameMode = GameMode.SPECTATOR player.gameMode = GameMode.SPECTATOR
@@ -514,6 +530,9 @@ class Console {
ruleListObjective.displaySlot = DisplaySlot.SIDEBAR ruleListObjective.displaySlot = DisplaySlot.SIDEBAR
} }
/**
* 更新规则时刷新对应规则项的后缀
*/
fun refreshEntry(ruleKey: RuleKey<*>) { fun refreshEntry(ruleKey: RuleKey<*>) {
val teamForOneRule = scoreboard.getTeam(ruleKey.name) ?: return val teamForOneRule = scoreboard.getTeam(ruleKey.name) ?: return
teamForOneRule.suffix( 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
}
}
/** /**
* 游戏阶段 * 游戏阶段
*/ */

View File

@@ -9,6 +9,8 @@ import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerMoveEvent 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
import xyz.fortern.minehunt.Console.GameStage import xyz.fortern.minehunt.Console.GameStage
@@ -63,10 +65,21 @@ class PlayerListener(
val player = event.player 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 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)
}
}
} }