From 7260e086482fd449315b53aeda2a2a32b7419968 Mon Sep 17 00:00:00 2001 From: Runemoro Date: Wed, 17 Jan 2018 15:35:54 -0500 Subject: [PATCH] Many fixes --- .../java/org/dimdev/ddutils/nbt/NBTUtils.java | 24 +++++ .../dimdev/dimdoors/ddutils/GraphUtils.java | 4 +- .../dimdev/dimdoors/shared/CommonProxy.java | 6 +- .../dimdev/dimdoors/shared/EventHandler.java | 4 +- .../blocks/BlockDimensionalDoorGold.java | 3 +- .../shared/items/ItemRiftSignature.java | 2 +- .../dimdoors/shared/pockets/Pocket.java | 9 +- .../shared/pockets/PocketRegistry.java | 8 +- .../shared/pockets/PocketTemplate.java | 2 +- .../shared/rifts/RiftDestination.java | 8 +- .../dimdoors/shared/rifts/TileEntityRift.java | 58 +++++++----- .../AvailableLinkDestination.java | 7 +- .../destinations/LinkingDestination.java | 15 ++- .../PocketEntranceDestination.java | 19 +++- .../destinations/PublicPocketDestination.java | 6 +- .../shared/rifts/registry/LinkProperties.java | 7 -- .../rifts/registry/PlayerRiftPointer.java | 8 +- .../rifts/registry/PocketEntrancePointer.java | 10 +- .../shared/rifts/registry/RegistryVertex.java | 20 +++- .../dimdoors/shared/rifts/registry/Rift.java | 26 ++--- .../rifts/registry/RiftPlaceholder.java | 31 +++++- .../shared/rifts/registry/RiftRegistry.java | 89 +++++++++++++----- .../tileentities/TileEntityEntranceRift.java | 8 ++ .../shared/tools/SchematicConverter.java | 62 ++++++------ .../schematic/private/private_pocket_0.schem | Bin 673 -> 709 bytes .../schematic/private/private_pocket_1.schem | Bin 932 -> 973 bytes .../schematic/private/private_pocket_2.schem | Bin 1397 -> 1440 bytes .../schematic/private/private_pocket_3.schem | Bin 1952 -> 1999 bytes .../schematic/private/private_pocket_4.schem | Bin 3134 -> 3181 bytes .../schematic/private/private_pocket_5.schem | Bin 4564 -> 4611 bytes .../schematic/private/private_pocket_6.schem | Bin 6447 -> 6495 bytes .../schematic/private/private_pocket_7.schem | Bin 8762 -> 8813 bytes .../schematic/public/public_pocket_0.schem | Bin 663 -> 693 bytes .../schematic/public/public_pocket_1.schem | Bin 922 -> 959 bytes .../schematic/public/public_pocket_2.schem | Bin 1375 -> 1416 bytes .../schematic/public/public_pocket_3.schem | Bin 1932 -> 1977 bytes .../schematic/public/public_pocket_4.schem | Bin 3111 -> 3153 bytes .../schematic/public/public_pocket_5.schem | Bin 4543 -> 4586 bytes .../schematic/public/public_pocket_6.schem | Bin 6421 -> 6465 bytes .../schematic/public/public_pocket_7.schem | Bin 8735 -> 8780 bytes 40 files changed, 295 insertions(+), 141 deletions(-) diff --git a/src/main/java/org/dimdev/ddutils/nbt/NBTUtils.java b/src/main/java/org/dimdev/ddutils/nbt/NBTUtils.java index bda8c7cf..32907d3f 100644 --- a/src/main/java/org/dimdev/ddutils/nbt/NBTUtils.java +++ b/src/main/java/org/dimdev/ddutils/nbt/NBTUtils.java @@ -30,4 +30,28 @@ public final class NBTUtils { } return obj; } + + public static NBTTagCompound writeToNBTNormal(Object obj, NBTTagCompound nbt) { + try { + Class objClass = obj.getClass(); + Class nbtWriter = Class.forName(objClass.getPackage().getName() + "." + objClass.getSimpleName() + "NBTWriter"); + Method write = nbtWriter.getMethod("writeToNBT", objClass, NBTTagCompound.class); + write.invoke(null, obj, nbt); + return nbt; + } catch (ClassNotFoundException|NoSuchMethodException|IllegalAccessException|InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + public static T readFromNBTNormal(T obj, NBTTagCompound nbt) { + try { + Class objClass = obj.getClass(); + Class nbtWriter = Class.forName(objClass.getPackage().getName() + "." + objClass.getSimpleName() + "NBTWriter"); + Method read = nbtWriter.getMethod("readFromNBT", objClass, NBTTagCompound.class); + read.invoke(null, obj, nbt); + } catch (ClassNotFoundException|NoSuchMethodException|IllegalAccessException|InvocationTargetException e) { + throw new RuntimeException(e); + } + return obj; + } } diff --git a/src/main/java/org/dimdev/dimdoors/ddutils/GraphUtils.java b/src/main/java/org/dimdev/dimdoors/ddutils/GraphUtils.java index ff9e809f..b31efd5e 100644 --- a/src/main/java/org/dimdev/dimdoors/ddutils/GraphUtils.java +++ b/src/main/java/org/dimdev/dimdoors/ddutils/GraphUtils.java @@ -5,8 +5,8 @@ import org.jgrapht.Graph; public final class GraphUtils { public static void replaceVertex(Graph graph, V vertex, V replace) { graph.addVertex(replace); - for (E edge : graph.outgoingEdgesOf(vertex)) graph.addEdge(replace, graph.getEdgeTarget(edge), edge); - for (E edge : graph.incomingEdgesOf(vertex)) graph.addEdge(graph.getEdgeSource(edge), replace, edge); + for (E edge : graph.outgoingEdgesOf(vertex)) graph.addEdge(replace, graph.getEdgeTarget(edge)); + for (E edge : graph.incomingEdgesOf(vertex)) graph.addEdge(graph.getEdgeSource(edge), replace); graph.removeVertex(vertex); } diff --git a/src/main/java/org/dimdev/dimdoors/shared/CommonProxy.java b/src/main/java/org/dimdev/dimdoors/shared/CommonProxy.java index 7b2b41b6..f06defa3 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/CommonProxy.java +++ b/src/main/java/org/dimdev/dimdoors/shared/CommonProxy.java @@ -57,9 +57,9 @@ public abstract class CommonProxy { SchematicHandler.INSTANCE.loadSchematics(); } - public void registerTileEntities() { // TODO: new registry system - GameRegistry.registerTileEntity(TileEntityEntranceRift.class, "EntranceRift"); - GameRegistry.registerTileEntity(TileEntityFloatingRift.class, "FloatingRift"); + public void registerTileEntities() { + GameRegistry.registerTileEntity(TileEntityEntranceRift.class, "dimdoors:entrance_rift"); + GameRegistry.registerTileEntity(TileEntityFloatingRift.class, "dimdoors:floating_rift"); } public abstract boolean isClient(); diff --git a/src/main/java/org/dimdev/dimdoors/shared/EventHandler.java b/src/main/java/org/dimdev/dimdoors/shared/EventHandler.java index ad1d2ac2..c3df3a94 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/EventHandler.java +++ b/src/main/java/org/dimdev/dimdoors/shared/EventHandler.java @@ -42,9 +42,9 @@ public final class EventHandler { } @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onDimensionChange(PlayerEvent.PlayerChangedDimensionEvent event) { + public static void onDimensionChange(PlayerEvent.PlayerChangedDimensionEvent event) { // TODO: what about non-players (EntityTravelToDimensionEvent)? // TODO: PocketLib compatibility - if (ModDimensions.isDimDoorsPocketDimension(event.fromDim) && !ModDimensions.isDimDoorsPocketDimension(event.toDim)) { + if (!ModDimensions.isDimDoorsPocketDimension(event.fromDim) && ModDimensions.isDimDoorsPocketDimension(event.toDim)) { RiftRegistry.instance().setOverworldRift(event.player.getUniqueID(), null); } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoorGold.java b/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoorGold.java index 1df15342..b08c0460 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoorGold.java +++ b/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoorGold.java @@ -37,8 +37,7 @@ public class BlockDimensionalDoorGold extends BlockDimensionalDoor { public void setupRift(TileEntityEntranceRift rift) { rift.setProperties(LinkProperties.builder() .groups(new HashSet<>(Arrays.asList(0, 1))) - .linksRemaining(1) - .replaceDestination(UUID.randomUUID()).build()); + .linksRemaining(1).build()); rift.setDestination(AvailableLinkDestination.builder() .acceptedGroups(Collections.singleton(0)) .coordFactor(1) diff --git a/src/main/java/org/dimdev/dimdoors/shared/items/ItemRiftSignature.java b/src/main/java/org/dimdev/dimdoors/shared/items/ItemRiftSignature.java index 0b4214bc..1aae1cb0 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/items/ItemRiftSignature.java +++ b/src/main/java/org/dimdev/dimdoors/shared/items/ItemRiftSignature.java @@ -66,8 +66,8 @@ public class ItemRiftSignature extends Item { sourceWorld.setBlockState(target.getLocation().getPos(), ModBlocks.RIFT.getDefaultState()); TileEntityRift rift1 = (TileEntityRift) target.getLocation().getTileEntity(); rift1.setDestination(new GlobalDestination(new Location(world, pos))); - rift1.register(); rift1.setRotation(target.getYaw(), 0); + rift1.register(); } // Place a rift at the target point diff --git a/src/main/java/org/dimdev/dimdoors/shared/pockets/Pocket.java b/src/main/java/org/dimdev/dimdoors/shared/pockets/Pocket.java index e92e8c77..fc850e33 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/pockets/Pocket.java +++ b/src/main/java/org/dimdev/dimdoors/shared/pockets/Pocket.java @@ -76,17 +76,16 @@ import java.util.List; public void setup() { // Always call after creating a pocket except when building the pocket List rifts = getRifts(); - HashMap entranceIndexWeights = new HashMap<>(); + HashMap entranceWeights = new HashMap<>(); for (TileEntityRift rift : rifts) { // Find an entrance if (rift.getDestination() instanceof PocketEntranceDestination) { - entranceIndexWeights.put(rift, ((PocketEntranceDestination) rift.getDestination()).getWeight()); - rift.markDirty(); + entranceWeights.put(rift, ((PocketEntranceDestination) rift.getDestination()).getWeight()); } } - if (entranceIndexWeights.size() == 0) return; - TileEntityRift selectedEntrance = MathUtils.weightedRandom(entranceIndexWeights); + if (entranceWeights.size() == 0) return; + TileEntityRift selectedEntrance = MathUtils.weightedRandom(entranceWeights); // Replace entrances with appropriate destinations for (TileEntityRift rift : rifts) { diff --git a/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketRegistry.java b/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketRegistry.java index 62261cdc..6a7b2435 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketRegistry.java +++ b/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketRegistry.java @@ -32,7 +32,7 @@ PocketRegistry extends WorldSavedData { // TODO: unregister pocket entrances, pr @Saved @Getter /*package-private*/ int maxPocketSize; @Saved @Getter /*package-private*/ int privatePocketSize; @Saved @Getter /*package-private*/ int publicPocketSize; - @Saved /*package-private*/ BiMap privatePocketMap; // Player UUID -> Pocket ID, in pocket dim only TODO: move this out of pocketlib + @Saved /*package-private*/ BiMap privatePocketMap; // Player UUID -> Pocket ID, in pocket dim only TODO: move this out of pocketlib @Saved @Getter /*package-private*/ Map pockets; // TODO: remove getter? @Saved @Getter /*package-private*/ int nextID; @@ -158,17 +158,17 @@ PocketRegistry extends WorldSavedData { // TODO: unregister pocket entrances, pr // TODO: these should be per-map rather than per-world public int getPrivatePocketID(UUID playerUUID) { - Integer id = privatePocketMap.get(playerUUID); + Integer id = privatePocketMap.get(playerUUID.toString()); if (id == null) return -1; return id; } public UUID getPrivatePocketOwner(int id) { - return privatePocketMap.inverse().get(id); + return UUID.fromString(privatePocketMap.inverse().get(id)); } public void setPrivatePocketID(UUID playerUUID, int id) { - privatePocketMap.put(playerUUID, id); + privatePocketMap.put(playerUUID.toString(), id); markDirty(); } diff --git a/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketTemplate.java b/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketTemplate.java index a51d243a..bc289a44 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketTemplate.java +++ b/src/main/java/org/dimdev/dimdoors/shared/pockets/PocketTemplate.java @@ -48,7 +48,7 @@ public class PocketTemplate { DimDoors.log.info("Placing new pocket using schematic " + schematic.schematicName + " at x = " + xBase + ", z = " + zBase); WorldServer world = WorldUtils.getWorld(dim); - Schematic.place(schematic, world, xBase, 0, zBase); + Schematic.place(schematic, world, xBase, yBase, zBase); // Set pocket riftLocations pocket.riftLocations = new ArrayList<>(); diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/RiftDestination.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/RiftDestination.java index e940a39a..6a9b52d2 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/RiftDestination.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/RiftDestination.java @@ -49,16 +49,18 @@ public abstract class RiftDestination implements INBTStorable { public abstract boolean teleport(RotatedLocation rift, Entity entity); - public Location getFixedTarget(Location location) { + public Location getFixedTarget(Location location) { // TODO: this should only be available for local/global/relative destinations, maybe make a superclass for them return null; } public void register(Location location) { - RiftRegistry.instance().addLink(location, getFixedTarget(location)); + Location fixedTarget = getFixedTarget(location); + if (fixedTarget != null) RiftRegistry.instance().addLink(location, getFixedTarget(location)); } public void unregister(Location location) { - RiftRegistry.instance().removeLink(location, getFixedTarget(location)); + Location fixedTarget = getFixedTarget(location); + if (fixedTarget != null) RiftRegistry.instance().removeLink(location, fixedTarget); } public boolean keepAfterTargetGone(Location location, Location target) { diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java index 78865d6d..70c066fe 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java @@ -11,6 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.dimdev.annotatednbt.NBTSerializable; @@ -29,9 +30,9 @@ import javax.annotation.Nonnull; @NBTSerializable public abstract class TileEntityRift extends TileEntity implements ITickable { // TODO: implement ITeleportSource and ITeleportDestination - @Saved @Nonnull @Getter protected RiftDestination destination; + /*@Saved*/ @Nonnull @Getter protected RiftDestination destination; @Saved @Getter protected boolean relativeRotation; - @Saved @Getter protected float yaw; + @Saved @Getter public float yaw; @Saved @Getter protected float pitch; @Saved @Getter protected boolean alwaysDelete; // Delete the rift when an entrances rift is broken even if the state was changed or destinations link there. @Saved @Getter protected boolean forcedColor; @@ -57,9 +58,17 @@ import javax.annotation.Nonnull; } // NBT - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); } + @Override public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTUtils.readFromNBT(this, nbt); + destination = nbt.hasKey("destination") ? RiftDestination.readDestinationNBT(nbt.getCompoundTag("destination")) : null; + } - @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + nbt = super.writeToNBT(nbt); + if (destination != null) nbt.setTag("destination", destination.writeToNBT(new NBTTagCompound())); + return NBTUtils.writeToNBT(this, nbt); + } @Override public NBTTagCompound getUpdateTag() { @@ -108,10 +117,13 @@ import javax.annotation.Nonnull; } public void setDestination(RiftDestination destination) { - if (this.destination != null) { + if (this.destination != null && isRegistered()) { this.destination.unregister(new Location(world, pos)); } this.destination = destination; + if (destination != null) { + if (isRegistered()) destination.register(new Location(world, pos)); + } markDirty(); updateColor(); } @@ -136,14 +148,16 @@ import javax.annotation.Nonnull; // Registry TODO: merge most of these into one single updateRegistry() method public boolean isRegistered() { - return RiftRegistry.instance().isRiftAt(new Location(world, pos)); + // The DimensionManager.getWorld(0) != null check is to be able to run this without having to start minecraft + // (for GeneratePocketSchematics, for example) + return DimensionManager.getWorld(0) != null && RiftRegistry.instance().isRiftAt(new Location(world, pos)); } public void register() { if (isRegistered()) return; Location loc = new Location(world, pos); RiftRegistry.instance().addRift(loc); - destination.register(new Location(world, pos)); + if (destination != null) destination.register(new Location(world, pos)); updateProperties(); updateColor(); } @@ -167,7 +181,10 @@ import javax.annotation.Nonnull; } public void targetGone(Location loc) { - if (!destination.keepAfterTargetGone(new Location(world, pos), loc)) setDestination(null); + if (!destination.keepAfterTargetGone(new Location(world, pos), loc)) { + destination = null; + markDirty(); + } updateColor(); } @@ -187,14 +204,7 @@ import javax.annotation.Nonnull; // Attempt a teleport try { - if (destination.teleport(new RotatedLocation(new Location(world, pos), yaw, pitch), entity)) { - // Set last used rift for players (don't set for other entities to avoid filling the registry too much) - // TODO: it should maybe be set for some non-player entities too - if (!ModDimensions.isDimDoorsPocketDimension(WorldUtils.getDim(world)) && entity instanceof EntityPlayer) { - RiftRegistry.instance().setOverworldRift(entity.getUniqueID(), new Location(world, pos)); - } - return true; - } + return destination.teleport(new RotatedLocation(new Location(world, pos), yaw, pitch), entity); } catch (Exception e) { DimDoors.sendMessage(entity, "There was an exception while teleporting!"); DimDoors.log.error("Teleporting failed with the following exception: ", e); @@ -202,12 +212,12 @@ import javax.annotation.Nonnull; return false; } - public void teleportTo(Entity entity, float fromYaw, float fromPitch) { - if (relativeRotation) { - TeleportUtils.teleport(entity, new Location(world, pos), yaw + entity.rotationYaw - fromYaw, pitch + entity.rotationPitch - fromPitch); - } else { - TeleportUtils.teleport(entity, new Location(world, pos), yaw, pitch); - } + public void teleportTo(Entity entity, float fromYaw, float fromPitch) { // TODO + //if (relativeRotation) { + // TeleportUtils.teleport(entity, new Location(world, pos), yaw + entity.rotationYaw - fromYaw, pitch + entity.rotationPitch - fromPitch); + //} else { + TeleportUtils.teleport(entity, new Location(world, pos), yaw, pitch); + //} } public void teleportTo(Entity entity) { @@ -215,6 +225,7 @@ import javax.annotation.Nonnull; } public void updateColor() { + //DimDoors.log.info("Updating color of rift at " + new Location(world, pos)); if (forcedColor) return; if (!isRegistered()) { color = new RGBA(0, 0, 0, 1); @@ -222,7 +233,7 @@ import javax.annotation.Nonnull; color = new RGBA(0.7f, 0.7f, 0.7f, 1); } else { RGBA newColor = destination.getColor(new Location(world, pos)); - if (!color.equals(newColor)) { + if (color == null && newColor != null || !color.equals(newColor)) { color = newColor; markDirty(); } @@ -231,7 +242,6 @@ import javax.annotation.Nonnull; @Override public void markDirty() { - if (!forcedColor) updateColor(); super.markDirty(); } diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/AvailableLinkDestination.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/AvailableLinkDestination.java index 69c03975..0c8f3396 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/AvailableLinkDestination.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/AvailableLinkDestination.java @@ -29,7 +29,6 @@ import org.dimdev.dimdoors.shared.tileentities.TileEntityFloatingRift; import java.util.HashMap; import java.util.Map; import java.util.Set; -import java.util.UUID; @Getter @AllArgsConstructor @Builder(toBuilder = true) @ToString @NBTSerializable public class AvailableLinkDestination extends RiftDestination { @@ -40,7 +39,7 @@ import java.util.UUID; @Saved protected double negativeDepthFactor; @Saved protected Set acceptedGroups; // TODO: this should be immutable @Saved protected boolean noLink; - @Builder.Default @Saved protected boolean noLinkBack; + @Saved protected boolean noLinkBack; // TODO: better depth calculation public AvailableLinkDestination() {} @@ -135,7 +134,7 @@ import java.util.UUID; TileEntityRift thisRift = (TileEntityRift) location.getLocation().getTileEntity(); TileEntityFloatingRift riftEntity = (TileEntityFloatingRift) world.getTileEntity(pos); // TODO: Should the rift not be configured like the other link - riftEntity.setProperties(thisRift.getProperties().toBuilder().linksRemaining(1).id(UUID.randomUUID()).build()); + riftEntity.setProperties(thisRift.getProperties().toBuilder().linksRemaining(1).build()); if (!noLinkBack && !riftEntity.getProperties().oneWay) linkRifts(selectedLink, location.getLocation()); if (!noLink) linkRifts(location.getLocation(), selectedLink); @@ -149,7 +148,7 @@ import java.util.UUID; // Link the pocket back TileEntityRift thisRift = (TileEntityRift) location.getLocation().getTileEntity(); TileEntityRift riftEntity = (TileEntityRift) pocket.getEntrance().getTileEntity(); - LinkProperties newLink = thisRift.getProperties().toBuilder().linksRemaining(0).id(UUID.randomUUID()).build(); + LinkProperties newLink = thisRift.getProperties().toBuilder().linksRemaining(0).build(); pocket.linkPocketTo(new GlobalDestination(!noLinkBack && !riftEntity.getProperties().oneWay ? location.getLocation() : null), newLink); // TODO: linkId // Link the rift if necessary and teleport the entity diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/LinkingDestination.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/LinkingDestination.java index 8972e45b..5ba4b0d6 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/LinkingDestination.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/LinkingDestination.java @@ -11,16 +11,23 @@ public abstract class LinkingDestination extends RiftDestination { private RiftDestination wrappedDestination; - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); } - @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return nbt; } + @Override public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + wrappedDestination = nbt.hasKey("wrappedDestination") ? RiftDestination.readDestinationNBT(nbt.getCompoundTag("wrappedDestination")) : null; + } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + nbt = super.writeToNBT(nbt); + if (wrappedDestination != null) nbt.setTag("wrappedDestination", wrappedDestination.writeToNBT(new NBTTagCompound())); + return nbt; + } @Override public boolean teleport(RotatedLocation loc, Entity entity) { - if (wrappedDestination != null) wrappedDestination.teleport(loc, entity); + if (wrappedDestination != null) return wrappedDestination.teleport(loc, entity); Location linkTarget = makeLinkTarget(loc, entity); if (linkTarget != null) { - wrappedDestination = new GlobalDestination(); + wrappedDestination = new GlobalDestination(linkTarget); wrappedDestination.register(loc.getLocation()); wrappedDestination.teleport(loc, entity); diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PocketEntranceDestination.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PocketEntranceDestination.java index 7d443a3a..7c07a00c 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PocketEntranceDestination.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PocketEntranceDestination.java @@ -17,14 +17,23 @@ import org.dimdev.dimdoors.shared.rifts.RiftDestination; @Getter @AllArgsConstructor @Builder(toBuilder = true) @ToString @NBTSerializable public class PocketEntranceDestination extends RiftDestination { // TODO: not exactly a destination @Builder.Default @Saved protected float weight = 1; - @Saved protected RiftDestination ifDestination; - @Saved protected RiftDestination otherwiseDestination; - @Saved boolean hasBeenChosen; + /*@Saved*/ protected RiftDestination ifDestination; + /*@Saved*/ protected RiftDestination otherwiseDestination; public PocketEntranceDestination() {} - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); } - @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); } + @Override public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + ifDestination = nbt.hasKey("ifDestination") ? RiftDestination.readDestinationNBT(nbt.getCompoundTag("ifDestination")) : null; + otherwiseDestination = nbt.hasKey("otherwiseDestination") ? RiftDestination.readDestinationNBT(nbt.getCompoundTag("otherwiseDestination")) : null; + NBTUtils.readFromNBT(this, nbt); + } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + nbt = super.writeToNBT(nbt); + if (ifDestination != null) nbt.setTag("ifDestination", ifDestination.writeToNBT(new NBTTagCompound())); + if (otherwiseDestination != null) nbt.setTag("otherwiseDestination", otherwiseDestination.writeToNBT(new NBTTagCompound())); + return NBTUtils.writeToNBT(this, nbt); + } @Override public boolean teleport(RotatedLocation loc, Entity entity) { diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PublicPocketDestination.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PublicPocketDestination.java index b8c0fc9e..5eac818d 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PublicPocketDestination.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/destinations/PublicPocketDestination.java @@ -9,8 +9,9 @@ import org.dimdev.dimdoors.shared.VirtualLocation; import org.dimdev.dimdoors.shared.pockets.Pocket; import org.dimdev.dimdoors.shared.pockets.PocketGenerator; -@Getter @AllArgsConstructor @NoArgsConstructor @Builder(toBuilder = true) @ToString +@Getter @AllArgsConstructor @Builder(toBuilder = true) @ToString public class PublicPocketDestination extends LinkingDestination { + // public PublicPocketDestination() {} @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return nbt; } @@ -20,12 +21,11 @@ public class PublicPocketDestination extends LinkingDestination { VirtualLocation riftVirtualLocation = VirtualLocation.fromLocation(loc.getLocation()); VirtualLocation newVirtualLocation = null; if (riftVirtualLocation != null) { - int depth = Math.min(riftVirtualLocation.getDepth(), 1); + int depth = Math.max(riftVirtualLocation.getDepth(), 1); newVirtualLocation = riftVirtualLocation.toBuilder().depth(depth).build(); } Pocket pocket = PocketGenerator.generatePublicPocket(newVirtualLocation); pocket.setup(); - pocket.linkPocketTo(new GlobalDestination(loc.getLocation()), null); return pocket.getEntrance(); diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/LinkProperties.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/LinkProperties.java index 308f18d4..f505f348 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/LinkProperties.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/LinkProperties.java @@ -1,27 +1,20 @@ package org.dimdev.dimdoors.shared.rifts.registry; import lombok.*; -import lombok.experimental.Wither; import net.minecraft.nbt.NBTTagCompound; import org.dimdev.annotatednbt.NBTSerializable; import org.dimdev.annotatednbt.Saved; -import org.dimdev.ddutils.Location; import org.dimdev.ddutils.nbt.INBTStorable; import org.dimdev.ddutils.nbt.NBTUtils; import java.util.HashSet; import java.util.Set; -import java.util.UUID; @NBTSerializable @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode @Builder(toBuilder = true) @ToString public class LinkProperties implements INBTStorable { - @Wither public Location rift; - - @Saved @Builder.Default public UUID id = UUID.randomUUID(); @Saved @Builder.Default public float floatingWeight = 1; @Saved @Builder.Default public float entranceWeight = 1; @Saved @Builder.Default public Set groups = new HashSet<>(); - @Saved public UUID replaceDestination; @Saved @Builder.Default public int linksRemaining = 1; @Saved @Builder.Default public boolean oneWay = false; diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PlayerRiftPointer.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PlayerRiftPointer.java index 5ba480c4..1d6b424e 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PlayerRiftPointer.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PlayerRiftPointer.java @@ -2,12 +2,18 @@ package org.dimdev.dimdoors.shared.rifts.registry; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import lombok.ToString; +import net.minecraft.nbt.NBTTagCompound; import org.dimdev.annotatednbt.NBTSerializable; import org.dimdev.annotatednbt.Saved; +import org.dimdev.ddutils.nbt.NBTUtils; import java.util.UUID; -@AllArgsConstructor @NoArgsConstructor +@AllArgsConstructor @NoArgsConstructor @ToString @NBTSerializable public class PlayerRiftPointer extends RegistryVertex { @Saved public UUID player; + + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PocketEntrancePointer.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PocketEntrancePointer.java index 3eac9759..979fad6d 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PocketEntrancePointer.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/PocketEntrancePointer.java @@ -2,11 +2,17 @@ package org.dimdev.dimdoors.shared.rifts.registry; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import lombok.ToString; +import net.minecraft.nbt.NBTTagCompound; import org.dimdev.annotatednbt.NBTSerializable; import org.dimdev.annotatednbt.Saved; +import org.dimdev.ddutils.nbt.NBTUtils; -@AllArgsConstructor @NoArgsConstructor @NBTSerializable -public class PocketEntrancePointer extends RegistryVertex { // TODO: PocketRiftPointer superclass? +@AllArgsConstructor @NoArgsConstructor @ToString +@NBTSerializable public class PocketEntrancePointer extends RegistryVertex { // TODO: PocketRiftPointer superclass? @Saved public int pocketDim; @Saved public int pocketId; + + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RegistryVertex.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RegistryVertex.java index f2f823f5..e2f3a1f5 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RegistryVertex.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RegistryVertex.java @@ -1,26 +1,40 @@ package org.dimdev.dimdoors.shared.rifts.registry; +import lombok.ToString; +import net.minecraft.nbt.NBTTagCompound; +import org.dimdev.annotatednbt.NBTSerializable; import org.dimdev.annotatednbt.Saved; +import org.dimdev.ddutils.nbt.INBTStorable; +import org.dimdev.ddutils.nbt.NBTUtils; +import org.dimdev.dimdoors.DimDoors; import java.util.UUID; -public abstract class RegistryVertex { +@ToString +@NBTSerializable public abstract class RegistryVertex implements INBTStorable { public int dim; // The dimension to store this object in. Links are stored in both registries. @Saved public UUID id = UUID.randomUUID(); // Used to create pointers to registry vertices. Should not be used for anything other than saving. public void sourceGone(RegistryVertex source) { + DimDoors.log.info("Notified vertex " + this + " that source " + source + " is gone"); RiftRegistry.instance().markSubregistryDirty(dim); } public void targetGone(RegistryVertex target) { + DimDoors.log.info("Notified vertex " + this + " that target " + target + " is gone"); RiftRegistry.instance().markSubregistryDirty(dim); } - public void sourceAdded(RegistryVertex to) { + public void sourceAdded(RegistryVertex source) { + DimDoors.log.info("Notified vertex " + this + " that source " + source + " was added"); RiftRegistry.instance().markSubregistryDirty(dim); } - public void targetAdded(RegistryVertex to) { + public void targetAdded(RegistryVertex target) { + DimDoors.log.info("Notified vertex " + this + " that target " + target + " was added"); RiftRegistry.instance().markSubregistryDirty(dim); } + + @Override public void readFromNBT(NBTTagCompound nbt) { NBTUtils.readFromNBT(this, nbt); } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { return NBTUtils.writeToNBT(this, nbt); } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/Rift.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/Rift.java index a18227b7..0aa7c947 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/Rift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/Rift.java @@ -2,12 +2,16 @@ package org.dimdev.dimdoors.shared.rifts.registry; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import lombok.ToString; +import net.minecraft.nbt.NBTTagCompound; import org.dimdev.annotatednbt.NBTSerializable; import org.dimdev.annotatednbt.Saved; import org.dimdev.ddutils.Location; +import org.dimdev.ddutils.nbt.NBTUtils; +import org.dimdev.dimdoors.DimDoors; import org.dimdev.dimdoors.shared.rifts.TileEntityRift; -@NoArgsConstructor @AllArgsConstructor +@NoArgsConstructor @AllArgsConstructor @ToString @NBTSerializable public class Rift extends RegistryVertex { public @Saved Location location; public @Saved boolean isFloating; @@ -25,7 +29,6 @@ import org.dimdev.dimdoors.shared.rifts.TileEntityRift; if (source instanceof Rift) { riftTileEntity.sourceGone(((Rift) source).location); } - riftTileEntity.updateColor(); } @Override @@ -38,20 +41,19 @@ import org.dimdev.dimdoors.shared.rifts.TileEntityRift; riftTileEntity.updateColor(); } - @Override - public void sourceAdded(RegistryVertex source) { - super.sourceAdded(source); + public void targetChanged(RegistryVertex target) { + DimDoors.log.info("Rift " + this + " notified of target " + target + " having changed. Updating color."); ((TileEntityRift) location.getTileEntity()).updateColor(); } - @Override - public void targetAdded(RegistryVertex target) { - super.targetAdded(target); - ((TileEntityRift) location.getTileEntity()).updateColor(); - } - - public void markDirty() { + public void markDirty() { // TODO: better name RiftRegistry.instance().markSubregistryDirty(dim); ((TileEntityRift) location.getTileEntity()).updateColor(); + for (Location location : RiftRegistry.instance().getSources(location)) { + RiftRegistry.instance().getRift(location).targetChanged(this); + } } + + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTUtils.readFromNBT(this, nbt); } + @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt = super.writeToNBT(nbt); return NBTUtils.writeToNBT(this, nbt); } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftPlaceholder.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftPlaceholder.java index 89c3b307..25a263e0 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftPlaceholder.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftPlaceholder.java @@ -1,3 +1,32 @@ package org.dimdev.dimdoors.shared.rifts.registry; -public class RiftPlaceholder extends Rift {} // TODO: don't extend rift +import lombok.ToString; +import net.minecraft.nbt.NBTTagCompound; +import org.dimdev.annotatednbt.NBTSerializable; +import org.dimdev.dimdoors.DimDoors; + +@ToString +@NBTSerializable public class RiftPlaceholder extends Rift { // TODO: don't extend rift + + @Override public void sourceGone(RegistryVertex source) {} + + @Override public void targetGone(RegistryVertex target) {} + + @Override public void sourceAdded(RegistryVertex source) {} + + @Override public void targetAdded(RegistryVertex target) {} + + @Override public void targetChanged(RegistryVertex target) {} + + @Override + public void readFromNBT(NBTTagCompound nbt) { + DimDoors.log.warn("Reading a rift placeholder from NBT!"); + super.readFromNBT(nbt); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + DimDoors.log.warn("Writing a rift placeholder from NBT!"); + return super.writeToNBT(nbt); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftRegistry.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftRegistry.java index 9e53eb1e..3800fbc8 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftRegistry.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/registry/RiftRegistry.java @@ -8,7 +8,6 @@ import net.minecraft.world.storage.WorldSavedData; import net.minecraftforge.common.DimensionManager; import org.dimdev.ddutils.Location; import org.dimdev.ddutils.WorldUtils; -import org.dimdev.ddutils.nbt.NBTUtils; import org.dimdev.dimdoors.DimDoors; import org.dimdev.dimdoors.ddutils.GraphUtils; import org.dimdev.dimdoors.shared.pockets.Pocket; @@ -59,7 +58,8 @@ public class RiftRegistry extends WorldSavedData { // Read rifts in this dimension NBTTagList riftsNBT = (NBTTagList) nbt.getTag("rifts"); for (NBTBase riftNBT : riftsNBT) { - Rift rift = NBTUtils.readFromNBT(new Rift(), (NBTTagCompound) riftNBT); + Rift rift = new Rift(); + rift.readFromNBT((NBTTagCompound) riftNBT); rift.dim = dim; graph.addVertex(rift); uuidMap.put(rift.id, rift); @@ -68,7 +68,8 @@ public class RiftRegistry extends WorldSavedData { NBTTagList pocketsNBT = (NBTTagList) nbt.getTag("pockets"); for (NBTBase pocketNBT : pocketsNBT) { - PocketEntrancePointer pocket = NBTUtils.readFromNBT(new PocketEntrancePointer(), (NBTTagCompound) pocketNBT); + PocketEntrancePointer pocket = new PocketEntrancePointer(); + pocket.readFromNBT((NBTTagCompound) pocketNBT); pocket.dim = dim; graph.addVertex(pocket); uuidMap.put(pocket.id, pocket); @@ -96,7 +97,7 @@ public class RiftRegistry extends WorldSavedData { NBTTagList pocketsNBT = new NBTTagList(); for (RegistryVertex vertex : graph.vertexSet()) { if (vertex.dim == dim) { - NBTTagCompound vertexNBT = NBTUtils.writeToNBT(vertex, new NBTTagCompound()); + NBTTagCompound vertexNBT = vertex.writeToNBT(new NBTTagCompound()); if (vertex instanceof Rift) { riftsNBT.appendTag(vertexNBT); } else if (vertex instanceof PocketEntrancePointer) { @@ -118,11 +119,10 @@ public class RiftRegistry extends WorldSavedData { NBTTagCompound linkNBT = new NBTTagCompound(); linkNBT.setUniqueId("from", from.id); linkNBT.setUniqueId("to", to.id); - NBTUtils.writeToNBT(edge, linkNBT); // Write in both registries, we might want to notify when there's a missing world later linksNBT.appendTag(linkNBT); } } - nbt.setTag("links", riftsNBT); + nbt.setTag("links", linksNBT); return nbt; } @@ -227,7 +227,8 @@ public class RiftRegistry extends WorldSavedData { // public boolean isRiftAt(Location location) { - return locationMap.get(location) != null; + Rift possibleRift = locationMap.get(location); + return possibleRift != null && !(possibleRift instanceof RiftPlaceholder); } public Rift getRift(Location location) { @@ -236,11 +237,27 @@ public class RiftRegistry extends WorldSavedData { return rift; } + private Rift getRiftOrPlaceholder(Location location) { + Rift rift = locationMap.get(location); + if (rift == null) { + DimDoors.log.info("Creating a rift placeholder at " + location); + rift = new RiftPlaceholder(); + rift.dim = location.getDim(); + rift.location = location; + locationMap.put(location, rift); + uuidMap.put(rift.id, rift); + graph.addVertex(rift); + markSubregistryDirty(rift.dim); + } + return rift; + } + public void addRift(Location location) { DimDoors.log.info("Adding rift at " + location); - RegistryVertex currentRift = getRift(location); + RegistryVertex currentRift = locationMap.get(location); Rift rift; if (currentRift instanceof RiftPlaceholder) { + DimDoors.log.info("Converting a rift placeholder at " + location + " into a rift"); rift = new Rift(location); rift.dim = location.getDim(); rift.id = currentRift.id; @@ -262,18 +279,37 @@ public class RiftRegistry extends WorldSavedData { Rift rift = getRift(location); - // Notify the adjacent vertices of the change - for (DefaultEdge edge : graph.incomingEdgesOf(rift)) graph.getEdgeSource(edge).targetGone(rift); - for (DefaultEdge edge : graph.outgoingEdgesOf(rift)) graph.getEdgeTarget(edge).sourceGone(rift); + Set incomingEdges = graph.incomingEdgesOf(rift); + Set outgoingEdges = graph.outgoingEdgesOf(rift); graph.removeVertex(rift); locationMap.remove(location); uuidMap.remove(rift.id); - rift.markDirty(); + markSubregistryDirty(rift.dim); + + // Notify the adjacent vertices of the change + for (DefaultEdge edge : incomingEdges) graph.getEdgeSource(edge).targetGone(rift); + for (DefaultEdge edge : outgoingEdges) graph.getEdgeTarget(edge).sourceGone(rift); } private void addEdge(RegistryVertex from, RegistryVertex to) { graph.addEdge(from, to); + if (from instanceof PlayerRiftPointer) { + markDirty(); + } else if (from instanceof Rift) { + ((Rift) from).markDirty(); + } else { + markSubregistryDirty(from.dim); + } + if (to instanceof Rift) { + ((Rift) to).markDirty(); + } else { + markSubregistryDirty(to.dim); + } + } + + private void removeEdge(RegistryVertex from, RegistryVertex to) { + graph.removeEdge(from, to); if (from instanceof PlayerRiftPointer) { markDirty(); } else { @@ -284,15 +320,17 @@ public class RiftRegistry extends WorldSavedData { public void addLink(Location locationFrom, Location locationTo) { DimDoors.log.info("Adding link " + locationFrom + " -> " + locationTo); - Rift from = getRift(locationFrom); - Rift to = getRift(locationTo); + Rift from = getRiftOrPlaceholder(locationFrom); + Rift to = getRiftOrPlaceholder(locationTo); addEdge(from, to); // Notify the linked vertices of the change - from.targetAdded(to); - to.sourceAdded(from); + if (!(from instanceof RiftPlaceholder) && !(to instanceof RiftPlaceholder)) { + from.targetAdded(to); + to.sourceAdded(from); + } } public void removeLink(Location locationFrom, Location locationTo) { @@ -301,7 +339,7 @@ public class RiftRegistry extends WorldSavedData { Rift from = getRift(locationFrom); Rift to = getRift(locationTo); - addEdge(from, to); + removeEdge(from, to); // Notify the linked vertices of the change from.targetGone(to); @@ -356,15 +394,18 @@ public class RiftRegistry extends WorldSavedData { private void setPlayerRiftPointer(UUID playerUUID, Location rift, Map map) { PlayerRiftPointer pointer = map.get(playerUUID); - if (pointer == null) { + if (pointer != null) { + graph.removeVertex(pointer); + map.remove(playerUUID); + uuidMap.remove(pointer.id); + } + if (rift != null) { pointer = new PlayerRiftPointer(playerUUID); graph.addVertex(pointer); map.put(playerUUID, pointer); uuidMap.put(pointer.id, pointer); - } else { - graph.removeAllEdges(graph.outgoingEdgesOf(pointer)); + addEdge(pointer, getRift(rift)); } - addEdge(pointer, getRift(rift)); } public void setLastPrivatePocketEntrance(UUID playerUUID, Location rift) { @@ -375,7 +416,7 @@ public class RiftRegistry extends WorldSavedData { public Location getPrivatePocketExit(UUID playerUUID) { PlayerRiftPointer entrancePointer = lastPrivatePocketExits.get(playerUUID); Rift entrance = (Rift) GraphUtils.followPointer(graph, entrancePointer); - return entrance.location; + return entrance != null ? entrance.location : null; } public void setLastPrivatePocketExit(UUID playerUUID, Location rift) { @@ -399,7 +440,7 @@ public class RiftRegistry extends WorldSavedData { } public Set getTargets(Location location) { - return graph.outgoingEdgesOf(locationMap.get(location)).stream() + return graph.outgoingEdgesOf(getRift(location)).stream() .map(graph::getEdgeTarget) .map(Rift.class::cast) .map(rift -> rift.location) @@ -407,7 +448,7 @@ public class RiftRegistry extends WorldSavedData { } public Set getSources(Location location) { - return graph.incomingEdgesOf(locationMap.get(location)).stream() + return graph.incomingEdgesOf(getRift(location)).stream() .map(graph::getEdgeTarget) .map(Rift.class::cast) .map(rift -> rift.location) diff --git a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java index b046c32a..e0b07e2f 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java @@ -65,6 +65,14 @@ import java.util.Random; return status; } + @Override + public void teleportTo(Entity entity, float fromYaw, float fromPitch) { + if (relativeRotation) { + TeleportUtils.teleport(entity, new Location(world, pos.offset(orientation, tpOffset)), orientation.getHorizontalAngle() + entity.rotationYaw - fromYaw, entity.rotationPitch - fromPitch); + } else { + TeleportUtils.teleport(entity, new Location(world, pos.offset(orientation, tpOffset)), orientation.getHorizontalAngle(), 0); + } + } @Override public void teleportTo(Entity entity) { TeleportUtils.teleport(entity, new Location(world, pos.offset(orientation, tpOffset)), orientation.getHorizontalAngle(), 0); diff --git a/src/main/java/org/dimdev/dimdoors/shared/tools/SchematicConverter.java b/src/main/java/org/dimdev/dimdoors/shared/tools/SchematicConverter.java index 63511112..d0d20b11 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/tools/SchematicConverter.java +++ b/src/main/java/org/dimdev/dimdoors/shared/tools/SchematicConverter.java @@ -4,7 +4,10 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.*; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; import net.minecraftforge.fml.common.registry.ForgeRegistries; import org.dimdev.ddutils.schem.Schematic; import org.dimdev.dimdoors.DimDoors; @@ -33,7 +36,7 @@ public final class SchematicConverter { Schematic schematic = new Schematic(); schematic.version = 1; //already the default value - schematic.author = "DimDoors"; // TODO: didn't the old schematics have an author? + schematic.author = "DimDoors"; // Old schematics didn't have an author schematic.schematicName = name.equals("") ? "Unknown" : name; schematic.creationDate = System.currentTimeMillis(); schematic.requiredMods = new String[]{DimDoors.MODID}; @@ -128,46 +131,49 @@ public final class SchematicConverter { NBTTagList tileEntitiesNBT = (NBTTagList) nbt.getTag("TileEntities"); for (int i = 0; i < tileEntitiesNBT.tagCount(); i++) { NBTTagCompound tileEntityNBT = tileEntitiesNBT.getCompoundTagAt(i); - int x = tileEntityNBT.getInteger("x"); - int y = tileEntityNBT.getInteger("y"); - int z = tileEntityNBT.getInteger("z"); switch (tileEntityNBT.getString("id")) { case "TileEntityDimDoor": - tileEntityNBT = new NBTTagCompound(); - tileEntityNBT.setString("id", "EntranceRift"); - tileEntityNBT.setInteger("x", x); - tileEntityNBT.setInteger("y", y); - tileEntityNBT.setInteger("z", z); - // TODO - break; case "TileEntityRift": - tileEntityNBT = new NBTTagCompound(); - tileEntityNBT.setString("id", "FloatingRift"); - tileEntityNBT.setInteger("x", x); - tileEntityNBT.setInteger("y", y); - tileEntityNBT.setInteger("z", z); - // TODO - break; + continue; case "Sign": - DimDoors.log.info("Sign: " - + tileEntityNBT.getString("Text1") + "|" - + tileEntityNBT.getString("Text2") + "|" - + tileEntityNBT.getString("Text3") + "|" - + tileEntityNBT.getString("Text4")); - tileEntityNBT.setString("Text1", "{\"text\":\"" + tileEntityNBT.getString("Text1") + "\"}"); - tileEntityNBT.setString("Text2", "{\"text\":\"" + tileEntityNBT.getString("Text2") + "\"}"); - tileEntityNBT.setString("Text3", "{\"text\":\"" + tileEntityNBT.getString("Text3") + "\"}"); - tileEntityNBT.setString("Text4", "{\"text\":\"" + tileEntityNBT.getString("Text4") + "\"}"); + tileEntityNBT.setString("Text1", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text1")))); + tileEntityNBT.setString("Text2", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text2")))); + tileEntityNBT.setString("Text3", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text3")))); + tileEntityNBT.setString("Text4", ITextComponent.Serializer.componentToJson(new TextComponentString(tileEntityNBT.getString("Text4")))); break; case "Chest": + // TODO break; default: - DimDoors.log.info("TileEntity found: " + tileEntityNBT.getString("id")); break; } + tileEntityNBT.setString("id", translateId(tileEntityNBT.getString("id")).toString()); schematic.tileEntities.add(tileEntityNBT); } + // TODO: entities (and replace end portal frame with monoliths) + return schematic; } + + private static ResourceLocation translateId(String id) { // TODO + switch (id) { + case "Sign": + return TileEntity.getKey(TileEntitySign.class); + case "Music": + return TileEntity.getKey(TileEntityNote.class); + case "Trap": + return TileEntity.getKey(TileEntityDispenser.class); + case "Comparator": + return TileEntity.getKey(TileEntityComparator.class); + case "Hopper": + return TileEntity.getKey(TileEntityHopper.class); + case "Furnace": + return TileEntity.getKey(TileEntityFurnace.class); + case "Chest": + return TileEntity.getKey(TileEntityChest.class); + default: + throw new RuntimeException("Tile entity ID " + id + " not supported by conversion code"); + } + } } diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_0.schem b/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_0.schem index add27f2939bf0a1409cfa4464bff2fbfdb1f81bb..f4beee2ef19cea65f1aa19a4db4048cdab2acf7f 100644 GIT binary patch literal 709 zcmV;$0y_O4iwFP!000000PR;zZ__{!9mkI2I{iR=-H^C&LxOXqDryN|QcEjS=%GT< z)*i=8H@oicx@pRV1HXqq!5@Kt!I9axX#+w+s2oC@k)mW~-;CdzjV!$wz=wE;3A7fs z*a-jxF|^JKK0L_yAX7@4)tnt@p6=UGiEB)z9Hs3sVNqlDj=DS_9-d>5DyHpek8+fT zE6GI99qboOZ1rC=rW6h zWd5_8Um^%zu>r!3QuAY~_ezx>qU}8<3gHXn{ldaZ3l=s6)v1vIEIsnBTQsKQ|4ios zXMyBp(z(FDo$ODi?#&DTCY>39!BrRdQ#uzo7dYbrXCR#moCT7XNw2xUD;EuD?(xid zH!^IyT;Nk_x#ei$+IzN@c8-+U+U)ruM0jFRW^c;Q_wj2FVrZsHDBT2~%$}<>q1o4n zvi=<$hzifjOq2!de553VxE{2Lx$S(dM}^R?i-|LLld4A!P_Psep4)A?p^+VWF|;!@ zmdi1-7?yb6y~xQqI@b!fesPX?!Y$DVhhy{TcubHh6NI#yTsYE0+qu#yW>1_pYVt>H zSUcp%mfLx5&^m4&#Lj-crWI9&4n1e}TOKSjF=QjtMKb*8>La%S`aX3IJ%q5VOz~27 zKAnDh{`vNY2pT+tyXW3}!lS22G%c>=HZAI9ESf@9B1>pZsOkB4QlSj4=VZ`#m@&JB zR#m^CYl%y(O4RN)o3K2YxK|rziUkP!ge{Ffo=YEs?o6YgNynI|`tL&xM^1V}BdLZOEW zrCWO(FLid^-Eq^D3kSY{FW?Ihp9Fuwk=d9uX@!JPIfOQQiRR_a_`My;(sKylLAWC_ zB*HCm3IMeb8ovM!9>lUAYi;aWA`Xp=_Gy^ox=@isMO~2*8jRm^SH**e=iK8$7&_~6 zjmk=`MAmhG?5842){8tx<63GStp2HmX`Tm5eW@@qBB3=Q9mb;X|6bWdQI$!JH)z~6 zC$I|sCaNB#upC0Lg(PA@VgVLAcw9(s+S0KN920`^>;U{H1*NQ`+0lpcojTDy%xX|; z3qocdeE#(HAb{FS(MPzQ8+pQbH`mb-Qui@S@SmgXr3A|jSlGxI=SBgr^r&*vPIdbH zpXJ=(EQq{HIXC#XlfCKEy?No^lrv+ncHIqLDCY*}24~#h43u+&vmo*+lnQP4${;q%j!kV` zejPC#;6s3?gercWw|)RM?mSD%t8l$Wzo;%JwE_T~Ny6b_g!+`^qp0TWLpc~I{eUF4&|W8(6dpvZ7m#|xwi2h~hO z*pUfss||zVh#%(-#h|>Lfb#7mu}J03a;im(<^(&syfDT>mtIU&h%|hQx7ScDPj^+7zwXl>h#Z<-&{KAI*4KmiVM|_IzeJ7r` z;>tAx9w1;|@3>Qb@G1L{CJprPa|t#!wtET4-c}aq=r?OKv76BOzI2zbwSMZk`x@G7 zpBOFbj$0d?Tf-in`1;ujM-O4U&1)vfci*jlb^oQ3)N!lpX+Dh)kDTwx++%QN)xY|Z z8R37@qMo>_mDLyXE4qGlJa4gecl}lOR+F{r>H8#KWtBN>?~XZQGkIn0Iyq@E_vVge zoYTWraiax`~Gk0buJ>K{Kvc+{(doSJD;)`_R)7-+l&n#8d>e0LLBd71>vsXu&cU@f5oy#Sj zmmA0?{(P7HcAc|ZcROv}5hZrvY|N^~MaPaiX|=z)&bRdu^TrzO$<@C?_D(fEywmz+ eOZqN7`SQggad9yp=HIXS&*~8udpN#=fdK#`J>Uia delta 925 zcmV;O17iHm2c!p(6@Sx`+Zad#jF7C$SrIz7yv(EXRP@!aHW+FALIeKAt^?yA2=3VWprO@VVW`DCP zWTr$qbKrR*()ivo&sn=I1CQ=hZLwvZM_(+Y;!um&+!fO0tms=;E4xtCw?#WoS-ZPA zfqn8HvYMNOZjUH9WFsPB#4hbk`PEX|O@~=j1g?^T&AkKi?=MYab&RLkOZlrh$>y96 zXfP3mZRIb2{(tdz8qnY;v0&QIwLG!;S)PT*Y-ZnD3H}c(=ZT@)JGA>CwRyWy5SdvI zfk1q|(f?Ec0|VEMVPIh3Eyge~Fz^;*7#J9Mi}BVN*t-hTRRIkA|KpDa3|z+GD%|3R z0(T34G+^LQ;1)L&xLdelQftF7FfcF-+<o%3=9kdH=x|DEp8}qw{XRz)`nqVU|<-y0p)IOaYKQ-g)1htHVgv;1H-@# zD0gd%8w%VlTrsJ&VHg+~7zS=Yxm#P@P~dLiib<^v!@$76FmMCP-P+=Y0(T2nOloZy z1_lO(fqxrN?$#DJ6u4WsVp40vFfcGM4BUWnx3;*Uz}>h874T1C;tlS@UrbR#nf>y<3tmsOl^7?Qs_S99>2+x?}CCm-&=R1(m@9R^F+ zKRA$;Po?o_IM>-SKfm#&@Y<$887)-Emx_9{pQj?^sf^7d^+2;YwvY4HVpV>ez~qnO zxPM?%e%bw8bHVzAr&;;IY;NREe*M}0To!gi&z-V+tw(zzU5Rxu;gk)#{Mx;%y`I_Y zz$ZUn7Rit5;Pg@lFwF|S9~;(3q9`6G_BH3pMfWDzN)~PUL}T*by_t9EKivNScGbv=H+TR5JP69Q diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_2.schem b/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_2.schem index 654b9f55715088557e2fa9e04b5aa97a1bb2c987..aa2813c1d24e23e6d0d94024af55da8fc7428b05 100644 GIT binary patch literal 1440 zcmb2|=3sz;x3|vbOS?)O|9Cv|cd3|*(XB1!D;G}H{1Tv;{Yv(> zx7qI7cMI?BD0pzLv%Yyh=RcM_nVG$_w|QjD*l8QO-(IuG=HHu&J#~Eho7I(O`pC_? zWR=c;c4h~UdePgTPHOVcj~2#V&n>S`oVV@hpHA!iH?qNJxubW^)SR1}`>%O_)`XMl z`foOG&AfZ`jQ#e|@GDa_)Bke&hb@b_6KUR?``f#1X3dxS=@rvbi~jCd@n(-Hclm9R zzq9PWwEwT&G+q7Hrx&-rZ+lz*ntzAt;@{h%c1^uA>%@->R+FXE%Tn^Q=C9?hznD0; z{Bhi=A6f4=_Pkqn_tgC4@+f=Vx;1{Umg=?}*%+Lw%G{)X?_ajg;rufjr_T0`p7Y~t zWbpa^HM479^&9*;C3br1 z!GVVbKu-8^O$`v;e)wu37Z+Hvp!83#zD8t+x6cER%=OcY7x(P{$eJqgXq6ieSa*q> zY$`~N*&EQB67zu4o6B95s7Ffi{BGMzLA~3PWea<=g z?Xgn1_Rg)!)%{(U>f&}D65TetJv}@?y)%cde_^$__@i~e(}G}j|txKGppG6+pf^P zdY@PB_ucmO{r`J=)>v1UKg{`kq2%u3(CGEkwf}GRnYAr1=XU+<+eMGFjvt>sfA9S) zcQ^0+*?PP0T>oFWO(VOWd-YTAX(xL(t?1je($>uNY5c94H-WJ?k3ah}HUHBByR~sY l&qYQ5n(Oyw%e|id{fmvN3LkH(|7-SF{!~cr)c%=_3;^D_+PnY& literal 1397 zcmb2|=3sz;x3~QBrCnu?eJuQ=-Y1-)vf@G06>jq-9x~dYfvXi9vNA-tY(q}?yxmxS zqN;qi^*MVznH_}=PLIxMKbZPK=|OBkirFz<$BY>}|E{W;-~IGs`nBZu??1?tEeQ$l z?JLQfW8D5LM)Rul%Cq~$cfI<%GS=txro4COzjWX7o433Bl+A^sM`j)BEq&*cyDa`^ z?A&#~9!#y>d1dQvncv@+W#mM@sJT=3!RGSMHwQPZ^0}M$vh?cS|F<7SZeM*b;>IDL zEZgGmTXV1fS$O~V`^mBMGY&64tM7X^ZmsQuHYppkqjyrX@|U!=AA7m7tjhbX%#?D z-J!Yue}C=JQdd9LYyZVvq9*B$O>tI!aIWpCzq{_Q2z~xs-nvD=i9>OHwOJ5T`{9QL z7Bc%DiHKOp@BulGELd4Vbiob_KgUL}q+Z|sUrm>I3q^&&N}hgt!SQ(ez6D>LVy<)? z1nHi4Zn1I?P>s-&MQ%JG%^ynSWE1B!2|XI+kA?^C^Z-eGF*3^+8~`OFKJnw48X&s; z@Xni(;Uw+LFSHBfh?md0xuQO)`Sq`EtLj6SC?j z?Vh|R=gi@m#$PAq&00S5|IE*Ce!Y{Ol794;-O60kim#`4na{KQ&n>NXpeKDMBLe`& CcgfTM diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_3.schem b/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_3.schem index 99c6a0ebb9b7763918d13b1dc467ec2d42fdeefb..7f53b98bf2027c5b374c06225bd07f892c9329f4 100644 GIT binary patch delta 1008 zcmaiwZ%m>E9LIIm-MtC2-R@S(dAd5gMv)_VEKIty#_8>3>t?hzV2#w%F_4o3J%y)s zE$g`OoW4*|?8;=z^R&1?MMUO^83M_ZA|j%BXph|U$N`G{?>4nw_SyH{_qWe}`+kSD zVZj{fiL?Wd6`L%Zj(c{EjCSvhAzxlffBDo2(&MF{r6<3AVUBYC-2C(Yyo)~sLI`}@ zRoS=wl8a5kH=bdBL0`*Ud;Q}Nk#CT*xtWa4h_~F+exFZw(62JYq#B~Mv%2<4nQC^U zE9WiS)$&%UAZE@`g*vKYpE<+e463UPUb|+aWR0jJi9s^20Z#?sNd>ck)ryzf*~z+RK8 z|BB|#)D13Sk^RniAKEh3Eu)Q=sq`u2z4s58N{sKOo-y&W593=uR&+_WQFItj8ZiBD z$B!QyOaHIi0H&Yw^S-uCVQ8-yj*dp;rapM#}wzt6AoXDpjj#cD8U5MtolKcQrv*jXbr`>>eBdsJ6o2V88xNZx? zmy~RBBQa!F{~(1~&BOJD2NldY=&$I- z9PdJ7pv`yL0=a#+l!!69JAW%=6+*pRkg!m)A})Hg`NWXtW^B5bgoGVV`)VCM?3pa7 zXx&&KDMgyn*uxithug;|aY|Pg#Y`BXxJ^SuJs8}+!_DqNi)s20`csZI7}$#0NcWtT zK@JG01jSqmb6D84;&EO0gmW&cg)fG*&PMkvn*yjNCy*WzYH1{c2DU!{rH$=Y(y&~YYzy@HTKPN;N&w6d zT;TmQn(&Z4A#L1HH#d`S;fCRxe-j9ckmHvnOoD`s@q(}F65F@2EXiKtM|2=!6re(& zxycQC1j}_0t!-4>*szS(>1wqmEfgQ9)xyKRws&{5@zL?B`F(9NYOo|Xc;}N@XJ2F9(Epi{_77T)Js|)9 delta 954 zcmb7=ZA@AR7=>MJYnN>$*^=6^%{OC5;FrYS#im4wAD?^mq z#6{XQ>Q{+QezK0fz;yY+;lp6qz!+6i~#AP@wn9mjXjzX14pkC+FWedC$pf z!Tf*$a5wg4?SMF{T8`4OdxKt%9ln=y@Ytz~Jr8@a#EycRPxA||eRrhbjfeRkj4q^X z%rhGGIcDB~__bHg{`xZErJM`;J)gDhp4s!!n314AeDo*rDj<(0E50{v6zR}(g>w{h zZt%ALj=2<5En3i?K8ECtCNt_1suKjJa}|qYPLdoCZXi*st8>WNtmeoxuJQBx?^_h? z{-%bTqM!i+*%hf^`102Kd|AihyCwyKBQwiQ35_&x1yx<*-&{_xFKL@gsm_^34GEDY zf-@Y|Uk|E*m=1ilaUJc$FJ)>_70sR(WZ5z$e6KzqiyQ4J6abC&=08ZMF|>$Rid>VA z*UNg4A>Yd8lN?S4GS!`w!%y2c&L;zC!cQvZTTyD6J2b~mxne-VT4hUdc;8xwuQ
    M#`nC8L*r#K) zd^i=ksEr7TzB+}r=`Oxda7(O(L{RqxY>~p2rIb=P>o`t++7HCS>y$LC0(jq`(~2l- zuExH`aXu0o_3?Wi#Ms#_L`9@kmW`p(w{v+>vCQEAqLPTE^f(3z1w!@b&0%5WNQ@>k pdtgJn)RH?%fh3Ec@ROAz!^(`INTv;8uV;3@&AjlV^v~?9e*o~X8JYk9 diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_4.schem b/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_4.schem index f52b9cca35b9724a39fabd4d8a5eb64788ef2cfd..328ed6571c50d06fd89d067bd63392627642a760 100644 GIT binary patch delta 1011 zcma))T})aB6vu0tj;%{&*+)^l^**$jNk3%Mrcyt+$zEKywqzz#W3jZxd1FI?t8N#8 z!b4TkQ6-VIY(b@csBV+NjI-Vq@zxO`3kvCorHWwbjp9d4hQLPefuzvF@boLSYJKLNE4}r@}<#ej43ItwYc=b z7b3Z0XiR=xwG2|RyyWUF@s#8dsX@>OwPnvc!+)ial&l!cRRhd&@V4(o%g3k0Ocd-g z)#gW-H-0&5=RT50q?>a*cIJY;#}kQQacO+z6@Lvjx`@>)Tnzutxznpn3CBm$BPyG$ zI8!1<-Ee$O_t2=%BQ}@e_)&n83wS(J2V=A&5c_$_A7SQqTv8|feaFsq|5JaC?hkg> z>+fZ}pHZQ|dXTO6W&rwvgX|B>q{)T0oOi=gE|95l{AYp%fw@i)Xm=$ZA5p$HjJ)x~ ze*L|-TK`Aqrn%?R{A~5>-QCA-xPw_@)mUk-N5dG^*uYa&1m~%*siuqNa(whM%0$oD z7O}p=zNX zaX6KM_@o`5!nr_~_5PM?cqIf`esqM@9#YFR=)Ab{Yl*DcR?~BvX@Gq*@Du8=8Ej`LDBEZ_#X0kEh>B(xf*}io;ezI8{e>}fj zPj8RQ0&t@Z^qO4t#NVr+U}vh_rIU)izm9ad((|yO`A*Y z@&T_6hwn{)%g6KC@Zi>P^!_xDC*wTc9PT`vKD}7%KJ@vw3)MW4QV5`R?`I2gl*YAOEo@Ns=TZNs=T%bEDA4wk|arzBuSDaNndlyJ09i}fq`^&7wS`VGr@ zGcJ#(FTH7RxVt_dkEe%=)A_;j-OV&U+5LC>FURM9S3jJidHvw@bUV#gKiRwM&9t31 z&!&f~s~_0zwOi*q{};QzUTk+C*n6>i=MVOVJLCED@#XgZbUw|~&1LVe0KHdceZD%i}RC*yYFDy?4IO}nT9?#+%d#K$yg2C-S$~)CZ||{a{vxvvnk|#3Uy zZN7@RRUhN-zj7J!4QlAKIG}Y%%pG#AsP7-6i?!5lfL!U8MN03ftnA9J!_|(F0(<5a zuz>|8l7vWlO{ncO5N{Z<&Kj#ts3ndj%>lV|CaH6}!y~%n&v!CW$J~jf;cx__p?sjW zI6MntAw#PdGy=cl5TrO2zuIJD3Bz`1^=+NtC#uOOfi~;L3aez2n;m8*d+3|zcvnOi zGhQQyCFD89heaMer$WfY?Uh96C*?3_zO6r5mvpW}wuuqq{+v~O4;u*7Ap}-BR9}%W zElgMFM?EDtyGD75pu$*!i*oqI!b}sbmR4n&ylCpeRKp=SJI@qiA?Htiap0YY^^}@A z8Re6(9Tq6|*rqbtn1{{Yb$ELXvJC%gQ&hzOl8V0Z!tQ`l{*Qc8vHLSi@G2!i7AFoq zcs%ZHVBP}UQ}ji5DJjQrSJJU(_cM;iw9&T=;k(d-L+FP83^jU(C~bBy0(~i{+C2Iu zP;o%T0Tl<-Iqcv7Dh{aOe8hnr#6X?H|Jph13T``u^tQipqyJ(`?Zd=$yK}0KY6{!G zW;p!KEsT+kU`u&MSXrX-^FJm%ZMvUn<_%C~A!b<#A(XtHHu>ts#P-ktrO}&;MD>s_ z9=tH<@?hgU$Ynb;EOF=Q*fe7Txs0!NLQXus+HIW>fl6aVp^SbUCkr@42=IDQ4v(%+ zoE5N>wqB8`(>=4m759^r~W99X!JauivDKO}PZL3^TYQ|=N6|6^G3zIg- z3g(0(4#99QdrUAi?&Ft(e{{faI%{CUM)#B^Q^y(^K3#c+q#L8C%}l)@?XvBGm2?}3 zEzFU)L%mk7#+$O#AjvQVObp-j-CMhqn0BpAyDkjqgaJQCv9g2{Vw-e|Dm?ufJF?uu z87GQfwjW(xG9qEe%u<6G5$E%iht+EG_-?)kl0e*)yWKxzO0 literal 4564 zcmeHKUu;@c9G(xgM%S_zt=n2y;!G38O`B<1rI7ewH0#=E)Yb*KYHcaj6-sHjh1=qT z^Cn_Sbg^}VLNr-fWRX_tV6<@8F=SYwYjE}tgRWq~wPkQe$K?VSwDF-^(!Lqv!#z34 zc{smw@||Ke_HG}PX~uz;X=dnox?+~JbnJ^!?PtXAAINIXTClE_MQVj zjX!#h`_?thq6^)_Z>{Ol4E^~2)Z?Ne&O_2GwU@c0AC{lCAJ|~Nd2T7>PU0Qk)p;Rt z&a{El?#?=56qiz<)nhKcv5hQ2G6lYz& zPO7j(N~_ZWhk5{+qT5<)m5CWL0j&g%bG*?B%#wWX-a<$dq0t9UE7E?T zfTFXagc?PUOpXQV+I1G2XRN0lPogtDMp4=zKobyk0NCGQlaFN~%-IPN9$M`6uMTeY zU%H>#OI5kTD9GG)uov57SHib;n%-Ok^!cH+=A^$vY%zv&9HInJL?< zB&jx}z&=O}GE+!jzK;>4jgmG>+9>(Q-r~UjOB{9=T?iq{*x7ec_~#;utko=We0tHY@vN)G5}K8CGCl1hr@elR?k2*Ns~i z`>UR#YG)?&FtP0Y$TUy*m6b*oqkLe5pB!frflLsA%PLCEMz%~?qmC2F6uycVZ5cz8A(S4bocVxxhD!HFD1-5i z5p?zr;#aU(Hfpqurx5jA9FDBDEHw#7V&lD4wM|^g#q4^@=`FE3UvXnNa&D{=) zq?2F`YbmHZG}3F$o2iEfeePDK zdPyrqe!smsm&vWjg*`^F%W{eLYh`rK*e{jat&@zt(QHMXI-s8H6^|{}$2A^b#L+oH m{0U*rEM{TVELGf-;CHbjH}{qzId=*+VzjSe6&-uBWY=FjI{fzl diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_6.schem b/src/main/resources/assets/dimdoors/pockets/schematic/private/private_pocket_6.schem index 0f8e683bd84593001ac95078c6e275339822f748..8e733750f33692241d05c0a81805605037d4a977 100644 GIT binary patch literal 6495 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 bbcT_tJ{y`S`18Seu(*B#qLPm;0ucZJ3ROxu literal 663 zcmV;I0%-joiwFP!000000PR@8Zqq;z9mk2|BrWNIN^n5p!Wqt$s;F%cAhom#g&rzY zw)Qw)>g<}`anqCw2flzW;0rkMLGTwGnT?w^t;7M9Luj)Xd!F9TytgY^dTs*v(A*Ij z65*CO0f1@~>Surt_hUJTwKjHzUr<@8mB_Y!hboV$zd_>|u3-g&O;mkKq1}XV z3rWO+L<1Ij_@R&n<1HQA&@myL%m^V^D=1|rt)4!V@71yHV^)P~R}eDu-PbQ0-$SUr z6a$2IUL0mJI>>c&gmmx(c;a)E{gj|xhsJuwIPVhxi;unAwkp%>|19SQXF=q3%DKV6 z?d(sN?$Ztbrkojr)thecQaLv`H#p-4XP}%LoCT5BDQ~&K8@DP@+mo@2Zk*S4Wrj}` zNs?%rF0XlTZy=7ai7P58(rk%h7&@2LQrHlO5-Jx2TOS-BJ9b8w$-{pal~W% zkrK-hJY$!&yiy3kzW_;v4 z^7GV%@Bo6mu;~lc`F#5G*|)nNL#W6Y9$x$tAihp?*EyQ#HY~9QwOmq^meLn&s*5b{ x@!6wcCCgE!Ev_YmW=B}No3hP*dU0!AJyetXfffYk&U~0&zX71or77AF000P`JI4S3 diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_1.schem b/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_1.schem index 3ceea12b602e2ff243c0e90bb73fa349ef702742..8a34afb324079face6f62f12f270732cf4557fcb 100644 GIT binary patch literal 959 zcmb2|=3sz;w{s8X-F6dbb60XbJw=$^HF`n2(sDb8^^8o)D{pUcxWkeaCEw%}G1<8= zyJ~vux+LwrUoJd<8U4lf*7g@0cQ1Roq*ZoaM9@R~hOkR@hwt8;`%{09kB>;epBRxG zUHMLKC9dRKJ7;mcm>e>1Y1HgjjlU1BniSQU^e}x+y1<3G#w#rhl{WLYd@0V`>A!yd z$s?T;PkQgx`?)ZnGbOdYL~n7!xBrhHryXakEqk4(UmTdiAD(*h*m{9oxn*?;k8S@n zC3nr+6m@IPyW=LdN!me)NA=#G{rP;V$sD9#hYX$c%V znos<_G5C~ik3MkV0P}GquNt!O@a#D%0Su1qX3I`)^r>BaIrdhyBKNr-p$)Vg@NKe79lcV|v|;WV3*wJq4*c;U%Q2CILSR|Kv3krgG9 zs>fGXTCddgx^-Sr8vnmF)4MXl{Lj@IUpf1x-gqUsCVtEqIk~D^Xvbfy!$=- zyR4hY)YV%5-DLlK`?X$ufBlcsQ;r!e?Oz{#HSbY`M0rGc;?gaiaq)-ZroIlHc<%1k z4TZn!r-UN6T@nBuH~nG2$;Wmdr|6+0`0wzcCI^p?5>9E Vb#d`OuVvrcr>_1GVpPGv00830*O&kR literal 922 zcmb2|=3sz;w{s5`NxKTPMMrtYd9pp95OT1QOI)rYdsWc7B~zGIB|Q>qlwnFewtMfb zgR5_*rinzJY-RR8ApC*FhLfK$|KLQ)lbZ@potrl;Hub+<&ys&tX;s^Q?|*Sgc~OJg zai!$!pB{6B1M^*~#rqoU`kvaHE6$bMp}(f*%+wQpdyc!ZG1eMP?^4zk`t9KHzW8`; z(N1;2Z&y8NcXFLH_3y#f5+FOT z!+-W{miwx9XjAu}kKgbA`(wA{-u0w&B>_5q#*%YIDoc)ids19vUU#x+TGX!n?uU=h z{Jgui>BPK}1cMvDv+tHm8WjF=F-Zki5wCV z5=`q9i}#xiI%N;!5Em(*Tsy`Cx(e|OKx43FYcqH5PrXy6oAdqS z)$(W0b`)=3{%_IN?Y_3f+rHgrH_}M?Z?Co{PxRBt|8j3%UJChqd-b-hcdObHEzWFx zpR--;HShM6lKa=V_fMHEENQ>t-jrjrWpB>DB_Fc^+f_T5S=OZt0pxlrGarKR0V zr_a8g@;p!U+Trg#JaxZI9XJ$Q1U@ZG*H$mEkl|}T{7~A@vGMRjAZJ})aKHnw;OfUB zA`r<}KceFUx+JDgIRI8MUEN)>{x$b0gJYq+5@6jwZ7ffL)GUg*+Hnx1X5RV9i+h3t zl1BNX;ejVTU?emPR#s4IEZAX%NRPr!z{I-e;mt{J)z^LT-nmn`x<5A6e)ZnZ=e`LG zN{Vc{U2^W)y^8Bs5|>JxyfLpjdiwos?DhF|;WiWBMh2VS-6k?u_qz7&O?zLgS!=$& z{rJ^W`(n&Ocbl-=x0@@^%rV=Q|NP&B^Jl}9Z{F4MyPH(G)oMcdty5>-Tsiyq@UOh| zvnLajb}xOqcXj-nn=b2i|9rUmd$Q!O?rW#=ZlCd6W54P7x%R{T=iYSJ9{#9*^xx7I zwdt>B^0MEaYkv34wC~rhi|h-DnX&n6q=?bCw}*f3*FS;p+P>(VJf#Zg2j) z;nzclZ$71IdcT~bBlEAn7JseH|9^h_|HBh|ZiVjuv&!zr)1UG2fBxO`Prg~Sv?gHJ z7kczTNmf=c3<{hUVnGm z)`+&_hMBvUZN2+TGw*coY1#QPvA_Fz#13w&{g`zBgZPa-S%=oH7GEEsXs#7L|4VRn zR*bCOt(b2sR=yQ3{&-8+Cg+?d>S8up%Y@KVCEc|Xo&$_&rkL&L*`Op0Jv7t`V HOhyI(|4j5G literal 1375 zcmb2|=3sz;x3?VgrClYCeY_rdymXF3)dD6yj~EO0M-eN#qF5P&ycY+&Sm>0P)xX)< zZ1?TEg_Eanv%mB3xbu^xM#zq(hP$ulvD(t95@+w+)B68>QrV~5UvJg%omUi|=%n_0 z*`|B9*`N8ivrm-Iq?EE4`_3J=gPxR?5xy>m&u7I22pc>1H zAo}pbR~F2yV96a;b#K|d1RqZl0!w`T^hD$F^|}Q-$uXfv!J5uLKN)yz{a=U9qEOLh zplKF1^VQuY(-$1sv8wAJkSjCq{N%+w#sNtv8YDFg*R4tdTl)Mn&`6#s65*kSU@JaX z7ELK+^Xgf>N&@VZpEj1KESOb~g@*EgT=b!4o=obTMxn>6wAetdudws)GdkzcSvYF_ zkO_QnydS<=$i@Xpfu(aAnLu%A5hI(v-~cGm@P!}eRBRD&y7y_#$zRFlpO?M?<_P8R zo9DCM@7es<#f6Re=Yu0Mw{34%hfBYoRdv5iec86H@@q~%+hXGT|HiJxm)`$V2|AH> zdFO}S+>-0`-Hf)S-@CRs|JL35u=-Y;Nhe>u*f;n0-Tiv}=Hcz^;@_((rRHUPdo?xO ze~aRFsrXy(u6+GpyXN1crc%kdakgjM_Pl;pogepKO7irD`P;+HZl_h{{9R~Uyl=wS z#p@!sh@0u{hdDv5zw2fH?S65XwRy9`efbm9R{EW-+@G%f`t7GbH9zGJ zpBI1lyg+4f*~RJc*LK_Q|MB~?{k`9XI@x(@^7D7x^0PMnzP`l&i|Uac|{ug!_C`cD<(x>UiI?r-JRR-?tA&$J+)%C`_t9=x$7<0>hG7o ZIpyM2Ywft-(Vy!X->;a!W;K(M0RW1ayBq)j diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_3.schem b/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_3.schem index bb9dd8028c5fe35863c74383649c436a849b0670..51d72a5600729849a8aeb92347c6549d2cae269c 100644 GIT binary patch delta 982 zcmaiyT})aB0EL~-bhYW|y0pwyOShRgTdOfvaKPlDBW@jNn$DS~D($x7um$8tP$~Cr zeWAv-Y$d6wh{P(IteI|MEu|o=G2Jy;u?i&)0nwu19RhY23RnKN#dgb{_T{{tlaups zE@Si<5ZC)k))qn6BTi9cVeV3ZWq@phU+l^*+IwkF{m-0{>0@uCKib|yJH7X{H|;`? z2x~iG|D>D^)fh*V&i}lGc zQwddovqoA;VY$`)2=mYyYYZX{9uSj|*)V#iPC9>HU2v7wI>Us&_p|%@j%xSg@WJKZ zgnFE@BH)8(%P9F1VpKJH>W+RNNKo;Qe2hs42H-W-$<4Wp(OIly8UTNr?$@d1Jjlil zrSTY9<*Qhu!WZ_3_^uIzN=zM)TfWOzO5ij#J=H*3v2RPYfnaxarOIT2Sp8;66=zh; z7tK-FphvpE@CA89;PK@yqV`5=-I*cMA#>ZHKXO_e6*|k*>zk`uat+Gs55;?3Eu3G3 z0KqNck_y#L3MQBce0yn&3y8p<*?!eq{ao`?JKGB&-gB9A$(*nL@x1ZF?K%IN5clhS zON`gm(mjL6F1`r05X$RTU0Ip__|wK^?QHg1wibAK_e(-Y$)cP5&TX;IHzIchr$B0{aUgHnq8UM!0p8FF+WPc{xRVWCTUw4w>({XgKIILc~BWsCl4>JPRDE0g%P823-|~I21{T8$L&5PX@6_IG(wgu(npM1cjPa8 z*Yxi8yGOUIp8cxGhEH0|hB4aAhH?D??hOwFALvE|+4iaXs4RK0=*M*J+VsaWKmA>` zdiVKfIW==GsmR*rPOFsoH2GPoSLS;Q+aG@psnq6QtB*Suwz}?f#UJ-~W^Y$zPdmRY z{Mh8lp1-c8-hP^S|4jRF-`#u7?!EiH{_LL0d)qJjx6LlCTmEuc?z^`5e)lr9mlvm> z>j^Jcf9d}J^HsY@lhZ$~!(W%a+g^S{I{w+g^+o$_H|~9yXZ1s&T>P-oT)E|k)hjd7 z&R&pN+W!1!d3f&p^m_lW&1WBeOR?Hh-Fvv?!@H{+B<`O)`SVrf@7wP#Uv-Upw{-93 zv=fg{-v9H|zyAN{#9O~Bi)UV5{PpVRRO{MpalY|S9^UM~{G-eM?AxPB9?SVJU93L+ z@z;x4CO?ngFLQx_C$s0@{jYA(_ZW)e_{|R#${YtHhvS8R{o; z&z{#%?_2XJv_gv$rl{iX9*e2P%zv^URmZnZ{>XA@vpsVO(`0+*qxCRji7*xBn!d+B zYzqV-;ODV)^SAYP&b7H(*?RHYXHEb4H!q{zEWa<<%i8+o?&)W{Yo?hy-!^sL{c7H` zf16$wnZJ3neDcdhk-2u~fd03r|Lg2Exn$F;+aJr<`}NfoP2l@{TCsd{{5t>twZFqZ z^IiJ*b}9d-8jHWr?;f3eyZib2cVB;A{n(inzvt6iVcDhI!w)Nczy9{we);UrTyK^) zzrOBYJZ0bAbLaQHxo=T4;~OyY{nTGy{o*P&@9Ffn2A;pg|Gvul`>L&+UGA>zi?)3) z>zDoPb+&%F_UopZ&pwyg)!f*7{rR(_Ka3{NepdDSwx^ZMHTiSTXWQJVTa>@{_nwn~ zm;bCO{q5L$y>I&Czx9UyzGoRX&7J=Er2LyD?Povj+Ie%%(^R=n-+rC_X4_|PFJ1pm zc1iQst7#uMzx&cZ|L<${`oHJi^Iy)h_O{=Xv)ktF?4RKuDkS!w+w<2d|J}UZ^74iD zZ`a>W+_j_jOZ)7jud*zyG%Kitz_q|C*{wb-_19heb&AEV{V+zz8}}lgk2ai0GMwQi2wiq diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_4.schem b/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_4.schem index 9a711cf7f874bb6c97013e31277b64d03691d9b6..3ad5c925bd6005f60520e168020c9090634069c9 100644 GIT binary patch delta 1036 zcmZ9Ke@q(%6vsDp0T+bCg%!q+CPqi51`I~ZgmF=`C>kM}5OfSq83D7_ao1Jo%F#1f zR>F#OLSkoN^bd43DY3E>THM-(HKiuCPSQZ>`U9>N?+tt!!{we`gzB>72AI>L$Wa5S!v3!M_a`eUCseo>2XGhG4?r{-RiGkc<0MUoji zX^3OP)N(+1S_U{Pn*f{6F%tf*RW63-vijKARa;~=d#_s{VArJgvRZqEl=LL)S|`kE z&GCG>YJsHSfy{MwWEG0h>R;Btd`XjtC|Js*Ia=9zSqLc4^5)RB(H`c^gFd5GSvm@8 zj8P~STA{h;xZ!BZ=awiQtTKpQs1~VRmsno%Vjz;x5O{<|_7IWPEx(Tor@F9)49@{1 zeXnQ;<&weR5%PIGYRbhGGz>ZsHK{_&-Whwo@vj`TJKq)Qaj3R5e`p_h`>Zs~wew#d z|N8JTP@QM(!)O0h{4IQp>htz%M)!Y~4@M^Fb4I!SNfvd|aU=Jj`OlfuR%apcu(EzW zClr~0us5Fi^~m^*r?334+QwUs7LIEVmyJJnvMesII`b-7u4~j_Ai@>EHrg79|)*HoQleM`(6y|(G zTB1=mlKm|1>YGFbP_?73q@ObQ#o?VU{sowhC;(=`5G9>})vAwW!q-Exk*edAFDRLk zfNBe+6Byc*9kUO6y$TB~zy`d5ppX9u3%qY(m^*%#fhYsR`MN7Sp|&JpUAHVkcP3G7 zOl5id^4tWyyJ3jMDsuFhp@0vhmc{)y_^lo^a zBBKx+u1RkkI9wPXthY5?kQZ>UHCcxX$xZZ20}79g@Dar-3x#HR3$CxiQ(v`nF*i-;U?7C?!f}fX%(| K^8MkQLw^Dvon!t0 delta 955 zcmZWmeN0<*6lDnnr)C%vT}dlMoz}#q-PAzWZAG04P9j}QW;fOkXB31s?Hdp&wCnGW zCPh~*ag8*(k|pb;Duaq;`dDoXXxc;73 z{4+=Uu81qn>* zSLjYa;7EK89RUmDydnP>d18iWLrmy;x|eZ+R;LOP_4e3@ZGk$FWRL)u4yg2-hVDv0?|k>9oXYN zVqf8#Qs+qj()OlWHMYNj{7bbEk3*-P``G z#7E!WJyZ*5|9o=wrU)k5oHZJ~r;u9ShH~<#J+JmoX@}9In4mD55fk$u(@{c&Z4*y> zy3GS1z~J0+c&GY$;GS;FxlIO1GvwAw07+3sTmvR8o{XxqrCiORE?szSq7~ep&Rvg# zXbGZOWU*jca3?p!qK3eqQSW*EGvx)m+KeOxF_SeKM-4TOxA9 z?8B{&!F$Ho?D|Lo7QX@(Fs0o%W)0S>MxAnCGzMuL{4HKsFc*Z&A4y>g_J-5&3~vFW zuHoi@Q?w{yG!=AaBpHeLBK9OEKH7?U=vS%V5%f8DhAlQp_$&U`5}$ce4Y2l_awW@D_Zy1ojO?d}qG>yt?8qiT@^< diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_5.schem b/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_5.schem index 696bce9d81abd93e54a922531c7c38a11555a76f..cf0dae4d29e6ed214e820844262735b7344cc3bd 100644 GIT binary patch delta 999 zcmZuuZ%i5o9BtRlwn>pRSqh?fTWdzLy3uU4;2&W7ur+QiWXU${%3w8{W^D&T+(13K zY|SuJD_!}(6zwH5k#1;-A$oKu7e^+^6fYTd%&HK)RDy!%sSM#bSeGSRKkVh@y}bPL zOJ4HOQyZrspy$Yee~^42((&6W>$eV&~EDGjHFsyfAi4c>c$|O6fxE^c(f+S(vQrGxB_AN~Pi< zzMnSc4Ea{J$!Ce)bOQ4xV2EE1J44H>o*)FwE~>|s0jpgg8<8(G`D|vEgS=jg{(;u2 zR_bhS0L>2cWPHiBL=Wu>?1#b6C)sjJa*<#C9Ya&Vu8r7{CZDW8csjLJD&>@ZdZ~B0 zG}_W`6Xb_Y-jLHl}!#7BNs3!>-@?;j&gS)>*_aAkX zG0y`E!Z{+-rDw9yHO#>eS@E3~;glp|4xWy=RGkID?~4-aW`8spNckSEC0bqLj zau3p$2=nBV3ejy(l&Pp6S2GZaYLIZ6g0;SB?8F>tb@=h93{o?wW#coh}^1YD?7cm~}ImyfVqfGF(8*RxF>{w(cm?JUZqA)cynSY66_i( zTCV)FSKN-!~;x|##? siOZ51YLn;C(4&*M?zXoK7**wv{uA6jB|}i^U4;(bm4W3uY{r4V0L1e!g#Z8m delta 944 zcmZ`#YfM@P7_B;&rNU_11ndM!)-L|&I@)Lk-7I9=kHxGlX3OHEJQlaGwYG@#A%bw1 znQ1m{Np=_MHic}>N*XG}VkgLJ=B6;Gy~HuxoFZIkp=trISCGqdCQH`+*~!UC&iQ_P zCujYT>kvR6dT!4@i2v>t^FF4z(a4|Ow7MVp&9`6PccInX@!st(+bhf7eaF!J_=h(| z=jooeM!#8`?*_jnRvAA%654AykSI%h_L8T`2kcKCd0$TMTJ`pTA4#M25zlW)S#^3a zLZWCQ4cC$kEdi298tq$;s&bGT9#O-Kz(zbVjx!?Xr+6l^rtS~ZJU5Xfnb_?{w=W*< zlXp(oRTrbGyk7xRbYhKOcZ$o5ED!nDq`cF>D1B*}F37?4n1Pud)D?o<+{2FU-eTG> zsu!C+@5etB;E=_k3cp}KPIWSkwWlc1EGpS9vW~)JUwBaxD*~A%zw~vj!^K{v@i`}` zj?C~)WOK~0)=_K{2Zg|N9$Uv!{pi*QEX&jlH$KZLM3N;r_6aK!4==FnKUuTe(q8%9 zHXWO)2ZaQzt|;fREjI?hmVvWL0c`Rn&k{^d6g=7V)#0bKiVs5(RMuDvzFK|&+*eUq z`STQCMg@^)4({E}^K;(+vHSnMj%qW7Bt-gR6Fgpd5UedHl!tQWnTp9ObBK7itPBSw zq!<6I0N(rb|8AEFF@ebuXix7>GLFD+&&{D4!?_bjJpuF>L7{-YQSX} ztYn4Ve#h;f?73u7$|qWr>{<=!m0LD|Hc&v)a@%MrxddXl9n#=Ubhg0=t6bJx5NR8P zP)xI03=Bi@2ia|eH8#v0@f9W5%vI&R-e;Y%&^-$2&aHUImDf}o-#d`h zgGb@Zc2}d0-RiK>D5RKr37D4k62+p3BR9@%^(ts^)G&2bY-VYn2)uT@`&*I zK+T*P(W^%c=w%yAxB6{V7?Tw?`m$j~SIi{4WU;oL(Nnyx>>Fc&``PuaCq;X~GUl4C z(Q7sW85nO6b9hg#()sh8X#bE2=-gRUw=h&3D2{9zbQge(s8n%XL!tayP2BT0enlI- diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_6.schem b/src/main/resources/assets/dimdoors/pockets/schematic/public/public_pocket_6.schem index a53ebff6cdbc6d2cb834f9c8b38cb137b8f30092..8d4971e35d050a15139c9124177b87fdec923275 100644 GIT binary patch literal 6465 zcmeI0{ZCV86vtiS#D!5}WGJ)J#BDYp(oBKUAnksbAu|&+yo#-)ZrGtvpi#<8p$Sat zz?B&!l@+LCgu3xkGm#cbXqIjgTcBV;hP1pCFIX<^we3o2FSmD6_GcH7V?>cD!&YGF=698!Yf z1ScIYAlTx44<-+#3+KU^1Nz*s6pal=rj9FrQl?s4H~53^_ak~MwP|vEzN;edeaBs(` zN#6XTq25n-`&EBsQ($0k{R36dGjt=9gQzEa(AaL0Li)BZK)gBFptb@4=T)4<{fwSM)LeK2wr;1Cs` z({rOYZ~3((iqKk3*?{4l=>3_^fz->}6Teen@68`Lm#}uQ)xkC!c6KlnV4%kC9qby# zW3K}2&8A+$P=KKTLjm@E^ZlqX6ksU8P=KKTLxE4c`xga%X^p-BvFVMH=a<6hOUbU= z)(ZX7?{ETT#I}65lhF5%P-*Rq-}m2kr|{lIU}Hqh8H`$P3&r%_&FkbVM6J`)j8 z&*2(yNcmbPldek%O#&4BI41}|aW0f`>1Bt3dMI;wqvS$940xYfIPm2;7YNb_)NF=R zLbGOwwN`J=iVEM<2$IWXG>H{;czT2yBPfune+Rmx0f17R&V4Syt?C0nuDsHZe@2fo2RLMetWAml%I%l8dISaXM zOeDxzh@A!NV)&D$GS_vK5v8&9xfi#1Gbu1+zTeWlLP9L`v1zt9i+9_0I$EK2oZ>(ya7dt-PLmDofZRfFKy9rP-Of)`hL(QHq2;YL< vWvg3MRUQ093X+iSe&lMEGzHe%JgPCnSCsN}LpzUxzP0CM(9{uA$gaNtRoKNq literal 6421 zcmeI0T})bM7{~R>xhgDcH~bp3S=X)~K%G^vqnwLgG|Ot+Wb1StmDV+(7AN>oKtXNR zRnjput=V9ek8I28Rwra)1%}89B5@2%=PdD)P(+6Ws3IVEg!ysT8&9^|b8?b%^PKm6 z-sgGV_x(RVjNqk|?Z-b^(ng`ZW^qjgSY7L>BYW>&zB%*-_U4{Ly`O)Ta%kV(^sBGz z`@lQs$4x5^KdiQ}#CwNcE=xUf`CwJ*V_a74R9h(h*4xSi*1iTF=(nmDefk$o)&TH)PihO% z3{=;cPvG&;LzbrCSX6=|PvhDFv8;NS@Orn~qq*N)0Q9PX0q{rKe5ulp1XksfX*5A- zjDRcZtl`Ge(+Wa=DJ_1_ZV`s_8Ieb)oD|zz!#3AH{+f%DqYunNS46)QMOpovK-MU-^_EUhDUpMIYH~RWypfq^C?nEUKjrytE6j!S#`iOzB+(RR{zMUVU*d>0!xYXPNTJi95nubZLgx_g z!skP(7KiD(+DlvYl2hk;s})iR8i^k&tm8P+8Oo=)fgwnBMnUrbxB({zP7b_t;GF{> zYw(=|-#M@#fCT}p)?g_OOKG^zftygc355v(ObB3n^FP=cBt}Ne`%efH60&nKHQmoP z$si>5xPjVA%`bA^d;6PgicE)-Dmz0n#fO<|dQWV%W4urDjXN-ZEQ8B6vC&v`8{0C| zN5MYuG=>A3roJ*^cV#fn^sQF?I;#h87)c2`LEIqeJz-XH(y2PQ5Dj7wr`;Wu6e)PU zZoz3%A^4r6)J8f<8URCPfm&wZ1Se=s%Zs4!EV)D8@!EFETW_i$Sdh&pFPKRukgNCR`t89r<;$@ega_r z1}ANySg55q8LA){t^`NGx%Nowlptggbm?^N7*Qxv0(vle0RUu4(gq)+UlR^{)~OUCYp)N2Z?g^dQCM+p%BGVL2XiUofh`Tw>{R_w>q7TWp+na zhf({A$70{}ti{5aT~t5&L?J;;$%H2nPQ&)d6*N-Jh!s|AkeFv=_E?aovuRmB1As_4 z1rj@Z5|eyDdG4Hl6Y7YvyJF97M=J$vbl>mksNvFme_quvU_|((TvGe!d_-__H7vesm`BnJt zOSSNLPTpb6;pl8=JdkHj=I0Upr7Czi_f7a>VNpJ^zp>zje|)VLzL=ZG%2e^Cv1Ag* zocuiOWe?n2Pn%0@ds+Bl(myZ+P!GyTI^GiK8f6CiCIfHq-;hR z9)!%5w(M8L5Yj1C+ApJcnRaxns%2GQ9EuPep_X1S7U?B*Z|6q zDU=I=yKDA|gjB`lA})=9fh7C3wZ4r1E706kHb%QNNPYX5S(a2#L>kqV+f+i)>C#X< zyy7WEwOfxgj+Q00P935zqm-Y=1HfrhIvK{bm8xRB$mI)$Gu!dRvn%vf`P+m5n8Jo%XN1_3%Eq?F`<)R6HP9_aR7Le?z{2~EishHYVUvkC|t6_|KwNZf0{0RCM4 zq%`X$oY_eWnH^suw%7~G5v()H2JfiU*)3mdL2?amU+Q85aygW?Q*5XVklZlvn-O_x zuRH53(G2Q{YW2YN8Pv-+rQ8B)Gad9NNbn{nifs%<1vikb6L^ptiqjhA^y0B5wIO<& S*J;L?T=LVme)zbFbLbxh2zRCc delta 1005 zcmX|&ZA=>l0EX%0D^3SLbhwB;bTG1o^@b)?q_idi4Zrxguyn0I{6NEYh|sc9dWOz5 zS{>UiS&cx?gk&VbylhBsP}@TrtayWp8!eUfO2^s`y0*53miE3}H1W-oCwYFncU#aF z7%-I<{I}SB_vNwevzLOH-|B*kj~#ri=3wE=>L*v*zMTHztAgY2v>m(Bdhyb?am>H? z<5ZJBG*EfiIec`pw70PGSy%bWaLt-pVrkLVywEydk?4oI&BXUp`H!}^qjDE1C(?I=YfUav_1r8v4vALuf2Vdn zwmaC1wvw;`K7&E%9d@CKWPzKu2%Qc^<)op*3$x+AnSewg)mb?vl+iY`yQ$sq&oP8F zXnr+>xLPn9F`|!>GbCu`=jp{zdhcPpH@p1-A+#`N6&r#1kRcQgK+0)Sei|h1tXp*Y z{tKzlJkMa)4f}XBlgsIIc|#~z1|Gry3h(5eAlOKC`?Y^T+N+)~sc!#sb#?r8MDSug zvMDGmhDTA`fbRb!A`y`gK(3b8Bi{)MixRmxlM8uOSdUa4DLOQ$k3UQ%3D^af>W}|| z2oBVj^YDJ1?sxZDiImGG;=u6Ct(PW?XReg}R`ygUijiyOr;t+zii)z#gT<|DXB+3J5nfskp)4MAdS3Tbr`PRe!S9~nB2I>=2CmkkQ40&Jp>iQ>6kX% z)p>nlA~Xm#sD9}1jykx$OImN});#mGRl| zl9L`ufMp&m6OHczn1xBCZqVce4zgX%8?xM08(1Kb%gMD;*({LUzp?#XS%eD?xFJk*?ecg_Y6&5A}aQHMj3MKRU6tc$cqyk-!i zbepyksW!WC9=7|&r-{8kR#W3srsbu4_n?(e#*N-+n0)3_Mw{Nrz$4}odI~_{asM=p zoAi+#t-TY2Z%J*sru)HJd4it_7EB<)m@cbb8b)?(mxW3Ch9cGapKr z9O*CGYay526;Aqk5@K~1A$F>ln}AQsCSWz08jcYya;l#ajbG+Q@f UrUT4-E)u6@CmojA6RkkOKl_VL!T