From bb7bbb637928ff453e43f2d2c92b1f983ec663f9 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sat, 17 Aug 2024 19:01:27 +0200 Subject: [PATCH] fix legacy tile data loading from mantle --- .../iris/engine/object/IrisBlockData.java | 4 +-- .../iris/engine/object/LegacyTileData.java | 17 +++++++++-- .../volmit/iris/engine/object/TileData.java | 29 +++++++++---------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java index 81a497eed..65a9a59a8 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java @@ -202,9 +202,9 @@ public class IrisBlockData extends IrisRegistrant { public TileData tryGetTile(IrisData data) { //TODO Do like a registry thing with the tile data registry. Also update the parsing of data to include **block** entities. var type = getBlockData(data).getMaterial(); - if (!INMS.get().hasTile(type)) + if (!INMS.get().hasTile(type) || tileData == null || tileData.isEmpty()) return null; - return new TileData().setMaterial(type).setProperties(this.tileData); + return new TileData(type, this.tileData); } private String keyify(String dat) { diff --git a/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java b/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java index 105f818aa..ac8728ebe 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/LegacyTileData.java @@ -2,6 +2,8 @@ package com.volmit.iris.engine.object; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.scheduling.J; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.apache.commons.io.function.IOFunction; import org.bukkit.DyeColor; import org.bukkit.block.*; @@ -14,6 +16,8 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.Map; +@ToString +@EqualsAndHashCode(callSuper = false) public class LegacyTileData extends TileData { private static final Map> legacy = Map.of( 0, SignHandler::new, @@ -41,11 +45,18 @@ public class LegacyTileData extends TileData { handler.toBinary(out); } + @Override + public TileData clone() { + return this; + } + private interface Handler { void toBinary(DataOutputStream out) throws IOException; void toBukkit(Block block); } + @ToString + @EqualsAndHashCode private static class SignHandler implements Handler { private final String line1; private final String line2; @@ -81,7 +92,8 @@ public class LegacyTileData extends TileData { sign.update(); } } - + @ToString + @EqualsAndHashCode private static class SpawnerHandler implements Handler { private final EntityType type; @@ -101,7 +113,8 @@ public class LegacyTileData extends TileData { spawner.update(); } } - + @ToString + @EqualsAndHashCode private static class BannerHandler implements Handler { private final KList patterns; private final DyeColor baseColor; diff --git a/core/src/main/java/com/volmit/iris/engine/object/TileData.java b/core/src/main/java/com/volmit/iris/engine/object/TileData.java index 9bab31df8..9e330702e 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/TileData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/TileData.java @@ -23,27 +23,29 @@ import com.google.gson.GsonBuilder; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.util.collection.KMap; -import lombok.Data; -import lombok.experimental.Accessors; +import lombok.*; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; -import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -@Data @SuppressWarnings("ALL") -@Accessors(chain = true) +@Getter +@ToString +@EqualsAndHashCode +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class TileData implements Cloneable { private static final Gson gson = new GsonBuilder().disableHtmlEscaping().setLenient().create(); - private Material material = null; - private KMap properties = new KMap<>(); + @NonNull + private Material material; + @NonNull + private KMap properties; public static boolean setTileState(Block block, TileData data) { if (block.getState() instanceof TileState && data.isApplicable(block.getBlockData())) @@ -62,14 +64,9 @@ public class TileData implements Cloneable { throw new IOException("Mark not supported"); in.mark(Integer.MAX_VALUE); try { - TileData d = new TileData(); - var material = in.readUTF(); - d.material = Material.matchMaterial(material); - if (d.material == null) throw new IOException("Unknown material: " + material); - var properties = in.readUTF(); - d.properties = gson.fromJson(properties, KMap.class); - if (d.properties == null) throw new IOException("Invalid properties: " + properties); - return d; + return new TileData( + Material.matchMaterial(in.readUTF()), + gson.fromJson(in.readUTF(), KMap.class)); } catch (Throwable e) { in.reset(); return new LegacyTileData(in);