From 2821f7b1e11af40d4a7978fbdf069b1230ef41fb Mon Sep 17 00:00:00 2001 From: Calclavia Date: Wed, 26 Feb 2014 15:31:00 +0800 Subject: [PATCH] Added mechanical piston --- .../resonantinduction/archaic/Archaic.java | 2 +- .../archaic/piston/RenderPiston.java | 52 ------ .../archaic/process/BlockMillstone.java | 2 +- .../mechanical/Mechanical.java | 5 +- .../mechanical/gear/PartGear.java | 1 + .../mechanical/network/TileMechanical.java | 11 ++ .../crusher/BlockMechanicalPiston.java | 51 ++++++ .../crusher/RenderMechanicalPiston.java | 65 +++++++ .../process/crusher/TileMechanicalPiston.java | 170 ++++++++++++++++++ .../process/grinder/RenderGrinderWheel.java | 3 +- .../core/resource}/ItemHandCrank.java | 2 +- .../models/Archive/{Machines => }/Armbot.tcn | Bin src/main/models/Archive/ConstructionPump.tcn | Bin 1754 -> 0 bytes .../{Machines => }/CrusherSingleBlock.tcn | Bin .../{Machines => }/GrinderSingleBlock.tcn | Bin src/main/models/Archive/rejected/Pump3.tcn | Bin 896 -> 0 bytes src/main/models/Archive/rejected/PumpV2.tcn | Bin 2524 -> 0 bytes .../models/Archive/rejected/something.tcn | Bin 827 -> 0 bytes src/main/models/incomplete/battery box.tcn | Bin 681 -> 0 bytes src/main/models/incomplete/battery.tcn | Bin 644 -> 0 bytes src/main/models/incomplete/batteryBox.tcn | Bin 702 -> 0 bytes src/main/models/mechanical/Rejector.tcn | Bin 7187 -> 7188 bytes .../languages/en_US.properties | 1 + .../resonantinduction/models/rejector.tcn | Bin 0 -> 7188 bytes 24 files changed, 308 insertions(+), 57 deletions(-) delete mode 100644 archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java create mode 100644 mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java create mode 100644 mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java create mode 100644 mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java rename {mechanical/src/main/java/resonantinduction/mechanical/gear => src/main/java/resonantinduction/core/resource}/ItemHandCrank.java (74%) rename src/main/models/Archive/{Machines => }/Armbot.tcn (100%) delete mode 100644 src/main/models/Archive/ConstructionPump.tcn rename src/main/models/Archive/{Machines => }/CrusherSingleBlock.tcn (100%) rename src/main/models/Archive/{Machines => }/GrinderSingleBlock.tcn (100%) delete mode 100644 src/main/models/Archive/rejected/Pump3.tcn delete mode 100644 src/main/models/Archive/rejected/PumpV2.tcn delete mode 100644 src/main/models/Archive/rejected/something.tcn delete mode 100644 src/main/models/incomplete/battery box.tcn delete mode 100644 src/main/models/incomplete/battery.tcn delete mode 100644 src/main/models/incomplete/batteryBox.tcn create mode 100644 src/main/resources/assets/resonantinduction/models/rejector.tcn diff --git a/archaic/src/main/java/resonantinduction/archaic/Archaic.java b/archaic/src/main/java/resonantinduction/archaic/Archaic.java index 6cace077..3ed16db5 100644 --- a/archaic/src/main/java/resonantinduction/archaic/Archaic.java +++ b/archaic/src/main/java/resonantinduction/archaic/Archaic.java @@ -28,7 +28,7 @@ import resonantinduction.core.ResonantInduction; import resonantinduction.core.Settings; import resonantinduction.core.TabRI; import resonantinduction.core.prefab.imprint.ItemImprint; -import resonantinduction.mechanical.gear.ItemHandCrank; +import resonantinduction.core.resource.ItemHandCrank; import calclavia.lib.content.ContentRegistry; import calclavia.lib.network.PacketAnnotation; import calclavia.lib.network.PacketHandler; diff --git a/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java b/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java deleted file mode 100644 index 3404924c..00000000 --- a/archaic/src/main/java/resonantinduction/archaic/piston/RenderPiston.java +++ /dev/null @@ -1,52 +0,0 @@ -package resonantinduction.archaic.piston; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import resonantinduction.core.Reference; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderPiston extends TileEntitySpecialRenderer -{ - public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "piston.png"); - - @Override - public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) - { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - - // Angle in radians of the rotor. - float angle = 0; - float radius = 0; - // Length of piston arm - float length = 0.8f; - - double beta = Math.asin((radius * Math.sin(angle)) / length); - - /** - * Render Piston Arm - */ - GL11.glPushMatrix(); - double pistonTranslateX = 2 * length * Math.cos(beta); - double pistonTranslateY = 2 * length * Math.sin(beta); - - GL11.glTranslated(pistonTranslateX, 0, pistonTranslateY); - GL11.glRotated(Math.toDegrees(beta), 0, 0, 1); - GL11.glPopMatrix(); - - /** - * Render Piston Rotor - */ - GL11.glPushMatrix(); - GL11.glRotated(Math.toDegrees(angle), 0, 0, 1); - GL11.glPopMatrix(); - - GL11.glPopMatrix(); - } -} \ No newline at end of file diff --git a/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java b/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java index dd42a193..3e451c7e 100644 --- a/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java +++ b/archaic/src/main/java/resonantinduction/archaic/process/BlockMillstone.java @@ -9,7 +9,7 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import resonantinduction.core.Reference; -import resonantinduction.mechanical.gear.ItemHandCrank; +import resonantinduction.core.resource.ItemHandCrank; import universalelectricity.api.vector.Vector3; import calclavia.lib.prefab.block.BlockTile; import calclavia.lib.utility.inventory.InventoryUtility; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java index 102b7c78..89db4854 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/Mechanical.java @@ -23,7 +23,6 @@ import resonantinduction.mechanical.fluid.transport.TileGrate; import resonantinduction.mechanical.fluid.transport.TilePump; import resonantinduction.mechanical.gear.ItemGear; import resonantinduction.mechanical.gear.ItemGearShaft; -import resonantinduction.mechanical.gear.ItemHandCrank; import resonantinduction.mechanical.logistic.belt.BlockDetector; import resonantinduction.mechanical.logistic.belt.BlockManipulator; import resonantinduction.mechanical.logistic.belt.BlockRejector; @@ -33,6 +32,8 @@ import resonantinduction.mechanical.logistic.belt.TileRejector; import resonantinduction.mechanical.network.PacketNetwork; import resonantinduction.mechanical.process.BlockFilter; import resonantinduction.mechanical.process.TileFilter; +import resonantinduction.mechanical.process.crusher.BlockMechanicalPiston; +import resonantinduction.mechanical.process.crusher.TileMechanicalPiston; import resonantinduction.mechanical.process.grinder.BlockGrindingWheel; import resonantinduction.mechanical.process.grinder.TileGrinderWheel; import resonantinduction.mechanical.process.purifier.BlockMixer; @@ -104,6 +105,7 @@ public class Mechanical public static Block blockGrinderWheel; public static Block blockPurifier; public static Block blockFilter; + public static Block blockMechanicalPiston; public static final PacketNetwork PACKET_NETWORK = new PacketNetwork(IMechanical.class, Reference.CHANNEL); @@ -134,6 +136,7 @@ public class Mechanical blockGrinderWheel = contentRegistry.createTile(BlockGrindingWheel.class, TileGrinderWheel.class); blockPurifier = contentRegistry.createTile(BlockMixer.class, TileMixer.class); blockFilter = contentRegistry.createTile(BlockFilter.class, TileFilter.class); + blockMechanicalPiston = contentRegistry.createTile(BlockMechanicalPiston.class, TileMechanicalPiston.class); OreDictionary.registerOre("gear", itemGear); proxy.preInit(); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java index 36823c79..5b4de9c0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -14,6 +14,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import resonantinduction.api.mechanical.IMechanical; import resonantinduction.core.Reference; +import resonantinduction.core.resource.ItemHandCrank; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.network.PartMechanical; import calclavia.lib.multiblock.reference.IMultiBlockStructure; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index e9ac2e87..da756f28 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -46,6 +46,12 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical angle += angularVelocity / 20; + if (angle % (Math.PI * 2) != angle) + { + revolve(angle <= Math.PI * 2 || angle >= Math.PI * 2); + angle = (float) (angle % (Math.PI * 2)); + } + if (!worldObj.isRemote) { torque *= getLoad(); @@ -65,6 +71,11 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical } } + protected void revolve(boolean isAmplitude) + { + + } + public long getPower() { return (long) (torque * angularVelocity); diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java new file mode 100644 index 00000000..b589a0eb --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/BlockMechanicalPiston.java @@ -0,0 +1,51 @@ +package resonantinduction.mechanical.process.crusher; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import resonantinduction.core.Reference; +import resonantinduction.core.render.RIBlockRenderingHandler; +import calclavia.lib.prefab.block.BlockRotatable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * A block used to build machines. + * + * @author Calclavia + * + */ +public class BlockMechanicalPiston extends BlockRotatable +{ + public BlockMechanicalPiston(int id) + { + super(id, Material.wood); + setTextureName(Reference.PREFIX + "material_steel_dark"); + rotationMask = Byte.parseByte("111111", 2); + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderType() + { + return RIBlockRenderingHandler.ID; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileMechanicalPiston(); + } +} diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java new file mode 100644 index 00000000..4d9031fe --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java @@ -0,0 +1,65 @@ +package resonantinduction.mechanical.process.crusher; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import calclavia.lib.render.RenderUtility; +import resonantinduction.core.Reference; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderMechanicalPiston extends TileEntitySpecialRenderer +{ + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "rejector.tcn"); + public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "rejector.png"); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) + { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); + TileMechanicalPiston tile = (TileMechanicalPiston) tileEntity; + GL11.glRotated(-90, 0, 1, 0); + + if (tile.worldObj != null) + RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); + + RenderUtility.bind(TEXTURE); + + // Angle in radians of the rotor. + float angle = tile.angle; + float radius = 0.5f; + // Length of piston arm + float length = 1f; + + double beta = Math.asin((radius * Math.sin(angle)) / length); + + /** + * Render Piston Rod + */ + GL11.glPushMatrix(); + double pistonTranslateX = 2 * length * Math.cos(beta); + double pistonTranslateY = 2 * length * Math.sin(beta); + + GL11.glTranslated(pistonTranslateX, 0, pistonTranslateY); + GL11.glRotated(Math.toDegrees(beta), 0, 0, 1); + GL11.glPopMatrix(); + + /** + * Render Piston Rotor + */ + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, (0.5 * Math.cos(angle)) - 0.5); + MODEL.renderOnly("PistonShaft", "PistonFace", "PistonFace2"); + GL11.glPopMatrix(); + + MODEL.renderAllExcept("PistonShaft", "PistonFace", "PistonFace2"); + GL11.glPopMatrix(); + } +} \ No newline at end of file diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java new file mode 100644 index 00000000..92205d99 --- /dev/null +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java @@ -0,0 +1,170 @@ +package resonantinduction.mechanical.process.crusher; + +import java.lang.reflect.Method; + +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.mechanical.network.TileMechanical; +import universalelectricity.api.vector.Vector3; +import calclavia.lib.utility.MovementUtility; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.relauncher.ReflectionHelper; + +public class TileMechanicalPiston extends TileMechanical +{ + @Override + public void updateEntity() + { + super.updateEntity(); + + Vector3 movePosition = new Vector3(this).translate(getDirection()); + Vector3 moveNewPosition = movePosition.clone().translate(getDirection()); + + if (!canMove(movePosition, moveNewPosition)) + angle = 0; + } + + @Override + protected void revolve(boolean isAmplitude) + { + if (!worldObj.isRemote && isAmplitude) + { + Vector3 movePosition = new Vector3(this).translate(getDirection()); + Vector3 moveNewPosition = movePosition.clone().translate(getDirection()); + + if (canMove(movePosition, moveNewPosition)) + move(movePosition, moveNewPosition); + } + } + + public boolean canMove(Vector3 from, Vector3 to) + { + TileEntity tileEntity = from.getTileEntity(worldObj); + + if (to.getTileEntity(worldObj) == this) + { + return false; + } + + /** Check Target */ + int targetBlockID = to.getBlockID(worldObj); + + if (!(worldObj.isAirBlock(to.intX(), to.intY(), to.intZ()) || (targetBlockID > 0 && (Block.blocksList[targetBlockID].isBlockReplaceable(worldObj, to.intX(), to.intY(), to.intZ()))))) + { + return false; + } + + return true; + } + + public void move(Vector3 from, Vector3 to) + { + int blockID = from.getBlockID(worldObj); + int blockMetadata = from.getBlockMetadata(worldObj); + + TileEntity tileEntity = from.getTileEntity(worldObj); + + NBTTagCompound tileData = new NBTTagCompound(); + + if (tileEntity != null) + { + tileEntity.writeToNBT(tileData); + } + + MovementUtility.setBlockSneaky(worldObj, from, 0, 0, null); + + if (tileEntity != null && tileData != null) + { + /** + * Forge Multipart Support. Use FMP's custom TE creator. + */ + boolean isMultipart = tileData.getString("id").equals("savedMultipart"); + + TileEntity newTile = null; + + if (isMultipart) + { + try + { + Class multipart = Class.forName("codechicken.multipart.MultipartHelper"); + Method m = multipart.getMethod("createTileFromNBT", World.class, NBTTagCompound.class); + newTile = (TileEntity) m.invoke(null, worldObj, tileData); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + newTile = TileEntity.createAndLoadEntity(tileData); + } + + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, newTile); + + if (newTile != null && isMultipart) + { + try + { + // Send the description packet of the TE after moving it. + Class multipart = Class.forName("codechicken.multipart.MultipartHelper"); + multipart.getMethod("sendDescPacket", World.class, TileEntity.class).invoke(null, worldObj, newTile); + + // Call onMoved event. + Class tileMultipart = Class.forName("codechicken.multipart.TileMultipart"); + tileMultipart.getMethod("onMoved").invoke(newTile); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + else + { + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, null); + } + + notifyChanges(from); + notifyChanges(to); + } + + public void notifyChanges(Vector3 pos) + { + worldObj.notifyBlocksOfNeighborChange(pos.intX(), pos.intY(), pos.intZ(), pos.getBlockID(worldObj)); + + TileEntity newTile = pos.getTileEntity(worldObj); + + if (newTile != null) + { + if (Loader.isModLoaded("BuildCraft|Factory")) + { + /** + * Special quarry compatibility code. + */ + try + { + Class clazz = Class.forName("buildcraft.factory.TileQuarry"); + + if (clazz == newTile.getClass()) + { + ReflectionHelper.setPrivateValue(clazz, newTile, true, "isAlive"); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } + + @Override + public boolean canConnect(ForgeDirection from, Object source) + { + return from != getDirection(); + } +} diff --git a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java index a56e55fc..1709bae0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/process/grinder/RenderGrinderWheel.java @@ -8,6 +8,7 @@ import static org.lwjgl.opengl.GL11.glTranslatef; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.common.ForgeDirection; import resonantinduction.core.Reference; @@ -22,7 +23,7 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderGrinderWheel extends TileEntitySpecialRenderer { - public static final WavefrontObject MODEL = (WavefrontObject) AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "grinder.obj"); + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "grinder.obj"); @Override public void renderTileEntityAt(TileEntity t, double x, double y, double z, float f) diff --git a/mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java b/src/main/java/resonantinduction/core/resource/ItemHandCrank.java similarity index 74% rename from mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java rename to src/main/java/resonantinduction/core/resource/ItemHandCrank.java index d45f8493..9eb29466 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/gear/ItemHandCrank.java +++ b/src/main/java/resonantinduction/core/resource/ItemHandCrank.java @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.gear; +package resonantinduction.core.resource; import net.minecraft.item.Item; diff --git a/src/main/models/Archive/Machines/Armbot.tcn b/src/main/models/Archive/Armbot.tcn similarity index 100% rename from src/main/models/Archive/Machines/Armbot.tcn rename to src/main/models/Archive/Armbot.tcn diff --git a/src/main/models/Archive/ConstructionPump.tcn b/src/main/models/Archive/ConstructionPump.tcn deleted file mode 100644 index b48de93843be7d445f4d610a661c9473f36f20ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmbVNc{J1u6#gL!6DnB_Z(_3a?2#-POVMVV2xXVXl4T~#jI{}6D^IA<*g9dJ$UIRD zW-8KTourXz7$NHzvdj!&=6U_mIj?ixIq$u5&%NKd=iKxC^?mn)*$VBD1^{3e@IXKN z_yz^=_7((yk-Y#Q3a9{Kh|BO$otUstF+gei2mk~CIiOWkcc#sxPvB={6^w?^^`yw7 zJ2wv8E}hg^&NddNzB6oCRrUyKlZ$trw;dlFvT|)kVYXCg)cGT-zu5MQsi~|jkkpIs zN~#|;O^Yc`VegMAlv%&YDj}d&mr~&U-NhGV&Av&rAf!L0O585It|_r>lyNBB-9@ge z0Oz5c<~){K(VhoMs`)^1ys!G%YTnp$Xka9ONgbpe^`Sj;(6Ff6TdVJSKd0}US_h`+ zBwDCLWC!L5cozGFCZn~~bkA93S}&?oKdLVUIlFdCFG}V{(u72=vAl{FNa&J>3H>xn z%l>7(!ojMr&Vk(q-6qmaJ#O-M`+?5vVFHwEdvW3yeCi0rASqveI>L+cw4vU`*xb{E zs7;oVz4BXpdhNwZ&a+9nvky*k8Gp2`Yk0uUsZX47SKiTf9Zt})vUX6aMw?}Zv{V$z zz}*p`9F5XT6T!0!V*Q^i{Tt8MugY3SC?1Dd);)J$iWTC#&ee}z_EZ(?ZSLE)f$$GbIoqQ(mbh9_QoLxpd@ow{TVvcLqMEy<{#uS>O zBk3rLI+ZqkoFu|2BSM273Wh~VAIbmSkasM|d|67KB-o%Vw%KRu&d(hb2rj8%KpFjS z&zOFKJv$juRBz?BW#>1=Er?E`g*Z4Q7wK4ux4(d7jR)p~SJki`T6y-;dkiP?g2zi$ zgK|jW4=-3?PeVhf$s>DmeVoreLT0j|cF|QS3XP^|X_d|r++R0aNB-Dv9ifX2&^~m{ zQtJWD-p%=uGPd00b&>YXe(HSH6>5d+ssik9LR~xz&H@Pm0A#zRwuK6d4nrD5!DFJL zBj7s7@W6kgS0?CdRaG!}pCP!g7%e5?IaOeUF3AnTrM}!#XXELnQP{XB-F&D#)+=~c$Xj90 zo7W}ZzK|J_4E$j16;2Fiek2l+|5Q)OGS+%*BIAX+7@zNUb?%fgH>bg_s!SLp0MeDq zzZk{B@Nl$Ct~R}ODFWhC3F2FA`q^WBc9pWK@Hbd^Ac=UjKB8-q$DIw9 ze5mgZoBBnfv~q9X z67d^{$RTQW90;|bo73s2fSJ0chRE2!CyEf}m%v5Z-N=BhEPMA^*Vyb)aLX#GSL2M2 zNn$m0f)Ke8!}jKSb!HA9B-l{&MpFSaN%bnxm38ewG#lAMelwa2d$IyVPy`^&mx z6fl~Y1eTq6OOb?mP*59b&n* z+fFIm+Jw8oV7qWOR=hFQ0n35A0$vK4_wd^z9vcrXk~?pmQzGH2OS?^RH`D-_t$?65 s@XtZ;{rUeG|0x!JrvBNwKUjgP?d17CMuyo6i~PkRxLw3;-1&X`6RQz5UH||9 diff --git a/src/main/models/Archive/Machines/CrusherSingleBlock.tcn b/src/main/models/Archive/CrusherSingleBlock.tcn similarity index 100% rename from src/main/models/Archive/Machines/CrusherSingleBlock.tcn rename to src/main/models/Archive/CrusherSingleBlock.tcn diff --git a/src/main/models/Archive/Machines/GrinderSingleBlock.tcn b/src/main/models/Archive/GrinderSingleBlock.tcn similarity index 100% rename from src/main/models/Archive/Machines/GrinderSingleBlock.tcn rename to src/main/models/Archive/GrinderSingleBlock.tcn diff --git a/src/main/models/Archive/rejected/Pump3.tcn b/src/main/models/Archive/rejected/Pump3.tcn deleted file mode 100644 index 36082c36ca433f92aaa95f582ec8c76308939e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmWIWW@Zs#U|`^2sI)P23i|DM{0I{RgQyw<11EzDLvDUbYK~q-ZVnfN0#FeH10#b3 zgJIq@=D9!4GNRLOX9e~zG7va^Uw`NOgbKEaT#G!Xr(AuLCcnpc_0E`gyon)tUY;wf zcYlAmUiU=fYd86rre%s!Y0vH(U5P)oO>>^}hQ5VgnKPs&{_u0oT~Zmpe@oPly5rYc zs`e**7oNRSkvVz(!49VXe6~5$*6Q$NIxKGa_|9cV%E=EcEgL+a{=JuFSdnVYReq~v zyYH@@SN$GMo%VW1(Tn84I%#(3$g}$Nh1D#ZSl#Y(@qa&it&U0e+q4hvEzBbb};VLP~D=VZ6o^h`%@#|Ad6I)=r# zJvq&^W3!5vWT$B6eE+EMf@`)XXQsYB$7=EV<)196G>^h-D(8BnS#ntnnO9k?&a6tC z`)p11!k05wFMgIV?ds-rkJc!DJtO$_jnEv^HFHwu-0a%iR*-f_Dj_iNYM@6v5ES7n4BzqzvLn!y>jKlR08ty$~0 zO_P*LUwdsW?{3fRbGBKlR@B;M&)ppGIyTF&!6K74isy}I@NenT(5>ezUDuZHHuZg5 zaK&L(X;`4~9qF}M#gkU-KW9~Dan5@C#r!uLd2{wz>$J$5Z$5CpA^qi_M@@Hh9^JP{ znrE}D#kVrv<!zHeYk)e}({WMkZYb+!+F#3E%`t*(1Q4l?{@G N7#X6041Q)14*;6Jjq?Bi diff --git a/src/main/models/Archive/rejected/PumpV2.tcn b/src/main/models/Archive/rejected/PumpV2.tcn deleted file mode 100644 index ba009bf9ed0b0a56973ec5ec7ec9b83b411f88c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2524 zcmbW3c{Cf?9>;G)n#IysYbqrriqtli+6iJSC6vzCqqVdMNlS+sM8{BCrJItJ;2{;&;7}zv?p6D~xF% z)%`(n*^u}wk?#mu?%M}Cu7$RR9@SRX)(!HjY^oJj)6ZjTF;MyiRzcY-`6|BDb!onf zY-qZ>D@whKE<2gIBY;bLy3P^L&MV&9?Dd;zej~ATEz-w#>wc;0zWtuR!Bi0Jmc03( z6QzO{GU<^X?3a(J9W&FVDhasxx#(c$*8bDhQ=IinwPX1&3?>R{hwy0uIiK}aL{0mR zy_2#kHoM*CW9T7J*t1gO;UAuE)@mrP)T~QRV?z9h-)DR1IR_rS_Ug{`Pbupfhz)l4 zsAj>f;WzBbI4oZB>N&1+i05D=cVu@F)#w-|_T1Pj&oq2tb22H&>%C3X*zTo>DN?V( z^5{?QlVd@3uQ}(p&cs5@SSxFX8tqJdp%WjM{e4)bi-BH>8E?J&Tk27mMoYHAZ-d z;NSZw_EK`@;j|Tjb>qQIxm3gSmC@@MvwDGd5R$e+ihBIawfIrh5{h7Un}*SYvO`ib z`m54X7MqihdD3aUAi>n{`lg#O#|67n^GvXbMe2#&&ET8N4%h=&deVHt&CZKoifxE< zq9PmaatB#tZFkhEG865=)HMGq%$%qB&yR_AIbD_0^x2y949dTk<8zIumfXZot2?2U zy(nbB**dc}`U76ki5NxK`U1s-|F-@)K~b+e=cNHM4n z&*iqyvMWimM^?p3dhHqK%>7@}E_$!5={kC*-d(bJb=!GN#LGX|w0}#xo*T4tM?BPZ zPL#D`*D%80+`Y=>vRYti!smy|M4x;;ti-5hRs;yc*YFO9v9T`0Q4;sds^9O*e9$HR z!3ppWPDBj#WTo)~uxDrG}o;J@R7vH4G2{8f`l4%R}bgD4(V zgluhy&OD{>8DbxA>@e|t$&-Dj?W~F5>t4@oD!j#8K~inpE&w3hv1gF(up&R+B0Svo zge9B<;TJ{7rofh50pQ2j63tv9$CtB>gC|JhiT$eE@I-=%q-xHj@L|>JLg%m^k`m{* zrUIJF&YL=XD;VL22-kd`Zm-5Uo@>#7)a-hgJt&FtHqy`9k#+Y)jDC3T=eKBY> z?$>sZ4yySaws7&0YC!-__x>62Av|5_NmkieSO57n;kjQeAp`>r?RXbJea44*vD(lm zmtB!hV1}Kv+FicO3e%|M!!oalPM_mz;I&^7&*7 z6Jy<57V6rv9N4>s%s!*r$9+Po{EYE%$bxS0IhGLhz=(#U87T4T=rG6YbJhD{4 z3D(N51D-$)+&l@%ze%{UpiROVi0piKI)p{{L(^rz0t9=V4~w+d#l^eOdk!NXz_G|q z*c2ZXlHQ0Sh}yt-U+}L+UvD@6B~wLJ#i44qJUU9`>f`%d=j)DNdWPa3)i%dTFGga> zI&2ym@Bw~a(y5G}$`v94i^z?cxu!3_EDz0#RR{qM7%t4+#(A3sBSRq&o-2cp=_`yL zVWp#5#d*8Xylh0^-8dy|q?j%P&;))XRU^)7)haUbcC;R8)imzw`Cto#qktm~CUxic zOC0T3?cs-pEh9@_O&L9YxF1y~HD&IWzp0}eN)l{D`RM}G7*wT+>Q3ZL;m;lgupCJT z82xi8kO-C~H*_e5X#s488ukT5rD1G4X|z3OqS-XVm@uDvK?3>)H;Qm6#m~LcTnlq& z62khmQil>5%du-U(Ufm>})9w&w<(^L6T2 zRaE&<8)JG5J>vs8E^7yU<-SAeeDkmg4&Zo#i#SFCYHis%u%qIc=0C*}MAxxE zGI`x2!p=(I#|&#DAJm|EVNHUUBW%M);lms}c6*6QGz>F%kYHOIfB4s&z>nVEx&q8R z9Zbo`cAA+7Cu417$3@tkQIpU+yI;PqrmtN+lrevT65$d4v)UZ^nR}VRxWQ3xsDDz~ zuGHWOu}@{n9!S?b&{{zzqo`SCCN0rXW?~5Bdq_x&0HXN$w2flbuESK^r*DI-I%h;c z>ov+04c|A(a{JJ=pIc@M@1 Lns|yt?#=!Vy68dD diff --git a/src/main/models/Archive/rejected/something.tcn b/src/main/models/Archive/rejected/something.tcn deleted file mode 100644 index 080d6348ac5ea7e462f89ae3036e5cedbed83f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 827 zcmWIWW@Zs#U|`^2sBkfJs$QXzS9nxj{do5RJR08|8&V31%q z&i^QR>5sFF==9r}_w#2P2pqq!{!n0pv^`p38z@@6dovk5V$#SYT}7nxiqHP+J{WN+tM=`0`=DakC@dUzVT_n;`G}V z(xKNvr>*(w)qaX!r+s(F)1B(CMbu3HTTOk(cu9h#K2+|@S#up`-#uv+-4CRWZQEMZ z`+DMTqd7}oOL=!UCh{}cOR$_Nb)U9QRmUw?j%~qpDJ?fu&g5nD(&8VOMY>O@W^Q8V zyVLhOVC~Ck)6c%U7ToA;D*huPKg%q#5_`d(J&JFobsrst-Vjm(K%k(`&_Kj^M{yKD8ji7jUjvDBOkb9$-u tq3fQQwEeyO0B=SnT?X7~8JvFM1W747z?+o~lKL4LqJfN4z%0VR008inYf%6I diff --git a/src/main/models/incomplete/battery box.tcn b/src/main/models/incomplete/battery box.tcn deleted file mode 100644 index d8e3c81b78a35f12cd918cce7a29f9e1ff3727b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmWIWW@Zs#U|`^2c$c}?Nxz z4S#(D_mmv3)vYWAtTCKBMe`JY2$llfNB0#UmI+57Eo zUpc)YJo7HU+QVf@K|z--y`W_;&aD ztEP9m@^1gNi~g~ycwzjT;OUCCk6&ykF4A8%I6Is4zTwHunN zXGw}L5?pu2Xx^vvNUs3-XVp(M<)lycKCci;lsPKgr1O+>zSPsZ^N-HUI`^N^_n2Vc zBtu8G%CD~C`{wF5)tu@SHTr20b>V|%#$k?G=Z?LwaP(fB(%@)q&zdXYID5u|hmZd( zdbwmNGj~)K*R6miGs#c(>W=f5nH7bfEe?Arto%2_kw5pZp(Z_R-vL zadA$r#WYSM=M?jPrE~?`ExMH=9}YeIT6cEZ0`@5WZ%xnipJZKsEwt{CO7^kr6Rg@( uuYPUJp1W6v2HYtJoLb-nN$DuSo0SculMx7`fwTn^hz9^~862tr diff --git a/src/main/models/incomplete/battery.tcn b/src/main/models/incomplete/battery.tcn deleted file mode 100644 index 89f2eaf30da0711bede93b23478c9b97e68bf151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmWIWW@Zs#U|`^22+Q2-WVG4y$_YjWhTUuo44e!q47vF!sX2NTxj9@63P42+42%pC z49TBMu1$|Q$B0h94L#`h*g#~@`Xlx(mg+nFGzBMZJQCDsv86j>YgD1}N$>0_$ELnz zy1PF9xM%F{Dbf5gVH35^@2UKDL~`#WOOexTi|#9kik~f=GdJDP_P3zxleERtoi3%{ z_@lUjeVaj=RG#XL`;&y8EMCX6YC_H0vt_wAowwNts$My@u3Y2NhlS=s>mFE@2=sTcpIaOGt$6WJ=OtCHbwb=S5-G-GFJ&%-qDZEYU;*Pk_f;?gsYdHV9I#`;U$ z({23Y4Vq1)r?^^bM9%9kkTK0k-Lj4U_`R^VYfWm7-nlKKeaEC*N<>!WnW1>OL;Y3L zdnfX4AGQnsv8p&P?oIG?Rp!Spb`*bFa4ewXTaWpI@-=z-W)JwTl>a$gld1mZL1WsX zr6QN6TdD>8TcyQXmA=ot@ll}0yZG+IjjudkJoqHT7h?QR{DsCr3rWEg$AEd|2X9v^ zX)M{}p*XvDa;wg7`AzwPMst=}98~wXX>jo5ha-y0FD@4-fB(8B!Bpb$weNhpeqBlF znYGYsLagOJ`^&#}@9}7xx%pwF+KF?w@^X~(^W<+&v+=5U{Ndk*ByNLZ`-Z&^dz==2 z-)r|!J7Ymw_VHpJ>B&`V}Lg!lP&}9L;+3+aDt>H65!1WOj)30#K;g0 Jq=lJ4JOEPA6ng*w diff --git a/src/main/models/incomplete/batteryBox.tcn b/src/main/models/incomplete/batteryBox.tcn deleted file mode 100644 index 3054edfa7c1ee200c2025b80992b5cc7289f01e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmWIWW@Zs#U|`^2IG7^sytPw1nu&>lVL3Mg11EzDLvDUbYK~q-ZVnfN0#FeH10#b3 zgU;E2GtP_8F{0CNrv>KUG7va^U;VAMOQo7A=ahygQChBRe;o)DHSw)BKFMm-DsgjJ zbM3F2eb0|wSf?MdO0A`3$N#^zcC+Ib9WFi*X3BEEp?lKR@Wi5tEl)l#S2%DzdS}v{ zKMilodvX$lgtZ>FHUB!t>GpPoXY+}QofB8h@!PI6dEO=&t;D+jy-b|eJD(Pa_N|<9 z;Cu46&6kcYi)*{K=1sEJgJp}H1U3h>OW1awD`(H)o%DY0qAfSO@)Rcg?!Bche^8;b z+e9jMnd_DKC7D|~G+jK+&wtAEyZpt7uX)zGspSh#wXb#hmG!E~_wK|vubAtnxmaG7 zU2(sAukp{VRVSyJr}AIlc_dr=`Kt)`)jcmv`{Lfo-0$X0@p=D|<;k?LUs1Mi57b7# zyK?_+k8j0;nbYPN-`i$+w75=}i*b^R^VM3DBPWi{d*0Z2DbDB8<@A!K^y-vLyY0oR z*G2x6_ON+zWNt;n#Lhi`_BfvZmdN!ph+8XVg%xYsq})lyY47_ZR~dTWKax`-b?Vow zP5;^#z2UjpUOD~f-T&WW%a*cKX>|E`8^^VD5?dLCRVd;RRBN875`3tun4YVDTRlG7G+WtP|fKzaLu3ay9N|IX5L zZ!TUx%<;C4n2YEz4^gQyac`C=# zn4F%^C)+1RJ9KPJDaOV}*b^3Y~cN{~RA zuTzfM(!DdM6i&?3eBC!&dXj1{WAASn(cbLdGgZPE9zEV=Sja=}TTcB&rt|Midw1Zs zQfPC20n4Uy!P4_oBeuXstXrB+;mZzWA@ZLpJqNyjq>H;X?U2p`P!C0 zc}2Ho9f-=SJbQV+N{d(lW64I%CDZJoZd27BlW!>rPm$pfi`PhBccg}VGLbDBwTT&)` zj%_`Wd8^NV_SuNZif0+yZZl`f#ou1y;q1Yg86FV4EX{Xwia~PYwU?=m%?Ve0XXY|5 zQEQ8PX}z!G@o@euOo{-1Op2+&@ zF}~H5{m`I1y`d`W-o<^(S!ep>U3%)Jz96e$^V3QG`^9f4Oj&rAyJ5A^_VX^&t*;yj zIv35JYq$LDE7eJT4cB>Rzh<}{&Ln-`ddABq4}L6g6m;4BjkhN-eu?4(=H;_ZGBz4y zt#tOCZr#^EOSe@j$miCHaMpS${<)t`F79mX`k=W{@)Z-yZ_WE%y-b|f0vMQ9w3tp5 z&A4%oKS!r&)v~k2As4r;ukKm=WBakUKRPuYSucE~6#Dzc;x7-GwndzpVz=ParFK7| zd){WZ;wLH0?5jFhzjX19n!;VY@#~%!Zh2NNa&?;e#%=Y9J6f-vw94UHxh?ej-TnZH zjqUD>s|;b7GmOtN|7za-5VO53nU_tJ z3k7vE-i9-ta6jX3*!G_RH9t;X%d97UcIy^!enX=-e`1ah=S9i2lf$L8T+y;6Jevl1 zGcxHiAoBX_PVcwg;tUL1Bp4WkfO#DO7BDkR-oq@fhh`xoj3405$_7%+1cdv6w7oQl F2LMqd_(cE! delta 1081 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 Y|7QY#3b1hh>Vf`ey8lU0qJO>q1J*6r@&Et; literal 0 HcmV?d00001