This commit is contained in:
2025-02-23 22:54:29 +08:00
parent 946fb5c237
commit fc35b430e4
2 changed files with 41 additions and 38 deletions

View File

@@ -157,7 +157,7 @@ class Console {
/** /**
* 猎人重生Task保留这些引用方便在游戏结束时取消这些任务 * 猎人重生Task保留这些引用方便在游戏结束时取消这些任务
*/ */
private val hunterRespawnTasks: MutableMap<Player, BukkitTask> = HashMap() private val hunterRespawnTasks: MutableMap<UUID, BukkitTask> = HashMap()
/** /**
* 游戏开始前的倒计时任务 * 游戏开始前的倒计时任务
@@ -182,16 +182,7 @@ class Console {
// bukkit task end // bukkit task end
companion object {
@JvmStatic
private lateinit var instance: Console
@JvmStatic
fun getInstance() = instance
}
init { init {
instance = this
initScoreboard() initScoreboard()
// 初始化 Minecraft 游戏规则 // 初始化 Minecraft 游戏规则
overworld.worldBorder.size = 32.0 overworld.worldBorder.size = 32.0
@@ -230,24 +221,24 @@ class Console {
/** /**
* 判断玩家是否为猎人 * 判断玩家是否为猎人
*/ */
fun isHunter(player: Player): Boolean = hunterSet.contains(player.uniqueId) fun isHunter(player: Player): Boolean = hunterTeam.hasPlayer(player)
/** /**
* 判断是否为观察者 * 判断是否为观察者
*/ */
fun isSpectator(player: Player): Boolean = spectatorSet.contains(player.uniqueId) fun isSpectator(player: Player): Boolean = spectatorTeam.hasPlayer(player)
/** /**
* 判断是否为速通者 * 判断是否为速通者
*/ */
fun isSpeedrunner(player: Player): Boolean = speedrunnerSet.contains(player.uniqueId) fun isSpeedrunner(player: Player): Boolean = speedrunnerTeam.hasPlayer(player)
/** /**
* 加入猎人阵营 * 加入猎人阵营
*/ */
fun joinHunter(player: Player) { fun joinHunter(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) { if (stage == GameStage.PREPARING && beginningCountdown == null) {
hunterTeam.addEntry(player.name) hunterTeam.addPlayer(player)
player.sendMessage(Component.text("你已加入[猎人]")) player.sendMessage(Component.text("你已加入[猎人]"))
} }
} }
@@ -257,7 +248,7 @@ class Console {
*/ */
fun joinSpeedrunner(player: Player) { fun joinSpeedrunner(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) { if (stage == GameStage.PREPARING && beginningCountdown == null) {
speedrunnerTeam.addEntry(player.name) speedrunnerTeam.addPlayer(player)
player.sendMessage(Component.text("你已加入[速通者]")) player.sendMessage(Component.text("你已加入[速通者]"))
} }
} }
@@ -267,7 +258,7 @@ class Console {
*/ */
fun joinSpectator(player: Player) { fun joinSpectator(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) { if (stage == GameStage.PREPARING && beginningCountdown == null) {
spectatorTeam.addEntry(player.name) spectatorTeam.addPlayer(player)
player.sendMessage(Component.text("你已加入[观众]")) player.sendMessage(Component.text("你已加入[观众]"))
} }
} }
@@ -329,16 +320,15 @@ class Console {
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner") if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
// 修改游戏规则 // 修改游戏规则
val world = Bukkit.getWorld("world")!! overworld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true) overworld.setGameRule(GameRule.DO_WEATHER_CYCLE, true)
world.setGameRule(GameRule.DO_WEATHER_CYCLE, true) overworld.setGameRule(GameRule.DO_MOB_SPAWNING, true)
world.setGameRule(GameRule.DO_MOB_SPAWNING, true) overworld.setGameRule(GameRule.KEEP_INVENTORY, false)
world.setGameRule(GameRule.KEEP_INVENTORY, false) overworld.setGameRule(GameRule.SPAWN_RADIUS, 10)
world.setGameRule(GameRule.SPAWN_RADIUS, 10) overworld.difficulty = Difficulty.HARD
world.difficulty = Difficulty.HARD this.overworld.worldBorder.size = 9999999.0
overworld.worldBorder.size = 9999999.0
val spawnLocation = world.spawnLocation val spawnLocation = overworld.spawnLocation
// 重置所有玩家状态 // 重置所有玩家状态
Bukkit.getOnlinePlayers().forEach { Bukkit.getOnlinePlayers().forEach {
@@ -361,11 +351,15 @@ class Console {
hunterTeam.entries.forEach { entry -> hunterTeam.entries.forEach { entry ->
Bukkit.getPlayer(entry)?.let { Bukkit.getPlayer(entry)?.let {
hunterSet.add(it.uniqueId) hunterSet.add(it.uniqueId)
it.teleport(Location(world, 0.0, -64.0, 0.0)) it.teleport(Location(overworld, 0.0, -64.0, 0.0))
trackRunnerMap[it.uniqueId] = 0 trackRunnerMap[it.uniqueId] = 0
} }
} }
val pvp = gameRules.getRuleValue(RuleKey.FRIENDLY_FIRE)
speedrunnerTeam.setAllowFriendlyFire(pvp)
hunterTeam.setAllowFriendlyFire(pvp)
// 创建指南针更新任务 // 创建指南针更新任务
val compassTask = object : BukkitRunnable() { val compassTask = object : BukkitRunnable() {
override fun run() { override fun run() {
@@ -398,8 +392,10 @@ class Console {
speedrunnerSet.forEach { speedrunnerSet.forEach {
Bukkit.getPlayer(it)?.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) Bukkit.getPlayer(it)?.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED))
} }
hunterSpawnCD = null
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L) }, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
scoreboard.getObjective("rule-list")!!.displaySlot = null
stage = GameStage.PROCESSING stage = GameStage.PROCESSING
} }
@@ -460,7 +456,13 @@ class Console {
* 结束处理 * 结束处理
*/ */
fun end(winner: String?) { fun end(winner: String?) {
if (stage != GameStage.PROCESSING) return
stage = GameStage.OVER stage = GameStage.OVER
hunterSpawnCD?.cancel()
hunterSpawnCD = null
compassRefreshTask?.cancel()
compassRefreshTask = null
// 所有人设为生存模式 // 所有人设为生存模式
Bukkit.getOnlinePlayers().forEach { Bukkit.getOnlinePlayers().forEach {
it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN)) it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN))
@@ -476,6 +478,9 @@ class Console {
it.value.cancel() it.value.cancel()
} }
hunterRespawnTasks.clear() hunterRespawnTasks.clear()
// 有仇的报仇
speedrunnerTeam.setAllowFriendlyFire(true)
hunterTeam.setAllowFriendlyFire(true)
} }
/** /**
@@ -540,27 +545,26 @@ class Console {
fun handlePlayerDeath(player: Player) { fun handlePlayerDeath(player: Player) {
if (stage != GameStage.PROCESSING) return if (stage != GameStage.PROCESSING) return
Bukkit.getPlayer(player.uniqueId) val uuid = player.uniqueId
if (isSpeedrunner(player)) { if (isSpeedrunner(player)) {
// 速通者置为旁观者模式,加入淘汰名单 // 速通者置为旁观者模式,加入淘汰名单
player.gameMode = GameMode.SPECTATOR player.gameMode = GameMode.SPECTATOR
outPlayers.add(player.uniqueId) outPlayers.add(uuid)
// 给淘汰的玩家名字上加删除线 // 给淘汰的玩家名字上加删除线
val playerListName = player.playerListName() val playerListName = player.playerListName()
playerListName.style(Style.style(TextDecoration.STRIKETHROUGH)) playerListName.style(Style.style(TextDecoration.STRIKETHROUGH))
player.playerListName(playerListName) player.playerListName(playerListName)
// 如给所有hunter都淘汰则游戏结束 // 如给所有hunter都淘汰则游戏结束
if (outPlayers.size == speedrunnerSet.size) { if (outPlayers.size == speedrunnerSet.size) {
end("hunter") Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { end("Hunter") }, 0)
} }
} else if (isHunter(player)) { } else if (isHunter(player)) {
// 猎人置为旁观者模式,稍后复活 // 猎人置为旁观者模式,稍后复活
player.gameMode = GameMode.SPECTATOR player.gameMode = GameMode.SPECTATOR
val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { hunterRespawnTasks[uuid] = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
player.gameMode = GameMode.SURVIVAL player.gameMode = GameMode.SURVIVAL
hunterRespawnTasks.remove(player) hunterRespawnTasks.remove(uuid)
}, 20) }, gameRules.getRuleValue(RuleKey.HUNTER_RESPAWN_CD) * 20L)
hunterRespawnTasks[player] = task
} }
} }

View File

@@ -30,7 +30,7 @@ class PlayerListener(
// 在准备阶段,玩家设为冒险模式 // 在准备阶段,玩家设为冒险模式
player.gameMode = GameMode.ADVENTURE player.gameMode = GameMode.ADVENTURE
// 自动加入观察者队伍 // 自动加入观察者队伍
console.spectatorTeam.addEntry(player.name) console.spectatorTeam.addPlayer(player)
} }
} }
@@ -42,11 +42,11 @@ class PlayerListener(
val player = event.player val player = event.player
val stage = console.stage val stage = console.stage
if (stage == GameStage.PREPARING) { if (stage == GameStage.PREPARING) {
// 重置队伍信息
player.scoreboard.teams.forEach { it.removeEntry(player.name) }
if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) { if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) {
console.interruptCountdownToStart() console.interruptCountdownToStart()
} }
// 将离开的玩家从team中移除
player.scoreboard.teams.forEach { it.removePlayer(player) }
} }
} }
@@ -92,8 +92,7 @@ class PlayerListener(
*/ */
@EventHandler @EventHandler
fun onPlayerDeath(event: PlayerDeathEvent) { fun onPlayerDeath(event: PlayerDeathEvent) {
val player = event.entity console.handlePlayerDeath(event.entity)
console.handlePlayerDeath(player)
} }
/** /**