This commit is contained in:
2025-01-27 02:00:46 +08:00
commit e27f4ddb5c
9 changed files with 385 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
package xyz.fortern.minehunt
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.title.Title
import org.bukkit.Bukkit
import org.bukkit.Difficulty
import org.bukkit.GameRule
import org.bukkit.scheduler.BukkitTask
import org.bukkit.scoreboard.Team
/**
* 游戏控制台
*/
class Console {
var stage: GameStage = GameStage.PREPARING
/**
* 速通者队伍
*/
val speedrunnerTeam: Team
/**
* 猎人队伍
*/
private val hunterTeam: Team
/**
* 观察者队伍
*/
private val spectatorTeam: Team
/**
* 猎人持有的指南针指向的速通者在speedrunnerList中的index
*/
val trackRunnerMap: Map<String, Int> = HashMap()
/**
* 用于遍历的速通者列表
*/
val speedrunnerList: MutableList<String> = ArrayList()
private var countdownTask: BukkitTask? = null
companion object {
@JvmStatic
private lateinit var instance: Console
@JvmStatic
fun getInstance() = instance
}
init {
instance = this
// 设置游戏规则
val world = Bukkit.getWorld("world")!!
world.worldBorder.size = 32.0
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false)
world.setGameRule(GameRule.DO_WEATHER_CYCLE, false)
world.setGameRule(GameRule.DO_MOB_SPAWNING, false)
world.setGameRule(GameRule.KEEP_INVENTORY, true)
world.setGameRule(GameRule.SPAWN_RADIUS, 0)
world.setGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false)
world.difficulty = Difficulty.HARD
// 配置队伍
val scoreboard = Bukkit.getScoreboardManager().mainScoreboard
speedrunnerTeam = scoreboard.getTeam("speedrunner") ?: scoreboard.registerNewTeam("speedrunner")
hunterTeam = scoreboard.getTeam("hunter") ?: scoreboard.registerNewTeam("hunter")
spectatorTeam = scoreboard.getTeam("spectator") ?: scoreboard.registerNewTeam("spectator")
speedrunnerTeam.entries.forEach { speedrunnerTeam.removeEntries(it) }
hunterTeam.entries.forEach { hunterTeam.removeEntries(it) }
spectatorTeam.entries.forEach { spectatorTeam.removeEntries(it) }
}
fun tryStart(): Boolean {
if (speedrunnerTeam.size == 0) return false
if (Bukkit.getOnlinePlayers().count { it.isDead } > 0) return false
return true
}
fun countdownToStart() {
countdownTask = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), object : Runnable {
private var countdown = 6
override fun run() {
if (--countdown > 0) {
Bukkit.getOnlinePlayers().forEach {
val title = Title.title(
Component.text(countdown.toString(), NamedTextColor.DARK_PURPLE),
Component.text("开始倒计时", NamedTextColor.GRAY)
)
it.showTitle(title)
}
} else {
countdownTask = null
start()
}
}
}, 0, 20)
}
fun start() {
}
/**
* 游戏阶段
*/
enum class GameStage {
PREPARING, PROCESSING, OVER
}
}

View File

@@ -0,0 +1,34 @@
package xyz.fortern.minehunt
import org.bukkit.Bukkit
import org.bukkit.plugin.java.JavaPlugin
import xyz.fortern.minehunt.command.GodCommand
import xyz.fortern.minehunt.listener.PlayerListener
class Minehunt : JavaPlugin() {
companion object {
@JvmStatic
private lateinit var instance: Minehunt
@JvmStatic
fun instance() = instance
}
override fun onEnable() {
// Plugin startup logic
// 初始化
instance = this
val console = Console()
Bukkit.getPluginManager().registerEvents(PlayerListener(console), this)
Bukkit.getPluginCommand("god")!!.setExecutor(GodCommand())
}
override fun onDisable() {
// Plugin shutdown logic
}
}

View File

@@ -0,0 +1,14 @@
package xyz.fortern.minehunt.command
import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
class GodCommand: CommandExecutor {
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>?): Boolean {
if (sender is Player)
sender.isInvulnerable = !sender.isInvulnerable
return true
}
}

View File

@@ -0,0 +1,53 @@
package xyz.fortern.minehunt.listener
import org.bukkit.Bukkit
import org.bukkit.GameMode
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
import xyz.fortern.minehunt.Console
class PlayerListener(
private val console: Console
) : Listener {
@EventHandler
fun onPlayerJoin(event: PlayerJoinEvent) {
val player = event.player
val stage = console.stage
if (stage == Console.GameStage.PREPARING) {
player.gameMode = GameMode.ADVENTURE
} else if (stage == Console.GameStage.PROCESSING && console.speedrunnerTeam.hasEntry(player.name)) {
console.speedrunnerList.add(player.name)
}
}
@EventHandler
fun onPlayerQuit(event: PlayerQuitEvent) {
val player = event.player
val stage = console.stage
if (stage == Console.GameStage.PREPARING) {
player.scoreboard.teams.forEach { it.removeEntry(player.name) }
} else if (stage == Console.GameStage.PROCESSING && console.speedrunnerTeam.hasEntry(player.name)) {
console.speedrunnerList.remove(player.name)
}
player.spigot().respawn()
}
@EventHandler
fun onIn(event: PlayerInteractEvent) {
val team = Bukkit.getScoreboardManager().mainScoreboard.getTeam("A")!!
val size = team.entries.size
}
@EventHandler
fun onPlayerDeath(event: PlayerDeathEvent) {
val player = event.player
player.spigot().respawn()
}
}