nbt tools
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user