Skip to content

Commit

Permalink
Worldedit update (#46)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
TylerS1066 authored Sep 14, 2024
1 parent 13dd89d commit 74b8552
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 103 deletions.
18 changes: 9 additions & 9 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,10 +188,9 @@ public static Pair<Boolean, Counter<Material>> 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<Material> currentContents = new Counter<>();
for (ItemStack stack : items) {
Expand Down
138 changes: 63 additions & 75 deletions src/main/java/net/countercraft/movecraft/repair/util/WEUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -152,28 +150,41 @@ private static Set<BaseBlock> getWorldEditBlocks(@NotNull HitBox hitbox, @NotNul
* @return Counter of the materials in the block
*/
@Nullable
public static Counter<Material> getBlockContents(BaseBlock block) {
public static Counter<Material> getBlockContents(@NotNull BaseBlock block) {
Counter<Material> 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;
}
Expand All @@ -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<? extends LinTag<?>> 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(""));
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -114,7 +114,7 @@ public boolean saveChunk(Chunk c, File directory, @Nullable Set<Material> 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
Expand All @@ -125,6 +125,7 @@ public boolean saveChunk(Chunk c, File directory, @Nullable Set<Material> 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();
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 74b8552

Please sign in to comment.