nbt tools

This commit is contained in:
2026-06-07 19:32:48 +08:00
parent 9c3e597789
commit d850455b98
2 changed files with 127 additions and 0 deletions
@@ -21,6 +21,11 @@ class Helper : JavaPlugin() {
// Plugin startup logic // Plugin startup logic
this.adventure = BukkitAudiences.create(this) this.adventure = BukkitAudiences.create(this)
// init data-folders
logger.info("Initializing data-folders...")
File(this.dataFolder, "block-nbt").mkdirs()
File(this.dataFolder, "item-nbt").mkdirs()
// register asyncManager // register asyncManager
logger.info("Registering asyncManager...") logger.info("Registering asyncManager...")
asyncManager = AsyncManager(this) asyncManager = AsyncManager(this)
@@ -1,5 +1,7 @@
package xyz.fortern.forternhelper.command package xyz.fortern.forternhelper.command
import de.tr7zw.nbtapi.NBT
import de.tr7zw.nbtapi.iface.ReadWriteNBT
import net.kyori.adventure.platform.bukkit.BukkitAudiences import net.kyori.adventure.platform.bukkit.BukkitAudiences
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
@@ -10,6 +12,9 @@ import org.bukkit.command.TabExecutor
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.plugin.java.JavaPlugin import org.bukkit.plugin.java.JavaPlugin
import xyz.fortern.forternhelper.async.AsyncManager import xyz.fortern.forternhelper.async.AsyncManager
import java.io.File
import java.io.FileReader
import java.util.logging.Level
class HelperCommand( class HelperCommand(
private val plugin: JavaPlugin, private val plugin: JavaPlugin,
@@ -63,6 +68,16 @@ class HelperCommand(
onLoadLevel(sender, args, exe) onLoadLevel(sender, args, exe)
} }
"setblock" -> {
setBlockFromNbt(sender, args, exe)
null
}
"getitem" -> {
getItemFromNbt(sender, args, exe)
null
}
else -> { else -> {
if (exe) { if (exe) {
adventure.sender(sender).sendMessage(Component.text("错误的子命令")) adventure.sender(sender).sendMessage(Component.text("错误的子命令"))
@@ -75,6 +90,113 @@ class HelperCommand(
} }
} }
private fun getItemFromNbt(sender: CommandSender, args: List<String>, exe: Boolean) {
// args[0]:getitem | args[1]:0 | args[2]:txt
if (!exe) return
if (sender !is Player) return
if (!sender.isOp) return
if (args.size < 2) return
val i = args[1]
val isNbt = if (args.size > 2) args[2] == "nbt" else false
val itemNbtDir = File(plugin.dataFolder, "item-nbt")
var readWriteNBT: ReadWriteNBT? = null
var fileExists = true
var parse = true
asyncManager.execInMainAfterAsync("read item nbt in helper command", 20, run@{
if (isNbt) {
val file = File(itemNbtDir, "${i}.nbt")
if (!file.exists()) {
fileExists = false
return@run
}
try {
readWriteNBT = NBT.readFile(file)
} catch (ex: Exception) {
plugin.logger.log(Level.WARNING, "Error reading nbt", ex)
parse = false
}
} else {
val file = File(itemNbtDir, "${i}.txt")
if (!file.exists()) {
fileExists = false
return@run
}
try {
readWriteNBT = NBT.parseNBT(FileReader(file).readAllAsString())
} catch (ex: Exception) {
plugin.logger.log(Level.WARNING, "Error reading nbt", ex)
parse = false
}
}
}) {
if (!fileExists) {
adventure.sender(sender).sendMessage(Component.text("文件不存在"))
} else if (!parse) {
adventure.sender(sender).sendMessage(Component.text("文件解析错误"))
} else {
if (readWriteNBT != null) {
sender.inventory.addItem(NBT.itemStackFromNBT(readWriteNBT))
}
}
}
return
}
private fun setBlockFromNbt(sender: CommandSender, args: List<String>, exe: Boolean) {
// args[0]:setblock | args[1]:0 | args[2]:txt
if (!exe) return
if (sender !is Player) return
if (!sender.isOp) return
if (args.size < 2) return
val i = args[1]
val isNbt = if (args.size > 2) args[2] == "nbt" else false
val world = sender.world
val blockState = world.getBlockState(0, 128, 0)
val blockNbtDir = File(plugin.dataFolder, "block-nbt")
var readWriteNBT: ReadWriteNBT? = null
var fileExists = true
var parse = true
asyncManager.execInMainAfterAsync("read block nbt in helper command", 20, run@{
if (isNbt) {
val file = File(blockNbtDir, "${i}.nbt")
if (!file.exists()) {
fileExists = false
return@run
}
try {
readWriteNBT = NBT.readFile(file)
} catch (ex: Exception) {
plugin.logger.log(Level.WARNING, "Error reading nbt", ex)
parse = false
}
} else {
val file = File(blockNbtDir, "${i}.txt")
if (!file.exists()) {
fileExists = false
return@run
}
readWriteNBT = NBT.parseNBT(FileReader(file).readAllAsString())
}
}) {
if (!fileExists) {
adventure.sender(sender).sendMessage(Component.text("文件不存在"))
} else if (!parse) {
adventure.sender(sender).sendMessage(Component.text("文件解析错误"))
} else {
if (readWriteNBT != null) {
NBT.modify(blockState) { nbt: ReadWriteNBT ->
nbt.mergeCompound(readWriteNBT)
}
}
}
}
return
}
private fun onHelp(sender: CommandSender, exe: Boolean): List<String>? { private fun onHelp(sender: CommandSender, exe: Boolean): List<String>? {
if (exe) sendHelp(sender) if (exe) sendHelp(sender)
return null return null