This commit is contained in:
2025-02-23 03:27:43 +08:00
parent c2d46988f4
commit 6468d6d963
2 changed files with 54 additions and 49 deletions

View File

@@ -47,12 +47,12 @@ class Console {
/** /**
* 主世界 * 主世界
*/ */
val overworld = Bukkit.getWorld("world")!! private val overworld = Bukkit.getWorld("world")!!
/** /**
* 下界 * 下界
*/ */
val nether = Bukkit.getWorld("world_nether")!! private val nether = Bukkit.getWorld("world_nether")!!
/** /**
* 速通者队伍 * 速通者队伍
@@ -74,17 +74,17 @@ class Console {
/** /**
* 速通者列表 * 速通者列表
*/ */
private val speedrunnerSet: MutableSet<Player> = HashSet() private val speedrunnerSet: MutableSet<UUID> = HashSet()
/** /**
* 猎人玩家集合 * 猎人玩家集合
*/ */
private val hunterSet: MutableSet<Player> = HashSet() private val hunterSet: MutableSet<UUID> = HashSet()
/** /**
* 旁观者玩家集合 * 旁观者玩家集合
*/ */
private val spectatorSet: MutableSet<Player> = HashSet() private val spectatorSet: MutableSet<UUID> = HashSet()
/** /**
* 淘汰玩家集合 * 淘汰玩家集合
@@ -94,7 +94,7 @@ class Console {
/** /**
* 终止游戏的投票统计 * 终止游戏的投票统计
*/ */
private val votingEndMap: MutableMap<String, Boolean> = HashMap() private val votingEndMap: MutableMap<UUID, Boolean> = HashMap()
/** /**
* 投票计数 * 投票计数
@@ -104,7 +104,7 @@ class Console {
/** /**
* 速通者列表,用于指南针指向的遍历 * 速通者列表,用于指南针指向的遍历
*/ */
private lateinit var speedrunnerList: List<Player> private lateinit var speedrunnerList: List<UUID>
/** /**
* 玩家离开主世界时最后的位置 * 玩家离开主世界时最后的位置
@@ -119,7 +119,7 @@ class Console {
/** /**
* 猎人持有的指南针指向的速通者在speedrunnerList中的index * 猎人持有的指南针指向的速通者在speedrunnerList中的index
*/ */
private val trackRunnerMap: MutableMap<String, Int> = ConcurrentHashMap() private val trackRunnerMap: MutableMap<UUID, Int> = ConcurrentHashMap()
/** /**
* 猎人的指南针标记 * 猎人的指南针标记
@@ -215,43 +215,46 @@ class Console {
/** /**
* 判断玩家是否为猎人 * 判断玩家是否为猎人
*/ */
fun isHunter(player: Player) = hunterSet.contains(player) fun isHunter(player: Player) = hunterSet.contains(player.uniqueId)
/** /**
* 判断是否为观察者 * 判断是否为观察者
*/ */
fun isSpectator(player: Player) = spectatorSet.contains(player) fun isSpectator(player: Player) = spectatorSet.contains(player.uniqueId)
/** /**
* 判断是否为速通者 * 判断是否为速通者
*/ */
fun isSpeedrunner(player: Player) = speedrunnerSet.contains(player) fun isSpeedrunner(player: Player) = speedrunnerSet.contains(player.uniqueId)
/** /**
* 加入猎人阵营 * 加入猎人阵营
*/ */
fun joinHunter(player: Player) { fun joinHunter(player: Player) {
speedrunnerSet.remove(player) val uuid = player.uniqueId
spectatorSet.remove(player) speedrunnerSet.remove(uuid)
hunterSet.add(player) spectatorSet.remove(uuid)
hunterSet.add(uuid)
} }
/** /**
* 加入速通者阵营 * 加入速通者阵营
*/ */
fun joinSpeedrunner(player: Player) { fun joinSpeedrunner(player: Player) {
hunterSet.remove(player) val uuid = player.uniqueId
spectatorSet.remove(player) hunterSet.remove(uuid)
speedrunnerSet.add(player) spectatorSet.remove(uuid)
speedrunnerSet.add(uuid)
} }
/** /**
* 加入观察者阵营 * 加入观察者阵营
*/ */
fun joinSpectator(player: Player) { fun joinSpectator(player: Player) {
hunterSet.remove(player) val uuid = player.uniqueId
speedrunnerSet.remove(player) hunterSet.remove(uuid)
spectatorSet.add(player) speedrunnerSet.remove(uuid)
spectatorSet.add(uuid)
} }
/** /**
@@ -323,30 +326,32 @@ class Console {
} }
// 速通者更改为生存模式并加入speedrunnerList // 速通者更改为生存模式并加入speedrunnerList
speedrunnerSet.forEach { it.gameMode = GameMode.SURVIVAL } speedrunnerSet.forEach { Bukkit.getPlayer(it)?.gameMode = GameMode.SURVIVAL }
speedrunnerList = speedrunnerSet.toList() speedrunnerList = speedrunnerSet.toList()
// 将猎人传送到世界底部,且指南针开始有所指向 // 将猎人传送到世界底部,且指南针开始有所指向
hunterSet.forEach { hunterSet.forEach {
it.teleport(Location(world, 0.0, -64.0, 0.0)) Bukkit.getPlayer(it)?.teleport(Location(world, 0.0, -64.0, 0.0))
trackRunnerMap[it.name] = 0 trackRunnerMap[it] = 0
} }
// 创建指南针更新任务 // 创建指南针更新任务
val compassTask = object : BukkitRunnable() { val compassTask = object : BukkitRunnable() {
override fun run() { override fun run() {
hunterSet.forEach { hunterSet.forEach {
if (!it.isOnline) return@forEach val hunter = Bukkit.getPlayer(it) ?: return@forEach
val i = (trackRunnerMap[it.name] ?: return@forEach) % speedrunnerList.size val i = (trackRunnerMap[it] ?: return@forEach) % speedrunnerList.size
val speedrunner = speedrunnerList[i] // hunter 正在追踪的 speedrunner
val items = it.inventory.all(hunterCompass) val speedrunner = Bukkit.getPlayer(speedrunnerList[i]) ?: return@forEach
val items = hunter.inventory.all(hunterCompass)
var flag = false var flag = false
items.forEach { (k, v) -> items.forEach inner@{ (k, v) ->
val lore = v.lore()
// 避免玩家身上有多个猎人指南针 // 避免玩家身上有多个猎人指南针
if (flag) { if (flag) {
it.inventory.clear(k) hunter.inventory.clear(k)
return@inner
} }
val lore = v.lore()
if (!lore.isNullOrEmpty() && lore[0].equals(compassFlag)) { if (!lore.isNullOrEmpty() && lore[0].equals(compassFlag)) {
flag = true flag = true
// 让指南针指向某一个猎人 // 让指南针指向某一个猎人
@@ -363,17 +368,18 @@ class Console {
hunterSpawnCD = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { hunterSpawnCD = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
// 猎人设置初始状态 // 猎人设置初始状态
hunterSet.forEach { hunterSet.forEach {
it.sendMessage(Component.text("你已到达出生点", NamedTextColor.RED)) val player = Bukkit.getPlayer(it) ?: return@forEach
it.gameMode = GameMode.SURVIVAL player.sendMessage(Component.text("你已到达出生点", NamedTextColor.RED))
it.teleport(spawnLocation) player.gameMode = GameMode.SURVIVAL
it.inventory.addItem(hunterCompass) player.teleport(spawnLocation)
player.inventory.addItem(hunterCompass)
} }
// “自动更新指南针”任务开始运行 // “自动更新指南针”任务开始运行
compassRefreshTask = compassTask.runTaskTimer(Minehunt.instance(), 0, 20) compassRefreshTask = compassTask.runTaskTimer(Minehunt.instance(), 0, 20)
// 通知速通者 // 通知速通者
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) } speedrunnerSet.forEach { Bukkit.getPlayer(it)?.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L) }, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
} }
@@ -390,7 +396,6 @@ class Console {
player.sendMessage(Component.text("只有游戏中的玩家才能投票")) player.sendMessage(Component.text("只有游戏中的玩家才能投票"))
return return
} }
val name = player.name
if (voteTask == null) { if (voteTask == null) {
// 投票发起 // 投票发起
voteTask = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { voteTask = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
@@ -400,26 +405,26 @@ class Console {
}, 60) }, 60)
// 统计参与投票的玩家 // 统计参与投票的玩家
speedrunnerSet.forEach { speedrunnerSet.forEach {
Bukkit.getPlayer(it) ?: return@forEach
// 生存模式的速通者统计进来 // 生存模式的速通者统计进来
if (it.isOnline && !outPlayers.contains(it.uniqueId)) { if (!outPlayers.contains(it)) {
votingEndMap[it.name] = false votingEndMap[it] = false
} }
} }
hunterSet.forEach { hunterSet.forEach {
if (it.isOnline) { Bukkit.getPlayer(it) ?: return@forEach
votingEndMap[it.name] = false votingEndMap[it] = false
}
} }
Bukkit.getOnlinePlayers().forEach { Bukkit.getOnlinePlayers().forEach {
it.sendMessage(Component.text("${name}发起了终止游戏的投如果赞成请在60秒内执行 /minehunt stop")) it.sendMessage(Component.text("${player.name}发起了终止游戏的投如果赞成请在60秒内执行 /minehunt stop"))
} }
} }
// 玩家投票 // 玩家投票
if (!votingEndMap.containsKey(name)) { if (!votingEndMap.containsKey(player.uniqueId)) {
player.sendMessage(Component.text("你不在可投票的名单中", NamedTextColor.RED)) player.sendMessage(Component.text("你不在可投票的名单中", NamedTextColor.RED))
return return
} }
votingEndMap[name] = true votingEndMap[player.uniqueId] = true
votingCount++ votingCount++
player.sendMessage(Component.text("voting (${votingCount}/${votingEndMap.size})", NamedTextColor.RED)) player.sendMessage(Component.text("voting (${votingCount}/${votingEndMap.size})", NamedTextColor.RED))
if (votingCount != votingEndMap.size) { if (votingCount != votingEndMap.size) {
@@ -462,9 +467,9 @@ class Console {
/** /**
* 让该玩家所追踪的目标切换到下一个 * 让该玩家所追踪的目标切换到下一个
*/ */
fun trackNextPlayer(playerName: String) { fun trackNextPlayer(player: Player) {
if (stage != GameStage.PROCESSING) return if (stage != GameStage.PROCESSING) return
val i = trackRunnerMap[playerName] ?: return val i = trackRunnerMap[player.uniqueId] ?: return
if (speedrunnerList.isEmpty()) return if (speedrunnerList.isEmpty()) return
var j = i var j = i
@@ -472,8 +477,8 @@ class Console {
j++ j++
j %= speedrunnerList.size j %= speedrunnerList.size
val speedrunner = speedrunnerList[i] val speedrunner = speedrunnerList[i]
if (!outPlayers.contains(speedrunner.uniqueId) && speedrunner.isOnline || i == j) { if (!outPlayers.contains(speedrunner) && Bukkit.getPlayer(speedrunner) != null || i == j) {
trackRunnerMap[playerName] = j trackRunnerMap[player.uniqueId] = j
break break
} }
} }

View File

@@ -52,7 +52,7 @@ class PlayerListener(
val itemStack = event.itemDrop.itemStack val itemStack = event.itemDrop.itemStack
if (!console.isHunterCompass(itemStack)) return if (!console.isHunterCompass(itemStack)) return
console.trackNextPlayer(event.player.name) console.trackNextPlayer(event.player)
} }
/** /**