This commit is contained in:
2025-02-04 22:12:34 +08:00
parent 8a1e093ff7
commit 514a46719c
2 changed files with 60 additions and 15 deletions

View File

@@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack
import org.bukkit.scheduler.BukkitTask import org.bukkit.scheduler.BukkitTask
import org.bukkit.scoreboard.Team import org.bukkit.scoreboard.Team
import xyz.fortern.minehunt.rule.RuleItem import xyz.fortern.minehunt.rule.RuleItem
import java.util.concurrent.ConcurrentHashMap
/** /**
* 游戏控制台 * 游戏控制台
@@ -56,14 +57,14 @@ class Console {
val spectatorSet: MutableSet<Player> = HashSet() val spectatorSet: MutableSet<Player> = HashSet()
/** /**
* 存活中的速通者列表,用于指南针指向的遍历 * 速通者列表,用于指南针指向的遍历
*/ */
val speedrunnerList: MutableList<Player> = ArrayList() lateinit var speedrunnerList: List<Player>
/** /**
* 猎人持有的指南针指向的速通者在speedrunnerList中的index * 猎人持有的指南针指向的速通者在speedrunnerList中的index
*/ */
val trackRunnerMap: MutableMap<String, Int> = HashMap() val trackRunnerMap: MutableMap<String, Int> = ConcurrentHashMap()
/** /**
* 猎人的指南针标记 * 猎人的指南针标记
@@ -72,10 +73,14 @@ class Console {
/** /**
* 猎人指南针物品 * 猎人指南针物品
*
* 出生与复活是唯一获取此物品的方法
*/ */
private val hunterCompass: ItemStack = ItemStack(Material.COMPASS).apply { private val hunterCompass: ItemStack = ItemStack(Material.COMPASS).apply {
// 最大堆叠数设为1
itemMeta.setMaxStackSize(1)
// 设置名称 // 设置名称
itemMeta.displayName(Component.text("猎人指南针", NamedTextColor.GOLD)) itemMeta.displayName(Component.text(compassFlag, NamedTextColor.GOLD))
// 设置Lore // 设置Lore
itemMeta.lore( itemMeta.lore(
listOf( listOf(
@@ -183,6 +188,8 @@ class Console {
* 游戏阶段由 PREPARING 变为 PROCESSING * 游戏阶段由 PREPARING 变为 PROCESSING
*/ */
fun start() { fun start() {
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
// 修改游戏规则 // 修改游戏规则
val world = Bukkit.getWorld("world")!! val world = Bukkit.getWorld("world")!!
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true) world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
@@ -206,10 +213,8 @@ class Console {
} }
// 速通者更改为生存模式并加入speedrunnerList // 速通者更改为生存模式并加入speedrunnerList
speedrunnerSet.forEach { speedrunnerSet.forEach { it.gameMode = GameMode.SURVIVAL }
it.gameMode = GameMode.SURVIVAL speedrunnerList = speedrunnerSet.toList()
speedrunnerList.add(it)
}
// 将猎人传送到世界底部,且指南针开始有所指向 // 将猎人传送到世界底部,且指南针开始有所指向
hunterSet.forEach { hunterSet.forEach {
@@ -217,11 +222,6 @@ class Console {
trackRunnerMap.put(it.name, 0) trackRunnerMap.put(it.name, 0)
} }
Runnable {
compassMeta.setLodestoneTracked(false)
compassMeta.setLodestone(event.getFindLoc())
}
// 猎人出生倒计时Task // 猎人出生倒计时Task
hunterSpawnCD = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable { hunterSpawnCD = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
hunterSet.forEach { hunterSet.forEach {
@@ -231,12 +231,46 @@ class Console {
it.inventory.addItem(hunterCompass) it.inventory.addItem(hunterCompass)
} }
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) } speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
// 指南针开始追踪
compassRefreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
// TODO 如何取得玩家身上的指南针?
hunterSet.forEach {
if (it.isOnline) {
var i = (trackRunnerMap[it.name] ?: return@forEach) % speedrunnerList.size
val speedrunner = speedrunnerList[i]
val location = speedrunner.location
val items = it.inventory.all(hunterCompass)
items.forEach { k, v ->
val lore = v.lore()
if (lore != null && lore.isNotEmpty() && lore[0].equals(compassFlag)) {
}
}
}
}
}, 0, 20)
}, RuleItem.HUNTER_READY_CD.value * 20L, 0) }, RuleItem.HUNTER_READY_CD.value * 20L, 0)
// TODO 如何不再阻止玩家移动? // TODO 如何不再阻止玩家移动?
} }
/**
* 判断物品是否为猎人指南针
*/
fun isHunterCompass(itemStack: ItemStack) = hunterCompass == itemStack
/**
* 让该玩家所追踪的目标切换倒下一个
*/
fun trackNextPlayer(playerName: String) {
var i = trackRunnerMap[playerName] ?: return
i++
trackRunnerMap[playerName] = i % speedrunnerList.size
}
/** /**
* 游戏阶段 * 游戏阶段

View File

@@ -3,6 +3,7 @@ package xyz.fortern.minehunt.listener
import org.bukkit.GameMode import org.bukkit.GameMode
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.event.player.PlayerQuitEvent
import xyz.fortern.minehunt.Console import xyz.fortern.minehunt.Console
@@ -45,10 +46,20 @@ class PlayerListener(
fun onPlayerQuit(event: PlayerQuitEvent) { fun onPlayerQuit(event: PlayerQuitEvent) {
val player = event.player val player = event.player
// 速通者退出时从speedrunnerList中移除避免指南针遍历 // 速通者退出时从speedrunnerList中移除避免指南针遍历
if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(player)) // if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(player))
console.speedrunnerList.remove(player) // console.speedrunnerList.remove(player)
} }
@EventHandler
fun onDropItem(event: PlayerDropItemEvent) {
val itemStack = event.itemDrop.itemStack
if (!console.isHunterCompass(itemStack)) {
return
}
val player = event.player
console.trackRunnerMap[player.name] = 0
}
} }