From c452eaa50299048b9251f547d52a38754068529b Mon Sep 17 00:00:00 2001
From: SD <harrypotter.starwars.shrish@gmail.com>
Date: Mon, 21 Sep 2020 08:18:12 +0530
Subject: [PATCH 1/5] New schematic command

 Changes to be committed:
	modified:   src/main/java/org/dimdev/dimcore/schematic/v2/SchematicMetadata.java
	new file:   src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
---
 .../schematic/v2/SchematicMetadata.java       |  2 +-
 .../dimdoors/command/SchematicV2Command.java  | 69 +++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java

diff --git a/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicMetadata.java b/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicMetadata.java
index 221a295c..fd7c8edf 100644
--- a/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicMetadata.java
+++ b/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicMetadata.java
@@ -22,7 +22,7 @@ public final class SchematicMetadata {
     private final long date;
     private final List<String> requiredMods;
 
-    protected SchematicMetadata(String name, String author, long date, List<String> requiredMods) {
+    public SchematicMetadata(String name, String author, long date, List<String> requiredMods) {
         this.name = name;
         this.author = author;
         this.date = date;
diff --git a/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
new file mode 100644
index 00000000..5f997543
--- /dev/null
+++ b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
@@ -0,0 +1,69 @@
+package org.dimdev.dimdoors.command;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.dimdev.dimcore.schematic.v2.Schematic;
+import org.dimdev.dimcore.schematic.v2.SchematicPlacer;
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.context.CommandContext;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+
+import net.minecraft.nbt.NbtIo;
+import net.minecraft.server.command.ServerCommandSource;
+import net.minecraft.server.network.ServerPlayerEntity;
+
+import static net.minecraft.server.command.CommandManager.argument;
+import static net.minecraft.server.command.CommandManager.literal;
+
+public class SchematicV2Command {
+    public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
+        dispatcher.register(literal("schematicv2")
+                // TODO: Create an argument type for this
+                .then(literal("ruins")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes((ctx) -> place(ctx, "ruins"))
+                        )
+                )
+                .then(literal("blank")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes((ctx) -> place(ctx, "blank"))
+                        )
+                )
+                .then(literal("nether")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes((ctx) -> place(ctx, "nether"))
+                        )
+                )
+                .then(literal("private")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes((ctx) -> place(ctx, "private"))
+                        )
+                )
+                .then(literal("public")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes((ctx) -> place(ctx, "public"))
+                        )
+                )
+        );
+    }
+
+    private static int place(CommandContext<ServerCommandSource> ctx, String namespace) throws CommandSyntaxException {
+        ServerPlayerEntity player = ctx.getSource().getPlayer();
+        String id = StringArgumentType.getString(ctx, "schematic_name");
+
+        try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/v2/" + namespace + "/" + id + ".schem")) {
+            SchematicPlacer.place(
+                    Schematic.fromTag(NbtIo.readCompressed(in)),
+                    ctx.getSource().getWorld(),
+                    ctx.getSource().getPlayer().getBlockPos()
+            );
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        System.out.println(id + " placed");
+        return 1;
+    }
+}

From 6a6d3ecb9bfe2062aa00424ab459f80ee09059aa Mon Sep 17 00:00:00 2001
From: SD <harrypotter.starwars.shrish@gmail.com>
Date: Mon, 21 Sep 2020 08:53:22 +0530
Subject: [PATCH 2/5] New schematic argument type

 Changes to be committed:
	modified:   src/main/java/org/dimdev/dimdoors/command/ModCommands.java
	modified:   src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
	new file:   src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
	modified:   src/main/java/org/dimdev/dimdoors/world/feature/ModFeatures.java
	modified:   src/main/resources/assets/dimdoors/lang/en_us.json
---
 .../dimdev/dimdoors/command/ModCommands.java  |  1 +
 .../dimdoors/command/SchematicV2Command.java  | 40 +++++++------------
 .../SchematicNamespaceArgumentType.java       | 35 ++++++++++++++++
 .../dimdoors/world/feature/ModFeatures.java   | 18 +--------
 .../resources/assets/dimdoors/lang/en_us.json |  4 +-
 5 files changed, 54 insertions(+), 44 deletions(-)
 create mode 100644 src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java

diff --git a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
index 86c5d30e..c4f41bf2 100644
--- a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
+++ b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
@@ -9,6 +9,7 @@ public final class ModCommands {
             SchematicCommand.register(dispatcher);
             PocketCommand.register(dispatcher);
             SaveSchemCommand.register(dispatcher);
+            SchematicV2Command.register(dispatcher);
         });
     }
 }
diff --git a/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
index 5f997543..2b4932f6 100644
--- a/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
+++ b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
@@ -3,57 +3,44 @@ package org.dimdev.dimdoors.command;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.dimdev.dimcore.schematic.v2.Schematic;
 import org.dimdev.dimcore.schematic.v2.SchematicPlacer;
+import org.dimdev.dimdoors.command.arguments.SchematicNamespaceArgumentType;
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.arguments.StringArgumentType;
 import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 
 import net.minecraft.nbt.NbtIo;
 import net.minecraft.server.command.ServerCommandSource;
 import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.text.TranslatableText;
 
 import static net.minecraft.server.command.CommandManager.argument;
 import static net.minecraft.server.command.CommandManager.literal;
 
 public class SchematicV2Command {
+    private static final Logger LOGGER = LogManager.getLogger();
+
     public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
         dispatcher.register(literal("schematicv2")
-                // TODO: Create an argument type for this
-                .then(literal("ruins")
+                .then(argument("namespace", new SchematicNamespaceArgumentType())
                         .then(argument("schematic_name", StringArgumentType.string())
-                                .executes((ctx) -> place(ctx, "ruins"))
-                        )
-                )
-                .then(literal("blank")
-                        .then(argument("schematic_name", StringArgumentType.string())
-                                .executes((ctx) -> place(ctx, "blank"))
-                        )
-                )
-                .then(literal("nether")
-                        .then(argument("schematic_name", StringArgumentType.string())
-                                .executes((ctx) -> place(ctx, "nether"))
-                        )
-                )
-                .then(literal("private")
-                        .then(argument("schematic_name", StringArgumentType.string())
-                                .executes((ctx) -> place(ctx, "private"))
-                        )
-                )
-                .then(literal("public")
-                        .then(argument("schematic_name", StringArgumentType.string())
-                                .executes((ctx) -> place(ctx, "public"))
+                                .executes(SchematicV2Command::place)
                         )
                 )
         );
     }
 
-    private static int place(CommandContext<ServerCommandSource> ctx, String namespace) throws CommandSyntaxException {
+    private static int place(CommandContext<ServerCommandSource> ctx) throws CommandSyntaxException {
         ServerPlayerEntity player = ctx.getSource().getPlayer();
         String id = StringArgumentType.getString(ctx, "schematic_name");
+        String ns = SchematicNamespaceArgumentType.getValue(ctx, "namespace");
 
-        try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/v2/" + namespace + "/" + id + ".schem")) {
+        try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/v2/" + ns + "/" + id + ".schem")) {
             SchematicPlacer.place(
                     Schematic.fromTag(NbtIo.readCompressed(in)),
                     ctx.getSource().getWorld(),
@@ -61,9 +48,10 @@ public class SchematicV2Command {
             );
         } catch (IOException e) {
             e.printStackTrace();
+            throw new SimpleCommandExceptionType(new TranslatableText("command.dimdoors.schematicv2.unknownSchematic", id, ns)).create();
         }
 
-        System.out.println(id + " placed");
+        LOGGER.info(String.format("Placed schematic %s from namespace %s at %s in world %s", id, ns, player.getBlockPos(), player.getServerWorld().getRegistryKey().getValue()));
         return 1;
     }
 }
diff --git a/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java b/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
new file mode 100644
index 00000000..bddfe00e
--- /dev/null
+++ b/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
@@ -0,0 +1,35 @@
+package org.dimdev.dimdoors.command.arguments;
+
+import java.util.Collection;
+import java.util.Objects;
+
+import com.google.common.collect.ImmutableList;
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.arguments.ArgumentType;
+import com.mojang.brigadier.context.CommandContext;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
+
+import net.minecraft.text.TranslatableText;
+
+public class SchematicNamespaceArgumentType implements ArgumentType<String> {
+    private static final Collection<String> EXAMPLES = ImmutableList.of("ruins", "blank", "nether", "private", "public");
+
+    @Override
+    public String parse(StringReader reader) throws CommandSyntaxException {
+        String value = Objects.requireNonNull(reader.readString());
+        if (!EXAMPLES.contains(value)) {
+            throw new SimpleCommandExceptionType(new TranslatableText("argument.dimdoors.schematic.invalidNamespace", String.join(", ", EXAMPLES), value)).create();
+        }
+        return value;
+    }
+
+    @Override
+    public Collection<String> getExamples() {
+        return EXAMPLES;
+    }
+
+    public static String getValue(CommandContext<?> context, final String name) {
+        return context.getArgument(name, String.class);
+    }
+}
diff --git a/src/main/java/org/dimdev/dimdoors/world/feature/ModFeatures.java b/src/main/java/org/dimdev/dimdoors/world/feature/ModFeatures.java
index 285cf608..e309285a 100644
--- a/src/main/java/org/dimdev/dimdoors/world/feature/ModFeatures.java
+++ b/src/main/java/org/dimdev/dimdoors/world/feature/ModFeatures.java
@@ -22,37 +22,21 @@ import net.minecraft.world.gen.feature.Feature;
 import net.fabricmc.loader.api.FabricLoader;
 
 public final class ModFeatures {
-    public static final Feature<SchematicGatewayFeatureConfig> GATEWAY_FEATURE = Registry.register(Registry.FEATURE, new Identifier("dimdoors", "gateway"), new SchematicGatewayFeature(SchematicGatewayFeatureConfig.CODEC));
     public static final Feature<SchematicV2GatewayFeatureConfig> GATEWAY_FEATURE_V2 = Registry.register(Registry.FEATURE, new Identifier("dimdoors", "gateway_v2"), new SchematicV2GatewayFeature(SchematicV2GatewayFeatureConfig.CODEC));
-    public static final SchematicGateway SANDSTONE_PILLARS_GATEWAY;
-    public static final SchematicGateway TWO_PILLARS_GATEWAY;
     public static final SchematicV2Gateway SANDSTONE_PILLARS_GATEWAY_V2;
     public static final ConfiguredFeature<?, ?> SANDSTONE_PILLARS_FEATURE_V2;
-    public static final ConfiguredFeature<?, ?> SANDSTONE_PILLARS_FEATURE;
-    public static final ConfiguredFeature<?, ?> TWO_PILLARS_FEATURE;
 
     public static void init() {
         Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier("dimdoors", "sandstone_pillars_v2"), SANDSTONE_PILLARS_FEATURE_V2);
-        Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier("dimdoors", "sandstone_pillars"), SANDSTONE_PILLARS_FEATURE);
-        Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier("dimdoors", "two_pillars"), TWO_PILLARS_FEATURE);
     }
 
     static {
         ModBlocks.init();
-
-        SANDSTONE_PILLARS_GATEWAY = new SandstonePillarsGateway();
-        TWO_PILLARS_GATEWAY = new TwoPillarsGateway();
         SANDSTONE_PILLARS_GATEWAY_V2 = new SandstonePillarsV2Gateway();
 
-        int gatewayChance = FabricLoader.getInstance().isDevelopmentEnvironment() ? 50 : ModConfig.WORLD.gatewayGenChance;
+        int gatewayChance = FabricLoader.getInstance().isDevelopmentEnvironment() ? 20 : ModConfig.WORLD.gatewayGenChance;
         SANDSTONE_PILLARS_FEATURE_V2 = GATEWAY_FEATURE_V2.configure(new SchematicV2GatewayFeatureConfig(SchematicV2Gateway.SCHEMATIC_ID_MAP.get(SANDSTONE_PILLARS_GATEWAY_V2)))
                 .decorate(ConfiguredFeatures.Decorators.SQUARE_TOP_SOLID_HEIGHTMAP
                         .applyChance(gatewayChance));
-        SANDSTONE_PILLARS_FEATURE = GATEWAY_FEATURE.configure(new SchematicGatewayFeatureConfig(SchematicGateway.SCHEMATIC_ID_MAP.get(SANDSTONE_PILLARS_GATEWAY)))
-                .decorate(ConfiguredFeatures.Decorators.SQUARE_TOP_SOLID_HEIGHTMAP
-                        .applyChance(gatewayChance));
-        TWO_PILLARS_FEATURE = GATEWAY_FEATURE.configure(new SchematicGatewayFeatureConfig(SchematicGateway.SCHEMATIC_ID_MAP.get(TWO_PILLARS_GATEWAY)))
-                .decorate(ConfiguredFeatures.Decorators.SQUARE_TOP_SOLID_HEIGHTMAP
-                        .applyChance(gatewayChance));
     }
 }
diff --git a/src/main/resources/assets/dimdoors/lang/en_us.json b/src/main/resources/assets/dimdoors/lang/en_us.json
index d11ae497..a698d8c8 100644
--- a/src/main/resources/assets/dimdoors/lang/en_us.json
+++ b/src/main/resources/assets/dimdoors/lang/en_us.json
@@ -184,5 +184,7 @@
   "dimdoors.graphics.riftSize": "Rift Size",
   "dimdoors.graphics.riftSize.tooltip": "Multiplier affecting how large rifts should be rendered, 1 being the default size.",
   "dimdoors.graphics.riftJitter": "Rift Jitter",
-  "dimdoors.graphics.riftJitter.tooltip": "Multiplier affecting how much rifts should jitter, 1 being the default size."
+  "dimdoors.graphics.riftJitter.tooltip": "Multiplier affecting how much rifts should jitter, 1 being the default size.",
+  "argument.dimdoors.schematic.invalidNamespace": "Invalid schematic namespace. Expected one of %s, found %s.",
+  "command.dimdoors.schematicv2.unknownSchematic": "Unknown schematic \"%s\" in namespace \"%s\" "
 }
\ No newline at end of file

From 9ee0cf93fa188fd0ce137017c51cee0c196e156a Mon Sep 17 00:00:00 2001
From: SD <harrypotter.starwars.shrish@gmail.com>
Date: Mon, 21 Sep 2020 09:10:25 +0530
Subject: [PATCH 3/5] Cleaned up and fixed dimteleport

 Changes to be committed:
	modified:   src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java
	modified:   src/main/java/org/dimdev/dimdoors/command/ModCommands.java
	deleted:    src/main/java/org/dimdev/dimdoors/command/SaveSchemCommand.java
	deleted:    src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
	modified:   src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
	modified:   src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
---
 .../dimdoors/command/DimTeleportCommand.java  |  4 ++
 .../dimdev/dimdoors/command/ModCommands.java  |  2 -
 .../dimdoors/command/SaveSchemCommand.java    | 49 -------------------
 .../dimdoors/command/SchematicCommand.java    | 47 ------------------
 .../dimdoors/command/SchematicV2Command.java  |  3 +-
 .../SchematicNamespaceArgumentType.java       | 17 +++++--
 6 files changed, 19 insertions(+), 103 deletions(-)
 delete mode 100644 src/main/java/org/dimdev/dimdoors/command/SaveSchemCommand.java
 delete mode 100644 src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java

diff --git a/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java b/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java
index a83fd0ef..7fcccc8e 100644
--- a/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java
+++ b/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java
@@ -17,6 +17,10 @@ public class DimTeleportCommand {
         dispatcher.register(CommandManager.literal("dimteleport")
                 .then(CommandManager
                         .argument("dimension", DimensionArgumentType.dimension())
+                        .executes(ctx -> {
+                            ServerPlayerEntity player = ctx.getSource().getPlayer();
+                            return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), player.getPos());
+                        })
                         .then(CommandManager
                                 .argument("coordinates", Vec3ArgumentType.vec3())
                                 .executes(ctx -> {
diff --git a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
index c4f41bf2..4dd0153a 100644
--- a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
+++ b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
@@ -6,9 +6,7 @@ public final class ModCommands {
     public static void init() {
         CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> {
             DimTeleportCommand.register(dispatcher);
-            SchematicCommand.register(dispatcher);
             PocketCommand.register(dispatcher);
-            SaveSchemCommand.register(dispatcher);
             SchematicV2Command.register(dispatcher);
         });
     }
diff --git a/src/main/java/org/dimdev/dimdoors/command/SaveSchemCommand.java b/src/main/java/org/dimdev/dimdoors/command/SaveSchemCommand.java
deleted file mode 100644
index 0370f5a4..00000000
--- a/src/main/java/org/dimdev/dimdoors/command/SaveSchemCommand.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.dimdev.dimdoors.command;
-
-import com.flowpowered.math.vector.Vector3i;
-import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import org.dimdev.dimcore.schematic.Schematic;
-import org.dimdev.dimdoors.pockets.SchematicHandler;
-import org.dimdev.dimdoors.world.ModDimensions;
-import org.dimdev.dimdoors.world.pocket.Pocket;
-import org.dimdev.dimdoors.world.pocket.PocketRegistry;
-
-import net.minecraft.command.CommandException;
-import net.minecraft.server.command.CommandManager;
-import net.minecraft.server.command.ServerCommandSource;
-import net.minecraft.server.network.ServerPlayerEntity;
-import net.minecraft.text.TranslatableText;
-import net.minecraft.util.math.Vec3i;
-
-public class SaveSchemCommand {
-    public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
-        dispatcher.register(CommandManager.literal("saveschem")
-                .then(CommandManager
-                        .argument("name", StringArgumentType.string())
-                        .executes(ctx -> {
-                            ServerPlayerEntity player = ctx.getSource().getPlayer();
-                            if (!ModDimensions.isDimDoorsPocketDimension(player.world)) {
-                                throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket"));
-                            }
-
-                            Pocket pocket = PocketRegistry.instance(player.getServerWorld().getRegistryKey()).getPocketAt(player.getBlockPos());
-                            if (pocket == null)
-                                throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket"));
-
-                            Vector3i size = pocket.getSize().add(1, 1, 1).mul(16).sub(1, 1, 1);
-                            Schematic schematic = Schematic.createFromWorld(player.world, pocket.getOrigin(), pocket.getOrigin().add(new Vec3i(size.getX(), size.getY(), size.getZ())));
-
-                            String name = StringArgumentType.getString(ctx, "name");
-
-                            schematic.name = name;
-                            schematic.author = player.getName().getString();
-
-                            SchematicHandler.INSTANCE.saveSchematicForEditing(schematic, name);
-
-                            ctx.getSource().sendError(new TranslatableText("commands.saveschem.success"));
-                            return 1;
-                        }))
-        );
-    }
-}
diff --git a/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java b/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
deleted file mode 100644
index e6df57b8..00000000
--- a/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.dimdev.dimdoors.command;
-
-import java.io.InputStream;
-
-import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import org.dimdev.dimcore.schematic.Schematic;
-import org.dimdev.dimcore.schematic.SchematicConverter;
-
-import net.minecraft.nbt.NbtIo;
-import net.minecraft.server.command.CommandManager;
-import net.minecraft.server.command.ServerCommandSource;
-import net.minecraft.server.network.ServerPlayerEntity;
-import net.minecraft.server.world.ServerWorld;
-
-public class SchematicCommand {
-    public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
-        dispatcher.register(CommandManager.literal("schematic")
-                .then(CommandManager.literal("place")
-                        .then(CommandManager.argument("schematic_name", StringArgumentType.string())
-                                .executes(ctx -> {
-                                            SchematicConverter.reloadConversions();
-                                            ServerPlayerEntity player = ctx.getSource().getPlayer();
-                                            String id = StringArgumentType.getString(ctx, "schematic_name");
-
-                                            try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/ruins/" + id + ".schem")) {
-                                                Schematic.fromTag(NbtIo.readCompressed(in))
-                                                        .place(
-                                                                (ServerWorld) player.world,
-                                                                (int) player.getPos().x,
-                                                                (int) player.getPos().y,
-                                                                (int) player.getPos().z
-                                                        );
-                                            } catch (Throwable t) {
-                                                t.printStackTrace();
-                                            }
-
-                                            System.out.println(id + " placed");
-
-                                            return 1;
-                                        }
-                                )
-                        )
-                )
-        );
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
index 2b4932f6..5528f1dd 100644
--- a/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
+++ b/src/main/java/org/dimdev/dimdoors/command/SchematicV2Command.java
@@ -7,6 +7,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.dimdev.dimcore.schematic.v2.Schematic;
 import org.dimdev.dimcore.schematic.v2.SchematicPlacer;
+import org.dimdev.dimdoors.DimensionalDoorsInitializer;
 import org.dimdev.dimdoors.command.arguments.SchematicNamespaceArgumentType;
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.arguments.StringArgumentType;
@@ -40,7 +41,7 @@ public class SchematicV2Command {
         String id = StringArgumentType.getString(ctx, "schematic_name");
         String ns = SchematicNamespaceArgumentType.getValue(ctx, "namespace");
 
-        try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/v2/" + ns + "/" + id + ".schem")) {
+        try (InputStream in = DimensionalDoorsInitializer.class.getResourceAsStream("/data/dimdoors/pockets/schematic/v2/" + ns + "/" + id + ".schem")) {
             SchematicPlacer.place(
                     Schematic.fromTag(NbtIo.readCompressed(in)),
                     ctx.getSource().getWorld(),
diff --git a/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java b/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
index bddfe00e..53ee08bb 100644
--- a/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
+++ b/src/main/java/org/dimdev/dimdoors/command/arguments/SchematicNamespaceArgumentType.java
@@ -2,6 +2,7 @@ package org.dimdev.dimdoors.command.arguments;
 
 import java.util.Collection;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 
 import com.google.common.collect.ImmutableList;
 import com.mojang.brigadier.StringReader;
@@ -9,24 +10,32 @@ import com.mojang.brigadier.arguments.ArgumentType;
 import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
+import com.mojang.brigadier.suggestion.Suggestions;
+import com.mojang.brigadier.suggestion.SuggestionsBuilder;
 
+import net.minecraft.server.command.CommandSource;
 import net.minecraft.text.TranslatableText;
 
 public class SchematicNamespaceArgumentType implements ArgumentType<String> {
-    private static final Collection<String> EXAMPLES = ImmutableList.of("ruins", "blank", "nether", "private", "public");
+    private static final Collection<String> NAMESPACES = ImmutableList.of("ruins", "blank", "nether", "private", "public");
 
     @Override
     public String parse(StringReader reader) throws CommandSyntaxException {
         String value = Objects.requireNonNull(reader.readString());
-        if (!EXAMPLES.contains(value)) {
-            throw new SimpleCommandExceptionType(new TranslatableText("argument.dimdoors.schematic.invalidNamespace", String.join(", ", EXAMPLES), value)).create();
+        if (!NAMESPACES.contains(value)) {
+            throw new SimpleCommandExceptionType(new TranslatableText("argument.dimdoors.schematic.invalidNamespace", String.join(", ", NAMESPACES), value)).create();
         }
         return value;
     }
 
     @Override
     public Collection<String> getExamples() {
-        return EXAMPLES;
+        return NAMESPACES;
+    }
+
+    @Override
+    public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
+        return CommandSource.suggestMatching(NAMESPACES, builder);
     }
 
     public static String getValue(CommandContext<?> context, final String name) {

From e6734546c16e3a6a83f56618e2309a1606775ef4 Mon Sep 17 00:00:00 2001
From: SD <harrypotter.starwars.shrish@gmail.com>
Date: Mon, 21 Sep 2020 12:13:26 +0530
Subject: [PATCH 4/5] Converted one schematic

 Changes to be committed:
	modified:   src/main/java/org/dimdev/dimcore/schematic/v2/SchematicBlockPalette.java
	modified:   src/main/java/org/dimdev/dimdoors/command/ModCommands.java
	new file:   src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
	new file:   src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_cube.schem
---
 .../schematic/v2/SchematicBlockPalette.java   |   3 +-
 .../dimdev/dimdoors/command/ModCommands.java  |   1 +
 .../dimdoors/command/SchematicCommand.java    |  49 ++++++++++++++++++
 .../schematic/v2/ruins/exit_cube.schem        | Bin 0 -> 653 bytes
 4 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_cube.schem

diff --git a/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicBlockPalette.java b/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicBlockPalette.java
index 90da4d81..4f74d30e 100644
--- a/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicBlockPalette.java
+++ b/src/main/java/org/dimdev/dimcore/schematic/v2/SchematicBlockPalette.java
@@ -13,6 +13,7 @@ import net.minecraft.block.Block;
 import net.minecraft.block.BlockState;
 import net.minecraft.state.property.Property;
 import net.minecraft.util.Identifier;
+import net.minecraft.util.StringIdentifiable;
 import net.minecraft.util.registry.Registry;
 
 public class SchematicBlockPalette {
@@ -65,7 +66,7 @@ public class SchematicBlockPalette {
 
                 if (state.get(property) instanceof Enum<?>) {
                     // Enum might have override toString
-                    builder.append(((Enum<?>) state.get(property)).name());
+                    builder.append(((StringIdentifiable) state.get(property)).asString());
                 } else {
                     builder.append(state.get(property).toString());
                 }
diff --git a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
index 4dd0153a..4f6d680b 100644
--- a/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
+++ b/src/main/java/org/dimdev/dimdoors/command/ModCommands.java
@@ -8,6 +8,7 @@ public final class ModCommands {
             DimTeleportCommand.register(dispatcher);
             PocketCommand.register(dispatcher);
             SchematicV2Command.register(dispatcher);
+            SchematicCommand.register(dispatcher);
         });
     }
 }
diff --git a/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java b/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
new file mode 100644
index 00000000..9c830aec
--- /dev/null
+++ b/src/main/java/org/dimdev/dimdoors/command/SchematicCommand.java
@@ -0,0 +1,49 @@
+package org.dimdev.dimdoors.command;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.dimdev.dimcore.schematic.Schematic;
+import org.dimdev.dimcore.schematic.SchematicConverter;
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+
+import net.minecraft.nbt.NbtIo;
+import net.minecraft.server.command.ServerCommandSource;
+import net.minecraft.server.network.ServerPlayerEntity;
+
+import static net.minecraft.server.command.CommandManager.argument;
+import static net.minecraft.server.command.CommandManager.literal;
+
+public class SchematicCommand {
+    public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
+        dispatcher.register(literal("schematicold")
+                .then(literal("place")
+                        .then(argument("schematic_name", StringArgumentType.string())
+                                .executes(ctx -> {
+                                            SchematicConverter.reloadConversions();
+                                            ServerPlayerEntity player = ctx.getSource().getPlayer();
+                                            String id = StringArgumentType.getString(ctx, "schematic_name");
+
+                                            try (InputStream in = SchematicCommand.class.getResourceAsStream("/data/dimdoors/pockets/schematic/ruins/" + id + ".schem")) {
+                                                Schematic.fromTag(NbtIo.readCompressed(in))
+                                                        .place(
+                                                                 player.world,
+                                                                (int) player.getPos().x,
+                                                                (int) player.getPos().y,
+                                                                (int) player.getPos().z
+                                                        );
+                                            } catch (IOException e) {
+                                                e.printStackTrace();
+                                            }
+
+                                            System.out.println(id + " placed");
+
+                                            return 1;
+                                        }
+                                )
+                        )
+                )
+        );
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_cube.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_cube.schem
new file mode 100644
index 0000000000000000000000000000000000000000..ce45d2e0d1fa9c3e898827c9fd3747e22924ab9e
GIT binary patch
literal 653
zcmb2|=3sz;x3|t`U2%{(@G;)3?DpALj#K1pD_$=354ho->v-@|(}iE`k;_h|7@N$V
zIJ5E9!RMcRYgqLkX|L(LmgM+CChV^L{qsgVo^^lJIA_NnGMLE|_hjn4RSBO$HVKEm
z7Wgu;N?$2cZFabIP-V!B%*3^ytFNt0TXcNY$=<v}J3^kHdvfXM>6=$ftjbsMRNLKf
z>)-7xo-9A5@SpF>qRT#Ry`>9ptqqCoJD1B*w(GU_SHJ$6f>S=LHdL={D%(2Or^HYz
z^zGN%W|jI=-`b~re|vC=Z1v|5>-?O{N53ukA7ef_;G~~gw7b;`C)TN_9=!RmLuW6a
ze){H{&+l)G|10yb>UZh(yZ?UqmzH~NntbZR0^dSgw{Hc(Y`?dj)!%hjDc+6~5<m@4
zr~E1Mo}m){S2xl8w<urt?tF#~7D}&YyG+}@mGgDq_b1<ew;dJune~jf@2XhrhsBH5
zol3p4Au!Q1CL(6riem4&kWV{)J06Vp5B%?y@bS#v2kx#%>kE(CMiwR(J{K!rD)Oh)
z?cniAzw%k@*Y)$T%KsNKwvPzX{?sZzwYP~sVXf{jnSU{dlb(N2z7+U@QD<)D`b(W&
z+ioOYTwSv0661kI9dYgTo7H<te?ViDEJ`~|;rqAj+3_-F2U!-^UVHaC*Yka(;_cR%
zV%MzpFQ5G&Wb*5c#;GTs_$_Smda`bn{#Ew+1=+G&RE%`io-X}(<l41P9#z|o`_4|=
z_SW&X*{yF8|GZw+-G1loZ+6Z{Q0u0o*MCs($DYag_BQ$U{B762hVEmYk(T@O!%GGR
E0P0aRk^lez

literal 0
HcmV?d00001


From 66128af3cbafd0fbd2f655b5ff817482a6984fcc Mon Sep 17 00:00:00 2001
From: SD <harrypotter.starwars.shrish@gmail.com>
Date: Mon, 21 Sep 2020 17:31:36 +0530
Subject: [PATCH 5/5] Converted a few schematics

Note: none of the doors have any proper rift data. each schematic might have to be saved again with proper rift data.
---
 build.gradle                                  |  11 +-
 .../block/entity/RiftBlockEntity.java         | 128 +++++++++---------
 .../schematic/v2/ruins/anchored_descent.schem | Bin 0 -> 930 bytes
 .../schematic/v2/ruins/broken_pillars.schem   | Bin 0 -> 973 bytes
 .../schematic/v2/ruins/buggy_top_entry.schem  | Bin 0 -> 1033 bytes
 .../v2/ruins/collapsed_single_tunnel.schem    | Bin 0 -> 711 bytes
 .../schematic/v2/ruins/crumbled_hall.schem    | Bin 0 -> 893 bytes
 .../v2/ruins/diamond_tower_temple.schem       | Bin 0 -> 1149 bytes
 .../schematic/v2/ruins/door_totem_ruins.schem | Bin 0 -> 954 bytes
 .../ruins/exit_ruins_with_hidden_door.schem   | Bin 0 -> 649 bytes
 .../v2/ruins/eyes_of_tricksters.schem         | Bin 0 -> 2780 bytes
 .../schematic/v2/ruins/fake_tnt_trap_a.schem  | Bin 0 -> 1682 bytes
 .../schematic/v2/ruins/fake_tnt_trap_b.schem  | Bin 0 -> 1650 bytes
 .../schematic/v2/ruins/floating_altar.schem   | Bin 0 -> 1744 bytes
 14 files changed, 69 insertions(+), 70 deletions(-)
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/anchored_descent.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/broken_pillars.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/buggy_top_entry.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/collapsed_single_tunnel.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/crumbled_hall.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/diamond_tower_temple.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/door_totem_ruins.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_ruins_with_hidden_door.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/eyes_of_tricksters.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_a.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_b.schem
 create mode 100644 src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/floating_altar.schem

diff --git a/build.gradle b/build.gradle
index f3935089..7a5e593f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,5 @@
 plugins {
     id 'fabric-loom' version '0.5-SNAPSHOT'
-    id 'com.github.johnrengelman.shadow' version '6.0.0'
 }
 
 apply plugin: "java"
@@ -12,7 +11,6 @@ repositories {
     maven { url = 'https://maven.fabricmc.net/' }
     maven { url 'https://jitpack.io' }
     mavenCentral()
-    maven { url = 'https://dl.bintray.com/boogiemonster1o1/cool-mods/' }
     maven { url = 'https://www.cursemaven.com' }
 }
 
@@ -22,19 +20,20 @@ dependencies {
     modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
     modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
     implementation 'com.flowpowered:flow-math:1.0.3'
-    shadow 'com.flowpowered:flow-math:1.0.3'
+    include 'com.flowpowered:flow-math:1.0.3'
     implementation 'org.jgrapht:jgrapht-core:1.1.0'
-    shadow 'org.jgrapht:jgrapht-core:1.1.0'
+    include 'org.jgrapht:jgrapht-core:1.1.0'
     implementation 'com.github.DimensionalDevelopment:poly2tri.java:0.1.1'
-    shadow 'com.github.DimensionalDevelopment:poly2tri.java:0.1.1'
+    include 'com.github.DimensionalDevelopment:poly2tri.java:0.1.1'
     modApi("com.github.Waterpicker:OpenWorlds:c5a1ced") {
         exclude module: "fabric-api"
     }
     include 'com.github.Waterpicker:OpenWorlds:c5a1ced'
     compileOnly 'com.google.code.findbugs:jsr305:+'
     modImplementation("io.github.boogiemonster1o1:libcbe:${libcbe_version}")
-    include("io.github.boogiemonster1o1:libcbe:${libcbe_version}") // Includes LibCBE as a Jar-in-Jar embedded dependency
+    include("io.github.boogiemonster1o1:libcbe:${libcbe_version}") // Includes LibCBE as a Jar-in-Jar embedded dependency
     modImplementation("curse.maven:worldedit:3039223") // For saving schematics
+    modImplementation("curse.maven:wecui:2995033") // Cos why not
 }
 
 version "4.0.0+alpha.3"
diff --git a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java
index d9a80174..8e1442c0 100644
--- a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java
+++ b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java
@@ -31,7 +31,7 @@ import net.minecraft.text.LiteralText;
 import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable;
 
 public abstract class RiftBlockEntity extends BlockEntity implements BlockEntityClientSerializable, Target, EntityTarget {
-    private static Codec<RiftData> CODEC = RiftData.CODEC;
+    private static final Codec<RiftData> CODEC = RiftData.CODEC;
     private static final Logger LOGGER = LogManager.getLogger();
 
     protected RiftData data = new RiftData();
@@ -45,7 +45,7 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity
     // NBT
     @Override
     public void fromTag(BlockState state, CompoundTag nbt) {
-        deserialize(nbt);
+        this.deserialize(nbt);
     }
 
     protected void deserialize(CompoundTag nbt) {
@@ -54,123 +54,123 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity
 
     @Override
     public CompoundTag toTag(CompoundTag tag) {
-        serialize(tag);
+        this.serialize(tag);
 
         return super.toTag(tag);
     }
 
     protected CompoundTag serialize(CompoundTag tag) {
-        if(data != null) tag.put("data", NbtUtil.serialize(data, CODEC));
+        if(this.data != null) tag.put("data", NbtUtil.serialize(this.data, CODEC));
         return tag;
     }
 
     @Override
     public void fromClientTag(CompoundTag tag) {
-        deserialize(tag);
+        this.deserialize(tag);
     }
 
     @Override
     public CompoundTag toClientTag(CompoundTag tag) {
-        return serialize(tag);
+        return this.serialize(tag);
     }
 
     public void setDestination(VirtualTarget destination) {
         System.out.println("setting Destination " + destination);
 
-        if (this.getDestination() != null && isRegistered()) {
+        if (this.getDestination() != null && this.isRegistered()) {
             this.getDestination().unregister();
         }
         this.data.setDestination(destination);
         if (destination != null) {
-            if (world != null && pos != null) {
-                destination.setLocation(new Location((ServerWorld) world, pos));
+            if (this.world != null && this.pos != null) {
+                destination.setLocation(new Location((ServerWorld) this.world, this.pos));
             }
-            if (isRegistered()) destination.register();
+            if (this.isRegistered()) destination.register();
         }
-        riftStateChanged = true;
-        markDirty();
-        updateColor();
+        this.riftStateChanged = true;
+        this.markDirty();
+        this.updateColor();
     }
 
     public void setColor(RGBA color) {
-        data.setColor(color);
-        markDirty();
+        this.data.setColor(color);
+        this.markDirty();
     }
 
     public void setProperties(LinkProperties properties) {
-        data.setProperties(properties);
-        updateProperties();
-        markDirty();
+        this.data.setProperties(properties);
+        this.updateProperties();
+        this.markDirty();
     }
 
     public void markStateChanged() {
-        riftStateChanged = true;
-        markDirty();
+        this.riftStateChanged = true;
+        this.markDirty();
     }
 
     public boolean isRegistered() {
-        return !PocketTemplate.isReplacingPlaceholders() && RiftRegistry.instance().isRiftAt(new Location((ServerWorld) world, pos));
+        return !PocketTemplate.isReplacingPlaceholders() && RiftRegistry.instance().isRiftAt(new Location((ServerWorld) this.world, this.pos));
     }
 
     public void register() {
-        if (isRegistered()) {
+        if (this.isRegistered()) {
             return;
         }
 
-        Location loc = new Location((ServerWorld) world, pos);
+        Location loc = new Location((ServerWorld) this.world, this.pos);
         RiftRegistry.instance().addRift(loc);
-        if (data.getDestination() != VirtualTarget.NoneTarget.DUMMY) data.getDestination().register();
-        updateProperties();
-        updateColor();
+        if (this.data.getDestination() != VirtualTarget.NoneTarget.DUMMY) this.data.getDestination().register();
+        this.updateProperties();
+        this.updateColor();
     }
 
     public void updateProperties() {
-        if (isRegistered())
-            RiftRegistry.instance().setProperties(new Location((ServerWorld) world, pos), data.getProperties());
-        markDirty();
+        if (this.isRegistered())
+            RiftRegistry.instance().setProperties(new Location((ServerWorld) this.world, this.pos), this.data.getProperties());
+        this.markDirty();
     }
 
     public void unregister() {
-        if (isRegistered()) {
-            RiftRegistry.instance().removeRift(new Location((ServerWorld) world, pos));
+        if (this.isRegistered()) {
+            RiftRegistry.instance().removeRift(new Location((ServerWorld) this.world, this.pos));
         }
     }
 
     public void updateType() {
-        if (!isRegistered()) return;
-        Rift rift = RiftRegistry.instance().getRift(new Location((ServerWorld) world, pos));
-        rift.isDetached = isDetached();
+        if (!this.isRegistered()) return;
+        Rift rift = RiftRegistry.instance().getRift(new Location((ServerWorld) this.world, this.pos));
+        rift.isDetached = this.isDetached();
         rift.markDirty();
     }
 
     public void handleTargetGone(Location location) {
-        if (data.getDestination().shouldInvalidate(location)) {
-            data.setDestination(null);
-            markDirty();
+        if (this.data.getDestination().shouldInvalidate(location)) {
+            this.data.setDestination(null);
+            this.markDirty();
         }
 
-        updateColor();
+        this.updateColor();
     }
 
     public void handleSourceGone(Location location) {
-        updateColor();
+        this.updateColor();
     }
 
     public Target getTarget() {
-        if (data.getDestination() == VirtualTarget.NoneTarget.DUMMY) {
+        if (this.data.getDestination() == VirtualTarget.NoneTarget.DUMMY) {
             return new MessageTarget("rifts.unlinked1");
         } else {
-            data.getDestination().setLocation(new Location((ServerWorld) world, pos));
-            return data.getDestination();
+            this.data.getDestination().setLocation(new Location((ServerWorld) this.world, this.pos));
+            return this.data.getDestination();
         }
     }
 
     public boolean teleport(Entity entity) {
-        riftStateChanged = false;
+        this.riftStateChanged = false;
 
         // Attempt a teleport
         try {
-            EntityTarget target = getTarget().as(Targets.ENTITY);
+            EntityTarget target = this.getTarget().as(Targets.ENTITY);
 
             if (target.receiveEntity(entity, entity.yaw)) {
                 VirtualLocation vloc = VirtualLocation.fromLocation(new Location((ServerWorld) entity.world, entity.getBlockPos()));
@@ -186,17 +186,17 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity
     }
 
     public void updateColor() {
-        if (data.isForcedColor()) return;
-        if (!isRegistered()) {
-            data.setColor(new RGBA(0, 0, 0, 1));
-        } else if (data.getDestination() == VirtualTarget.NoneTarget.DUMMY) {
-            data.setColor(new RGBA(0.7f, 0.7f, 0.7f, 1));
+        if (this.data.isForcedColor()) return;
+        if (!this.isRegistered()) {
+            this.data.setColor(new RGBA(0, 0, 0, 1));
+        } else if (this.data.getDestination() == VirtualTarget.NoneTarget.DUMMY) {
+            this.data.setColor(new RGBA(0.7f, 0.7f, 0.7f, 1));
         } else {
-            data.getDestination().setLocation(new Location((ServerWorld) world, pos));
-            RGBA newColor = data.getDestination().getColor();
-            if (data.getColor() == RGBA.NONE && newColor != RGBA.NONE || !Objects.equals(data.getColor(), newColor)) {
-                data.setColor(newColor);
-                markDirty();
+            this.data.getDestination().setLocation(new Location((ServerWorld) this.world, this.pos));
+            RGBA newColor = this.data.getDestination().getColor();
+            if (this.data.getColor() == RGBA.NONE && newColor != RGBA.NONE || !Objects.equals(this.data.getColor(), newColor)) {
+                this.data.setColor(newColor);
+                this.markDirty();
             }
         }
     }
@@ -205,30 +205,30 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity
 
     public void copyFrom(DetachedRiftBlockEntity rift) {
 
-        data.setDestination(rift.data.getDestination());
-        data.setProperties(rift.data.getProperties());
-        data.setAlwaysDelete(rift.data.isAlwaysDelete());
-        data.setForcedColor(rift.data.isForcedColor());
+        this.data.setDestination(rift.data.getDestination());
+        this.data.setProperties(rift.data.getProperties());
+        this.data.setAlwaysDelete(rift.data.isAlwaysDelete());
+        this.data.setForcedColor(rift.data.isForcedColor());
     }
 
     public VirtualTarget getDestination() {
-        return data.getDestination();
+        return this.data.getDestination();
     }
 
     public LinkProperties getProperties() {
-        return data.getProperties();
+        return this.data.getProperties();
     }
 
     public boolean isAlwaysDelete() {
-        return data.isAlwaysDelete();
+        return this.data.isAlwaysDelete();
     }
 
     public boolean isForcedColor() {
-        return data.isForcedColor();
+        return this.data.isForcedColor();
     }
 
     public RGBA getColor() {
-        return data.getColor();
+        return this.data.getColor();
     }
 
     public void setData(RiftData data) {
@@ -236,6 +236,6 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity
     }
 
     public RiftData getData() {
-        return data;
+        return this.data;
     }
 }
diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/anchored_descent.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/anchored_descent.schem
new file mode 100644
index 0000000000000000000000000000000000000000..f9092c0de6c41d047fc0d769d80d07e03a1c2191
GIT binary patch
literal 930
zcmV;T16}+diwFP!000000PURJZWB2afX`$yX*=1#1&ALZ_6d5o(q2@msGz_iwW5NG
zE?cc4XXYfaI<X_$rEs<T8v9PX3rIXbu`@~AOp`WELcBrelcLV?*vFo4Mkgbsatv#4
zlQwpk;YkSb9?Q@e++`mDpc2DMzafO%9WF3YtZ6p1kpk`cQV9F!tz1b_Z!o0~k!iEp
zWSPcwA(d(OkF`8LJ3e6sRVG_4Ob0DE81%PI9fq)Rp4u)@o5LncxM*#<?Ca)J7dN#H
zvk|#mf+&RF3M;Pbj5Q8>BOB5f*%>`D2;tY1cTy>p-jIrk7S@?aI0{p5vWDUbxCO$!
zVtRM#NZWH|dv@g=D$S*Eno3aFLD4d8cpSs(E*h3H!$Md)c>cQC)M);+z2Xb;`+SD8
z_^;E`({EtY{DHjHHn1K-b=#&mn<Kuv0&7n*nH;%hfUVCkcY^t+Bqkszk$GQ`c^`y8
z=DiRW8|W@9hN5`#z90(X$@`)R$@K!c;QCUHCw?U7=1Kfw2?pv(yeE3%hsr$F{DpA!
z6CW(|T`2dMA^4$OCBCSA$;wiBY%oo?c{42Y>YB4`;-ibf_-<pz%$;dV`m%|iHJAru
zi}g)plK5#Dqy8rr|Gyy^Rbs-6!8MThiMd|Yh#q6V0?Nz$a=BQh5<jv-5G?gO{i3;E
z{Lr__thI=MenlUMpW+2FEc_)V#ukSe-i}E8jkxqn-uP#IC@781MB*o6ews-9jUe%!
zAn~3c@tz>@o*?m_An~3c@tz>@o*?m_An~4<za|pz2@>xK67LBTPY?t_{N$`bt+%(q
zb78pQsAJm}twQNl3ir--YCvHW6A9K8Z<-j&Zi|H&qC{p=MGz`XU8)G8mO>Qyak-Hl
zW51bY-8OsjFSy@je_`1P`=qxqLxT`QHAQW>V1`Rkg<C91uxl`VspN52L;siD2x<aP
z-q_g>@?9D%6{wx`f?f8JcaA$-@AE6FKsB+ePG7LZNcH4v-WotG<PH}{Pg!zg``qbD
zZ7=u(ZrkbFdEbA&oc36SvfIf59-Qw&!9Fmau||gV%;vDe1-4jW_}2bls!BeUJFGUP
zN-%xqRM`l^J?XB>y<xb294Pe`Jc;k3x#83>oZ3mN+0R3Jf1_6hJ9^cvET89gVe^ln
zk#0e^?C1W}BOgt4IrR9<`uN1X`|B25g6M#!rVX_!RPtR-`hEWEKW4wfcVpHnuZ%_j
E02X1;ZU6uP

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/broken_pillars.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/broken_pillars.schem
new file mode 100644
index 0000000000000000000000000000000000000000..bda84b83ec90ffef4474c6f15fb7642bae37dc42
GIT binary patch
literal 973
zcmb2|=3sz;w>RtaZ@Wkw_;|eZkr^lJ!DBO8j@bVRU76qDch&7W<K(bhrY%MSUF*JC
zZhQ4Z>3(VK|0eMRvmduARIoq&wD@k&tt&61PQCc996QC@{`;M|xi>rSPP<lKxa{|-
zr-d4C(^p+M_fq$(my6i#O%|CPsk`S-w^|qS>e?FPrSIN_RPMRG)$i%lznY<iao?`3
zy;*!SYgt!G?Qx6rU#rc6nfK<!F8vhuEbRN#%b|%?wsY4kU$x;^y1k#osn1q7zi%xq
zR?olUv+gSEBy;DVIwya38cvNho~l*7YxOCM>q}oR%d+U<xgMVXeCo1Y2hMdn?fh=F
z+kVP5UwPhggEJ3bx7yhrcG4*Kn>+ujG_(EhqtAD3+Ns&Tkz2_2V(R(SO_!!E)qNYX
zXb#uXt$$x+&Wd_lXJKRW=W*|^?vHX7>;Avk{$J1Tta;TAjY!U=n_mXY^k3Y!S7UAO
zp(DEwr*Tf(FYv&Pvo9v?!N=$O<t=7Dwp{2KP;JTZA#X*k<?b^Ftimtu62EitS*sK?
z`|_IV+XpW0`1hHsZJzAUW2>_7?@T++c)-;9`}7}IS?39df48!_Z@TB$f&c3d{QA#*
z{N#>Y#vOY9?@9|XJV@L5#l7s#1O|ri%wx*)SNd*_J3hZ6&qVvFjPY#u0OQiX=`ja)
z>K8scbE5ax-SF=L=L`Kla0!^lNVElSJr>#Mn>i<PwvcOZ<Hebc*Ym4B8lQ=Hw?(5%
z&rTMaHmFH8Y`-+=DJXpUy{7MuxxFpFJL*!+o09u_yvoy39u_LefB77Ae5%*os5zOh
zt%U51ujTXA?tJV0;Iz9@{&{|NTl;ytpR0?%t2DX2d-4No&wKtoE8oo0i(PsuqI|VY
zX>O*<sg(}*f{*UA+Aw?91;5|(=3WWe=qESpP>53SO8c*=2d6)cT6z0YPrK(Vp)f1S
zbNe*U#w{(i{CDq$=C?0PB1M~h?*1<|`TCM`>(a?TRG%#^+No*%X<t{eZGqL#T}IW+
z){$$@Z;W~MH~;U8+g9&W^KOWp{Pb_drloOD|L*<QEdF@1(j>n(>2qtACZ(_XUEdqc
zoH_lOXWYBI6&2Ty-;t7deSYTjs>}S-dz0&belAGylzNx2;OV>9%nRdI?Fq1MeJ5tu
z{yy&2JgbX;4}N!dc743?$&r72PvqN;K0Phoe|`4t%11_#FFn4P_^vIRJVU=W^T(&z
Pe|Squ4KAJ(Vq^dSOJU)6

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/buggy_top_entry.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/buggy_top_entry.schem
new file mode 100644
index 0000000000000000000000000000000000000000..0bd6ef7682033c69fb45516bdbe6a4f89568328b
GIT binary patch
literal 1033
zcmbW#?K9g40KoA~T4tVlo1*7&#~}<`B{Q_KTU&J{+D;QG$~?<dNr{#?*>ujr7V9Eu
zRcT4W)Gr?AF+`7&Yph68<f#&^c&bRSBqYLKY=6PNZ$AIP*R|?H(7!1qs>_maC(d^6
zTaVw;0CF4>55)*P8`L(I=DjHe@r))^JZv5jQy^Rwj%{DiUggrZM#W)0tN2bc3E}y)
z`H3}$!K*P0b?K+>M|*o)CB&`HbH#ikJnHWV5!8~di%J*AjW8355iMSkoKTY@_@#Vj
zJD<My4A`K{rX6M=$eVeoYG)N)j)6<PU$GJMA5$hA=YLt?p8r)7j<KLvf5Iw!3izK6
zblS*rM_q3vU@1`W^(QBlkG>U?`PNeXqq9I|UR^DF;0Ki3os8q?n4gFeiS;ts+xfzz
ztzrmr4gMNTsc4;6x}lJg8xba=?Lk0l>-C^F8-TfY_*$3@5|Y;$p~5^|fbnV7X;{&m
z1!DaSZ-3UaTTE8u<RIz5M|9Ti8pi2?_z*qfmf4pSB_RwM1w0<_$=k|(R4n56xv%x{
z?LP}bigi>vtF|_;L+rQ1$u*ISVbMh^i-;Z&2$!AESy;5$ErlUmcT=OzgFc@*a#fF1
z)&<E86EE@;<%?j@N}Dd=Kx|f0?UUIR3{e&RxDM_wTVM_MvGP)?PGmnm(onlz@+PG<
zxj@LG`qWEfia$@i9z65#ZnQ=3<gk}}2H@Btx~YFr<~H!n67xtXD-0V5wmY~_isc5a
zz&LxHGcCtuXr`3@9KprEi@SJRZfSbp%W+VDVdfreX9+%}q{71Zt#dhghcVrDbJBFs
z3MIvZQ#N=5e8}9N)tV-hbrh?5?DpEN?&2-ra)U9|N@mWQa8Q4ci?i7)$+cIZnKsG8
zt_SM*2}73ljd04WM5dZG`ER!WgIteGPY(=STBJ#vznn{-QDz53?qWTBY0!n_#uOI2
zjmADU6SYn<y|pj(v+6JL$fqSe4rlR8Z)*NXXy2%BxRY6!_;8Ki5V|XP1|fS!kLzd!
zwx?oh-iP#;bI+ai<_op-laRJzzBMAFvhP?qDed+xJUXlX@<KdI#D*_2yRl6!2O$`d
znNR4I3I%og&pAH1bXk0Vh1=|@nyT=z)Cf1$>c%#!r`}~_(}88ZJT%roimo6swYW6J
zcimmgL<Y^s8@Cs@Y(<0>FiC7wBW&W{XbawvKlO?Xl}WBGHB3pJ>-Zy}01dUxzcwT3
z2nX%@%n$$7{LVJe|2mSA@qLis-d~iZ=o!tG5v+cE)eDJhMk3pcLfb|X``HjTr(UUI
zag4^=Si-0%f3=EAuzynzWk8hm&~752W$Z#pkvY|YNka?;Ri<#AZmKa{+ysIC0lt|K
AsQ>@~

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/collapsed_single_tunnel.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/collapsed_single_tunnel.schem
new file mode 100644
index 0000000000000000000000000000000000000000..7343471c7f7195a57041e602f93ffeb1d4c912c6
GIT binary patch
literal 711
zcmb2|=3sz;w>Qq_2^$I=_~^OK^EU5OCZ{<T1uw0?FljyY&I)DeV48m7?p)tBId3wq
zFD+=={z$NbZC-;gQ{SAf$qY`S?V?c^z5f1J(cV~Y^Vs5^i>KCW|4keHd^bcYy;Kg)
z;@FiQ*X?0G_3C`)&O0aGntb24YI{xU9gp^7sbR4aV$U{gisYH@vd(wy<uyjGH&!*5
zTg{1|b>(A}dR%Pnve4YUvzNc~st>=b(UWRCb*n9}n)yMMO?3t3`!%w7&-?rN?fZMN
zUhud4{}=mv{=OHwY!hHD#eUN#WrJ|=pLG-CVyAw6dntYL&kZM*e`kVvmVsfS-}1zW
z!#mnSXSY6_vh4S@XaCIX6m_rV%vpQ&^6eiJw$EJqcB^UEBep#otj^y1U3OUNam>Hj
zVfG*X*Pq<hJ@2HV{rSWl8_vDhQ>b&1X`lE%T^{jkH~)NK`L}qP{Ez29_DkhCz^$Ty
zac*tt%^P~PW;<Uu@rJ!N=_|dy<hQ}}?45I;-3$LZZC8Ng^p_hpxq76knjb8AGD)-l
z?CdIcZ(c1~Ns)c0O!hzaj_>4AseJN!hHmFuubjO%t}XF=6;gH6#?yb2S8?Q-x4l}S
z+iUg}MaaE8pBQ}Z*t2W9Z&>bK5W=?e+CeMfHRa4Zb2j;;JAVE>)qd91Zpm&LX}^B?
z<FDAW+#egrzdn8J<D$*!akpPy{PL~)Y1-G+2}eVpfA<lqDSiFAXp8d7&%3YrZu2$k
zGz?GM*H``1t2}AvN270Vr%!G*jpWQv)4IO=T4vZxrJR}J$EH2oa3xW)_{d8?_h(nW
z-1e`Z`byvX<jTMA{?zWz_X@9KH{(yfDdSNOjPSYp52@%qEv|{_eB1noVHcBj!SYuO
F3;=^NO4$Ga

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/crumbled_hall.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/crumbled_hall.schem
new file mode 100644
index 0000000000000000000000000000000000000000..72925e658679814e5586e7659cdbcc3e1a8b4bd7
GIT binary patch
literal 893
zcmb2|=3sz;w>R(mUk(sC@Uhrj;D(7>R)xt$@qg@cf<nG36J~V$a>}YcF6B0Ri+SLG
zqyH@b+5R)#uem<`=FW}N{w_$r(7Un5-r(4+&BgieuNA+))|RvP^X+ekiWkODKeqAu
z#&b8F->>etBE8A*M!@vr;)yALk7VzR6<4pbz8$~%^k;=V9FHtK%O4-<KKEv&_|JvC
zcQQ}^p3}1L%cc`$|E^p)I??v+TPy#~wQ9F_f4rxbDdE1i#kBInHMjJ2y4JimZMK}_
zwt0Rv_4ShnE3SI2{e9tW*?%#)`ZIF>b!`4kvHhnUIqSNaO}6#TmEOhn-iA4gKjt`Z
z`)0MV{@!h!Pp@}FeeZoJM2d|e!oauIOzpSn(ux0-PkokL?0Jn_ICSw|3EvwFn!EOC
z9zL~biG9v4=L<X?KE1|2?GL-1J+bcev`_0i?G7Eyd)E8qvdFjCmj|Z4J^FF(zeBui
z=Xee;lUem_s{FSNvlc9kzo>C5bS~E~<$%2>x9U%OH|1c=*Y2#!h==bF9qKx`opXod
zwrcUPHP;p&4XK?rbK>ung{xZB{HOcNFP?n*O4a&H@d+>P?K@?(gGqGdE#<X&zb;Ib
zdaBYq`=$QrcS}~>vpdf#75mKcbs6ja9c=rH;&s+vH(#jt!?;zH`Rt8gZ@cwVwj`7s
z)DAki+W4^a_FXTXBR^EGeCGLcYo~|q@15nTAJ`I)K4>+y3SPfX|3_L)Z2Ycya<AP~
zKRYFUk6>@}{+m5N+Agnr)1mmrs*t}EUrl?rt4G`5z-jNFQ@0w;)T>|xdV%|#S>^PT
z`}HI{&C-J2p8su@_%mPajJ)vXlPC5ceVKM?S6xnP{qFwvyR^NJUer9hJom@E%U9!`
z?l>zDCfB-i*27hc{#mV7^Qq*Fn7QWF>W!yd7Z>eal(WSq_^A4Vke%=L^5}90#?4!1
z1&uPYsRNU4PjauGd&AzoBj$zEY_m<d*|USHg-?_T#IY34S+d)#s8jssHxth2b&A=I
z&ux_X_ns4fAH6Hz`dXynrJSRk`OV>l>V7V>g6#V)>qOh`wmqBodheN_%2!(*U#VYR
xUT3-g%5>&WPFb7kgxG*d)VH$WO4ibAUz2v-efR$0#lI8kdl+-l;$AT@007}fwO;@L

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/diamond_tower_temple.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/diamond_tower_temple.schem
new file mode 100644
index 0000000000000000000000000000000000000000..7e5eb6e4a4b5fa5c047f1cd8be046c571ac49599
GIT binary patch
literal 1149
zcmV-@1cLh?iwFP!000000PWq)Zrer>!10l&4~vSMLyEMg9(wU5Phh}E;3oY55+rDX
zxM@)cYjPzKrnmyRj+0aSR(*s%Ls9hHTiZ8qNy(`lH;%?JBY))oGhmq1Xl8d!jR={b
zL+L$^#&%+S5(N@IGO6|6J}@st<XR}*gB^ivO_Iz;xf%NP!n@24w(}&~85G_mdGW*0
zL`gQ<DBP|e-x`~AxUucLcavMi*i7w4;d7IW#{Slx@itH0Xk_D!p-Bt-V_Bye$R~%{
z<HSr{77w;l7wwdf_5*pWsclW+=cT=ys_J$Fd2-5GX;XIsd8$dhXI~Ba6zdfzSL86c
zcGxS*VIQvbDTdt&<oaQ9@A7C|?hOO^EKVk|b9u4ua+8hhz+_QkGd~!bs<>2B)*XMD
z%irPnYX@@kjoFLx!G`i6IZ|4?+P!jG-KRD$5|>pkgQj%u+ic{=vKGq91M5v}ya}YY
zb?@PDSXlqv{{H?SN4B4p+rJ&z{=VG)UCK0H+p4Op1=7D;rueT$_;FWyo7D@e+AZ?u
zF9HAn000000002Iqeev+wJ@&HP{m#3Fy&0O>jnUqP_r3m!djvTYc^Z$R<o(erO4NA
zmt$+UYZ_aXPZb6L004Xt>in3a@gDL40BS<R2Y}12v-FDH+4q&D*X=F6B7n=F+fntS
zuC8r$d*{(>l%2em)8kI(^=c=q-)z0Q^NNj?6W8zfdeyXk%9+;syE?uwCr}<pz25TQ
zCV{I@d1+p~VcL#VYnX0qi!N52KYDoS;|bA?|2soA<=9@&s)$oX)w;ZOA4mY+hx2IB
z=MmPJeJvI?!nfzq^m}!-(~a!{FE4+F0Im*gL#p>|P~XZmHDy6nZ6iNCWq*5={%v9L
z*bd_AToBI50i1>M+7;y|81;o|Td%S~*BYjOTUh?O0l*nGj(mSxn7Rk5&Y@42?&5`=
z?rniq4&VxE&MgXS&AQ;iI}@nGWcF_}>Izd8ZO<(V1Aq@*tEsx@PD|5z>kg~>ICseb
zfD5XB-U9#tEQjWDO8~$Hru=(ny_Y@$0G3a2H~d)`cd!S5%TD)MO{k6o09<Z#asU7T
z00000000000000000000000000000000000007`kda}Bix@hNK<`bXTqPnwpV?~<Z
z#BwuECb4sQv2HV;n=G<}JQ?~>TCwpaly>A&m$xOzZCs^lOM8@Co6Uc2ZKu2TV7E!9
zV{`lGDz#iQ>7IF6+_kCoRzm5=w(v=2eB!dcd}N}?PQ8u4%H8g?m_1{bV>PpT-<H+4
zY%&`AYF|fI_huUp%!_2QJGt|0KBJEGqjJ>omnQNqzx~gAZ$rY&-A}TeO%v^uF*l~J
zC@1{f-Yv_G=dnNiy+5-eE&p<A<<m)$*(f(dziytJBsJTq9i(NB^68l!nPX4C^W;^j
z&b(ChV}I!K$i`n(OI2=3@W@rOs{ZxSjoHLRK9{Dnx02Y8Wvwrrhr?lEs~HC6Q2siI
P`BnY}8a<B;VC?_^PWnRj

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/door_totem_ruins.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/door_totem_ruins.schem
new file mode 100644
index 0000000000000000000000000000000000000000..e6364d20c35331aa067140477d54865c928337f6
GIT binary patch
literal 954
zcmb2|=3sz;w>R(l-Eos>|9HKkJaKQM2WMB+mF9T`heQ<?x=h)!Qe?`CwN95;Me%;C
zus!rT@}{##->u!RRKEmO&A8`i{hKi~Kviv`IrpQVirh9m|BZPbUq7UB>A#}xmk7(r
z$0qFwSz6{NzjC|Mrg<lREmEBJc;m{FsMUAgnw|@*stB6>rR0W1>Z@ndW0o$HdTaje
zjOgxGt<QgjU(b<!Z`L~N#ouFBPxWwZuU<E2owv2r%N+ag)W!8*AFnz3NlWE#jQP98
zhpihQM%6l1$ejNB|IpmEmk(|Kmh{ue`0<%ryKZjYy2`C;#i}bWPVp9-%Em0a-lm(G
z`r1F@Ql3u#Kl8mG@Av$<@p^s9U5RMl>Gi%<=SxkCTHmN_DqJ%6)Rf?jU;5|oJMr0V
z_xxw}ub%#V{qv9h`TBXwe)Qinww*ia%@HGuFM`vPRc^n&WUrB1WtA)T^EE#sG(Z^~
zPA@uIn7dzN$@G4%*J4w|thO8Es%$l%{q6EJ(?4Fje9eO#u4{1J@-*Km{cg+F4SBkE
zV?Wk-w~5|2GtZB>m6I2Eh4Y2j46y~bo!l1O4&<{-nx-8&Z^EtW$-7%^Zxt-x`ZcB_
z-|^u7b@#RhoeXdKy@z-E-<=Kz-J{pl>m6zQz4q^R?S<bDZT<R>Ev)E{jrsNmpP#YM
z50nWAdfwmHV6V+&UKxJqRLPAyK$E`vE606h=3ZT~l$jxdk;{(Z0kcRE!wzMQ9}ETV
zU&3tRUV?dzSUPX#z8twJX129amXCY#gzitvIdQ9erp>7{7Mr)_eJgpI6}q%4V)h-?
zODCrUPrMWSbZ6CdnO8y9x)XVdqL*9!zBO%|n54&_OJ;Vu-;O)im;5dCkLs`6&~Y!v
zzN)(NqB!>^QIWYG=5yOhRM(ZNZO-1kIO=uQztZPRY%X`Fh5B)Q{ZU?DRO-~pV|3Rd
zSTjAxbb{{GWmS(#zUAhgS3CQrEAm*{()0VjFP6_X*1EH0t@`Zen<p!Oz1DO7n19^)
za({oemGeu#^?J=+EC1g%zgK1Do8sWPax1=E`Ce(UvG;yV{+EUF>t=la`}VKBvGk?F
z_i9o5BxZXp-+JoqysE`MEB(A|b!yx8@42L0`t*~!eH_o#+5D>E*Q|dP?7c4jdhgk)
z`e|SH-MAmG`~2EV{q@tnOb_>-CQ`dmA$pVA-Q>wToyyoQRZo20JMZ1H8~<<J|9xJz
S{*UH=rsY2-ZdLfezyJV;lGb$q

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_ruins_with_hidden_door.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/exit_ruins_with_hidden_door.schem
new file mode 100644
index 0000000000000000000000000000000000000000..7efbeabd8073248f69b67a17e3cdab2c572f1e41
GIT binary patch
literal 649
zcmb2|=3sz;w>SLrE<1=E|M+~z(q3k#j#b`bIlCUROuaEBjHz?gREH_{P8YApsfWq-
zn;5SsFzP!XdE-!%Y&b`m=j<}ZxdGa(AO3m-+B|-K-=pl$9F>XhHkYh$KP8^2b8?^7
z*6&r}d&MU%bqP}w-e@B)I@NFOslRE7zE|x-uI;^e>Sy~-t+{mplCRq*=ceDAn=7xq
zJ~xw%dG6eEFD^IVyVhNjw9~ft+p%SbtIYbI#)b75C9k<{5*EsQH#{`z#i{Sbr5W8J
zv$P`T%e~sOvSk0w(kHKK1NW9cZQZucAat{jd!EhJs|WZ~l_y?}eH*%LPuJ4w4V$Mw
z_xnBl@y8#pcYa)5_2=iEAEmbcluFMe$MUqrnI*l<y)KxZt&**M>8_S<)fJ!an%^4G
zP+~|BbWPk{A1fAn;nbqbPsAQCIuLqWr#s4b_Ch_AymgshML9fXJxp$K6}}~LXcg1t
zrd47`^UrySTsfuwd2aV%?@Lb6B@?oDB`EIIUX#=I{Lr2ACp|ALE%$pMYjJwkff$y0
z!5E(K+#mMOAHUA|QNR7b^Fx2ad9}Np<fGQEVLNlX{@RE2_oV(k(3h>-{NH#-P()76
zp+?Pj>@e3+K!3h8H9C5!XMdSi{12zyOXhWlFa4}C`Rf{q)MF9bS8C^nPJOjcw`l%}
zAYc$aS*F#0m3{kK@3&iBE}ic6E&X<4%CW95D)-FSc}`AK*i^IWZq=7tD!=@GUo2O@
s_<gDJX?E9V?VB!6maeXRw<SO8*yE4if7Pz6tDPi&_{enKxK|7e07-5vl>h($

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/eyes_of_tricksters.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/eyes_of_tricksters.schem
new file mode 100644
index 0000000000000000000000000000000000000000..a4f9a4fa98ede71bc08c85ee97a2e83a8d7a0864
GIT binary patch
literal 2780
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

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_a.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_a.schem
new file mode 100644
index 0000000000000000000000000000000000000000..a41aaa0d5266335a78b8f607db8552c216e42c04
GIT binary patch
literal 1682
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
LrXl+TiDSTDHAg)A

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_b.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/fake_tnt_trap_b.schem
new file mode 100644
index 0000000000000000000000000000000000000000..441ba619c5046e55964b116b649d2727767a7ee0
GIT binary patch
literal 1650
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
O?N_gf^J1$V0N^he)-4JE

literal 0
HcmV?d00001

diff --git a/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/floating_altar.schem b/src/main/resources/data/dimdoors/pockets/schematic/v2/ruins/floating_altar.schem
new file mode 100644
index 0000000000000000000000000000000000000000..23c796b469641e5ceb0327e4e6c44140737ea2d4
GIT binary patch
literal 1744
zcmV;>1~2&^iwFP!000000PUTNZre5#hMBO<MQM||Ns~5hdP(oC+s3)HNjd{tFF?Dk
zSb+}hHe)jwi?)R*k|EJZ`wV-Xy~<u-FOreE*t(InRNG1eeg<OMzj%0fcz8qwv7><L
z549#fKt!uSpu9&qCIr7jp8)`61x$KxK=9!}GjPp9b+T&{)4<g|ORMcyZGtq*uGCRY
zGa6-#Y*K6@y<R3}t7tb-3zuzTA+6CQ#Y04}rJIcgR?Bsy+xSn~#{vWkUCRb0O>9}H
zwoj!C5d7GcEUdcy9%>e@u#U<GeOWY2i!{r&rs87DJj7OcyJ(wj|E)vpoyYpxh2TZd
zU<)&kDk|2|m-1%O8-ru8sGGHY-%r;teMPLcV`v<LH~o6nZh3xfas3*D;HL}&Ep2cu
zp3WA!HLk&_UIv{eu0h9kcrKi`9E0pUW^fIHmtQp(oeY|W;Hs(}sHSPzyQYPV2CgEb
zreT9r>xgA3JqbYYwqO4{Ggd0a-1p;gy_Y@Cl&!@qwp+~Jm5eE{$(^xN5WMSJtTRKX
zfy<?>qGQhurfbkWb`815?Ur}onCyi5G6cI_n<m<??zIVZlr4W;K190iPn=^cK38`$
z4wJujAOwqvmC2@}0>Q8Slr1;SQq`@cj3X&=M>5%`vu<cpIXe%*M%1*eqrD3GLfh_{
zbPf-aTNWVrn6B`9*7|X4wO0(2i%KUO;#FlGf}Q>nlr@Xz=j~q0n%0K6KkM8%y$`{s
zlyjOQem7DSp`gG1b%PEj6upNTbDBT?2?!oV$KSHBZMQ9YpwmHBVsmgQ#l<x+svXXt
zE@r!O?QnDK2?Y1M23s1lSHYhNHdJqm;OCfI+RsDqefNA~X)V@wwP~9B6+{T4yRUGw
z<kY+-T*Io_-qUe%n#@A5)NQG1=)g48>K?nQQuRUKHQlX}F~@GD9iLMxVrEvd%@e;C
zJWH`Ux|jU8JwKNpWn3NnP1Sc0tR`3_rd4ZJbd7ZOn{$1awdB~|>9Y(4u7fGc&^^(%
zx)k0K2)ET6DN-O1;dSnmZ9=dTNKJ!O+6EmlT`67f&-8g~<E+Y5SKUPj^!UPvtO-@K
zk#*1s31@E>n$gfsExbXy3c+@?HdUJ#sg+JiqOMcJUTddz(2fp}&YCZ0xvzP~&F`}*
z?m_}f`f1FdzofUb-PY`IJ$#;V8^6if#uu{{u?=n!+sZa#{+#UexuNT(dx}bMGfV!&
zr`z{+Cgc8)UvVGzaxiIs$Nz=GIS78}UHP0)3JYH;TiV34&`+DE^nQ2pBerbKG}!Me
z#=*qT*l3U@C@Ns;9VSRc1VJ$U>Gd!5x{b+iM@L8h1z!K|-ZOVz|3USC0X6dmv*~Ad
z6f>`=iB2EN!X%h}!A8m62H>xMfJ7pZNOE9IB#uk5hX_UDDUo<uBu<FLNs%aGiaxkZ
z(?>Q@p^qV$m3{W=Q__=}yd997XwJ}w?DORG`HgWlZwE%gEQ2R0j3n8U5@lDS2d*3w
zJI7HmsKr!~IIBd&pxS9Tm(bJ~=R7r4OMai(ha!%UIJUxB0mAw8ZF3|kdMYn=-yrAm
zcHrbvC=@t~QYg>_qdyWgZ|x?jj^?cT1k(jq0!gB4^t_VT)M<F0K9ZUWTl#%+9a6ZW
zaGb&jIi|U>9S}n{FNrWO&=xK%3e=_SonFk|bSQjP(xv+?MsE47M4rQ%>sBFAEkvGU
zToQCUyUf34Us_g{18pPrMJ)w=io6w%Qxu^=k;`%$0V&26nV1~MC0dJx%R+U~u6SG-
ziq#P&-SNzC#qD@OwCWSr{ZhhFR^}sV6YOp<p_xxO>UOts)#X}Z6a*0(6vuD54Ti9H
z;n0W26`kgA%i~?)ht2ijm>pr#rR=JZcsOuwM4p4J`suiEa}ZsHQvX))MIoH}x0O2q
zjfN(a`gg-E2f(WD*?iJC??s-6%<(Q}U&TqS@B`p}-VThK<GB+I(DSx7leI)Gl==@+
zv>XJ39cNFD{k%&?&cnPN7%}oX$YCyT2ZoEBcS$OWc{?B(B#-iTKqC1Dc>H9ow9XTS
zp8*hldO-NO1K}qYgr9ZT5Q&>xPoHgzPS_ENyCU(qNc>JD<`F`PL?V$$Boc{4B9TZW
z5{X12kw_#Gi9{liNF)-8L?V&o%QQIae24vOgJ?v<Hv2^Q*c2FltAfSO|CqxDv5-;2
zRZFWA1)O4Er9TGFApH=1v0q^w6AZ?{Ox?6<Sbb^grp3Om6uvjvza(RSY{$OZgZ(+#
mZ7>c_f6`Ra1S>OO!u_UwcFxh!(cj)V74SdrM2fGXaR30;3tAcg

literal 0
HcmV?d00001