From 9119c6e7ece7bfe3420fc3eb1aea947040c6db3b Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 14:04:27 +0200 Subject: [PATCH 1/9] Fix gradle building and add custom nbt item support to special.yml --- build.gradle.kts | 10 ++++-- .../config/SpecialConfig.java | 31 +++++++++++++++++-- src/main/resources/META-INF/.mojang-mapped | 0 src/main/resources/special.yml | 3 ++ 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/META-INF/.mojang-mapped diff --git a/build.gradle.kts b/build.gradle.kts index 0ed4090..9a86638 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,9 +17,11 @@ java { repositories { mavenCentral() + mavenLocal() maven("https://papermc.io/repo/repository/maven-public/") maven("https://repo.thbn.me/releases/") - maven("https://repo.thbn.me/snapshots/") + maven("https://repo.tehbrian.dev/snapshots/") + maven("https://repo.codemc.io/repository/maven-public/") } dependencies { @@ -34,7 +36,8 @@ dependencies { implementation("com.google.inject:guice:7.0.0") implementation("org.spongepowered:configurate-yaml:4.1.2") implementation("dev.tehbrian:tehlib-paper:0.6.0") - implementation("dev.tehbrian.restrictionhelper:restrictionhelper-spigot:0.4.1") + implementation("dev.tehbrian:restrictionhelper-spigot:0.5.0") + implementation("de.tr7zw:item-nbt-api:2.15.0") } tasks { @@ -67,7 +70,7 @@ tasks { "love.broccolai.corn", "cloud.commandframework", "com.google", - "dev.tehbrian.restrictionhelper", + "dev.tehbrian.restrictionhelper-spigot", "dev.tehbrian.tehlib", "io.leangen", "jakarta.inject", @@ -77,6 +80,7 @@ tasks { "org.checkerframework", "org.spongepowered", "org.yaml", + "de.tr7zw.item-nbt-api" ) } diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index fe943d8..6c1be38 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -2,6 +2,8 @@ import com.google.inject.Inject; import com.google.inject.name.Named; +import de.tr7zw.changeme.nbtapi.NBT; +import de.tr7zw.changeme.nbtapi.iface.ReadableNBT; import dev.tehbrian.tehlib.configurate.AbstractConfig; import org.bukkit.Material; import org.bukkit.block.data.type.Light; @@ -43,10 +45,11 @@ public void load() throws ConfigurateException { } for (final String dirtyItemName : itemNames) { - final var itemName = dirtyItemName.strip().toUpperCase(Locale.ROOT); + final var itemName = dirtyItemName.strip(); + final String upperItemName = itemName.toUpperCase(Locale.ROOT); // special case for light levels. - if (itemName.startsWith("LIGHT") && !itemName.equals("LIGHT")) { + if (upperItemName.startsWith("LIGHT") && !upperItemName.equals("LIGHT")) { int level; try { level = Integer.parseInt(itemName.split("-")[1]); @@ -78,7 +81,11 @@ public void load() throws ConfigurateException { final Material itemMaterial; try { - itemMaterial = Material.valueOf(itemName); + if (itemName.contains(" ")) { + this.items.add(this.itemFromString(itemName)); + continue; + } + itemMaterial = Material.valueOf(upperItemName); } catch (final IllegalArgumentException e) { this.logger.warn("The material {} does not exist.", itemName); this.logger.warn("Skipping this item. Please check your {}", fileName); @@ -94,4 +101,22 @@ public List items() { return this.items; } +private ItemStack itemFromString(String string) { + String[] itemData = string.strip().split(" ", 2); + Material material = Material.valueOf(itemData[0]); + ItemStack item = new ItemStack(material); + + if (itemData.length > 1 && !itemData[1].isEmpty()) { + try { + ReadableNBT itemNBT = NBT.parseNBT(itemData[1]); + NBT.modifyComponents(item, nbt -> { + nbt.mergeCompound(itemNBT); + }); + } catch (Exception e) { + this.logger.warn("Invalid NBT data for item {}: {}", material, itemData[1]); + this.logger.warn("Skipping this item. Please check your special.yml", e); + } + } + return item; + } } diff --git a/src/main/resources/META-INF/.mojang-mapped b/src/main/resources/META-INF/.mojang-mapped new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/special.yml b/src/main/resources/special.yml index 88641b7..de358c7 100644 --- a/src/main/resources/special.yml +++ b/src/main/resources/special.yml @@ -45,5 +45,8 @@ items: - TIPPED_ARROW - PETRIFIED_OAK_SLAB + # Items with special NBT + - 'ITEM_FRAME {"minecraft:entity_data": {id: "minecraft:item_frame", Invisible: 1b}, "minecraft:custom_name":''{text:"Invisible Item Frame"}''}' + # No touch! version: 1 From dc11f061f3ce181582a9dec4670a4d302cae92a9 Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 14:14:30 +0200 Subject: [PATCH 2/9] Move from local repo to public repo for a dep --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9a86638..46102a1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,11 +17,11 @@ java { repositories { mavenCentral() - mavenLocal() maven("https://papermc.io/repo/repository/maven-public/") maven("https://repo.thbn.me/releases/") maven("https://repo.tehbrian.dev/snapshots/") maven("https://repo.codemc.io/repository/maven-public/") + maven("https://repo.broccol.ai/snapshots/") } dependencies { From 222ee9fe256c76606510adb004db72a17cd86444 Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:32:44 +0200 Subject: [PATCH 3/9] Refactor special.yml and SpecialConfig.java to use NBT Tags for the light blocks --- .../config/SpecialConfig.java | 37 +------------------ src/main/resources/special.yml | 34 ++++++++--------- 2 files changed, 19 insertions(+), 52 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index 6c1be38..6ce5e84 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -6,9 +6,7 @@ import de.tr7zw.changeme.nbtapi.iface.ReadableNBT; import dev.tehbrian.tehlib.configurate.AbstractConfig; import org.bukkit.Material; -import org.bukkit.block.data.type.Light; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BlockDataMeta; import org.checkerframework.checker.nullness.qual.Nullable; import org.slf4j.Logger; import org.spongepowered.configurate.CommentedConfigurationNode; @@ -48,40 +46,9 @@ public void load() throws ConfigurateException { final var itemName = dirtyItemName.strip(); final String upperItemName = itemName.toUpperCase(Locale.ROOT); - // special case for light levels. - if (upperItemName.startsWith("LIGHT") && !upperItemName.equals("LIGHT")) { - int level; - try { - level = Integer.parseInt(itemName.split("-")[1]); - } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { - this.logger.warn("Invalid light data {}.", itemName); - this.logger.warn("Skipping this item. Please check your {}", fileName); - this.logger.warn("Printing stack trace:", e); - continue; - } - - if (level > 15) { - level = 15; - } - if (level < 0) { - level = 0; - } - - // create a light item with that light level. - final ItemStack item = new ItemStack(Material.LIGHT); - final BlockDataMeta meta = (BlockDataMeta) item.getItemMeta(); - final Light data = (Light) Material.LIGHT.createBlockData(); - data.setLevel(level); - meta.setBlockData(data); - item.setItemMeta(meta); - - this.items.add(item); - continue; - } - final Material itemMaterial; try { - if (itemName.contains(" ")) { + if (itemName.contains(", ")) { this.items.add(this.itemFromString(itemName)); continue; } @@ -102,7 +69,7 @@ public List items() { } private ItemStack itemFromString(String string) { - String[] itemData = string.strip().split(" ", 2); + String[] itemData = string.strip().split(", ", 2); Material material = Material.valueOf(itemData[0]); ItemStack item = new ItemStack(material); diff --git a/src/main/resources/special.yml b/src/main/resources/special.yml index de358c7..9237b96 100644 --- a/src/main/resources/special.yml +++ b/src/main/resources/special.yml @@ -17,22 +17,22 @@ items: - STRUCTURE_VOID - BARRIER - DEBUG_STICK - - LIGHT-15 - - LIGHT-14 - - LIGHT-13 - - LIGHT-12 - - LIGHT-11 - - LIGHT-10 - - LIGHT-9 - - LIGHT-8 - - LIGHT-7 - - LIGHT-6 - - LIGHT-5 - - LIGHT-4 - - LIGHT-3 - - LIGHT-2 - - LIGHT-1 - - LIGHT-0 + - 'LIGHT, {"minecraft:block_state": {level: "15"}}' + - 'LIGHT, {"minecraft:block_state": {level: "14"}} ' + - 'LIGHT, {"minecraft:block_state": {level: "13"}}' + - 'LIGHT, {"minecraft:block_state": {level: "12"}}' + - 'LIGHT, {"minecraft:block_state": {level: "11"}}' + - 'LIGHT, {"minecraft:block_state": {level: "10"}}' + - 'LIGHT, {"minecraft:block_state": {level: "9"}}' + - 'LIGHT, {"minecraft:block_state": {level: "8"}}' + - 'LIGHT, {"minecraft:block_state": {level: "7"}}' + - 'LIGHT, {"minecraft:block_state": {level: "6"}}' + - 'LIGHT, {"minecraft:block_state": {level: "5"}}' + - 'LIGHT, {"minecraft:block_state": {level: "4"}}' + - 'LIGHT, {"minecraft:block_state": {level: "3"}}' + - 'LIGHT, {"minecraft:block_state": {level: "2"}}' + - 'LIGHT, {"minecraft:block_state": {level: "1"}}' + - 'LIGHT, {"minecraft:block_state": {level: "0"}}' # Items below are not in the operator items menu. - KNOWLEDGE_BOOK @@ -46,7 +46,7 @@ items: - PETRIFIED_OAK_SLAB # Items with special NBT - - 'ITEM_FRAME {"minecraft:entity_data": {id: "minecraft:item_frame", Invisible: 1b}, "minecraft:custom_name":''{text:"Invisible Item Frame"}''}' + - 'ITEM_FRAME, {"minecraft:entity_data": {id: "minecraft:item_frame", Invisible: 1b}, "minecraft:item_name":''{text:"Invisible Item Frame"}''}' # No touch! version: 1 From 53ba9491702bf867eff47179987b1f2ee2b0b3be Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:12:59 +0200 Subject: [PATCH 4/9] Refactor SpecialConfig.java to simplify item name handling by removing unnecessary locale conversion --- .../tehbrian/buildersutilities/config/SpecialConfig.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index 6ce5e84..bbea3ae 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -15,7 +15,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Locale; public final class SpecialConfig extends AbstractConfig { @@ -44,7 +43,6 @@ public void load() throws ConfigurateException { for (final String dirtyItemName : itemNames) { final var itemName = dirtyItemName.strip(); - final String upperItemName = itemName.toUpperCase(Locale.ROOT); final Material itemMaterial; try { @@ -52,7 +50,7 @@ public void load() throws ConfigurateException { this.items.add(this.itemFromString(itemName)); continue; } - itemMaterial = Material.valueOf(upperItemName); + itemMaterial = Material.valueOf(itemName.toUpperCase()); } catch (final IllegalArgumentException e) { this.logger.warn("The material {} does not exist.", itemName); this.logger.warn("Skipping this item. Please check your {}", fileName); @@ -68,9 +66,9 @@ public List items() { return this.items; } -private ItemStack itemFromString(String string) { + private ItemStack itemFromString(String string) { String[] itemData = string.strip().split(", ", 2); - Material material = Material.valueOf(itemData[0]); + Material material = Material.valueOf(itemData[0].toUpperCase()); ItemStack item = new ItemStack(material); if (itemData.length > 1 && !itemData[1].isEmpty()) { From d9cc755c48af3f3df92d02f7a6db301bb08e99ef Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:36:40 +0200 Subject: [PATCH 5/9] Some clarifications --- .../buildersutilities/config/SpecialConfig.java | 16 ++++++++-------- src/main/resources/special.yml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index bbea3ae..6a138c0 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -42,17 +42,17 @@ public void load() throws ConfigurateException { } for (final String dirtyItemName : itemNames) { - final var itemName = dirtyItemName.strip(); + final var configItem = dirtyItemName.strip(); final Material itemMaterial; try { - if (itemName.contains(", ")) { - this.items.add(this.itemFromString(itemName)); + if (configItem.contains(", ")) { + this.items.add(this.itemFromString(configItem)); continue; } - itemMaterial = Material.valueOf(itemName.toUpperCase()); + itemMaterial = Material.valueOf(configItem.toUpperCase()); } catch (final IllegalArgumentException e) { - this.logger.warn("The material {} does not exist.", itemName); + this.logger.warn("The material {} does not exist.", configItem); this.logger.warn("Skipping this item. Please check your {}", fileName); this.logger.warn("Printing stack trace:", e); continue; @@ -66,12 +66,12 @@ public List items() { return this.items; } - private ItemStack itemFromString(String string) { - String[] itemData = string.strip().split(", ", 2); + private ItemStack itemFromString(String configItem) { + String[] itemData = configItem.strip().split(", ", 2); Material material = Material.valueOf(itemData[0].toUpperCase()); ItemStack item = new ItemStack(material); - if (itemData.length > 1 && !itemData[1].isEmpty()) { + if (itemData.length > 1 && !itemData[1].isBlank()) { try { ReadableNBT itemNBT = NBT.parseNBT(itemData[1]); NBT.modifyComponents(item, nbt -> { diff --git a/src/main/resources/special.yml b/src/main/resources/special.yml index 9237b96..d216d2f 100644 --- a/src/main/resources/special.yml +++ b/src/main/resources/special.yml @@ -45,7 +45,7 @@ items: - TIPPED_ARROW - PETRIFIED_OAK_SLAB - # Items with special NBT + # Normal items with special NBT - 'ITEM_FRAME, {"minecraft:entity_data": {id: "minecraft:item_frame", Invisible: 1b}, "minecraft:item_name":''{text:"Invisible Item Frame"}''}' # No touch! From 63199c2cc6eb665a6cb5d1c140708dcdff3a2f52 Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:45:22 +0200 Subject: [PATCH 6/9] Clarify some stuff and remove unnecessary logic --- .../buildersutilities/config/SpecialConfig.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index 6a138c0..358e51a 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -42,23 +42,20 @@ public void load() throws ConfigurateException { } for (final String dirtyItemName : itemNames) { - final var configItem = dirtyItemName.strip(); + final String configItem = dirtyItemName.strip(); - final Material itemMaterial; try { if (configItem.contains(", ")) { this.items.add(this.itemFromString(configItem)); - continue; + } else { + Material itemMaterial = Material.valueOf(configItem.toUpperCase()); + this.items.add(new ItemStack(itemMaterial)); } - itemMaterial = Material.valueOf(configItem.toUpperCase()); } catch (final IllegalArgumentException e) { this.logger.warn("The material {} does not exist.", configItem); this.logger.warn("Skipping this item. Please check your {}", fileName); this.logger.warn("Printing stack trace:", e); - continue; } - - this.items.add(new ItemStack(itemMaterial)); } } From f319f67189170f4fa04bf486f03d303cce4685eb Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 20:41:15 +0200 Subject: [PATCH 7/9] Refactor item handling in SpecialConfig.java to improve error handling and simplify item parsing --- .../config/SpecialConfig.java | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index 358e51a..d9988a3 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -43,18 +43,9 @@ public void load() throws ConfigurateException { for (final String dirtyItemName : itemNames) { final String configItem = dirtyItemName.strip(); - - try { - if (configItem.contains(", ")) { - this.items.add(this.itemFromString(configItem)); - } else { - Material itemMaterial = Material.valueOf(configItem.toUpperCase()); - this.items.add(new ItemStack(itemMaterial)); - } - } catch (final IllegalArgumentException e) { - this.logger.warn("The material {} does not exist.", configItem); - this.logger.warn("Skipping this item. Please check your {}", fileName); - this.logger.warn("Printing stack trace:", e); + ItemStack item = this.itemFromString(configItem, fileName); + if (item != null) { + this.items.add(item); } } } @@ -63,22 +54,38 @@ public List items() { return this.items; } - private ItemStack itemFromString(String configItem) { - String[] itemData = configItem.strip().split(", ", 2); - Material material = Material.valueOf(itemData[0].toUpperCase()); - ItemStack item = new ItemStack(material); + /** + * This method return the ItemStack object based on the configuration following + * the syntax '%Material name%, %JSON values%'. + * @param configItem The item string + * @param fileName The name of the configuration file for logging purposes + * @return The ItemStack object or null if the item is invalid + */ + private @Nullable ItemStack itemFromString(String configItem, String fileName) { + try { + String[] itemData = configItem.strip().split(", ", 2); + Material material = Material.valueOf(itemData[0].toUpperCase()); + ItemStack item = new ItemStack(material); - if (itemData.length > 1 && !itemData[1].isBlank()) { - try { - ReadableNBT itemNBT = NBT.parseNBT(itemData[1]); - NBT.modifyComponents(item, nbt -> { - nbt.mergeCompound(itemNBT); - }); - } catch (Exception e) { - this.logger.warn("Invalid NBT data for item {}: {}", material, itemData[1]); - this.logger.warn("Skipping this item. Please check your special.yml", e); + if (itemData.length > 1 && !itemData[1].isBlank()) { + try { + ReadableNBT itemNBT = NBT.parseNBT(itemData[1]); + NBT.modifyComponents( + item, nbt -> { + nbt.mergeCompound(itemNBT); + } + ); + } catch (Exception e) { + this.logger.warn("Invalid NBT data for item {}: {}", material, itemData[1], e); + return null; + } } + return item; + } catch (IllegalArgumentException e) { + this.logger.warn("The material {} does not exist.", configItem); + this.logger.warn("Skipping this item. Please check your {}", fileName); + this.logger.warn("Printing stack trace:", e); + return null; } - return item; } } From f3e41de3bc26a81e62d65a45c39f5233a86220d4 Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Fri, 20 Jun 2025 20:45:27 +0200 Subject: [PATCH 8/9] Formatting at its peak --- .../tehbrian/buildersutilities/config/SpecialConfig.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java index d9988a3..c60fc1c 100644 --- a/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java +++ b/src/main/java/dev/tehbrian/buildersutilities/config/SpecialConfig.java @@ -70,11 +70,9 @@ public List items() { if (itemData.length > 1 && !itemData[1].isBlank()) { try { ReadableNBT itemNBT = NBT.parseNBT(itemData[1]); - NBT.modifyComponents( - item, nbt -> { - nbt.mergeCompound(itemNBT); - } - ); + NBT.modifyComponents(item, nbt -> { + nbt.mergeCompound(itemNBT); + }); } catch (Exception e) { this.logger.warn("Invalid NBT data for item {}: {}", material, itemData[1], e); return null; From af0493554e9dd0e86e0b09620de0abf6fcccdff0 Mon Sep 17 00:00:00 2001 From: "game.crash" <73080127+gamecrash534@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:10:33 +0200 Subject: [PATCH 9/9] Update dependency reference for correct relocation --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 46102a1..33f0f8a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -80,7 +80,7 @@ tasks { "org.checkerframework", "org.spongepowered", "org.yaml", - "de.tr7zw.item-nbt-api" + "de.tr7zw.changeme.nbtapi" ) }