From 74b8552b3350f8db4d1a87e13f19867b41304095 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sat, 14 Sep 2024 14:04:25 -0500 Subject: [PATCH] Worldedit update (#46) * Update versions * Update RepairQueue.java * Switch from jnbt to linbus * Update WEUtils.java * Add debug messages * Update WEUtils.java * Debug for inventories * Working inventory repair * Update WEUtils.java * Redo sign repairs * Close edit sessions * Update config.yml * Clean up diff * Update config.yml --- build.gradle.kts | 18 +-- .../movecraft/repair/tasks/SignRepair.java | 32 ++-- .../movecraft/repair/types/RepairQueue.java | 2 +- .../movecraft/repair/types/RepairState.java | 10 +- .../movecraft/repair/util/RepairUtils.java | 3 +- .../movecraft/repair/util/WEUtils.java | 138 ++++++++---------- .../movecraft/repair/util/WarfareUtils.java | 5 +- src/main/resources/config.yml | 1 + 8 files changed, 106 insertions(+), 103 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0c7236b..4dfe73e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,21 +16,21 @@ repositories { } dependencies { - api("com.google.code.gson:gson:2.10") + api("com.google.code.gson:gson:+") api("org.jetbrains:annotations-java5:24.1.0") - api("com.sk89q.worldedit:worldedit-core:7.2.9") - api("com.sk89q.worldedit:worldedit-bukkit:7.2.9") - compileOnly("io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT") + api("com.sk89q.worldedit:worldedit-core:7.3.3") + api("com.sk89q.worldedit:worldedit-bukkit:7.3.3") + compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT") compileOnly("net.countercraft:movecraft:+") - compileOnly("com.github.MilkBowl:VaultAPI:1.7.1") - compileOnly("it.unimi.dsi:fastutil:8.5.11") - compileOnly("org.roaringbitmap:RoaringBitmap:1.0.6") + compileOnly("com.github.MilkBowl:VaultAPI:+") + compileOnly("it.unimi.dsi:fastutil:+") + compileOnly("org.roaringbitmap:RoaringBitmap:+") } group = "net.countercraft.movecraft.repair" version = "1.0.0_beta-6" description = "Movecraft-Repair" -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.toolchain.languageVersion = JavaLanguageVersion.of(21) tasks.jar { archiveBaseName.set("Movecraft-Repair") @@ -76,7 +76,7 @@ hangarPublish { platforms { register(io.papermc.hangarpublishplugin.model.Platforms.PAPER) { jar.set(tasks.jar.flatMap { it.archiveFile }) - platformVersions.set(listOf("1.18.2-1.21")) + platformVersions.set(listOf("1.20.6-1.21.1")) dependencies { hangar("Movecraft") { required.set(true) diff --git a/src/main/java/net/countercraft/movecraft/repair/tasks/SignRepair.java b/src/main/java/net/countercraft/movecraft/repair/tasks/SignRepair.java index 9d09c25..caf301d 100644 --- a/src/main/java/net/countercraft/movecraft/repair/tasks/SignRepair.java +++ b/src/main/java/net/countercraft/movecraft/repair/tasks/SignRepair.java @@ -1,32 +1,42 @@ package net.countercraft.movecraft.repair.tasks; +import net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.Sign; -import org.jetbrains.annotations.NotNull; +import org.bukkit.block.sign.Side; +import org.jetbrains.annotations.Nullable; public class SignRepair extends RepairTask { - @NotNull - String[] lines; + @Nullable + private final Component[] frontLines; + @Nullable + private final Component[] backLines; - public SignRepair(Location location, String[] lines) { + public SignRepair(Location location, @Nullable Component[] frontLines, @Nullable Component[] backLines) { super(location); - this.lines = lines; + this.frontLines = frontLines; + this.backLines = backLines; } @Override public void execute() { Block block = location.getBlock(); - if (!(block.getState() instanceof Sign)) { + if (!(block.getState() instanceof Sign sign)) { done = true; return; } - Sign sign = (Sign) block.getState(); - sign.setLine(0, lines[0]); - sign.setLine(1, lines[1]); - sign.setLine(2, lines[2]); - sign.setLine(3, lines[3]); + if (frontLines != null) { + for (int i = 0; i < frontLines.length; i++) { + sign.getSide(Side.FRONT).line(i, frontLines[i]); + } + } + if (backLines != null) { + for (int i = 0; i < backLines.length; i++) { + sign.getSide(Side.BACK).line(i, backLines[i]); + } + } sign.update(false, false); done = true; } diff --git a/src/main/java/net/countercraft/movecraft/repair/types/RepairQueue.java b/src/main/java/net/countercraft/movecraft/repair/types/RepairQueue.java index 671233b..27c6262 100644 --- a/src/main/java/net/countercraft/movecraft/repair/types/RepairQueue.java +++ b/src/main/java/net/countercraft/movecraft/repair/types/RepairQueue.java @@ -7,7 +7,7 @@ import java.util.PriorityQueue; import java.util.Queue; -import org.apache.commons.lang.NotImplementedException; +import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; import net.countercraft.movecraft.repair.tasks.RepairTask; diff --git a/src/main/java/net/countercraft/movecraft/repair/types/RepairState.java b/src/main/java/net/countercraft/movecraft/repair/types/RepairState.java index a429fdc..0811947 100644 --- a/src/main/java/net/countercraft/movecraft/repair/types/RepairState.java +++ b/src/main/java/net/countercraft/movecraft/repair/types/RepairState.java @@ -18,6 +18,7 @@ import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; +import org.bukkit.block.sign.Side; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -140,9 +141,12 @@ public ProtoRepair execute(@NotNull Sign sign) throws WorldEditException, ProtoR } // Handle sign repair - if (Tag.SIGNS.isTagged(schematicMaterial) && blockRepair != null) { - String[] lines = WEUtils.getBlockSignLines(schematicBlock); - SignRepair signRepair = new SignRepair(worldPosition, lines); + if (Tag.ALL_SIGNS.isTagged(schematicMaterial) && blockRepair != null) { + SignRepair signRepair = new SignRepair( + worldPosition, + WEUtils.getBlockSignLines(schematicBlock, Side.FRONT), + WEUtils.getBlockSignLines(schematicBlock, Side.BACK) + ); signRepair.setDependency(blockRepair); queue.add(signRepair); } diff --git a/src/main/java/net/countercraft/movecraft/repair/util/RepairUtils.java b/src/main/java/net/countercraft/movecraft/repair/util/RepairUtils.java index b776259..5cb4ec2 100644 --- a/src/main/java/net/countercraft/movecraft/repair/util/RepairUtils.java +++ b/src/main/java/net/countercraft/movecraft/repair/util/RepairUtils.java @@ -188,10 +188,9 @@ public static Pair> checkInventoryRepair(Material cur if (targetContents == null || targetContents.getKeySet().isEmpty()) return new Pair<>(false, new Counter<>()); - if (!(currentState instanceof Container)) + if (!(currentState instanceof Container container)) return new Pair<>(true, targetContents); - Container container = (Container) currentState; ItemStack[] items = container.getInventory().getContents(); Counter currentContents = new Counter<>(); for (ItemStack stack : items) { diff --git a/src/main/java/net/countercraft/movecraft/repair/util/WEUtils.java b/src/main/java/net/countercraft/movecraft/repair/util/WEUtils.java index 540c9c9..634c405 100644 --- a/src/main/java/net/countercraft/movecraft/repair/util/WEUtils.java +++ b/src/main/java/net/countercraft/movecraft/repair/util/WEUtils.java @@ -5,28 +5,25 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import com.sk89q.worldedit.EditSession; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; +import org.bukkit.block.sign.Side; +import org.enginehub.linbus.tree.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.google.gson.Gson; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; -import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; @@ -53,7 +50,7 @@ import net.countercraft.movecraft.util.hitboxes.SolidHitBox; public class WEUtils { - public static final ClipboardFormat SCHEMATIC_FORMAT = BuiltInClipboardFormat.SPONGE_SCHEMATIC; + public static final ClipboardFormat SCHEMATIC_FORMAT = BuiltInClipboardFormat.SPONGE_V2_SCHEMATIC; /** * Load a schematic from disk @@ -115,7 +112,7 @@ public static boolean saveCraftSchematic(@NotNull PilotedCraft craft, @NotNull S try { BlockArrayClipboard clipboard = new BlockArrayClipboard(region); clipboard.setOrigin(origin); - Extent source = WorldEdit.getInstance().newEditSession(world); + EditSession source = WorldEdit.getInstance().newEditSession(world); ForwardExtentCopy copy = new ForwardExtentCopy(source, region, origin, clipboard, origin); BlockMask mask = new BlockMask(source, blocks); copy.setSourceMask(mask); @@ -128,6 +125,7 @@ public static boolean saveCraftSchematic(@NotNull PilotedCraft craft, @NotNull S ClipboardWriter writer = SCHEMATIC_FORMAT.getWriter(new FileOutputStream(repairFile, false)); writer.write(clipboard); writer.close(); + source.close(); } catch (IOException | NullPointerException | WorldEditException e) { e.printStackTrace(); return false; @@ -152,28 +150,41 @@ private static Set getWorldEditBlocks(@NotNull HitBox hitbox, @NotNul * @return Counter of the materials in the block */ @Nullable - public static Counter getBlockContents(BaseBlock block) { + public static Counter getBlockContents(@NotNull BaseBlock block) { Counter counter = new Counter<>(); - CompoundTag blockNBT = block.getNbtData(); + LinCompoundTag blockNBT = block.getNbt(); if (blockNBT == null) return null; - ListTag blockItems = blockNBT.getListTag("Items"); - if (blockItems == null) + LinListTag blockItems; + try { + blockItems = blockNBT.getListTag("Items", LinTagType.compoundTag()); + } catch (NoSuchElementException e) { return null; + } + for (var t : blockItems.value()) { + if (!(t instanceof LinCompoundTag ct)) + continue; - for (Tag t : blockItems.getValue()) { - if (!(t instanceof CompoundTag)) + LinStringTag id; + try { + id = ct.getTag("id", LinTagType.stringTag()); + } catch (NoSuchElementException e) { continue; + } - CompoundTag ct = (CompoundTag) t; - String id = ct.getString("id"); - Material material = getMaterial(id); - byte count = ct.getByte("Count"); + Material material = getMaterial(id.value()); if (material == null) continue; - counter.add(material, count); + LinIntTag count; + try { + count = ct.getTag("count", LinTagType.intTag()); + } catch (NoSuchElementException e) { + continue; + } + + counter.add(material, count.value()); } return counter; } @@ -198,66 +209,43 @@ private static Material getMaterial(String str) { * @return Array of sign lines in the block */ @Nullable - public static String[] getBlockSignLines(BaseBlock block) { - CompoundTag blockNBT = block.getNbtData(); - if (blockNBT == null) + public static Component[] getBlockSignLines(@NotNull BaseBlock block, Side side) { + LinCompoundTag blockNBT = block.getNbt(); + if (blockNBT == null) { return null; + } - String[] result = new String[4]; - result[0] = getSignTextFromJSON(blockNBT.getString("Text1")); - result[1] = getSignTextFromJSON(blockNBT.getString("Text2")); - result[2] = getSignTextFromJSON(blockNBT.getString("Text3")); - result[3] = getSignTextFromJSON(blockNBT.getString("Text4")); - return result; - } - - private static final String[] TEXT_STYLES = {"bold", "italic", "underline", "strikethrough"}; - - private static String getSignTextFromJSON(String json) { + LinCompoundTag text; try { - Gson gson = new Gson(); - Map lineData = gson.fromJson(json, Map.class); - String result = ""; - if (lineData == null) - return result; - - result += getSignTextFromMap(lineData); - if (!lineData.containsKey("extra")) - return result; - - Object extrasObject = lineData.get("extra"); - if (!(extrasObject instanceof List)) - return result; - - List extras = (List) extrasObject; - StringBuilder builder = new StringBuilder(); - for (Object componentObject : extras) { - if (!(componentObject instanceof Map)) - continue; - - builder.append(getSignTextFromMap((Map) componentObject)); - } - result += builder.toString(); - - return result; - } catch (Exception e) { - MovecraftRepair.getInstance().getLogger().severe("Got exception when parsing '" + json + "'"); - e.printStackTrace(); - return ""; + text = switch (side) { + case FRONT -> blockNBT.getTag("front_text", LinTagType.compoundTag()); + case BACK -> blockNBT.getTag("back_text", LinTagType.compoundTag()); + }; } + catch (NoSuchElementException e) { + return null; + } + + return getSideSignLines(text); } - private static @NotNull String getSignTextFromMap(@NotNull Map component) { - StringBuilder builder = new StringBuilder(); - if (component.containsKey("color")) { - builder.append(ChatColor.valueOf(((String) component.get("color")).toUpperCase())); + @Nullable + private static Component[] getSideSignLines(@NotNull LinCompoundTag text) { + List> messages; + try { + messages = text.getListTag("messages", LinTagType.stringTag()).value(); } - for (String style : TEXT_STYLES) { - if (component.containsKey(style)) { - builder.append(ChatColor.valueOf(((String) component.get(style)).toUpperCase())); - } + catch (NoSuchElementException e) { + return null; } - builder.append(component.get("text")); - return builder.toString(); + + return messages.stream().map(WEUtils::getSignLine).toArray(Component[]::new); + } + + @NotNull + private static Component getSignLine(@NotNull LinTag message) { + if (!(message instanceof LinStringTag stringTag)) + return Component.text(""); + return GsonComponentSerializer.gson().deserializeOr(stringTag.value(), Component.text("")); } } diff --git a/src/main/java/net/countercraft/movecraft/repair/util/WarfareUtils.java b/src/main/java/net/countercraft/movecraft/repair/util/WarfareUtils.java index 185eb4d..8bd44c8 100644 --- a/src/main/java/net/countercraft/movecraft/repair/util/WarfareUtils.java +++ b/src/main/java/net/countercraft/movecraft/repair/util/WarfareUtils.java @@ -1,10 +1,10 @@ package net.countercraft.movecraft.repair.util; +import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; -import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; @@ -114,7 +114,7 @@ public boolean saveChunk(Chunk c, File directory, @Nullable Set materi File file = new File(directory, c.getX() + "_" + c.getZ() + "." + WEUtils.SCHEMATIC_FORMAT.getPrimaryFileExtension()); try { BlockArrayClipboard clipboard = new BlockArrayClipboard(region); - Extent source = WorldEdit.getInstance().newEditSessionBuilder().world(world).maxBlocks(16 * 16 * (world.getMaxY() - world.getMinY() + 2)).build(); // Get enough space for the chunk, with a little extra wiggle room + EditSession source = WorldEdit.getInstance().newEditSessionBuilder().world(world).maxBlocks(16 * 16 * (world.getMaxY() - world.getMinY() + 2)).build(); // Get enough space for the chunk, with a little extra wiggle room ForwardExtentCopy copy = new ForwardExtentCopy(source, region, clipboard.getOrigin(), clipboard, minPos); if (materialMask != null) { // A null materialMask will be understood as saving every block @@ -125,6 +125,7 @@ public boolean saveChunk(Chunk c, File directory, @Nullable Set materi ClipboardWriter writer = WEUtils.SCHEMATIC_FORMAT.getWriter(new FileOutputStream(file, false)); writer.write(clipboard); writer.close(); + source.close(); return true; } catch (MaxChangedBlocksException | IOException e) { e.printStackTrace(); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3fd7cbf..c84ef7e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -21,6 +21,7 @@ RepairBlobs: # "Blobs" of materials which can be used interchangeably to repair - "#carpets" - "#planks" - "#signs" + - "#all_hanging_signs" - "#wooden_buttons" - "#wooden_doors" - "#wooden_fences"