init
This commit is contained in:
117
src/main/kotlin/xyz/fortern/minehunt/Console.kt
Normal file
117
src/main/kotlin/xyz/fortern/minehunt/Console.kt
Normal 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
|
||||
}
|
||||
}
|
||||
34
src/main/kotlin/xyz/fortern/minehunt/Minehunt.kt
Normal file
34
src/main/kotlin/xyz/fortern/minehunt/Minehunt.kt
Normal 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
|
||||
}
|
||||
}
|
||||
|
||||
14
src/main/kotlin/xyz/fortern/minehunt/command/GodCommand.kt
Normal file
14
src/main/kotlin/xyz/fortern/minehunt/command/GodCommand.kt
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user