This commit is contained in:
2025-02-18 03:09:21 +08:00
parent 78e9bfcd74
commit 6be77e9f08
3 changed files with 65 additions and 23 deletions

View File

@@ -17,6 +17,7 @@ import org.bukkit.scheduler.BukkitRunnable
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.*
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
/** /**
@@ -61,6 +62,11 @@ class Console {
*/ */
private val spectatorSet: MutableSet<Player> = HashSet() private val spectatorSet: MutableSet<Player> = HashSet()
/**
* 淘汰玩家集合
*/
private val outPlayers: MutableSet<UUID> = HashSet()
/** /**
* 终止游戏的投票统计 * 终止游戏的投票统计
*/ */
@@ -360,7 +366,7 @@ class Console {
// 统计参与投票的玩家 // 统计参与投票的玩家
speedrunnerSet.forEach { speedrunnerSet.forEach {
// 生存模式的速通者统计进来 // 生存模式的速通者统计进来
if (it.isOnline && it.gameMode == GameMode.SURVIVAL) { if (it.isOnline && !outPlayers.contains(it.uniqueId)) {
votingEndMap[it.name] = false votingEndMap[it.name] = false
} }
} }
@@ -386,29 +392,31 @@ class Console {
} }
// 投票完成,游戏结束 // 投票完成,游戏结束
Bukkit.getOnlinePlayers().forEach { Bukkit.getOnlinePlayers().forEach {
it.sendMessage(Component.text("投票完成,游戏结束", NamedTextColor.GOLD)) it.sendMessage(Component.text("--------投票完成--------", NamedTextColor.GOLD))
} }
end() end(null)
} }
/** /**
* 结束处理 * 结束处理
*/ */
private fun end() { fun end(winner: String?) {
// TODO 延迟传送至出生点
// 取消剩余的复活任务
val iterator = hunterRespawnTasks.iterator()
while (iterator.hasNext()) {
iterator.next().value.cancel()
iterator.remove()
}
// 所有人传送至出生点,设为生存模式
Bukkit.getOnlinePlayers().forEach {
it.gameMode = GameMode.SURVIVAL
it.teleport(overworld.spawnLocation)
}
stage = GameStage.OVER stage = GameStage.OVER
// 所有人设为生存模式
Bukkit.getOnlinePlayers().forEach {
it.sendMessage(Component.text("--------游戏结束--------", NamedTextColor.GREEN))
if (winner != null) {
it.sendMessage(Component.text("获胜者:$winner", NamedTextColor.GOLD))
} else {
it.sendMessage(Component.text("没有赢家", NamedTextColor.GOLD))
}
it.gameMode = GameMode.SURVIVAL
}
// 取消剩余的复活任务
hunterRespawnTasks.forEach {
it.value.cancel()
}
hunterRespawnTasks.clear()
} }
/** /**
@@ -429,7 +437,7 @@ class Console {
j++ j++
j %= speedrunnerList.size j %= speedrunnerList.size
val speedrunner = speedrunnerList[i] val speedrunner = speedrunnerList[i]
if (speedrunner.gameMode == GameMode.SURVIVAL && speedrunner.isOnline || i == j) { if (!outPlayers.contains(speedrunner.uniqueId) && speedrunner.isOnline || i == j) {
trackRunnerMap[playerName] = j trackRunnerMap[playerName] = j
break break
} }
@@ -440,11 +448,15 @@ class Console {
* 处理玩家死亡 * 处理玩家死亡
*/ */
fun handlePlayerDeath(player: Player) { fun handlePlayerDeath(player: Player) {
if (isHunter(player)) { if (isSpeedrunner(player)) {
// 猎人置为旁观者模式 // 速通者置为旁观者模式,加入淘汰名单
player.gameMode = GameMode.SPECTATOR player.gameMode = GameMode.SPECTATOR
} else if (isSpeedrunner(player)) { outPlayers.add(player.uniqueId)
// 猎人置为旁观者模式 if (outPlayers.size == hunterSet.size) {
end("hunter")
}
} else if (isHunter(player)) {
// 猎人置为旁观者模式,稍后复活
player.gameMode = GameMode.SPECTATOR player.gameMode = GameMode.SPECTATOR
val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable { val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
player.gameMode = GameMode.SURVIVAL player.gameMode = GameMode.SURVIVAL

View File

@@ -2,9 +2,13 @@ package xyz.fortern.minehunt.command
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.command.Command import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender
import org.bukkit.enchantments.Enchantment
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
/** /**
* 开发过程中的测试命令 * 开发过程中的测试命令
@@ -39,7 +43,21 @@ class TestCommand : CommandExecutor {
else else
sender.sendMessage("玩家 $name 不存在") sender.sendMessage("玩家 $name 不存在")
} }
// 获得32k
"get32k" -> {
if (sender is Player) {
sender.give(
// 锋利等级被限制为255
ItemStack(Material.DIAMOND_SWORD).apply {
this.addUnsafeEnchantment(
Enchantment.SHARPNESS,
32000
)
}
)
}
}
} }
return true return true
} }
} }

View File

@@ -1,8 +1,10 @@
package xyz.fortern.minehunt.listener package xyz.fortern.minehunt.listener
import org.bukkit.GameMode import org.bukkit.GameMode
import org.bukkit.entity.EnderDragon
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDeathEvent
import org.bukkit.event.entity.PlayerDeathEvent import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
@@ -74,4 +76,14 @@ class PlayerListener(
console.handlePlayerDeath(player) console.handlePlayerDeath(player)
} }
/**
* 末影龙死亡事件
*/
@EventHandler
fun onDragonDeath(event: EntityDeathEvent) {
if (event.entity is EnderDragon && console.stage == GameStage.PROCESSING) {
console.end("speedrunner")
}
}
} }