diff --git a/pom.xml b/pom.xml
index 83e299e..3dae868 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,6 +69,11 @@
placeholderapi
https://repo.helpch.at/releases/
+
+ codemc-repo
+ https://repo.codemc.io/repository/maven-public/
+ default
+
@@ -113,5 +118,12 @@
2.12.2
provided
+
+
+ de.tr7zw
+ item-nbt-api-plugin
+ 2.15.7
+ provided
+
diff --git a/src/main/kotlin/xyz/fortern/forternhelper/Helper.kt b/src/main/kotlin/xyz/fortern/forternhelper/Helper.kt
index d6d2243..6cfbe9a 100644
--- a/src/main/kotlin/xyz/fortern/forternhelper/Helper.kt
+++ b/src/main/kotlin/xyz/fortern/forternhelper/Helper.kt
@@ -7,6 +7,7 @@ import org.bukkit.plugin.java.JavaPlugin
import xyz.fortern.forternhelper.command.HelperCommand
import xyz.fortern.forternhelper.listener.ForternListener
import xyz.fortern.forternhelper.placeholder.ForternExpansion
+import java.io.File
class Helper : JavaPlugin() {
private lateinit var adventure: BukkitAudiences
@@ -16,13 +17,19 @@ class Helper : JavaPlugin() {
override fun onEnable() {
// Plugin startup logic
this.adventure = BukkitAudiences.create(this)
- logger.info("Registering listeners...")
+
+ // init data-folders
+ logger.info("Initializing data-folders...")
+ File(this.dataFolder, "block-nbt").mkdirs()
+ File(this.dataFolder, "item-nbt").mkdirs()
+
// register listeners
+ logger.info("Registering listeners...")
Bukkit.getPluginManager().registerEvents(ForternListener(this), this)
- logger.info("Registering commands...")
// register commands
+ logger.info("Registering commands...")
Bukkit.getPluginCommand("helper")?.setExecutor(HelperCommand(this, adventure))
- // register placeholder
+ // register placeholders
expansion = ForternExpansion(this)
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
logger.info("Registering placeholders...")
diff --git a/src/main/kotlin/xyz/fortern/forternhelper/command/HelperCommand.kt b/src/main/kotlin/xyz/fortern/forternhelper/command/HelperCommand.kt
index 6e1fc97..920a206 100644
--- a/src/main/kotlin/xyz/fortern/forternhelper/command/HelperCommand.kt
+++ b/src/main/kotlin/xyz/fortern/forternhelper/command/HelperCommand.kt
@@ -1,5 +1,7 @@
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.text.Component
import net.kyori.adventure.text.format.NamedTextColor
@@ -9,6 +11,8 @@ import org.bukkit.command.CommandSender
import org.bukkit.command.TabExecutor
import org.bukkit.entity.Player
import org.bukkit.plugin.java.JavaPlugin
+import java.io.File
+import java.io.FileReader
class HelperCommand(
private val plugin: JavaPlugin,
@@ -54,8 +58,24 @@ class HelperCommand(
}
}
return when (args[0]) {
- "help" -> onHelp(sender, exe)
- "loadlevel" -> onLoadLevel(sender, args, exe)
+ "help" -> {
+ onHelp(sender, exe)
+ }
+
+ "loadlevel" -> {
+ onLoadLevel(sender, args, exe)
+ }
+
+ "setblock" -> {
+ setBlockFromNbt(sender, args, exe)
+ null
+ }
+
+ "getitem" -> {
+ getItemFromNbt(sender, args, exe)
+ null
+ }
+
else -> {
if (exe) {
adventure.sender(sender).sendMessage(Component.text("错误的子命令"))
@@ -68,6 +88,54 @@ class HelperCommand(
}
}
+ private fun getItemFromNbt(sender: CommandSender, args: List, 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")
+ val nbt = if (isNbt) {
+ val file = File(itemNbtDir, "${i}.nbt")
+ if (!file.exists()) return
+ NBT.readFile(file)
+ } else {
+ val file = File(itemNbtDir, "${i}.txt")
+ if (!file.exists()) return
+ NBT.parseNBT(FileReader(file).readAllAsString())
+ }
+ sender.inventory.addItem(NBT.itemStackFromNBT(nbt))
+ return
+ }
+
+ private fun setBlockFromNbt(sender: CommandSender, args: List, 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 itemNbtDir = File(plugin.dataFolder, "block-nbt")
+ val readWriteNBT = if (isNbt) {
+ val file = File(itemNbtDir, "${i}.nbt")
+ if (!file.exists()) return
+ NBT.readFile(file)
+ } else {
+ val file = File(itemNbtDir, "${i}.txt")
+ if (!file.exists()) return
+ NBT.parseNBT(FileReader(file).readAllAsString())
+ }
+ NBT.modify(blockState) { nbt: ReadWriteNBT ->
+ nbt.mergeCompound(readWriteNBT)
+ }
+ return
+ }
+
private fun onHelp(sender: CommandSender, exe: Boolean): List? {
if (exe) sendHelp(sender)
return null
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 1d44a6b..7538445 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -3,7 +3,10 @@ version: '${version}'
authors: [ Fortern ]
api-version: '26.1'
main: xyz.fortern.forternhelper.Helper
-softdepend: ["PlaceholderAPI"]
+softdepend:
+ - PlaceholderAPI
+depend:
+ - NBTAPI
libraries:
- org.jetbrains.kotlin:kotlin-stdlib:2.3.21