init
This commit is contained in:
117
.gitignore
vendored
Normal file
117
.gitignore
vendored
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# User-specific stuff
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
|
||||||
|
# Compiled class file
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Log file
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# BlueJ files
|
||||||
|
*.ctxt
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
target/
|
||||||
|
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
|
.flattened-pom.xml
|
||||||
|
|
||||||
|
# Common working directory
|
||||||
|
run/
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.gradle/
|
||||||
|
build/
|
||||||
34
build.gradle.kts
Normal file
34
build.gradle.kts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
plugins {
|
||||||
|
kotlin("jvm") version "2.1.0"
|
||||||
|
id("com.gradleup.shadow") version "8.3.5"
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "xyz.fortern"
|
||||||
|
version = "1.0-SNAPSHOT"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven("https://repo.papermc.io/repository/maven-public/") {
|
||||||
|
name = "papermc-repo"
|
||||||
|
}
|
||||||
|
maven("https://oss.sonatype.org/content/groups/public/") {
|
||||||
|
name = "sonatype"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// Paper API
|
||||||
|
compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
|
||||||
|
// Adventure API
|
||||||
|
compileOnly("net.kyori:adventure-api:4.14.0")
|
||||||
|
// Kotlin Stdlib https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib
|
||||||
|
implementation(kotlin("stdlib"))
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
jvmToolchain(21)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.build {
|
||||||
|
dependsOn("shadowJar")
|
||||||
|
}
|
||||||
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||||
|
networkTimeout=10000
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
1
settings.gradle.kts
Normal file
1
settings.gradle.kts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
rootProject.name = "Minehunt"
|
||||||
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/main/resources/plugin.yml
Normal file
9
src/main/resources/plugin.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
name: Minehunt
|
||||||
|
version: '1.0-SNAPSHOT'
|
||||||
|
main: xyz.fortern.minehunt.Minehunt
|
||||||
|
api-version: '1.21'
|
||||||
|
authors: [ Fortern ]
|
||||||
|
|
||||||
|
commands:
|
||||||
|
god:
|
||||||
|
description: "使自己无敌"
|
||||||
Reference in New Issue
Block a user