From de3a83deaaacac110d0641f58ad402090a857189 Mon Sep 17 00:00:00 2001 From: Fortern Date: Sun, 7 Jun 2026 10:49:42 +0800 Subject: [PATCH] Depending on NBT-API --- pom.xml | 12 ++++ .../forternhelper/command/HelperCommand.kt | 72 ++++++++++++++++++- src/main/resources/plugin.yml | 5 +- 3 files changed, 86 insertions(+), 3 deletions(-) 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/command/HelperCommand.kt b/src/main/kotlin/xyz/fortern/forternhelper/command/HelperCommand.kt index ff628f2..e4e7474 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