From 514a46719c9e6c4d16692099acb3d6bcef20835a Mon Sep 17 00:00:00 2001 From: Fortern Date: Tue, 4 Feb 2025 22:12:34 +0800 Subject: [PATCH] init 5 --- .../kotlin/xyz/fortern/minehunt/Console.kt | 60 +++++++++++++++---- .../minehunt/listener/PlayerListener.kt | 15 ++++- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/xyz/fortern/minehunt/Console.kt b/src/main/kotlin/xyz/fortern/minehunt/Console.kt index b3a15ac..7c930b0 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/Console.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/Console.kt @@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack import org.bukkit.scheduler.BukkitTask import org.bukkit.scoreboard.Team import xyz.fortern.minehunt.rule.RuleItem +import java.util.concurrent.ConcurrentHashMap /** * 游戏控制台 @@ -56,14 +57,14 @@ class Console { val spectatorSet: MutableSet = HashSet() /** - * 存活中的速通者列表,用于指南针指向的遍历 + * 速通者列表,用于指南针指向的遍历 */ - val speedrunnerList: MutableList = ArrayList() + lateinit var speedrunnerList: List /** * 猎人持有的指南针指向的速通者在speedrunnerList中的index */ - val trackRunnerMap: MutableMap = HashMap() + val trackRunnerMap: MutableMap = ConcurrentHashMap() /** * 猎人的指南针标记 @@ -72,10 +73,14 @@ class Console { /** * 猎人指南针物品 + * + * 出生与复活是唯一获取此物品的方法 */ 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 itemMeta.lore( listOf( @@ -183,6 +188,8 @@ class Console { * 游戏阶段由 PREPARING 变为 PROCESSING */ fun start() { + if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner") + // 修改游戏规则 val world = Bukkit.getWorld("world")!! world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true) @@ -206,10 +213,8 @@ class Console { } // 速通者更改为生存模式,并加入speedrunnerList - speedrunnerSet.forEach { - it.gameMode = GameMode.SURVIVAL - speedrunnerList.add(it) - } + speedrunnerSet.forEach { it.gameMode = GameMode.SURVIVAL } + speedrunnerList = speedrunnerSet.toList() // 将猎人传送到世界底部,且指南针开始有所指向 hunterSet.forEach { @@ -217,11 +222,6 @@ class Console { trackRunnerMap.put(it.name, 0) } - Runnable { - compassMeta.setLodestoneTracked(false) - compassMeta.setLodestone(event.getFindLoc()) - } - // 猎人出生倒计时Task hunterSpawnCD = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable { hunterSet.forEach { @@ -231,12 +231,46 @@ class Console { it.inventory.addItem(hunterCompass) } 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) // TODO 如何不再阻止玩家移动? } + /** + * 判断物品是否为猎人指南针 + */ + fun isHunterCompass(itemStack: ItemStack) = hunterCompass == itemStack + + /** + * 让该玩家所追踪的目标切换倒下一个 + */ + fun trackNextPlayer(playerName: String) { + var i = trackRunnerMap[playerName] ?: return + i++ + trackRunnerMap[playerName] = i % speedrunnerList.size + } /** * 游戏阶段 diff --git a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt index a397538..70db580 100644 --- a/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt +++ b/src/main/kotlin/xyz/fortern/minehunt/listener/PlayerListener.kt @@ -3,6 +3,7 @@ package xyz.fortern.minehunt.listener import org.bukkit.GameMode import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerQuitEvent import xyz.fortern.minehunt.Console @@ -45,10 +46,20 @@ class PlayerListener( fun onPlayerQuit(event: PlayerQuitEvent) { val player = event.player // 速通者退出时,从speedrunnerList中移除,避免指南针遍历 - if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(player)) - console.speedrunnerList.remove(player) +// if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(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 + } + }