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 zcmV<23M2I&iwFP!000000PS2`Z`{TeJ~DNimDZAck>vQ6Sc-g;9bb~Ra4Vp-9Uv(h zIDmt=txzoJ<*b%5mt2seD*i8h?+@r7>uaCX;eANXF3(ykdnKLEwzNAu^PS6_Ih+~L zYyf-R?(&`~?6v`oA5Dh~!GAD+1%Tf)U@mDe;C0V-dD}NT;#nX(m$%;fcKcl`5T@-1 zyB)J_yL&s_48(TVbUHi2>u(2Lv(I+|;hXkeS8N}cg8PoQx5urWj_CyaA5zDb0gqH> z$@#w3w?h@X{8zzUOG*oWpKm8B_WNPCh5_4ox3YZ1zOC34cDZ7}17sK1^F=r8^SJ>x zEW2lUo*z8(eAC_IEz@n=+!d{k8Ad<~fdPNYiG^?X4{V>ex}NuL*A&8(;Vrrl(Qo&? z1MaJ#Fbuet^K`v_pZmMqHQzd={;5Y74R}`esMY1Bl@5pH9k_B7q`JgE@je=mFvuan z^3W)%Dg$pnj>uOAJk7iOvhVIWyybB7pFG&LB!P?$-}&vfG(C{tWSk<Ju;)Xpdj~vr z?~(zl+N2BQMP|THn2d~LJyJ?;8t}WJVcqW!3+j0Tp6A_t-sho`U5h*B`<=(d9B{n$ zyDa(Agh&H+7wKX&Hlw+?fl1lQEUKpLY#|$B69dP5yBo#ittW)n(_64&z|W&ql!OiA z-ddrk$h7QpH;`kXP7CR@>{RgP4r=5gi?jom5q)96n-NED1n*W2SXa%o5(S}6^74`a zPe!V!VK_qG%Le>@Xx_&;TS<M{+%uh!;fVpgYFd>uN{)x=_p+~HJd=-+0$otIqevy6 z!}^d%<8fioWZ-07v074HAPPAY&r&<ASNgDiX22guD&wIY)v;f!i()+JL!$TyU6r%@ z)YDOI*H7mK1D11|JzrLJM>bzG;Fc!ggy*-ryN;cg_!-m$isCkW0^KMLYJGhga8I2! z;LjS<qqK|?&y`=3yo)|Y3_FjKgo~P@d<#E?gg22>Te<IyFtyhWcu^m~ID>{qa2qug zLzvPreK6|kCg!XdG-bdaa-O!=>zlqQQ>ZXWd!EI2;%ge8E)+}|y*{Td-9klq$Q?Sf z=$-+;3@dn1T<YpwB%~{M(S>5QJ7>UkMWHKp_g$HIat)QsG?9z-XdaHVY`BeILT3xc zFAZ>x9HP-~3G)Wr#}&|YCH*yiJCUwV@7FE9qdXi^=D!)a#toQRbI7GsKHei#q^qbo zH@KvybMCs_CC&XD?g~6N%;R$~`xox+i7wo4!2Azfn3gF_1K68yUv)YG7k@oGJp8Zn z{crO7|CH~44?PD-^BoVZ4{zTKFC|5$qj6~t*z?e+uo>V#=Yc>V5C{Z<4pUgcb0kQD zA1r7f<)*QOFaxtlNvzzb1lC5Z*K=si=mIcLf+YCCg4hB;AP@)y0)cR3uwgBX$-gZ6 zU1*BMSg{w&uNFSCq6(&Vjk%dhp;)1cCOlPhm39_!sm4|<g#2e}DU^saK~}VYRkgE1 zK=L1~Dwg}q6ss%Y$tA*Tjl6qRbKE|ylIpzH*`ZpvFkir;+(c#FScO6fn__Aldfnhe zt#fLRa=4?;EKe7JMj;9nQI&|L16i@N7?Jdk&Y41%r7ASOD5hklLf$XGlo`dKV1#C9 z)a1$YLMO<SEBWVgs<CV~usm;c;mKNA_9Gq#jZ97x7Xw{v2!x43b6`U`#p4Uj@E2?5 zE%I}PBW)?qfQq1I;;^z{v&o7YGrdelSzy*zsAk^QOm$?mCHdT6P_(m>-ez{wNVuE% zg@MR4H4DGgFOlyMM)-W9qgfGUsYm+CH3+%OA%EFxg`=5|2pi^(+BvjXr5scX^>NIs zO1)+kuhm+uiCaYt3Z+qQ>Y^R8spgdRRrS{^Z#I>mWlJhCZ=&2u=0;VtOveWKJ9w-M zvs<_JArK}9+BK@CRavnW7k!oGUP+LpdzEsTW5qtKD6d{DvS-WPN=eVUW<;5(RT9OA z;s&u|Cd-!dxq_-YxwPt=E|fWz(gkxhjOsm_!E#vGN;as1nc++Mm-1GH<xwe`U)~hw zQEX%jdX}y~G;4ch@RYq2D==o+BL6I<O=+`An0ON@UXGU&X@siVl+?1Ntgmhh$#QL_ z6e%Ownxq4s^{!}E26))`md-r}%4gBdHKrf6Cm(tKW*fz7Qlz;JI`<Vh#jZqPs9@o{ zmXkmr5YkGzQZISo;-$+BY6X)!jl#IPx~i8fH>?e~5uevAb&kfE)X?0<_4ReV93Z_; z?&$S#BoGJ$!bd__l|$4^UWx8qpVc!qk<Qx%27oM{CWiRV_Nfb*SE_^xGt?jgi-Y z@frZhNFWdhgpURN2CIsd`khPy?RE&M1gqnyf@rVN+p;5gO&}2Jajjlt<~rPfo1fo= zFW}b9@moY748z6-R<eE*6=QSr15F_ijstPU{SsSo5jC7Z7zeN`_bqmN%#4!@^u7sw z=R!XnfZj==8PWH`(|Ynq8BQRaI&7^Yr|Z@#PH;;WRh;A|ocR3(`gt|{oeNz((YH7( zBO0glA-xU2twXjLHl|~rTm*s!^j4r@VEEVG;3^wqcd&*3<d;hHeMbLi;$&gKBc4^9 z)?FNWy>bU9%3umP71%sh_X#K|^vW&5Bw=l{`e0rWNj+QJs1Zz#Z`K%NHIfPA=E{lR z#Su;el6>4)soBM484kz{ub*5AY9|+gKo||9pP|$&-M8dAG^qeJ({&67l<4Pz?jBWB z1^33zcoQji?f$qK@z@?a;{&YVu|ETbKA=nweQPs3n_P9<T{@s790ADz<-@NY)(EEC z<wtdl=zaC$$roggv8Ra!?yx01pv3A%%8e1&r#<k`!=KF^C_0YlCoLu*j_7<u9>IqP zlt|4d;gs<B1fSFiCI^%cpVrlI0t#p9>C~~Gp@gr@z)6nrfD&18H#PvbTE4o5RJ^%~ zeu`rPYIrTsaYTAOLL8AJbBuAUJ)lg0ID$_l>3|Z2GgWa36ASEey!QBJ{J=lgQYV<c z$A1yI6~({%?<Bk=5FN)_!DEagQtlXm&+t?FJPu)^P=7#~qV|B2FsVR31Gu`1+$-GP zLRP2sb@VRo1UySgaU^_9)E-bKpaaS=fws%1ANV(NVR1GqF8&=~SjMv%$FmKpxCFv@ zfL;WC{mr-;PZcPR1OkC@f<X(*@qpq;AP@)y0)apv5C{YUfj}S-2m}IwKp+qZgb~4@ z`P}i^@4j_~Eo>e%WZTj_ocrE_OFi4=ZQtyOXKk<7H+@rh{sI_3dI7}mX}KW(&4#}X zSbViF`upOwz2}-v#B9LwPrm5}9qzyIJje15+_1Soa4{udF!R0Oy&!r`Ossx6SKsye zeeR<eFO9?)x35}u&+<G!c*b2J6|{NFw>zQ%)0QdBDOfa}1M_|Gk~>^*n1Y3l=eN1_ z!gD;oq<$k&e|aSL*T?QYj!`4DmJ7*HNGYq;?(#qsw1n@$n2W~$s0`~L%&-FSe=WY8 zF@&i*H3ieJ9ZyV4CfkB5Ia9~6UC}aKs}%^&ohg`k;qAL(ssV;D_Y9bQY4*%L9?y!{ zj*EG3%MSY74R|sC!~a#h82$V7Hr)7xHiUV+^oiq;+VCmku#n{C$^_VO1<t|D8`~0H ixVr$euR5K8i%{n9@bKUA_q6=?FZe&|QbDWv#{d9&sA6dV 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 zcmb`H={MVn0)~I3MaM;}9ZM8bYE)ZPV@-<NBGtrNq$&-ylwve7wIoDz+)|fGw5V8O zi=wtvVvov<+Q(QTBCXh$a2ph@oo42od;f&{etEt>=RB`wstoYotqM?2xUjR*>vgVl z`RJR?&tfHxV{cN;l_i9V52VJgUFGJCjB)#9Le)d(>@|YH=ch}D@`<JF?Fz%Ae^dnQ z86aA-I*fl8n`NALBBvp%cotrgdY}V_%N&$-RTfk_C3<LZJiaPki$*$28YLESqM>D7 zvSjbGB6+j>z9_<zp$J@oh~C>$*3QjZO};a@Nz9;sh@I%ue~pf9`c`7;oq8~Uu&m+S z1Q(0c39<2Ye*3{+4l`!5+DTMw6rS})*&+0D6KZ4Hl+Fp|g|8rAm-GgIjZ5JEaRnAg z80`RB9o)B?c+cARtTN?lbG7a7#$m#qB8mybqQZ^J6?oK;ipB#=U(=5xo~hLLFEtEO z#w`lD%XXpN-|<gGZ%P@84qASSOY{Jj^+)*%P%(CGD`VIAK6^PrV^&BuG${<a##&t- zQ<@&FN$AsO+#9uq1h&g+kqXQdbkEhzrNz|+2n2Yv%w+52I6n%zFx>ulJG$aM7@C1K zd1#|50=MEkZK`z%<4dPHl*Qi6trn0)YR3`p{kqJON$y&@%Lk|8Ov5}{i&nt}YX0Id zL!_HAwoD4?hTRyjE$n{^%czN*bQVr43FteBto1=MyID6j`^A`q#-L~6i_4%I6R?ze za9wAl_Vgp$;HCwg>Q^!hpV^k8_&toZewBDq2;L{Rm2lGQ9i=2I<c4Z@u88wxPohv? z+rC}*?OyDyYn|u_h^)|<I&6?z_fs${yJN(v;UvAo>|$QlleUORI~;E)#F&rI@Hn@| zYW2>m$ZWeIw6SR}=ESV9wtG%DG2JXP_YESA3FY}O98=8BSh{l#nD8I(735dl7GX>h zrJD(!Cq-wPGpqMte75Y-WZHn*MI0_}V!93+#Nq{%t4$vKXu?tzL>~niTVpTL<pW~g zNGce6tpxMu3n}7m#)T6BddymN(RnoGG8bPp0Y`#pm{$(WTh*_6oxr0V{!XFcGN1Jl z8gOQhZ*e?N^LF4_op7c{n_^4lP~)l<B&qQOtCp2k&0dy{o$NXuqy}jZ4WI9OleY9L z?5<b0|Gy9Ei{Bmj=a{9L6uVkn7m{Z|WmQlpY2IDeV%Ic#(LlM<^ke%D@8jchn=v%$ zWru|k>w<Mvi^G?;mh<>UD?$2a--R0Eac6;iIm*pTgVWH!zV5We{|SN^ud}5@8f`MY zwMa1H965A6>o-SG(X3{3gAP1G*RBN9GAxH)29e@$TXfHemfgLXnVG^Y{%^Rq;t>2% z)y_U<bL5>+h`hZEP28Y(r*s?LIiqddI6IUh_NT>*FZ|v4(~@MPhKpsVJV~yIH%dL9 zZu72P>OKY#>|!p)RTfKbo(jW0!Uec{7pkfuNC=U++plf|e5`|!JTQYOI?Sv=er}8C zIZ$<Kl1!t%=%QXX$$|_FQb}^T4<Zbb^D-Bqnw@Bub3XvTQ~ufDg?1l|zP*>tT-qLg zZj&zkGm@K3>12q(25VH*pf)5qMBmHG5CHld&}^Ct-a`*w8ebb2ma5>t0?G)xkpPcr z<EZ+{e`=Zf#>`U-3pXlp>o13}X9yT1>iIjvubav`0C20|?oe5fJ^QZfC(W?D#AfzY zPEM<J<sPK*dxk!}@q|k@1$8O>+0-#$T8qc(_wylkn{TmQWGS}xWd7Q=dV~4jPH5uz zxrzy8GVVV3zT)X@j}!@DH{HEz0bOcOi)9?!`IobYN*=tYd*JkdwdaE?HmMuoU$_Y3 zedI`!kXgUdQ_~5<JFkN4=SYtuVTw!lygP1L1M4+@E3^CBugw2|`zQG2dhEY_B)h_Z zFK*3cMuCY`Mbo!R6t`s!0PxXntW+sitXCq~f3ejm^otAJj5^zC>5-b(Wd#5~jDfq% z8-D&|lC(rAclQIQY+1zihVQ0@0l;&c4Mv>T!?*uC@c$3i_eh)#5)=J_`0%7#_Jkwe zT1}<&7c(hGkdW*vAh!<c&n_c>!9W6CUq2ciP8?j$_MYPIOj6$cc|sR9Zzs^h&L^T9 z)oI})Qvy20@e4aC#3$%K!*0&TcNB()rMahca@EUcqq}JRiJDKa*!AZ-OGP_d&?D)# 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 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 literal 0 HcmV?d00001