From 86eb14c408bff43fba350fd90974157d4e71eadd Mon Sep 17 00:00:00 2001 From: Mathijs Riezebos Date: Thu, 16 Feb 2017 14:28:28 +0100 Subject: [PATCH] Repaired loading and placement of old DimDoors Pockets -Added separate Block class for Chaos Door -Set up Personal DimDoor to create its own type of tile-entity -Added flag "2" to update blocks upon PocketTemplate placement to prevent non-defaultstate doors from breaking upon placement. -Used write- and read- Compressed instead of GZIP Streams -Closed the output stream -Added canRiftBePaired field to Rift tile entities -Added Chaos- and Personal- Door Rift Tile Entities -Removed statement where I falsely assumed that a meta of 0 meant that the blockstate was the default. -Corrected several other mistakes in Schematic.java -Had to make sure that the blockstate of ancient fabric didn't get turned into fabric of reality again... --- .../dimdoors/shared/PocketTemplate.java | 2 +- .../dimdoors/shared/SchematicHandler.java | 42 +++++++----- ...orUnstable.java => BlockDimDoorChaos.java} | 12 +++- .../shared/blocks/BlockDimDoorPersonal.java | 8 +++ .../dimdoors/shared/blocks/ModBlocks.java | 4 +- .../dimdoors/shared/items/ItemRiftBlade.java | 3 +- .../shared/tileentities/DDTileEntityBase.java | 1 + .../tileentities/TileEntityDimDoorChaos.java | 18 +++++ .../TileEntityDimDoorPersonal.java | 18 +++++ .../dimdoors/shared/util/Schematic.java | 63 ++++++++++-------- .../schematic/defaultPersonal_5.schematic | Bin 890 -> 1480 bytes 11 files changed, 120 insertions(+), 51 deletions(-) rename src/main/java/com/zixiken/dimdoors/shared/blocks/{BlockDimDoorUnstable.java => BlockDimDoorChaos.java} (65%) create mode 100644 src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorChaos.java create mode 100644 src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorPersonal.java diff --git a/src/main/java/com/zixiken/dimdoors/shared/PocketTemplate.java b/src/main/java/com/zixiken/dimdoors/shared/PocketTemplate.java index e654a36f..4479a072 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/PocketTemplate.java +++ b/src/main/java/com/zixiken/dimdoors/shared/PocketTemplate.java @@ -95,7 +95,7 @@ public class PocketTemplate { //there is exactly one pocket placer for each diff for (int x = 0; x < schematic.getWidth(); x++) { for (int y = 0; y < schematic.getHeight(); y++) { for (int z = 0; z < schematic.getWidth(); z++) { - world.setBlockState(new BlockPos(xBase + x, yBase + y, zBase + z), schematic.getPallette().get(schematic.getBlockData()[x][y][z])); + world.setBlockState(new BlockPos(xBase + x, yBase + y, zBase + z), schematic.getPallette().get(schematic.getBlockData()[x][y][z]), 2); //the "2" is to make non-default door-halves not break upon placement } } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/SchematicHandler.java b/src/main/java/com/zixiken/dimdoors/shared/SchematicHandler.java index 915d20c2..596a4998 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/SchematicHandler.java +++ b/src/main/java/com/zixiken/dimdoors/shared/SchematicHandler.java @@ -28,8 +28,6 @@ import java.util.List; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.CompressedStreamTools; import org.apache.commons.io.IOUtils; @@ -140,42 +138,50 @@ public class SchematicHandler { File oldVersionSchematicFile = new File(schematicFolder, "/" + template.getName() + ".schematic"); NBTTagCompound schematicNBT; + //@todo make the following block less repetitious. + //try to load the schematic from 4 different locations/formats Schematic schematic = null; if (schematicStream != null) { try { - GZIPInputStream schematicZipStream = new GZIPInputStream(schematicStream); - schematicNBT = CompressedStreamTools.read(new DataInputStream(schematicZipStream)); - schematic = Schematic.loadFromNBT(schematicNBT); + try (DataInputStream schematicDataStream = new DataInputStream(schematicStream)) { + schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); + schematic = Schematic.loadFromNBT(schematicNBT); + } } catch (IOException ex) { Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Schematic file " + template.getName() + ".schem did not load correctly from jar.", ex); + } finally { } } else if (oldVersionSchematicStream != null) { try { - GZIPInputStream schematicZipStream = new GZIPInputStream(oldVersionSchematicStream); - schematicNBT = CompressedStreamTools.read(new DataInputStream(schematicZipStream)); - schematic = Schematic.loadFromNBT(schematicNBT); + try (DataInputStream schematicDataStream = new DataInputStream(oldVersionSchematicStream)) { + schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); + schematic = Schematic.loadFromNBT(schematicNBT); + } } catch (IOException ex) { Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Schematic file " + template.getName() + ".schematic did not load correctly from jar.", ex); } } else if (schematicFile.exists()) { try { - GZIPInputStream schematicZipStream = new GZIPInputStream(new FileInputStream(schematicFile)); - schematicNBT = CompressedStreamTools.read(new DataInputStream(schematicZipStream)); - schematic = Schematic.loadFromNBT(schematicNBT); + try (DataInputStream schematicDataStream = new DataInputStream(new FileInputStream(schematicFile))) { + schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); + schematic = Schematic.loadFromNBT(schematicNBT); + } } catch (IOException ex) { Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Schematic file " + template.getName() + ".schem did not load correctly from config folder.", ex); } } else if (oldVersionSchematicFile.exists()) { try { - GZIPInputStream schematicZipStream = new GZIPInputStream(new FileInputStream(oldVersionSchematicFile)); - schematicNBT = CompressedStreamTools.read(new DataInputStream(schematicZipStream)); - schematic = Schematic.loadFromNBT(schematicNBT); + try (DataInputStream schematicDataStream = new DataInputStream(new FileInputStream(oldVersionSchematicFile))) { + schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream); + schematic = Schematic.loadFromNBT(schematicNBT); + } } catch (IOException ex) { Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Schematic file " + template.getName() + ".schematic did not load correctly from config folder.", ex); } } else { DimDoors.warn(SchematicHandler.class, "Schematic '" + template.getName() + "' was not found in the jar or config directory, neither with the .schem extension, nor with the .schematic extension."); } + if (schematic != null && (schematic.getWidth() > (template.getSize()) * 16 || schematic.getLength() > (template.getSize()) * 16)) { schematic = null; @@ -277,10 +283,10 @@ public class SchematicHandler { File saveFile = new File(saveFolder.getAbsolutePath() + "/" + name + ".schem"); try { saveFile.createNewFile(); - GZIPOutputStream schematicZipStream = new GZIPOutputStream(new FileOutputStream(saveFile)); - CompressedStreamTools.write(schematicNBT, new DataOutputStream(schematicZipStream)); - schematicZipStream.flush(); - schematicZipStream.close(); + DataOutputStream schematicDataStream = new DataOutputStream(new FileOutputStream(saveFile)); + CompressedStreamTools.writeCompressed(schematicNBT, schematicDataStream); + schematicDataStream.flush(); + schematicDataStream.close(); } catch (IOException ex) { Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorUnstable.java b/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorChaos.java similarity index 65% rename from src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorUnstable.java rename to src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorChaos.java index 3d6c8d6b..26a1a587 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorUnstable.java +++ b/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorChaos.java @@ -1,17 +1,20 @@ package com.zixiken.dimdoors.shared.blocks; import com.zixiken.dimdoors.shared.items.ModItems; +import com.zixiken.dimdoors.shared.tileentities.TileEntityDimDoorChaos; import java.util.Random; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; -public class BlockDimDoorUnstable extends BlockDimDoorBase { +public class BlockDimDoorChaos extends BlockDimDoorBase { public static final String ID = "blockDimDoorChaos"; - public BlockDimDoorUnstable() { + public BlockDimDoorChaos() { super(Material.IRON); setHardness(.2F); setUnlocalizedName(ID); @@ -28,4 +31,9 @@ public class BlockDimDoorUnstable extends BlockDimDoorBase { public Item getItemDropped(IBlockState state, Random random, int fortune) { return Items.IRON_DOOR; } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityDimDoorChaos(); + } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorPersonal.java b/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorPersonal.java index feef6ac9..6be287c6 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorPersonal.java +++ b/src/main/java/com/zixiken/dimdoors/shared/blocks/BlockDimDoorPersonal.java @@ -1,8 +1,11 @@ package com.zixiken.dimdoors.shared.blocks; import com.zixiken.dimdoors.shared.items.ModItems; +import com.zixiken.dimdoors.shared.tileentities.TileEntityDimDoorPersonal; import net.minecraft.block.material.Material; import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; public class BlockDimDoorPersonal extends BlockDimDoorBase { @@ -19,5 +22,10 @@ public class BlockDimDoorPersonal extends BlockDimDoorBase { public Item getItemDoor() { return ModItems.itemDimDoorPersonal; } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityDimDoorPersonal(); + } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/blocks/ModBlocks.java b/src/main/java/com/zixiken/dimdoors/shared/blocks/ModBlocks.java index 2eceaef0..e7c53f55 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/blocks/ModBlocks.java +++ b/src/main/java/com/zixiken/dimdoors/shared/blocks/ModBlocks.java @@ -10,7 +10,7 @@ public class ModBlocks { public static BlockDimDoorTransient blockDimDoorTransient; public static BlockDimDoorWarp blockDimDoorWarp; public static BlockDimDoorGold blockDimDoorGold; - public static BlockDimDoorUnstable blockDimDoorChaos; + public static BlockDimDoorChaos blockDimDoorChaos; public static BlockDimDoor blockDimDoor; public static BlockTransTrapdoor blockDimHatch; public static BlockDimWall blockDimWall; @@ -22,7 +22,7 @@ public class ModBlocks { GameRegistry.register(blockDimDoorPersonal = new BlockDimDoorPersonal()); GameRegistry.register(blockDoorGold = new BlockDoorGold()); GameRegistry.register(blockDimDoorGold = new BlockDimDoorGold()); - GameRegistry.register(blockDimDoorChaos = new BlockDimDoorUnstable()); + GameRegistry.register(blockDimDoorChaos = new BlockDimDoorChaos()); GameRegistry.register(blockDimDoorWarp = new BlockDimDoorWarp()); GameRegistry.register(blockDimDoor = new BlockDimDoor()); GameRegistry.register(blockDimHatch = new BlockTransTrapdoor()); diff --git a/src/main/java/com/zixiken/dimdoors/shared/items/ItemRiftBlade.java b/src/main/java/com/zixiken/dimdoors/shared/items/ItemRiftBlade.java index f89731ab..544ec4ce 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/items/ItemRiftBlade.java +++ b/src/main/java/com/zixiken/dimdoors/shared/items/ItemRiftBlade.java @@ -50,6 +50,7 @@ public class ItemRiftBlade extends ItemSword { if (world.isRemote) { return new ActionResult(EnumActionResult.FAIL, stack); } + //SchematicHandler.Instance.getPersonalPocketTemplate().place(0, 20, 0, 20, 0, 0, 1, EnumPocketType.DUNGEON); //this line can be activated for testing purposes RayTraceResult hit = rayTrace(world, player, true); if (RayTraceHelper.isRift(hit, world)) { EnumActionResult canDoorBePlacedOnGroundBelowRift @@ -59,7 +60,7 @@ public class ItemRiftBlade extends ItemSword { stack.damageItem(1, player); } return new ActionResult(canDoorBePlacedOnGroundBelowRift, stack); - + } else if (RayTraceHelper.isLivingEntity(hit)) { TeleportHelper.teleport(player, new Location(world, hit.getBlockPos())); //@todo teleport to a location 1 or 2 blocks distance from the entity return new ActionResult(EnumActionResult.PASS, stack); diff --git a/src/main/java/com/zixiken/dimdoors/shared/tileentities/DDTileEntityBase.java b/src/main/java/com/zixiken/dimdoors/shared/tileentities/DDTileEntityBase.java index 4089be7e..b0c8db7d 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/tileentities/DDTileEntityBase.java +++ b/src/main/java/com/zixiken/dimdoors/shared/tileentities/DDTileEntityBase.java @@ -12,6 +12,7 @@ import net.minecraft.world.World; public abstract class DDTileEntityBase extends TileEntity { + public boolean canRiftBePaired = true; private boolean isPaired = false; private int riftID = -1; //should not start at 0 private int pairedRiftID = -1; diff --git a/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorChaos.java b/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorChaos.java new file mode 100644 index 00000000..3ce617af --- /dev/null +++ b/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorChaos.java @@ -0,0 +1,18 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.zixiken.dimdoors.shared.tileentities; + +/** + * + * @author Robijnvogel + */ +public class TileEntityDimDoorChaos extends TileEntityDimDoor { + + public TileEntityDimDoorChaos() { + canRiftBePaired = true; + } + +} diff --git a/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorPersonal.java b/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorPersonal.java new file mode 100644 index 00000000..130c98db --- /dev/null +++ b/src/main/java/com/zixiken/dimdoors/shared/tileentities/TileEntityDimDoorPersonal.java @@ -0,0 +1,18 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.zixiken.dimdoors.shared.tileentities; + +/** + * + * @author Robijnvogel + */ +public class TileEntityDimDoorPersonal extends TileEntityDimDoor { + + public TileEntityDimDoorPersonal() { + canRiftBePaired = true; + } + +} diff --git a/src/main/java/com/zixiken/dimdoors/shared/util/Schematic.java b/src/main/java/com/zixiken/dimdoors/shared/util/Schematic.java index 1eaa3f95..bb0a3a4a 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/util/Schematic.java +++ b/src/main/java/com/zixiken/dimdoors/shared/util/Schematic.java @@ -35,9 +35,9 @@ public class Schematic { private static final String[] NEWDIMDOORBLOCKNAMES = new String[]{ "blockDimDoor", - "blockDimWall", //I think [type=fabric] is the default blockstate + "blockDimWall", //[type=fabric] is the default blockstate "blockDimDoorTransient", - "blockDimDoorWarp"}; //@todo make these lists complete, possibly with specific blockstate as well? + "blockDimDoorWarp"}; int version = Integer.parseInt("1"); //@todo set in build.gradle ${spongeSchematicVersion} String author = "DimDoors"; //@todo set in build.gradle ${modID} @@ -121,7 +121,7 @@ public class Schematic { blockstate = getBlockStateWithProperties(block, properties); } else { } - schematic.pallette.add(blockstate); + schematic.pallette.add(blockstate); //@todo, can we assume that a schematic file always has all palette integers used from 0 to pallettemax-1? } if (nbt.hasKey("PaletteMax")) { //PaletteMax is not required schematic.paletteMax = nbt.getInteger("PaletteMax"); @@ -175,6 +175,7 @@ public class Schematic { Map paletteMap = new HashMap(); for (int i = 0; i < schematic.pallette.size(); i++) { IBlockState state = schematic.pallette.get(i); + DimDoors.log(Schematic.class, "Saving BlockState: " + state.toString()); String blockStateString = getBlockStateStringFromState(state); paletteNBT.setInteger(blockStateString, i); } @@ -214,7 +215,7 @@ public class Schematic { if (property != null) { Comparable value = null; for (Comparable object : property.getAllowedValues()) { - if (object.equals(entry.getValue())) { + if (object.toString().equals(entry.getValue())) { value = object; break; } @@ -228,19 +229,26 @@ public class Schematic { } private static String getBlockStateStringFromState(IBlockState state) { - String blockNameString = state.getBlock().getLocalizedName(); //@todo, check if this is the correct method + Block block = state.getBlock(); + String blockNameString = "" + Block.REGISTRY.getNameForObject(block); String blockStateString = ""; String totalString; - if (state.equals(state.getBlock().getDefaultState())) { + IBlockState defaultState = block.getDefaultState(); + if (state == defaultState) { totalString = blockNameString; - } else { - BlockStateContainer container = state.getBlock().getBlockState(); - container.getProperties(); - for (IProperty property : container.getProperties()) { - String firstHalf = property.getName(); - String secondHalf = state.getProperties().get(property).toString(); - String propertyString = firstHalf + "=" + secondHalf; - blockStateString += propertyString + ","; + } else { //there is at least one property not equal to the default state's property + BlockStateContainer container = block.getBlockState(); + for (IProperty property : container.getProperties()) { //for every property that is valid for this type of Block + String defaultPropertyValue = defaultState.getProperties().get(property).toString(); + String thisPropertyValue = state.getProperties().get(property).toString(); + if (defaultPropertyValue.equals(thisPropertyValue)) { + //do nothing + } else { + String firstHalf = property.getName(); + String secondHalf = state.getProperties().get(property).toString(); + String propertyString = firstHalf + "=" + secondHalf; + blockStateString += propertyString + ","; + } } blockStateString = blockStateString.substring(0, blockStateString.length() - 1); //removes the last comma totalString = blockNameString + "[" + blockStateString + "]"; @@ -300,7 +308,7 @@ public class Schematic { return tileEntities; } - public static Schematic loadOldDimDoorSchematicFromNBT(NBTTagCompound nbt) { //@todo, maybe make this a separate class, so values can be final so they HAVE TO be set in a newly designed constructor + public static Schematic loadOldDimDoorSchematicFromNBT(NBTTagCompound nbt) { //@todo, maybe make this a separate class, so values can be final so they HAVE TO be set in a newly designed constructor? Schematic schematic = new Schematic(); //schematic.version = 1; //already the default value @@ -315,7 +323,8 @@ public class Schematic { //schematic.offset = new int[]{0, 0, 0}; //already the default value NBTTagList paletteNBT = (NBTTagList) nbt.getTag("Palette"); - for (int i = 0; i <= paletteNBT.tagCount(); i++) { + for (int i = 0; i < paletteNBT.tagCount(); i++) { + DimDoors.log(Schematic.class, "reading pallete from schematic... i = " + i); String blockString = paletteNBT.getStringTagAt(i); boolean isAncientFabric = false; if (blockString.startsWith("dimdoors")) { @@ -332,13 +341,12 @@ public class Schematic { Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockString)); blockstate = block.getDefaultState(); } else { - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("blockDimWall")); + Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("dimdoors:blockDimWall")); blockstate = getBlockStateWithProperties(block, new String[]{"type=ancient"}); } schematic.pallette.add(blockstate); } - //check whether or not this blockstate is already in the list byte[] blockIntArray = nbt.getByteArray("Blocks"); byte[] dataIntArray = nbt.getByteArray("Data"); schematic.blockData = new int[schematic.width][schematic.height][schematic.length]; @@ -347,19 +355,20 @@ public class Schematic { for (int z = 0; z < schematic.length; z++) { int blockInt = blockIntArray[x + z * schematic.width + y * schematic.width * schematic.length]; //according to the documentation on https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-1.md int metadata = dataIntArray[x + z * schematic.width + y * schematic.width * schematic.length]; //according to the documentation on https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-1.md - if (metadata != 0) { - IBlockState basesState = schematic.pallette.get(blockInt); //this is needed for the various "types" that a block can have - IBlockState additionalState = basesState.getBlock().getStateFromMeta(metadata); - for (IProperty property : basesState.getProperties().keySet()) { - Comparable value = basesState.getProperties().get(property); - additionalState = additionalState.withProperty(property, value); - } - if (schematic.pallette.contains(additionalState)) { + + IBlockState baseState = schematic.pallette.get(blockInt); //this is the default blockstate except for ancient fabric + if (baseState == baseState.getBlock().getDefaultState()) { //should only be false if {@code baseState} is ancient fabric + IBlockState additionalState = baseState.getBlock().getStateFromMeta(metadata); + if (schematic.pallette.contains(additionalState)) { //check whether or not this blockstate is already in the list blockInt = schematic.pallette.indexOf(additionalState); } else { schematic.pallette.add(additionalState); + DimDoors.log(Schematic.class, "New blockstate detected. Original blockInt = " + blockInt + " and baseState is " + baseState.toString()); blockInt = schematic.pallette.size() - 1; } + } else { //if this is ancient fabric + //DimDoors.log(Schematic.class, "Non-default blockstate in palette detected. Original blockInt = " + blockInt + " and baseState is " + baseState.toString()); //@todo should only print a line on load of ancient fabric + blockInt = schematic.pallette.indexOf(baseState); } schematic.blockData[x][y][z] = blockInt; } @@ -378,7 +387,7 @@ public class Schematic { private static String convertOldDimDoorsBlockNameToNewDimDoorsBlockName(String dimdoorsBlockName) { if (OLDDIMDOORBLOCKNAMES.length != NEWDIMDOORBLOCKNAMES.length) { - DimDoors.warn(Schematic.class, "The array of old dimdoors block names, somehow isn't the same length as the array of new names, therefore the dimdoors blocks in this schematic will not be loaded."); + DimDoors.warn(Schematic.class, "The array of old dimdoors block names somehow isn't the same length as the array of new names, therefore the dimdoors blocks in this schematic will not be loaded. This is a bug in the DimDoors mod itself."); return null; } diff --git a/src/main/resources/assets/dimdoors/pockets/schematic/defaultPersonal_5.schematic b/src/main/resources/assets/dimdoors/pockets/schematic/defaultPersonal_5.schematic index de2d9c74264d12d200978559a5eaf31c900afcdd..903b9d1a5547b54cdf9715bddf157b5372369cb0 100644 GIT binary patch literal 1480 zcmZuv2{hCR7+0uGHb>JUMv%I=N2*Te~QE`sU6o0D~)p`_bkh7jhfxo=jZP*d^AH;yCj>cEjp zfQu&(Uk)P_8CrN#d;`1ca%9K@fWsP+Ys8gEi#aH86vYlC$ z45Q_cH{{@xx6*t<-imVUI1D@Qh1q`D!^DHG`G-r*H)YO;iglS3Q$X*ZQF%T`Od5fz z`g1+ue_TKdml(c+iU_5o#CTlTt^~tVL94qfOpw z?Vx=VD(3V@{eS2Gk0I)ERvft|%)`gm5aJ?iSzFSdC}ste`e%St(%9|tp1CdKL_8@N z>oPDS_a*W7Q||epV+YVTJhoSbb8_<6>g3#z!}l@vk+UP>Z!*tgeT*1z^7otNq{nE4 z@vl0~?4g3EGf8FR?efE!@`R|x7inL+{D8c@B@>L69L3z>Gn1EERz_UmeQ3n+Qf%OC zNig!o4jy5U7qDjP?6iG2(k|u#yN$TEJmbmZS{FtVeNy=8aw9Wb;awJ28jj`q-V8KJ z67MdSG9cE}t+${Owv6Vrd7(kMHUXb>o7d(AjDYbUJ!Vo+-y3}JhjphxXntLaB5;l) zyxMD>-)!W?j@D^M$oPII{bkAj(GKc3PVp^?n5YnS(@%}eoh=JTT3d%TcJsG2rTx43 z&da8v0N5TU)ulqpa=L_<-E}JCj+HK#^_N~IyOg{7X;SVyLMl7}$+e)g2axET_8MHH zFP>(hhqA|;d?PNZ00*EFKoR`vLYEK4T({n7@StyB?(uj4nFYVf($7$JZs>!6p-Nr%Nv=K4&3^vKW>dX>OT7a) zBBbx$T(R9p7Z>eJSVwEyqxNa5-o%o{obi-7yghGILoku!^*%eoE&=+Jjh@R&Yk&@x zPEfmcEW!w2*e<@S$a;94?7omgCR3F%tAhvK<&^Zxafk<4WY~t$L)eMB%}UyItE+F< z%CU&k0Gv8L|y7eO^AA6fXxe^&6Stsgg$Yb;Z)t?lbkNW$qqWBoHfzwEX+=^zI+3c3ZXt{})NE)AAPC~LA*sp}Ty$;=l_{u<(K$)$+&B+CV=;3Wut)KM_?G=hff~LI5??5sNKdzvIeQo;>>* zaSCTgezqGaSPo8_g*l5|umkA3SHdL$jZo_SOidiIm@u-D>f7O^YizE9ZgG3PN^3M> zt~6iK5DXH!9g3E@kTi%1rIiMfvRVhE`mU8iBJ#jg8EU(jJTlBNVXx?pBxQo%a0#4> z2O8x%_Nqq44X*y8qBVu_R0b2wEy);)aq^VCbp`05NnP>e?Y^F>nY9PL^;k0!;%(g1VnZS~z7pNAc+m=OEk%c>w^!s&aHzYT z^H^bi>Z?eH&<5jYE|=B*`Te#D5@E07UhH2bex&e~Nv)lArvL1Hvt^gP3cPHtSz9p` zY(9{`Uhmm~q{mndRAY9!93mb+QZ-EALyw ztU;#}x-+eQyi9}|DQU!W7;}Ee%@vC=8W)n*ZfVG*H2-V^?>*U-y4v@4cwd z(5*|ms&c1#g+^^X=XQV3FPjV3!>zt-4b=+G44u|1w{BJM`Rvdu*{efVU0S6hZ5t8F z+`lg*aQ)h#m0qhi<$MVU&8?LAb4zRLsx4Zl-S|VV9y{(P`W4O(5#L<%b64N1C}gql z)i#m8U#)^#J2iDN`>L=1?`^mUbl5hK9U(vGE%aKtYcklted#NLR=!(uYSYE$sn^|s z&e**IXl=pM=RBcWS7k#Y&8obg{4WcT5Ew0P+qm-df3X4rJ@BFj!roM|^sz3Yc?#J%(^2_A+tGu6n+Vz+8&5eSs&m@=_07^oz Ai2wiq