init 23
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 游戏阶段
|
||||
*/
|
||||
|
||||
@@ -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)}"))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user