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.scoreboard.Team
import xyz.fortern.minehunt.rule.RuleItem
import java.util.*
import java.util.concurrent.ConcurrentHashMap
/**
@@ -61,6 +62,11 @@ class Console {
*/
private val spectatorSet: MutableSet<Player> = HashSet()
/**
* 淘汰玩家集合
*/
private val outPlayers: MutableSet<UUID> = HashSet()
/**
* 终止游戏的投票统计
*/
@@ -360,7 +366,7 @@ class Console {
// 统计参与投票的玩家
speedrunnerSet.forEach {
// 生存模式的速通者统计进来
if (it.isOnline && it.gameMode == GameMode.SURVIVAL) {
if (it.isOnline && !outPlayers.contains(it.uniqueId)) {
votingEndMap[it.name] = false
}
}
@@ -386,29 +392,31 @@ class Console {
}
// 投票完成,游戏结束
Bukkit.getOnlinePlayers().forEach {
it.sendMessage(Component.text("投票完成,游戏结束", NamedTextColor.GOLD))
it.sendMessage(Component.text("--------投票完成--------", NamedTextColor.GOLD))
}
end()
end(null)
}
/**
* 结束处理
*/
private fun end() {
// 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)
}
fun end(winner: String?) {
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 %= speedrunnerList.size
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
break
}
@@ -440,11 +448,15 @@ class Console {
* 处理玩家死亡
*/
fun handlePlayerDeath(player: Player) {
if (isHunter(player)) {
// 猎人置为旁观者模式
if (isSpeedrunner(player)) {
// 速通者置为旁观者模式,加入淘汰名单
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
val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
player.gameMode = GameMode.SURVIVAL

View File

@@ -2,9 +2,13 @@ package xyz.fortern.minehunt.command
import net.kyori.adventure.text.Component
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
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
sender.sendMessage("玩家 $name 不存在")
}
// 获得32k
"get32k" -> {
if (sender is Player) {
sender.give(
// 锋利等级被限制为255
ItemStack(Material.DIAMOND_SWORD).apply {
this.addUnsafeEnchantment(
Enchantment.SHARPNESS,
32000
)
}
)
}
}
}
return true
}
}
}

View File

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