init 17
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user