区块等级

This commit is contained in:
2026-06-04 01:33:57 +08:00
parent 9d5df29afa
commit 4cf440b843
5 changed files with 158 additions and 3 deletions
+23
View File
@@ -68,16 +68,39 @@
</repositories>
<dependencies>
<!-- Spigot API -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>26.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Kotlin Stdlib https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib -->
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<!-- JetBrains Java Annotations https://mvnrepository.com/artifact/org.jetbrains/annotations -->
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>26.1.0</version>
<scope>compile</scope>
</dependency>
<!-- Adventure API https://mvnrepository.com/artifact/net.kyori/adventure-api -->
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.26.1</version>
<scope>provided</scope>
</dependency>
<!-- Adventure Platform Bukkit https://mvnrepository.com/artifact/net.kyori/adventure-platform-bukkit -->
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.4.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -1,15 +1,20 @@
package xyz.fortern.forternhelper
import net.kyori.adventure.platform.bukkit.BukkitAudiences
import org.bukkit.Bukkit
import org.bukkit.plugin.java.JavaPlugin
import xyz.fortern.forternhelper.command.HelperCommand
import xyz.fortern.forternhelper.listener.ForternListener
class Helper : JavaPlugin() {
private lateinit var adventure: BukkitAudiences
override fun onEnable() {
// Plugin startup logic
this.adventure = BukkitAudiences.create(this)
logger.info("Registering listeners...")
Bukkit.getPluginManager().registerEvents(ForternListener(this), this)
Bukkit.getPluginCommand("helper")?.setExecutor(HelperCommand(this, adventure))
}
override fun onDisable() {
@@ -0,0 +1,121 @@
package xyz.fortern.forternhelper.command
import net.kyori.adventure.platform.bukkit.BukkitAudiences
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.Bukkit
import org.bukkit.command.Command
import org.bukkit.command.CommandSender
import org.bukkit.command.TabExecutor
import org.bukkit.entity.Player
import org.bukkit.plugin.java.JavaPlugin
class HelperCommand(
private val plugin: JavaPlugin,
private val adventure: BukkitAudiences,
) : TabExecutor {
private val subCommands: List<String> = listOf("loadlevel")
private val helpMessages = listOf(
Component.text("fortern-helper v${plugin.description.version}", NamedTextColor.GREEN),
Component.text("/helper help ", NamedTextColor.GOLD)
.append(Component.text("帮助信息", NamedTextColor.WHITE)),
Component.text("/helper loadlevel <chunkPosX> <chunkPosZ> [world] ", NamedTextColor.GOLD)
.append(Component.text("查看区块的加载等级", NamedTextColor.WHITE)),
)
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<String>): Boolean {
// onCommand接受到的参数中没有空字符串
handlerCommand(sender, args.toList(), true)
return true
}
override fun onTabComplete(sender: CommandSender, command: Command, label: String, args: Array<String>): List<String>? {
return handlerCommand(
sender,
args.filterIndexed { index, s -> s != "" || index == args.size - 1 },
false
)
}
/**
* 执行命令或补全命令
*
* @param exe true 表示执行命令,false 表示补全命令
* @param args 命令的参数列表,除最后一条前面的每一条都应当是非空的
*/
private fun handlerCommand(sender: CommandSender, args: List<String>, exe: Boolean): List<String>? {
if (args.isEmpty()) {
return if (exe) {
sendHelp(sender)
null
} else {
subCommands
}
}
return when (args[0]) {
"help" -> onHelp(sender, exe)
"loadlevel" -> onLoadLevel(sender, args, exe)
else -> {
if (exe) {
adventure.sender(sender).sendMessage(Component.text("错误的子命令"))
null
} else {
// 补全已args[0]开头的子命令
if (args.size == 1) subCommands.filter { it.startsWith(args[0]) } else null
}
}
}
}
private fun onHelp(sender: CommandSender, exe: Boolean): List<String>? {
if (exe) sendHelp(sender)
return null
}
private fun onLoadLevel(sender: CommandSender, args: List<String>, exe: Boolean): List<String>? {
// args[0]: loadlevel args[1]:15 args[2]:15 args[3]:world_the_end
if (args.size < 2) {
if (exe) {
adventure.sender(sender).sendMessage(Component.text("指定正确的区块坐标", NamedTextColor.RED))
}
return null
}
var x = 0
var z = 0
if (exe) {
try {
x = args[1].toInt()
z = args[2].toInt()
} catch (_: NumberFormatException) {
adventure.sender(sender).sendMessage(Component.text("指定正确的区块坐标", NamedTextColor.RED))
}
val worldInArg = if (args.size == 4 && args[3].isNotBlank()) {
Bukkit.getWorld(args[3])
} else {
null
}
val world = worldInArg ?: if (sender !is Player) {
adventure.sender(sender).sendMessage(Component.text("世界名称不正确", NamedTextColor.RED))
return null
} else {
sender.world
}
val chunk = world.getChunkAt(x, z)
val loadLevel = chunk.loadLevel
adventure.sender(sender).sendMessage(Component.text("ChunkPos(${args[1]}, ${args[2]}) loadLevel: $loadLevel"))
return null
} else {
if (args.size == 4) {
val worldName = args[3]
return Bukkit.getWorlds().filter { it.name.startsWith(worldName) }.map { it.name }
} else {
return null
}
}
}
private fun sendHelp(sender: CommandSender) {
helpMessages.forEach { adventure.sender(sender).sendMessage(it) }
}
}
@@ -4,10 +4,10 @@ import org.bukkit.entity.Villager
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerInteractEntityEvent
import xyz.fortern.forternhelper.Helper
import org.bukkit.plugin.java.JavaPlugin
import xyz.fortern.forternhelper.reflection.NMSAdapter
class ForternListener(val helper: Helper) : Listener {
class ForternListener(val plugin: JavaPlugin) : Listener {
@EventHandler
fun onTrade(event: PlayerInteractEntityEvent) {
val entity = event.rightClicked
+7 -1
View File
@@ -6,8 +6,14 @@ main: xyz.fortern.forternhelper.Helper
libraries:
- org.jetbrains.kotlin:kotlin-stdlib:2.3.21
- net.kyori:adventure-api:4.26.1
- net.kyori:adventure-platform-bukkit:4.4.1
commands:
helper:
description: "游戏主命令"
permission: op
permission: fortern.helper
permissions:
fortern.helper:
default: op