This commit is contained in:
2025-02-11 01:36:48 +08:00
parent f569036a94
commit 2a8f395ae9
2 changed files with 78 additions and 36 deletions

View File

@@ -3,12 +3,7 @@ package xyz.fortern.minehunt
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.title.Title import net.kyori.adventure.title.Title
import org.bukkit.Bukkit import org.bukkit.*
import org.bukkit.Difficulty
import org.bukkit.GameMode
import org.bukkit.GameRule
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.enchantments.Enchantment import org.bukkit.enchantments.Enchantment
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@@ -26,6 +21,8 @@ class Console {
var stage: GameStage = GameStage.PREPARING var stage: GameStage = GameStage.PREPARING
var overworld = Bukkit.getWorld("world")!!
/** /**
* 速通者队伍 * 速通者队伍
*/ */
@@ -95,6 +92,11 @@ class Console {
itemMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, false) itemMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, false)
} }
/**
* 猎人重生Task保留这些引用方便在游戏结束时取消这些任务
*/
private val hunterRespawnTasks: MutableMap<Player, BukkitTask> = HashMap()
/** /**
* 游戏开始前的倒计时任务 * 游戏开始前的倒计时任务
*/ */
@@ -123,15 +125,14 @@ class Console {
init { init {
instance = this instance = this
// 初始化游戏规则 // 初始化游戏规则
val world = Bukkit.getWorld("world")!! overworld.worldBorder.size = 32.0
world.worldBorder.size = 32.0 overworld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false)
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false) overworld.setGameRule(GameRule.DO_WEATHER_CYCLE, false)
world.setGameRule(GameRule.DO_WEATHER_CYCLE, false) overworld.setGameRule(GameRule.DO_MOB_SPAWNING, false)
world.setGameRule(GameRule.DO_MOB_SPAWNING, false) overworld.setGameRule(GameRule.KEEP_INVENTORY, true)
world.setGameRule(GameRule.KEEP_INVENTORY, true) overworld.setGameRule(GameRule.SPAWN_RADIUS, 0)
world.setGameRule(GameRule.SPAWN_RADIUS, 0) overworld.setGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false)
world.setGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false) overworld.difficulty = Difficulty.HARD
world.difficulty = Difficulty.HARD
// 初始化队伍 // 初始化队伍
val scoreboard = Bukkit.getScoreboardManager().mainScoreboard val scoreboard = Bukkit.getScoreboardManager().mainScoreboard
@@ -202,7 +203,7 @@ class Console {
/** /**
* 游戏开始前的倒计时 * 游戏开始前的倒计时
*/ */
fun countdownToStart() { private fun countdownToStart() {
beginningCountdown = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), object : Runnable { beginningCountdown = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), object : Runnable {
private var countdown = 6 private var countdown = 6
override fun run() { override fun run() {
@@ -262,7 +263,7 @@ class Console {
// 将猎人传送到世界底部,且指南针开始有所指向 // 将猎人传送到世界底部,且指南针开始有所指向
hunterSet.forEach { hunterSet.forEach {
it.teleport(Location(world, 0.0, -64.0, 0.0)) it.teleport(Location(world, 0.0, -64.0, 0.0))
trackRunnerMap.put(it.name, 0) trackRunnerMap[it.name] = 0
} }
// 创建指南针更新任务 // 创建指南针更新任务
@@ -270,17 +271,17 @@ class Console {
override fun run() { override fun run() {
hunterSet.forEach { hunterSet.forEach {
if (!it.isOnline) return@forEach if (!it.isOnline) return@forEach
var i = (trackRunnerMap[it.name] ?: return@forEach) % speedrunnerList.size val i = (trackRunnerMap[it.name] ?: return@forEach) % speedrunnerList.size
val speedrunner = speedrunnerList[i] val speedrunner = speedrunnerList[i]
val items = it.inventory.all(hunterCompass) val items = it.inventory.all(hunterCompass)
var flag = false var flag = false
items.forEach { k, v -> items.forEach { (k, v) ->
val lore = v.lore() val lore = v.lore()
// 避免玩家身上有多个猎人指南针 // 避免玩家身上有多个猎人指南针
if (flag) { if (flag) {
it.inventory.clear(k) it.inventory.clear(k)
} }
if (lore != null && lore.isNotEmpty() && lore[0].equals(compassFlag)) { if (!lore.isNullOrEmpty() && lore[0].equals(compassFlag)) {
flag = true flag = true
// 让指南针指向某一个猎人 // 让指南针指向某一个猎人
val meta = v.itemMeta as CompassMeta val meta = v.itemMeta as CompassMeta
@@ -311,6 +312,26 @@ class Console {
} }
/**
* 结束处理
*/
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)
}
stage = GameStage.OVER
}
/** /**
* 判断物品是否为猎人指南针 * 判断物品是否为猎人指南针
*/ */
@@ -321,16 +342,37 @@ class Console {
*/ */
fun trackNextPlayer(playerName: String) { fun trackNextPlayer(playerName: String) {
if (stage != GameStage.PROCESSING) return if (stage != GameStage.PROCESSING) return
var i = trackRunnerMap[playerName] ?: return val i = trackRunnerMap[playerName] ?: return
if (speedrunnerList.isEmpty()) return
var j = i
while (true) { while (true) {
i++ j++
i %= speedrunnerList.size j %= speedrunnerList.size
val speedrunner = speedrunnerList[i] val speedrunner = speedrunnerList[i]
if (speedrunner.gameMode == GameMode.SURVIVAL) { if (speedrunner.gameMode == GameMode.SURVIVAL && speedrunner.isOnline || i == j) {
continue trackRunnerMap[playerName] = j
break
} }
} }
trackRunnerMap[playerName] = i % speedrunnerList.size }
/**
* 处理玩家死亡
*/
fun handlePlayerDeath(player: Player) {
if (isHunter(player)) {
// 猎人置为旁观者模式
player.gameMode = GameMode.SPECTATOR
} else if (isSpeedrunner(player)) {
// 猎人置为旁观者模式
player.gameMode = GameMode.SPECTATOR
val task = Bukkit.getScheduler().runTaskLater(Minehunt.instance(), Runnable {
player.gameMode = GameMode.SURVIVAL
hunterRespawnTasks.remove(player)
}, 20)
hunterRespawnTasks[player] = task
}
} }
/** /**

View File

@@ -54,16 +54,14 @@ class PlayerListener(
} }
/** /**
* 玩家丢弃物品时,阻止玩家丢弃猎人指南针 * 玩家丢弃物品时,阻止玩家丢弃猎人指南针,并将追踪目标切换到下一个
*/ */
@EventHandler @EventHandler
fun onDropItem(event: PlayerDropItemEvent) { fun onDropItem(event: PlayerDropItemEvent) {
val itemStack = event.itemDrop.itemStack val itemStack = event.itemDrop.itemStack
if (!console.isHunterCompass(itemStack)) { if (!console.isHunterCompass(itemStack)) return
return
} console.trackNextPlayer(event.player.name)
val player = event.player
// console.trackRunnerMap[player.name] = 0
} }
/** /**
@@ -73,18 +71,20 @@ class PlayerListener(
fun onPlayerMove(event: PlayerMoveEvent) { fun onPlayerMove(event: PlayerMoveEvent) {
// 暂且通过取消事件的方法阻止玩家移动 // 暂且通过取消事件的方法阻止玩家移动
if (console.stage != GameStage.PROCESSING) return if (console.stage != GameStage.PROCESSING) return
val player = event.player val player = event.player
// 猎人等待出生时,或等待复活时,阻止其移动 // 猎人等待出生时,或等待复活时,阻止其移动
if (console.isHunter(player) && (console.hunterSpawnCD != null || player.gameMode == GameMode.SPECTATOR)) if (console.isHunter(player) && (console.hunterSpawnCD != null || player.gameMode == GameMode.SPECTATOR))
event.isCancelled = true event.isCancelled = true
} }
/**
* 处理玩家死亡事件
*/
@EventHandler
fun onPlayerDeath(event: PlayerDeathEvent) { fun onPlayerDeath(event: PlayerDeathEvent) {
val player = event.entity val player = event.entity
if (console.isHunter(player)) { console.handlePlayerDeath(player)
// 猎人置为旁观者模式
player.gameMode = GameMode.SPECTATOR
}
} }
} }