diff --git a/pom.xml b/pom.xml index 35bfcd8..eed4538 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 54df13d..2866d39 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