This commit is contained in:
2025-02-24 03:34:56 +08:00
parent c3c196131c
commit 009545a470
3 changed files with 76 additions and 25 deletions

View File

@@ -3,8 +3,6 @@ package xyz.fortern.minehunt
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.TextComponent
import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.text.format.Style
import net.kyori.adventure.text.format.TextDecoration
import net.kyori.adventure.title.Title
import net.kyori.adventure.util.Ticks
import org.bukkit.Bukkit
@@ -517,9 +515,9 @@ class Console {
val speedrunner = Bukkit.getPlayer(uuid)
if (!outPlayers.contains(uuid) && speedrunner != null) {
trackRunnerMap[hunter.uniqueId] = j
val location = speedrunner.location
// hunter操作指南针时立即刷新位置
refreshCompassTrack(hunter, speedrunner)
hunter.sendActionBar(Component.text("指向 ${speedrunner.name}"))
break
}
}
@@ -529,12 +527,11 @@ class Console {
* 使hunter的指南针指向此时speedrunner的位置
*/
private fun refreshCompassTrack(hunter: Player, speedrunner: Player) {
val items = hunter.inventory.all(hunterCompass)
items.firstNotNullOf { (_, itemStack) ->
val lore = itemStack.lore()
if (lore.isNullOrEmpty()) return@firstNotNullOf
val items = hunter.inventory.all(Material.COMPASS)
items.firstNotNullOfOrNull { (_, itemStack) ->
if (itemStack.lore().isNullOrEmpty()) return@firstNotNullOfOrNull
val component = lore[0]
val component = itemStack.lore()!![0]
if (component is TextComponent && component.content() == compassFlag) {
// 让指南针指向某一个猎人
val meta = itemStack.itemMeta as CompassMeta
@@ -557,10 +554,6 @@ class Console {
// 速通者置为旁观者模式,加入淘汰名单
player.gameMode = GameMode.SPECTATOR
outPlayers.add(uuid)
// 给淘汰的玩家名字上加删除线
val playerListName = player.playerListName()
playerListName.style(Style.style(TextDecoration.STRIKETHROUGH))
player.playerListName(playerListName)
// 如给所有hunter都淘汰则游戏结束
if (outPlayers.size == speedrunnerSet.size) {
Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { end("Hunter") }, 0)
@@ -632,6 +625,15 @@ class Console {
}
}
/**
* 给予猎人追踪指南针
*/
fun giveCompassIfNeed(player: Player) {
if (stage == GameStage.PROCESSING && isHunter(player)) {
player.give(hunterCompass)
}
}
/**
* 游戏阶段
*/

View File

@@ -17,9 +17,10 @@ class MinehuntCommand(
private val console: Console
) : TabExecutor {
private val subCommands: List<String> = listOf("help", "join", "leave", "rule", "start", "stop")
private val subCommands: List<String> = listOf("help", "join", "leave", "rule", "start", "stop", "give")
private val teams: List<String> = listOf("hunter", "speedrunner", "spectator")
private val rules: List<String> = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire")
private val items: List<String> = listOf("compass")
private val helpMessages = listOf(
Component.text("Minehunt v${Minehunt.instance().pluginMeta.version}", NamedTextColor.GREEN),
@@ -29,18 +30,20 @@ class MinehuntCommand(
.append(Component.text("加入一个阵营", NamedTextColor.WHITE)),
Component.text("/minehunt leave ", NamedTextColor.GOLD)
.append(Component.text("加入观察者阵营", NamedTextColor.WHITE)),
Component.text("/minehunt rule ", NamedTextColor.GOLD)
Component.text("/minehunt rule <ruleKey> ", NamedTextColor.GOLD)
.append(Component.text("查看或修改游戏规则", NamedTextColor.WHITE)),
Component.text("/minehunt start ", NamedTextColor.GOLD)
.append(Component.text("开始游戏", NamedTextColor.WHITE)),
Component.text("/minehunt stop ", NamedTextColor.GOLD)
.append(Component.text("进行中止游戏的投票", NamedTextColor.WHITE))
.append(Component.text("进行中止游戏的投票", NamedTextColor.WHITE)),
Component.text("/minehunt give ", NamedTextColor.GOLD)
.append(Component.text("给予游戏中所需的特殊物品", NamedTextColor.WHITE)),
)
private val ruleHelpMessages = listOf(
Component.text("/minehunt rule <ruleItem> ", NamedTextColor.GREEN)
.append(Component.text("查看一项规则的详情", NamedTextColor.WHITE)),
Component.text("/minehunt rule <ruleItem> <value> ", NamedTextColor.GREEN)
.append(Component.text("为一项规则设置新的值", NamedTextColor.WHITE))
.append(Component.text("为一项规则设置新的值", NamedTextColor.WHITE)),
)
/**
@@ -112,6 +115,10 @@ class MinehuntCommand(
onStop(sender, flag)
}
"give" -> {
onGive(sender, args, flag)
}
else -> {
if (flag) {
sender.sendMessage(Component.text("错误的子命令"))
@@ -301,14 +308,50 @@ class MinehuntCommand(
return null
}
/**
* 给予玩家特殊物品
*/
private fun onGive(sender: CommandSender, args: List<String>, flag: Boolean): List<String>? {
// args[0] == give
if (args.size == 1) {
if (flag) {
sender.sendMessage("缺少参数")
}
return null
}
val item = args[1]
if (flag) {
if (sender !is Player) {
sender.sendMessage(Component.text("The sender is not a player.", NamedTextColor.RED))
return null
}
when (item) {
"compass" -> {
console.giveCompassIfNeed(sender)
}
else -> {
sender.sendMessage(Component.text("输入正确的队伍名称", NamedTextColor.RED))
}
}
return null
} else {
if (args.size == 2) {
return items.filter { it.startsWith(item) }
}
}
return null
}
/**
* 发送规则详情
*/
private fun sendRuleInfo(sender: CommandSender, ruleKey: RuleKey<*>) {
sender.sendMessage("游戏规则: " + ruleKey.name)
sender.sendMessage("描述: " + ruleKey.info)
sender.sendMessage("值类型: " + ruleKey.typeInfo)
sender.sendMessage("数值: " + console.gameRules.getRuleValue(ruleKey))
sender.sendMessage(Component.text("游戏规则: ${ruleKey.name}"))
sender.sendMessage(Component.text("描述: ${ruleKey.info}"))
sender.sendMessage(Component.text("值类型: ${ruleKey.typeInfo}"))
sender.sendMessage(Component.text("数值: ${console.gameRules.getRuleValue(ruleKey)}"))
}
/**

View File

@@ -12,6 +12,7 @@ import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.event.player.PlayerPortalEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.bukkit.event.player.PlayerTeleportEvent
import org.spigotmc.event.player.PlayerSpawnLocationEvent
import xyz.fortern.minehunt.Console
import xyz.fortern.minehunt.Console.GameStage
@@ -25,8 +26,7 @@ class PlayerListener(
@EventHandler
fun onPlayerJoin(event: PlayerJoinEvent) {
val player = event.player
val stage = console.stage
if (stage == GameStage.PREPARING && console.beginningCountdown == null) {
if (console.stage == GameStage.PREPARING && console.beginningCountdown == null) {
// 在准备阶段,玩家设为冒险模式
player.gameMode = GameMode.ADVENTURE
// 自动加入观察者队伍
@@ -40,15 +40,21 @@ class PlayerListener(
@EventHandler
fun onPlayerQuit(event: PlayerQuitEvent) {
val player = event.player
val stage = console.stage
if (stage == GameStage.PREPARING) {
if (console.stage == GameStage.PREPARING) {
if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) {
console.interruptCountdownToStart()
}
// 将离开的玩家从team中移除
player.scoreboard.teams.forEach { it.removePlayer(player) }
}
}
/**
* 猎人重生时给予追踪指南针
*/
@EventHandler
fun onPlayerSpawn(event: PlayerSpawnLocationEvent) {
console.giveCompassIfNeed(event.player)
}
/**