From b875a4898bc15926a1857c89918327172d8c95aa Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 26 Oct 2020 05:11:15 -0400 Subject: [PATCH] Conversion support for EWG and Schematics --- .../structures/StructureObject.java | 9 +- src/main/java/com/volmit/iris/Iris.java | 13 ++ .../com/volmit/iris/command/CommandIris.java | 11 +- .../iris/command/CommandIrisStudio.java | 3 + .../command/CommandIrisStudioConvert.java | 36 ++++ .../v2/scaffold/layer/ProceduralStream.java | 1 - .../iris/manager/ConversionManager.java | 166 ++++++++++++++++++ .../java/com/volmit/iris/util/Converter.java | 12 ++ 8 files changed, 240 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/volmit/iris/command/CommandIrisStudioConvert.java create mode 100644 src/main/java/com/volmit/iris/manager/ConversionManager.java create mode 100644 src/main/java/com/volmit/iris/util/Converter.java diff --git a/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java b/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java index 736c534aa..7efdc5851 100644 --- a/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java +++ b/src/main/java/com/minelazz/epicworldgenerator/structures/StructureObject.java @@ -5,6 +5,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.EnumSet; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -28,6 +29,7 @@ public class StructureObject implements Serializable FileInputStream fin = new FileInputStream(so); ObjectInputStream in = new ObjectInputStream(fin); StructureObject o = (StructureObject) in.readObject(); + in.close(); int maxX = 0; int maxY = 0; int maxZ = 0; @@ -64,18 +66,17 @@ public class StructureObject implements Serializable if(bdx != null) { - iob.getBlocks().put(new BlockVector(i.x, i.y, i.z), FastBlockData.of(bdx)); - Iris.info("Mapped " + i.x + " " + i.y + " " + i.z + " to " + bdx.getAsString(true)); + iob.getBlocks().put(new BlockVector(i.x, -i.y, i.z), FastBlockData.of(bdx)); } } - return null; + return iob; } @SuppressWarnings("deprecation") private static final FastBlockData map(int id, int dat) { - for(Material i : Material.values()) + for(Material i : EnumSet.allOf(Material.class)) { if(!i.isLegacy()) { diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 987c80925..ccf4046c2 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -15,6 +15,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.Plugin; +import com.minelazz.epicworldgenerator.structures.StructureObject; import com.volmit.iris.command.CommandIris; import com.volmit.iris.command.PermissionIris; import com.volmit.iris.gen.IrisTerrainProvider; @@ -26,6 +27,7 @@ import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.link.CitizensLink; import com.volmit.iris.link.MultiverseCoreLink; import com.volmit.iris.link.MythicMobsLink; +import com.volmit.iris.manager.ConversionManager; import com.volmit.iris.manager.EditManager; import com.volmit.iris.manager.IrisBoardManager; import com.volmit.iris.manager.IrisDataManager; @@ -58,6 +60,7 @@ public class Iris extends MortarPlugin public static Iris instance; public static IrisDataManager globaldata; public static ProjectManager proj; + public static ConversionManager convert; public static IrisHotloadManager hotloader; public static WandManager wand; public static StructureManager struct; @@ -158,6 +161,7 @@ public class Iris extends MortarPlugin lock = new IrisLock("Iris"); proj = new ProjectManager(); hotloader = new IrisHotloadManager(); + convert = new ConversionManager(); globaldata = new IrisDataManager(getDataFolder()); wand = new WandManager(); struct = new StructureManager(); @@ -171,6 +175,15 @@ public class Iris extends MortarPlugin J.sr(this::tickQueue, 0); PaperLib.suggestPaper(this); super.onEnable(); + try + { + StructureObject.convert(getDataFile("rock.ewg")); + } + catch(ClassNotFoundException | IOException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } } public static void sq(Runnable r) diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java index c68d04f5e..2351f7505 100644 --- a/src/main/java/com/volmit/iris/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/command/CommandIris.java @@ -1,7 +1,6 @@ package com.volmit.iris.command; import com.volmit.iris.Iris; -import com.volmit.iris.gen.v2.TestGen; import com.volmit.iris.util.Command; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; @@ -59,11 +58,11 @@ public class CommandIris extends MortarCommand @Override public boolean handle(MortarSender sender, String[] args) { - if(args.length == 1 && args[0].equalsIgnoreCase("test!")) - { - TestGen.gen(sender.player()); - return true; - } + // if(args.length == 1 && args[0].equalsIgnoreCase("test!")) + // { + // TestGen.gen(sender.player()); + // return true; + // } sender.sendMessage("Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software"); printHelp(sender); diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudio.java b/src/main/java/com/volmit/iris/command/CommandIrisStudio.java index c3b7b32f1..6ef16e259 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisStudio.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisStudio.java @@ -49,6 +49,9 @@ public class CommandIrisStudio extends MortarCommand @Command private CommandIrisStudioTP tp; + + @Command + private CommandIrisStudioConvert convert; public CommandIrisStudio() { diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioConvert.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioConvert.java new file mode 100644 index 000000000..b4ba98e02 --- /dev/null +++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioConvert.java @@ -0,0 +1,36 @@ +package com.volmit.iris.command; + +import com.volmit.iris.Iris; +import com.volmit.iris.IrisSettings; +import com.volmit.iris.util.MortarCommand; +import com.volmit.iris.util.MortarSender; + +public class CommandIrisStudioConvert extends MortarCommand +{ + public CommandIrisStudioConvert() + { + super("convert", "cvt"); + requiresPermission(Iris.perm.studio); + setDescription("Convert .ewg schematics into Iris (.iob) files"); + setCategory("Studio"); + } + + @Override + public boolean handle(MortarSender sender, String[] args) + { + if(!IrisSettings.get().isStudio()) + { + sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json"); + return true; + } + + Iris.convert.check(sender); + return true; + } + + @Override + protected String getArgsUsage() + { + return ""; + } +} diff --git a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java index d2ac4e448..926796703 100644 --- a/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java +++ b/src/main/java/com/volmit/iris/gen/v2/scaffold/layer/ProceduralStream.java @@ -5,7 +5,6 @@ import java.util.function.Function; import com.volmit.iris.gen.v2.scaffold.Significance; import com.volmit.iris.gen.v2.scaffold.hunk.Hunk; -import com.volmit.iris.gen.v2.scaffold.multicore.BurstExecutor; import com.volmit.iris.gen.v2.scaffold.stream.AddingStream; import com.volmit.iris.gen.v2.scaffold.stream.AwareConversionStream2D; import com.volmit.iris.gen.v2.scaffold.stream.AwareConversionStream3D; diff --git a/src/main/java/com/volmit/iris/manager/ConversionManager.java b/src/main/java/com/volmit/iris/manager/ConversionManager.java new file mode 100644 index 000000000..ca42f6ebd --- /dev/null +++ b/src/main/java/com/volmit/iris/manager/ConversionManager.java @@ -0,0 +1,166 @@ +package com.volmit.iris.manager; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.bukkit.Bukkit; + +import com.minelazz.epicworldgenerator.structures.StructureObject; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; +import com.sk89q.worldedit.math.BlockVector3; +import com.volmit.iris.Iris; +import com.volmit.iris.object.IrisObject; +import com.volmit.iris.util.Converter; +import com.volmit.iris.util.FastBlockData; +import com.volmit.iris.util.J; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.MortarSender; + +public class ConversionManager +{ + private KList converters; + private File folder; + + public ConversionManager() + { + folder = Iris.instance.getDataFolder("convert"); + converters = new KList<>(); + + J.s(() -> + { + if(Bukkit.getPluginManager().isPluginEnabled("WorldEdit")) + { + converters.add(new Converter() + { + @Override + public String getOutExtension() + { + return "iob"; + } + + @Override + public String getInExtension() + { + return "schem"; + } + + @Override + public void convert(File in, File out) + { + convertSchematic(in, out); + } + }); + + converters.add(new Converter() + { + @Override + public String getOutExtension() + { + return "iob"; + } + + @Override + public String getInExtension() + { + return "schematic"; + } + + @Override + public void convert(File in, File out) + { + convertSchematic(in, out); + } + }); + } + }, 5); + + converters.add(new Converter() + { + @Override + public String getOutExtension() + { + return "iob"; + } + + @Override + public String getInExtension() + { + return "ewg"; + } + + @Override + public void convert(File in, File out) + { + try + { + StructureObject.convert(in).write(out); + } + + catch(ClassNotFoundException | IOException e) + { + e.printStackTrace(); + } + } + }); + } + + public void convertSchematic(File in, File out) + { + ClipboardFormat format = ClipboardFormats.findByFile(in); + try(ClipboardReader reader = format.getReader(new FileInputStream(in))) + { + Clipboard clipboard = reader.read(); + BlockVector3 size = clipboard.getMaximumPoint().subtract(clipboard.getMinimumPoint()); + IrisObject o = new IrisObject(size.getBlockX() + 1, size.getBlockY() + 1, size.getBlockZ() + 1); + + for(int i = clipboard.getMinimumPoint().getBlockX(); i <= clipboard.getMaximumPoint().getBlockX(); i++) + { + for(int j = clipboard.getMinimumPoint().getBlockY(); j <= clipboard.getMaximumPoint().getBlockY(); j++) + { + for(int k = clipboard.getMinimumPoint().getBlockZ(); k <= clipboard.getMaximumPoint().getBlockZ(); k++) + { + o.setUnsigned(i - clipboard.getMinimumPoint().getBlockX(), j - clipboard.getMinimumPoint().getBlockY(), k - clipboard.getMinimumPoint().getBlockZ(), FastBlockData.of(BukkitAdapter.adapt(clipboard.getFullBlock(BlockVector3.at(i, j, k))))); + } + } + } + + o.write(out); + } + catch(FileNotFoundException e) + { + e.printStackTrace(); + } + catch(IOException e) + { + e.printStackTrace(); + } + } + + public void check(MortarSender s) + { + int m = 0; + Iris.instance.getDataFolder("convert"); + + for(File i : folder.listFiles()) + { + for(Converter j : converters) + { + if(i.getName().endsWith("." + j.getInExtension())) + { + File out = new File(folder, i.getName().replaceAll("\\Q." + j.getInExtension() + "\\E", "." + j.getOutExtension())); + m++; + j.convert(i, out); + s.sendMessage("Converted " + i.getName() + " -> " + out.getName()); + } + } + } + + s.sendMessage("Converted " + m + " File" + (m == 1 ? "" : "s")); + } +} diff --git a/src/main/java/com/volmit/iris/util/Converter.java b/src/main/java/com/volmit/iris/util/Converter.java new file mode 100644 index 000000000..b89addd4e --- /dev/null +++ b/src/main/java/com/volmit/iris/util/Converter.java @@ -0,0 +1,12 @@ +package com.volmit.iris.util; + +import java.io.File; + +public interface Converter +{ + public String getInExtension(); + + public String getOutExtension(); + + public void convert(File in, File out); +}