This commit is contained in:
2025-02-23 21:20:29 +08:00
parent 5f9346a34e
commit 946fb5c237
3 changed files with 38 additions and 21 deletions

View File

@@ -5,6 +5,7 @@ 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
import org.bukkit.Difficulty
import org.bukkit.GameMode
@@ -245,21 +246,30 @@ class Console {
* 加入猎人阵营
*/
fun joinHunter(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) {
hunterTeam.addEntry(player.name)
player.sendMessage(Component.text("你已加入[猎人]"))
}
}
/**
* 加入速通者阵营
*/
fun joinSpeedrunner(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) {
speedrunnerTeam.addEntry(player.name)
player.sendMessage(Component.text("你已加入[速通者]"))
}
}
/**
* 加入观察者阵营
*/
fun joinSpectator(player: Player) {
if (stage == GameStage.PREPARING && beginningCountdown == null) {
spectatorTeam.addEntry(player.name)
player.sendMessage(Component.text("你已加入[观众]"))
}
}
/**
@@ -286,7 +296,8 @@ class Console {
Bukkit.getOnlinePlayers().forEach {
val title = Title.title(
Component.text(countdown.toString(), NamedTextColor.DARK_PURPLE),
Component.text("开始倒计时", NamedTextColor.GRAY)
Component.text("开始倒计时", NamedTextColor.GRAY),
Title.Times.times(Ticks.duration(5), Ticks.duration(20), Ticks.duration(5))
)
it.showTitle(title)
}
@@ -311,6 +322,10 @@ class Console {
* 游戏阶段由 PREPARING 变为 PROCESSING
*/
private fun start() {
// 速通者更改为生存模式并加入speedrunnerList
speedrunnerTeam.entries.forEach { entry ->
Bukkit.getPlayer(entry)?.let { speedrunnerSet.add(it.uniqueId) }
}
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
// 修改游戏规则
@@ -321,6 +336,7 @@ class Console {
world.setGameRule(GameRule.KEEP_INVENTORY, false)
world.setGameRule(GameRule.SPAWN_RADIUS, 10)
world.difficulty = Difficulty.HARD
overworld.worldBorder.size = 9999999.0
val spawnLocation = world.spawnLocation
@@ -337,12 +353,9 @@ class Console {
// 速通者更改为生存模式并加入speedrunnerList
speedrunnerTeam.entries.forEach { entry ->
Bukkit.getPlayer(entry)?.let {
speedrunnerSet.add(it.uniqueId)
it.gameMode = GameMode.SURVIVAL
Bukkit.getPlayer(entry)?.let { it.gameMode = GameMode.SURVIVAL }
}
}
speedrunnerSet.toList()
speedrunnerList = speedrunnerSet.toList()
// 将猎人传送到世界底部,且指南针开始有所指向
hunterTeam.entries.forEach { entry ->
@@ -387,6 +400,7 @@ class Console {
}
}, gameRules.getRuleValue(RuleKey.HUNTER_READY_CD) * 20L)
stage = GameStage.PROCESSING
}
/**
@@ -536,7 +550,7 @@ class Console {
playerListName.style(Style.style(TextDecoration.STRIKETHROUGH))
player.playerListName(playerListName)
// 如给所有hunter都淘汰则游戏结束
if (outPlayers.size == hunterSet.size) {
if (outPlayers.size == speedrunnerSet.size) {
end("hunter")
}
} else if (isHunter(player)) {

View File

@@ -17,7 +17,7 @@ class MinehuntCommand(
private val console: Console
) : TabExecutor {
private val subCommands: List<String> = listOf("help", "join", "leave", "rule", "stat", "stop")
private val subCommands: List<String> = listOf("help", "join", "leave", "rule", "start", "stop")
private val teams: List<String> = listOf("hunter", "speedrunner", "spectator")
private val rules: List<String> = listOf("hunter_respawn_cd", "hunter_ready_cd", "friendly_fire")
@@ -276,9 +276,12 @@ class MinehuntCommand(
private fun onStart(sender: CommandSender, flag: Boolean): List<String>? {
if (flag) {
if (console.stage == Console.GameStage.PREPARING) {
console.tryStart()
val result = console.tryStart()
if (result.isNotEmpty()) {
sender.sendMessage(Component.text("游戏开始失败,原因:${result}", NamedTextColor.RED))
}
} else {
sender.sendMessage("游戏已经开始或已经结束")
sender.sendMessage(Component.text("游戏已经开始或已经结束"))
}
}
return null

View File

@@ -29,8 +29,6 @@ class PlayerListener(
if (stage == GameStage.PREPARING && console.beginningCountdown == null) {
// 在准备阶段,玩家设为冒险模式
player.gameMode = GameMode.ADVENTURE
// 重置队伍信息
player.scoreboard.teams.forEach { it.removeEntry(player.name) }
// 自动加入观察者队伍
console.spectatorTeam.addEntry(player.name)
}
@@ -40,17 +38,19 @@ class PlayerListener(
* 参与游戏的玩家在倒计时阶段退出,则中断倒计时
*/
@EventHandler
fun onPlayerJoin(event: PlayerQuitEvent) {
fun onPlayerQuit(event: PlayerQuitEvent) {
val player = event.player
val stage = console.stage
if (stage == GameStage.PREPARING
&& console.beginningCountdown != null
&& (console.isHunter(player) || console.isSpeedrunner(player))
) {
if (stage == GameStage.PREPARING) {
// 重置队伍信息
player.scoreboard.teams.forEach { it.removeEntry(player.name) }
if (console.beginningCountdown != null && (console.isHunter(player) || console.isSpeedrunner(player))) {
console.interruptCountdownToStart()
}
}
}
/**
* 玩家丢弃物品时,阻止玩家丢弃猎人指南针,并将追踪目标切换到下一个
*/