From 1b692b6dfc798594b30466428425132673a39c33 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Wed, 26 Oct 2022 19:42:44 +0200 Subject: [PATCH] feat: initial port --- .gitignore | 2 + build.gradle | 9 +- gradlew | 0 src/main/java/assemblyline/api/IArmbot.java | 22 + .../java/assemblyline/api/IArmbotUseable.java | 8 + src/main/java/assemblyline/api/IBelt.java | 11 + src/main/java/assemblyline/api/IBotArm.java | 5 + .../assemblyline/api/ICraneConnectable.java | 8 + .../assemblyline/api/ICraneStructure.java | 8 + .../java/assemblyline/api/IFilterable.java | 10 + .../java/assemblyline/api/IManipulator.java | 8 + .../java/assemblyline/client/ClientProxy.java | 77 ++ .../client/gui/GuiAutoCrafting.java | 34 + .../client/gui/GuiButtonImage.java | 37 + .../client/gui/GuiCommandList.java | 93 +++ .../assemblyline/client/gui/GuiEncoder.java | 305 ++++++++ .../assemblyline/client/gui/GuiImprinter.java | 41 ++ .../client/model/ModelAngledBelt.java | 68 ++ .../client/model/ModelArmbot.java | 154 ++++ .../client/model/ModelConveyorBelt.java | 217 ++++++ .../client/model/ModelCraneArmMount.java | 87 +++ .../client/model/ModelCraneController.java | 117 +++ .../client/model/ModelCraneRail.java | 454 ++++++++++++ .../client/model/ModelDropBox.java | 103 +++ .../client/model/ModelHelper.java | 142 ++++ .../client/model/ModelLaserDrill.java | 135 ++++ .../client/model/ModelManipulator.java | 189 +++++ .../client/model/ModelRejectorPiston.java | 157 ++++ .../client/render/BlockRenderingHandler.java | 97 +++ .../client/render/RenderArmbot.java | 58 ++ .../client/render/RenderConveyorBelt.java | 106 +++ .../client/render/RenderCraneController.java | 53 ++ .../client/render/RenderCraneFrame.java | 44 ++ .../client/render/RenderCrate.java | 158 ++++ .../client/render/RenderDetector.java | 38 + .../client/render/RenderHelper.java | 54 ++ .../client/render/RenderImprintable.java | 34 + .../client/render/RenderManipulator.java | 43 ++ .../client/render/RenderRejector.java | 46 ++ .../assemblyline/common/AssemblyLine.java | 184 +++++ .../java/assemblyline/common/CommonProxy.java | 114 +++ src/main/java/assemblyline/common/Pair.java | 35 + .../assemblyline/common/PathfinderCrate.java | 63 ++ .../assemblyline/common/TabAssemblyLine.java | 25 + .../common/block/BlockALMachine.java | 45 ++ .../assemblyline/common/block/BlockCrate.java | 239 ++++++ .../common/block/BlockTurntable.java | 138 ++++ .../common/block/ItemBlockCrate.java | 96 +++ .../common/block/TileEntityCrate.java | 227 ++++++ .../common/machine/BlockBeltSorter.java | 23 + .../common/machine/BlockManipulator.java | 82 +++ .../common/machine/BlockRejector.java | 39 + .../machine/TileEntityAssemblyNetwork.java | 73 ++ .../common/machine/TileEntityManipulator.java | 312 ++++++++ .../common/machine/TileEntityRejector.java | 85 +++ .../common/machine/armbot/BlockArmbot.java | 79 ++ .../machine/armbot/TileEntityArmbot.java | 684 ++++++++++++++++++ .../machine/belt/BlockConveyorBelt.java | 257 +++++++ .../machine/belt/TileEntityConveyorBelt.java | 256 +++++++ .../machine/belt/TileEntityCoveredBelt.java | 6 + .../machine/belt/TileEntityElevatorBelt.java | 23 + .../common/machine/command/Command.java | 138 ++++ .../common/machine/command/CommandBreak.java | 44 ++ .../common/machine/command/CommandDrop.java | 20 + .../common/machine/command/CommandFire.java | 128 ++++ .../common/machine/command/CommandGrab.java | 100 +++ .../machine/command/CommandHarvest.java | 20 + .../common/machine/command/CommandIdle.java | 47 ++ .../machine/command/CommandManager.java | 162 +++++ .../common/machine/command/CommandPlace.java | 58 ++ .../machine/command/CommandPowerTo.java | 86 +++ .../common/machine/command/CommandRepeat.java | 70 ++ .../common/machine/command/CommandReturn.java | 36 + .../machine/command/CommandRotateBy.java | 85 +++ .../machine/command/CommandRotateTo.java | 70 ++ .../common/machine/command/CommandUse.java | 69 ++ .../machine/command/GrabDictionary.java | 102 +++ .../machine/crane/BlockCraneController.java | 64 ++ .../common/machine/crane/BlockCraneFrame.java | 126 ++++ .../common/machine/crane/CraneHelper.java | 59 ++ .../crane/TileEntityCraneController.java | 159 ++++ .../machine/crane/TileEntityCraneRail.java | 20 + .../machine/detector/BlockDetector.java | 146 ++++ .../machine/detector/TileEntityDetector.java | 85 +++ .../common/machine/encoder/BlockEncoder.java | 64 ++ .../machine/encoder/ContainerEncoder.java | 60 ++ .../machine/encoder/IInventoryWatcher.java | 6 + .../common/machine/encoder/ItemDisk.java | 79 ++ .../common/machine/encoder/SlotDisk.java | 18 + .../machine/encoder/SlotDiskResult.java | 28 + .../machine/encoder/TileEntityEncoder.java | 163 +++++ .../machine/imprinter/BlockImprintable.java | 123 ++++ .../machine/imprinter/BlockImprinter.java | 117 +++ .../machine/imprinter/ContainerImprinter.java | 100 +++ .../machine/imprinter/ISlotWatcher.java | 6 + .../machine/imprinter/ItemImprinter.java | 92 +++ .../machine/imprinter/SlotCraftingResult.java | 31 + .../common/machine/imprinter/SlotCustom.java | 20 + .../machine/imprinter/SlotImprintResult.java | 28 + .../imprinter/TileEntityFilterable.java | 116 +++ .../imprinter/TileEntityImprinter.java | 488 +++++++++++++ .../common/machine/imprinter/WatchedSlot.java | 21 + .../common/network/MessageEncoder.java | 52 ++ .../common/network/MessageEncoderHandler.java | 23 + .../computercraft/api/ComputerCraftAPI.java | 315 ++++++++ .../computercraft/api/filesystem/IMount.java | 57 ++ .../api/filesystem/IWritableMount.java | 52 ++ .../api/filesystem/package-info.java | 10 + .../computercraft/api/lua/ILuaContext.java | 58 ++ .../computercraft/api/lua/ILuaObject.java | 26 + .../computercraft/api/lua/ILuaTask.java | 12 + .../computercraft/api/lua/LuaException.java | 36 + .../computercraft/api/lua/package-info.java | 10 + .../computercraft/api/media/IMedia.java | 59 ++ .../api/media/IMediaProvider.java | 23 + .../computercraft/api/media/package-info.java | 10 + .../computercraft/api/package-info.java | 10 + .../api/peripheral/IComputerAccess.java | 102 +++ .../api/peripheral/IPeripheral.java | 100 +++ .../api/peripheral/IPeripheralProvider.java | 23 + .../api/peripheral/package-info.java | 10 + .../ITurtlePermissionProvider.java | 19 + .../api/permissions/package-info.java | 10 + .../redstone/IBundledRedstoneProvider.java | 23 + .../api/redstone/package-info.java | 10 + .../api/turtle/ITurtleAccess.java | 168 +++++ .../api/turtle/ITurtleCommand.java | 25 + .../api/turtle/ITurtleUpgrade.java | 94 +++ .../api/turtle/TurtleAnimation.java | 22 + .../api/turtle/TurtleCommandResult.java | 73 ++ .../computercraft/api/turtle/TurtleSide.java | 23 + .../api/turtle/TurtleUpgradeType.java | 27 + .../computercraft/api/turtle/TurtleVerb.java | 26 + .../api/turtle/package-info.java | 10 + .../library/helpers/ItemFindingHelper.java | 76 ++ src/main/resources/al_logo.png | Bin 0 -> 14526 bytes .../assemblyline/languages/en_US.properties | 27 + .../resources/assets/assemblyline/sounds.json | 11 + .../assets/assemblyline/sounds/conveyor.ogg | Bin 0 -> 7544 bytes .../assemblyline/textures/blocks/crate.png | Bin 0 -> 4352 bytes .../textures/blocks/detector_green.png | Bin 0 -> 4583 bytes .../textures/blocks/detector_red.png | Bin 0 -> 4494 bytes .../textures/blocks/encoder_bottom.png | Bin 0 -> 4616 bytes .../textures/blocks/encoder_side.png | Bin 0 -> 4790 bytes .../textures/blocks/encoder_top.png | Bin 0 -> 4530 bytes .../textures/blocks/imprinter_bottom.png | Bin 0 -> 4374 bytes .../textures/blocks/imprinter_side.png | Bin 0 -> 4565 bytes .../textures/blocks/imprinter_top.png | Bin 0 -> 4612 bytes .../assemblyline/textures/blocks/machine.png | Bin 0 -> 4544 bytes .../textures/blocks/turntable.png | Bin 0 -> 5139 bytes .../textures/blocks/turntable_side.png | Bin 0 -> 4737 bytes .../assemblyline/textures/gui/gui_empty.png | Bin 0 -> 3479 bytes .../assemblyline/textures/gui/gui_encoder.png | Bin 0 -> 3711 bytes .../textures/gui/gui_imprinter.png | Bin 0 -> 2391 bytes .../assemblyline/textures/items/disk.png | Bin 0 -> 3245 bytes .../assemblyline/textures/items/imprint.png | Bin 0 -> 3153 bytes .../assemblyline/textures/models/armbot.png | Bin 0 -> 3377 bytes .../textures/models/armbot_old.png | Bin 0 -> 4007 bytes .../textures/models/belt/frame0.png | Bin 0 -> 791 bytes .../textures/models/belt/frame1.png | Bin 0 -> 49377 bytes .../textures/models/belt/frame10.png | Bin 0 -> 50512 bytes .../textures/models/belt/frame11.png | Bin 0 -> 50503 bytes .../textures/models/belt/frame12.png | Bin 0 -> 49355 bytes .../textures/models/belt/frame13.png | Bin 0 -> 49347 bytes .../textures/models/belt/frame2.png | Bin 0 -> 49340 bytes .../textures/models/belt/frame3.png | Bin 0 -> 49444 bytes .../textures/models/belt/frame4.png | Bin 0 -> 49399 bytes .../textures/models/belt/frame5.png | Bin 0 -> 49447 bytes .../textures/models/belt/frame6.png | Bin 0 -> 49380 bytes .../textures/models/belt/frame7.png | Bin 0 -> 49298 bytes .../textures/models/belt/frame8.png | Bin 0 -> 49735 bytes .../textures/models/belt/frame9.png | Bin 0 -> 49395 bytes .../textures/models/crane_controller_off.png | Bin 0 -> 7190 bytes .../textures/models/crane_controller_on.png | Bin 0 -> 61213 bytes .../textures/models/crane_frame.png | Bin 0 -> 2982 bytes .../assemblyline/textures/models/injector.png | Bin 0 -> 957 bytes .../textures/models/laser_drill.png | Bin 0 -> 8097 bytes .../textures/models/manipulator1.png | Bin 0 -> 957 bytes .../textures/models/manipulator2.png | Bin 0 -> 3665 bytes .../textures/models/quarryControllerOn.png | Bin 0 -> 61496 bytes .../assemblyline/textures/models/rejector.png | Bin 0 -> 6324 bytes .../textures/models/slantedbelt/frame0.png | Bin 0 -> 968 bytes .../textures/models/slantedbelt/frame1.png | Bin 0 -> 835 bytes .../textures/models/slantedbelt/frame10.png | Bin 0 -> 1017 bytes .../textures/models/slantedbelt/frame11.png | Bin 0 -> 1032 bytes .../textures/models/slantedbelt/frame12.png | Bin 0 -> 1027 bytes .../textures/models/slantedbelt/frame13.png | Bin 0 -> 1025 bytes .../textures/models/slantedbelt/frame14.png | Bin 0 -> 1020 bytes .../textures/models/slantedbelt/frame15.png | Bin 0 -> 1044 bytes .../textures/models/slantedbelt/frame16.png | Bin 0 -> 1047 bytes .../textures/models/slantedbelt/frame17.png | Bin 0 -> 1044 bytes .../textures/models/slantedbelt/frame18.png | Bin 0 -> 1040 bytes .../textures/models/slantedbelt/frame19.png | Bin 0 -> 1043 bytes .../textures/models/slantedbelt/frame2.png | Bin 0 -> 936 bytes .../textures/models/slantedbelt/frame20.png | Bin 0 -> 1040 bytes .../textures/models/slantedbelt/frame21.png | Bin 0 -> 1043 bytes .../textures/models/slantedbelt/frame22.png | Bin 0 -> 1040 bytes .../textures/models/slantedbelt/frame23.png | Bin 0 -> 1020 bytes .../textures/models/slantedbelt/frame3.png | Bin 0 -> 1012 bytes .../textures/models/slantedbelt/frame4.png | Bin 0 -> 1009 bytes .../textures/models/slantedbelt/frame5.png | Bin 0 -> 1014 bytes .../textures/models/slantedbelt/frame6.png | Bin 0 -> 1005 bytes .../textures/models/slantedbelt/frame7.png | Bin 0 -> 1017 bytes .../textures/models/slantedbelt/frame8.png | Bin 0 -> 1018 bytes .../textures/models/slantedbelt/frame9.png | Bin 0 -> 1011 bytes src/main/resources/mcmod.info | 20 + 206 files changed, 11422 insertions(+), 1 deletion(-) mode change 100644 => 100755 gradlew create mode 100644 src/main/java/assemblyline/api/IArmbot.java create mode 100644 src/main/java/assemblyline/api/IArmbotUseable.java create mode 100644 src/main/java/assemblyline/api/IBelt.java create mode 100644 src/main/java/assemblyline/api/IBotArm.java create mode 100644 src/main/java/assemblyline/api/ICraneConnectable.java create mode 100644 src/main/java/assemblyline/api/ICraneStructure.java create mode 100644 src/main/java/assemblyline/api/IFilterable.java create mode 100644 src/main/java/assemblyline/api/IManipulator.java create mode 100644 src/main/java/assemblyline/client/ClientProxy.java create mode 100644 src/main/java/assemblyline/client/gui/GuiAutoCrafting.java create mode 100644 src/main/java/assemblyline/client/gui/GuiButtonImage.java create mode 100644 src/main/java/assemblyline/client/gui/GuiCommandList.java create mode 100644 src/main/java/assemblyline/client/gui/GuiEncoder.java create mode 100644 src/main/java/assemblyline/client/gui/GuiImprinter.java create mode 100644 src/main/java/assemblyline/client/model/ModelAngledBelt.java create mode 100644 src/main/java/assemblyline/client/model/ModelArmbot.java create mode 100644 src/main/java/assemblyline/client/model/ModelConveyorBelt.java create mode 100644 src/main/java/assemblyline/client/model/ModelCraneArmMount.java create mode 100644 src/main/java/assemblyline/client/model/ModelCraneController.java create mode 100644 src/main/java/assemblyline/client/model/ModelCraneRail.java create mode 100644 src/main/java/assemblyline/client/model/ModelDropBox.java create mode 100644 src/main/java/assemblyline/client/model/ModelHelper.java create mode 100644 src/main/java/assemblyline/client/model/ModelLaserDrill.java create mode 100644 src/main/java/assemblyline/client/model/ModelManipulator.java create mode 100644 src/main/java/assemblyline/client/model/ModelRejectorPiston.java create mode 100644 src/main/java/assemblyline/client/render/BlockRenderingHandler.java create mode 100644 src/main/java/assemblyline/client/render/RenderArmbot.java create mode 100644 src/main/java/assemblyline/client/render/RenderConveyorBelt.java create mode 100644 src/main/java/assemblyline/client/render/RenderCraneController.java create mode 100644 src/main/java/assemblyline/client/render/RenderCraneFrame.java create mode 100644 src/main/java/assemblyline/client/render/RenderCrate.java create mode 100644 src/main/java/assemblyline/client/render/RenderDetector.java create mode 100644 src/main/java/assemblyline/client/render/RenderHelper.java create mode 100644 src/main/java/assemblyline/client/render/RenderImprintable.java create mode 100644 src/main/java/assemblyline/client/render/RenderManipulator.java create mode 100644 src/main/java/assemblyline/client/render/RenderRejector.java create mode 100644 src/main/java/assemblyline/common/AssemblyLine.java create mode 100644 src/main/java/assemblyline/common/CommonProxy.java create mode 100644 src/main/java/assemblyline/common/Pair.java create mode 100644 src/main/java/assemblyline/common/PathfinderCrate.java create mode 100644 src/main/java/assemblyline/common/TabAssemblyLine.java create mode 100644 src/main/java/assemblyline/common/block/BlockALMachine.java create mode 100644 src/main/java/assemblyline/common/block/BlockCrate.java create mode 100644 src/main/java/assemblyline/common/block/BlockTurntable.java create mode 100644 src/main/java/assemblyline/common/block/ItemBlockCrate.java create mode 100644 src/main/java/assemblyline/common/block/TileEntityCrate.java create mode 100644 src/main/java/assemblyline/common/machine/BlockBeltSorter.java create mode 100644 src/main/java/assemblyline/common/machine/BlockManipulator.java create mode 100644 src/main/java/assemblyline/common/machine/BlockRejector.java create mode 100644 src/main/java/assemblyline/common/machine/TileEntityAssemblyNetwork.java create mode 100644 src/main/java/assemblyline/common/machine/TileEntityManipulator.java create mode 100644 src/main/java/assemblyline/common/machine/TileEntityRejector.java create mode 100644 src/main/java/assemblyline/common/machine/armbot/BlockArmbot.java create mode 100644 src/main/java/assemblyline/common/machine/armbot/TileEntityArmbot.java create mode 100644 src/main/java/assemblyline/common/machine/belt/BlockConveyorBelt.java create mode 100644 src/main/java/assemblyline/common/machine/belt/TileEntityConveyorBelt.java create mode 100644 src/main/java/assemblyline/common/machine/belt/TileEntityCoveredBelt.java create mode 100644 src/main/java/assemblyline/common/machine/belt/TileEntityElevatorBelt.java create mode 100644 src/main/java/assemblyline/common/machine/command/Command.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandBreak.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandDrop.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandFire.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandGrab.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandHarvest.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandIdle.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandManager.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandPlace.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandPowerTo.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandRepeat.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandReturn.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandRotateBy.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandRotateTo.java create mode 100644 src/main/java/assemblyline/common/machine/command/CommandUse.java create mode 100644 src/main/java/assemblyline/common/machine/command/GrabDictionary.java create mode 100644 src/main/java/assemblyline/common/machine/crane/BlockCraneController.java create mode 100644 src/main/java/assemblyline/common/machine/crane/BlockCraneFrame.java create mode 100644 src/main/java/assemblyline/common/machine/crane/CraneHelper.java create mode 100644 src/main/java/assemblyline/common/machine/crane/TileEntityCraneController.java create mode 100644 src/main/java/assemblyline/common/machine/crane/TileEntityCraneRail.java create mode 100644 src/main/java/assemblyline/common/machine/detector/BlockDetector.java create mode 100644 src/main/java/assemblyline/common/machine/detector/TileEntityDetector.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/BlockEncoder.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/ContainerEncoder.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/IInventoryWatcher.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/ItemDisk.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/SlotDisk.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/SlotDiskResult.java create mode 100644 src/main/java/assemblyline/common/machine/encoder/TileEntityEncoder.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/BlockImprintable.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/BlockImprinter.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/ContainerImprinter.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/ISlotWatcher.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/ItemImprinter.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/SlotCraftingResult.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/SlotCustom.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/SlotImprintResult.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/TileEntityFilterable.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/TileEntityImprinter.java create mode 100644 src/main/java/assemblyline/common/machine/imprinter/WatchedSlot.java create mode 100644 src/main/java/assemblyline/common/network/MessageEncoder.java create mode 100644 src/main/java/assemblyline/common/network/MessageEncoderHandler.java create mode 100755 src/main/java/dan200/computercraft/api/ComputerCraftAPI.java create mode 100755 src/main/java/dan200/computercraft/api/filesystem/IMount.java create mode 100755 src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java create mode 100755 src/main/java/dan200/computercraft/api/filesystem/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/lua/ILuaContext.java create mode 100755 src/main/java/dan200/computercraft/api/lua/ILuaObject.java create mode 100755 src/main/java/dan200/computercraft/api/lua/ILuaTask.java create mode 100755 src/main/java/dan200/computercraft/api/lua/LuaException.java create mode 100755 src/main/java/dan200/computercraft/api/lua/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/media/IMedia.java create mode 100755 src/main/java/dan200/computercraft/api/media/IMediaProvider.java create mode 100755 src/main/java/dan200/computercraft/api/media/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java create mode 100755 src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java create mode 100755 src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java create mode 100755 src/main/java/dan200/computercraft/api/peripheral/package-info.java create mode 100644 src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java create mode 100644 src/main/java/dan200/computercraft/api/permissions/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java create mode 100755 src/main/java/dan200/computercraft/api/redstone/package-info.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/TurtleSide.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java create mode 100755 src/main/java/dan200/computercraft/api/turtle/package-info.java create mode 100644 src/main/java/dark/library/helpers/ItemFindingHelper.java create mode 100644 src/main/resources/al_logo.png create mode 100644 src/main/resources/assets/assemblyline/languages/en_US.properties create mode 100644 src/main/resources/assets/assemblyline/sounds.json create mode 100644 src/main/resources/assets/assemblyline/sounds/conveyor.ogg create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/crate.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/detector_green.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/detector_red.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/encoder_bottom.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/encoder_side.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/encoder_top.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/imprinter_bottom.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/imprinter_side.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/imprinter_top.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/machine.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/turntable.png create mode 100644 src/main/resources/assets/assemblyline/textures/blocks/turntable_side.png create mode 100644 src/main/resources/assets/assemblyline/textures/gui/gui_empty.png create mode 100644 src/main/resources/assets/assemblyline/textures/gui/gui_encoder.png create mode 100644 src/main/resources/assets/assemblyline/textures/gui/gui_imprinter.png create mode 100644 src/main/resources/assets/assemblyline/textures/items/disk.png create mode 100644 src/main/resources/assets/assemblyline/textures/items/imprint.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/armbot.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/armbot_old.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame0.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame1.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame10.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame11.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame12.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame13.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame2.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame3.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame4.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame5.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame6.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame7.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame8.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/belt/frame9.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/crane_controller_off.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/crane_controller_on.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/crane_frame.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/injector.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/laser_drill.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/manipulator1.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/manipulator2.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/quarryControllerOn.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/rejector.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame0.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame1.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame10.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame11.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame12.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame13.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame14.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame15.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame16.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame17.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame18.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame19.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame2.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame20.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame21.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame22.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame23.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame3.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame4.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame5.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame6.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame7.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame8.png create mode 100644 src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame9.png create mode 100644 src/main/resources/mcmod.info diff --git a/.gitignore b/.gitignore index 8d16946..78c71b8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .idea build run +bin +off \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7c2d31b..df51226 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,9 @@ buildscript { apply plugin: 'forge' +sourceCompatibility = '1.8' +targetCompatibility = '1.8' + version = "1.0" group= "modgroup" archivesBaseName = "modid" @@ -26,8 +29,12 @@ minecraft { runDir = "run" } -dependencies { +repositories { + maven { url = "https://maven.tilera.xyz" } +} +dependencies { + compile "universalelectricity:basiccomponents:1.0.2-dirty:deobf" } processResources diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/assemblyline/api/IArmbot.java b/src/main/java/assemblyline/api/IArmbot.java new file mode 100644 index 0000000..48412d1 --- /dev/null +++ b/src/main/java/assemblyline/api/IArmbot.java @@ -0,0 +1,22 @@ +package assemblyline.api; + +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; + +public interface IArmbot { + public void grabEntity(Entity var1); + + public void grabItem(ItemStack var1); + + public void dropEntity(Entity var1); + + public void dropItem(ItemStack var1); + + public void dropAll(); + + public List getGrabbedEntities(); + + public List getGrabbedItems(); +} + diff --git a/src/main/java/assemblyline/api/IArmbotUseable.java b/src/main/java/assemblyline/api/IArmbotUseable.java new file mode 100644 index 0000000..2b7e47c --- /dev/null +++ b/src/main/java/assemblyline/api/IArmbotUseable.java @@ -0,0 +1,8 @@ +package assemblyline.api; + +import assemblyline.api.IArmbot; + +public interface IArmbotUseable { + public boolean onUse(IArmbot var1, String[] var2); +} + diff --git a/src/main/java/assemblyline/api/IBelt.java b/src/main/java/assemblyline/api/IBelt.java new file mode 100644 index 0000000..211fd26 --- /dev/null +++ b/src/main/java/assemblyline/api/IBelt.java @@ -0,0 +1,11 @@ +package assemblyline.api; + +import java.util.List; +import net.minecraft.entity.Entity; + +public interface IBelt { + public List getAffectedEntities(); + + public void IgnoreEntity(Entity var1); +} + diff --git a/src/main/java/assemblyline/api/IBotArm.java b/src/main/java/assemblyline/api/IBotArm.java new file mode 100644 index 0000000..13b9550 --- /dev/null +++ b/src/main/java/assemblyline/api/IBotArm.java @@ -0,0 +1,5 @@ +package assemblyline.api; + +public interface IBotArm { +} + diff --git a/src/main/java/assemblyline/api/ICraneConnectable.java b/src/main/java/assemblyline/api/ICraneConnectable.java new file mode 100644 index 0000000..6463484 --- /dev/null +++ b/src/main/java/assemblyline/api/ICraneConnectable.java @@ -0,0 +1,8 @@ +package assemblyline.api; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface ICraneConnectable { + public boolean canFrameConnectTo(ForgeDirection var1); +} + diff --git a/src/main/java/assemblyline/api/ICraneStructure.java b/src/main/java/assemblyline/api/ICraneStructure.java new file mode 100644 index 0000000..3740496 --- /dev/null +++ b/src/main/java/assemblyline/api/ICraneStructure.java @@ -0,0 +1,8 @@ +package assemblyline.api; + +import assemblyline.api.ICraneConnectable; + +public interface ICraneStructure +extends ICraneConnectable { +} + diff --git a/src/main/java/assemblyline/api/IFilterable.java b/src/main/java/assemblyline/api/IFilterable.java new file mode 100644 index 0000000..3ec29fa --- /dev/null +++ b/src/main/java/assemblyline/api/IFilterable.java @@ -0,0 +1,10 @@ +package assemblyline.api; + +import net.minecraft.item.ItemStack; + +public interface IFilterable { + public void setFilter(ItemStack var1); + + public ItemStack getFilter(); +} + diff --git a/src/main/java/assemblyline/api/IManipulator.java b/src/main/java/assemblyline/api/IManipulator.java new file mode 100644 index 0000000..4419ab3 --- /dev/null +++ b/src/main/java/assemblyline/api/IManipulator.java @@ -0,0 +1,8 @@ +package assemblyline.api; + +public interface IManipulator { + public void eject(); + + public void inject(); +} + diff --git a/src/main/java/assemblyline/client/ClientProxy.java b/src/main/java/assemblyline/client/ClientProxy.java new file mode 100644 index 0000000..7434f9b --- /dev/null +++ b/src/main/java/assemblyline/client/ClientProxy.java @@ -0,0 +1,77 @@ +package assemblyline.client; + +import assemblyline.client.gui.GuiEncoder; +import assemblyline.client.gui.GuiImprinter; +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.client.render.RenderArmbot; +import assemblyline.client.render.RenderConveyorBelt; +import assemblyline.client.render.RenderCraneController; +import assemblyline.client.render.RenderCraneFrame; +import assemblyline.client.render.RenderCrate; +import assemblyline.client.render.RenderDetector; +import assemblyline.client.render.RenderManipulator; +import assemblyline.client.render.RenderRejector; +import assemblyline.common.CommonProxy; +import assemblyline.common.block.TileEntityCrate; +import assemblyline.common.machine.TileEntityManipulator; +import assemblyline.common.machine.TileEntityRejector; +import assemblyline.common.machine.armbot.TileEntityArmbot; +import assemblyline.common.machine.belt.TileEntityConveyorBelt; +import assemblyline.common.machine.crane.TileEntityCraneController; +import assemblyline.common.machine.crane.TileEntityCraneRail; +import assemblyline.common.machine.detector.TileEntityDetector; +import assemblyline.common.machine.encoder.TileEntityEncoder; +import assemblyline.common.machine.imprinter.TileEntityImprinter; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; + +public class ClientProxy +extends CommonProxy { + @Override + public void preInit() { + RenderingRegistry.registerBlockHandler(new BlockRenderingHandler()); + } + + @Override + public void init() { + super.init(); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityConveyorBelt.class, (TileEntitySpecialRenderer)new RenderConveyorBelt()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRejector.class, (TileEntitySpecialRenderer)new RenderRejector()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityManipulator.class, (TileEntitySpecialRenderer)new RenderManipulator()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCrate.class, (TileEntitySpecialRenderer)new RenderCrate()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityArmbot.class, (TileEntitySpecialRenderer)new RenderArmbot()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDetector.class, (TileEntitySpecialRenderer)new RenderDetector()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCraneController.class, (TileEntitySpecialRenderer)new RenderCraneController()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCraneRail.class, (TileEntitySpecialRenderer)new RenderCraneFrame()); + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null) { + switch (ID) { + case 1: { + return new GuiImprinter(player.inventory, (TileEntityImprinter)tileEntity); + } + case 2: { + if (tileEntity == null || !(tileEntity instanceof TileEntityEncoder)) break; + return new GuiEncoder(player.inventory, (TileEntityEncoder)tileEntity); + } + } + } + return null; + } + + @Override + public boolean isCtrKeyDown() { + return GuiScreen.isCtrlKeyDown(); + } +} + diff --git a/src/main/java/assemblyline/client/gui/GuiAutoCrafting.java b/src/main/java/assemblyline/client/gui/GuiAutoCrafting.java new file mode 100644 index 0000000..bd2ad49 --- /dev/null +++ b/src/main/java/assemblyline/client/gui/GuiAutoCrafting.java @@ -0,0 +1,34 @@ +package assemblyline.client.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +@SideOnly(value=Side.CLIENT) +public class GuiAutoCrafting +extends GuiContainer { + public GuiAutoCrafting(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5) { + super((Container)new ContainerWorkbench(par1InventoryPlayer, par2World, par3, par4, par5)); + } + + protected void drawGuiContainerForegroundLayer() { + this.fontRendererObj.drawString(StatCollector.translateToLocal((String)"AutoCrafter"), 28, 6, 0x404040); + this.fontRendererObj.drawString(StatCollector.translateToLocal((String)"container.inventory"), 8, this.ySize - 96 + 2, 0x404040); + } + + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { + this.mc.renderEngine.getTexture(new ResourceLocation("assemblyline", "textures/gui/gui_crafting.png")); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + int var5 = (this.width - this.xSize) / 2; + int var6 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var5, var6, 0, 0, this.xSize, this.ySize); + } +} + diff --git a/src/main/java/assemblyline/client/gui/GuiButtonImage.java b/src/main/java/assemblyline/client/gui/GuiButtonImage.java new file mode 100644 index 0000000..22f7bd8 --- /dev/null +++ b/src/main/java/assemblyline/client/gui/GuiButtonImage.java @@ -0,0 +1,37 @@ +package assemblyline.client.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +@SideOnly(value=Side.CLIENT) +@Deprecated +public class GuiButtonImage +extends GuiButton { + private int type = 0; + + public GuiButtonImage(int par1, int par2, int par3, int type) { + super(par1, par2, par3, 12, 12, ""); + this.type = type; + } + + @Override + public void drawButton(Minecraft par1Minecraft, int width, int hight) { + if (this.visible) { + par1Minecraft.getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/gui@.png")); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + boolean var4 = width >= this.xPosition && hight >= this.yPosition && width < this.xPosition + this.width && hight < this.yPosition + this.height; + int var5 = 106; + int var6 = 0; + if (var4) { + var5 += this.height; + } + this.drawTexturedModalRect(this.xPosition, this.yPosition, var6, var5, this.width, this.height); + } + } +} + diff --git a/src/main/java/assemblyline/client/gui/GuiCommandList.java b/src/main/java/assemblyline/client/gui/GuiCommandList.java new file mode 100644 index 0000000..428fadf --- /dev/null +++ b/src/main/java/assemblyline/client/gui/GuiCommandList.java @@ -0,0 +1,93 @@ +package assemblyline.client.gui; + +import cpw.mods.fml.client.GuiScrollingList; +import java.util.ArrayList; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import org.lwjgl.opengl.GL11; + +public class GuiCommandList +extends GuiScrollingList { + private ArrayList commands = new ArrayList(); + private int selIndex = -1; + private Minecraft mc; + + public GuiCommandList(Minecraft client, int width, int height, int top, int bottom, int left, int entryHeight) { + super(client, width, height, top, bottom, left, entryHeight); + this.mc = client; + } + + public void setCommands(ArrayList commands) { + this.commands = (ArrayList)commands.clone(); + } + + protected int getSize() { + return this.commands.size(); + } + + protected void elementClicked(int index, boolean doubleClick) { + this.selIndex = index; + } + + protected boolean isSelected(int index) { + return this.selIndex == index; + } + + protected void drawBackground() { + GuiCommandList.drawOutlineRect(this.left, this.left + this.listWidth, this.top, this.top + this.listHeight, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.5f); + } + + public static void drawOutlineRect(int x1, int y1, int x2, int y2, float rR, float rG, float rB, float lR, float lG, float lB) { + Tessellator tesselator = Tessellator.instance; + GL11.glEnable((int)3042); + GL11.glDisable((int)3553); + GL11.glBlendFunc((int)770, (int)771); + GL11.glColor4f((float)rR, (float)rG, (float)rB, (float)1.0f); + if (rR > 0.0f && rG > 0.0f && rB > 0.0f) { + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.draw(); + } + GL11.glColor4f((float)lR, (float)lG, (float)lB, (float)1.0f); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x1 + 1.0, (double)y2, 0.0); + tesselator.addVertex((double)x1 + 1.0, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x2 - 1.0, (double)y1, 0.0); + tesselator.addVertex((double)x2 - 1.0, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y1 + 1.0, 0.0); + tesselator.addVertex((double)x2, (double)y1 + 1.0, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y2 - 1.0, 0.0); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2 - 1.0, 0.0); + tesselator.draw(); + GL11.glEnable((int)3553); + GL11.glDisable((int)3042); + } + + protected void drawSlot(int slotID, int width, int slotY, int slotHeight, Tessellator tessellator) { + if (slotID < this.commands.size()) { + String command = (String)this.commands.get(slotID); + if (this.isSelected(slotID)) { + GuiCommandList.drawOutlineRect(this.left, this.left + width, this.top + slotY, this.top + slotY + slotHeight, -1.0f, -1.0f, -1.0f, 0.5f, 0.5f, 0.5f); + } + this.mc.fontRenderer.drawString(command, this.left + 4, slotY + 4, 0xAAAAAA, false); + } + } +} + diff --git a/src/main/java/assemblyline/client/gui/GuiEncoder.java b/src/main/java/assemblyline/client/gui/GuiEncoder.java new file mode 100644 index 0000000..10b86cb --- /dev/null +++ b/src/main/java/assemblyline/client/gui/GuiEncoder.java @@ -0,0 +1,305 @@ +package assemblyline.client.gui; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.encoder.ContainerEncoder; +import assemblyline.common.machine.encoder.IInventoryWatcher; +import assemblyline.common.machine.encoder.ItemDisk; +import assemblyline.common.machine.encoder.TileEntityEncoder; +import assemblyline.common.network.MessageEncoder; + +import java.util.ArrayList; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; + +public class GuiEncoder +extends GuiContainer +implements IInventoryWatcher { + private static final int MAX_COMMANDS = 6; + private int containerWidth; + private int containerHeight; + private TileEntityEncoder tileEntity; + private ArrayList commands; + private int minCommand; + private int selCommand; + private GuiButton addButton; + private GuiButton delButton; + private GuiButton pUpButton; + private GuiButton pDnButton; + private GuiTextField commandField; + + public GuiEncoder(InventoryPlayer playerInventory, TileEntityEncoder tileEntity) { + super((Container)new ContainerEncoder(playerInventory, tileEntity)); + this.ySize = 237; + this.tileEntity = tileEntity; + tileEntity.setWatcher(this); + } + + public void initGui() { + super.initGui(); + this.allowUserInput = true; + Keyboard.enableRepeatEvents((boolean)true); + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.addButton = new GuiButton(0, this.containerWidth + (this.xSize - 25), this.containerHeight + 128 + 0, 18, 20, "+"); + this.delButton = new GuiButton(1, this.containerWidth + (this.xSize - 43), this.containerHeight + 128 + 0, 18, 20, "-"); + this.pUpButton = new GuiButton(2, this.containerWidth + (this.xSize - 25), this.containerHeight + 46 + 0, 18, 20, ""); + this.pDnButton = new GuiButton(3, this.containerWidth + (this.xSize - 25), this.containerHeight + 106 + 0, 18, 20, ""); + this.commandField = new GuiTextField(this.fontRendererObj, 8, 129, this.xSize - 52, 18); + this.buttonList.add(this.addButton); + this.buttonList.add(this.delButton); + this.buttonList.add(this.pUpButton); + this.buttonList.add(this.pDnButton); + this.commands = new ArrayList(); + this.minCommand = 0; + this.selCommand = -1; + } + + @Override + protected void actionPerformed(GuiButton button) { + switch (button.id) { + case 0: { + ItemStack disk; + if (this.commandField.getText().equals("")) break; + if (this.tileEntity != null && (disk = this.tileEntity.getStackInSlot(0)) != null) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setBoolean("create", true); + nbt.setString("newCommand", this.commandField.getText()); + AssemblyLine.NETWORK.sendToServer(new MessageEncoder(new Vector3(this.tileEntity), nbt)); + } + this.minCommand = this.commands.size() - 6 + 1; + if (this.minCommand < 0) { + this.minCommand = 0; + } + this.selCommand = -1; + this.commandField.setText(""); + break; + } + case 1: { + if (this.tileEntity == null) break; + ItemStack disk = this.tileEntity.getStackInSlot(0); + if (disk != null && this.selCommand >= 0 && this.selCommand < this.commands.size()) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setBoolean("create", false); + nbt.setInteger("commandToRemove", this.selCommand); + AssemblyLine.NETWORK.sendToServer(new MessageEncoder(new Vector3(this.tileEntity), nbt)); + } + this.selCommand = -1; + break; + } + case 2: { + if (this.minCommand <= 0) break; + --this.minCommand; + break; + } + case 3: { + if (this.minCommand + 6 >= this.commands.size()) break; + ++this.minCommand; + } + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) { + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + GL11.glDisable((int)2896); + this.fontRendererObj.drawString(TranslationHelper.getLocal("tile.encoder.name"), 68, 8, 0x404040); + this.fontRendererObj.drawString("Disk:", 56, 28, 0x404040); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(this.pUpButton.xPosition - this.containerWidth + 6), (float)(this.pUpButton.yPosition - this.containerHeight + 7), (float)0.0f); + this.fontRendererObj.drawString("^", 1, 1, 0x444444); + this.fontRendererObj.drawString("^", 0, 0, 0xFFFFFF); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(this.pDnButton.xPosition - this.containerWidth + 6), (float)(this.pDnButton.yPosition - this.containerHeight + 7), (float)0.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glTranslatef((float)-5.0f, (float)-4.0f, (float)0.0f); + this.fontRendererObj.drawString("^", -1, -1, 0x444444); + this.fontRendererObj.drawString("^", 0, 0, 0xFFFFFF); + GL11.glPopMatrix(); + if (this.commands != null) { + this.drawCommands(); + } + this.commandField.drawTextBox(); + } + + private void drawCommands() { + for (int i = this.minCommand; i < this.minCommand + 6; ++i) { + if (i < 0 || i >= this.commands.size()) continue; + int relativeCommand = i - this.minCommand; + String command = ((String)this.commands.get(i)).toUpperCase(); + this.drawCommand(command, 8, 47 + relativeCommand * (this.fontRendererObj.FONT_HEIGHT + 4), this.selCommand == i); + } + } + + private void drawCommand(String command, int x, int y, boolean selected) { + if (selected) { + GuiEncoder.drawOutlineRect(x, y, x + 142, y + this.fontRendererObj.FONT_HEIGHT + 4, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f); + } + this.fontRendererObj.drawString(command, x + 3, y + this.fontRendererObj.FONT_HEIGHT / 2 - 1, 0xFFFFFF, false); + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + this.commandField.mouseClicked(x - this.containerWidth, y - this.containerHeight, button); + if (button == 0) { + if (x >= this.containerWidth + 8) { + if (y >= this.containerHeight + 47 + 0) { + if (x <= this.containerWidth + (this.xSize - 25)) { + if (y <= this.containerHeight + 46 + 80 + 0) { + this.listClicked(x - (this.containerWidth + 8), y - (this.containerHeight + 47 + 0)); + } else { + this.selCommand = -1; + } + } else { + this.selCommand = -1; + } + } else { + this.selCommand = -1; + } + } else { + this.selCommand = -1; + } + } + } + + private void listClicked(int relativeX, int relativeY) { + int itemClicked = relativeY / 13; + this.selCommand = itemClicked + this.minCommand; + } + + @Override + protected void keyTyped(char character, int keycode) { + if (character != 'e' && character != 'E') { + super.keyTyped(character, keycode); + } + this.commandField.textboxKeyTyped(character, keycode); + if (keycode == 1) { + this.mc.thePlayer.closeScreen(); + } else if (keycode == 28) { + if (this.commandField.isFocused()) { + this.actionPerformed(this.addButton); + } + } else if (keycode == 211) { + this.actionPerformed(this.delButton); + } else if (keycode == 201) { + this.actionPerformed(this.pUpButton); + } else if (keycode == 209) { + this.actionPerformed(this.pDnButton); + } else if (keycode == 200) { + --this.selCommand; + if (this.selCommand < -1) { + this.selCommand = this.commands.size() - 1; + } + if (this.selCommand < this.minCommand && this.selCommand >= 0) { + this.minCommand = this.selCommand; + } + if (this.selCommand >= this.minCommand + 6 && this.selCommand < this.commands.size()) { + this.minCommand = this.selCommand - 6 + 1; + } + } else if (keycode == 208) { + ++this.selCommand; + if (this.selCommand >= this.commands.size()) { + this.selCommand = -1; + } + if (this.selCommand >= this.minCommand + 6 && this.selCommand < this.commands.size()) { + this.minCommand = this.selCommand - 6 + 1; + } + if (this.selCommand < this.minCommand && this.selCommand >= 0) { + this.minCommand = this.selCommand; + } + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { + this.mc.renderEngine.bindTexture(new ResourceLocation("assemblyline", "textures/gui/gui_encoder.png")); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + this.drawTexturedModalRect(this.containerWidth, this.containerHeight + 0, 0, 0, this.xSize, this.ySize); + GuiEncoder.drawOutlineRect(this.containerWidth + 7, this.containerHeight + 46 + 0, this.containerWidth + (this.xSize - 25), this.containerHeight + 46 + 80 + 0, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.5f); + } + + public static void drawOutlineRect(int x1, int y1, int x2, int y2, float rR, float rG, float rB, float lR, float lG, float lB) { + Tessellator tesselator = Tessellator.instance; + GL11.glEnable((int)3042); + GL11.glDisable((int)3553); + GL11.glBlendFunc((int)770, (int)771); + GL11.glColor4f((float)rR, (float)rG, (float)rB, (float)1.0f); + if (rR >= 0.0f && rG >= 0.0f && rB >= 0.0f) { + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.draw(); + } + GL11.glColor4f((float)lR, (float)lG, (float)lB, (float)1.0f); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x1 + 1.0, (double)y2, 0.0); + tesselator.addVertex((double)x1 + 1.0, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x2 - 1.0, (double)y1, 0.0); + tesselator.addVertex((double)x2 - 1.0, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y1, 0.0); + tesselator.addVertex((double)x1, (double)y1 + 1.0, 0.0); + tesselator.addVertex((double)x2, (double)y1 + 1.0, 0.0); + tesselator.addVertex((double)x2, (double)y1, 0.0); + tesselator.draw(); + tesselator.startDrawingQuads(); + tesselator.addVertex((double)x1, (double)y2 - 1.0, 0.0); + tesselator.addVertex((double)x1, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2, 0.0); + tesselator.addVertex((double)x2, (double)y2 - 1.0, 0.0); + tesselator.draw(); + GL11.glEnable((int)3553); + GL11.glDisable((int)3042); + } + + private void updateCommands() { + if (this.commands != null) { + ItemStack disk; + this.commands.clear(); + if (this.tileEntity != null && (disk = this.tileEntity.getStackInSlot(0)) != null) { + this.commands = ItemDisk.getCommands(disk); + } + if (this.minCommand + 6 >= this.commands.size()) { + this.minCommand = this.commands.size() - 6; + } + if (this.minCommand < 0) { + this.minCommand = 0; + } + } + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents((boolean)false); + } + + @Override + public void inventoryChanged() { + this.updateCommands(); + } +} + diff --git a/src/main/java/assemblyline/client/gui/GuiImprinter.java b/src/main/java/assemblyline/client/gui/GuiImprinter.java new file mode 100644 index 0000000..007af89 --- /dev/null +++ b/src/main/java/assemblyline/client/gui/GuiImprinter.java @@ -0,0 +1,41 @@ +package assemblyline.client.gui; + +import assemblyline.common.machine.imprinter.ContainerImprinter; +import assemblyline.common.machine.imprinter.TileEntityImprinter; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; +import universalelectricity.prefab.TranslationHelper; + +public class GuiImprinter +extends GuiContainer { + private int containerWidth; + private int containerHeight; + private TileEntityImprinter tileEntity; + + public GuiImprinter(InventoryPlayer par1InventoryPlayer, TileEntityImprinter tileEntity) { + super((Container)new ContainerImprinter(par1InventoryPlayer, tileEntity)); + this.tileEntity = tileEntity; + this.ySize = 201; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) { + this.fontRendererObj.drawString("Use Inventories:", 70, 58, 0x404040); + this.fontRendererObj.drawString("" + this.tileEntity.searchInventories, 105, 67, 0x404040); + this.fontRendererObj.drawString(TranslationHelper.getLocal("tile.imprinter.name"), 68, 6, 0x404040); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { + this.mc.renderEngine.bindTexture(new ResourceLocation("assemblyline", "textures/gui/gui_imprinter.png")); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + this.containerWidth = (this.width - this.xSize) / 2; + this.containerHeight = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, this.xSize, this.ySize); + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelAngledBelt.java b/src/main/java/assemblyline/client/model/ModelAngledBelt.java new file mode 100644 index 0000000..b613c45 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelAngledBelt.java @@ -0,0 +1,68 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelAngledBelt +extends ModelBase { + ModelRenderer MRoller1; + ModelRenderer bBELT; + ModelRenderer MRoller2; + ModelRenderer tBELT; + ModelRenderer MRoller3; + + public ModelAngledBelt() { + this.textureWidth = 128; + this.textureHeight = 128; + this.MRoller1 = new ModelRenderer((ModelBase)this, 0, 26); + this.MRoller1.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.MRoller1.setRotationPoint(0.0f, 14.0f, 0.0f); + this.MRoller1.setTextureSize(128, 128); + this.MRoller1.mirror = true; + this.setRotation(this.MRoller1, 0.7853982f, 0.0f, 0.0f); + this.bBELT = new ModelRenderer((ModelBase)this, 0, 0); + this.bBELT.addBox(0.0f, 0.0f, 0.0f, 14, 1, 23); + this.bBELT.setRotationPoint(-7.0f, 23.5f, -8.0f); + this.bBELT.setTextureSize(128, 128); + this.bBELT.mirror = true; + this.setRotation(this.bBELT, 0.7853982f, 0.0f, 0.0f); + this.MRoller2 = new ModelRenderer((ModelBase)this, 0, 26); + this.MRoller2.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.MRoller2.setRotationPoint(0.0f, 9.0f, 5.0f); + this.MRoller2.setTextureSize(128, 128); + this.MRoller2.mirror = true; + this.setRotation(this.MRoller2, 0.7853982f, 0.0f, 0.0f); + this.tBELT = new ModelRenderer((ModelBase)this, 0, 0); + this.tBELT.addBox(0.0f, 0.0f, 0.0f, 14, 1, 23); + this.tBELT.setRotationPoint(-7.0f, 19.0f, -8.0f); + this.tBELT.setTextureSize(128, 128); + this.tBELT.mirror = true; + this.setRotation(this.tBELT, 0.7853982f, 0.0f, 0.0f); + this.MRoller3 = new ModelRenderer((ModelBase)this, 0, 26); + this.MRoller3.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.MRoller3.setRotationPoint(0.0f, 19.0f, -5.0f); + this.MRoller3.setTextureSize(128, 128); + this.MRoller3.mirror = true; + this.setRotation(this.MRoller3, 0.7853982f, 0.0f, 0.0f); + } + + public void render(float f5, boolean slantAdjust) { + if (slantAdjust) { + this.bBELT.setRotationPoint(-7.0f, 21.5f, -7.0f); + } else { + this.bBELT.setRotationPoint(-7.0f, 23.5f, -8.0f); + } + this.MRoller1.render(f5); + this.bBELT.render(f5); + this.MRoller2.render(f5); + this.tBELT.render(f5); + this.MRoller3.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelArmbot.java b/src/main/java/assemblyline/client/model/ModelArmbot.java new file mode 100644 index 0000000..b56cdbc --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelArmbot.java @@ -0,0 +1,154 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import org.lwjgl.opengl.GL11; + +public class ModelArmbot +extends ModelBase { + ModelRenderer baseTop; + ModelRenderer base; + ModelRenderer armMountRight; + ModelRenderer armMountLeft; + ModelRenderer armLower; + ModelRenderer armLower2; + ModelRenderer armLower3; + ModelRenderer armUpper; + ModelRenderer baseRotation; + ModelRenderer clampBody; + ModelRenderer clampBody2; + ModelRenderer clampClawLower; + ModelRenderer clampClawLower2; + ModelRenderer clampClawLower3; + + public ModelArmbot() { + this.textureWidth = 128; + this.textureHeight = 128; + this.baseTop = new ModelRenderer((ModelBase)this, 0, 94); + this.baseTop.addBox(-6.0f, 0.0f, -6.0f, 12, 3, 12); + this.baseTop.setRotationPoint(0.0f, 18.0f, 0.0f); + this.baseTop.setTextureSize(64, 32); + this.baseTop.mirror = true; + this.setRotation(this.baseTop, 0.0f, 0.0f, 0.0f); + this.base = new ModelRenderer((ModelBase)this, 0, 109); + this.base.addBox(-8.0f, 0.0f, -8.0f, 16, 3, 16); + this.base.setRotationPoint(0.0f, 21.0f, 0.0f); + this.base.setTextureSize(64, 32); + this.base.mirror = true; + this.setRotation(this.base, 0.0f, 0.0f, 0.0f); + this.armMountRight = new ModelRenderer((ModelBase)this, 24, 85); + this.armMountRight.addBox(-3.8f, -5.0f, -2.0f, 4, 5, 4); + this.armMountRight.setRotationPoint(0.0f, 17.0f, 0.0f); + this.armMountRight.setTextureSize(128, 128); + this.armMountRight.mirror = true; + this.setRotation(this.armMountRight, 0.0f, 0.0f, 0.0f); + this.armMountLeft = new ModelRenderer((ModelBase)this, 0, 85); + this.armMountLeft.addBox(2.0f, -5.0f, -2.0f, 2, 5, 4); + this.armMountLeft.setRotationPoint(0.0f, 17.0f, 0.0f); + this.armMountLeft.setTextureSize(64, 32); + this.armMountLeft.mirror = true; + this.setRotation(this.armMountLeft, 0.0f, 0.0f, 0.0f); + this.armLower = new ModelRenderer((ModelBase)this, 116, 0); + this.armLower.addBox(0.3f, -15.0f, -1.5f, 2, 16, 4); + this.armLower.setRotationPoint(0.0f, 14.0f, 0.0f); + this.armLower.setTextureSize(64, 32); + this.armLower.mirror = true; + this.setRotation(this.armLower, 0.5235988f, 0.0f, 0.0f); + this.armLower2 = new ModelRenderer((ModelBase)this, 104, 0); + this.armLower2.addBox(-2.3f, -15.0f, -1.5f, 2, 16, 4); + this.armLower2.setRotationPoint(0.0f, 14.0f, 0.0f); + this.armLower2.setTextureSize(64, 32); + this.armLower2.mirror = true; + this.setRotation(this.armLower2, 0.5235988f, 0.0f, 0.0f); + this.armLower3 = new ModelRenderer((ModelBase)this, 92, 0); + this.armLower3.addBox(-1.0f, -14.0f, -2.0f, 2, 14, 4); + this.armLower3.setRotationPoint(0.0f, 14.0f, 0.0f); + this.armLower3.setTextureSize(64, 32); + this.armLower3.mirror = true; + this.setRotation(this.armLower3, 0.5235988f, 0.0f, 0.0f); + this.armUpper = new ModelRenderer((ModelBase)this, 0, 70); + this.armUpper.addBox(-1.0f, -10.0f, -1.5f, 2, 12, 3); + this.armUpper.setRotationPoint(0.0f, 2.0f, -7.0f); + this.armUpper.setTextureSize(64, 32); + this.armUpper.mirror = true; + this.setRotation(this.armUpper, 2.513274f, 0.0f, 0.0f); + this.baseRotation = new ModelRenderer((ModelBase)this, 0, 60); + this.baseRotation.addBox(-4.5f, 0.0f, -4.5f, 9, 1, 9); + this.baseRotation.setRotationPoint(0.0f, 17.0f, 0.0f); + this.baseRotation.setTextureSize(64, 32); + this.baseRotation.mirror = true; + this.setRotation(this.baseRotation, 0.0f, 0.0f, 0.0f); + this.clampBody = new ModelRenderer((ModelBase)this, 0, 7); + this.clampBody.addBox(-1.5f, -12.0f, -2.5f, 3, 2, 5); + this.clampBody.setRotationPoint(0.0f, 2.0f, -7.0f); + this.clampBody.setTextureSize(64, 32); + this.clampBody.mirror = true; + this.setRotation(this.clampBody, 2.513274f, 0.0f, 0.0f); + this.clampBody2 = new ModelRenderer((ModelBase)this, 0, 56); + this.clampBody2.addBox(-1.0f, -14.0f, -1.0f, 2, 2, 2); + this.clampBody2.setRotationPoint(0.0f, 2.0f, -7.0f); + this.clampBody2.setTextureSize(64, 32); + this.clampBody2.mirror = true; + this.setRotation(this.clampBody2, 2.513274f, 0.0f, 0.0f); + this.clampClawLower = new ModelRenderer((ModelBase)this, 0, 25); + this.clampClawLower.addBox(-1.0f, -4.0f, -1.0f, 2, 5, 1); + this.clampClawLower.setRotationPoint(0.0f, 13.0f, -15.0f); + this.clampClawLower.setTextureSize(64, 32); + this.clampClawLower.mirror = true; + this.setRotation(this.clampClawLower, 2.9147f, 0.0f, 0.0f); + this.clampClawLower2 = new ModelRenderer((ModelBase)this, 0, 31); + this.clampClawLower2.addBox(-1.2f, -3.5f, 0.0f, 1, 6, 1); + this.clampClawLower2.setRotationPoint(0.0f, 14.0f, -16.0f); + this.clampClawLower2.setTextureSize(64, 32); + this.clampClawLower2.mirror = true; + this.setRotation(this.clampClawLower2, 2.897247f, 0.0f, 0.0f); + this.clampClawLower3 = new ModelRenderer((ModelBase)this, 0, 0); + this.clampClawLower3.addBox(0.2f, -3.5f, 0.0f, 1, 6, 1); + this.clampClawLower3.setRotationPoint(0.0f, 14.0f, -16.0f); + this.clampClawLower3.setTextureSize(64, 32); + this.clampClawLower3.mirror = true; + this.setRotation(this.clampClawLower3, 2.897247f, 0.0f, 0.0f); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { + super.render(entity, f, f1, f2, f3, f4, f5); + this.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.render(f5, entity.rotationYaw, entity.rotationPitch); + } + + public void render(float f5, float rotationYaw, float rotationPitch) { + this.baseTop.render(f5); + this.base.render(f5); + GL11.glPushMatrix(); + GL11.glRotatef((float)rotationYaw, (float)0.0f, (float)1.0f, (float)0.0f); + this.armMountRight.render(f5); + this.armMountLeft.render(f5); + this.baseRotation.render(f5); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glRotatef((float)rotationYaw, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glTranslatef((float)0.0f, (float)0.9f, (float)0.0f); + GL11.glRotatef((float)(-rotationPitch), (float)1.0f, (float)0.0f, (float)0.0f); + GL11.glTranslatef((float)0.0f, (float)-0.9f, (float)0.0f); + this.armLower.render(f5); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.0f, (float)0.1f, (float)-0.35f); + GL11.glRotatef((float)(-rotationPitch), (float)1.0f, (float)0.0f, (float)0.0f); + GL11.glTranslatef((float)0.0f, (float)-0.05f, (float)0.35f); + this.armUpper.render(f5); + this.clampBody.render(f5); + this.clampBody2.render(f5); + this.clampClawLower.render(f5); + this.clampClawLower2.render(f5); + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelConveyorBelt.java b/src/main/java/assemblyline/client/model/ModelConveyorBelt.java new file mode 100644 index 0000000..70bc65d --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelConveyorBelt.java @@ -0,0 +1,217 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelConveyorBelt +extends ModelBase { + ModelRenderer bBELTLong; + ModelRenderer FBELT; + ModelRenderer BacBELT; + ModelRenderer BBelt; + ModelRenderer FRL; + ModelRenderer MRL; + ModelRenderer FLL; + ModelRenderer BLL; + ModelRenderer MRoller; + ModelRenderer BRoller; + ModelRenderer tBELT; + ModelRenderer FRoller; + ModelRenderer BRL; + ModelRenderer BML; + ModelRenderer tBELTLong; + ModelRenderer tBELT15; + ModelRenderer bBELT15; + ModelRenderer c4; + ModelRenderer c3; + ModelRenderer c2; + ModelRenderer c1; + + public ModelConveyorBelt() { + this.textureWidth = 128; + this.textureHeight = 128; + this.bBELTLong = new ModelRenderer((ModelBase)this, 0, 66); + this.bBELTLong.addBox(0.0f, 0.0f, 0.0f, 14, 1, 16); + this.bBELTLong.setRotationPoint(-7.0f, 22.0f, -8.0f); + this.bBELTLong.setTextureSize(128, 128); + this.bBELTLong.mirror = true; + this.setRotation(this.bBELTLong, 0.0f, 0.0f, 0.0f); + this.FBELT = new ModelRenderer((ModelBase)this, 0, 16); + this.FBELT.addBox(0.0f, 0.0f, 0.0f, 14, 2, 1); + this.FBELT.setRotationPoint(-7.0f, 20.0f, -8.0f); + this.FBELT.setTextureSize(128, 128); + this.FBELT.mirror = true; + this.setRotation(this.FBELT, 0.0f, 0.0f, 0.0f); + this.BacBELT = new ModelRenderer((ModelBase)this, 0, 16); + this.BacBELT.addBox(0.0f, 0.0f, 0.0f, 14, 2, 1); + this.BacBELT.setRotationPoint(-7.0f, 20.0f, 7.0f); + this.BacBELT.setTextureSize(128, 128); + this.BacBELT.mirror = true; + this.setRotation(this.BacBELT, 0.0f, 0.0f, 0.0f); + this.BBelt = new ModelRenderer((ModelBase)this, 0, 31); + this.BBelt.addBox(0.0f, 0.0f, 0.0f, 14, 1, 14); + this.BBelt.setRotationPoint(-7.0f, 22.0f, -7.0f); + this.BBelt.setTextureSize(128, 128); + this.BBelt.mirror = true; + this.setRotation(this.BBelt, 0.0f, 0.0f, 0.0f); + this.FRL = new ModelRenderer((ModelBase)this, 0, 20); + this.FRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.FRL.setRotationPoint(-8.0f, 21.0f, -6.0f); + this.FRL.setTextureSize(128, 128); + this.FRL.mirror = true; + this.setRotation(this.FRL, 0.0f, 0.0f, 0.0f); + this.MRL = new ModelRenderer((ModelBase)this, 0, 20); + this.MRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.MRL.setRotationPoint(-8.0f, 21.0f, -1.0f); + this.MRL.setTextureSize(128, 128); + this.MRL.mirror = true; + this.setRotation(this.MRL, 0.0f, 0.0f, 0.0f); + this.FLL = new ModelRenderer((ModelBase)this, 0, 20); + this.FLL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.FLL.setRotationPoint(7.0f, 21.0f, -6.0f); + this.FLL.setTextureSize(128, 128); + this.FLL.mirror = true; + this.setRotation(this.FLL, 0.0f, 0.0f, 0.0f); + this.BLL = new ModelRenderer((ModelBase)this, 0, 20); + this.BLL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BLL.setRotationPoint(7.0f, 21.0f, 4.0f); + this.BLL.setTextureSize(128, 128); + this.BLL.mirror = true; + this.setRotation(this.BLL, 0.0f, 0.0f, 0.0f); + this.MRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.MRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.MRoller.setRotationPoint(0.0f, 21.0f, 0.0f); + this.MRoller.setTextureSize(128, 128); + this.MRoller.mirror = true; + this.setRotation(this.MRoller, 0.0f, 0.0f, 0.0f); + this.BRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.BRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.BRoller.setRotationPoint(0.0f, 21.0f, 5.0f); + this.BRoller.setTextureSize(128, 128); + this.BRoller.mirror = true; + this.setRotation(this.BRoller, 0.0f, 0.0f, 0.0f); + this.tBELT = new ModelRenderer((ModelBase)this, 0, 0); + this.tBELT.addBox(0.0f, 0.0f, 0.0f, 14, 1, 14); + this.tBELT.setRotationPoint(-7.0f, 19.0f, -7.0f); + this.tBELT.setTextureSize(128, 128); + this.tBELT.mirror = true; + this.setRotation(this.tBELT, 0.0f, 0.0f, 0.0f); + this.FRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.FRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.FRoller.setRotationPoint(0.0f, 21.0f, -5.0f); + this.FRoller.setTextureSize(128, 128); + this.FRoller.mirror = true; + this.setRotation(this.FRoller, 0.0f, 0.0f, 0.0f); + this.BRL = new ModelRenderer((ModelBase)this, 0, 20); + this.BRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BRL.setRotationPoint(-8.0f, 21.0f, 4.0f); + this.BRL.setTextureSize(128, 128); + this.BRL.mirror = true; + this.setRotation(this.BRL, 0.0f, 0.0f, 0.0f); + this.BML = new ModelRenderer((ModelBase)this, 0, 20); + this.BML.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BML.setRotationPoint(7.0f, 21.0f, -1.0f); + this.BML.setTextureSize(128, 128); + this.BML.mirror = true; + this.setRotation(this.BML, 0.0f, 0.0f, 0.0f); + this.tBELTLong = new ModelRenderer((ModelBase)this, 0, 48); + this.tBELTLong.addBox(0.0f, 0.0f, 0.0f, 14, 1, 16); + this.tBELTLong.setRotationPoint(-7.0f, 19.0f, -8.0f); + this.tBELTLong.setTextureSize(128, 128); + this.tBELTLong.mirror = true; + this.setRotation(this.tBELTLong, 0.0f, 0.0f, 0.0f); + this.tBELT15 = new ModelRenderer((ModelBase)this, 0, 84); + this.tBELT15.addBox(0.0f, 0.0f, 0.0f, 14, 1, 15); + this.tBELT15.setRotationPoint(-7.0f, 19.0f, -8.0f); + this.tBELT15.setTextureSize(128, 128); + this.tBELT15.mirror = true; + this.setRotation(this.tBELT15, 0.0f, 0.0f, 0.0f); + this.bBELT15 = new ModelRenderer((ModelBase)this, 0, 84); + this.bBELT15.addBox(0.0f, 0.0f, 0.0f, 14, 1, 15); + this.bBELT15.setRotationPoint(-7.0f, 22.0f, -8.0f); + this.bBELT15.setTextureSize(128, 128); + this.bBELT15.mirror = true; + this.setRotation(this.bBELT15, 0.0f, 0.0f, 0.0f); + this.c4 = new ModelRenderer((ModelBase)this, 60, 20); + this.c4.addBox(0.0f, 0.0f, 0.0f, 1, 16, 1); + this.c4.setRotationPoint(7.0f, 8.0f, 7.0f); + this.c4.setTextureSize(128, 128); + this.c4.mirror = true; + this.setRotation(this.c4, 0.0f, 0.0f, 0.0f); + this.c3 = new ModelRenderer((ModelBase)this, 60, 20); + this.c3.addBox(0.0f, 0.0f, 0.0f, 1, 16, 1); + this.c3.setRotationPoint(7.0f, 8.0f, -8.0f); + this.c3.setTextureSize(128, 128); + this.c3.mirror = true; + this.setRotation(this.c3, 0.0f, 0.0f, 0.0f); + this.c2 = new ModelRenderer((ModelBase)this, 60, 20); + this.c2.addBox(0.0f, 0.0f, 0.0f, 1, 16, 1); + this.c2.setRotationPoint(-8.0f, 8.0f, 7.0f); + this.c2.setTextureSize(128, 128); + this.c2.mirror = true; + this.setRotation(this.c2, 0.0f, 0.0f, 0.0f); + this.c1 = new ModelRenderer((ModelBase)this, 60, 20); + this.c1.addBox(0.0f, 0.0f, 0.0f, 1, 16, 1); + this.c1.setRotationPoint(-8.0f, 8.0f, -8.0f); + this.c1.setTextureSize(128, 128); + this.c1.mirror = true; + this.setRotation(this.c1, 0.0f, 0.0f, 0.0f); + } + + public void render(float f5, float radians, boolean front, boolean back, boolean above, boolean legs) { + boolean rightCap; + boolean mid = front && back; + boolean leftCap = !front && back; + boolean bl = rightCap = front && !back; + if (back || front) { + if (leftCap) { + this.FBELT.render(f5); + this.tBELT15.setRotationPoint(-7.0f, 19.0f, -7.0f); + this.bBELT15.setRotationPoint(-7.0f, 22.0f, -7.0f); + this.tBELT15.render(f5); + this.bBELT15.render(f5); + } else if (rightCap) { + this.BacBELT.render(f5); + this.tBELT15.setRotationPoint(-7.0f, 19.0f, -8.0f); + this.bBELT15.setRotationPoint(-7.0f, 22.0f, -8.0f); + this.tBELT15.render(f5); + this.bBELT15.render(f5); + } else { + this.bBELTLong.render(f5); + this.tBELTLong.render(f5); + } + } else { + this.FBELT.render(f5); + this.BacBELT.render(f5); + this.BBelt.render(f5); + this.tBELT.render(f5); + } + if (above) { + this.c1.render(f5); + this.c2.render(f5); + this.c3.render(f5); + this.c4.render(f5); + } + this.MRoller.rotateAngleX = radians; + this.BRoller.rotateAngleX = radians; + this.FRoller.rotateAngleX = radians; + this.MRoller.render(f5); + this.BRoller.render(f5); + this.FRoller.render(f5); + if (legs) { + this.BRL.render(f5); + this.BML.render(f5); + this.FLL.render(f5); + this.BLL.render(f5); + this.FRL.render(f5); + this.MRL.render(f5); + } + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelCraneArmMount.java b/src/main/java/assemblyline/client/model/ModelCraneArmMount.java new file mode 100644 index 0000000..f7dded1 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelCraneArmMount.java @@ -0,0 +1,87 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelCraneArmMount +extends ModelBase { + private ModelRenderer RailGuard1; + private ModelRenderer ArmMount; + private ModelRenderer RailGuard2; + private ModelRenderer Base; + private ModelRenderer WheelMount1; + private ModelRenderer Wheel2; + private ModelRenderer WheelMount2; + private ModelRenderer Wheel1; + + public ModelCraneArmMount() { + this.textureWidth = 64; + this.textureHeight = 64; + this.RailGuard1 = new ModelRenderer((ModelBase)this, 0, 20); + this.RailGuard1.addBox(0.0f, 0.0f, 0.0f, 16, 8, 2); + this.RailGuard1.setRotationPoint(-8.0f, 12.0f, 4.0f); + this.RailGuard1.setTextureSize(64, 32); + this.RailGuard1.mirror = true; + this.setRotation(this.RailGuard1, 0.0f, 0.0f, 0.0f); + this.ArmMount = new ModelRenderer((ModelBase)this, 36, 26); + this.ArmMount.addBox(0.0f, 0.0f, 0.0f, 8, 4, 2); + this.ArmMount.setRotationPoint(-4.0f, 4.0f, -8.0f); + this.ArmMount.setTextureSize(64, 32); + this.ArmMount.mirror = true; + this.setRotation(this.ArmMount, 0.0f, 0.0f, 0.0f); + this.RailGuard2 = new ModelRenderer((ModelBase)this, 0, 20); + this.RailGuard2.addBox(0.0f, 0.0f, 0.0f, 16, 8, 2); + this.RailGuard2.setRotationPoint(-8.0f, 12.0f, -6.0f); + this.RailGuard2.setTextureSize(64, 32); + this.RailGuard2.mirror = true; + this.setRotation(this.RailGuard2, 0.0f, 0.0f, 0.0f); + this.Base = new ModelRenderer((ModelBase)this, 0, 0); + this.Base.addBox(0.0f, 0.0f, 0.0f, 16, 4, 16); + this.Base.setRotationPoint(-8.0f, 8.0f, -8.0f); + this.Base.setTextureSize(64, 32); + this.Base.mirror = true; + this.setRotation(this.Base, 0.0f, 0.0f, 0.0f); + this.WheelMount1 = new ModelRenderer((ModelBase)this, 0, 30); + this.WheelMount1.addBox(0.0f, 0.0f, 0.0f, 14, 4, 4); + this.WheelMount1.setRotationPoint(-7.0f, 4.0f, 2.0f); + this.WheelMount1.setTextureSize(64, 32); + this.WheelMount1.mirror = true; + this.setRotation(this.WheelMount1, 0.0f, 0.0f, 0.0f); + this.Wheel2 = new ModelRenderer((ModelBase)this, 36, 20); + this.Wheel2.addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Wheel2.setRotationPoint(1.0f, 6.0f, -1.0f); + this.Wheel2.setTextureSize(64, 32); + this.Wheel2.mirror = true; + this.setRotation(this.Wheel2, 0.0f, 0.0f, 0.0f); + this.WheelMount2 = new ModelRenderer((ModelBase)this, 0, 30); + this.WheelMount2.addBox(0.0f, 0.0f, 0.0f, 14, 4, 4); + this.WheelMount2.setRotationPoint(-7.0f, 4.0f, -6.0f); + this.WheelMount2.setTextureSize(64, 32); + this.WheelMount2.mirror = true; + this.setRotation(this.WheelMount2, 0.0f, 0.0f, 0.0f); + this.Wheel1 = new ModelRenderer((ModelBase)this, 36, 20); + this.Wheel1.addBox(0.0f, 0.0f, 0.0f, 5, 4, 2); + this.Wheel1.setRotationPoint(-6.0f, 6.0f, -1.0f); + this.Wheel1.setTextureSize(64, 32); + this.Wheel1.mirror = true; + this.setRotation(this.Wheel1, 0.0f, 0.0f, 0.0f); + } + + public void render(float scale) { + this.RailGuard1.render(scale); + this.ArmMount.render(scale); + this.RailGuard2.render(scale); + this.Base.render(scale); + this.WheelMount1.render(scale); + this.Wheel2.render(scale); + this.WheelMount2.render(scale); + this.Wheel1.render(scale); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelCraneController.java b/src/main/java/assemblyline/client/model/ModelCraneController.java new file mode 100644 index 0000000..f1c384f --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelCraneController.java @@ -0,0 +1,117 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelCraneController +extends ModelBase { + ModelRenderer Base2; + ModelRenderer Base; + ModelRenderer ConnectorFront; + ModelRenderer Decoration1; + ModelRenderer Decoration2; + ModelRenderer Decoration3; + ModelRenderer Decoration4; + ModelRenderer ConnectorTop; + ModelRenderer ConnectorRight; + + public ModelCraneController() { + this.textureWidth = 128; + this.textureHeight = 64; + this.Base2 = new ModelRenderer((ModelBase)this, 0, 24); + this.Base2.addBox(0.0f, 0.0f, 0.0f, 12, 4, 12); + this.Base2.setRotationPoint(-6.0f, 12.0f, -6.0f); + this.Base2.setTextureSize(128, 64); + this.Base2.mirror = true; + this.setRotation(this.Base2, 0.0f, 0.0f, 0.0f); + this.Base = new ModelRenderer((ModelBase)this, 0, 0); + this.Base.addBox(0.0f, 0.0f, 0.0f, 16, 8, 16); + this.Base.setRotationPoint(-8.0f, 16.0f, -8.0f); + this.Base.setTextureSize(128, 64); + this.Base.mirror = true; + this.setRotation(this.Base, 0.0f, 0.0f, 0.0f); + this.ConnectorFront = new ModelRenderer((ModelBase)this, 64, 0); + this.ConnectorFront.addBox(0.0f, 0.0f, 0.0f, 8, 8, 8); + this.ConnectorFront.setRotationPoint(-4.0f, 12.0f, 0.0f); + this.ConnectorFront.setTextureSize(128, 64); + this.ConnectorFront.mirror = true; + this.setRotation(this.ConnectorFront, 0.0f, 1.570796f, 0.0f); + this.Decoration1 = new ModelRenderer((ModelBase)this, 54, 24); + this.Decoration1.addBox(0.0f, 0.0f, 0.0f, 2, 1, 1); + this.Decoration1.setRotationPoint(2.0f, 15.0f, 6.0f); + this.Decoration1.setTextureSize(128, 64); + this.Decoration1.mirror = true; + this.setRotation(this.Decoration1, 0.0f, 0.0f, 0.0f); + this.Decoration2 = new ModelRenderer((ModelBase)this, 54, 24); + this.Decoration2.addBox(0.0f, 0.0f, 0.0f, 2, 1, 1); + this.Decoration2.setRotationPoint(-4.0f, 15.0f, 6.0f); + this.Decoration2.setTextureSize(128, 64); + this.Decoration2.mirror = true; + this.setRotation(this.Decoration2, 0.0f, 0.0f, 0.0f); + this.Decoration3 = new ModelRenderer((ModelBase)this, 48, 24); + this.Decoration3.addBox(0.0f, 0.0f, 0.0f, 1, 1, 2); + this.Decoration3.setRotationPoint(-7.0f, 15.0f, 2.0f); + this.Decoration3.setTextureSize(128, 64); + this.Decoration3.mirror = true; + this.setRotation(this.Decoration3, 0.0f, 0.0f, 0.0f); + this.Decoration4 = new ModelRenderer((ModelBase)this, 48, 24); + this.Decoration4.addBox(0.0f, 0.0f, 0.0f, 1, 1, 2); + this.Decoration4.setRotationPoint(-7.0f, 15.0f, -4.0f); + this.Decoration4.setTextureSize(128, 64); + this.Decoration4.mirror = true; + this.setRotation(this.Decoration4, 0.0f, 0.0f, 0.0f); + this.ConnectorTop = new ModelRenderer((ModelBase)this, 64, 0); + this.ConnectorTop.addBox(0.0f, 0.0f, 0.0f, 8, 8, 8); + this.ConnectorTop.setRotationPoint(-4.0f, 16.0f, -4.0f); + this.ConnectorTop.setTextureSize(128, 64); + this.ConnectorTop.mirror = true; + this.setRotation(this.ConnectorTop, 0.0f, 0.0f, -1.570796f); + this.ConnectorRight = new ModelRenderer((ModelBase)this, 64, 0); + this.ConnectorRight.addBox(0.0f, 0.0f, 0.0f, 8, 8, 8); + this.ConnectorRight.setRotationPoint(0.0f, 12.0f, -4.0f); + this.ConnectorRight.setTextureSize(128, 64); + this.ConnectorRight.mirror = true; + this.setRotation(this.ConnectorRight, 0.0f, 0.0f, 0.0f); + } + + public void render(float scale, boolean connectEast, boolean connectNorth) { + this.Base2.setRotationPoint(-6.0f, 12.0f, -6.0f); + this.setRotation(this.Base2, 0.0f, 0.0f, 0.0f); + this.Base.setRotationPoint(-8.0f, 16.0f, -8.0f); + this.setRotation(this.Base, 0.0f, 0.0f, 0.0f); + this.Decoration1.setRotationPoint(2.0f, 15.0f, 6.0f); + this.setRotation(this.Decoration1, 0.0f, 0.0f, 0.0f); + this.Decoration2.setRotationPoint(-4.0f, 15.0f, 6.0f); + this.setRotation(this.Decoration2, 0.0f, 0.0f, 0.0f); + this.Decoration3.setRotationPoint(-7.0f, 15.0f, 2.0f); + this.setRotation(this.Decoration3, 0.0f, 0.0f, 0.0f); + this.Decoration4.setRotationPoint(-7.0f, 15.0f, -4.0f); + this.setRotation(this.Decoration4, 0.0f, 0.0f, 0.0f); + this.ConnectorTop.setRotationPoint(-4.0f, 16.0f, -4.0f); + this.setRotation(this.ConnectorTop, 0.0f, 0.0f, -1.570796f); + this.ConnectorFront.setRotationPoint(-4.0f, 11.99f, -0.01f); + this.setRotation(this.ConnectorFront, 0.0f, 1.570796f, 0.0f); + this.ConnectorRight.setRotationPoint(0.01f, 11.99f, -4.0f); + this.setRotation(this.ConnectorRight, 0.0f, 0.0f, 0.0f); + this.Base2.render(scale); + this.Base.render(scale); + this.ConnectorTop.render(scale); + if (connectEast) { + this.ConnectorFront.render(scale); + this.Decoration1.render(scale); + this.Decoration2.render(scale); + } + if (connectNorth) { + this.ConnectorRight.render(scale); + this.Decoration3.render(scale); + this.Decoration4.render(scale); + } + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelCraneRail.java b/src/main/java/assemblyline/client/model/ModelCraneRail.java new file mode 100644 index 0000000..c61d029 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelCraneRail.java @@ -0,0 +1,454 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelCraneRail +extends ModelBase { + ModelRenderer SegmentUBLeft; + ModelRenderer SegmentUFLeft; + ModelRenderer SegmentBFLeft; + ModelRenderer SegmentBBLeft; + ModelRenderer SegmentBLBack; + ModelRenderer SegmentLUBack; + ModelRenderer SegmentRUBack; + ModelRenderer SegmentBRBack; + ModelRenderer SegmentBLFront; + ModelRenderer SegmentLUFront; + ModelRenderer SegmentRUFront; + ModelRenderer SegmentBRFront; + ModelRenderer SegmentLBUp; + ModelRenderer SegmentRBUp; + ModelRenderer SegmentLFUp; + ModelRenderer SegmentRFUp; + ModelRenderer SegmentUBRight; + ModelRenderer SegmentBFRight; + ModelRenderer SegmentUFRight; + ModelRenderer SegmentBBRight; + ModelRenderer SegmentLFDown; + ModelRenderer SegmentLBDown; + ModelRenderer SegmentRBDown; + ModelRenderer SegmentRFDown; + ModelRenderer SegmentBFMid; + ModelRenderer SegmentUBMid; + ModelRenderer SegmentBBMid; + ModelRenderer SegmentUFMid; + ModelRenderer SegmentLBMid; + ModelRenderer SegmentLFMid; + ModelRenderer SegmentRBMid; + ModelRenderer SegmentRFMid; + ModelRenderer SegmentRUMid; + ModelRenderer SegmentBRMid; + ModelRenderer SegmentBLMid; + ModelRenderer SegmentLUMid; + ModelRenderer SegmentMidDiag1; + ModelRenderer SegmentMidDiag2; + ModelRenderer SegmentMidDiag3; + ModelRenderer SegmentMidDiag4; + ModelRenderer SegmentMidDiag5; + ModelRenderer SegmentMidDiag6; + ModelRenderer SegmentMidDiag7; + ModelRenderer SegmentMidDiag8; + ModelRenderer FootBottom; + ModelRenderer FootTop; + + public ModelCraneRail() { + this.textureWidth = 64; + this.textureHeight = 32; + this.SegmentBLBack = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentBLBack.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentBLBack.setRotationPoint(3.0f, 19.0f, 4.0f); + this.SegmentBLBack.setTextureSize(64, 32); + this.SegmentBLBack.mirror = true; + this.setRotation(this.SegmentBLBack, 0.0f, 0.0f, 0.0f); + this.SegmentLUBack = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentLUBack.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentLUBack.setRotationPoint(3.0f, 12.0f, 4.0f); + this.SegmentLUBack.setTextureSize(64, 32); + this.SegmentLUBack.mirror = true; + this.setRotation(this.SegmentLUBack, 0.0f, 0.0f, 0.0f); + this.SegmentRUBack = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentRUBack.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentRUBack.setRotationPoint(-4.0f, 12.0f, 4.0f); + this.SegmentRUBack.setTextureSize(64, 32); + this.SegmentRUBack.mirror = true; + this.setRotation(this.SegmentRUBack, 0.0f, 0.0f, 0.0f); + this.SegmentBRBack = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentBRBack.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentBRBack.setRotationPoint(-4.0f, 19.0f, 4.0f); + this.SegmentBRBack.setTextureSize(64, 32); + this.SegmentBRBack.mirror = true; + this.setRotation(this.SegmentBRBack, 0.0f, 0.0f, 0.0f); + this.SegmentBLFront = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentBLFront.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentBLFront.setRotationPoint(3.0f, 19.0f, -8.0f); + this.SegmentBLFront.setTextureSize(64, 32); + this.SegmentBLFront.mirror = true; + this.setRotation(this.SegmentBLFront, 0.0f, 0.0f, 0.0f); + this.SegmentLUFront = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentLUFront.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentLUFront.setRotationPoint(3.0f, 12.0f, -8.0f); + this.SegmentLUFront.setTextureSize(64, 32); + this.SegmentLUFront.mirror = true; + this.setRotation(this.SegmentLUFront, 0.0f, 0.0f, 0.0f); + this.SegmentRUFront = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentRUFront.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentRUFront.setRotationPoint(-4.0f, 12.0f, -8.0f); + this.SegmentRUFront.setTextureSize(64, 32); + this.SegmentRUFront.mirror = true; + this.setRotation(this.SegmentRUFront, 0.0f, 0.0f, 0.0f); + this.SegmentBRFront = new ModelRenderer((ModelBase)this, 10, 13); + this.SegmentBRFront.addBox(0.0f, 0.0f, 0.0f, 1, 1, 4); + this.SegmentBRFront.setRotationPoint(-4.0f, 19.0f, -8.0f); + this.SegmentBRFront.setTextureSize(64, 32); + this.SegmentBRFront.mirror = true; + this.setRotation(this.SegmentBRFront, 0.0f, 0.0f, 0.0f); + this.SegmentLBUp = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentLBUp.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentLBUp.setRotationPoint(3.0f, 8.0f, 3.0f); + this.SegmentLBUp.setTextureSize(64, 32); + this.SegmentLBUp.mirror = true; + this.setRotation(this.SegmentLBUp, 0.0f, 0.0f, 0.0f); + this.SegmentRBUp = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentRBUp.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentRBUp.setRotationPoint(-4.0f, 8.0f, 3.0f); + this.SegmentRBUp.setTextureSize(64, 32); + this.SegmentRBUp.mirror = true; + this.setRotation(this.SegmentRBUp, 0.0f, 0.0f, 0.0f); + this.SegmentLFUp = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentLFUp.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentLFUp.setRotationPoint(3.0f, 8.0f, -4.0f); + this.SegmentLFUp.setTextureSize(64, 32); + this.SegmentLFUp.mirror = true; + this.setRotation(this.SegmentLFUp, 0.0f, 0.0f, 0.0f); + this.SegmentRFUp = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentRFUp.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentRFUp.setRotationPoint(-4.0f, 8.0f, -4.0f); + this.SegmentRFUp.setTextureSize(64, 32); + this.SegmentRFUp.mirror = true; + this.setRotation(this.SegmentRFUp, 0.0f, 0.0f, 0.0f); + this.SegmentUBRight = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentUBRight.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentUBRight.setRotationPoint(-8.0f, 12.0f, 3.0f); + this.SegmentUBRight.setTextureSize(64, 32); + this.SegmentUBRight.mirror = true; + this.setRotation(this.SegmentUBRight, 0.0f, 0.0f, 0.0f); + this.SegmentBFRight = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentBFRight.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentBFRight.setRotationPoint(-8.0f, 19.0f, -4.0f); + this.SegmentBFRight.setTextureSize(64, 32); + this.SegmentBFRight.mirror = true; + this.setRotation(this.SegmentBFRight, 0.0f, 0.0f, 0.0f); + this.SegmentUFRight = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentUFRight.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentUFRight.setRotationPoint(-8.0f, 12.0f, -4.0f); + this.SegmentUFRight.setTextureSize(64, 32); + this.SegmentUFRight.mirror = true; + this.setRotation(this.SegmentUFRight, 0.0f, 0.0f, 0.0f); + this.SegmentBBRight = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentBBRight.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentBBRight.setRotationPoint(-8.0f, 19.0f, 3.0f); + this.SegmentBBRight.setTextureSize(64, 32); + this.SegmentBBRight.mirror = true; + this.setRotation(this.SegmentBBRight, 0.0f, 0.0f, 0.0f); + this.SegmentLFDown = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentLFDown.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentLFDown.setRotationPoint(3.0f, 20.0f, -4.0f); + this.SegmentLFDown.setTextureSize(64, 32); + this.SegmentLFDown.mirror = true; + this.setRotation(this.SegmentLFDown, 0.0f, 0.0f, 0.0f); + this.SegmentLBDown = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentLBDown.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentLBDown.setRotationPoint(3.0f, 20.0f, 3.0f); + this.SegmentLBDown.setTextureSize(64, 32); + this.SegmentLBDown.mirror = true; + this.setRotation(this.SegmentLBDown, 0.0f, 0.0f, 0.0f); + this.SegmentRBDown = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentRBDown.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentRBDown.setRotationPoint(-4.0f, 20.0f, 3.0f); + this.SegmentRBDown.setTextureSize(64, 32); + this.SegmentRBDown.mirror = true; + this.setRotation(this.SegmentRBDown, 0.0f, 0.0f, 0.0f); + this.FootTop = new ModelRenderer((ModelBase)this, 24, 0); + this.FootTop.addBox(0.0f, 0.0f, 0.0f, 10, 2, 10); + this.FootTop.setRotationPoint(-5.0f, 20.0f, -5.0f); + this.FootTop.setTextureSize(64, 32); + this.FootTop.mirror = true; + this.setRotation(this.FootTop, 0.0f, 0.0f, 0.0f); + this.SegmentRFDown = new ModelRenderer((ModelBase)this, 20, 13); + this.SegmentRFDown.addBox(0.0f, 0.0f, 0.0f, 1, 4, 1); + this.SegmentRFDown.setRotationPoint(-4.0f, 20.0f, -4.0f); + this.SegmentRFDown.setTextureSize(64, 32); + this.SegmentRFDown.mirror = true; + this.setRotation(this.SegmentRFDown, 0.0f, 0.0f, 0.0f); + this.FootBottom = new ModelRenderer((ModelBase)this, 0, 18); + this.FootBottom.addBox(0.0f, 0.0f, 0.0f, 12, 2, 12); + this.FootBottom.setRotationPoint(-6.0f, 22.0f, -6.0f); + this.FootBottom.setTextureSize(64, 32); + this.FootBottom.mirror = true; + this.setRotation(this.FootBottom, 0.0f, 0.0f, 0.0f); + this.SegmentBFMid = new ModelRenderer((ModelBase)this, 30, 12); + this.SegmentBFMid.addBox(0.0f, 0.0f, 0.0f, 8, 1, 1); + this.SegmentBFMid.setRotationPoint(-4.0f, 19.0f, -4.0f); + this.SegmentBFMid.setTextureSize(64, 32); + this.SegmentBFMid.mirror = true; + this.setRotation(this.SegmentBFMid, 0.0f, 0.0f, 0.0f); + this.SegmentUBMid = new ModelRenderer((ModelBase)this, 30, 12); + this.SegmentUBMid.addBox(0.0f, 0.0f, 0.0f, 8, 1, 1); + this.SegmentUBMid.setRotationPoint(-4.0f, 12.0f, 3.0f); + this.SegmentUBMid.setTextureSize(64, 32); + this.SegmentUBMid.mirror = true; + this.setRotation(this.SegmentUBMid, 0.0f, 0.0f, 0.0f); + this.SegmentBBMid = new ModelRenderer((ModelBase)this, 30, 12); + this.SegmentBBMid.addBox(0.0f, 0.0f, 0.0f, 8, 1, 1); + this.SegmentBBMid.setRotationPoint(-4.0f, 19.0f, 3.0f); + this.SegmentBBMid.setTextureSize(64, 32); + this.SegmentBBMid.mirror = true; + this.setRotation(this.SegmentBBMid, 0.0f, 0.0f, 0.0f); + this.SegmentUFMid = new ModelRenderer((ModelBase)this, 30, 12); + this.SegmentUFMid.addBox(0.0f, 0.0f, 0.0f, 8, 1, 1); + this.SegmentUFMid.setRotationPoint(-4.0f, 12.0f, -4.0f); + this.SegmentUFMid.setTextureSize(64, 32); + this.SegmentUFMid.mirror = true; + this.setRotation(this.SegmentUFMid, 0.0f, 0.0f, 0.0f); + this.SegmentLBMid = new ModelRenderer((ModelBase)this, 48, 19); + this.SegmentLBMid.addBox(0.0f, 0.0f, 0.0f, 1, 6, 1); + this.SegmentLBMid.setRotationPoint(3.0f, 13.0f, 3.0f); + this.SegmentLBMid.setTextureSize(64, 32); + this.SegmentLBMid.mirror = true; + this.setRotation(this.SegmentLBMid, 0.0f, 0.0f, 0.0f); + this.SegmentLFMid = new ModelRenderer((ModelBase)this, 48, 19); + this.SegmentLFMid.addBox(0.0f, 0.0f, 0.0f, 1, 6, 1); + this.SegmentLFMid.setRotationPoint(3.0f, 13.0f, -4.0f); + this.SegmentLFMid.setTextureSize(64, 32); + this.SegmentLFMid.mirror = true; + this.setRotation(this.SegmentLFMid, 0.0f, 0.0f, 0.0f); + this.SegmentRBMid = new ModelRenderer((ModelBase)this, 48, 19); + this.SegmentRBMid.addBox(0.0f, 0.0f, 0.0f, 1, 6, 1); + this.SegmentRBMid.setRotationPoint(-4.0f, 13.0f, 3.0f); + this.SegmentRBMid.setTextureSize(64, 32); + this.SegmentRBMid.mirror = true; + this.setRotation(this.SegmentRBMid, 0.0f, 0.0f, 0.0f); + this.SegmentRFMid = new ModelRenderer((ModelBase)this, 48, 19); + this.SegmentRFMid.addBox(0.0f, 0.0f, 0.0f, 1, 6, 1); + this.SegmentRFMid.setRotationPoint(-4.0f, 13.0f, -4.0f); + this.SegmentRFMid.setTextureSize(64, 32); + this.SegmentRFMid.mirror = true; + this.setRotation(this.SegmentRFMid, 0.0f, 0.0f, 0.0f); + this.SegmentMidDiag4 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag4.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag4.setRotationPoint(-3.99f, 12.0f, -3.0f); + this.SegmentMidDiag4.setTextureSize(64, 32); + this.SegmentMidDiag4.mirror = true; + this.setRotation(this.SegmentMidDiag4, -0.7853982f, 0.0f, 0.0f); + this.SegmentRUMid = new ModelRenderer((ModelBase)this, 48, 12); + this.SegmentRUMid.addBox(0.0f, 0.0f, 0.0f, 1, 1, 6); + this.SegmentRUMid.setRotationPoint(-4.0f, 12.0f, -3.0f); + this.SegmentRUMid.setTextureSize(64, 32); + this.SegmentRUMid.mirror = true; + this.setRotation(this.SegmentRUMid, 0.0f, 0.0f, 0.0f); + this.SegmentBRMid = new ModelRenderer((ModelBase)this, 48, 12); + this.SegmentBRMid.addBox(0.0f, 0.0f, 0.0f, 1, 1, 6); + this.SegmentBRMid.setRotationPoint(-4.0f, 19.0f, -3.0f); + this.SegmentBRMid.setTextureSize(64, 32); + this.SegmentBRMid.mirror = true; + this.setRotation(this.SegmentBRMid, 0.0f, 0.0f, 0.0f); + this.SegmentBLMid = new ModelRenderer((ModelBase)this, 48, 12); + this.SegmentBLMid.addBox(0.0f, 0.0f, 0.0f, 1, 1, 6); + this.SegmentBLMid.setRotationPoint(3.0f, 19.0f, -3.0f); + this.SegmentBLMid.setTextureSize(64, 32); + this.SegmentBLMid.mirror = true; + this.setRotation(this.SegmentBLMid, 0.0f, 0.0f, 0.0f); + this.SegmentLUMid = new ModelRenderer((ModelBase)this, 48, 12); + this.SegmentLUMid.addBox(0.0f, 0.0f, 0.0f, 1, 1, 6); + this.SegmentLUMid.setRotationPoint(3.0f, 12.0f, -3.0f); + this.SegmentLUMid.setTextureSize(64, 32); + this.SegmentLUMid.mirror = true; + this.setRotation(this.SegmentLUMid, 0.0f, 0.0f, 0.0f); + this.SegmentMidDiag3 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag3.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag3.setRotationPoint(-4.0f, 19.0f, -4.0f); + this.SegmentMidDiag3.setTextureSize(64, 32); + this.SegmentMidDiag3.mirror = true; + this.setRotation(this.SegmentMidDiag3, 0.7853982f, 0.0f, 0.0f); + this.SegmentMidDiag7 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag7.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag7.setRotationPoint(-2.99f, 12.0f, 4.0f); + this.SegmentMidDiag7.setTextureSize(64, 32); + this.SegmentMidDiag7.mirror = true; + this.setRotation(this.SegmentMidDiag7, -0.7853982f, 1.570796f, 0.0f); + this.SegmentMidDiag8 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag8.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag8.setRotationPoint(-4.0f, 19.0f, 4.0f); + this.SegmentMidDiag8.setTextureSize(64, 32); + this.SegmentMidDiag8.mirror = true; + this.setRotation(this.SegmentMidDiag8, 0.7853982f, 1.570796f, 0.0f); + this.SegmentMidDiag1 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag1.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag1.setRotationPoint(3.0f, 19.0f, -4.0f); + this.SegmentMidDiag1.setTextureSize(64, 32); + this.SegmentMidDiag1.mirror = true; + this.setRotation(this.SegmentMidDiag1, 0.7853982f, 0.0f, 0.0f); + this.SegmentMidDiag2 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag2.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag2.setRotationPoint(3.01f, 12.0f, -3.0f); + this.SegmentMidDiag2.setTextureSize(64, 32); + this.SegmentMidDiag2.mirror = true; + this.setRotation(this.SegmentMidDiag2, -0.7853982f, 0.0f, 0.0f); + this.SegmentMidDiag6 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag6.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag6.setRotationPoint(-4.0f, 19.0f, -3.0f); + this.SegmentMidDiag6.setTextureSize(64, 32); + this.SegmentMidDiag6.mirror = true; + this.setRotation(this.SegmentMidDiag6, 0.7853982f, 1.570796f, 0.0f); + this.SegmentMidDiag5 = new ModelRenderer((ModelBase)this, 0, 0); + this.SegmentMidDiag5.addBox(0.0f, 0.0f, 0.0f, 1, 1, 10); + this.SegmentMidDiag5.setRotationPoint(-2.99f, 12.0f, -3.0f); + this.SegmentMidDiag5.setTextureSize(64, 32); + this.SegmentMidDiag5.mirror = true; + this.setRotation(this.SegmentMidDiag5, -0.7853982f, 1.570796f, 0.0f); + this.SegmentUBLeft = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentUBLeft.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentUBLeft.setRotationPoint(4.0f, 12.0f, 3.0f); + this.SegmentUBLeft.setTextureSize(64, 32); + this.SegmentUBLeft.mirror = true; + this.setRotation(this.SegmentUBLeft, 0.0f, 0.0f, 0.0f); + this.SegmentUFLeft = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentUFLeft.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentUFLeft.setRotationPoint(4.0f, 12.0f, -4.0f); + this.SegmentUFLeft.setTextureSize(64, 32); + this.SegmentUFLeft.mirror = true; + this.setRotation(this.SegmentUFLeft, 0.0f, 0.0f, 0.0f); + this.SegmentBFLeft = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentBFLeft.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentBFLeft.setRotationPoint(4.0f, 19.0f, -4.0f); + this.SegmentBFLeft.setTextureSize(64, 32); + this.SegmentBFLeft.mirror = true; + this.setRotation(this.SegmentBFLeft, 0.0f, 0.0f, 0.0f); + this.SegmentBBLeft = new ModelRenderer((ModelBase)this, 0, 13); + this.SegmentBBLeft.addBox(0.0f, 0.0f, 0.0f, 4, 1, 1); + this.SegmentBBLeft.setRotationPoint(4.0f, 19.0f, 3.0f); + this.SegmentBBLeft.setTextureSize(64, 32); + this.SegmentBBLeft.mirror = true; + this.setRotation(this.SegmentBBLeft, 0.0f, 0.0f, 0.0f); + this.fixPositions(); + } + + public void fixPositions() { + this.SegmentBLBack.setRotationPoint(3.0f, 19.0f, 4.0f); + this.SegmentLUBack.setRotationPoint(3.0f, 12.0f, 4.0f); + this.SegmentRUBack.setRotationPoint(-4.0f, 12.0f, 4.0f); + this.SegmentBRBack.setRotationPoint(-4.0f, 19.0f, 4.0f); + this.SegmentBLFront.setRotationPoint(3.0f, 19.0f, -8.0f); + this.SegmentLUFront.setRotationPoint(3.0f, 12.0f, -8.0f); + this.SegmentRUFront.setRotationPoint(-4.0f, 12.0f, -8.0f); + this.SegmentBRFront.setRotationPoint(-4.0f, 19.0f, -8.0f); + this.SegmentLBUp.setRotationPoint(3.0f, 8.0f, 3.0f); + this.SegmentRBUp.setRotationPoint(-4.0f, 8.0f, 3.0f); + this.SegmentLFUp.setRotationPoint(3.0f, 8.0f, -4.0f); + this.SegmentRFUp.setRotationPoint(-4.0f, 8.0f, -4.0f); + this.SegmentUBRight.setRotationPoint(-8.0f, 12.0f, 3.0f); + this.SegmentBFRight.setRotationPoint(-8.0f, 19.0f, -4.0f); + this.SegmentUFRight.setRotationPoint(-8.0f, 12.0f, -4.0f); + this.SegmentBBRight.setRotationPoint(-8.0f, 19.0f, 3.0f); + this.SegmentLFDown.setRotationPoint(3.0f, 20.0f, -4.0f); + this.SegmentLBDown.setRotationPoint(3.0f, 20.0f, 3.0f); + this.SegmentRBDown.setRotationPoint(-4.0f, 20.0f, 3.0f); + this.SegmentRFDown.setRotationPoint(-4.0f, 20.0f, -4.0f); + this.SegmentBFMid.setRotationPoint(-4.0f, 19.0f, -4.0f); + this.SegmentUBMid.setRotationPoint(-4.0f, 12.0f, 3.0f); + this.SegmentBBMid.setRotationPoint(-4.0f, 19.0f, 3.0f); + this.SegmentUFMid.setRotationPoint(-4.0f, 12.0f, -4.0f); + this.SegmentLBMid.setRotationPoint(3.0f, 13.0f, 3.0f); + this.SegmentLFMid.setRotationPoint(3.0f, 13.0f, -4.0f); + this.SegmentRBMid.setRotationPoint(-4.0f, 13.0f, 3.0f); + this.SegmentRFMid.setRotationPoint(-4.0f, 13.0f, -4.0f); + this.SegmentRUMid.setRotationPoint(-4.0f, 12.0f, -3.0f); + this.SegmentBRMid.setRotationPoint(-4.0f, 19.0f, -3.0f); + this.SegmentBLMid.setRotationPoint(3.0f, 19.0f, -3.0f); + this.SegmentLUMid.setRotationPoint(3.0f, 12.0f, -3.0f); + this.SegmentMidDiag1.setRotationPoint(2.99f, 19.1f, -4.0f); + this.SegmentMidDiag2.setRotationPoint(2.99f, 12.0f, -3.1f); + this.SegmentMidDiag3.setRotationPoint(-3.99f, 19.1f, -4.0f); + this.SegmentMidDiag4.setRotationPoint(-3.99f, 12.0f, -3.1f); + this.SegmentMidDiag5.setRotationPoint(-3.1f, 12.0f, -2.99f); + this.SegmentMidDiag6.setRotationPoint(-4.0f, 19.1f, -2.99f); + this.SegmentMidDiag7.setRotationPoint(-3.1f, 12.0f, 3.99f); + this.SegmentMidDiag8.setRotationPoint(-4.0f, 19.0f, 3.99f); + this.SegmentUBLeft.setRotationPoint(4.0f, 12.0f, 3.0f); + this.SegmentUFLeft.setRotationPoint(4.0f, 12.0f, -4.0f); + this.SegmentBFLeft.setRotationPoint(4.0f, 19.0f, -4.0f); + this.SegmentBBLeft.setRotationPoint(4.0f, 19.0f, 3.0f); + } + + public void render(boolean up, boolean down, boolean left, boolean right, boolean front, boolean back, boolean foot) { + float scale = 0.0625f; + if (up) { + this.SegmentLBUp.render(scale); + this.SegmentRBUp.render(scale); + this.SegmentLFUp.render(scale); + this.SegmentRFUp.render(scale); + } + if (down) { + this.SegmentLFDown.render(scale); + this.SegmentLBDown.render(scale); + this.SegmentRBDown.render(scale); + this.SegmentRFDown.render(scale); + } + if (left) { + this.SegmentUBLeft.render(scale); + this.SegmentUFLeft.render(scale); + this.SegmentBFLeft.render(scale); + this.SegmentBBLeft.render(scale); + } + if (right) { + this.SegmentUBRight.render(scale); + this.SegmentBFRight.render(scale); + this.SegmentUFRight.render(scale); + this.SegmentBBRight.render(scale); + } + if (front) { + this.SegmentBLFront.render(scale); + this.SegmentLUFront.render(scale); + this.SegmentRUFront.render(scale); + this.SegmentBRFront.render(scale); + } + if (back) { + this.SegmentBLBack.render(scale); + this.SegmentLUBack.render(scale); + this.SegmentRUBack.render(scale); + this.SegmentBRBack.render(scale); + } + if (foot) { + this.FootBottom.render(scale); + this.FootTop.render(scale); + } + this.SegmentBFMid.render(scale); + this.SegmentUBMid.render(scale); + this.SegmentBBMid.render(scale); + this.SegmentUFMid.render(scale); + this.SegmentLBMid.render(scale); + this.SegmentLFMid.render(scale); + this.SegmentRBMid.render(scale); + this.SegmentRFMid.render(scale); + this.SegmentRUMid.render(scale); + this.SegmentBRMid.render(scale); + this.SegmentBLMid.render(scale); + this.SegmentLUMid.render(scale); + this.SegmentMidDiag1.render(scale); + this.SegmentMidDiag2.render(scale); + this.SegmentMidDiag3.render(scale); + this.SegmentMidDiag4.render(scale); + this.SegmentMidDiag5.render(scale); + this.SegmentMidDiag6.render(scale); + this.SegmentMidDiag7.render(scale); + this.SegmentMidDiag8.render(scale); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelDropBox.java b/src/main/java/assemblyline/client/model/ModelDropBox.java new file mode 100644 index 0000000..3c8ea0d --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelDropBox.java @@ -0,0 +1,103 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelDropBox +extends ModelBase { + ModelRenderer Left; + ModelRenderer Top; + ModelRenderer Front; + ModelRenderer LeftB; + ModelRenderer Back; + ModelRenderer Right; + ModelRenderer RightB; + ModelRenderer Bottom; + ModelRenderer Back3; + ModelRenderer Back2; + + public ModelDropBox() { + this.textureWidth = 128; + this.textureHeight = 128; + this.Left = new ModelRenderer((ModelBase)this, 33, 43); + this.Left.addBox(7.0f, -10.0f, -8.0f, 1, 7, 15); + this.Left.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Left.setTextureSize(128, 128); + this.Left.mirror = true; + this.setRotation(this.Left, 0.0f, 0.0f, 0.0f); + this.Top = new ModelRenderer((ModelBase)this, 0, 65); + this.Top.addBox(-7.0f, -11.0f, -7.0f, 14, 1, 14); + this.Top.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Top.setTextureSize(128, 128); + this.Top.mirror = true; + this.setRotation(this.Top, 0.0f, 0.0f, 0.0f); + this.Front = new ModelRenderer((ModelBase)this, 0, 33); + this.Front.addBox(-8.0f, -4.0f, -7.5f, 16, 5, 1); + this.Front.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Front.setTextureSize(128, 128); + this.Front.mirror = true; + this.setRotation(this.Front, 0.5235988f, 0.0f, 0.0f); + this.LeftB = new ModelRenderer((ModelBase)this, 36, 21); + this.LeftB.addBox(7.0f, -3.0f, -6.0f, 1, 8, 13); + this.LeftB.setRotationPoint(0.0f, 19.0f, 0.0f); + this.LeftB.setTextureSize(128, 128); + this.LeftB.mirror = true; + this.setRotation(this.LeftB, 0.0f, 0.0f, 0.0f); + this.Back = new ModelRenderer((ModelBase)this, 0, 96); + this.Back.addBox(-5.0f, -8.0f, 4.0f, 10, 10, 4); + this.Back.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Back.setTextureSize(128, 128); + this.Back.mirror = true; + this.setRotation(this.Back, 0.0f, 0.0f, 0.0f); + this.Right = new ModelRenderer((ModelBase)this, 0, 42); + this.Right.addBox(-8.0f, -10.0f, -8.0f, 1, 7, 15); + this.Right.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Right.setTextureSize(128, 128); + this.Right.mirror = true; + this.setRotation(this.Right, 0.0f, 0.0f, 0.0f); + this.RightB = new ModelRenderer((ModelBase)this, 36, 0); + this.RightB.addBox(-8.0f, -3.0f, -6.0f, 1, 8, 13); + this.RightB.setRotationPoint(0.0f, 19.0f, 0.0f); + this.RightB.setTextureSize(128, 128); + this.RightB.mirror = true; + this.setRotation(this.RightB, 0.0f, 0.0f, 0.0f); + this.Bottom = new ModelRenderer((ModelBase)this, 0, 81); + this.Bottom.addBox(-7.0f, 4.0f, -6.0f, 14, 1, 13); + this.Bottom.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Bottom.setTextureSize(128, 128); + this.Bottom.mirror = true; + this.setRotation(this.Bottom, 0.0f, 0.0f, 0.0f); + this.Back3 = new ModelRenderer((ModelBase)this, 0, 23); + this.Back3.addBox(-7.0f, -10.0f, -9.0f, 14, 8, 1); + this.Back3.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Back3.setTextureSize(128, 128); + this.Back3.mirror = true; + this.setRotation(this.Back3, -0.1919862f, 0.0f, 0.0f); + this.Back2 = new ModelRenderer((ModelBase)this, 0, 7); + this.Back2.addBox(-7.0f, -10.0f, 3.0f, 14, 14, 1); + this.Back2.setRotationPoint(0.0f, 19.0f, 0.0f); + this.Back2.setTextureSize(128, 128); + this.Back2.mirror = true; + this.setRotation(this.Back2, 0.0f, 0.0f, 0.0f); + } + + public void render(float f5) { + this.Left.render(f5); + this.Top.render(f5); + this.Front.render(f5); + this.LeftB.render(f5); + this.Back.render(f5); + this.Right.render(f5); + this.RightB.render(f5); + this.Bottom.render(f5); + this.Back.render(f5); + this.Back.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelHelper.java b/src/main/java/assemblyline/client/model/ModelHelper.java new file mode 100644 index 0000000..ee4dc0d --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelHelper.java @@ -0,0 +1,142 @@ +package assemblyline.client.model; + +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +public class ModelHelper { + private static int gTexWidth = 64; + private static int gTexHeight = 32; + private static int sTexWidth = 64; + private static int sTexHeight = 32; + private static int texOffsetX = 0; + private static int texOffsetY = 0; + private static float texScale = 16.0f; + private static boolean clip = false; + + private static void drawQuadRaw(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, ForgeDirection side) { + float yMax; + float xMax; + GL11.glBegin((int)7); + float quadWidth = 1.0f; + float quadHeight = 1.0f; + float subWidth = (float)sTexWidth / (float)gTexWidth; + float subHeight = (float)sTexHeight / (float)gTexHeight; + float xMin = (float)texOffsetX / (float)sTexWidth * subWidth; + float yMin = (float)texOffsetY / (float)sTexHeight * subHeight; + float subSqX = 0.0f; + float subSqY = 0.0f; + float subSqWidth = 0.25f * ((float)sTexWidth / (float)gTexWidth); + float subSqHeight = 0.5f * ((float)sTexHeight / (float)gTexHeight); + switch (side) { + case UP: { + subSqX = 2.0f * subSqWidth; + subSqY = 0.0f; + quadWidth = (float)Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float)Math.abs(v4.zCoord - v1.zCoord); + break; + } + case DOWN: { + subSqX = 1.0f * subSqWidth; + subSqY = 0.0f; + quadWidth = (float)Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float)Math.abs(v4.zCoord - v1.zCoord); + break; + } + case EAST: { + subSqX = 0.0f; + subSqY = subSqHeight; + quadWidth = (float)Math.abs(v2.zCoord - v1.zCoord); + quadHeight = (float)Math.abs(v4.yCoord - v1.yCoord); + break; + } + case WEST: { + subSqX = 2.0f * subSqWidth; + subSqY = subSqHeight; + quadWidth = (float)Math.abs(v2.zCoord - v1.zCoord); + quadHeight = (float)Math.abs(v4.yCoord - v1.yCoord); + break; + } + case SOUTH: { + subSqX = subSqWidth; + subSqY = subSqHeight; + quadWidth = (float)Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float)Math.abs(v4.yCoord - v1.yCoord); + break; + } + case NORTH: { + subSqX = 3.0f * subSqWidth; + subSqY = subSqHeight; + quadWidth = (float)Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float)Math.abs(v4.yCoord - v1.yCoord); + break; + } + } + xMin += subSqX; + yMin += subSqY; + if (clip) { + xMax = (xMin += (1.0f - quadWidth) * subSqWidth) + subSqWidth * quadWidth; + yMax = (yMin += (1.0f - quadHeight) * subSqHeight) + subSqHeight * quadHeight; + } else { + xMax = xMin + subSqWidth; + yMax = yMin + subSqHeight; + } + GL11.glTexCoord2f((float)xMin, (float)yMin); + GL11.glVertex3d((double)v1.xCoord, (double)v1.yCoord, (double)v1.zCoord); + GL11.glTexCoord2f((float)xMax, (float)yMin); + GL11.glVertex3d((double)v2.xCoord, (double)v2.yCoord, (double)v2.zCoord); + GL11.glTexCoord2f((float)xMax, (float)yMax); + GL11.glVertex3d((double)v3.xCoord, (double)v3.yCoord, (double)v3.zCoord); + GL11.glTexCoord2f((float)xMin, (float)yMax); + GL11.glVertex3d((double)v4.xCoord, (double)v4.yCoord, (double)v4.zCoord); + GL11.glEnd(); + } + + private static void drawCuboidRaw(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, Vec3 v5, Vec3 v6, Vec3 v7, Vec3 v8) { + ModelHelper.drawQuadRaw(v1, v2, v3, v4, ForgeDirection.UP); + ModelHelper.drawQuadRaw(v7, v6, v3, v2, ForgeDirection.EAST); + ModelHelper.drawQuadRaw(v5, v6, v7, v8, ForgeDirection.DOWN); + ModelHelper.drawQuadRaw(v5, v8, v1, v4, ForgeDirection.WEST); + ModelHelper.drawQuadRaw(v6, v5, v4, v3, ForgeDirection.NORTH); + ModelHelper.drawQuadRaw(v8, v7, v2, v1, ForgeDirection.SOUTH); + } + + public static void drawCuboid(float xOffset, float yOffset, float zOffset, float xSize, float ySize, float zSize) { + float x = xOffset; + float y = yOffset; + float z = zOffset; + float x2 = x + xSize; + float y2 = y + ySize; + float z2 = z + zSize; + Vec3 v1 = Vec3.createVectorHelper((double)x, (double)y2, (double)z2); + Vec3 v2 = Vec3.createVectorHelper((double)x2, (double)y2, (double)z2); + Vec3 v3 = Vec3.createVectorHelper((double)x2, (double)y2, (double)z); + Vec3 v4 = Vec3.createVectorHelper((double)x, (double)y2, (double)z); + Vec3 v5 = Vec3.createVectorHelper((double)x, (double)y, (double)z); + Vec3 v6 = Vec3.createVectorHelper((double)x2, (double)y, (double)z); + Vec3 v7 = Vec3.createVectorHelper((double)x2, (double)y, (double)z2); + Vec3 v8 = Vec3.createVectorHelper((double)x, (double)y, (double)z2); + ModelHelper.drawCuboidRaw(v1, v2, v3, v4, v5, v6, v7, v8); + } + + public static void setTextureOffset(int xOffset, int yOffset) { + texOffsetX = xOffset; + texOffsetY = yOffset; + } + + public static void setGlobalTextureResolution(int width, int height) { + gTexWidth = width; + gTexHeight = height; + } + + public static void setTextureSubResolution(int width, int height) { + sTexWidth = width; + sTexHeight = height; + } + + public static void setTextureClip(boolean clip) { + ModelHelper.clip = clip; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelLaserDrill.java b/src/main/java/assemblyline/client/model/ModelLaserDrill.java new file mode 100644 index 0000000..0ae9218 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelLaserDrill.java @@ -0,0 +1,135 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelLaserDrill +extends ModelBase { + ModelRenderer Tip; + ModelRenderer Upper_plating; + ModelRenderer Middle_plating; + ModelRenderer Shape3_1; + ModelRenderer Shape3_2; + ModelRenderer Shape3_3; + ModelRenderer Shape3_4; + ModelRenderer LowerPlating_1; + ModelRenderer LowerPlating_2; + ModelRenderer Bump_1; + ModelRenderer Bump_2; + ModelRenderer Bump_3; + ModelRenderer Bump_4; + ModelRenderer Cross; + + public ModelLaserDrill() { + this.textureWidth = 64; + this.textureHeight = 32; + this.Tip = new ModelRenderer((ModelBase)this, 0, 8); + this.Tip.addBox(-1.0f, 0.0f, -1.0f, 2, 16, 2); + this.Tip.setRotationPoint(0.0f, 8.0f, 0.0f); + this.Tip.setTextureSize(64, 32); + this.Tip.mirror = true; + this.setRotation(this.Tip, 0.0f, 0.0f, 0.0f); + this.Upper_plating = new ModelRenderer((ModelBase)this, 0, 0); + this.Upper_plating.addBox(-2.0f, 0.0f, -2.0f, 4, 1, 4); + this.Upper_plating.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Upper_plating.setTextureSize(64, 32); + this.Upper_plating.mirror = true; + this.setRotation(this.Upper_plating, 0.0f, 0.0f, 0.0f); + this.Middle_plating = new ModelRenderer((ModelBase)this, 16, 0); + this.Middle_plating.addBox(-3.0f, 0.0f, -3.0f, 6, 1, 6); + this.Middle_plating.setRotationPoint(0.0f, 15.0f, 0.0f); + this.Middle_plating.setTextureSize(64, 32); + this.Middle_plating.mirror = true; + this.setRotation(this.Middle_plating, 0.0f, 0.0f, 0.0f); + this.Shape3_1 = new ModelRenderer((ModelBase)this, 8, 8); + this.Shape3_1.addBox(2.0f, 0.0f, -1.0f, 1, 6, 2); + this.Shape3_1.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Shape3_1.setTextureSize(64, 32); + this.Shape3_1.mirror = true; + this.setRotation(this.Shape3_1, 0.0f, -3.141593f, 0.0f); + this.Shape3_2 = new ModelRenderer((ModelBase)this, 8, 8); + this.Shape3_2.addBox(2.0f, 0.0f, -1.0f, 1, 6, 2); + this.Shape3_2.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Shape3_2.setTextureSize(64, 32); + this.Shape3_2.mirror = true; + this.setRotation(this.Shape3_2, 0.0f, -1.570796f, 0.0f); + this.Shape3_3 = new ModelRenderer((ModelBase)this, 8, 8); + this.Shape3_3.addBox(2.0f, 0.0f, -1.0f, 1, 6, 2); + this.Shape3_3.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Shape3_3.setTextureSize(64, 32); + this.Shape3_3.mirror = true; + this.setRotation(this.Shape3_3, 0.0f, 1.570796f, 0.0f); + this.Shape3_4 = new ModelRenderer((ModelBase)this, 8, 8); + this.Shape3_4.addBox(2.0f, 0.0f, -1.0f, 1, 6, 2); + this.Shape3_4.setRotationPoint(0.0f, 11.0f, 0.0f); + this.Shape3_4.setTextureSize(64, 32); + this.Shape3_4.mirror = true; + this.setRotation(this.Shape3_4, 0.0f, 0.0f, 0.0f); + this.LowerPlating_1 = new ModelRenderer((ModelBase)this, 40, 0); + this.LowerPlating_1.addBox(-2.0f, 0.0f, -2.0f, 4, 1, 4); + this.LowerPlating_1.setRotationPoint(0.0f, 18.0f, 0.0f); + this.LowerPlating_1.setTextureSize(64, 32); + this.LowerPlating_1.mirror = true; + this.setRotation(this.LowerPlating_1, 0.0f, 0.0f, 0.0f); + this.LowerPlating_2 = new ModelRenderer((ModelBase)this, 40, 0); + this.LowerPlating_2.addBox(-2.0f, 0.0f, -2.0f, 4, 1, 4); + this.LowerPlating_2.setRotationPoint(0.0f, 20.0f, 0.0f); + this.LowerPlating_2.setTextureSize(64, 32); + this.LowerPlating_2.mirror = true; + this.setRotation(this.LowerPlating_2, 0.0f, 0.0f, 0.0f); + this.Bump_1 = new ModelRenderer((ModelBase)this, 56, 0); + this.Bump_1.addBox(-0.5f, -0.5f, -0.5f, 1, 4, 1); + this.Bump_1.setRotationPoint(0.0f, 12.0f, 3.0f); + this.Bump_1.setTextureSize(64, 32); + this.Bump_1.mirror = true; + this.setRotation(this.Bump_1, 0.0f, 0.7853982f, 0.0f); + this.Bump_2 = new ModelRenderer((ModelBase)this, 56, 0); + this.Bump_2.addBox(-0.5f, -0.5f, -0.5f, 1, 4, 1); + this.Bump_2.setRotationPoint(3.0f, 12.0f, 0.0f); + this.Bump_2.setTextureSize(64, 32); + this.Bump_2.mirror = true; + this.setRotation(this.Bump_2, 0.0f, 0.7853982f, 0.0f); + this.Bump_3 = new ModelRenderer((ModelBase)this, 56, 0); + this.Bump_3.addBox(-0.5f, -0.5f, -0.5f, 1, 4, 1); + this.Bump_3.setRotationPoint(0.0f, 12.0f, -3.0f); + this.Bump_3.setTextureSize(64, 32); + this.Bump_3.mirror = true; + this.setRotation(this.Bump_3, 0.0f, 0.7853982f, 0.0f); + this.Bump_4 = new ModelRenderer((ModelBase)this, 56, 0); + this.Bump_4.addBox(-0.5f, -0.5f, -0.5f, 1, 4, 1); + this.Bump_4.setRotationPoint(-3.0f, 12.0f, 0.0f); + this.Bump_4.setTextureSize(64, 32); + this.Bump_4.mirror = true; + this.setRotation(this.Bump_4, 0.0f, 0.7853982f, 0.0f); + this.Cross = new ModelRenderer((ModelBase)this, 14, 8); + this.Cross.addBox(-0.5f, -0.5f, -0.5f, 3, 1, 3); + this.Cross.setRotationPoint(-1.5f, 11.0f, 0.0f); + this.Cross.setTextureSize(64, 32); + this.Cross.mirror = true; + this.setRotation(this.Cross, 0.0f, 0.7853982f, 0.0f); + } + + public void render(float rotation, float f5) { + this.Tip.render(f5); + this.Upper_plating.render(f5); + this.Middle_plating.render(f5); + this.Shape3_1.render(f5); + this.Shape3_2.render(f5); + this.Shape3_3.render(f5); + this.Shape3_4.render(f5); + this.LowerPlating_1.render(f5); + this.LowerPlating_2.render(f5); + this.Bump_1.render(f5); + this.Bump_2.render(f5); + this.Bump_3.render(f5); + this.Bump_4.render(f5); + this.Cross.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelManipulator.java b/src/main/java/assemblyline/client/model/ModelManipulator.java new file mode 100644 index 0000000..05fe8e5 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelManipulator.java @@ -0,0 +1,189 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelManipulator +extends ModelBase { + ModelRenderer bBELTLong; + ModelRenderer FBELT; + ModelRenderer BacPanel; + ModelRenderer BBelt; + ModelRenderer FRL; + ModelRenderer MRL; + ModelRenderer FLL; + ModelRenderer BLL; + ModelRenderer MRoller; + ModelRenderer BRoller; + ModelRenderer tBELT; + ModelRenderer FRoller; + ModelRenderer BRL; + ModelRenderer BML; + ModelRenderer tBELTLong; + ModelRenderer RPanel; + ModelRenderer LPanel; + ModelRenderer TopPanel; + ModelRenderer RCPanel; + ModelRenderer LCPanel; + + public ModelManipulator() { + this.textureWidth = 128; + this.textureHeight = 128; + this.bBELTLong = new ModelRenderer((ModelBase)this, 0, 66); + this.bBELTLong.addBox(0.0f, 0.0f, 0.0f, 14, 1, 16); + this.bBELTLong.setRotationPoint(-7.0f, 22.0f, -8.0f); + this.bBELTLong.setTextureSize(128, 128); + this.bBELTLong.mirror = true; + this.setRotation(this.bBELTLong, 0.0f, 0.0f, 0.0f); + this.FBELT = new ModelRenderer((ModelBase)this, 0, 16); + this.FBELT.addBox(0.0f, 0.0f, 0.0f, 14, 2, 1); + this.FBELT.setRotationPoint(-7.0f, 20.0f, -8.0f); + this.FBELT.setTextureSize(128, 128); + this.FBELT.mirror = true; + this.setRotation(this.FBELT, 0.0f, 0.0f, 0.0f); + this.BacPanel = new ModelRenderer((ModelBase)this, 0, 86); + this.BacPanel.addBox(0.0f, -12.0f, 0.0f, 14, 12, 1); + this.BacPanel.setRotationPoint(-7.0f, 24.0f, 7.0f); + this.BacPanel.setTextureSize(128, 128); + this.BacPanel.mirror = true; + this.setRotation(this.BacPanel, 0.0f, 0.0f, 0.0f); + this.BBelt = new ModelRenderer((ModelBase)this, 0, 31); + this.BBelt.addBox(0.0f, 0.0f, 0.0f, 14, 1, 14); + this.BBelt.setRotationPoint(-7.0f, 22.0f, -7.0f); + this.BBelt.setTextureSize(128, 128); + this.BBelt.mirror = true; + this.setRotation(this.BBelt, 0.0f, 0.0f, 0.0f); + this.FRL = new ModelRenderer((ModelBase)this, 0, 20); + this.FRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.FRL.setRotationPoint(-8.0f, 21.0f, -6.0f); + this.FRL.setTextureSize(128, 128); + this.FRL.mirror = true; + this.setRotation(this.FRL, 0.0f, 0.0f, 0.0f); + this.MRL = new ModelRenderer((ModelBase)this, 0, 20); + this.MRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.MRL.setRotationPoint(-8.0f, 21.0f, -1.0f); + this.MRL.setTextureSize(128, 128); + this.MRL.mirror = true; + this.setRotation(this.MRL, 0.0f, 0.0f, 0.0f); + this.FLL = new ModelRenderer((ModelBase)this, 0, 20); + this.FLL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.FLL.setRotationPoint(7.0f, 21.0f, -6.0f); + this.FLL.setTextureSize(128, 128); + this.FLL.mirror = true; + this.setRotation(this.FLL, 0.0f, 0.0f, 0.0f); + this.BLL = new ModelRenderer((ModelBase)this, 0, 20); + this.BLL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BLL.setRotationPoint(7.0f, 21.0f, 4.0f); + this.BLL.setTextureSize(128, 128); + this.BLL.mirror = true; + this.setRotation(this.BLL, 0.0f, 0.0f, 0.0f); + this.MRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.MRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.MRoller.setRotationPoint(0.0f, 21.0f, 0.0f); + this.MRoller.setTextureSize(128, 128); + this.MRoller.mirror = true; + this.setRotation(this.MRoller, 0.0f, 0.0f, 0.0f); + this.BRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.BRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.BRoller.setRotationPoint(0.0f, 21.0f, 5.0f); + this.BRoller.setTextureSize(128, 128); + this.BRoller.mirror = true; + this.setRotation(this.BRoller, 0.0f, 0.0f, 0.0f); + this.tBELT = new ModelRenderer((ModelBase)this, 0, 0); + this.tBELT.addBox(0.0f, 0.0f, 0.0f, 14, 1, 14); + this.tBELT.setRotationPoint(-7.0f, 19.0f, -7.0f); + this.tBELT.setTextureSize(128, 128); + this.tBELT.mirror = true; + this.setRotation(this.tBELT, 0.0f, 0.0f, 0.0f); + this.FRoller = new ModelRenderer((ModelBase)this, 0, 26); + this.FRoller.addBox(-7.0f, -1.0f, -1.0f, 14, 2, 2); + this.FRoller.setRotationPoint(0.0f, 21.0f, -5.0f); + this.FRoller.setTextureSize(128, 128); + this.FRoller.mirror = true; + this.setRotation(this.FRoller, 0.0f, 0.0f, 0.0f); + this.BRL = new ModelRenderer((ModelBase)this, 0, 20); + this.BRL.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BRL.setRotationPoint(-8.0f, 21.0f, 4.0f); + this.BRL.setTextureSize(128, 128); + this.BRL.mirror = true; + this.setRotation(this.BRL, 0.0f, 0.0f, 0.0f); + this.BML = new ModelRenderer((ModelBase)this, 0, 20); + this.BML.addBox(0.0f, 0.0f, 0.0f, 1, 3, 2); + this.BML.setRotationPoint(7.0f, 21.0f, -1.0f); + this.BML.setTextureSize(128, 128); + this.BML.mirror = true; + this.setRotation(this.BML, 0.0f, 0.0f, 0.0f); + this.tBELTLong = new ModelRenderer((ModelBase)this, 0, 48); + this.tBELTLong.addBox(0.0f, 0.0f, 0.0f, 14, 1, 16); + this.tBELTLong.setRotationPoint(-7.0f, 19.0f, -8.0f); + this.tBELTLong.setTextureSize(128, 128); + this.tBELTLong.mirror = true; + this.setRotation(this.tBELTLong, 0.0f, 0.0f, 0.0f); + this.RPanel = new ModelRenderer((ModelBase)this, 65, 41); + this.RPanel.addBox(0.0f, -2.0f, -8.0f, 1, 4, 16); + this.RPanel.setRotationPoint(-8.0f, 19.0f, 0.0f); + this.RPanel.setTextureSize(128, 128); + this.RPanel.mirror = true; + this.setRotation(this.RPanel, 0.0f, 0.0f, 0.0f); + this.LPanel = new ModelRenderer((ModelBase)this, 65, 20); + this.LPanel.addBox(0.0f, -2.0f, -8.0f, 1, 4, 16); + this.LPanel.setRotationPoint(7.0f, 19.0f, 0.0f); + this.LPanel.setTextureSize(128, 128); + this.LPanel.mirror = true; + this.setRotation(this.LPanel, 0.0f, 0.0f, 0.0f); + this.TopPanel = new ModelRenderer((ModelBase)this, 0, 105); + this.TopPanel.addBox(0.0f, 0.0f, 0.0f, 14, 2, 10); + this.TopPanel.setRotationPoint(-7.0f, 12.0f, -3.0f); + this.TopPanel.setTextureSize(128, 128); + this.TopPanel.mirror = true; + this.setRotation(this.TopPanel, 0.0f, 0.0f, 0.0f); + this.RCPanel = new ModelRenderer((ModelBase)this, 50, 105); + this.RCPanel.addBox(-1.0f, 0.0f, 0.0f, 2, 5, 10); + this.RCPanel.setRotationPoint(-7.0f, 14.0f, -3.0f); + this.RCPanel.setTextureSize(128, 128); + this.RCPanel.mirror = true; + this.setRotation(this.RCPanel, 0.0f, 0.0f, 0.0f); + this.LCPanel = new ModelRenderer((ModelBase)this, 76, 105); + this.LCPanel.addBox(0.0f, 0.0f, 0.0f, 2, 5, 10); + this.LCPanel.setRotationPoint(6.0f, 14.0f, -3.0f); + this.LCPanel.setTextureSize(128, 128); + this.LCPanel.mirror = true; + this.setRotation(this.LCPanel, 0.0f, 0.0f, 0.0f); + } + + public void render(float f5, boolean isLongBelt, int radians) { + this.BacPanel.render(f5); + this.RPanel.render(f5); + this.LPanel.render(f5); + this.TopPanel.render(f5); + this.RCPanel.render(f5); + this.LCPanel.render(f5); + this.FRL.render(f5); + this.MRL.render(f5); + this.FLL.render(f5); + this.BLL.render(f5); + this.BRL.render(f5); + this.BML.render(f5); + this.MRoller.rotateAngleX = radians; + this.BRoller.rotateAngleX = radians; + this.FRoller.rotateAngleX = radians; + this.MRoller.render(f5); + this.BRoller.render(f5); + this.FRoller.render(f5); + if (isLongBelt) { + this.tBELTLong.render(f5); + this.bBELTLong.render(f5); + } else { + this.FBELT.render(f5); + this.tBELT.render(f5); + this.BBelt.render(f5); + } + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/model/ModelRejectorPiston.java b/src/main/java/assemblyline/client/model/ModelRejectorPiston.java new file mode 100644 index 0000000..d303968 --- /dev/null +++ b/src/main/java/assemblyline/client/model/ModelRejectorPiston.java @@ -0,0 +1,157 @@ +package assemblyline.client.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class ModelRejectorPiston +extends ModelBase { + ModelRenderer BodyBottom; + ModelRenderer PistonFace2; + ModelRenderer PistonShaft; + ModelRenderer Piston; + ModelRenderer H1; + ModelRenderer H2; + ModelRenderer H3; + ModelRenderer PistonFace; + ModelRenderer WireCCRight; + ModelRenderer WireCCLeft; + ModelRenderer BodyP2; + ModelRenderer BodyP1; + ModelRenderer LeftSide; + ModelRenderer RightSide; + ModelRenderer PistonBack; + ModelRenderer WireCCFront; + + public ModelRejectorPiston() { + this.textureWidth = 128; + this.textureHeight = 128; + this.BodyBottom = new ModelRenderer((ModelBase)this, 29, 69); + this.BodyBottom.addBox(-5.0f, 0.0f, -2.0f, 10, 5, 15); + this.BodyBottom.setRotationPoint(0.0f, 19.0f, -6.0f); + this.BodyBottom.setTextureSize(128, 128); + this.BodyBottom.mirror = true; + this.setRotation(this.BodyBottom, 0.0f, 0.0f, 0.0f); + this.PistonFace2 = new ModelRenderer((ModelBase)this, 0, 53); + this.PistonFace2.addBox(-2.0f, -2.0f, -1.0f, 4, 6, 1); + this.PistonFace2.setRotationPoint(0.0f, 15.0f, -6.0f); + this.PistonFace2.setTextureSize(128, 128); + this.PistonFace2.mirror = true; + this.setRotation(this.PistonFace2, 0.0f, 0.0f, 0.0f); + this.PistonShaft = new ModelRenderer((ModelBase)this, 0, 75); + this.PistonShaft.addBox(-1.5f, -1.5f, 0.0f, 3, 3, 10); + this.PistonShaft.setRotationPoint(0.0f, 16.0f, -6.0f); + this.PistonShaft.setTextureSize(128, 128); + this.PistonShaft.mirror = true; + this.setRotation(this.PistonShaft, 0.0f, 0.0f, 0.0f); + this.Piston = new ModelRenderer((ModelBase)this, 0, 22); + this.Piston.addBox(-3.0f, -1.0f, 0.0f, 6, 6, 10); + this.Piston.setRotationPoint(0.0f, 14.0f, -5.0f); + this.Piston.setTextureSize(128, 128); + this.Piston.mirror = true; + this.setRotation(this.Piston, 0.0f, 0.0f, 0.0f); + this.H1 = new ModelRenderer((ModelBase)this, 33, 23); + this.H1.addBox(-1.5f, 0.0f, 0.0f, 3, 1, 8); + this.H1.setRotationPoint(0.0f, 12.0f, -4.0f); + this.H1.setTextureSize(128, 128); + this.H1.mirror = true; + this.setRotation(this.H1, 0.0f, 0.0f, 0.0f); + this.H2 = new ModelRenderer((ModelBase)this, 90, 23); + this.H2.addBox(0.0f, -1.5f, 0.0f, 1, 3, 8); + this.H2.setRotationPoint(-4.0f, 16.0f, -4.0f); + this.H2.setTextureSize(128, 128); + this.H2.mirror = true; + this.setRotation(this.H2, 0.0f, 0.0f, 0.0f); + this.H3 = new ModelRenderer((ModelBase)this, 70, 23); + this.H3.addBox(0.0f, -1.5f, 0.0f, 1, 3, 8); + this.H3.setRotationPoint(3.0f, 16.0f, -4.0f); + this.H3.setTextureSize(128, 128); + this.H3.mirror = true; + this.setRotation(this.H3, 0.0f, 0.0f, 0.0f); + this.PistonFace = new ModelRenderer((ModelBase)this, 0, 62); + this.PistonFace.addBox(-3.0f, -2.0f, -1.0f, 6, 4, 1); + this.PistonFace.setRotationPoint(0.0f, 16.0f, -6.0f); + this.PistonFace.setTextureSize(128, 128); + this.PistonFace.mirror = true; + this.setRotation(this.PistonFace, 0.0f, 0.0f, 0.0f); + this.WireCCRight = new ModelRenderer((ModelBase)this, 69, 52); + this.WireCCRight.addBox(-3.0f, -3.0f, 0.0f, 6, 11, 1); + this.WireCCRight.setRotationPoint(0.0f, 16.0f, 7.0f); + this.WireCCRight.setTextureSize(128, 128); + this.WireCCRight.mirror = true; + this.setRotation(this.WireCCRight, 0.0f, 0.0f, 0.0f); + this.WireCCLeft = new ModelRenderer((ModelBase)this, 54, 37); + this.WireCCLeft.addBox(0.0f, -3.0f, -3.0f, 1, 8, 6); + this.WireCCLeft.setRotationPoint(7.0f, 16.0f, 0.0f); + this.WireCCLeft.setTextureSize(128, 128); + this.WireCCLeft.mirror = true; + this.setRotation(this.WireCCLeft, 0.0f, 0.0f, 0.0f); + this.BodyP2 = new ModelRenderer((ModelBase)this, 100, 60); + this.BodyP2.addBox(1.0f, -2.0f, -2.0f, 2, 7, 4); + this.BodyP2.setRotationPoint(-8.0f, 16.0f, 0.0f); + this.BodyP2.setTextureSize(128, 128); + this.BodyP2.mirror = true; + this.setRotation(this.BodyP2, 0.0f, 0.0f, 0.0f); + this.BodyP1 = new ModelRenderer((ModelBase)this, 87, 60); + this.BodyP1.addBox(3.0f, -2.0f, -2.0f, 2, 7, 4); + this.BodyP1.setRotationPoint(2.0f, 16.0f, 0.0f); + this.BodyP1.setTextureSize(128, 128); + this.BodyP1.mirror = true; + this.setRotation(this.BodyP1, 0.0f, 0.0f, 0.0f); + this.LeftSide = new ModelRenderer((ModelBase)this, 29, 91); + this.LeftSide.addBox(0.0f, 0.0f, -2.0f, 3, 3, 14); + this.LeftSide.setRotationPoint(5.0f, 21.0f, -5.0f); + this.LeftSide.setTextureSize(128, 128); + this.LeftSide.mirror = true; + this.setRotation(this.LeftSide, 0.0f, 0.0f, 0.0f); + this.RightSide = new ModelRenderer((ModelBase)this, 64, 91); + this.RightSide.addBox(0.0f, 0.0f, -2.0f, 3, 3, 14); + this.RightSide.setRotationPoint(-8.0f, 21.0f, -5.0f); + this.RightSide.setTextureSize(128, 128); + this.RightSide.mirror = true; + this.setRotation(this.RightSide, 0.0f, 0.0f, 0.0f); + this.PistonBack = new ModelRenderer((ModelBase)this, 0, 12); + this.PistonBack.addBox(-2.5f, -2.5f, -1.0f, 5, 5, 2); + this.PistonBack.setRotationPoint(0.0f, 16.0f, 6.0f); + this.PistonBack.setTextureSize(128, 128); + this.PistonBack.mirror = true; + this.setRotation(this.PistonBack, 0.0f, 0.0f, 0.0f); + this.WireCCFront = new ModelRenderer((ModelBase)this, 69, 37); + this.WireCCFront.addBox(0.0f, -3.0f, -3.0f, 1, 8, 6); + this.WireCCFront.setRotationPoint(-8.0f, 16.0f, 0.0f); + this.WireCCFront.setTextureSize(128, 128); + this.WireCCFront.mirror = true; + this.setRotation(this.WireCCFront, 0.0f, 0.0f, 0.0f); + } + + public void render(float f5) { + this.BodyBottom.render(f5); + this.Piston.render(f5); + this.H1.render(f5); + this.H2.render(f5); + this.H3.render(f5); + this.WireCCRight.render(f5); + this.WireCCLeft.render(f5); + this.BodyP2.render(f5); + this.BodyP1.render(f5); + this.LeftSide.render(f5); + this.RightSide.render(f5); + this.PistonBack.render(f5); + this.WireCCFront.render(f5); + } + + public void renderPiston(float f5, int p) { + this.PistonFace2.setRotationPoint(0.0f, 15.0f, -6.0f - (float)p); + this.PistonShaft.setRotationPoint(0.0f, 16.0f, -6.0f - (float)p); + this.PistonFace.setRotationPoint(0.0f, 16.0f, -6.0f - (float)p); + this.PistonFace2.render(f5); + this.PistonShaft.render(f5); + this.PistonFace.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} + diff --git a/src/main/java/assemblyline/client/render/BlockRenderingHandler.java b/src/main/java/assemblyline/client/render/BlockRenderingHandler.java new file mode 100644 index 0000000..beef1e5 --- /dev/null +++ b/src/main/java/assemblyline/client/render/BlockRenderingHandler.java @@ -0,0 +1,97 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelConveyorBelt; +import assemblyline.client.model.ModelManipulator; +import assemblyline.client.model.ModelRejectorPiston; +import assemblyline.common.AssemblyLine; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; +import org.lwjgl.opengl.GL11; + +@SideOnly(value=Side.CLIENT) +public class BlockRenderingHandler +implements ISimpleBlockRenderingHandler { + public static BlockRenderingHandler instance = new BlockRenderingHandler(); + public static final int BLOCK_RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); + private ModelConveyorBelt modelConveyorBelt = new ModelConveyorBelt(); + private ModelRejectorPiston modelEjector = new ModelRejectorPiston(); + private ModelManipulator modelInjector = new ModelManipulator(); + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + if (block == AssemblyLine.blockConveyorBelt) { + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.0f, (float)1.5f, (float)0.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/belt/frame0.png")); + this.modelConveyorBelt.render(0.0625f, 0.0f, false, false, false, false); + GL11.glPopMatrix(); + } else if (block == AssemblyLine.blockRejector) { + FMLClientHandler.instance().getClient().getTextureManager(); + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/rejector.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.6f, (float)1.5f, (float)0.6f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + this.modelEjector.render(0.0625f); + this.modelEjector.renderPiston(0.0625f, 1); + GL11.glPopMatrix(); + } else if (block == AssemblyLine.blockManipulator) { + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/manipulator1.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.6f, (float)1.5f, (float)0.6f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + this.modelInjector.render(0.0625f, true, 0); + GL11.glPopMatrix(); + } else if (block == AssemblyLine.blockArmbot) { + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/armbot.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.4f, (float)0.8f, (float)0.0f); + GL11.glScalef((float)0.7f, (float)0.7f, (float)0.7f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + RenderArmbot.MODEL.render(0.0625f, 0.0f, 0.0f); + GL11.glPopMatrix(); + } else if (block == AssemblyLine.blockCraneController) { + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/crane_controller_off.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + RenderCraneController.MODEL.render(0.0625f, false, false); + GL11.glPopMatrix(); + } else if (block == AssemblyLine.blockCraneFrame) { + FMLClientHandler.instance().getClient().getTextureManager().bindTexture(new ResourceLocation("assemblyline", "textures/models/crane_frame.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + RenderCraneFrame.MODEL.render(true, true, false, false, false, false, false); + GL11.glPopMatrix(); + } + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + return false; + } + + @Override + public boolean shouldRender3DInInventory(int par0) { + return true; + } + + @Override + public int getRenderId() { + return BLOCK_RENDER_ID; + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderArmbot.java b/src/main/java/assemblyline/client/render/RenderArmbot.java new file mode 100644 index 0000000..8540350 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderArmbot.java @@ -0,0 +1,58 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelArmbot; +import assemblyline.common.machine.armbot.TileEntityArmbot; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector3; + +public class RenderArmbot +extends TileEntitySpecialRenderer { + public static final ModelArmbot MODEL = new ModelArmbot(); + public static final String TEXTURE = "armbot.png"; + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + if (tileEntity instanceof TileEntityArmbot) { + EntityClientPlayerMP player; + MovingObjectPosition objectPosition; + String cmdText = ((TileEntityArmbot)tileEntity).getCommandDisplayText(); + if (!(cmdText == null || cmdText.isEmpty() || (objectPosition = (player = Minecraft.getMinecraft().thePlayer).rayTrace(8.0, 1.0f)) == null || objectPosition.blockX != tileEntity.xCoord || objectPosition.blockY != tileEntity.yCoord && objectPosition.blockY != tileEntity.yCoord + 1 || objectPosition.blockZ != tileEntity.zCoord)) { + RenderHelper.renderFloatingText(cmdText, (float)x + 0.5f, (float)y + 0.25f, (float)z + 0.5f, 0xFFFFFF); + } + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/armbot.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)((float)x + 0.5f), (float)((float)y + 1.5f), (float)((float)z + 0.5f)); + GL11.glScalef((float)1.0f, (float)-1.0f, (float)-1.0f); + MODEL.render(0.0625f, ((TileEntityArmbot)tileEntity).renderYaw, ((TileEntityArmbot)tileEntity).renderPitch); + GL11.glPopMatrix(); + Vector3 handPosition = ((TileEntityArmbot)tileEntity).getDeltaHandPosition(); + handPosition.add(0.5); + handPosition.add(new Vector3(x, y, z)); + RenderItem renderItem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; + for (ItemStack itemStack : ((TileEntityArmbot)tileEntity).getGrabbedItems()) { + if (itemStack == null) continue; + if (((TileEntityArmbot)tileEntity).renderEntityItem == null) { + ((TileEntityArmbot)tileEntity).renderEntityItem = new EntityItem(tileEntity.getWorldObj(), 0.0, 0.0, 0.0, itemStack); + } else if (!itemStack.isItemEqual(((TileEntityArmbot)tileEntity).renderEntityItem.getEntityItem())) { + ((TileEntityArmbot)tileEntity).renderEntityItem = new EntityItem(tileEntity.getWorldObj(), 0.0, 0.0, 0.0, itemStack); + } + renderItem.doRender(((TileEntityArmbot)tileEntity).renderEntityItem, handPosition.x, handPosition.y, handPosition.z, 0.0f, f); + break; + } + } + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderConveyorBelt.java b/src/main/java/assemblyline/client/render/RenderConveyorBelt.java new file mode 100644 index 0000000..e730f1b --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderConveyorBelt.java @@ -0,0 +1,106 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelAngledBelt; +import assemblyline.client.model.ModelConveyorBelt; +import assemblyline.common.machine.belt.TileEntityConveyorBelt; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +@SideOnly(value=Side.CLIENT) +public class RenderConveyorBelt +extends TileEntitySpecialRenderer { + public static final ModelConveyorBelt MODEL = new ModelConveyorBelt(); + public static final ModelAngledBelt MODEL2 = new ModelAngledBelt(); + + private void renderAModelAt(TileEntityConveyorBelt tileEntity, double x, double y, double z, float f) { + boolean mid = tileEntity.getIsMiddleBelt(); + TileEntityConveyorBelt.SlantType slantType = tileEntity.getSlant(); + int face = tileEntity.getDirection().ordinal(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)((float)x + 0.5f), (float)((float)y + 1.5f), (float)((float)z + 0.5f)); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + int frame = tileEntity.getAnimationFrame(); + if (slantType != null && slantType != TileEntityConveyorBelt.SlantType.NONE) { + boolean slantAdjust; + switch (face) { + case 2: { + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 3: { + GL11.glRotatef((float)0.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 4: { + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 5: { + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + } + if (slantType == TileEntityConveyorBelt.SlantType.UP) { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/slantedbelt/frame" + frame + ".png")); + GL11.glTranslatef((float)0.0f, (float)0.8f, (float)-0.8f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)1.0f); + slantAdjust = false; + TileEntity test = tileEntity.getWorldObj().getTileEntity(tileEntity.xCoord + tileEntity.getDirection().offsetX, tileEntity.yCoord, tileEntity.zCoord + tileEntity.getDirection().offsetZ); + if (test != null && test instanceof TileEntityConveyorBelt && ((TileEntityConveyorBelt)test).getSlant() == TileEntityConveyorBelt.SlantType.TOP) { + GL11.glRotatef((float)10.0f, (float)1.0f, (float)0.0f, (float)0.0f); + slantAdjust = true; + } + MODEL2.render(0.0625f, true); + } else if (slantType == TileEntityConveyorBelt.SlantType.DOWN) { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/slantedbelt/frame" + frame + ".png")); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + slantAdjust = false; + TileEntity test = tileEntity.getWorldObj().getTileEntity(tileEntity.xCoord - tileEntity.getDirection().offsetX, tileEntity.yCoord, tileEntity.zCoord - tileEntity.getDirection().offsetZ); + if (test != null && test instanceof TileEntityConveyorBelt && ((TileEntityConveyorBelt)test).getSlant() == TileEntityConveyorBelt.SlantType.TOP) { + GL11.glRotatef((float)-10.0f, (float)1.0f, (float)0.0f, (float)0.0f); + GL11.glTranslatef((float)0.0f, (float)0.25f, (float)0.0f); + slantAdjust = true; + } + MODEL2.render(0.0625f, slantAdjust); + } else { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/belt/frame" + frame + ".png")); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glTranslatef((float)0.0f, (float)-0.68f, (float)0.0f); + MODEL.render(0.0625f, (float)Math.toRadians(tileEntity.wheelRotation), tileEntity.getIsLastBelt(), tileEntity.getIsFirstBelt(), false, false); + } + } else { + switch (face) { + case 2: { + GL11.glRotatef((float)0.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 3: { + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 4: { + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 5: { + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + } + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/belt/frame" + frame + ".png")); + MODEL.render(0.0625f, (float)Math.toRadians(tileEntity.wheelRotation), tileEntity.getIsLastBelt(), tileEntity.getIsFirstBelt(), false, true); + } + Block ent = tileEntity.getWorldObj().getBlock(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double var2, double var4, double var6, float var8) { + this.renderAModelAt((TileEntityConveyorBelt)tileEntity, var2, var4, var6, var8); + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderCraneController.java b/src/main/java/assemblyline/client/render/RenderCraneController.java new file mode 100644 index 0000000..273cd53 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderCraneController.java @@ -0,0 +1,53 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelCraneController; +import assemblyline.common.machine.crane.CraneHelper; +import assemblyline.common.machine.crane.TileEntityCraneController; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +public class RenderCraneController +extends RenderImprintable { + public static final String TEXTURE = "crane_controller_off.png"; + public static final String TEXTURE_VALID = "crane_controller_on.png"; + public static final ModelCraneController MODEL = new ModelCraneController(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + if (tileEntity != null && tileEntity instanceof TileEntityCraneController) { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/" + (((TileEntityCraneController)tileEntity).isCraneValid() ? TEXTURE_VALID : TEXTURE))); + ForgeDirection front = ForgeDirection.getOrientation((int)tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord)); + ForgeDirection right = CraneHelper.rotateClockwise(front); + float angle = 0.0f; + switch (front) { + case NORTH: { + angle = 90.0f; + break; + } + case SOUTH: { + angle = 270.0f; + break; + } + case EAST: { + angle = 180.0f; + } + } + int tX = tileEntity.xCoord; + int tY = tileEntity.yCoord; + int tZ = tileEntity.zCoord; + boolean connectFront = CraneHelper.canFrameConnectTo(tileEntity, tX + front.offsetX, tY, tZ + front.offsetZ, front.getOpposite()); + boolean connectRight = CraneHelper.canFrameConnectTo(tileEntity, tX + right.offsetX, tY, tZ + right.offsetZ, right.getOpposite()); + GL11.glPushMatrix(); + GL11.glTranslated((double)(x + 0.5), (double)(y + 1.5), (double)(z + 0.5)); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glRotatef((float)angle, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glEnable((int)2896); + MODEL.render(0.0625f, connectRight, connectFront); + GL11.glPopMatrix(); + } + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderCraneFrame.java b/src/main/java/assemblyline/client/render/RenderCraneFrame.java new file mode 100644 index 0000000..b7e4932 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderCraneFrame.java @@ -0,0 +1,44 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelCraneRail; +import assemblyline.common.machine.crane.CraneHelper; +import assemblyline.common.machine.crane.TileEntityCraneRail; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +public class RenderCraneFrame +extends TileEntitySpecialRenderer { + public static final String TEXTURE = "crane_frame.png"; + public static final ModelCraneRail MODEL = new ModelCraneRail(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) { + if (tileEntity != null && tileEntity instanceof TileEntityCraneRail) { + int tX = tileEntity.xCoord; + int tY = tileEntity.yCoord; + int tZ = tileEntity.zCoord; + boolean renderUp = CraneHelper.canFrameConnectTo(tileEntity, tX, tY + 1, tZ, ForgeDirection.DOWN); + boolean renderDown = CraneHelper.canFrameConnectTo(tileEntity, tX, tY - 1, tZ, ForgeDirection.UP); + boolean renderLeft = CraneHelper.canFrameConnectTo(tileEntity, tX - 1, tY, tZ, ForgeDirection.EAST); + boolean renderRight = CraneHelper.canFrameConnectTo(tileEntity, tX + 1, tY, tZ, ForgeDirection.WEST); + boolean renderFront = CraneHelper.canFrameConnectTo(tileEntity, tX, tY, tZ - 1, ForgeDirection.SOUTH); + boolean renderBack = CraneHelper.canFrameConnectTo(tileEntity, tX, tY, tZ + 1, ForgeDirection.NORTH); + boolean renderFoot = tileEntity.getWorldObj().isSideSolid(tX, tY - 1, tZ, ForgeDirection.UP); + if (renderLeft && renderRight || renderFront && renderBack) { + renderFoot = false; + } + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/crane_frame.png")); + GL11.glPushMatrix(); + GL11.glTranslated((double)(x + 0.5), (double)(y + 1.5), (double)(z + 0.5)); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + GL11.glEnable((int)2896); + MODEL.render(renderUp, renderDown && !renderFoot, renderLeft, renderRight, renderFront, renderBack, renderFoot); + GL11.glPopMatrix(); + } + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderCrate.java b/src/main/java/assemblyline/client/render/RenderCrate.java new file mode 100644 index 0000000..5b94660 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderCrate.java @@ -0,0 +1,158 @@ +package assemblyline.client.render; + +import assemblyline.common.block.TileEntityCrate; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector3; + +public class RenderCrate +extends TileEntitySpecialRenderer { + private final RenderBlocks renderBlocks = new RenderBlocks(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) { + Vector3 vec = new Vector3(x, y, z); + double distance = vec.distanceTo(new Vector3(0.0, 0.0, 0.0)); + if (tileEntity instanceof TileEntityCrate && distance < 15.0) { + TileEntityCrate tileCrate = (TileEntityCrate)tileEntity; + RenderItem renderItem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + String itemName = "Empty"; + String amount = ""; + ItemStack itemStack = tileCrate.getStackInSlot(0); + if (itemStack != null) { + itemName = itemStack.getDisplayName(); + amount = Integer.toString(itemStack.stackSize); + } + for (int side = 2; side < 6; ++side) { + ForgeDirection direction = ForgeDirection.getOrientation((int)side); + if (tileCrate.getWorldObj().isSideSolid(tileCrate.xCoord + direction.offsetX, tileCrate.yCoord, tileCrate.zCoord + direction.offsetZ, direction.getOpposite())) continue; + this.setupLight(tileCrate, direction.offsetX, direction.offsetZ); + OpenGlHelper.setLightmapTextureCoords((int)OpenGlHelper.lightmapTexUnit, (float)240.0f, (float)240.0f); + if (itemStack != null) { + GL11.glPushMatrix(); + switch (side) { + case 2: { + GL11.glTranslated((double)(x + 0.65), (double)(y + 0.9), (double)(z - 0.01)); + break; + } + case 3: { + GL11.glTranslated((double)(x + 0.35), (double)(y + 0.9), (double)(z + 1.01)); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 4: { + GL11.glTranslated((double)(x - 0.01), (double)(y + 0.9), (double)(z + 0.35)); + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + break; + } + case 5: { + GL11.glTranslated((double)(x + 1.01), (double)(y + 0.9), (double)(z + 0.65)); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + } + float scale = 0.03125f; + GL11.glScalef((float)(0.6f * scale), (float)(0.6f * scale), (float)0.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; + GL11.glDisable((int)2896); + if (!ForgeHooksClient.renderInventoryItem((RenderBlocks)this.renderBlocks, renderEngine, (ItemStack)itemStack, (boolean)true, (float)0.0f, (float)0.0f, (float)0.0f)) { + renderItem.renderItemIntoGUI(this.func_147498_b(), renderEngine, itemStack, 0, 0); + } + GL11.glEnable((int)2896); + GL11.glPopMatrix(); + } + this.renderText(itemName, side, 0.02f, x, y - (double)0.35f, z); + if (amount == "") continue; + this.renderText(amount, side, 0.02f, x, y - (double)0.15f, z); + } + } + } + + private void setupLight(TileEntity tileEntity, int xDifference, int zDifference) { + World world = tileEntity.getWorldObj(); + if (world.getBlock(tileEntity.xCoord + xDifference, tileEntity.yCoord, tileEntity.zCoord + zDifference).isOpaqueCube()) { + return; + } + int br = world.getLightBrightnessForSkyBlocks(tileEntity.xCoord + xDifference, tileEntity.yCoord, tileEntity.zCoord + zDifference, 0); + int var11 = br % 65536; + int var12 = br / 65536; + float scale = 0.6f; + OpenGlHelper.setLightmapTextureCoords((int)OpenGlHelper.lightmapTexUnit, (float)((float)var11 * scale), (float)((float)var12 * scale)); + } + + private void renderText(String text, int side, float maxScale, double x, double y, double z) { + GL11.glPushMatrix(); + GL11.glPolygonOffset((float)-10.0f, (float)-10.0f); + GL11.glEnable((int)32823); + float displayX = 0.0f; + float displayY = 0.0f; + float displayWidth = 1.0f; + float displayHeight = 1.0f; + GL11.glTranslated((double)x, (double)y, (double)z); + switch (side) { + case 3: { + GL11.glTranslatef((float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)0.0f, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)90.0f, (float)1.0f, (float)0.0f, (float)0.0f); + break; + } + case 2: { + GL11.glTranslatef((float)1.0f, (float)1.0f, (float)1.0f); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)90.0f, (float)1.0f, (float)0.0f, (float)0.0f); + break; + } + case 5: { + GL11.glTranslatef((float)0.0f, (float)1.0f, (float)1.0f); + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)90.0f, (float)1.0f, (float)0.0f, (float)0.0f); + break; + } + case 4: { + GL11.glTranslatef((float)1.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)-90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)90.0f, (float)1.0f, (float)0.0f, (float)0.0f); + } + } + GL11.glTranslatef((float)(displayWidth / 2.0f), (float)1.0f, (float)(displayHeight / 2.0f)); + GL11.glRotatef((float)-90.0f, (float)1.0f, (float)0.0f, (float)0.0f); + FontRenderer fontRenderer = super.func_147498_b(); + int requiredWidth = Math.max(fontRenderer.getStringWidth(text), 1); + int lineHeight = fontRenderer.FONT_HEIGHT + 2; + int requiredHeight = lineHeight * 1; + float scaler = 0.8f; + float scaleX = displayWidth / (float)requiredWidth; + float scaleY = displayHeight / (float)requiredHeight; + float scale = scaleX * scaler; + if (maxScale > 0.0f) { + scale = Math.min(scale, maxScale); + } + GL11.glScalef((float)scale, (float)(-scale), (float)scale); + GL11.glDepthMask((boolean)false); + int realHeight = (int)Math.floor(displayHeight / scale); + int realWidth = (int)Math.floor(displayWidth / scale); + int offsetX = (realWidth - requiredWidth) / 2; + int offsetY = (realHeight - requiredHeight) / 2; + GL11.glDisable((int)2896); + fontRenderer.drawString("\u00a7f" + text, offsetX - realWidth / 2, 1 + offsetY - realHeight / 2, 1); + GL11.glEnable((int)2896); + GL11.glDepthMask((boolean)true); + GL11.glDisable((int)32823); + GL11.glPopMatrix(); + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderDetector.java b/src/main/java/assemblyline/client/render/RenderDetector.java new file mode 100644 index 0000000..368f1e3 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderDetector.java @@ -0,0 +1,38 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.tileentity.TileEntity; +import org.lwjgl.opengl.GL11; +import universalelectricity.core.vector.Vector3; + +@SideOnly(value=Side.CLIENT) +public class RenderDetector +extends RenderImprintable { + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) { + super.renderTileEntityAt(tileEntity, x, y, z, var8); + } + + public static void render(boolean isInverted, Vector3 position) { //TODO: WTF + GL11.glPushMatrix(); + GL11.glTranslated((double)position.x, (double)position.y, (double)position.z); + if (isInverted) { + // empty if block + } + ModelHelper.setGlobalTextureResolution(128, 128); + ModelHelper.setTextureClip(false); + ModelHelper.setTextureOffset(0, 64); + ModelHelper.setTextureSubResolution(64, 64); + ModelHelper.drawCuboid(0.45f, 0.75f, 0.45f, 0.125f, 0.25f, 0.125f); + ModelHelper.setTextureOffset(0, 0); + ModelHelper.setTextureSubResolution(128, 64); + ModelHelper.drawCuboid(0.25f, 0.25f, 0.25f, 0.5f, 0.5f, 0.5f); + ModelHelper.setTextureOffset(64, 64); + ModelHelper.setTextureSubResolution(64, 32); + ModelHelper.drawCuboid(0.375f, 0.1875f, 0.375f, 0.25f, 0.0625f, 0.25f); + GL11.glPopMatrix(); + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderHelper.java b/src/main/java/assemblyline/client/render/RenderHelper.java new file mode 100644 index 0000000..8d2e8f4 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderHelper.java @@ -0,0 +1,54 @@ +package assemblyline.client.render; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import org.lwjgl.opengl.GL11; + +public class RenderHelper { + public static void renderFloatingText(String text, float x, float y, float z) { + RenderHelper.renderFloatingText(text, x, y, z, 0xFFFFFF); + } + + public static void renderFloatingText(String text, float x, float y, float z, int color) { + RenderManager renderManager = RenderManager.instance; + FontRenderer fontRenderer = renderManager.getFontRenderer(); + float scale = 0.027f; + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)0.5f); + GL11.glPushMatrix(); + GL11.glTranslatef((float)(x + 0.0f), (float)(y + 2.3f), (float)z); + GL11.glNormal3f((float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)(-renderManager.playerViewY), (float)0.0f, (float)1.0f, (float)0.0f); + GL11.glRotatef((float)renderManager.playerViewX, (float)1.0f, (float)0.0f, (float)0.0f); + GL11.glScalef((float)(-scale), (float)(-scale), (float)scale); + GL11.glDisable((int)2896); + OpenGlHelper.setLightmapTextureCoords((int)OpenGlHelper.lightmapTexUnit, (float)240.0f, (float)240.0f); + GL11.glDepthMask((boolean)false); + GL11.glDisable((int)2929); + GL11.glEnable((int)3042); + GL11.glBlendFunc((int)770, (int)771); + Tessellator tessellator = Tessellator.instance; + int yOffset = 0; + GL11.glDisable((int)3553); + tessellator.startDrawingQuads(); + int stringMiddle = fontRenderer.getStringWidth(text) / 2; + tessellator.setColorRGBA_F(0.0f, 0.0f, 0.0f, 0.5f); + tessellator.addVertex((double)(-stringMiddle - 1), (double)(-1 + yOffset), 0.0); + tessellator.addVertex((double)(-stringMiddle - 1), (double)(8 + yOffset), 0.0); + tessellator.addVertex((double)(stringMiddle + 1), (double)(8 + yOffset), 0.0); + tessellator.addVertex((double)(stringMiddle + 1), (double)(-1 + yOffset), 0.0); + tessellator.draw(); + GL11.glEnable((int)3553); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)0.5f); + fontRenderer.drawString(text, -fontRenderer.getStringWidth(text) / 2, yOffset, color); + GL11.glEnable((int)2929); + GL11.glDepthMask((boolean)true); + fontRenderer.drawString(text, -fontRenderer.getStringWidth(text) / 2, yOffset, color); + GL11.glEnable((int)2896); + GL11.glDisable((int)3042); + GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f); + GL11.glPopMatrix(); + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderImprintable.java b/src/main/java/assemblyline/client/render/RenderImprintable.java new file mode 100644 index 0000000..242c0a4 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderImprintable.java @@ -0,0 +1,34 @@ +package assemblyline.client.render; + +import assemblyline.common.machine.imprinter.ItemImprinter; +import assemblyline.common.machine.imprinter.TileEntityFilterable; +import java.util.ArrayList; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; + +public abstract class RenderImprintable +extends TileEntitySpecialRenderer { + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) { + EntityClientPlayerMP player; + MovingObjectPosition objectPosition; + TileEntityFilterable tileFilterable; + ItemStack filter; + if (tileEntity != null && tileEntity instanceof TileEntityFilterable && (filter = (tileFilterable = (TileEntityFilterable)tileEntity).getFilter()) != null && (objectPosition = (player = Minecraft.getMinecraft().thePlayer).rayTrace(8.0, 1.0f)) != null && objectPosition.blockX == tileFilterable.xCoord && objectPosition.blockY == tileFilterable.yCoord && objectPosition.blockZ == tileFilterable.zCoord) { + ArrayList filters = ItemImprinter.getFilters(filter); + for (int i = 0; i < filters.size(); ++i) { + if (((TileEntityFilterable)tileEntity).isInverted()) { + RenderHelper.renderFloatingText(((ItemStack)filters.get(i)).getTooltip((EntityPlayer)player, Minecraft.getMinecraft().gameSettings.advancedItemTooltips).get(0).toString(), (float)x + 0.5f, (float)y + (float)i * 0.25f - 1.0f, (float)z + 0.5f, 0xFF8888); + continue; + } + RenderHelper.renderFloatingText(((ItemStack)filters.get(i)).getTooltip((EntityPlayer)player, Minecraft.getMinecraft().gameSettings.advancedItemTooltips).get(0).toString(), (float)x + 0.5f, (float)y + (float)i * 0.25f - 1.0f, (float)z + 0.5f, 0x88FF88); + } + } + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderManipulator.java b/src/main/java/assemblyline/client/render/RenderManipulator.java new file mode 100644 index 0000000..5631667 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderManipulator.java @@ -0,0 +1,43 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelManipulator; +import assemblyline.common.machine.TileEntityManipulator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +public class RenderManipulator +extends RenderImprintable { + private ModelManipulator model = new ModelManipulator(); + + private void renderAModelAt(TileEntityManipulator tileEntity, double x, double y, double z, float f) { + int face = tileEntity.getDirection().ordinal(); + GL11.glPushMatrix(); + GL11.glTranslatef((float)((float)x + 0.5f), (float)((float)y + 1.5f), (float)((float)z + 0.5f)); + GL11.glRotatef((float)180.0f, (float)0.0f, (float)0.0f, (float)1.0f); + if (tileEntity.isOutput()) { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/manipulator1.png")); + } else { + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/manipulator2.png")); + } + if (face == 2) { + GL11.glRotatef((float)0.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } else if (face == 3) { + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } else if (face == 4) { + GL11.glRotatef((float)270.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } else if (face == 5) { + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + this.model.render(0.0625f, true, 0); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double var2, double var4, double var6, float var8) { + this.renderAModelAt((TileEntityManipulator)tileEntity, var2, var4, var6, var8); + super.renderTileEntityAt(tileEntity, var2, var4, var6, var8); + } +} + diff --git a/src/main/java/assemblyline/client/render/RenderRejector.java b/src/main/java/assemblyline/client/render/RenderRejector.java new file mode 100644 index 0000000..9dd0711 --- /dev/null +++ b/src/main/java/assemblyline/client/render/RenderRejector.java @@ -0,0 +1,46 @@ +package assemblyline.client.render; + +import assemblyline.client.model.ModelRejectorPiston; +import assemblyline.common.machine.TileEntityRejector; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +public class RenderRejector +extends RenderImprintable { + private ModelRejectorPiston model = new ModelRejectorPiston(); + + private void renderAModelAt(TileEntityRejector tileEntity, double x, double y, double z, float f) { + boolean fire = tileEntity.firePiston; + int face = tileEntity.getDirection().ordinal(); + int pos = 0; + if (fire) { + pos = 8; + } + this.bindTexture(new ResourceLocation("assemblyline", "textures/models/rejector.png")); + GL11.glPushMatrix(); + GL11.glTranslatef((float)((float)x + 0.5f), (float)((float)y + 1.5f), (float)((float)z + 0.5f)); + GL11.glScalef((float)1.0f, (float)-1.0f, (float)-1.0f); + if (face == 2) { + GL11.glRotatef((float)180.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + if (face == 3) { + GL11.glRotatef((float)0.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } else if (face == 4) { + GL11.glRotatef((float)90.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } else if (face == 5) { + GL11.glRotatef((float)270.0f, (float)0.0f, (float)1.0f, (float)0.0f); + } + this.model.render(0.0625f); + this.model.renderPiston(0.0625f, pos); + GL11.glPopMatrix(); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double var2, double var4, double var6, float var8) { + this.renderAModelAt((TileEntityRejector)tileEntity, var2, var4, var6, var8); + super.renderTileEntityAt(tileEntity, var2, var4, var6, var8); + } +} + diff --git a/src/main/java/assemblyline/common/AssemblyLine.java b/src/main/java/assemblyline/common/AssemblyLine.java new file mode 100644 index 0000000..50005d7 --- /dev/null +++ b/src/main/java/assemblyline/common/AssemblyLine.java @@ -0,0 +1,184 @@ +package assemblyline.common; + +import assemblyline.common.CommonProxy; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockCrate; +import assemblyline.common.block.BlockTurntable; +import assemblyline.common.block.ItemBlockCrate; +import assemblyline.common.machine.BlockManipulator; +import assemblyline.common.machine.BlockRejector; +import assemblyline.common.machine.armbot.BlockArmbot; +import assemblyline.common.machine.belt.BlockConveyorBelt; +import assemblyline.common.machine.command.GrabDictionary; +import assemblyline.common.machine.crane.BlockCraneController; +import assemblyline.common.machine.crane.BlockCraneFrame; +import assemblyline.common.machine.detector.BlockDetector; +import assemblyline.common.machine.encoder.BlockEncoder; +import assemblyline.common.machine.encoder.ItemDisk; +import assemblyline.common.machine.imprinter.BlockImprinter; +import assemblyline.common.machine.imprinter.ItemImprinter; +import assemblyline.common.network.MessageEncoder; +import assemblyline.common.network.MessageEncoderHandler; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import java.io.File; +import java.util.Arrays; +import java.util.logging.Logger; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.multiblock.BlockMulti; + +@Mod(modid="AssemblyLine", name="Assembly Line", version="0.3.5.117", dependencies="after:BasicComponents; after:IC2", useMetadata=true) +public class AssemblyLine { + public static final String MAJOR_VERSION = "0"; + public static final String MINOR_VERSION = "3"; + public static final String REVIS_VERSION = "5"; + public static final String BUILD_VERSION = "117"; + public static final String MOD_ID = "AssemblyLine"; + public static final String MOD_NAME = "Assembly Line"; + public static final String VERSION = "0.3.5.117"; + public static final String CHANNEL = "AssemblyLine"; + @SidedProxy(clientSide="assemblyline.client.ClientProxy", serverSide="assemblyline.common.CommonProxy") + public static CommonProxy proxy; + @Mod.Instance(value="AssemblyLine") + public static AssemblyLine instance; + @Mod.Metadata(value="AssemblyLine") + public static ModMetadata meta; + public static final String LANGUAGE_PATH = "/assets/assemblyline/languages/"; + private static final String[] LANGUAGES_SUPPORTED; + public static final Configuration CONFIGURATION; + public static final int BLOCK_ID_PREFIX = 3030; + public static Block blockConveyorBelt; + public static Block blockManipulator; + public static BlockCrate blockCrate; + public static Block blockImprinter; + public static Block blockEncoder; + public static Block blockDetector; + public static Block blockRejector; + public static Block blockArmbot; + public static Block blockCraneController; + public static Block blockCraneFrame; + public static Block blockTurntable; + public static BlockMulti blockMulti; + public static final int ITEM_ID_PREFIX = 13030; + public static Item itemImprint; + public static Item itemDisk; + public static ItemStack ic2Wrench; + public static Logger FMLog; + public static final boolean DEBUG = false; + public static boolean REQUIRE_NO_POWER; + public static SimpleNetworkWrapper NETWORK; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + //FMLog.setParent(FMLLog.getLogger()); + instance = this; + CONFIGURATION.load(); + blockConveyorBelt = new BlockConveyorBelt(); + blockManipulator = new BlockManipulator(); + blockCrate = new BlockCrate(); + blockImprinter = new BlockImprinter(); + blockDetector = new BlockDetector(); + blockRejector = new BlockRejector(); + blockEncoder = new BlockEncoder(); + blockArmbot = new BlockArmbot(); + blockMulti = new BlockMulti(); + blockCraneController = new BlockCraneController(); + blockCraneFrame = new BlockCraneFrame(); + blockTurntable = new BlockTurntable(); + itemImprint = new ItemImprinter(); + itemDisk = new ItemDisk(); + REQUIRE_NO_POWER = !CONFIGURATION.get("general", "requirePower", true).getBoolean(true); + CONFIGURATION.save(); + NetworkRegistry.INSTANCE.registerGuiHandler((Object)this, (IGuiHandler)proxy); + NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel(MOD_ID); + NETWORK.registerMessage(new MessageEncoderHandler(), MessageEncoder.class, 0, Side.SERVER); + GameRegistry.registerBlock(blockConveyorBelt, "conveyor_belt"); + GameRegistry.registerBlock(blockCrate, ItemBlockCrate.class, "crate"); + GameRegistry.registerBlock(blockManipulator, "manipulator"); + GameRegistry.registerBlock(blockImprinter, "imprinter"); + GameRegistry.registerBlock(blockEncoder, "encoder"); + GameRegistry.registerBlock(blockDetector, "detector"); + GameRegistry.registerBlock(blockRejector, "rejector"); + GameRegistry.registerBlock(blockArmbot, "armbot"); + GameRegistry.registerBlock(blockTurntable, "turntable"); + GameRegistry.registerBlock(blockCraneController, "crane_controller"); + GameRegistry.registerBlock(blockCraneFrame, "crane_frame"); + GameRegistry.registerItem(itemDisk, "disk"); + GameRegistry.registerItem(itemImprint, "imprint"); + TabAssemblyLine.itemStack = new ItemStack(blockConveyorBelt); + proxy.preInit(); + } + + @EventHandler + public void load(FMLInitializationEvent evt) { + proxy.init(); + GrabDictionary.registerList(); + FMLog.info("Loaded: " + TranslationHelper.loadLanguages(LANGUAGE_PATH, LANGUAGES_SUPPORTED) + " languages."); + AssemblyLine.meta.modId = "AssemblyLine"; + AssemblyLine.meta.name = MOD_NAME; + AssemblyLine.meta.description = "A mod that brings conveyor belt transporting systems to Minecraft."; + AssemblyLine.meta.url = "http://calclavia.com/universalelectricity/?m=18"; + AssemblyLine.meta.logoFile = "/al_logo.png"; + AssemblyLine.meta.version = VERSION; + AssemblyLine.meta.authorList = Arrays.asList("DarkGuardsman, Briaman, Calclavia"); + AssemblyLine.meta.credits = "Please see the website."; + AssemblyLine.meta.autogenerated = false; + this.createStandardRecipes(); + this.createUERecipes(); + } + + private void createUERecipes() { + System.out.println("BasicComponents Found...adding UE recipes for Assembly Line."); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockArmbot, new Object[]{"II ", "SIS", "MCM", Character.valueOf('S'), "plateSteel", Character.valueOf('C'), "advancedCircuit", Character.valueOf('I'), "ingotSteel", Character.valueOf('M'), "motor"})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(itemDisk, new Object[]{"III", "ICI", "III", Character.valueOf('I'), itemImprint, Character.valueOf('C'), "advancedCircuit"})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockEncoder, new Object[]{"SIS", "SCS", "SSS", Character.valueOf('I'), itemImprint, Character.valueOf('S'), "ingotSteel", Character.valueOf('C'), "advancedCircuit"})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockDetector, new Object[]{"SES", "SCS", "S S", Character.valueOf('S'), "ingotSteel", Character.valueOf('C'), "basicCircuit", Character.valueOf('E'), Items.ender_eye})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(blockConveyorBelt, 10), new Object[]{"III", "WMW", Character.valueOf('I'), "ingotSteel", Character.valueOf('W'), Blocks.planks, Character.valueOf('M'), "motor"})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockRejector, new Object[]{"WPW", "@R@", Character.valueOf('@'), "ingotSteel", Character.valueOf('R'), Items.redstone, Character.valueOf('P'), Blocks.piston, Character.valueOf('C'), "basicCircuit", Character.valueOf('W'), "copperWire"})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockTurntable, new Object[]{"M", "P", Character.valueOf('M'), "motor", Character.valueOf('P'), Blocks.piston})); + GameRegistry.addRecipe((IRecipe)new ShapelessOreRecipe(new ItemStack(blockManipulator, 2), new Object[]{Blocks.dispenser, "basicCircuit"})); + } + + private void createStandardRecipes() { + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(itemImprint, 2), new Object[]{"R", "P", "I", Character.valueOf('P'), Items.paper, Character.valueOf('R'), Items.redstone, Character.valueOf('I'), new ItemStack(Items.dye, 1, 0)})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(blockImprinter, new Object[]{"SIS", "SPS", "WCW", Character.valueOf('S'), Items.iron_ingot, Character.valueOf('C'), Blocks.chest, Character.valueOf('W'), Blocks.crafting_table, Character.valueOf('P'), Blocks.piston, Character.valueOf('I'), new ItemStack(Items.dye, 1, 0)})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(blockCrate, 1, 0), new Object[]{"TST", "S S", "TST", Character.valueOf('S'), Items.iron_ingot, Character.valueOf('T'), Blocks.log})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(blockCrate, 1, 1), new Object[]{"TST", "SCS", "TST", Character.valueOf('C'), new ItemStack(blockCrate, 1, 0), Character.valueOf('S'), Items.iron_ingot, Character.valueOf('T'), Blocks.log})); + GameRegistry.addRecipe((IRecipe)new ShapedOreRecipe(new ItemStack(blockCrate, 1, 2), new Object[]{"TST", "SCS", "TST", Character.valueOf('C'), new ItemStack(blockCrate, 1, 1), Character.valueOf('S'), Items.iron_ingot, Character.valueOf('T'), Blocks.log})); + } + + public static void printSidedData(String data) { + System.out.print(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? "[C]" : "[S]"); + System.out.println(" " + data); + } + + static { + LANGUAGES_SUPPORTED = new String[]{"en_US"}; + CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), "UniversalElectricity/AssemblyLine.cfg")); + ic2Wrench = null; + FMLog = Logger.getLogger(MOD_NAME); + REQUIRE_NO_POWER = false; + } +} + diff --git a/src/main/java/assemblyline/common/CommonProxy.java b/src/main/java/assemblyline/common/CommonProxy.java new file mode 100644 index 0000000..8413c43 --- /dev/null +++ b/src/main/java/assemblyline/common/CommonProxy.java @@ -0,0 +1,114 @@ +package assemblyline.common; + +import assemblyline.common.block.TileEntityCrate; +import assemblyline.common.machine.TileEntityManipulator; +import assemblyline.common.machine.TileEntityRejector; +import assemblyline.common.machine.armbot.TileEntityArmbot; +import assemblyline.common.machine.belt.TileEntityConveyorBelt; +import assemblyline.common.machine.crane.TileEntityCraneController; +import assemblyline.common.machine.crane.TileEntityCraneRail; +import assemblyline.common.machine.detector.TileEntityDetector; +import assemblyline.common.machine.encoder.ContainerEncoder; +import assemblyline.common.machine.encoder.TileEntityEncoder; +import assemblyline.common.machine.imprinter.ContainerImprinter; +import assemblyline.common.machine.imprinter.TileEntityImprinter; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.prefab.multiblock.TileEntityMulti; + +public class CommonProxy +implements IGuiHandler { + public static final int GUI_IMPRINTER = 1; + public static final int GUI_ENCODER = 2; + + public void preInit() { + } + + public void init() { + GameRegistry.registerTileEntity(TileEntityConveyorBelt.class, (String)"ALConveyorBelt"); + GameRegistry.registerTileEntity(TileEntityRejector.class, (String)"ALSorter"); + GameRegistry.registerTileEntity(TileEntityManipulator.class, (String)"ALManipulator"); + GameRegistry.registerTileEntity(TileEntityCrate.class, (String)"ALCrate"); + GameRegistry.registerTileEntity(TileEntityDetector.class, (String)"ALDetector"); + GameRegistry.registerTileEntity(TileEntityEncoder.class, (String)"ALEncoder"); + GameRegistry.registerTileEntity(TileEntityArmbot.class, (String)"ALArmbot"); + GameRegistry.registerTileEntity(TileEntityCraneController.class, (String)"ALCraneController"); + GameRegistry.registerTileEntity(TileEntityCraneRail.class, (String)"ALCraneRail"); + GameRegistry.registerTileEntity(TileEntityImprinter.class, (String)"ALImprinter"); + GameRegistry.registerTileEntity(TileEntityMulti.class, (String)"ALMulti"); + } + + private void extractZipToLocation(File zipFile, String sourceFolder, String destFolder) { + try { + File destFile = new File(FMLCommonHandler.instance().getMinecraftServerInstance().getFile("."), destFolder); + String destinationName = destFile.getAbsolutePath(); + byte[] buf = new byte[1024]; + ZipInputStream zipinputstream = null; + zipinputstream = new ZipInputStream(new FileInputStream(zipFile)); + ZipEntry zipentry = zipinputstream.getNextEntry(); + while (zipentry != null) { + int n; + String zipentryName = zipentry.getName(); + if (!zipentryName.startsWith(sourceFolder)) { + zipentry = zipinputstream.getNextEntry(); + continue; + } + String entryName = destinationName + zipentryName.substring(Math.min(zipentryName.length(), sourceFolder.length() - 1)); + entryName = entryName.replace('/', File.separatorChar); + entryName = entryName.replace('\\', File.separatorChar); + File newFile = new File(entryName); + if (zipentry.isDirectory()) { + if (!newFile.mkdirs()) break; + zipentry = zipinputstream.getNextEntry(); + continue; + } + FileOutputStream fileoutputstream = new FileOutputStream(entryName); + while ((n = zipinputstream.read(buf, 0, 1024)) > -1) { + fileoutputstream.write(buf, 0, n); + } + fileoutputstream.close(); + zipinputstream.closeEntry(); + zipentry = zipinputstream.getNextEntry(); + } + zipinputstream.close(); + } + catch (Exception e) { + System.out.println("Error while loading AssemblyLine Lua libraries: "); + e.printStackTrace(); + } + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null) { + switch (ID) { + case 1: { + return new ContainerImprinter(player.inventory, (TileEntityImprinter)tileEntity); + } + case 2: { + if (tileEntity == null || !(tileEntity instanceof TileEntityEncoder)) break; + return new ContainerEncoder(player.inventory, (TileEntityEncoder)tileEntity); + } + } + } + return null; + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + public boolean isCtrKeyDown() { + return false; + } +} + diff --git a/src/main/java/assemblyline/common/Pair.java b/src/main/java/assemblyline/common/Pair.java new file mode 100644 index 0000000..b9d835b --- /dev/null +++ b/src/main/java/assemblyline/common/Pair.java @@ -0,0 +1,35 @@ +package assemblyline.common; + +public class Pair { + private final Object left; + private final Object right; + + public Pair(Object left, Object right) { + this.left = left; + this.right = right; + } + + public Object getKey() { + return this.left; + } + + public Object getValue() { + return this.right; + } + + public int hashCode() { + return this.left.hashCode() ^ this.right.hashCode(); + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof Pair)) { + return false; + } + Pair pairo = (Pair)o; + return this.left.equals(pairo.getKey()) && this.right.equals(pairo.getValue()); + } +} + diff --git a/src/main/java/assemblyline/common/PathfinderCrate.java b/src/main/java/assemblyline/common/PathfinderCrate.java new file mode 100644 index 0000000..303da52 --- /dev/null +++ b/src/main/java/assemblyline/common/PathfinderCrate.java @@ -0,0 +1,63 @@ +package assemblyline.common; + +import assemblyline.common.block.TileEntityCrate; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.core.vector.VectorHelper; + +public class PathfinderCrate { + public IPathCallBack callBackCheck = new IPathCallBack(){ + + @Override + public boolean isValidNode(PathfinderCrate finder, ForgeDirection direction, TileEntity provider, TileEntity node) { + return node instanceof TileEntityCrate; + } + + @Override + public boolean onSearch(PathfinderCrate finder, TileEntity provider) { + return false; + } + }; + public List iteratedNodes; + public List results; + + public PathfinderCrate() { + this.clear(); + } + + public boolean findNodes(TileEntity provider) { + if (provider != null) { + this.iteratedNodes.add(provider); + if (this.callBackCheck.onSearch(this, provider)) { + return false; + } + for (int i = 0; i < 6; ++i) { + TileEntity connectedTile = VectorHelper.getTileEntityFromSide(provider.getWorldObj(), new Vector3(provider), ForgeDirection.getOrientation((int)i)); + if (this.iteratedNodes.contains((Object)connectedTile) || !this.callBackCheck.isValidNode(this, ForgeDirection.getOrientation((int)i), provider, connectedTile) || this.findNodes(connectedTile)) continue; + return false; + } + } + return true; + } + + public PathfinderCrate init(TileEntity provider) { + this.findNodes(provider); + return this; + } + + public PathfinderCrate clear() { + this.iteratedNodes = new ArrayList<>(); + this.results = new ArrayList(); + return this; + } + + public static interface IPathCallBack { + public boolean isValidNode(PathfinderCrate var1, ForgeDirection var2, TileEntity var3, TileEntity var4); + + public boolean onSearch(PathfinderCrate var1, TileEntity var2); + } +} + diff --git a/src/main/java/assemblyline/common/TabAssemblyLine.java b/src/main/java/assemblyline/common/TabAssemblyLine.java new file mode 100644 index 0000000..92536cb --- /dev/null +++ b/src/main/java/assemblyline/common/TabAssemblyLine.java @@ -0,0 +1,25 @@ +package assemblyline.common; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class TabAssemblyLine +extends CreativeTabs { + public static final TabAssemblyLine INSTANCE = new TabAssemblyLine("assemblyline"); + public static ItemStack itemStack; + + public TabAssemblyLine(String par2Str) { + super(par2Str); + } + + public ItemStack getIconItemStack() { + return itemStack; + } + + @Override + public Item getTabIconItem() { + return itemStack.getItem(); + } +} + diff --git a/src/main/java/assemblyline/common/block/BlockALMachine.java b/src/main/java/assemblyline/common/block/BlockALMachine.java new file mode 100644 index 0000000..a986e20 --- /dev/null +++ b/src/main/java/assemblyline/common/block/BlockALMachine.java @@ -0,0 +1,45 @@ +package assemblyline.common.block; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import universalelectricity.prefab.block.BlockAdvanced; + +public abstract class BlockALMachine +extends BlockAdvanced { + public IIcon machine_icon; + + public BlockALMachine(Material material) { + super(material); + } + + @SideOnly(value=Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister iconReg) { + this.machine_icon = iconReg.registerIcon("assemblyline:machine"); + } + + @SideOnly(value=Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess par1iBlockAccess, int par2, int par3, int par4, int par5) { + return this.machine_icon; + } + + @SideOnly(value=Side.CLIENT) + @Override + public IIcon getIcon(int par1, int par2) { + return this.machine_icon; + } + + @Override + public TileEntity createTileEntity(World w, int meta) { + return this.createNewTileEntity(w, meta); + } + +} + diff --git a/src/main/java/assemblyline/common/block/BlockCrate.java b/src/main/java/assemblyline/common/block/BlockCrate.java new file mode 100644 index 0000000..a82b556 --- /dev/null +++ b/src/main/java/assemblyline/common/block/BlockCrate.java @@ -0,0 +1,239 @@ +package assemblyline.common.block; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.PathfinderCrate; +import assemblyline.common.TabAssemblyLine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; + +public class BlockCrate +extends BlockALMachine { + IIcon crate_icon; + + public BlockCrate() { + super(UniversalElectricity.machine); + this.setBlockName("crate"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg) { + this.crate_icon = iconReg.registerIcon("assemblyline:crate"); + } + + @Override + public IIcon getIcon(IBlockAccess iBlockAccess, int x, int y, int z, int side) { + return this.crate_icon; + } + + @Override + public IIcon getIcon(int side, int metadata) { + return this.crate_icon; + } + + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { + if (!world.isRemote && world.getTileEntity(x, y, z) instanceof TileEntityCrate) { + TileEntityCrate tileEntity = (TileEntityCrate)world.getTileEntity(x, y, z); + boolean allMode = world.getWorldTime() - tileEntity.prevClickTime < 10L; + tileEntity.prevClickTime = world.getWorldTime(); + this.tryEject(tileEntity, player, allMode); + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { + if (super.onBlockActivated(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ)) { + return true; + } + if (!world.isRemote && world.getTileEntity(x, y, z) instanceof TileEntityCrate) { + TileEntityCrate tileEntity = (TileEntityCrate)world.getTileEntity(x, y, z); + boolean allMode = world.getWorldTime() - tileEntity.prevClickTime < 10L; + tileEntity.prevClickTime = world.getWorldTime(); + ItemStack current = entityPlayer.inventory.getCurrentItem(); + if (side == 1 || side > 1 && (double)hitY > 0.5 || !entityPlayer.capabilities.isCreativeMode) { + if (current != null && (current.getMaxStackSize() > 1 || current.getItem() == Item.getItemFromBlock(this))) { + this.tryInsert(tileEntity, entityPlayer, allMode); + } + } else if (side == 0 || side > 1 && (double)hitY <= 0.5) { + this.tryEject(tileEntity, entityPlayer, allMode); + } + } + return true; + } + + public void tryInsert(TileEntityCrate tileEntity, EntityPlayer player, boolean allMode, boolean doSearch) { + boolean success = allMode ? this.insertAllItems(tileEntity, player) : this.insertCurrentItem(tileEntity, player); + if (!success && doSearch) { + PathfinderCrate pathfinder = new PathfinderCrate().init(tileEntity); + for (TileEntity checkTile : pathfinder.iteratedNodes) { + if (!(checkTile instanceof TileEntityCrate)) continue; + AssemblyLine.blockCrate.tryInsert((TileEntityCrate)checkTile, player, allMode, false); + } + } + } + + public void tryInsert(TileEntityCrate tileEntity, EntityPlayer player, boolean allMode) { + this.tryInsert(tileEntity, player, allMode, true); + } + + public void tryEject(TileEntityCrate tileEntity, EntityPlayer player, boolean allMode) { + if (allMode && !player.isSneaking()) { + this.ejectItems(tileEntity, player, tileEntity.getMaxLimit()); + } else if (player.isSneaking()) { + this.ejectItems(tileEntity, player, 1); + } else { + ItemStack stack = tileEntity.getStackInSlot(0); + if (stack != null) { + this.ejectItems(tileEntity, player, stack.getMaxStackSize()); + } + } + } + + public boolean insertCurrentItem(TileEntityCrate tileEntity, EntityPlayer player) { + ItemStack currentStack = player.getCurrentEquippedItem(); + if (currentStack != null) { + if (currentStack.isStackable()) { + if (tileEntity.getStackInSlot(0) != null && !tileEntity.getStackInSlot(0).isItemEqual(currentStack)) { + return false; + } + player.inventory.setInventorySlotContents(player.inventory.currentItem, BlockCrate.putIn(tileEntity, currentStack)); + return true; + } + if (currentStack.getItem() == Item.getItemFromBlock(AssemblyLine.blockCrate)) { + ItemStack containedStack = ItemBlockCrate.getContainingItemStack(currentStack); + ItemStack crateStack = tileEntity.getStackInSlot(0); + if (containedStack != null && (crateStack == null || crateStack != null && containedStack.getItem() == crateStack.getItem() && containedStack.getItemDamage() == crateStack.getItemDamage())) { + ItemStack returned = BlockCrate.putIn(tileEntity, containedStack); + ItemBlockCrate.setContainingItemStack(currentStack, returned); + return true; + } + } + } + return false; + } + + public boolean insertAllItems(TileEntityCrate tileEntity, EntityPlayer player) { + ItemStack requestStack = null; + if (tileEntity.getStackInSlot(0) != null) { + requestStack = tileEntity.getStackInSlot(0).copy(); + } + if (requestStack == null) { + requestStack = player.getCurrentEquippedItem(); + } + if (requestStack != null && requestStack.isStackable()) { + boolean success = false; + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + ItemStack currentStack = player.inventory.getStackInSlot(i); + if (currentStack == null || !requestStack.isItemEqual(currentStack)) continue; + player.inventory.setInventorySlotContents(i, BlockCrate.putIn(tileEntity, currentStack)); + if (player instanceof EntityPlayerMP) { + ((EntityPlayerMP)player).sendContainerToPlayer(player.inventoryContainer); + } + success = true; + } + return success; + } + return false; + } + + public boolean ejectItems(TileEntityCrate tileEntity, EntityPlayer player, int requestSize) { + World world = tileEntity.getWorldObj(); + ItemStack containingStack = tileEntity.getStackInSlot(0); + if (containingStack != null) { + if (containingStack.stackSize > 0 && requestSize > 0) { + int amountToTake = Math.min(containingStack.stackSize, requestSize); + ItemStack dropStack = containingStack.copy(); + dropStack.stackSize = amountToTake; + if (!world.isRemote) { + EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, dropStack); + entityItem.delayBeforeCanPickup = 0; + world.spawnEntityInWorld((Entity)entityItem); + } + containingStack.stackSize -= amountToTake; + } + if (containingStack.stackSize <= 0) { + containingStack = null; + } + tileEntity.setInventorySlotContents(0, containingStack); + return true; + } + return false; + } + + public static ItemStack putIn(TileEntityCrate tileEntity, ItemStack itemStack) { + ItemStack containingStack = tileEntity.getStackInSlot(0); + if (containingStack != null) { + if (containingStack.isStackable() && containingStack.isItemEqual(itemStack)) { + int newStackSize = containingStack.stackSize + itemStack.stackSize; + int overFlowAmount = newStackSize - tileEntity.getInventoryStackLimit(); + itemStack.stackSize = overFlowAmount > 0 ? overFlowAmount : 0; + containingStack.stackSize = newStackSize; + tileEntity.setInventorySlotContents(0, containingStack); + } + } else { + tileEntity.setInventorySlotContents(0, itemStack.copy()); + itemStack.stackSize = 0; + } + if (itemStack.stackSize <= 0) { + return null; + } + return itemStack; + } + + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntityCrate tileEntity; + ItemStack containingStack; + if (!world.isRemote && world.getTileEntity(x, y, z) != null && (containingStack = (tileEntity = (TileEntityCrate)world.getTileEntity(x, y, z)).getStackInSlot(0)) != null && containingStack.stackSize > 0) { + float var6 = 0.7f; + double var7 = (double)(world.rand.nextFloat() * var6) + (double)(1.0f - var6) * 0.5; + double var9 = (double)(world.rand.nextFloat() * var6) + (double)(1.0f - var6) * 0.5; + double var11 = (double)(world.rand.nextFloat() * var6) + (double)(1.0f - var6) * 0.5; + ItemStack dropStack = new ItemStack((Block)this, 1, tileEntity.getTier()); + ItemBlockCrate.setContainingItemStack(dropStack, containingStack); + EntityItem var13 = new EntityItem(world, (double)x + var7, (double)y + var9, (double)z + var11, dropStack); + var13.delayBeforeCanPickup = 10; + world.spawnEntityInWorld((Entity)var13); + tileEntity.setInventorySlotContents(0, null); + world.setBlock(x, y, z, Blocks.air, 0, 3); + return true; + } + return false; + } + + @Override + public int damageDropped(int metadata) { + return metadata; + } + + @Override + public TileEntity createNewTileEntity(World var1, int meta) { + return new TileEntityCrate(); + } + + @Override + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List list) { + for (int i = 0; i < 3; ++i) { + list.add(new ItemStack((Block)this, 1, i)); + } + } +} + diff --git a/src/main/java/assemblyline/common/block/BlockTurntable.java b/src/main/java/assemblyline/common/block/BlockTurntable.java new file mode 100644 index 0000000..266aa7e --- /dev/null +++ b/src/main/java/assemblyline/common/block/BlockTurntable.java @@ -0,0 +1,138 @@ +package assemblyline.common.block; + +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRotatable; + +public class BlockTurntable +extends BlockALMachine { + private IIcon top; + + public BlockTurntable() { + super(Material.piston); + this.setBlockName("turntable"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg) { + super.registerBlockIcons(iconReg); + this.top = iconReg.registerIcon("assemblyline:turntable"); + } + + @Override + public void updateTick(World world, int x, int y, int z, Random par5Random) { + this.updateTurntableState(world, x, y, z); + } + + @Override + @SideOnly(value=Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + if (side == ForgeDirection.UP.ordinal()) { + return this.top; + } + return this.machine_icon; + } + + @Override + @SideOnly(value=Side.CLIENT) + public IIcon getIcon(int side, int meta) { + if (side == ForgeDirection.UP.ordinal()) { + return this.top; + } + return this.machine_icon; + } + + public static int determineOrientation(World world, int x, int y, int z, EntityPlayer entityPlayer) { + int var7; + if (MathHelper.abs((float)((float)entityPlayer.posX - (float)x)) < 2.0f && MathHelper.abs((float)((float)entityPlayer.posZ - (float)z)) < 2.0f) { + double var5 = entityPlayer.posY + 1.82 - (double)entityPlayer.yOffset; + if (var5 - (double)y > 2.0) { + return 1; + } + if ((double)y - var5 > 0.0) { + return 0; + } + } + return (var7 = MathHelper.floor_double((double)((double)(entityPlayer.rotationYaw * 4.0f / 360.0f) + 0.5)) & 3) == 0 ? 2 : (var7 == 1 ? 5 : (var7 == 2 ? 3 : (var7 == 3 ? 4 : 0))); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase par5EntityLiving, ItemStack stack) { + int metadata = BlockTurntable.determineOrientation(world, x, y, z, (EntityPlayer)par5EntityLiving); + world.setBlockMetadataWithNotify(x, y, z, metadata, 3); + world.scheduleBlockUpdate(x, y, z, this, 20); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + world.scheduleBlockUpdate(x, y, z, this, 20); + } + + private void updateTurntableState(World world, int x, int y, int z) { + if (world.isBlockIndirectlyGettingPowered(x, y, z)) { + try { + Vector3 position = new Vector3(x, y, z); + position.modifyPositionFromSide(ForgeDirection.UP); + IRotatable rotatable = null; + TileEntity tileEntity = position.getTileEntity((IBlockAccess)world); + Block block = position.getBlock((IBlockAccess)world); + if (tileEntity instanceof IRotatable) { + rotatable = (IRotatable)tileEntity; + } else if (block instanceof IRotatable) { + rotatable = (IRotatable)block; + } + if (rotatable != null) { + ForgeDirection newDir = ((IRotatable)tileEntity).getDirection((IBlockAccess)world, x, y, z); + switch (newDir) { + case EAST: + newDir = ForgeDirection.SOUTH; + break; + case NORTH: + newDir = ForgeDirection.EAST; + break; + case SOUTH: + newDir = ForgeDirection.WEST; + break; + case WEST: + newDir = ForgeDirection.NORTH; + break; + default: + break; + + } + rotatable.setDirection(world, x, y, z, newDir); + world.markBlockForUpdate(position.intX(), position.intY(), position.intZ()); + world.playSoundEffect((double)x + 0.5, (double)y + 0.5, (double)z + 0.5, "tile.piston.in", 0.5f, world.rand.nextFloat() * 0.15f + 0.6f); + } + } + catch (Exception e) { + System.out.println("Failed to rotate:"); + e.printStackTrace(); + } + } + } + + @Override + public TileEntity createNewTileEntity(World arg0, int arg1) { + return null; + } +} + diff --git a/src/main/java/assemblyline/common/block/ItemBlockCrate.java b/src/main/java/assemblyline/common/block/ItemBlockCrate.java new file mode 100644 index 0000000..c1f46d0 --- /dev/null +++ b/src/main/java/assemblyline/common/block/ItemBlockCrate.java @@ -0,0 +1,96 @@ +package assemblyline.common.block; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +public class ItemBlockCrate +extends ItemBlock { + public ItemBlockCrate(Block block) { + super(block); + this.setMaxStackSize(1); + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) { + return this.getUnlocalizedName() + "." + itemStack.getItemDamage(); + } + + @Override + public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { + ItemStack containingStack = ItemBlockCrate.getContainingItemStack(itemStack); + if (containingStack != null) { + par3List.add(containingStack.getDisplayName()); + par3List.add("Amount: " + containingStack.stackSize); + } else { + par3List.add("Empty"); + } + } + + @Override + public void onUpdate(ItemStack itemStack, World par2World, Entity entity, int par4, boolean par5) { + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer)entity; + ItemStack containingStack = ItemBlockCrate.getContainingItemStack(itemStack); + if (containingStack != null) { + player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 5, (int)((float)containingStack.stackSize / (float)TileEntityCrate.getMaxLimit(itemStack.getItemDamage())) * 5)); + } + } + } + + public static void setContainingItemStack(ItemStack itemStack, ItemStack containingStack) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + if (containingStack != null) { + NBTTagCompound itemTagCompound = new NBTTagCompound(); + containingStack.stackSize = Math.abs(containingStack.stackSize); + containingStack.writeToNBT(itemTagCompound); + itemStack.getTagCompound().setTag("Item", (NBTBase)itemTagCompound); + itemStack.getTagCompound().setInteger("Count", containingStack.stackSize); + } else { + itemStack.getTagCompound().setTag("Item", (NBTBase)new NBTTagCompound()); + itemStack.getTagCompound().setInteger("Count", 0); + } + } + + public static ItemStack getContainingItemStack(ItemStack itemStack) { + if (itemStack.stackTagCompound == null) { + itemStack.setTagCompound(new NBTTagCompound()); + return null; + } + NBTTagCompound itemTagCompound = itemStack.getTagCompound().getCompoundTag("Item"); + ItemStack containingStack = ItemStack.loadItemStackFromNBT((NBTTagCompound)itemTagCompound); + if (containingStack != null) { + containingStack.stackSize = itemStack.getTagCompound().getInteger("Count"); + } + return containingStack; + } + + @Override + public int getMetadata(int metadata) { + return metadata; + } + + @Override + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) { + if (super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) { + ItemStack containingItem = ItemBlockCrate.getContainingItemStack(stack); + if (world.getTileEntity(x, y, z) != null && containingItem != null && containingItem.stackSize > 0) { + TileEntityCrate tileEntity = (TileEntityCrate)world.getTileEntity(x, y, z); + tileEntity.setInventorySlotContents(0, containingItem); + } + } + return true; + } +} + diff --git a/src/main/java/assemblyline/common/block/TileEntityCrate.java b/src/main/java/assemblyline/common/block/TileEntityCrate.java new file mode 100644 index 0000000..5bcbe52 --- /dev/null +++ b/src/main/java/assemblyline/common/block/TileEntityCrate.java @@ -0,0 +1,227 @@ +package assemblyline.common.block; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import universalelectricity.prefab.implement.ITier; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public class TileEntityCrate +extends TileEntityAdvanced +implements ITier, +IInventory { + private ItemStack[] containingItems = new ItemStack[1]; + public long prevClickTime = -1000L; + + public int getMaxLimit() { + return TileEntityCrate.getMaxLimit(this.getTier()); + } + + public static int getMaxLimit(int tier) { + if (tier >= 2) { + return 16384; + } + if (tier >= 1) { + return 4096; + } + return 2048; + } + + @Override + public boolean canUpdate() { + return false; + } + + /*@Override + public void handlePacketData(INetworkManager network, int packetType, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) { + if (this.field_70331_k.isRemote) { + try { + if (dataStream.readBoolean()) { + if (this.containingItems[0] == null) { + this.containingItems[0] = new ItemStack(dataStream.readInt(), dataStream.readInt(), dataStream.readInt()); + } else { + this.containingItems[0].field_77993_c = dataStream.readInt(); + this.containingItems[0].stackSize = dataStream.readInt(); + this.containingItems[0].setItemDamage(dataStream.readInt()); + } + } else { + this.containingItems[0] = null; + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + }*/ + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + if (this.worldObj.isRemote) { + NBTTagCompound nbt = pkt.func_148857_g(); + if (nbt.getBoolean("containsItems")) { + if (containingItems[0] == null) { + containingItems[0] = new ItemStack(Item.getItemById(nbt.getShort("id")), nbt.getByte("Count"), nbt.getShort("Damage")); + } else { + containingItems[0].readFromNBT(nbt); + } + } else { + containingItems[0] = null; + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + if (this.containingItems[0] != null) { + nbt.setBoolean("containsItems", true); + containingItems[0].writeToNBT(nbt); + //return PacketManager.getPacket("AssemblyLine", this, new Object[]{true, this.containingItems[0].field_77993_c, this.containingItems[0].stackSize, this.containingItems[0].getItemDamage()}); + } else { + nbt.setBoolean("containsItems", false); + } + //return PacketManager.getPacket("AssemblyLine", this, new Object[]{false}); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, getBlockMetadata(), nbt); + } + + @Override + public ItemStack getStackInSlot(int par1) { + return this.containingItems[par1]; + } + + @Override + public ItemStack decrStackSize(int par1, int par2) { + if (this.containingItems[par1] != null) { + if (this.containingItems[par1].stackSize <= par2) { + ItemStack var3 = this.containingItems[par1]; + this.setInventorySlotContents(par1, null); + return var3; + } + ItemStack var3 = this.containingItems[par1].splitStack(par2); + if (this.containingItems[par1].stackSize == 0) { + this.containingItems[par1] = null; + } + this.setInventorySlotContents(par1, this.containingItems[par1]); + return var3; + } + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int par1) { + if (this.containingItems[par1] != null) { + ItemStack var2 = this.containingItems[par1]; + this.containingItems[par1] = null; + return var2; + } + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + if (stack != null) { + if (stack.isStackable()) { + this.containingItems[slot] = stack; + if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { + stack.stackSize = this.getInventoryStackLimit(); + } + } + } else { + this.containingItems[slot] = null; + } + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5, (double)this.yCoord + 0.5, (double)this.zCoord + 0.5) <= 64.0; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList var2 = nbt.getTagList("Items", 10); + this.containingItems = new ItemStack[this.getSizeInventory()]; + for (int var3 = 0; var3 < var2.tagCount(); ++var3) { + NBTTagCompound var4 = (NBTTagCompound)var2.getCompoundTagAt(var3); + byte var5 = var4.getByte("Slot"); + if (var5 < 0 || var5 >= this.containingItems.length) continue; + this.containingItems[var5] = ItemStack.loadItemStackFromNBT((NBTTagCompound)var4); + } + if (this.containingItems[0] != null) { + this.containingItems[0].stackSize = nbt.getInteger("Count"); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagList var2 = new NBTTagList(); + for (int var3 = 0; var3 < this.containingItems.length; ++var3) { + if (this.containingItems[var3] == null) continue; + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)var3); + this.containingItems[var3].writeToNBT(var4); + var2.appendTag((NBTBase)var4); + } + nbt.setTag("Items", (NBTBase)var2); + if (this.containingItems[0] != null) { + nbt.setInteger("Count", this.containingItems[0].stackSize); + } + } + + @Override + public int getInventoryStackLimit() { + return this.getMaxLimit(); + } + + @Override + public int getSizeInventory() { + return this.containingItems.length; + } + + @Override + public String getInventoryName() { + return "Crate"; + } + + @Override + public int getTier() { + return this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public void setTier(int tier) { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, tier, 3); + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return true; + } +} + diff --git a/src/main/java/assemblyline/common/machine/BlockBeltSorter.java b/src/main/java/assemblyline/common/machine/BlockBeltSorter.java new file mode 100644 index 0000000..8808241 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/BlockBeltSorter.java @@ -0,0 +1,23 @@ +package assemblyline.common.machine; + +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockBeltSorter +extends BlockALMachine { + public BlockBeltSorter() { + super(Material.iron); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + this.setBlockName("BeltSorter"); + } + + @Override + public TileEntity createNewTileEntity(World arg0, int arg1) { + // TODO Auto-generated method stub + return null; + } +} + diff --git a/src/main/java/assemblyline/common/machine/BlockManipulator.java b/src/main/java/assemblyline/common/machine/BlockManipulator.java new file mode 100644 index 0000000..eca2803 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/BlockManipulator.java @@ -0,0 +1,82 @@ +package assemblyline.common.machine; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.machine.imprinter.BlockImprintable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; + +public class BlockManipulator +extends BlockImprintable { + public BlockManipulator() { + super("manipulator", UniversalElectricity.machine, TabAssemblyLine.INSTANCE); + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.29f, 1.0f); + } + + public AxisAlignedBB func_71911_a_(World par1World, int par2, int par3, int par4) { + return AxisAlignedBB.getBoundingBox((double)par2, (double)par3, (double)par4, (double)par2 + 1.0, (double)par3 + 1.0, (double)par4 + 1.0); + } + + @Override + public boolean onSneakMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityManipulator) { + ((TileEntityManipulator)tileEntity).selfPulse = !((TileEntityManipulator)tileEntity).selfPulse; + } + return true; + } + + @Override + public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityManipulator) { + TileEntityManipulator manip = (TileEntityManipulator)tileEntity; + boolean manipMode = manip.isOutput(); + boolean inverted = manip.isInverted(); + if (manipMode && !inverted) { + manip.toggleInversion(); + } else if (manipMode && inverted) { + manip.toggleOutput(); + manip.toggleInversion(); + } else if (!manipMode && !inverted) { + manip.toggleInversion(); + } else { + manip.toggleOutput(); + manip.toggleInversion(); + } + } + return true; + } + + @Override + public TileEntity createNewTileEntity(World var1, int metadata) { + return new TileEntityManipulator(); + } + + @Override + @SideOnly(value=Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int damageDropped(int par1) { + return 0; + } +} + diff --git a/src/main/java/assemblyline/common/machine/BlockRejector.java b/src/main/java/assemblyline/common/machine/BlockRejector.java new file mode 100644 index 0000000..fc01770 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/BlockRejector.java @@ -0,0 +1,39 @@ +package assemblyline.common.machine; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.machine.imprinter.BlockImprintable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; + +public class BlockRejector +extends BlockImprintable { + public BlockRejector() { + super("rejector", UniversalElectricity.machine, TabAssemblyLine.INSTANCE); + } + + @Override + public TileEntity createNewTileEntity(World var1, int metadata) { + return new TileEntityRejector(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + @SideOnly(value=Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } +} + diff --git a/src/main/java/assemblyline/common/machine/TileEntityAssemblyNetwork.java b/src/main/java/assemblyline/common/machine/TileEntityAssemblyNetwork.java new file mode 100644 index 0000000..58cf748 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/TileEntityAssemblyNetwork.java @@ -0,0 +1,73 @@ +package assemblyline.common.machine; + +import assemblyline.common.AssemblyLine; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.electricity.ElectricityPack; +import universalelectricity.prefab.tile.TileEntityElectricityRunnable; + +public abstract class TileEntityAssemblyNetwork +extends TileEntityElectricityRunnable { + public int powerTransferRange = 0; + + public boolean isRunning() { + return AssemblyLine.REQUIRE_NO_POWER || this.powerTransferRange > 0 || this.wattsReceived > this.getRequest().getWatts(); + } + + public void updatePowerTransferRange() { + int maximumTransferRange = 0; + for (int i = 0; i < 6; ++i) { + ForgeDirection direction = ForgeDirection.getOrientation((int)i); + TileEntity tileEntity = this.worldObj.getTileEntity(this.xCoord + direction.offsetX, this.yCoord + direction.offsetY, this.zCoord + direction.offsetZ); + if (tileEntity == null || !(tileEntity instanceof TileEntityAssemblyNetwork)) continue; + TileEntityAssemblyNetwork assemblyNetwork = (TileEntityAssemblyNetwork)tileEntity; + if (assemblyNetwork.powerTransferRange <= maximumTransferRange) continue; + maximumTransferRange = assemblyNetwork.powerTransferRange; + } + this.powerTransferRange = Math.max(maximumTransferRange - 1, 0); + } + + @Override + public void updateEntity() { + super.updateEntity(); + this.onUpdate(); + if (this.ticks % 10L == 0L) { + if (this.wattsReceived >= this.getRequest().getWatts()) { + this.wattsReceived -= this.getRequest().getWatts(); + this.powerTransferRange = this.getMaxTransferRange(); + } else { + this.powerTransferRange = 0; + this.updatePowerTransferRange(); + } + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + + protected void onUpdate() { + } + + @Override + public ElectricityPack getRequest() { + return new ElectricityPack(1.0, this.getVoltage()); + } + + protected int getMaxTransferRange() { + return 20; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("wattsReceived", this.wattsReceived); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.wattsReceived = nbt.getDouble("wattsReceived"); + } +} + diff --git a/src/main/java/assemblyline/common/machine/TileEntityManipulator.java b/src/main/java/assemblyline/common/machine/TileEntityManipulator.java new file mode 100644 index 0000000..9ff3c80 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/TileEntityManipulator.java @@ -0,0 +1,312 @@ +package assemblyline.common.machine; + +import assemblyline.api.IManipulator; +import assemblyline.common.block.BlockCrate; +import assemblyline.common.block.TileEntityCrate; +import assemblyline.common.machine.imprinter.TileEntityFilterable; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.implement.IRedstoneReceptor; +import universalelectricity.prefab.implement.IRotatable; +import universalelectricity.prefab.multiblock.TileEntityMulti; + +public class TileEntityManipulator +extends TileEntityFilterable +implements IRotatable, +IRedstoneReceptor, +IManipulator { + public boolean selfPulse = false; + private boolean isOutput = false; + private boolean isRedstonePowered = false; + + public boolean isOutput() { + return this.isOutput; + } + + public void setOutput(boolean isOutput) { + this.isOutput = isOutput; + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + public void toggleOutput() { + this.setOutput(!this.isOutput()); + } + + @Override + protected void onUpdate() { + if (!this.worldObj.isRemote) { + if (this.ticks % 20L == 0L) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + if (!this.isDisabled() && this.isRunning()) { + if (!this.isOutput) { + this.inject(); + } else { + if (this.selfPulse && this.ticks % 10L == 0L) { + this.isRedstonePowered = true; + } + if (this.isRedstonePowered) { + this.eject(); + } + } + } + } + } + + @Override + public void inject() { + Vector3 inputPosition = new Vector3(this); + Vector3 outputUp = new Vector3(this); + outputUp.modifyPositionFromSide(ForgeDirection.UP); + Vector3 outputDown = new Vector3(this); + outputDown.modifyPositionFromSide(ForgeDirection.DOWN); + Vector3 outputPosition = new Vector3(this); + outputPosition.modifyPositionFromSide(this.getDirection().getOpposite()); + if (outputPosition.getTileEntity((IBlockAccess)this.worldObj) instanceof TileEntityManipulator && ((TileEntityManipulator)outputPosition.getTileEntity((IBlockAccess)this.worldObj)).getDirection() == this.getDirection().getOpposite()) { + return; + } + AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox((double)inputPosition.x, (double)inputPosition.y, (double)inputPosition.z, (double)(inputPosition.x + 1.0), (double)(inputPosition.y + 1.0), (double)(inputPosition.z + 1.0)); + List itemsInBound = this.worldObj.getEntitiesWithinAABB(EntityItem.class, bounds); + for (EntityItem entity : itemsInBound) { + if (entity.isDead) continue; + ItemStack remainingStack = entity.getEntityItem().copy(); + if (this.getFilter() != null && !this.isFiltering(remainingStack)) continue; + if ((remainingStack = this.tryPlaceInPosition(remainingStack, outputUp, ForgeDirection.DOWN)) != null) { + remainingStack = this.tryPlaceInPosition(remainingStack, outputDown, ForgeDirection.UP); + } + if (remainingStack != null) { + remainingStack = this.tryPlaceInPosition(remainingStack, outputPosition, this.getDirection().getOpposite()); + } + if (remainingStack != null && remainingStack.stackSize > 0) { + this.throwItem(outputPosition, remainingStack); + } + entity.setDead(); + } + } + + @Override + public void eject() { + this.onPowerOff(); + Vector3 inputUp = new Vector3(this); + inputUp.modifyPositionFromSide(ForgeDirection.UP); + Vector3 inputDown = new Vector3(this); + inputDown.modifyPositionFromSide(ForgeDirection.DOWN); + Vector3 inputPosition = new Vector3(this); + inputPosition.modifyPositionFromSide(this.getDirection().getOpposite()); + Vector3 outputPosition = new Vector3(this); + outputPosition.modifyPositionFromSide(this.getDirection()); + ItemStack itemStack = this.tryGrabFromPosition(inputUp, ForgeDirection.DOWN); + if (itemStack == null) { + itemStack = this.tryGrabFromPosition(inputDown, ForgeDirection.UP); + } + if (itemStack == null) { + itemStack = this.tryGrabFromPosition(inputPosition, this.getDirection().getOpposite()); + } + if (itemStack != null && itemStack.stackSize > 0) { + this.throwItem(outputPosition, itemStack); + } + } + + public void throwItem(Vector3 outputPosition, ItemStack items) { + if (!this.worldObj.isRemote) { + EntityItem entityItem = new EntityItem(this.worldObj, outputPosition.x + 0.5, outputPosition.y + 0.8, outputPosition.z + 0.5, items); + entityItem.motionX = 0.0; + entityItem.motionZ = 0.0; + entityItem.motionY /= 5.0; + entityItem.delayBeforeCanPickup = 20; + this.worldObj.spawnEntityInWorld((Entity)entityItem); + } + } + + private ItemStack tryPlaceInPosition(ItemStack itemStack, Vector3 position, ForgeDirection direction) { + TileEntity tileEntity = position.getTileEntity((IBlockAccess)this.worldObj); + if (tileEntity != null && itemStack != null) { + if (tileEntity instanceof TileEntityMulti) { + Vector3 mainBlockPosition = ((TileEntityMulti)tileEntity).mainBlockPosition; + if (mainBlockPosition != null && !(mainBlockPosition.getTileEntity((IBlockAccess)this.worldObj) instanceof TileEntityMulti)) { + return this.tryPlaceInPosition(itemStack, mainBlockPosition, direction); + } + } else if (tileEntity instanceof TileEntityChest) { + TileEntityChest[] chests = new TileEntityChest[]{(TileEntityChest)tileEntity, null}; + for (int i = 2; i < 6; ++i) { + ForgeDirection searchDirection = ForgeDirection.getOrientation((int)i); + Vector3 searchPosition = position.clone(); + searchPosition.modifyPositionFromSide(searchDirection); + if (searchPosition.getTileEntity((IBlockAccess)this.worldObj) == null || searchPosition.getTileEntity((IBlockAccess)this.worldObj).getClass() != chests[0].getClass()) continue; + chests[1] = (TileEntityChest)searchPosition.getTileEntity((IBlockAccess)this.worldObj); + break; + } + for (TileEntityChest chest : chests) { + if (chest == null) continue; + for (int i = 0; i < chest.getSizeInventory(); ++i) { + if ((itemStack = this.addStackToInventory(i, (IInventory)chest, itemStack)) != null) continue; + return null; + } + } + } else { + if (tileEntity instanceof TileEntityCrate) { + return BlockCrate.putIn((TileEntityCrate)tileEntity, itemStack); + } + if (tileEntity instanceof ISidedInventory) { + int startIndex; + ISidedInventory inventory = (ISidedInventory)tileEntity; + for (int i : inventory.getAccessibleSlotsFromSide(direction.ordinal())) { + if ((itemStack = this.addStackToInventory(i, (IInventory)inventory, itemStack)) != null) continue; + return null; + } + } else if (tileEntity instanceof IInventory) { + IInventory inventory = (IInventory)tileEntity; + for (int i = 0; i < inventory.getSizeInventory(); ++i) { + if ((itemStack = this.addStackToInventory(i, inventory, itemStack)) != null) continue; + return null; + } + } + } + } + if (itemStack.stackSize <= 0) { + return null; + } + return itemStack; + } + + public ItemStack addStackToInventory(int slotIndex, IInventory inventory, ItemStack itemStack) { + if (inventory.getSizeInventory() > slotIndex) { + ItemStack stackInInventory = inventory.getStackInSlot(slotIndex); + if (stackInInventory == null) { + inventory.setInventorySlotContents(slotIndex, itemStack); + if (inventory.getStackInSlot(slotIndex) == null) { + return itemStack; + } + return null; + } + if (stackInInventory.isItemEqual(itemStack) && stackInInventory.isStackable()) { + stackInInventory = stackInInventory.copy(); + int stackLim = Math.min(inventory.getInventoryStackLimit(), itemStack.getMaxStackSize()); + int rejectedAmount = Math.max(stackInInventory.stackSize + itemStack.stackSize - stackLim, 0); + stackInInventory.stackSize = Math.min(Math.max(stackInInventory.stackSize + itemStack.stackSize - rejectedAmount, 0), inventory.getInventoryStackLimit()); + itemStack.stackSize = rejectedAmount; + inventory.setInventorySlotContents(slotIndex, stackInInventory); + } + } + if (itemStack.stackSize <= 0) { + return null; + } + return itemStack; + } + + private ItemStack tryGrabFromPosition(Vector3 position, ForgeDirection direction) { + ItemStack returnStack; + block6: { + TileEntity tileEntity; + block9: { + int startIndex; + block8: { + block7: { + returnStack = null; + tileEntity = position.getTileEntity((IBlockAccess)this.worldObj); + if (tileEntity == null) break block6; + if (!(tileEntity instanceof TileEntityMulti)) break block7; + Vector3 mainBlockPosition = ((TileEntityMulti)tileEntity).mainBlockPosition; + if (mainBlockPosition != null && !(mainBlockPosition.getTileEntity((IBlockAccess)this.worldObj) instanceof TileEntityMulti)) { + return this.tryGrabFromPosition(mainBlockPosition, direction); + } + break block6; + } + if (!(tileEntity instanceof TileEntityChest)) break block8; + TileEntityChest[] chests = new TileEntityChest[]{(TileEntityChest)tileEntity, null}; + for (int i = 2; i < 6; ++i) { + ForgeDirection searchDirection = ForgeDirection.getOrientation((int)i); + Vector3 searchPosition = position.clone(); + searchPosition.modifyPositionFromSide(searchDirection); + if (searchPosition.getTileEntity((IBlockAccess)this.worldObj) == null || searchPosition.getTileEntity((IBlockAccess)this.worldObj).getClass() != chests[0].getClass()) continue; + chests[1] = (TileEntityChest)searchPosition.getTileEntity((IBlockAccess)this.worldObj); + break; + } + for (TileEntityChest chest : chests) { + if (chest == null) continue; + for (int i = 0; i < chest.getSizeInventory(); ++i) { + ItemStack itemStack = this.removeStackFromInventory(i, (IInventory)chest); + if (itemStack == null) continue; + returnStack = itemStack; + break block6; + } + } + break block6; + } + if (!(tileEntity instanceof ISidedInventory)) break block9; + ISidedInventory inventory = (ISidedInventory)tileEntity; + for (int i : inventory.getAccessibleSlotsFromSide(direction.ordinal())) { + ItemStack itemStack = this.removeStackFromInventory(i, (IInventory)inventory); + if (itemStack == null) continue; + returnStack = itemStack; + break block6; + } + break block6; + } + if (!(tileEntity instanceof IInventory)) break block6; + IInventory inventory = (IInventory)tileEntity; + for (int i = 0; i < inventory.getSizeInventory(); ++i) { + ItemStack itemStack = this.removeStackFromInventory(i, inventory); + if (itemStack == null) continue; + returnStack = itemStack; + break; + } + } + return returnStack; + } + + public ItemStack removeStackFromInventory(int slotIndex, IInventory inventory) { + if (inventory.getStackInSlot(slotIndex) != null) { + ItemStack itemStack = inventory.getStackInSlot(slotIndex).copy(); + if (this.getFilter() == null || this.isFiltering(itemStack)) { + itemStack.stackSize = 1; + inventory.decrStackSize(slotIndex, 1); + return itemStack; + } + } + return null; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.isOutput = nbt.getBoolean("isOutput"); + this.selfPulse = nbt.getBoolean("selfpulse"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("isOutput", this.isOutput); + nbt.setBoolean("selfpulse", this.selfPulse); + } + + @Override + public void onPowerOn() { + this.isRedstonePowered = true; + } + + @Override + public void onPowerOff() { + this.isRedstonePowered = false; + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return dir != this.getDirection(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/TileEntityRejector.java b/src/main/java/assemblyline/common/machine/TileEntityRejector.java new file mode 100644 index 0000000..1ad411f --- /dev/null +++ b/src/main/java/assemblyline/common/machine/TileEntityRejector.java @@ -0,0 +1,85 @@ +package assemblyline.common.machine; + +import assemblyline.common.machine.imprinter.TileEntityFilterable; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; + +public class TileEntityRejector +extends TileEntityFilterable { + public boolean firePiston = false; + + @Override + protected int getMaxTransferRange() { + return 20; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (this.ticks % 5L == 0L && !this.isDisabled()) { + int metadata = this.getBlockMetadata(); + this.firePiston = false; + Vector3 searchPosition = new Vector3(this); + searchPosition.modifyPositionFromSide(this.getDirection()); + TileEntity tileEntity = searchPosition.getTileEntity((IBlockAccess)this.worldObj); + try { + boolean flag = false; + if (this.isRunning()) { + AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox((double)searchPosition.x, (double)searchPosition.y, (double)searchPosition.z, (double)(searchPosition.x + 1.0), (double)(searchPosition.y + 1.0), (double)(searchPosition.z + 1.0)); + List entitiesInFront = this.worldObj.getEntitiesWithinAABB(Entity.class, bounds); + for (Entity entity : entitiesInFront) { + if (!this.canEntityBeThrow(entity)) continue; + this.throwItem(this.getDirection(), entity); + flag = true; + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void throwItem(ForgeDirection side, Entity entity) { + this.firePiston = true; + entity.motionX = (double)side.offsetX * 0.2; + entity.motionY += 0.10000000298023223; + entity.motionZ = (double)side.offsetZ * 0.2; + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public boolean canEntityBeThrow(Entity entity) { + if (entity instanceof EntityItem) { + EntityItem entityItem = (EntityItem)entity; + ItemStack itemStack = entityItem.getEntityItem(); + return this.isFiltering(itemStack); + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.firePiston = nbt.getBoolean("piston"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("piston", this.firePiston); + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return dir != this.getDirection(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/armbot/BlockArmbot.java b/src/main/java/assemblyline/common/machine/armbot/BlockArmbot.java new file mode 100644 index 0000000..183afd3 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/armbot/BlockArmbot.java @@ -0,0 +1,79 @@ +package assemblyline.common.machine.armbot; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import universalelectricity.core.UniversalElectricity; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class BlockArmbot +extends BlockALMachine { + public BlockArmbot() { + super(UniversalElectricity.machine); + this.setBlockName("armbot"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof IMultiBlock) { + ((IMultiBlock)tileEntity).onCreate(new Vector3(x, y, z)); + } + } + + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof IMultiBlock) { + return ((IMultiBlock)tileEntity).onActivated(player); + } + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof IMultiBlock) { + ((IMultiBlock)tileEntity).onDestroy(tileEntity); + } + this.dropBlockAsItem(world, x, y, z, new ItemStack(this)); + super.breakBlock(world, x, y, z, par5, par6); + } + + @Override + public int quantityDropped(Random par1Random) { + return 0; + } + + @Override + public TileEntity createNewTileEntity(World var1, int meta) { + return new TileEntityArmbot(); + } + + @SideOnly(value=Side.CLIENT) + @Override + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean canProvidePower() { + return true; + } +} + diff --git a/src/main/java/assemblyline/common/machine/armbot/TileEntityArmbot.java b/src/main/java/assemblyline/common/machine/armbot/TileEntityArmbot.java new file mode 100644 index 0000000..843387f --- /dev/null +++ b/src/main/java/assemblyline/common/machine/armbot/TileEntityArmbot.java @@ -0,0 +1,684 @@ +package assemblyline.common.machine.armbot; + +import assemblyline.api.IArmbot; +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.TileEntityAssemblyNetwork; +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.CommandDrop; +import assemblyline.common.machine.command.CommandFire; +import assemblyline.common.machine.command.CommandGrab; +import assemblyline.common.machine.command.CommandManager; +import assemblyline.common.machine.command.CommandReturn; +import assemblyline.common.machine.command.CommandRotateBy; +import assemblyline.common.machine.command.CommandRotateTo; +import assemblyline.common.machine.command.CommandUse; +import assemblyline.common.machine.encoder.ItemDisk; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; +import dark.library.helpers.ItemFindingHelper; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.block.IElectricityStorage; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.multiblock.IMultiBlock; + +public class TileEntityArmbot +extends TileEntityAssemblyNetwork +implements IMultiBlock, +IInventory, +IElectricityStorage, +IArmbot, +IPeripheral { + private final CommandManager commandManager = new CommandManager(); + private static final int PACKET_COMMANDS = 128; + protected ItemStack disk = null; + public final double WATT_REQUEST = 20.0; + public double wattsReceived = 0.0; + private int playerUsing = 0; + private int computersAttached = 0; + private List connectedComputers = new ArrayList(); + public float rotationPitch = 0.0f; + public float rotationYaw = 0.0f; + public float renderPitch = 0.0f; + public float renderYaw = 0.0f; + private int ticksSincePower = 0; + public final float ROTATION_SPEED = 1.3f; + private String displayText = ""; + public boolean isProvidingPower = false; + private final List grabbedEntities = new ArrayList<>(); + private final List grabbedItems = new ArrayList(); + public EntityItem renderEntityItem = null; + + @Override + public void onUpdate() { + Vector3 handPosition = this.getHandPosition(); + for (Entity entity : this.grabbedEntities) { + if (entity == null) continue; + entity.setPosition(handPosition.x, handPosition.y, handPosition.z); + entity.motionX = 0.0; + entity.motionY = 0.0; + entity.motionZ = 0.0; + if (!(entity instanceof EntityItem)) continue; + ((EntityItem)entity).delayBeforeCanPickup = 20; + ((EntityItem)entity).age = 0; + } + if (this.isRunning()) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER && this.disk == null && this.computersAttached == 0) { + this.commandManager.clear(); + if (this.grabbedEntities.size() > 0 || this.grabbedItems.size() > 0) { + this.addCommand(CommandDrop.class); + } else if (!this.commandManager.hasTasks() && ((double)Math.abs(this.rotationYaw - 0.0f) > 0.01 || (double)Math.abs(this.rotationPitch - 0.0f) > 0.01)) { + this.addCommand(CommandReturn.class); + } + this.commandManager.setCurrentTask(0); + } + if (!this.worldObj.isRemote) { + this.commandManager.onUpdate(); + } + this.ticksSincePower = 0; + } else { + ++this.ticksSincePower; + } + if (!this.worldObj.isRemote) { + if (!this.commandManager.hasTasks()) { + this.displayText = ""; + } else { + try { + Command curCommand = (Command)this.commandManager.getCommands().get(this.commandManager.getCurrentTask()); + if (curCommand != null) { + this.displayText = curCommand.toString(); + } + } + catch (Exception ex) { + // empty catch block + } + } + } + if (Math.abs(this.renderYaw - this.rotationYaw) > 0.001f) { + float speedYaw; + if (this.renderYaw > this.rotationYaw) { + if (Math.abs(this.renderYaw - this.rotationYaw) >= 180.0f) { + this.getClass(); + speedYaw = 1.3f; + } else { + this.getClass(); + speedYaw = -1.3f; + } + } else if (Math.abs(this.renderYaw - this.rotationYaw) >= 180.0f) { + this.getClass(); + speedYaw = -1.3f; + } else { + this.getClass(); + speedYaw = 1.3f; + } + this.renderYaw += speedYaw; + while (this.renderYaw < 0.0f) { + this.renderYaw += 360.0f; + } + while (this.renderYaw > 360.0f) { + this.renderYaw -= 360.0f; + } + if (this.ticks % 5L == 0L && FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + this.worldObj.playSound((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, "assemblyline:conveyor", 0.8f, 1.7f, true); + } + float f = Math.abs(this.renderYaw - this.rotationYaw); + this.getClass(); + if (f < 1.3f + 0.1f) { + this.renderYaw = this.rotationYaw; + } + for (Entity e : (List)this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)(this.yCoord + 2), (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 3), (double)(this.zCoord + 1)))) { + e.rotationYaw = this.renderYaw; + } + } + if (Math.abs(this.renderPitch - this.rotationPitch) > 0.001f) { + float speedPitch; + if (this.renderPitch > this.rotationPitch) { + this.getClass(); + speedPitch = -1.3f; + } else { + this.getClass(); + speedPitch = 1.3f; + } + this.renderPitch += speedPitch; + while (this.renderPitch < 0.0f) { + this.renderPitch += 60.0f; + } + while (this.renderPitch > 60.0f) { + this.renderPitch -= 60.0f; + } + if (this.ticks % 4L == 0L && FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + this.worldObj.playSound((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, "assemblyline:conveyor", 2.0f, 2.5f, true); + } + float f = Math.abs(this.renderPitch - this.rotationPitch); + this.getClass(); + if (f < 1.3f + 0.1f) { + this.renderPitch = this.rotationPitch; + } + for (Entity e : (List)this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)(this.yCoord + 2), (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 3), (double)(this.zCoord + 1)))) { + e.rotationPitch = this.renderPitch; + } + } + while (this.rotationYaw < 0.0f) { + this.rotationYaw += 360.0f; + } + while (this.rotationYaw > 360.0f) { + this.rotationYaw -= 360.0f; + } + while (this.rotationPitch < 0.0f) { + this.rotationPitch += 60.0f; + } + while (this.rotationPitch > 60.0f) { + this.rotationPitch -= 60.0f; + } + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER && this.ticks % 20L == 0L) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + public Command getCurrentCommand() { + if (this.commandManager.hasTasks() && this.commandManager.getCurrentTask() >= 0 && this.commandManager.getCurrentTask() < this.commandManager.getCommands().size()) { + return (Command)this.commandManager.getCommands().get(this.commandManager.getCurrentTask()); + } + return null; + } + + public Vector3 getHandPosition() { + Vector3 position = new Vector3(this); + position.add(0.5); + position.add(this.getDeltaHandPosition()); + return position; + } + + public Vector3 getDeltaHandPosition() { + double distance = 1.0; + Vector3 delta = new Vector3(); + delta.y = Math.sin(Math.toRadians(this.renderPitch)) * distance * 2.0; + double dH = Math.cos(Math.toRadians(this.renderPitch)) * distance; + delta.x = Math.sin(Math.toRadians(-this.renderYaw)) * dH; + delta.z = Math.cos(Math.toRadians(-this.renderYaw)) * dH; + return delta; + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound data = new NBTTagCompound(); + this.writeToNBT(data); + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setTag("data", data); + nbt.setInteger("transferRange", this.powerTransferRange); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, getBlockMetadata(), nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + if (this.worldObj.isRemote) { + NBTTagCompound nbt = pkt.func_148857_g(); + this.powerTransferRange = nbt.getInteger("transferRange"); + NBTTagCompound data = nbt.getCompoundTag("data"); + this.readFromNBT(data); + } + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public String getInventoryName() { + return TranslationHelper.getLocal("tile.armbot.name"); + } + + @Override + public ItemStack getStackInSlot(int par1) { + return this.disk; + } + + @Override + public ItemStack decrStackSize(int par1, int par2) { + if (this.disk != null) { + if (this.disk.stackSize <= par2) { + ItemStack var3 = this.disk; + this.disk = null; + return var3; + } + ItemStack var3 = this.disk.splitStack(par2); + if (this.disk.stackSize == 0) { + this.disk = null; + } + return var3; + } + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int par1) { + if (this.disk != null) { + ItemStack var2 = this.disk; + this.disk = null; + return var2; + } + return null; + } + + @Override + public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { + this.disk = par2ItemStack; + this.markDirty(); + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5, (double)this.yCoord + 0.5, (double)this.zCoord + 0.5) <= 64.0; + } + + @Override + public void openInventory() { + ++this.playerUsing; + } + + @Override + public void closeInventory() { + --this.playerUsing; + } + + public String getCommandDisplayText() { + return this.displayText; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagCompound diskNBT = nbt.getCompoundTag("disk"); + this.disk = diskNBT != null ? ItemStack.loadItemStackFromNBT((NBTTagCompound)diskNBT) : null; + this.rotationYaw = nbt.getFloat("yaw"); + this.rotationPitch = nbt.getFloat("pitch"); + if (this.worldObj != null && this.worldObj.isRemote) { + this.displayText = nbt.getString("cmdText"); + } + this.commandManager.setCurrentTask(nbt.getInteger("curTask")); + NBTTagList entities = nbt.getTagList("entities", 10); + this.grabbedEntities.clear(); + for (int i = 0; i < entities.tagCount(); ++i) { + NBTTagCompound entityTag = (NBTTagCompound)entities.getCompoundTagAt(i); + if (entityTag == null) continue; + Entity entity = EntityList.createEntityFromNBT((NBTTagCompound)entityTag, (World)this.worldObj); + this.grabbedEntities.add(entity); + } + NBTTagList items = nbt.getTagList("items", 10); + this.grabbedItems.clear(); + for (int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound itemTag = (NBTTagCompound)items.getCompoundTagAt(i); + if (itemTag == null) continue; + ItemStack item = ItemStack.loadItemStackFromNBT((NBTTagCompound)itemTag); + this.grabbedItems.add(item); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagCompound diskNBT = new NBTTagCompound(); + if (this.disk != null) { + this.disk.writeToNBT(diskNBT); + } + nbt.setTag("disk", (NBTBase)diskNBT); + nbt.setFloat("yaw", this.rotationYaw); + nbt.setFloat("pitch", this.rotationPitch); + nbt.setString("cmdText", this.displayText); + nbt.setInteger("curTask", this.commandManager.getCurrentTask()); + NBTTagList entities = new NBTTagList(); + for (Entity entity : this.grabbedEntities) { + if (entity == null) continue; + NBTTagCompound entityNBT = new NBTTagCompound(); + entity.writeToNBT(entityNBT); + entity.writeToNBTOptional(entityNBT); + entities.appendTag((NBTBase)entityNBT); + } + nbt.setTag("entities", (NBTBase)entities); + NBTTagList items = new NBTTagList(); + for (ItemStack itemStack : this.grabbedItems) { + if (itemStack == null) continue; + NBTTagCompound entityNBT = new NBTTagCompound(); + itemStack.writeToNBT(entityNBT); + items.appendTag((NBTBase)entityNBT); + } + nbt.setTag("items", (NBTBase)items); + } + + @Override + public double getJoules() { + return this.wattsReceived; + } + + @Override + public void setJoules(double joules) { + this.wattsReceived = joules; + } + + @Override + public double getMaxJoules() { + return 1000.0; + } + + @Override + public boolean onActivated(EntityPlayer player) { + ItemStack containingStack = this.getStackInSlot(0); + if (containingStack != null) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + EntityItem dropStack = new EntityItem(this.worldObj, player.posX, player.posY, player.posZ, containingStack); + dropStack.delayBeforeCanPickup = 0; + this.worldObj.spawnEntityInWorld((Entity)dropStack); + } + this.setInventorySlotContents(0, null); + return true; + } + if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemDisk) { + this.setInventorySlotContents(0, player.getCurrentEquippedItem()); + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + return true; + } + return false; + } + + public void markDirty() { + this.commandManager.clear(); + if (this.disk != null) { + List commands = ItemDisk.getCommands(this.disk); + for (String commandString : commands) { + String commandName = commandString.split(" ")[0]; + Class command = Command.getCommand(commandName); + if (command == null) continue; + ArrayList commandParameters = new ArrayList(); + for (String param : commandString.split(" ")) { + if (param.equals(commandName)) continue; + commandParameters.add(param); + } + this.addCommand(command, commandParameters.toArray(new String[0])); + } + } else { + this.addCommand(Command.getCommand("DROP")); + this.addCommand(Command.getCommand("RETURN")); + } + } + + public void addCommand(Class command) { + this.commandManager.addCommand(this, command); + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + public void addCommand(Class command, String[] parameters) { + this.commandManager.addCommand(this, command, parameters); + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public void onCreate(Vector3 placedPosition) { + AssemblyLine.blockMulti.makeFakeBlock(this.worldObj, Vector3.add(placedPosition, new Vector3(0.0, 1.0, 0.0)), placedPosition); + } + + @Override + public void onDestroy(TileEntity callingBlock) { + this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.air, 0, 3); + this.worldObj.setBlock(this.xCoord, this.yCoord + 1, this.zCoord, Blocks.air, 0, 3); + } + + @Override + public String getType() { + return "ArmBot"; + } + + @Override + public String[] getMethodNames() { + return new String[]{"rotateBy", "rotateTo", "grab", "drop", "reset", "isWorking", "touchingEntity", "use", "fire", "return", "clear", "isHolding"}; + } + + @Override + public Object[] callMethod( IComputerAccess computer, ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException { + switch (method) { + case 0: { + if (arguments.length > 0) { + try { + double yaw = (Double)arguments[0]; + double pitch = (Double)arguments[1]; + this.addCommand(CommandRotateBy.class, new String[]{Double.toString(yaw), Double.toString(pitch)}); + break; + } + catch (Exception ex) { + ex.printStackTrace(); + throw new IllegalArgumentException("expected number"); + } + } + throw new IllegalArgumentException("expected number"); + } + case 1: { + if (arguments.length > 0) { + try { + double yaw = (Double)arguments[0]; + double pitch = (Double)arguments[1]; + this.addCommand(CommandRotateTo.class, new String[]{Double.toString(yaw), Double.toString(pitch)}); + break; + } + catch (Exception ex) { + ex.printStackTrace(); + throw new IllegalArgumentException("expected number"); + } + } + throw new IllegalArgumentException("expected number"); + } + case 2: { + this.addCommand(CommandGrab.class); + break; + } + case 3: { + this.addCommand(CommandDrop.class); + break; + } + case 4: { + this.commandManager.clear(); + this.addCommand(CommandReturn.class); + break; + } + case 5: { + return new Object[]{this.commandManager.hasTasks()}; + } + case 6: { + Vector3 serachPosition = this.getHandPosition(); + List found = this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox((double)(serachPosition.x - 0.5), (double)(serachPosition.y - 0.5), (double)(serachPosition.z - 0.5), (double)(serachPosition.x + 0.5), (double)(serachPosition.y + 0.5), (double)(serachPosition.z + 0.5))); + if (found != null && found.size() > 0) { + for (int i = 0; i < found.size(); ++i) { + if (found.get(i) == null || found.get(i) instanceof EntityPlayer || ((Entity)found.get((int)i)).ridingEntity != null) continue; + return new Object[]{true}; + } + } + return new Object[]{false}; + } + case 7: { + if (arguments.length > 0) { + try { + int times = (Integer)arguments[0]; + this.addCommand(CommandUse.class, new String[]{Integer.toString(times)}); + break; + } + catch (Exception ex) { + ex.printStackTrace(); + throw new IllegalArgumentException("expected number"); + } + } + this.addCommand(CommandUse.class); + break; + } + case 8: { + if (arguments.length > 0) { + try { + float strength = (float)((Double)arguments[0]).doubleValue(); + this.addCommand(CommandFire.class, new String[]{Float.toString(strength)}); + break; + } + catch (Exception ex) { + ex.printStackTrace(); + throw new IllegalArgumentException("expected number"); + } + } + this.addCommand(CommandFire.class); + break; + } + case 9: { + this.addCommand(CommandReturn.class); + break; + } + case 10: { + this.commandManager.clear(); + break; + } + case 11: { + return new Object[]{this.grabbedEntities.size() > 0}; + } + } + return null; + } + + //TODO: WTF + //@Override + public boolean canAttachToSide(int side) { + return side != ForgeDirection.UP.ordinal(); + } + + @Override + public void attach(IComputerAccess computer) { + ++this.computersAttached; + List list = this.connectedComputers; + synchronized (list) { + this.connectedComputers.add(computer); + } + } + + @Override + public void detach(IComputerAccess computer) { + --this.computersAttached; + List list = this.connectedComputers; + synchronized (list) { + this.connectedComputers.remove(computer); + } + } + + @Override + public List getGrabbedEntities() { + return this.grabbedEntities; + } + + @Override + public List getGrabbedItems() { + return this.grabbedItems; + } + + @Override + public void grabEntity(Entity entity) { + if (entity instanceof EntityItem) { + this.grabItem(((EntityItem)entity).getEntityItem()); + entity.setDead(); + } else { + this.grabbedEntities.add(entity); + } + } + + @Override + public void grabItem(ItemStack itemStack) { + this.grabbedItems.add(itemStack); + } + + @Override + public void dropEntity(Entity entity) { + this.grabbedEntities.remove((Object)entity); + } + + @Override + public void dropItem(ItemStack itemStack) { + Vector3 handPosition = this.getHandPosition(); + this.worldObj.spawnEntityInWorld((Entity)new EntityItem(this.worldObj, handPosition.x, handPosition.y, handPosition.z, itemStack)); + this.grabbedItems.remove((Object)itemStack); + } + + @Override + public void dropAll() { + Vector3 handPosition = this.getHandPosition(); + Iterator it = this.grabbedItems.iterator(); + while (it.hasNext()) { + ItemFindingHelper.dropItemStackExact(this.worldObj, handPosition.x, handPosition.y, handPosition.z, (ItemStack)it.next()); + } + this.grabbedEntities.clear(); + this.grabbedItems.clear(); + } + + public boolean isProvidingPowerSide(ForgeDirection dir) { + return this.isProvidingPower && dir.getOpposite() == this.getFacingDirectionFromAngle(); + } + + public ForgeDirection getFacingDirectionFromAngle() { + float angle = MathHelper.wrapAngleTo180_float((float)this.rotationYaw); + if (angle >= -45.0f && angle <= 45.0f) { + return ForgeDirection.SOUTH; + } + if (angle >= 45.0f && angle <= 135.0f) { + return ForgeDirection.WEST; + } + if (angle >= 135.0f && angle <= -135.0f) { + return ForgeDirection.NORTH; + } + return ForgeDirection.EAST; + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return direction == ForgeDirection.DOWN; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return false; + } + + @Override + public boolean equals(IPeripheral other) { + return super.equals(other); + } +} + diff --git a/src/main/java/assemblyline/common/machine/belt/BlockConveyorBelt.java b/src/main/java/assemblyline/common/machine/belt/BlockConveyorBelt.java new file mode 100644 index 0000000..2f1ad67 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/belt/BlockConveyorBelt.java @@ -0,0 +1,257 @@ +package assemblyline.common.machine.belt; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; + +public class BlockConveyorBelt +extends BlockALMachine { + public BlockConveyorBelt() { + super(UniversalElectricity.machine); + this.setBlockName("conveyorBelt"); + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.3f, 1.0f); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + if (world.getTileEntity(x, y, z) instanceof TileEntityConveyorBelt) { + TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt)world.getTileEntity(x, y, z); + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.96f, 1.0f); + return; + } + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { + this.setBlockBounds(0.0f, 0.68f, 0.0f, 1.0f, 0.96f, 1.0f); + return; + } + } + this.setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.3f, 1.0f); + } + + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + TileEntity t = world.getTileEntity(x, y, z); + if (t != null && t instanceof TileEntityConveyorBelt) { + TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt)t; + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { + return AxisAlignedBB.getBoundingBox((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + 1.0, (double)y + 1.0, (double)z + 1.0); + } + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { + return AxisAlignedBB.getBoundingBox((double)x + this.minX, (double)y + (double)0.68f, (double)z + this.minZ, (double)x + this.maxX, (double)y + (double)0.98f, (double)z + this.maxZ); + } + } + return AxisAlignedBB.getBoundingBox((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + this.maxX, (double)y + this.maxY, (double)z + this.maxZ); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) { + AxisAlignedBB newBounds; + TileEntity t = world.getTileEntity(x, y, z); + if (t != null && t instanceof TileEntityConveyorBelt) { + TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt)t; + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP || tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { + AxisAlignedBB boundBottom = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)y + 0.3, (double)(z + 1)); + AxisAlignedBB boundTop = null; + ForgeDirection direction = tileEntity.getDirection(); + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.UP) { + if (direction.offsetX > 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)((float)x + (float)direction.offsetX / 2.0f), (double)y, (double)z, (double)(x + 1), (double)y + 0.8, (double)(z + 1)); + } else if (direction.offsetX < 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)((float)x + (float)direction.offsetX / -2.0f), (double)y + 0.8, (double)(z + 1)); + } else if (direction.offsetZ > 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)((float)z + (float)direction.offsetZ / 2.0f), (double)(x + 1), (double)y + 0.8, (double)(z + 1)); + } else if (direction.offsetZ < 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)y + 0.8, (double)((float)z + (float)direction.offsetZ / -2.0f)); + } + } else if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.DOWN) { + if (direction.offsetX > 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)((float)x + (float)direction.offsetX / 2.0f), (double)y + 0.8, (double)(z + 1)); + } else if (direction.offsetX < 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)((float)x + (float)direction.offsetX / -2.0f), (double)y, (double)z, (double)(x + 1), (double)y + 0.8, (double)(z + 1)); + } else if (direction.offsetZ > 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)y + 0.8, (double)((float)z + (float)direction.offsetZ / 2.0f)); + } else if (direction.offsetZ < 0) { + boundTop = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)((float)z + (float)direction.offsetZ / -2.0f), (double)(x + 1), (double)y + 0.8, (double)(z + 1)); + } + } + if (par5AxisAlignedBB.intersectsWith(boundBottom)) { + par6List.add(boundBottom); + } + if (boundTop != null && par5AxisAlignedBB.intersectsWith(boundTop)) { + par6List.add(boundTop); + } + return; + } + if (tileEntity.getSlant() == TileEntityConveyorBelt.SlantType.TOP) { + AxisAlignedBB newBounds2 = AxisAlignedBB.getBoundingBox((double)x, (double)y + 0.68, (double)z, (double)(x + 1), (double)y + 0.98, (double)(z + 1)); + if (newBounds2 != null && par5AxisAlignedBB.intersectsWith(newBounds2)) { + par6List.add(newBounds2); + } + return; + } + } + if ((newBounds = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)y + 0.3, (double)(z + 1))) != null && par5AxisAlignedBB.intersectsWith(newBounds)) { + par6List.add(newBounds); + } + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase par5EntityLiving, ItemStack stack) { + int angle = MathHelper.floor_double((double)((double)(par5EntityLiving.rotationYaw * 4.0f / 360.0f) + 0.5)) & 3; + int change = 2; + switch (angle) { + case 0: { + change = 3; + break; + } + case 1: { + change = 4; + break; + } + case 2: { + change = 2; + break; + } + case 3: { + change = 5; + } + } + world.setBlockMetadataWithNotify(x, y, z, change, 3); + } + + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + int original = world.getBlockMetadata(x, y, z); + int change = 2; + switch (original) { + case 2: { + change = 4; + break; + } + case 3: { + change = 5; + break; + } + case 4: { + change = 3; + break; + } + case 5: { + change = 2; + } + } + world.setBlockMetadataWithNotify(x, y, z, change, 3); + return true; + } + + @Override + public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt)world.getTileEntity(x, y, z); + int slantOrdinal = tileEntity.getSlant().ordinal() + 1; + if (slantOrdinal >= TileEntityConveyorBelt.SlantType.values().length) { + slantOrdinal = 0; + } + tileEntity.setSlant(TileEntityConveyorBelt.SlantType.values()[slantOrdinal]); + return true; + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + TileEntityConveyorBelt tileEntity = (TileEntityConveyorBelt)world.getTileEntity(x, y, z); + tileEntity.updatePowerTransferRange(); + if (tileEntity.IgnoreList.contains((Object)entity)) { + return; + } + if (tileEntity.isRunning() && !world.isBlockIndirectlyGettingPowered(x, y, z)) { + tileEntity.getClass(); + float acceleration = 0.01f; + tileEntity.getClass(); + float maxSpeed = 0.1f; + TileEntityConveyorBelt.SlantType slantType = tileEntity.getSlant(); + ForgeDirection direction = tileEntity.getDirection(); + if (entity instanceof EntityLiving) { + acceleration *= 5.0f; + maxSpeed *= 10.0f; + } + entity.addVelocity((double)((float)direction.offsetX * acceleration), 0.0, (double)((float)direction.offsetZ * acceleration)); + if (direction.offsetX != 0 && Math.abs(entity.motionX) > (double)maxSpeed) { + entity.motionX = (float)direction.offsetX * maxSpeed; + entity.motionZ = 0.0; + } + if (direction.offsetZ != 0 && Math.abs(entity.motionZ) > (double)maxSpeed) { + entity.motionZ = (float)direction.offsetZ * maxSpeed; + entity.motionX = 0.0; + } + entity.motionY += (double)0.0125f; + if (entity instanceof EntityItem) { + double difference; + if (direction.offsetX != 0) { + difference = (double)z + 0.5 - entity.posZ; + entity.motionZ += difference * 0.1; + } else if (direction.offsetZ != 0) { + difference = (double)x + 0.5 - entity.posX; + entity.motionX += difference * 0.1; + } + ++((EntityItem)entity).age; + boolean foundSneaking = false; + for (EntityPlayer player : (List) world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox((double)(x - 1), (double)(y - 1), (double)(z - 1), (double)(x + 1), (double)(y + 1), (double)(z + 1)))) { + if (!player.isSneaking()) continue; + foundSneaking = true; + } + ((EntityItem)entity).delayBeforeCanPickup = foundSneaking ? 0 : 20; + entity.onGround = false; + } + if (slantType == TileEntityConveyorBelt.SlantType.UP) { + if (entity.motionY < 0.4) { + entity.addVelocity(0.0, 0.4, 0.0); + } + } else if (slantType == TileEntityConveyorBelt.SlantType.DOWN && entity.motionY > -0.1) { + entity.addVelocity(0.0, -0.1, 0.0); + } + } + } + + @Override + public TileEntity createNewTileEntity(World var1, int meta) { + return new TileEntityConveyorBelt(); + } + + @Override + @SideOnly(value=Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int damageDropped(int par1) { + return 0; + } +} + diff --git a/src/main/java/assemblyline/common/machine/belt/TileEntityConveyorBelt.java b/src/main/java/assemblyline/common/machine/belt/TileEntityConveyorBelt.java new file mode 100644 index 0000000..0336b2f --- /dev/null +++ b/src/main/java/assemblyline/common/machine/belt/TileEntityConveyorBelt.java @@ -0,0 +1,256 @@ +package assemblyline.common.machine.belt; + +import assemblyline.api.IBelt; +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.TileEntityAssemblyNetwork; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; + +public class TileEntityConveyorBelt +extends TileEntityAssemblyNetwork +implements IBelt, +IRotatable { + public static final int MAX_FRAME = 13; + public static final int MAX_SLANT_FRAME = 23; + public final float acceleration = 0.01f; + public final float maxSpeed = 0.1f; + public float wheelRotation = 0.0f; + private int animFrame = 0; + private SlantType slantType = SlantType.NONE; + public List IgnoreList = new ArrayList<>(); + + @Override + public void updatePowerTransferRange() { + ForgeDirection direction; + int maximumTransferRange = 0; + for (int i = 0; i < 6; ++i) { + direction = ForgeDirection.getOrientation((int)i); + TileEntity tileEntity = this.worldObj.getTileEntity(this.xCoord + direction.offsetX, this.yCoord + direction.offsetY, this.zCoord + direction.offsetZ); + if (tileEntity == null || !(tileEntity instanceof TileEntityAssemblyNetwork)) continue; + TileEntityAssemblyNetwork assemblyNetwork = (TileEntityAssemblyNetwork)tileEntity; + if (assemblyNetwork.powerTransferRange <= maximumTransferRange) continue; + maximumTransferRange = assemblyNetwork.powerTransferRange; + } + for (int d = 0; d <= 1; ++d) { + direction = this.getDirection(); + if (d == 1) { + direction = direction.getOpposite(); + } + for (int i = -1; i <= 1; ++i) { + TileEntity tileEntity = this.worldObj.getTileEntity(this.xCoord + direction.offsetX, this.yCoord + i, this.zCoord + direction.offsetZ); + if (tileEntity == null || !(tileEntity instanceof TileEntityAssemblyNetwork)) continue; + TileEntityAssemblyNetwork assemblyNetwork = (TileEntityAssemblyNetwork)tileEntity; + if (assemblyNetwork.powerTransferRange <= maximumTransferRange) continue; + maximumTransferRange = assemblyNetwork.powerTransferRange; + } + } + this.powerTransferRange = Math.max(maximumTransferRange - 1, 0); + } + + @Override + public void onUpdate() { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER && this.ticks % 10L == 0L) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + ArrayList newList = new ArrayList(); + for (Entity ent : this.IgnoreList) { + if (!this.getAffectedEntities().contains((Object)ent)) continue; + newList.add(ent); + } + this.IgnoreList = newList; + if (this.isRunning() && !this.worldObj.isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord, this.zCoord)) { + if (this.ticks % 10L == 0L && this.worldObj.isRemote && this.worldObj.getBlock(this.xCoord - 1, this.yCoord, this.zCoord) != AssemblyLine.blockConveyorBelt && this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 1) != AssemblyLine.blockConveyorBelt) { + this.worldObj.playSound((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, "assemblyline:conveyor", 0.5f, 0.7f, true); + } + this.wheelRotation += 40.0f; + if (this.wheelRotation > 360.0f) { + this.wheelRotation = 0.0f; + } + float wheelRotPct = this.wheelRotation / 360.0f; + if (this.getSlant() == SlantType.NONE || this.getSlant() == SlantType.TOP) { + this.animFrame = (int)(wheelRotPct * 13.0f); + if (this.animFrame < 0) { + this.animFrame = 0; + } + if (this.animFrame > 13) { + this.animFrame = 13; + } + } else { + this.animFrame = (int)(wheelRotPct * 23.0f); + if (this.animFrame < 0) { + this.animFrame = 0; + } + if (this.animFrame > 23) { + this.animFrame = 23; + } + } + } + } + + @Override + protected int getMaxTransferRange() { + return 20; + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setDouble("wattsReceived", this.wattsReceived); + nbt.setInteger("slantType", this.slantType.ordinal()); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, getBlockMetadata(), nbt); + } + + public SlantType getSlant() { + return this.slantType; + } + + public void setSlant(SlantType slantType) { + if (slantType == null) { + slantType = SlantType.NONE; + } + this.slantType = slantType; + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public boolean getIsFirstBelt() { + ForgeDirection front = this.getDirection(); + ForgeDirection back = this.getDirection().getOpposite(); + TileEntity fBelt = this.worldObj.getTileEntity(this.xCoord + front.offsetX, this.yCoord + front.offsetY, this.zCoord + front.offsetZ); + TileEntity BBelt = this.worldObj.getTileEntity(this.xCoord + back.offsetX, this.yCoord + back.offsetY, this.zCoord + back.offsetZ); + if (fBelt instanceof TileEntityConveyorBelt) { + ForgeDirection TD; + ForgeDirection fD = ((TileEntityConveyorBelt)fBelt).getDirection(); + return fD == (TD = this.getDirection()); + } + return false; + } + + public boolean getIsMiddleBelt() { + ForgeDirection front = this.getDirection(); + ForgeDirection back = this.getDirection().getOpposite(); + TileEntity fBelt = this.worldObj.getTileEntity(this.xCoord + front.offsetX, this.yCoord + front.offsetY, this.zCoord + front.offsetZ); + TileEntity BBelt = this.worldObj.getTileEntity(this.xCoord + back.offsetX, this.yCoord + back.offsetY, this.zCoord + back.offsetZ); + if (fBelt instanceof TileEntityConveyorBelt && BBelt instanceof TileEntityConveyorBelt) { + ForgeDirection fD = ((TileEntityConveyorBelt)fBelt).getDirection(); + ForgeDirection BD = ((TileEntityConveyorBelt)BBelt).getDirection(); + ForgeDirection TD = this.getDirection(); + return fD == TD && BD == TD; + } + return false; + } + + public boolean getIsLastBelt() { + ForgeDirection front = this.getDirection(); + ForgeDirection back = this.getDirection().getOpposite(); + TileEntity fBelt = this.worldObj.getTileEntity(this.xCoord + front.offsetX, this.yCoord + front.offsetY, this.zCoord + front.offsetZ); + TileEntity BBelt = this.worldObj.getTileEntity(this.xCoord + back.offsetX, this.yCoord + back.offsetY, this.zCoord + back.offsetZ); + if (BBelt instanceof TileEntityConveyorBelt) { + ForgeDirection TD; + ForgeDirection BD = ((TileEntityConveyorBelt)BBelt).getDirection(); + return BD == (TD = this.getDirection()); + } + return false; + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + if (this.worldObj.isRemote) { + NBTTagCompound nbt = pkt.func_148857_g(); + this.wattsReceived = nbt.getDouble("wattsReceived"); + this.slantType = SlantType.values()[nbt.getInteger("slantType")]; + } + } + + @Override + public void setDirection(World world, int x, int y, int z, ForgeDirection facingDirection) { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal(), 3); + } + + @Override + public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) { + return ForgeDirection.getOrientation((int)this.getBlockMetadata()); + } + + public ForgeDirection getDirection() { + return this.getDirection((IBlockAccess)this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + + public void setDirection(ForgeDirection facingDirection) { + this.setDirection(this.worldObj, this.xCoord, this.yCoord, this.zCoord, facingDirection); + } + + @Override + public List getAffectedEntities() { + AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)); + return this.worldObj.getEntitiesWithinAABB(Entity.class, bounds); + } + + public int getAnimationFrame() { + if (!this.worldObj.isBlockIndirectlyGettingPowered(this.xCoord, this.yCoord, this.zCoord)) { + TileEntity te = null; + te = this.worldObj.getTileEntity(this.xCoord - 1, this.yCoord, this.zCoord); + if (te != null && te instanceof TileEntityConveyorBelt && ((TileEntityConveyorBelt)te).getSlant() == this.slantType) { + return ((TileEntityConveyorBelt)te).getAnimationFrame(); + } + te = this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord - 1); + if (te != null && te instanceof TileEntityConveyorBelt && ((TileEntityConveyorBelt)te).getSlant() == this.slantType) { + return ((TileEntityConveyorBelt)te).getAnimationFrame(); + } + } + return this.animFrame; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.slantType = SlantType.values()[nbt.getByte("slant")]; + if (this.worldObj != null) { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, nbt.getInteger("rotation"), 3); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setByte("slant", (byte)this.slantType.ordinal()); + if (this.worldObj != null) { + nbt.setInteger("rotation", this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord)); + } + } + + @Override + public void IgnoreEntity(Entity entity) { + if (!this.IgnoreList.contains((Object)entity)) { + this.IgnoreList.add(entity); + } + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return direction == ForgeDirection.DOWN; + } + + public static enum SlantType { + NONE, + UP, + DOWN, + TOP; + + } +} + diff --git a/src/main/java/assemblyline/common/machine/belt/TileEntityCoveredBelt.java b/src/main/java/assemblyline/common/machine/belt/TileEntityCoveredBelt.java new file mode 100644 index 0000000..2611e3f --- /dev/null +++ b/src/main/java/assemblyline/common/machine/belt/TileEntityCoveredBelt.java @@ -0,0 +1,6 @@ +package assemblyline.common.machine.belt; + +public class TileEntityCoveredBelt +extends TileEntityConveyorBelt { +} + diff --git a/src/main/java/assemblyline/common/machine/belt/TileEntityElevatorBelt.java b/src/main/java/assemblyline/common/machine/belt/TileEntityElevatorBelt.java new file mode 100644 index 0000000..9aee214 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/belt/TileEntityElevatorBelt.java @@ -0,0 +1,23 @@ +package assemblyline.common.machine.belt; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityElevatorBelt +extends TileEntityConveyorBelt { + public List conveyList = new ArrayList(); + + public void doBeltAction() { + this.conveyItemsVertical(true, false); + } + + public boolean isBellowABelt() { + TileEntity ent = this.worldObj.getTileEntity(this.xCoord, this.xCoord - 1, this.zCoord); + return ent instanceof TileEntityElevatorBelt; + } + + public void conveyItemsVertical(boolean extendLife, boolean preventPickUp) { + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/Command.java b/src/main/java/assemblyline/common/machine/command/Command.java new file mode 100644 index 0000000..63baf0d --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/Command.java @@ -0,0 +1,138 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.armbot.TileEntityArmbot; +import assemblyline.common.machine.command.CommandBreak; +import assemblyline.common.machine.command.CommandDrop; +import assemblyline.common.machine.command.CommandFire; +import assemblyline.common.machine.command.CommandGrab; +import assemblyline.common.machine.command.CommandHarvest; +import assemblyline.common.machine.command.CommandIdle; +import assemblyline.common.machine.command.CommandManager; +import assemblyline.common.machine.command.CommandPlace; +import assemblyline.common.machine.command.CommandPowerTo; +import assemblyline.common.machine.command.CommandRepeat; +import assemblyline.common.machine.command.CommandReturn; +import assemblyline.common.machine.command.CommandRotateBy; +import assemblyline.common.machine.command.CommandRotateTo; +import assemblyline.common.machine.command.CommandUse; +import java.util.HashMap; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public abstract class Command { + private static final HashMap COMMANDS = new HashMap(); + private static final HashMap REVERSE_LOOKUP = new HashMap(); + protected int ticks = 0; + public World world; + public TileEntityArmbot tileEntity; + public CommandManager commandManager; + private String[] parameters; + + public static void registerCommand(String command, Class commandClass) { + COMMANDS.put(command, commandClass); + REVERSE_LOOKUP.put(commandClass, command); + } + + public static Class getCommand(String command) { + return (Class)COMMANDS.get(command.toLowerCase()); + } + + public static String getCommandName(Class command) { + return (String)REVERSE_LOOKUP.get(command); + } + + protected boolean doTask() { + ++this.ticks; + return false; + } + + public void onTaskStart() { + } + + public void onTaskEnd() { + } + + public int getTickInterval() { + return 1; + } + + public void setParameters(String[] strings) { + this.parameters = strings; + } + + public String[] getArgs() { + return this.parameters; + } + + protected String getArg(int i) { + if (i >= 0 && i < this.parameters.length) { + return this.parameters[i]; + } + return null; + } + + protected int getIntArg(int i) { + if (this.getArg(i) != null) { + try { + return Integer.parseInt(this.getArg(i)); + } + catch (Exception exception) { + // empty catch block + } + } + return 0; + } + + protected Double getDoubleArg(int i) { + if (this.getArg(i) != null) { + try { + return Double.parseDouble(this.getArg(i)); + } + catch (Exception exception) { + // empty catch block + } + } + return 0.0; + } + + protected Float getFloatArg(int i) { + if (this.getArg(i) != null) { + try { + return Float.valueOf(Float.parseFloat(this.getArg(i))); + } + catch (Exception exception) { + // empty catch block + } + } + return Float.valueOf(0.0f); + } + + public void readFromNBT(NBTTagCompound taskCompound) { + this.ticks = taskCompound.getInteger("ticks"); + } + + public void writeToNBT(NBTTagCompound taskCompound) { + taskCompound.setInteger("ticks", this.ticks); + } + + public String toString() { + return "COMMAND"; + } + + static { + Command.registerCommand("idle", CommandIdle.class); + Command.registerCommand("grab", CommandGrab.class); + Command.registerCommand("drop", CommandDrop.class); + Command.registerCommand("rotate", CommandRotateBy.class); + Command.registerCommand("rotateto", CommandRotateTo.class); + Command.registerCommand("return", CommandReturn.class); + Command.registerCommand("repeat", CommandRepeat.class); + Command.registerCommand("use", CommandUse.class); + Command.registerCommand("powerto", CommandPowerTo.class); + Command.registerCommand("fire", CommandFire.class); + Command.registerCommand("break", CommandBreak.class); + Command.registerCommand("place", CommandPlace.class); + Command.registerCommand("harvest", CommandHarvest.class); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandBreak.java b/src/main/java/assemblyline/common/machine/command/CommandBreak.java new file mode 100644 index 0000000..fcf731d --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandBreak.java @@ -0,0 +1,44 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.CommandRotateTo; +import dark.library.helpers.ItemFindingHelper; +import java.util.ArrayList; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; +import universalelectricity.core.vector.Vector3; + +public class CommandBreak +extends Command { + private CommandRotateTo rotateToCommand; + int BREAK_TIME = 30; + boolean keep = false; + + @Override + protected boolean doTask() { + super.doTask(); + Vector3 serachPosition = this.tileEntity.getHandPosition(); + Block block = serachPosition.getBlock(this.world); + if (block != null && this.BREAK_TIME <= this.ticks) { + ArrayList items = block.getDrops(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), serachPosition.getBlockMetadata((IBlockAccess)this.world), 0); + if (!this.keep || items.size() > 1) { + ItemFindingHelper.dropBlockAsItem(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ()); + } else { + this.tileEntity.grabEntity((Entity)new EntityItem(this.world, (double)serachPosition.intX() + 0.5, (double)serachPosition.intY() + 0.5, (double)serachPosition.intZ() + 0.5, (ItemStack)items.get(0))); + } + this.world.setBlock(serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), Blocks.air, 0, 3); + return false; + } + return true; + } + + @Override + public String toString() { + return "BREAK"; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandDrop.java b/src/main/java/assemblyline/common/machine/command/CommandDrop.java new file mode 100644 index 0000000..f4fe6f7 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandDrop.java @@ -0,0 +1,20 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; + +public class CommandDrop +extends Command { + @Override + protected boolean doTask() { + super.doTask(); + this.tileEntity.dropAll(); + this.world.playSound((double)this.tileEntity.xCoord, (double)this.tileEntity.yCoord, (double)this.tileEntity.zCoord, "random.pop", 0.2f, ((this.tileEntity.getWorldObj().rand.nextFloat() - this.tileEntity.getWorldObj().rand.nextFloat()) * 0.7f + 1.0f) * 1.0f, true); + return false; + } + + @Override + public String toString() { + return "DROP"; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandFire.java b/src/main/java/assemblyline/common/machine/command/CommandFire.java new file mode 100644 index 0000000..01eb1d2 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandFire.java @@ -0,0 +1,128 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.CommandDrop; +import java.util.Random; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import universalelectricity.core.vector.Vector3; + +public class CommandFire +extends Command { + private static final float MIN_ACTUAL_PITCH = -80.0f; + private static final float MAX_ACTUAL_PITCH = 80.0f; + private float actualYaw; + private float actualPitch; + private float velocity; + private Vector3 finalVelocity; + + @Override + public void onTaskStart() { + super.onTaskStart(); + this.velocity = this.getFloatArg(0).floatValue(); + if (this.velocity > 2.5f) { + this.velocity = 2.5f; + } + if (this.velocity < 0.125f) { + this.velocity = 1.0f; + } + this.actualYaw = this.tileEntity.rotationYaw; + this.actualPitch = 160.0f * (this.tileEntity.rotationPitch / 60.0f) + -80.0f; + double yaw = Math.toRadians(this.actualYaw); + double pitch = Math.toRadians(this.actualPitch); + double x = -Math.sin(yaw) * Math.cos(pitch); + double y = Math.sin(pitch); + double z = Math.cos(yaw) * Math.cos(pitch); + this.finalVelocity = new Vector3(x, y, z); + Random random = new Random(System.currentTimeMillis()); + this.finalVelocity.x *= (double)(0.995f + random.nextFloat() * 0.01f); + this.finalVelocity.y *= (double)(0.995f + random.nextFloat() * 0.01f); + this.finalVelocity.z *= (double)(0.995f + random.nextFloat() * 0.01f); + this.finalVelocity.multiply(this.velocity); + } + + @Override + protected boolean doTask() { + Entity held; + if (this.finalVelocity == null) { + this.finalVelocity = new Vector3(0.0, 0.0, 0.0); + } + if (this.tileEntity.getGrabbedEntities().size() > 0 && (held = (Entity)this.tileEntity.getGrabbedEntities().get(0)) != null) { + this.world.playSound((double)this.tileEntity.xCoord, (double)this.tileEntity.yCoord, (double)this.tileEntity.zCoord, "random.bow", this.velocity, 2.0f - this.velocity / 4.0f, true); + if (held instanceof EntityItem) { + EntityItem item = (EntityItem)held; + ItemStack stack = item.getEntityItem(); + ItemStack thrown = stack.copy(); + thrown.stackSize = 1; + if (item.getEntityItem().stackSize > 0) { + --stack.stackSize; + item.setEntityItemStack(stack); + } else { + this.commandManager.getNewCommand(this.tileEntity, CommandDrop.class, new String[0]).doTask(); + if (!this.world.isRemote) { + this.world.removeEntity(held); + } + } + if (item.getEntityItem().getItem() == Items.arrow) { + EntityArrow arrow = new EntityArrow(this.world, this.tileEntity.getHandPosition().x, this.tileEntity.getHandPosition().y, this.tileEntity.getHandPosition().z); + arrow.motionX = this.finalVelocity.x; + arrow.motionY = this.finalVelocity.y; + arrow.motionZ = this.finalVelocity.z; + if (!this.world.isRemote) { + this.world.spawnEntityInWorld((Entity)arrow); + } + } else { + EntityItem item2 = new EntityItem(this.world, this.tileEntity.getHandPosition().x, this.tileEntity.getHandPosition().y, this.tileEntity.getHandPosition().z, thrown); + item2.motionX = this.finalVelocity.x; + item2.motionY = this.finalVelocity.y; + item2.motionZ = this.finalVelocity.z; + if (!this.world.isRemote) { + this.world.spawnEntityInWorld((Entity)item2); + } + } + } else { + this.commandManager.getNewCommand(this.tileEntity, CommandDrop.class, new String[0]).doTask(); + held.motionX = this.finalVelocity.x; + held.motionY = this.finalVelocity.y; + held.motionZ = this.finalVelocity.z; + } + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.actualYaw = taskCompound.getFloat("fireYaw"); + this.actualPitch = taskCompound.getFloat("firePitch"); + this.velocity = taskCompound.getFloat("fireVelocity"); + this.finalVelocity = new Vector3(); + this.finalVelocity.x = taskCompound.getDouble("fireVectorX"); + this.finalVelocity.y = taskCompound.getDouble("fireVectorY"); + this.finalVelocity.z = taskCompound.getDouble("fireVectorZ"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setFloat("fireYaw", this.actualYaw); + taskCompound.setFloat("firePitch", this.actualPitch); + taskCompound.setFloat("fireVelocity", this.velocity); + if (this.finalVelocity != null) { + taskCompound.setDouble("fireVectorX", this.finalVelocity.x); + taskCompound.setDouble("fireVectorY", this.finalVelocity.y); + taskCompound.setDouble("fireVectorZ", this.finalVelocity.z); + } + } + + @Override + public String toString() { + return "FIRE " + Float.toString(this.velocity); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandGrab.java b/src/main/java/assemblyline/common/machine/command/CommandGrab.java new file mode 100644 index 0000000..bbdc61e --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandGrab.java @@ -0,0 +1,100 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.belt.TileEntityConveyorBelt; +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.GrabDictionary; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import universalelectricity.core.vector.Vector3; + +public class CommandGrab +extends Command { + public static final float radius = 0.5f; + public boolean child = false; + private TileEntityConveyorBelt belt; + private Class entityToInclude; + + @Override + public void onTaskStart() { + super.onTaskStart(); + this.entityToInclude = Entity.class; + if (this.getArgs() != null && this.getArgs().length > 0 && this.getArgs()[0] != null) { + if (this.getArg(0).equalsIgnoreCase("baby") || this.getArg(0).equalsIgnoreCase("child")) { + this.child = true; + if (this.getArgs().length > 1 && this.getArgs()[1] != null) { + this.entityToInclude = GrabDictionary.get(this.getArg(1)).getEntityClass(); + } + } else { + this.entityToInclude = GrabDictionary.get(this.getArg(0)).getEntityClass(); + if (this.getArgs().length > 1 && this.getArgs()[1] != null && (this.getArg(1).equalsIgnoreCase("baby") || this.getArg(0).equalsIgnoreCase("child"))) { + this.child = true; + } + } + } + } + + @Override + protected boolean doTask() { + super.doTask(); + if (this.tileEntity.getGrabbedEntities().size() > 0) { + return false; + } + Vector3 serachPosition = this.tileEntity.getHandPosition(); + List found = this.world.getEntitiesWithinAABB(this.entityToInclude, AxisAlignedBB.getBoundingBox((double)(serachPosition.x - 0.5), (double)(serachPosition.y - 0.5), (double)(serachPosition.z - 0.5), (double)(serachPosition.x + 0.5), (double)(serachPosition.y + 0.5), (double)(serachPosition.z + 0.5))); + TileEntity ent = serachPosition.getTileEntity((IBlockAccess)this.world); + Vector3 searchPostion2 = Vector3.add(serachPosition, new Vector3(0.0, -1.0, 0.0)); + TileEntity ent2 = searchPostion2.getTileEntity((IBlockAccess)this.world); + if (ent instanceof TileEntityConveyorBelt) { + this.belt = (TileEntityConveyorBelt)ent; + } else if (ent2 instanceof TileEntityConveyorBelt) { + this.belt = (TileEntityConveyorBelt)ent2; + } + if (found != null && found.size() > 0) { + for (int i = 0; i < found.size(); ++i) { + if (found.get(i) == null || found.get(i) instanceof EntityArrow || found.get(i) instanceof EntityPlayer || ((Entity)found.get((int)i)).ridingEntity != null || found.get(i) instanceof EntityAgeable && (!(found.get(i) instanceof EntityAgeable) || this.child != ((EntityAgeable)found.get(i)).isChild())) continue; + this.tileEntity.grabEntity((Entity)found.get(i)); + this.world.playSound((double)this.tileEntity.xCoord, (double)this.tileEntity.yCoord, (double)this.tileEntity.zCoord, "random.pop", 0.2f, ((this.tileEntity.getWorldObj().rand.nextFloat() - this.tileEntity.getWorldObj().rand.nextFloat()) * 0.7f + 1.0f) * 1.0f, true); + if (this.belt != null) { + this.belt.IgnoreEntity((Entity)found.get(i)); + } + return false; + } + } + return true; + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.child = taskCompound.getBoolean("child"); + this.entityToInclude = GrabDictionary.get(taskCompound.getString("name")).getEntityClass(); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setBoolean("child", this.child); + taskCompound.setString("name", this.entityToInclude != null ? GrabDictionary.get(this.entityToInclude).getName() : ""); + } + + @Override + public String toString() { + String baby = ""; + String entity = ""; + if (this.entityToInclude != null) { + entity = GrabDictionary.get(this.entityToInclude).getName(); + if (this.child) { + baby = "baby "; + } + } + return "GRAB " + baby + entity; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandHarvest.java b/src/main/java/assemblyline/common/machine/command/CommandHarvest.java new file mode 100644 index 0000000..9ea5612 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandHarvest.java @@ -0,0 +1,20 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.CommandBreak; +import assemblyline.common.machine.command.CommandRotateTo; + +public class CommandHarvest +extends CommandBreak { + private CommandRotateTo rotateToCommand; + + @Override + public void onTaskStart() { + this.keep = true; + } + + @Override + public String toString() { + return "HARVEST"; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandIdle.java b/src/main/java/assemblyline/common/machine/command/CommandIdle.java new file mode 100644 index 0000000..0510cd7 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandIdle.java @@ -0,0 +1,47 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import net.minecraft.nbt.NBTTagCompound; + +public class CommandIdle +extends Command { + public int idleTime = 80; + private int totalIdleTime = 80; + + @Override + public void onTaskStart() { + super.onTaskStart(); + if (this.getIntArg(0) > 0) { + this.totalIdleTime = this.idleTime = this.getIntArg(0); + } + } + + @Override + protected boolean doTask() { + if (this.idleTime > 0) { + --this.idleTime; + return true; + } + return false; + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.idleTime = taskCompound.getInteger("idleTime"); + this.totalIdleTime = taskCompound.getInteger("idleTotal"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setInteger("idleTime", this.idleTime); + taskCompound.setInteger("idleTotal", this.totalIdleTime); + } + + @Override + public String toString() { + return "IDLE " + Integer.toString(this.totalIdleTime); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandManager.java b/src/main/java/assemblyline/common/machine/command/CommandManager.java new file mode 100644 index 0000000..738651c --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandManager.java @@ -0,0 +1,162 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.armbot.TileEntityArmbot; +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.CommandRepeat; +import cpw.mods.fml.common.FMLLog; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; + +public class CommandManager { + private final List tasks = new ArrayList(); + private int ticks = 0; + private int currentTask = 0; + private int lastTask = -1; + + public void onUpdate() { + try { + if (this.tasks.size() > 0) { + if (this.currentTask < this.tasks.size()) { + if (this.currentTask < 0) { + this.currentTask = 0; + this.lastTask = -1; + } + Command task = (Command)this.tasks.get(this.currentTask); + if (this.currentTask != this.lastTask) { + this.lastTask = this.currentTask; + task.onTaskStart(); + } + if (!task.doTask()) { + int tempCurrentTask = this.currentTask++; + task.onTaskEnd(); + if (!(task instanceof CommandRepeat)) { + this.tasks.set(tempCurrentTask, this.getNewCommand(task.tileEntity, task.getClass(), task.getArgs())); + } + } + } else { + this.clear(); + } + } + } + catch (Exception e) { + FMLLog.severe((String)"Failed to execute task in Assembly Line.", (Object[])new Object[0]); + e.printStackTrace(); + } + ++this.ticks; + } + + public Command getNewCommand(TileEntityArmbot tileEntity, Class commandClass, String[] parameters) { + try { + Command newCommand = (Command)commandClass.newInstance(); + newCommand.world = tileEntity.getWorldObj(); + newCommand.tileEntity = tileEntity; + newCommand.commandManager = this; + newCommand.setParameters(parameters); + return newCommand; + } + catch (Exception e) { + FMLLog.severe((String)"Failed to add command", (Object[])new Object[0]); + e.printStackTrace(); + return null; + } + } + + public void addCommand(TileEntityArmbot tileEntity, Class commandClass, String[] parameters) { + Command newCommand = this.getNewCommand(tileEntity, commandClass, parameters); + if (newCommand != null) { + this.tasks.add(newCommand); + } + } + + public void addCommand(TileEntityArmbot tileEntity, Class task) { + this.addCommand(tileEntity, task, new String[0]); + } + + public boolean hasTasks() { + return this.tasks.size() > 0; + } + + public List getCommands() { + return this.tasks; + } + + public void clear() { + this.tasks.clear(); + this.currentTask = 0; + this.lastTask = -1; + this.ticks = 0; + } + + public void setCurrentTask(int i) { + this.currentTask = Math.min(i, this.tasks.size()); + } + + public int getCurrentTask() { + return this.currentTask; + } + + public void readFromNBT(TileEntityArmbot tileEntity, NBTTagCompound nbt) { + this.currentTask = nbt.getInteger("curTasks"); + this.lastTask = nbt.getInteger("lastTask"); + this.ticks = nbt.getInteger("ticks"); + if (nbt.getInteger("numTasks") > 0) { + NBTTagList taskList = nbt.getTagList("commands", 10); + for (int i = 0; i < taskList.tagCount(); ++i) { + NBTTagCompound cmdTag = (NBTTagCompound)taskList.getCompoundTagAt(i); + try { + Class cmdClass = Class.forName(cmdTag.getString("commandClass")); + ArrayList pars = new ArrayList(); + if (cmdTag.getInteger("numParameters") > 0) { + NBTTagList parameters = cmdTag.getTagList("parameters", 8); + for (int ii = 0; ii < parameters.tagCount(); ++ii) { + pars.add(parameters.getStringTagAt((int)ii)); + } + } + Command cmd = this.getNewCommand(tileEntity, cmdClass, pars.toArray(new String[0])); + cmd.readFromNBT((NBTTagCompound)cmdTag.getTag("customData")); + continue; + } + catch (ClassNotFoundException e) { + System.out.println("Error loading CommandManger: "); + e.printStackTrace(); + } + } + } + } + + public void writeToNBT(NBTTagCompound nbt) { + nbt.setInteger("numTasks", this.tasks.size()); + if (this.tasks.size() > 0) { + NBTTagList taskList = new NBTTagList(); + for (int i = 0; i < this.tasks.size(); ++i) { + NBTTagCompound taskCompound = new NBTTagCompound(); + String cmdName = ((Command)this.tasks.get(i)).getClass().getName(); + if (cmdName != null && !cmdName.isEmpty()) { + taskCompound.setString("commandClass", cmdName); + } + if (((Command)this.tasks.get(i)).getArgs().length > 0) { + NBTTagList parameters = new NBTTagList(); + for (String par : ((Command)this.tasks.get(i)).getArgs()) { + if (par == null || par.isEmpty()) continue; + parameters.appendTag((NBTBase)new NBTTagString(par)); + } + taskCompound.setTag("parameters", (NBTBase)parameters); + } + taskCompound.setInteger("numParameters", ((Command)this.tasks.get(i)).getArgs().length); + NBTTagCompound customData = new NBTTagCompound(); + ((Command)this.tasks.get(i)).writeToNBT(customData); + taskCompound.setTag("customData", customData); + taskList.appendTag((NBTBase)taskCompound); + } + nbt.setTag("commands", (NBTBase)taskList); + } + nbt.setInteger("curTask", this.currentTask); + nbt.setInteger("lastTask", this.lastTask); + nbt.setInteger("ticks", this.ticks); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandPlace.java b/src/main/java/assemblyline/common/machine/command/CommandPlace.java new file mode 100644 index 0000000..820c67c --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandPlace.java @@ -0,0 +1,58 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; + +public class CommandPlace +extends Command { + int PLACE_TIME = 30; + + @Override + public void onTaskStart() { + super.onTaskStart(); + } + + @Override + protected boolean doTask() { + super.doTask(); + Vector3 serachPosition = this.tileEntity.getHandPosition(); + Block block = serachPosition.getBlock((IBlockAccess)this.world); + if (block == null && this.ticks >= this.PLACE_TIME) { + for (Entity entity : this.tileEntity.getGrabbedEntities()) { + ItemStack itemStack; + if (!(entity instanceof EntityItem) || (itemStack = ((EntityItem)entity).getEntityItem()) == null) continue; + if (itemStack.getItem() instanceof ItemBlock) { + ((ItemBlock)itemStack.getItem()).placeBlockAt(itemStack, null, this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), 0, 0.5f, 0.5f, 0.5f, itemStack.getItemDamage()); + this.tileEntity.dropEntity(entity); + return false; + } + if (!(itemStack.getItem() instanceof IPlantable)) continue; + IPlantable plantable = (IPlantable)itemStack.getItem(); + Block blockBelow = Vector3.add(serachPosition, new Vector3(0.0, -1.0, 0.0)).getBlock((IBlockAccess)this.world); + if (blockBelow == null || !blockBelow.canSustainPlant(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), ForgeDirection.UP, plantable)) continue; + Block plantBlock = plantable.getPlant(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ()); + int blockMetadata = plantable.getPlantMetadata(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ()); + if (!this.world.setBlock(serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), plantBlock, blockMetadata, 3) || this.world.getBlock(serachPosition.intX(), serachPosition.intY(), serachPosition.intZ()) != plantBlock) continue; + plantBlock.onBlockPlacedBy(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), null, itemStack); + plantBlock.onPostBlockPlaced(this.world, serachPosition.intX(), serachPosition.intY(), serachPosition.intZ(), blockMetadata); + this.tileEntity.dropEntity(entity); + return false; + } + } + return false; + } + + @Override + public String toString() { + return "PLACE"; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandPowerTo.java b/src/main/java/assemblyline/common/machine/command/CommandPowerTo.java new file mode 100644 index 0000000..c659811 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandPowerTo.java @@ -0,0 +1,86 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import dark.library.helpers.ItemFindingHelper; +import java.util.ArrayList; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.vector.Vector3; + +public class CommandPowerTo +extends Command { + private int duration; + private int ticksRan; + + @Override + public void onTaskStart() { + this.duration = 0; + this.ticksRan = 0; + if (this.getArgs().length > 0) { + this.duration = this.getIntArg(0); + } + if (this.duration <= 30) { + this.duration = 30; + } + } + + @Override + protected boolean doTask() { + super.doTask(); + if (this.tileEntity.isProvidingPower && this.ticksRan >= this.duration) { + this.powerBlock(false); + return false; + } + if (this.tileEntity.isProvidingPower) { + Vector3 loc = this.tileEntity.getHandPosition(); + this.world.spawnParticle("smoke", loc.x, loc.y, loc.z, 0.0, 0.0, 0.0); + this.world.spawnParticle("flame", loc.x, loc.y, loc.z, 0.0, 0.0, 0.0); + } + Block block = this.world.getBlock(this.tileEntity.getHandPosition().intX(), this.tileEntity.getHandPosition().intY(), this.tileEntity.getHandPosition().intZ()); + TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity((IBlockAccess)this.world); + if (this.tileEntity.getGrabbedItems().size() > 0) { + ArrayList stacks = new ArrayList(); + stacks.add(new ItemStack(Blocks.redstone_torch, 1, 0)); + stacks.add(new ItemStack(Blocks.unlit_redstone_torch, 1, 0)); + if (ItemFindingHelper.filterItems(this.tileEntity.getGrabbedItems(), stacks).size() > 0) { + this.powerBlock(true); + } + } + ++this.ticksRan; + return true; + } + + public void powerBlock(boolean on) { + this.tileEntity.isProvidingPower = on; + Block block = this.tileEntity.getWorldObj().getBlock(this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord); + for (int i = 2; i < 6; ++i) { + ForgeDirection dir = ForgeDirection.getOrientation((int)i); + this.world.notifyBlockOfNeighborChange(this.tileEntity.xCoord + dir.offsetX, this.tileEntity.yCoord + dir.offsetY, this.tileEntity.zCoord + dir.offsetZ, block); + } + } + + @Override + public String toString() { + return "POWERTO " + Integer.toString(this.duration); + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.duration = taskCompound.getInteger("useTimes"); + this.ticksRan = taskCompound.getInteger("useCurTimes"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setInteger("useTimes", this.duration); + taskCompound.setInteger("useCurTimes", this.ticksRan); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandRepeat.java b/src/main/java/assemblyline/common/machine/command/CommandRepeat.java new file mode 100644 index 0000000..47706f2 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandRepeat.java @@ -0,0 +1,70 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import net.minecraft.nbt.NBTTagCompound; + +public class CommandRepeat +extends Command { + private int tasksToRepeat; + private int numReps; + private int curReps; + private boolean initialized = false; + + @Override + public void onTaskStart() { + this.tasksToRepeat = Math.max(this.getIntArg(0), 0); + this.numReps = this.getIntArg(1); + if (this.numReps == 0) { + this.numReps = -1; + } + if (!this.initialized) { + this.initialized = true; + this.curReps = 0; + } + } + + @Override + public void onTaskEnd() { + if (this.curReps < this.numReps || this.numReps == -1) { + ++this.curReps; + if (this.tasksToRepeat > 0) { + this.commandManager.setCurrentTask(this.commandManager.getCurrentTask() - this.tasksToRepeat - 1); + return; + } + this.commandManager.setCurrentTask(-2); + return; + } + this.initialized = false; + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.initialized = taskCompound.getBoolean("repInitialized"); + this.tasksToRepeat = taskCompound.getInteger("repTasks"); + this.curReps = taskCompound.getInteger("repCur"); + this.numReps = taskCompound.getInteger("repGoal"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setBoolean("repInitialized", this.initialized); + taskCompound.setInteger("repTasks", this.tasksToRepeat); + taskCompound.setInteger("repCur", this.curReps); + taskCompound.setInteger("repGoal", this.numReps); + } + + @Override + public String toString() { + int cmdToTest = 0; + if (this.tasksToRepeat > 0) { + cmdToTest = this.commandManager.getCurrentTask() - this.tasksToRepeat; + } + if (this.commandManager.hasTasks() && this.commandManager.getCurrentTask() >= 0 && this.commandManager.getCurrentTask() < this.commandManager.getCommands().size()) { + return ((Command)this.commandManager.getCommands().get(cmdToTest)).toString(); + } + return "REPEAT " + Integer.toString(this.tasksToRepeat) + " " + (this.numReps > 0 ? Integer.toString(this.numReps) : ""); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandReturn.java b/src/main/java/assemblyline/common/machine/command/CommandReturn.java new file mode 100644 index 0000000..1708dbb --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandReturn.java @@ -0,0 +1,36 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.command.CommandRotateTo; + +public class CommandReturn +extends Command { + public static final float IDLE_ROTATION_PITCH = 0.0f; + public static final float IDLE_ROTATION_YAW = 0.0f; + private CommandRotateTo rotateToCommand; + + @Override + public void onTaskStart() { + this.rotateToCommand = (CommandRotateTo)this.commandManager.getNewCommand(this.tileEntity, CommandRotateTo.class, new String[]{"0", "0"}); + this.rotateToCommand.onTaskStart(); + } + + @Override + protected boolean doTask() { + if (this.rotateToCommand == null) { + this.onTaskStart(); + } + return this.rotateToCommand.doTask(); + } + + @Override + public void onTaskEnd() { + this.rotateToCommand.onTaskEnd(); + } + + @Override + public String toString() { + return "RETURN"; + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandRotateBy.java b/src/main/java/assemblyline/common/machine/command/CommandRotateBy.java new file mode 100644 index 0000000..ec71ed1 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandRotateBy.java @@ -0,0 +1,85 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import net.minecraft.nbt.NBTTagCompound; + +public class CommandRotateBy +extends Command { + float targetRotationYaw = 0.0f; + float targetRotationPitch = 0.0f; + float deltaPitch = 0.0f; + float deltaYaw = 90.0f; + float totalTicks = 0.0f; + + @Override + public void onTaskStart() { + super.onTaskStart(); + this.ticks = 0; + if (this.getArg(0) != null) { + this.targetRotationYaw = this.tileEntity.rotationYaw + this.getFloatArg(0).floatValue(); + this.deltaYaw = this.getFloatArg(0).floatValue(); + } else { + this.targetRotationYaw = this.tileEntity.rotationYaw + 90.0f; + } + if (this.getArg(1) != null) { + this.targetRotationPitch = this.tileEntity.rotationPitch + this.getFloatArg(1).floatValue(); + this.deltaPitch = this.getFloatArg(1).floatValue(); + } else { + this.targetRotationPitch = this.tileEntity.rotationPitch; + } + while (this.targetRotationYaw < 0.0f) { + this.targetRotationYaw += 360.0f; + } + while (this.targetRotationYaw > 360.0f) { + this.targetRotationYaw -= 360.0f; + } + while (this.targetRotationPitch < 0.0f) { + this.targetRotationPitch += 60.0f; + } + while (this.targetRotationPitch > 60.0f) { + this.targetRotationPitch -= 60.0f; + } + float f = Math.abs(this.targetRotationYaw - this.tileEntity.rotationYaw); + this.tileEntity.getClass(); + float totalTicksYaw = f / 1.3f; + float f2 = Math.abs(this.targetRotationPitch - this.tileEntity.rotationPitch); + this.tileEntity.getClass(); + float totalTicksPitch = f2 / 1.3f; + this.totalTicks = Math.max(totalTicksYaw, totalTicksPitch); + } + + @Override + protected boolean doTask() { + super.doTask(); + if (Math.abs(this.tileEntity.rotationYaw - this.targetRotationYaw) > 0.001f) { + this.tileEntity.rotationYaw = this.targetRotationYaw; + } + if (Math.abs(this.tileEntity.rotationPitch - this.targetRotationPitch) > 0.001f) { + this.tileEntity.rotationPitch = this.targetRotationPitch; + } + if (Math.abs(this.tileEntity.renderPitch - this.tileEntity.rotationPitch) > 0.001f) { + return true; + } + return Math.abs(this.tileEntity.renderYaw - this.tileEntity.rotationYaw) > 0.001f; + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.targetRotationPitch = taskCompound.getFloat("rotPitch"); + this.targetRotationYaw = taskCompound.getFloat("rotYaw"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setFloat("rotPitch", this.targetRotationPitch); + taskCompound.setFloat("rotYaw", this.targetRotationYaw); + } + + @Override + public String toString() { + return "ROTATE " + Float.toString(this.deltaYaw) + " " + Float.toString(this.deltaPitch); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandRotateTo.java b/src/main/java/assemblyline/common/machine/command/CommandRotateTo.java new file mode 100644 index 0000000..f7709d5 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandRotateTo.java @@ -0,0 +1,70 @@ +package assemblyline.common.machine.command; + +import assemblyline.common.machine.command.Command; +import net.minecraft.nbt.NBTTagCompound; + +public class CommandRotateTo +extends Command { + float targetRotationYaw = 0.0f; + float targetRotationPitch = 0.0f; + int totalTicks = 0; + + @Override + public void onTaskStart() { + super.onTaskStart(); + this.ticks = 0; + this.totalTicks = 0; + this.targetRotationYaw = this.getArg(0) != null ? this.getFloatArg(0).floatValue() : 0.0f; + this.targetRotationPitch = this.getArg(1) != null ? this.getFloatArg(1).floatValue() : 0.0f; + while (this.targetRotationYaw < 0.0f) { + this.targetRotationYaw += 360.0f; + } + while (this.targetRotationYaw > 360.0f) { + this.targetRotationYaw -= 360.0f; + } + while (this.targetRotationPitch < -60.0f) { + this.targetRotationPitch += 60.0f; + } + while (this.targetRotationPitch > 60.0f) { + this.targetRotationPitch -= 60.0f; + } + float f = Math.abs(this.targetRotationYaw - this.tileEntity.renderYaw); + this.tileEntity.getClass(); + int totalTicksYaw = (int)(f / 1.3f); + float f2 = Math.abs(this.targetRotationPitch - this.tileEntity.renderPitch); + this.tileEntity.getClass(); + int totalTicksPitch = (int)(f2 / 1.3f); + this.totalTicks = Math.max(totalTicksYaw, totalTicksPitch); + } + + @Override + protected boolean doTask() { + super.doTask(); + this.tileEntity.rotationYaw = this.targetRotationYaw; + this.tileEntity.rotationPitch = this.targetRotationPitch; + if (Math.abs(this.tileEntity.renderPitch - this.tileEntity.rotationPitch) > 0.001f) { + return true; + } + return Math.abs(this.tileEntity.renderYaw - this.tileEntity.rotationYaw) > 0.001f; + } + + @Override + public String toString() { + return "ROTATETO " + Float.toString(this.targetRotationYaw) + " " + Float.toString(this.targetRotationPitch); + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.targetRotationPitch = taskCompound.getFloat("rotPitch"); + this.targetRotationYaw = taskCompound.getFloat("rotYaw"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setFloat("rotPitch", this.targetRotationPitch); + taskCompound.setFloat("rotYaw", this.targetRotationYaw); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/CommandUse.java b/src/main/java/assemblyline/common/machine/command/CommandUse.java new file mode 100644 index 0000000..61a8905 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/CommandUse.java @@ -0,0 +1,69 @@ +package assemblyline.common.machine.command; + +import assemblyline.api.IArmbotUseable; +import assemblyline.common.machine.command.Command; +import net.minecraft.block.Block; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class CommandUse +extends Command { + private int times; + private int curTimes; + + @Override + public void onTaskStart() { + this.times = 0; + this.curTimes = 0; + if (this.getArgs().length > 0) { + this.times = this.getIntArg(0); + } + if (this.times <= 0) { + this.times = 1; + } + } + + @Override + protected boolean doTask() { + Block block = this.world.getBlock(this.tileEntity.getHandPosition().intX(), this.tileEntity.getHandPosition().intY(), this.tileEntity.getHandPosition().intZ()); + TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity((IBlockAccess)this.world); + if (targetTile != null) { + if (targetTile instanceof IArmbotUseable) { + ((IArmbotUseable)targetTile).onUse(this.tileEntity, this.getArgs()); + } else if (targetTile instanceof ISidedInventory && this.tileEntity.getGrabbedEntities().size() > 0) { + // empty if block + } + } else if (block != null) { + try { + boolean f = block.onBlockActivated(this.world, this.tileEntity.getHandPosition().intX(), this.tileEntity.getHandPosition().intY(), this.tileEntity.getHandPosition().intZ(), null, 0, 0.0f, 0.0f, 0.0f); + } + catch (Exception e) { + e.printStackTrace(); + } + } + ++this.curTimes; + return this.curTimes < this.times; + } + + @Override + public String toString() { + return "USE " + Integer.toString(this.times); + } + + @Override + public void readFromNBT(NBTTagCompound taskCompound) { + super.readFromNBT(taskCompound); + this.times = taskCompound.getInteger("useTimes"); + this.curTimes = taskCompound.getInteger("useCurTimes"); + } + + @Override + public void writeToNBT(NBTTagCompound taskCompound) { + super.writeToNBT(taskCompound); + taskCompound.setInteger("useTimes", this.times); + taskCompound.setInteger("useCurTimes", this.curTimes); + } +} + diff --git a/src/main/java/assemblyline/common/machine/command/GrabDictionary.java b/src/main/java/assemblyline/common/machine/command/GrabDictionary.java new file mode 100644 index 0000000..d26deeb --- /dev/null +++ b/src/main/java/assemblyline/common/machine/command/GrabDictionary.java @@ -0,0 +1,102 @@ +package assemblyline.common.machine.command; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityBoat; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityChicken; +import net.minecraft.entity.passive.EntityCow; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.entity.passive.EntitySheep; +import net.minecraft.entity.player.EntityPlayer; + +public class GrabDictionary { + private static List grabList = new ArrayList<>(); + private Class entityClass; + private String name; + + public GrabDictionary(String name, Class Class2) { + this.entityClass = Class2; + this.name = name; + } + + public static List getList() { + return grabList; + } + + public static GrabDictionary get(Object ob) { + if (ob instanceof String) { + String name = (String)ob; + for (GrabDictionary ref : grabList) { + if (!ref.getName().equalsIgnoreCase(name)) continue; + return ref; + } + } + if (ob instanceof Class) { + Class cc = (Class)ob; + for (GrabDictionary ref : grabList) { + if (ref.getEntityClass() != cc) continue; + return ref; + } + } + return new GrabDictionary("Entity", Entity.class); + } + + public String getName() { + if (this.name != null) { + return this.name; + } + return ""; + } + + public Class getEntityClass() { + if (this.entityClass != null) { + return this.entityClass; + } + return Entity.class; + } + + public static void registerGrabableEntity(String name, Class eClass) { + GrabDictionary newGrab = new GrabDictionary(name, eClass); + if (!grabList.contains(newGrab)) { + for (GrabDictionary ref : grabList) { + if (!ref.getName().equalsIgnoreCase(name)) continue; + return; + } + GrabDictionary.getList().add(newGrab); + } + } + + public static void registerList() { + GrabDictionary.registerGrabableEntity("chicken", EntityChicken.class); + GrabDictionary.registerGrabableEntity("cow", EntityCow.class); + GrabDictionary.registerGrabableEntity("sheep", EntitySheep.class); + GrabDictionary.registerGrabableEntity("pig", EntityPig.class); + GrabDictionary.registerGrabableEntity("player", EntityPlayer.class); + GrabDictionary.registerGrabableEntity("zombie", EntityZombie.class); + GrabDictionary.registerGrabableEntity("zomb", EntityZombie.class); + GrabDictionary.registerGrabableEntity("skeleton", EntitySkeleton.class); + GrabDictionary.registerGrabableEntity("skel", EntitySkeleton.class); + GrabDictionary.registerGrabableEntity("animal", EntityAnimal.class); + GrabDictionary.registerGrabableEntity("monster", EntityMob.class); + GrabDictionary.registerGrabableEntity("mob", EntityMob.class); + GrabDictionary.registerGrabableEntity("creeper", EntityCreeper.class); + GrabDictionary.registerGrabableEntity("spider", EntitySpider.class); + GrabDictionary.registerGrabableEntity("slime", EntitySlime.class); + GrabDictionary.registerGrabableEntity("items", EntityItem.class); + GrabDictionary.registerGrabableEntity("all", Entity.class); + GrabDictionary.registerGrabableEntity("everything", Entity.class); + GrabDictionary.registerGrabableEntity("boat", EntityBoat.class); + GrabDictionary.registerGrabableEntity("cart", EntityMinecart.class); + } +} + diff --git a/src/main/java/assemblyline/common/machine/crane/BlockCraneController.java b/src/main/java/assemblyline/common/machine/crane/BlockCraneController.java new file mode 100644 index 0000000..3fc5bb4 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/crane/BlockCraneController.java @@ -0,0 +1,64 @@ +package assemblyline.common.machine.crane; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; + +public class BlockCraneController +extends BlockALMachine { + public BlockCraneController() { + super(UniversalElectricity.machine); + this.setBlockName("craneController"); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) { + int rot = (int)Math.min((entity.rotationYaw + 315.0f) % 360.0f / 90.0f, 3.0f); + switch (rot) { + case 0: { + world.setBlockMetadataWithNotify(x, y, z, ForgeDirection.WEST.ordinal(), 3); + break; + } + case 1: { + world.setBlockMetadataWithNotify(x, y, z, ForgeDirection.NORTH.ordinal(), 3); + break; + } + case 2: { + world.setBlockMetadataWithNotify(x, y, z, ForgeDirection.EAST.ordinal(), 3); + break; + } + default: { + world.setBlockMetadataWithNotify(x, y, z, ForgeDirection.SOUTH.ordinal(), 3); + } + } + } + + @Override + @SideOnly(value=Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityCraneController(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/crane/BlockCraneFrame.java b/src/main/java/assemblyline/common/machine/crane/BlockCraneFrame.java new file mode 100644 index 0000000..ec76ae6 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/crane/BlockCraneFrame.java @@ -0,0 +1,126 @@ +package assemblyline.common.machine.crane; + +import assemblyline.client.render.BlockRenderingHandler; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; + +public class BlockCraneFrame +extends BlockALMachine { + public BlockCraneFrame() { + super(UniversalElectricity.machine); + this.setBlockName("craneFrame"); + this.setBlockBounds(0.25f, 0.25f, 0.25f, 0.75f, 0.75f, 0.75f); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + TileEntity tE = world.getTileEntity(x, y, z); + if (tE != null && tE instanceof TileEntityCraneRail) { + AxisAlignedBB middle = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.25, (double)0.75, (double)0.75, (double)0.75); + AxisAlignedBB up = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.75, (double)0.25, (double)0.75, (double)1.0, (double)0.75); + AxisAlignedBB down = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.0, (double)0.25, (double)0.75, (double)0.25, (double)0.75); + AxisAlignedBB left = AxisAlignedBB.getBoundingBox((double)0.0, (double)0.25, (double)0.25, (double)0.25, (double)0.75, (double)0.75); + AxisAlignedBB right = AxisAlignedBB.getBoundingBox((double)0.75, (double)0.25, (double)0.25, (double)1.0, (double)0.75, (double)0.75); + AxisAlignedBB front = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.0, (double)0.75, (double)0.75, (double)0.25); + AxisAlignedBB back = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.75, (double)0.75, (double)0.75, (double)1.0); + boolean connectUp = CraneHelper.canFrameConnectTo(tE, x, y + 1, z, ForgeDirection.DOWN); + boolean connectDown = CraneHelper.canFrameConnectTo(tE, x, y - 1, z, ForgeDirection.UP); + boolean connectLeft = CraneHelper.canFrameConnectTo(tE, x - 1, y, z, ForgeDirection.EAST); + boolean connectRight = CraneHelper.canFrameConnectTo(tE, x + 1, y, z, ForgeDirection.WEST); + boolean connectFront = CraneHelper.canFrameConnectTo(tE, x, y, z - 1, ForgeDirection.SOUTH); + boolean connectBack = CraneHelper.canFrameConnectTo(tE, x, y, z + 1, ForgeDirection.NORTH); + if (connectUp) { + middle.maxY = up.maxY; + } + if (connectDown) { + middle.minY = down.minY; + } + if (connectLeft) { + middle.minX = left.minX; + } + if (connectRight) { + middle.maxX = right.maxX; + } + if (connectFront) { + middle.minZ = front.minZ; + } + if (connectBack) { + middle.maxZ = back.maxZ; + } + this.setBlockBounds((float)middle.minX, (float)middle.minY, (float)middle.minZ, (float)middle.maxX, (float)middle.maxY, (float)middle.maxZ); + middle.offset((double)x, (double)y, (double)z); + return middle; + } + return super.getCollisionBoundingBoxFromPool(world, x, y, z); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + TileEntity tE = world.getTileEntity(x, y, z); + if (tE != null && tE instanceof TileEntityCraneRail) { + AxisAlignedBB middle = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.25, (double)0.75, (double)0.75, (double)0.75); + AxisAlignedBB up = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.75, (double)0.25, (double)0.75, (double)1.0, (double)0.75); + AxisAlignedBB down = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.0, (double)0.25, (double)0.75, (double)0.25, (double)0.75); + AxisAlignedBB left = AxisAlignedBB.getBoundingBox((double)0.0, (double)0.25, (double)0.25, (double)0.25, (double)0.75, (double)0.75); + AxisAlignedBB right = AxisAlignedBB.getBoundingBox((double)0.75, (double)0.25, (double)0.25, (double)1.0, (double)0.75, (double)0.75); + AxisAlignedBB front = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.0, (double)0.75, (double)0.75, (double)0.25); + AxisAlignedBB back = AxisAlignedBB.getBoundingBox((double)0.25, (double)0.25, (double)0.75, (double)0.75, (double)0.75, (double)1.0); + boolean connectUp = CraneHelper.canFrameConnectTo(tE, x, y + 1, z, ForgeDirection.DOWN); + boolean connectDown = CraneHelper.canFrameConnectTo(tE, x, y - 1, z, ForgeDirection.UP); + boolean connectLeft = CraneHelper.canFrameConnectTo(tE, x - 1, y, z, ForgeDirection.EAST); + boolean connectRight = CraneHelper.canFrameConnectTo(tE, x + 1, y, z, ForgeDirection.WEST); + boolean connectFront = CraneHelper.canFrameConnectTo(tE, x, y, z - 1, ForgeDirection.SOUTH); + boolean connectBack = CraneHelper.canFrameConnectTo(tE, x, y, z + 1, ForgeDirection.NORTH); + if (connectUp) { + middle.maxY = up.maxY; + } + if (connectDown) { + middle.minY = down.minY; + } + if (connectLeft) { + middle.minX = left.minX; + } + if (connectRight) { + middle.maxX = right.maxX; + } + if (connectFront) { + middle.minZ = front.minZ; + } + if (connectBack) { + middle.maxZ = back.maxZ; + } + this.setBlockBounds((float)middle.minX, (float)middle.minY, (float)middle.minZ, (float)middle.maxX, (float)middle.maxY, (float)middle.maxZ); + return; + } + this.setBlockBounds(0.25f, 0.25f, 0.25f, 0.75f, 0.75f, 0.75f); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityCraneRail(); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + @SideOnly(value=Side.CLIENT) + public int getRenderType() { + return BlockRenderingHandler.BLOCK_RENDER_ID; + } +} + diff --git a/src/main/java/assemblyline/common/machine/crane/CraneHelper.java b/src/main/java/assemblyline/common/machine/crane/CraneHelper.java new file mode 100644 index 0000000..586d620 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/crane/CraneHelper.java @@ -0,0 +1,59 @@ +package assemblyline.common.machine.crane; + +import assemblyline.api.ICraneConnectable; +import assemblyline.api.ICraneStructure; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class CraneHelper { + public static final int MAX_SIZE = 64; + + public static boolean isCraneBlock(World world, int x, int y, int z) { + return world.getTileEntity(x, y, z) != null && world.getTileEntity(x, y, z) instanceof ICraneConnectable; + } + + public static boolean isCraneStructureBlock(World world, int x, int y, int z) { + return world.getTileEntity(x, y, z) != null && world.getTileEntity(x, y, z) instanceof ICraneStructure; + } + + public static boolean canFrameConnectTo(TileEntity tileEntity, int x, int y, int z, ForgeDirection side) { + if (tileEntity.getWorldObj().getTileEntity(x, y, z) != null && tileEntity.getWorldObj().getTileEntity(x, y, z) instanceof ICraneConnectable) { + return ((ICraneConnectable)tileEntity.getWorldObj().getTileEntity(x, y, z)).canFrameConnectTo(side); + } + return false; + } + + public static ForgeDirection rotateClockwise(ForgeDirection direction) { + if (direction == ForgeDirection.NORTH) { + return ForgeDirection.EAST; + } + if (direction == ForgeDirection.EAST) { + return ForgeDirection.SOUTH; + } + if (direction == ForgeDirection.SOUTH) { + return ForgeDirection.WEST; + } + if (direction == ForgeDirection.WEST) { + return ForgeDirection.NORTH; + } + return ForgeDirection.UNKNOWN; + } + + public static ForgeDirection rotateCounterClockwise(ForgeDirection direction) { + if (direction == ForgeDirection.NORTH) { + return ForgeDirection.WEST; + } + if (direction == ForgeDirection.WEST) { + return ForgeDirection.SOUTH; + } + if (direction == ForgeDirection.SOUTH) { + return ForgeDirection.EAST; + } + if (direction == ForgeDirection.EAST) { + return ForgeDirection.NORTH; + } + return ForgeDirection.UNKNOWN; + } +} + diff --git a/src/main/java/assemblyline/common/machine/crane/TileEntityCraneController.java b/src/main/java/assemblyline/common/machine/crane/TileEntityCraneController.java new file mode 100644 index 0000000..d5d9d0d --- /dev/null +++ b/src/main/java/assemblyline/common/machine/crane/TileEntityCraneController.java @@ -0,0 +1,159 @@ +package assemblyline.common.machine.crane; + +import assemblyline.api.ICraneConnectable; +import assemblyline.common.machine.TileEntityAssemblyNetwork; +import assemblyline.common.machine.crane.CraneHelper; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCraneController +extends TileEntityAssemblyNetwork +implements ICraneConnectable { + int width = 0; + int height = 0; + int depth = 0; + boolean isCraneValid = false; + long ticks = 0L; + + @Override + public void updateEntity() { + ++this.ticks; + if (this.ticks % 20L == 0L) { + this.validateCrane(); + } + } + + public boolean isCraneValid() { + return this.isCraneValid; + } + + private void validateCrane() { + this.isCraneValid = false; + this.depth = 0; + this.height = 0; + this.width = 0; + this.findCraneHeight(); + this.findCraneWidth(); + this.findCraneDepth(); + if (Math.abs(this.height) > 1 && Math.abs(this.width) > 1 && Math.abs(this.depth) > 1) { + this.isCraneValid = this.isFrameValid(); + } + } + + private boolean isFrameValid() { + int z; + int x; + for (x = Math.min(0, this.width); x <= Math.max(0, this.width); ++x) { + if (CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord + x, this.yCoord + this.height, this.zCoord)) continue; + return false; + } + for (x = Math.min(0, this.width); x <= Math.max(0, this.width); ++x) { + if (CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord + x, this.yCoord + this.height, this.zCoord + this.depth)) continue; + return false; + } + for (z = Math.min(0, this.depth); z <= Math.max(0, this.depth); ++z) { + if (CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord, this.yCoord + this.height, this.zCoord + z)) continue; + return false; + } + for (z = Math.min(0, this.depth); z <= Math.max(0, this.depth); ++z) { + if (CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord + this.width, this.yCoord + this.height, this.zCoord + z)) continue; + return false; + } + for (x = Math.min(this.width + 1, 1); x <= Math.max(-1, this.width - 1); ++x) { + for (int z2 = Math.min(this.depth + 1, 1); z2 <= Math.max(-1, this.depth - 1); ++z2) { + if (this.worldObj.isAirBlock(this.xCoord + x, this.yCoord + this.height, this.zCoord + z2)) continue; + return false; + } + } + return true; + } + + private void findCraneWidth() { + if (this.height == 0) { + this.width = 0; + return; + } + int x = 0; + ForgeDirection facing = ForgeDirection.getOrientation((int)this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord)); + while (Math.abs(x) <= 64 && CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord + x, this.yCoord + this.height, this.zCoord)) { + if (facing == ForgeDirection.NORTH || facing == ForgeDirection.EAST) { + ++x; + continue; + } + --x; + } + this.width = x; + if (this.width < 0) { + ++this.width; + } + if (this.width > 0) { + --this.width; + } + } + + private void findCraneHeight() { + int y; + for (y = 1; this.yCoord + y < 256 && y <= 64 && CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord, this.yCoord + y, this.zCoord); ++y) { + } + this.height = y - 1; + } + + private void findCraneDepth() { + if (this.height == 0) { + this.width = 0; + return; + } + int z = 0; + ForgeDirection facing = ForgeDirection.getOrientation((int)this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord)); + while (Math.abs(z) <= 64 && CraneHelper.isCraneStructureBlock(this.worldObj, this.xCoord, this.yCoord + this.height, this.zCoord + z)) { + if (facing == ForgeDirection.SOUTH || facing == ForgeDirection.EAST) { + ++z; + continue; + } + --z; + } + this.depth = z; + if (this.depth < 0) { + ++this.depth; + } + if (this.depth > 0) { + --this.depth; + } + } + + @Override + public boolean canFrameConnectTo(ForgeDirection side) { + ForgeDirection facing = ForgeDirection.getOrientation((int)this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord)); + if (side == facing) { + return true; + } + if (side == CraneHelper.rotateClockwise(facing)) { + return true; + } + return side == ForgeDirection.UP; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("width", this.width); + nbt.setInteger("height", this.height); + nbt.setInteger("depth", this.depth); + nbt.setBoolean("isValid", this.isCraneValid); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.width = nbt.getInteger("width"); + this.height = nbt.getInteger("height"); + this.depth = nbt.getInteger("depth"); + this.isCraneValid = nbt.getBoolean("isValid"); + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return true; + } +} + diff --git a/src/main/java/assemblyline/common/machine/crane/TileEntityCraneRail.java b/src/main/java/assemblyline/common/machine/crane/TileEntityCraneRail.java new file mode 100644 index 0000000..9eb5bb5 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/crane/TileEntityCraneRail.java @@ -0,0 +1,20 @@ +package assemblyline.common.machine.crane; + +import assemblyline.api.ICraneStructure; +import assemblyline.common.machine.TileEntityAssemblyNetwork; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCraneRail +extends TileEntityAssemblyNetwork +implements ICraneStructure { + @Override + public boolean canFrameConnectTo(ForgeDirection side) { + return true; + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return false; + } +} + diff --git a/src/main/java/assemblyline/common/machine/detector/BlockDetector.java b/src/main/java/assemblyline/common/machine/detector/BlockDetector.java new file mode 100644 index 0000000..3f57baa --- /dev/null +++ b/src/main/java/assemblyline/common/machine/detector/BlockDetector.java @@ -0,0 +1,146 @@ +package assemblyline.common.machine.detector; + +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.machine.detector.TileEntityDetector; +import assemblyline.common.machine.imprinter.BlockImprintable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.core.UniversalElectricity; + +public class BlockDetector +extends BlockImprintable { + IIcon eye_red; + IIcon eye_green; + + public BlockDetector() { + super("detector", UniversalElectricity.machine, TabAssemblyLine.INSTANCE); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) { + int angle = MathHelper.floor_double((double)((double)(entity.rotationYaw * 4.0f / 360.0f) + 0.5)) & 3; + int change = 2; + switch (angle) { + case 0: { + change = ForgeDirection.NORTH.ordinal(); + break; + } + case 1: { + change = ForgeDirection.EAST.ordinal(); + break; + } + case 2: { + change = ForgeDirection.SOUTH.ordinal(); + break; + } + case 3: { + change = ForgeDirection.WEST.ordinal(); + } + } + if (entity.rotationPitch < -70.0f) { + change = ForgeDirection.DOWN.ordinal(); + } + if (entity.rotationPitch > 70.0f) { + change = ForgeDirection.UP.ordinal(); + } + world.setBlockMetadataWithNotify(x, y, z, change, 3); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg) { + super.registerBlockIcons(iconReg); + this.eye_green = iconReg.registerIcon("assemblyline:detector_green"); + this.eye_red = iconReg.registerIcon("assemblyline:detector_red"); + } + + @Override + public IIcon getIcon(IBlockAccess iBlockAccess, int x, int y, int z, int side) { + TileEntity tileEntity = iBlockAccess.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityDetector && side == ForgeDirection.getOrientation((int)iBlockAccess.getBlockMetadata(x, y, z)).ordinal()) { + if (((TileEntityDetector)tileEntity).isInverted()) { + return this.eye_red; + } + return this.eye_green; + } + return this.machine_icon; + } + + @Override + public IIcon getIcon(int side, int metadata) { + if (side == ForgeDirection.SOUTH.ordinal()) { + return this.eye_green; + } + return this.machine_icon; + } + + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + world.setBlockMetadataWithNotify(x, y, z, side, 3); + return true; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block blockID) { + if (!this.canBlockStay(world, x, y, z)) { + this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + world.setBlock(x, y, z, Blocks.air, 0, 3); + } + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + public boolean isBlockNormalCube(World world, int x, int y, int z) { + return false; + } + + @Override + public boolean isBlockSolid(IBlockAccess par1iBlockAccess, int par2, int par3, int par4, int par5) { + return false; + } + + public boolean isBlockSolidOnSide(World world, int x, int y, int z, ForgeDirection side) { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int direction) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityDetector) { + return ((TileEntityDetector)tileEntity).isPoweringTo(ForgeDirection.getOrientation((int)direction)); + } + return 0; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int direction) { + return this.isProvidingStrongPower(world, x, y, z, direction); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityDetector(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/detector/TileEntityDetector.java b/src/main/java/assemblyline/common/machine/detector/TileEntityDetector.java new file mode 100644 index 0000000..d3173ce --- /dev/null +++ b/src/main/java/assemblyline/common/machine/detector/TileEntityDetector.java @@ -0,0 +1,85 @@ +package assemblyline.common.machine.detector; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.imprinter.TileEntityFilterable; +import java.util.ArrayList; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityDetector +extends TileEntityFilterable { + private boolean powering = false; + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.worldObj.isRemote && this.ticks % 10L == 0L) { + int metadata = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + AxisAlignedBB testArea = AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)); + ForgeDirection dir = ForgeDirection.getOrientation((int)metadata); + testArea.offset((double)dir.offsetX, (double)dir.offsetY, (double)dir.offsetZ); + ArrayList entities = (ArrayList)this.worldObj.getEntitiesWithinAABB(EntityItem.class, testArea); + boolean powerCheck = false; + if (entities.size() > 0) { + if (this.getFilter() != null) { + for (int i = 0; i < entities.size(); ++i) { + EntityItem e = (EntityItem)entities.get(i); + ItemStack itemStack = e.getEntityItem(); + powerCheck = this.isFiltering(itemStack); + } + } else { + powerCheck = true; + } + } else { + powerCheck = false; + } + if (powerCheck != this.powering) { + this.powering = powerCheck; + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, AssemblyLine.blockDetector); + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, AssemblyLine.blockDetector); + for (int x = this.xCoord - 1; x <= this.xCoord + 1; ++x) { + for (int z = this.zCoord - 1; z <= this.zCoord + 1; ++z) { + this.worldObj.notifyBlocksOfNeighborChange(x, this.yCoord + 1, z, AssemblyLine.blockDetector); + } + } + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + + @Override + public void invalidate() { + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, AssemblyLine.blockDetector); + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, AssemblyLine.blockDetector); + super.invalidate(); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + this.powering = tag.getBoolean("powering"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + tag.setBoolean("powering", this.powering); + } + + public int isPoweringTo(ForgeDirection side) { + return this.powering && this.getDirection() != side.getOpposite() ? 15 : 0; + } + + public boolean isIndirectlyPoweringTo(ForgeDirection side) { + return this.isPoweringTo(side) > 0; + } + + @Override + public boolean canConnect(ForgeDirection direction) { + return direction != this.getDirection(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/BlockEncoder.java b/src/main/java/assemblyline/common/machine/encoder/BlockEncoder.java new file mode 100644 index 0000000..c044f59 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/BlockEncoder.java @@ -0,0 +1,64 @@ +package assemblyline.common.machine.encoder; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockEncoder +extends BlockALMachine { + IIcon encoder_side; + IIcon encoder_top; + IIcon encoder_bottom; + + public BlockEncoder() { + super(Material.wood); + this.setBlockName("encoder"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg) { + this.encoder_side = iconReg.registerIcon("assemblyline:encoder_side"); + this.encoder_top = iconReg.registerIcon("assemblyline:encoder_top"); + this.encoder_bottom = iconReg.registerIcon("assemblyline:encoder_bottom"); + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + return this.getIcon(side, 0); + } + + @Override + public IIcon getIcon(int side, int meta) { + if (side == 1) { + return this.encoder_top; + } + if (side == 0) { + return this.encoder_bottom; + } + return this.encoder_side; + } + + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int par6, float par7, float par8, float par9) { + if (!world.isRemote) { + entityPlayer.openGui((Object)AssemblyLine.instance, 2, world, x, y, z); + } + return true; + } + + public TileEntity createNewTileEntity(World world, int metadata) { + return new TileEntityEncoder(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/ContainerEncoder.java b/src/main/java/assemblyline/common/machine/encoder/ContainerEncoder.java new file mode 100644 index 0000000..ff8b2b0 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/ContainerEncoder.java @@ -0,0 +1,60 @@ +package assemblyline.common.machine.encoder; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.imprinter.SlotCustom; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerEncoder +extends Container { + public static final int Y_OFFSET = 0; + private ItemStack[] containingItems = new ItemStack[1]; + private InventoryPlayer inventoryPlayer; + private TileEntityEncoder tileEntity; + + public ContainerEncoder(InventoryPlayer inventoryPlayer, TileEntityEncoder encoder) { + int var3; + this.inventoryPlayer = inventoryPlayer; + this.tileEntity = encoder; + this.addSlotToContainer(new SlotCustom((IInventory)encoder, 0, 80, 24, new ItemStack(AssemblyLine.itemDisk))); + for (var3 = 0; var3 < 3; ++var3) { + for (int var4 = 0; var4 < 9; ++var4) { + this.addSlotToContainer(new Slot((IInventory)inventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 155 + var3 * 18 + 0)); + } + } + for (var3 = 0; var3 < 9; ++var3) { + this.addSlotToContainer(new Slot((IInventory)inventoryPlayer, var3, 8 + var3 * 18, 213)); + } + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileEntity.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int slot) { + ItemStack copyStack = null; + Slot slotObj = (Slot)this.inventorySlots.get(slot); + if (slotObj != null && slotObj.getHasStack()) { + ItemStack slotStack = slotObj.getStack(); + copyStack = slotStack.copy(); + if (slot >= 1 ? this.getSlot(0).isItemValid(slotStack) && !this.mergeItemStack(slotStack, 0, 1, false) : !this.mergeItemStack(slotStack, this.containingItems.length, 37, false)) { + return null; + } + if (slotStack.stackSize == 0) { + slotObj.putStack((ItemStack)null); + } else { + slotObj.onSlotChanged(); + } + if (slotStack.stackSize == copyStack.stackSize) { + return null; + } + slotObj.onPickupFromSlot(player, slotStack); + } + return copyStack; + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/IInventoryWatcher.java b/src/main/java/assemblyline/common/machine/encoder/IInventoryWatcher.java new file mode 100644 index 0000000..c02ffbc --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/IInventoryWatcher.java @@ -0,0 +1,6 @@ +package assemblyline.common.machine.encoder; + +public interface IInventoryWatcher { + public void inventoryChanged(); +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/ItemDisk.java b/src/main/java/assemblyline/common/machine/encoder/ItemDisk.java new file mode 100644 index 0000000..6beee16 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/ItemDisk.java @@ -0,0 +1,79 @@ +package assemblyline.common.machine.encoder; + +import assemblyline.common.TabAssemblyLine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class ItemDisk +extends Item { + public ItemDisk() { + super(); + this.setUnlocalizedName("disk"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + this.setHasSubtypes(true); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerIcons(IIconRegister par1IconRegister) { + this.itemIcon = par1IconRegister.registerIcon("assemblyline:disk"); + } + + @Override + public int getItemStackLimit() { + return 1; + } + + @Override + public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List list, boolean par4) { + ArrayList commands = ItemDisk.getCommands(itemStack); + if (commands.size() > 0) { + if (commands.size() == 1) { + list.add(commands.size() + " command"); + } else { + list.add(commands.size() + " commands"); + } + } else { + list.add("No commands"); + } + } + + public static void setCommands(ItemStack itemStack, ArrayList commands) { + if (itemStack.getTagCompound() == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + NBTTagList nbt = new NBTTagList(); + for (int i = 0; i < commands.size(); ++i) { + if (commands.get(i) == null) continue; + NBTTagCompound newCompound = new NBTTagCompound(); + newCompound.setString("command", (String)commands.get(i)); + nbt.appendTag((NBTBase)newCompound); + } + itemStack.getTagCompound().setTag("Commands", (NBTBase)nbt); + } + + public static ArrayList getCommands(ItemStack itemStack) { + ArrayList commands = new ArrayList(); + if (itemStack.getTagCompound() == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound nbt = itemStack.getTagCompound(); + NBTTagList tagList = nbt.getTagList("Commands", 10); + for (int i = 0; i < tagList.tagCount(); ++i) { + NBTTagCompound curTag = tagList.getCompoundTagAt(i); + String cmd = curTag.getString("command"); + commands.add(cmd); + } + return commands; + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/SlotDisk.java b/src/main/java/assemblyline/common/machine/encoder/SlotDisk.java new file mode 100644 index 0000000..3615bce --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/SlotDisk.java @@ -0,0 +1,18 @@ +package assemblyline.common.machine.encoder; + +import assemblyline.common.AssemblyLine; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotDisk +extends Slot { + public SlotDisk(IInventory par1iInventory, int par2, int par3, int par4) { + super(par1iInventory, par2, par3, par4); + } + + public boolean isItemValid(ItemStack itemStack) { + return itemStack.getItem() == AssemblyLine.itemDisk; + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/SlotDiskResult.java b/src/main/java/assemblyline/common/machine/encoder/SlotDiskResult.java new file mode 100644 index 0000000..3289f23 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/SlotDiskResult.java @@ -0,0 +1,28 @@ +package assemblyline.common.machine.encoder; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotDiskResult +extends Slot { + public SlotDiskResult(IInventory par1iInventory, int par2, int par3, int par4) { + super(par1iInventory, par2, par3, par4); + } + + public boolean isItemValid(ItemStack par1ItemStack) { + return false; + } + + public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack) { + super.onPickupFromSlot(par1EntityPlayer, par2ItemStack); + if (this.inventory.getStackInSlot(0) != null) { + --this.inventory.getStackInSlot((int)0).stackSize; + if (this.inventory.getStackInSlot((int)0).stackSize <= 0) { + this.inventory.setInventorySlotContents(0, null); + } + } + } +} + diff --git a/src/main/java/assemblyline/common/machine/encoder/TileEntityEncoder.java b/src/main/java/assemblyline/common/machine/encoder/TileEntityEncoder.java new file mode 100644 index 0000000..99cd121 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/encoder/TileEntityEncoder.java @@ -0,0 +1,163 @@ +package assemblyline.common.machine.encoder; + +import assemblyline.common.machine.command.Command; +import assemblyline.common.machine.encoder.IInventoryWatcher; +import assemblyline.common.machine.encoder.ItemDisk; +import com.google.common.io.ByteArrayDataInput; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import java.util.ArrayList; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public class TileEntityEncoder +extends TileEntityAdvanced +implements ISidedInventory { + private ItemStack disk; + private IInventoryWatcher watcher; + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + if (slot == 0) { + return this.disk; + } + return null; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + if (slot == 0 && amount >= 1) { + ItemStack ret = this.disk.copy(); + this.disk = null; + return ret; + } + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + if (slot == 0) { + if (stack != null && stack.stackSize > 1) { + stack.stackSize = 1; + } + this.disk = stack; + } + } + + @Override + public void markDirty() { + super.markDirty(); + if (this.watcher != null) { + this.watcher.inventoryChanged(); + } + } + + @Override + public String getInventoryName() { + return "Encoder"; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5, (double)this.yCoord + 0.5, (double)this.zCoord + 0.5) <= 64.0; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + public void setWatcher(IInventoryWatcher watcher) { + this.watcher = watcher; + } + + public IInventoryWatcher getWatcher() { + return this.watcher; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if (this.disk != null) { + NBTTagCompound diskNBT = new NBTTagCompound(); + this.disk.writeToNBT(diskNBT); + nbt.setTag("disk", diskNBT); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagCompound diskNBT = nbt.getCompoundTag("disk"); + if (diskNBT != null) { + this.disk = ItemStack.loadItemStackFromNBT((NBTTagCompound)diskNBT); + } + } + + public void handleMessage(NBTTagCompound nbt) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER && this.disk != null) { + ArrayList tempCmds = ItemDisk.getCommands(this.disk); + if (nbt.getBoolean("create")) { + String newCommand = nbt.getString("newCommand"); + String commandName = newCommand.split(" ")[0]; + if (Command.getCommand(commandName) != null) { + tempCmds.add(newCommand); + } + } else { + int commandToRemove = nbt.getInteger("commandToRemove"); + tempCmds.remove(commandToRemove); + } + ItemDisk.setCommands(this.disk, tempCmds); + } + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return false; + } + + @Override + public boolean canExtractItem(int arg0, ItemStack arg1, int arg2) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean canInsertItem(int arg0, ItemStack arg1, int arg2) { + // TODO Auto-generated method stub + return false; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return side == ForgeDirection.UP.ordinal() ? new int[] {0} : new int[0]; + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/BlockImprintable.java b/src/main/java/assemblyline/common/machine/imprinter/BlockImprintable.java new file mode 100644 index 0000000..e3b837f --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/BlockImprintable.java @@ -0,0 +1,123 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.api.IFilterable; +import assemblyline.common.block.BlockALMachine; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import universalelectricity.prefab.implement.IRedstoneReceptor; + +public abstract class BlockImprintable +extends BlockALMachine { + public BlockImprintable(String name, Material material, CreativeTabs creativeTab) { + super(material); + this.setBlockName(name); + this.setCreativeTab(creativeTab); + } + + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof IFilterable) { + ItemStack containingStack = ((IFilterable)tileEntity).getFilter(); + if (containingStack != null) { + if (!world.isRemote) { + EntityItem dropStack = new EntityItem(world, player.posX, player.posY, player.posZ, containingStack); + dropStack.delayBeforeCanPickup = 0; + world.spawnEntityInWorld((Entity)dropStack); + } + ((IFilterable)tileEntity).setFilter(null); + return true; + } + if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemImprinter) { + ((IFilterable)tileEntity).setFilter(player.getCurrentEquippedItem()); + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + return true; + } + } + return false; + } + + @Override + public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TileEntityFilterable) { + ((TileEntityFilterable)tileEntity).toggleInversion(); + world.markBlockRangeForRenderUpdate(x, y, z, x, y, z); + world.markBlockForUpdate(x, y, z); + } + return true; + } + + @Override + public boolean onSneakMachineActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.onMachineActivated(world, x, y, z, player, side, hitX, hitY, hitZ); + } + + @Override + public void onNeighborBlockChange(World par1World, int x, int y, int z, Block side) { + super.onNeighborBlockChange(par1World, x, y, z, side); + TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity instanceof IRedstoneReceptor && par1World.isBlockIndirectlyGettingPowered(x, y, z)) { + ((IRedstoneReceptor)par1World.getTileEntity(x, y, z)).onPowerOn(); + } + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase par5EntityLiving, ItemStack stack) { + int angle = MathHelper.floor_double((double)((double)(par5EntityLiving.rotationYaw * 4.0f / 360.0f) + 0.5)) & 3; + int change = 2; + switch (angle) { + case 0: { + change = 2; + break; + } + case 1: { + change = 5; + break; + } + case 2: { + change = 3; + break; + } + case 3: { + change = 4; + } + } + world.setBlockMetadataWithNotify(x, y, z, change, 3); + } + + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + int original = world.getBlockMetadata(x, y, z); + int change = 2; + switch (original) { + case 2: { + change = 4; + break; + } + case 3: { + change = 5; + break; + } + case 4: { + change = 3; + break; + } + case 5: { + change = 2; + } + } + world.setBlockMetadataWithNotify(x, y, z, change, 3); + return true; + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/BlockImprinter.java b/src/main/java/assemblyline/common/machine/imprinter/BlockImprinter.java new file mode 100644 index 0000000..d64d029 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/BlockImprinter.java @@ -0,0 +1,117 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.TabAssemblyLine; +import assemblyline.common.block.BlockALMachine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockImprinter +extends BlockALMachine { + IIcon imprinter_side; + IIcon imprinter_top; + IIcon imprinter_bottom; + + public BlockImprinter() { + super(Material.wood); + this.setBlockName("imprinter"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg) { + this.imprinter_side = iconReg.registerIcon("assemblyline:imprinter_side"); + this.imprinter_top = iconReg.registerIcon("assemblyline:imprinter_top"); + this.imprinter_bottom = iconReg.registerIcon("assemblyline:imprinter_bottom"); + } + + @Override + @SideOnly(value=Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + return this.getIcon(side, 0); + } + + @Override + public IIcon getIcon(int side, int meta) { + if (side == 1) { + return this.imprinter_top; + } + if (side == 0) { + return this.imprinter_bottom; + } + return this.imprinter_side; + } + + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int par6, float par7, float par8, float par9) { + if (!world.isRemote) { + entityPlayer.openGui((Object)AssemblyLine.instance, 1, world, x, y, z); + } + return true; + } + + @Override + public void dropEntireInventory(World par1World, int x, int y, int z, Block par5, int par6) { + TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TileEntityImprinter) { + TileEntityImprinter inventory = (TileEntityImprinter)tileEntity; + for (int i = 0; i < inventory.getSizeInventory(); ++i) { + ItemStack itemStack = inventory.getStackInSlot(i); + if (itemStack == null) continue; + Random random = new Random(); + float var8 = random.nextFloat() * 0.8f + 0.1f; + float var9 = random.nextFloat() * 0.8f + 0.1f; + float var10 = random.nextFloat() * 0.8f + 0.1f; + while (itemStack.stackSize > 0) { + int var11 = random.nextInt(21) + 10; + if (var11 > itemStack.stackSize) { + var11 = itemStack.stackSize; + } + itemStack.stackSize -= var11; + if (i == inventory.imprinterMatrix.length + 9 - 1) continue; + EntityItem entityItem = new EntityItem(par1World, (double)((float)x + var8), (double)((float)y + var9), (double)((float)z + var10), new ItemStack(itemStack.getItem(), var11, itemStack.getItemDamage())); + if (itemStack.hasTagCompound()) { + entityItem.getEntityItem().setTagCompound((NBTTagCompound)itemStack.getTagCompound().copy()); + } + float var13 = 0.05f; + entityItem.motionX = (float)random.nextGaussian() * var13; + entityItem.motionY = (float)random.nextGaussian() * var13 + 0.2f; + entityItem.motionZ = (float)random.nextGaussian() * var13; + par1World.spawnEntityInWorld((Entity)entityItem); + } + } + } + } + + @Override + public boolean onUseWrench(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int side, float hitX, float hitY, float hitZ) { + TileEntity tileEntity = par1World.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityImprinter) { + ((TileEntityImprinter)tileEntity).searchInventories = !((TileEntityImprinter)tileEntity).searchInventories; + par1World.markBlockForUpdate(x, y, z); + return true; + } + return false; + } + + @Override + public TileEntity createNewTileEntity(World var1, int meta) { + return new TileEntityImprinter(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/ContainerImprinter.java b/src/main/java/assemblyline/common/machine/imprinter/ContainerImprinter.java new file mode 100644 index 0000000..f3c6ef3 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/ContainerImprinter.java @@ -0,0 +1,100 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.machine.imprinter.ISlotWatcher; +import assemblyline.common.machine.imprinter.SlotCraftingResult; +import assemblyline.common.machine.imprinter.SlotCustom; +import assemblyline.common.machine.imprinter.TileEntityImprinter; +import assemblyline.common.machine.imprinter.WatchedSlot; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerImprinter +extends Container +implements ISlotWatcher { + public InventoryPlayer inventoryPlayer; + public TileEntityImprinter tileEntity; + + public ContainerImprinter(InventoryPlayer inventoryPlayer, TileEntityImprinter tileEntity) { + int var3; + this.tileEntity = tileEntity; + this.tileEntity.container = this; + this.inventoryPlayer = inventoryPlayer; + for (int x = 0; x < 3; ++x) { + for (int y = 0; y < 3; ++y) { + this.addSlotToContainer(new WatchedSlot((IInventory)this.tileEntity, y + x * 3, 9 + y * 18, 16 + x * 18, this)); + } + } + this.addSlotToContainer(new SlotCustom((IInventory)this.tileEntity, 9, 68, 34, new ItemStack(AssemblyLine.itemImprint))); + this.addSlotToContainer(new WatchedSlot((IInventory)this.tileEntity, 10, 92, 34, this)); + this.addSlotToContainer(new SlotCraftingResult(this, (IInventory)this.tileEntity, 11, 148, 34)); + for (int ii = 0; ii < 2; ++ii) { + for (int i = 0; i < 9; ++i) { + this.addSlotToContainer(new WatchedSlot((IInventory)this.tileEntity, i + ii * 9 + 12, 8 + i * 18, 80 + ii * 18, this)); + } + } + for (var3 = 0; var3 < 3; ++var3) { + for (int var4 = 0; var4 < 9; ++var4) { + this.addSlotToContainer(new WatchedSlot((IInventory)inventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 120 + var3 * 18, this)); + } + } + for (var3 = 0; var3 < 9; ++var3) { + this.addSlotToContainer(new WatchedSlot((IInventory)inventoryPlayer, var3, 8 + var3 * 18, 178, this)); + } + this.tileEntity.openInventory(); + } + + public void onContainerClosed(EntityPlayer par1EntityPlayer) { + super.onContainerClosed(par1EntityPlayer); + this.tileEntity.closeInventory(); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileEntity.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int slot) { + ItemStack copyStack = null; + Slot slotObj = (Slot)this.inventorySlots.get(slot); + if (slotObj != null && slotObj.getHasStack()) { + ItemStack slotStack = slotObj.getStack(); + copyStack = slotStack.copy(); + if (slot == 12 - 1) { + this.tileEntity.setInventorySlotContents(12 - 1, null); + } + if (slot > this.tileEntity.getSizeInventory() - 1) { + if (this.getSlot(9).isItemValid(slotStack)) { + if (!this.mergeItemStack(slotStack, 9, 9 + 1, true)) { + return null; + } + } else if (!this.mergeItemStack(slotStack, 12, this.tileEntity.getSizeInventory(), false)) { + return null; + } + } else if (!this.mergeItemStack(slotStack, this.tileEntity.getSizeInventory(), this.tileEntity.getSizeInventory() + 36, false)) { + return null; + } + if (slotStack.stackSize == 0) { + slotObj.putStack(null); + } else { + slotObj.onSlotChanged(); + } + if (slotStack.stackSize == copyStack.stackSize) { + return null; + } + slotObj.onPickupFromSlot(player, slotStack); + } + this.slotContentsChanged(); + return copyStack; + } + + @Override + public void slotContentsChanged() { + this.tileEntity.markDirty(); + this.detectAndSendChanges(); + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/ISlotWatcher.java b/src/main/java/assemblyline/common/machine/imprinter/ISlotWatcher.java new file mode 100644 index 0000000..ff3fbb1 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/ISlotWatcher.java @@ -0,0 +1,6 @@ +package assemblyline.common.machine.imprinter; + +public interface ISlotWatcher { + public void slotContentsChanged(); +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/ItemImprinter.java b/src/main/java/assemblyline/common/machine/imprinter/ItemImprinter.java new file mode 100644 index 0000000..3d52f83 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/ItemImprinter.java @@ -0,0 +1,92 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.common.TabAssemblyLine; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentText; + +public class ItemImprinter +extends Item { + public ItemImprinter() { + super(); + this.setUnlocalizedName("imprint"); + this.setCreativeTab(TabAssemblyLine.INSTANCE); + this.setHasSubtypes(true); + } + + @Override + @SideOnly(value=Side.CLIENT) + public void registerIcons(IIconRegister par1IconRegister) { + this.itemIcon = par1IconRegister.registerIcon("assemblyline:imprint"); + } + + @Override + public int getItemStackLimit() { + return 1; + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { + if (entity != null && !(entity instanceof IProjectile) && !(entity instanceof EntityPlayer)) { + String stringName = EntityList.getEntityString((Entity)entity); + player.addChatMessage(new ChatComponentText("Target: " + stringName)); + return true; + } + return false; + } + + @Override + public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List list, boolean par4) { + List filterItems = ItemImprinter.getFilters(itemStack); + if (filterItems.size() > 0) { + for (ItemStack filterItem : filterItems) { + list.add(filterItem.getDisplayName()); + } + } else { + list.add("No filters"); + } + } + + public static void setFilters(ItemStack itemStack, ArrayList filterStacks) { + if (itemStack.getTagCompound() == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + NBTTagList nbt = new NBTTagList(); + for (int i = 0; i < filterStacks.size(); ++i) { + if (filterStacks.get(i) == null) continue; + NBTTagCompound newCompound = new NBTTagCompound(); + newCompound.setByte("Slot", (byte)i); + ((ItemStack)filterStacks.get(i)).writeToNBT(newCompound); + nbt.appendTag((NBTBase)newCompound); + } + itemStack.getTagCompound().setTag("Items", (NBTBase)nbt); + } + + public static ArrayList getFilters(ItemStack itemStack) { + ArrayList filterStacks = new ArrayList(); + if (itemStack.getTagCompound() == null) { + itemStack.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound nbt = itemStack.getTagCompound(); + NBTTagList tagList = nbt.getTagList("Items", 10); + for (int i = 0; i < tagList.tagCount(); ++i) { + NBTTagCompound var4 = (NBTTagCompound)tagList.getCompoundTagAt(i); + byte var5 = var4.getByte("Slot"); + filterStacks.add(ItemStack.loadItemStackFromNBT((NBTTagCompound)var4)); + } + return filterStacks; + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/SlotCraftingResult.java b/src/main/java/assemblyline/common/machine/imprinter/SlotCraftingResult.java new file mode 100644 index 0000000..0cd7c20 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/SlotCraftingResult.java @@ -0,0 +1,31 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.common.machine.imprinter.ContainerImprinter; +import assemblyline.common.machine.imprinter.WatchedSlot; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class SlotCraftingResult +extends WatchedSlot { + private ContainerImprinter container; + + public SlotCraftingResult(ContainerImprinter container, IInventory inventory, int par2, int par3, int par4) { + super(inventory, par2, par3, par4, container); + this.container = container; + } + + public boolean isItemValid(ItemStack itemStack) { + return false; + } + + public boolean canTakeStack(EntityPlayer player) { + return true; + } + + public void onPickupFromSlot(EntityPlayer entityPlayer, ItemStack itemStack) { + this.container.tileEntity.onPickUpFromResult(entityPlayer, itemStack); + super.onPickupFromSlot(entityPlayer, itemStack); + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/SlotCustom.java b/src/main/java/assemblyline/common/machine/imprinter/SlotCustom.java new file mode 100644 index 0000000..fcebeaa --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/SlotCustom.java @@ -0,0 +1,20 @@ +package assemblyline.common.machine.imprinter; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotCustom +extends Slot { + private ItemStack itemStack; + + public SlotCustom(IInventory par1iInventory, int par2, int par3, int par4, ItemStack itemStack) { + super(par1iInventory, par2, par3, par4); + this.itemStack = itemStack; + } + + public boolean isItemValid(ItemStack itemStack) { + return itemStack.isItemEqual(this.itemStack); + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/SlotImprintResult.java b/src/main/java/assemblyline/common/machine/imprinter/SlotImprintResult.java new file mode 100644 index 0000000..856170b --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/SlotImprintResult.java @@ -0,0 +1,28 @@ +package assemblyline.common.machine.imprinter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotImprintResult +extends Slot { + public SlotImprintResult(IInventory par1iInventory, int par2, int par3, int par4) { + super(par1iInventory, par2, par3, par4); + } + + public boolean isItemValid(ItemStack par1ItemStack) { + return false; + } + + public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack) { + super.onPickupFromSlot(par1EntityPlayer, par2ItemStack); + if (this.inventory.getStackInSlot(0) != null) { + --this.inventory.getStackInSlot((int)0).stackSize; + if (this.inventory.getStackInSlot((int)0).stackSize <= 0) { + this.inventory.setInventorySlotContents(0, null); + } + } + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/TileEntityFilterable.java b/src/main/java/assemblyline/common/machine/imprinter/TileEntityFilterable.java new file mode 100644 index 0000000..ae66eac --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/TileEntityFilterable.java @@ -0,0 +1,116 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.api.IFilterable; +import assemblyline.common.machine.TileEntityAssemblyNetwork; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import java.util.ArrayList; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import universalelectricity.prefab.implement.IRotatable; + +public abstract class TileEntityFilterable +extends TileEntityAssemblyNetwork +implements IRotatable, +IFilterable { + private ItemStack filterItem; + private boolean inverted; + + public boolean isFiltering(ItemStack itemStack) { + ArrayList checkStacks; + if (this.getFilter() != null && itemStack != null && (checkStacks = ItemImprinter.getFilters(this.getFilter())) != null) { + for (int i = 0; i < checkStacks.size(); ++i) { + if (checkStacks.get(i) == null || !((ItemStack)checkStacks.get(i)).isItemEqual(itemStack)) continue; + return !this.inverted; + } + } + return this.inverted; + } + + @Override + public void setFilter(ItemStack filter) { + this.filterItem = filter; + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public ItemStack getFilter() { + return this.filterItem; + } + + public void setInverted(boolean inverted) { + this.inverted = inverted; + if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + public boolean isInverted() { + return this.inverted; + } + + public void toggleInversion() { + this.setInverted(!this.isInverted()); + } + + @Override + public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) { + return ForgeDirection.getOrientation((int)this.getBlockMetadata()); + } + + @Override + public void setDirection(World world, int x, int y, int z, ForgeDirection facingDirection) { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal(), 3); + } + + public void setDirection(ForgeDirection facingDirection) { + this.setDirection(this.worldObj, this.xCoord, this.yCoord, this.zCoord, facingDirection); + } + + public ForgeDirection getDirection() { + return this.getDirection((IBlockAccess)this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + this.writeToNBT(tag); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, getBlockMetadata(), tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + if (this.worldObj.isRemote) { + this.readFromNBT(pkt.func_148857_g()); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagCompound filter = new NBTTagCompound(); + if (this.getFilter() != null) { + this.getFilter().writeToNBT(filter); + } + nbt.setTag("filter", (NBTBase)filter); + nbt.setBoolean("inverted", this.inverted); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.inverted = nbt.getBoolean("inverted"); + NBTTagCompound filter = nbt.getCompoundTag("filter"); + this.filterItem = ItemStack.loadItemStackFromNBT((NBTTagCompound)filter); + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/TileEntityImprinter.java b/src/main/java/assemblyline/common/machine/imprinter/TileEntityImprinter.java new file mode 100644 index 0000000..12bf683 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/TileEntityImprinter.java @@ -0,0 +1,488 @@ +package assemblyline.common.machine.imprinter; + +import assemblyline.api.IArmbot; +import assemblyline.api.IArmbotUseable; +import assemblyline.common.Pair; + +import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; +import cpw.mods.fml.relauncher.ReflectionHelper; +import cpw.mods.fml.relauncher.Side; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import universalelectricity.core.vector.Vector3; +import universalelectricity.core.vector.VectorHelper; +import universalelectricity.prefab.TranslationHelper; +import universalelectricity.prefab.multiblock.TileEntityMulti; +import universalelectricity.prefab.tile.TileEntityAdvanced; + +public class TileEntityImprinter +extends TileEntityAdvanced +implements ISidedInventory, IArmbotUseable { + public static final int IMPRINTER_MATRIX_START = 9; + public static final int INVENTORY_START = 12; + public ItemStack[] craftingMatrix = new ItemStack[9]; + public ItemStack[] imprinterMatrix = new ItemStack[3]; + public ItemStack[] containingItems = new ItemStack[18]; + public ContainerImprinter container; + private boolean isImprinting = false; + public boolean searchInventories = true; + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public int getSizeInventory() { + return this.craftingMatrix.length + this.imprinterMatrix.length + this.containingItems.length; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) { + if (slot < this.getSizeInventory()) { + if (slot < 9) { + this.craftingMatrix[slot] = itemStack; + } else if (slot < 12) { + this.imprinterMatrix[slot - 9] = itemStack; + } else { + this.containingItems[slot - 12] = itemStack; + } + } + } + + @Override + public ItemStack decrStackSize(int i, int amount) { + if (this.getStackInSlot(i) != null) { + if (this.getStackInSlot((int)i).stackSize <= amount) { + ItemStack var3 = this.getStackInSlot(i); + this.setInventorySlotContents(i, null); + return var3; + } + ItemStack var3 = this.getStackInSlot(i).splitStack(amount); + if (this.getStackInSlot((int)i).stackSize == 0) { + this.setInventorySlotContents(i, null); + } + return var3; + } + return null; + } + + @Override + public ItemStack getStackInSlot(int slot) { + if (slot < 9) { + return this.craftingMatrix[slot]; + } + if (slot < 12) { + return this.imprinterMatrix[slot - 9]; + } + return this.containingItems[slot - 12]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + if (this.getStackInSlot(slot) != null) { + ItemStack var2 = this.getStackInSlot(slot); + this.setInventorySlotContents(slot, null); + return var2; + } + return null; + } + + @Override + public String getInventoryName() { + return TranslationHelper.getLocal("tile.imprinter.name"); + } + + @Override + public void openInventory() { + this.markDirty(); + } + + @Override + public void closeInventory() { + this.markDirty(); + } + + public InventoryCrafting getCraftingMatrix() { + if (this.container != null) { + InventoryCrafting inventoryCrafting = new InventoryCrafting((Container)this.container, 3, 3); + for (int i = 0; i < this.craftingMatrix.length; ++i) { + inventoryCrafting.setInventorySlotContents(i, this.craftingMatrix[i]); + } + return inventoryCrafting; + } + return null; + } + + public void replaceCraftingMatrix(InventoryCrafting inventoryCrafting) { + for (int i = 0; i < this.craftingMatrix.length; ++i) { + this.craftingMatrix[i] = inventoryCrafting.getStackInSlot(i); + } + } + + public boolean isMatrixEmpty() { + for (int i = 0; i < 9; ++i) { + if (this.craftingMatrix[i] == null) continue; + return false; + } + return true; + } + + @Override + public void markDirty() { + if (!this.worldObj.isRemote) { + this.isImprinting = false; + if (this.isMatrixEmpty() && this.imprinterMatrix[0] != null && this.imprinterMatrix[1] != null && this.imprinterMatrix[0].getItem() instanceof ItemImprinter) { + ItemStack outputStack = this.imprinterMatrix[0].copy(); + outputStack.stackSize = 1; + ArrayList filters = ItemImprinter.getFilters(outputStack); + boolean filteringItemExists = false; + for (ItemStack filteredStack : filters) { + if (!filteredStack.isItemEqual(this.imprinterMatrix[1])) continue; + filters.remove(filteredStack); + filteringItemExists = true; + break; + } + if (!filteringItemExists) { + filters.add(this.imprinterMatrix[1]); + } + ItemImprinter.setFilters(outputStack, filters); + this.imprinterMatrix[2] = outputStack; + this.isImprinting = true; + } + if (!this.isImprinting) { + ItemStack matrixOutput; + System.out.println("Crafting"); + this.imprinterMatrix[2] = null; + boolean didCraft = false; + InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); + if (inventoryCrafting != null && (matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj)) != null) { + System.out.println("Using crafting grid"); + this.imprinterMatrix[2] = matrixOutput; + didCraft = true; + } + if (this.imprinterMatrix[0] != null && !didCraft && this.imprinterMatrix[0].getItem() instanceof ItemImprinter) { + System.out.println("Using imprint as grid"); + ArrayList filters = ItemImprinter.getFilters(this.imprinterMatrix[0]); + for (ItemStack outputStack : filters) { + Pair idealRecipe; + if (outputStack == null || (idealRecipe = this.getIdealRecipe(outputStack)) == null) continue; + ItemStack recipeOutput = (ItemStack)idealRecipe.getKey(); + System.out.println("Ideal R: " + recipeOutput.toString()); + if (!(recipeOutput != null & recipeOutput.stackSize > 0)) continue; + this.imprinterMatrix[2] = recipeOutput; + didCraft = true; + break; + } + } + if (!didCraft) { + this.imprinterMatrix[2] = null; + } + } + } + } + + public void onPickUpFromResult(EntityPlayer entityPlayer, ItemStack itemStack) { + block9: { + block11: { + block10: { + if (itemStack == null) break block9; + if (!this.isImprinting) break block10; + this.imprinterMatrix[0] = null; + break block9; + } + if (this.getIdealRecipe(itemStack) == null) break block11; + ItemStack[] requiredItems = (ItemStack[])((ItemStack[])this.getIdealRecipe(itemStack).getValue()).clone(); + if (requiredItems == null) break block9; + block2: for (ItemStack searchStack : requiredItems) { + if (searchStack == null) continue; + block3: for (IInventory inventory : this.getAvaliableInventories()) { + for (int i = 0; i < inventory.getSizeInventory(); ++i) { + ItemStack checkStack = inventory.getStackInSlot(i); + if (checkStack == null || !searchStack.isItemEqual(checkStack) && (searchStack.getItem() != checkStack.getItem() || searchStack.getItemDamage() >= 0)) continue; + inventory.decrStackSize(i, 1); + break block3; + } + } + for (int i = 0; i < this.containingItems.length; ++i) { + ItemStack checkStack = this.containingItems[i]; + if (checkStack == null || !searchStack.isItemEqual(checkStack) && (searchStack.getItem() != checkStack.getItem() || searchStack.getItemDamage() >= 0)) continue; + this.decrStackSize(i + 12, 1); + continue block2; + } + } + break block9; + } + try { + InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); + MinecraftForge.EVENT_BUS.post(new ItemCraftedEvent(entityPlayer, itemStack, inventoryCrafting)); + for (int var3 = 0; var3 < inventoryCrafting.getSizeInventory(); ++var3) { + ItemStack var4 = inventoryCrafting.getStackInSlot(var3); + if (var4 == null) continue; + inventoryCrafting.decrStackSize(var3, 1); + if (!var4.getItem().hasContainerItem()) continue; + ItemStack var5 = var4.getItem().getContainerItem(var4); + if (var5.isItemStackDamageable() && var5.getItemDamage() > var5.getMaxDamage()) { + MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(entityPlayer, var5)); + var5 = null; + } + if (var5 == null || var4.getItem().doesContainerItemLeaveCraftingGrid(var4) && entityPlayer.inventory.addItemStackToInventory(var5)) continue; + if (inventoryCrafting.getStackInSlot(var3) == null) { + inventoryCrafting.setInventorySlotContents(var3, var5); + continue; + } + //entityPlayer.func_71021_b(var5); + //TODO: WTF + entityPlayer.dropPlayerItemWithRandomChoice(var5, false); + } + this.replaceCraftingMatrix(inventoryCrafting); + } + catch (Exception e) { + System.out.println("Imprinter: Failed to craft item: " + itemStack.getDisplayName()); + e.printStackTrace(); + } + } + } + + public Pair getIdealRecipe(ItemStack outputItem) { + for (Object object : CraftingManager.getInstance().getRecipeList()) { + ArrayList hasResources; + Object oreRecipeInput; + if (!(object instanceof IRecipe) || ((IRecipe)object).getRecipeOutput() == null || !outputItem.isItemEqual(((IRecipe)object).getRecipeOutput())) continue; + if (object instanceof ShapedRecipes) { + if (this.hasResource((Object[])((ShapedRecipes)object).recipeItems) == null) continue; + return new Pair(((IRecipe)object).getRecipeOutput().copy(), ((ShapedRecipes)object).recipeItems); + } + if (object instanceof ShapelessRecipes) { + if (this.hasResource((Object[])((ShapelessRecipes)object).recipeItems.toArray(new ItemStack[1])) == null) continue; + return new Pair(((IRecipe)object).getRecipeOutput().copy(), ((ShapelessRecipes)object).recipeItems.toArray(new ItemStack[1])); + } + if (object instanceof ShapedOreRecipe) { + ShapedOreRecipe oreRecipe = (ShapedOreRecipe)object; + oreRecipeInput = (Object[])ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, oreRecipe, new String[]{"input"}); + hasResources = this.hasResource((Object[])oreRecipeInput); + if (hasResources == null) continue; + return new Pair(((IRecipe)object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); + } + if (!(object instanceof ShapelessOreRecipe)) continue; + ShapelessOreRecipe oreRecipe = (ShapelessOreRecipe)object; + oreRecipeInput = (ArrayList)ReflectionHelper.getPrivateValue(ShapelessOreRecipe.class, oreRecipe, new String[]{"input"}); + hasResources = this.hasResource(((ArrayList)oreRecipeInput).toArray()); + if (hasResources == null) continue; + return new Pair(((IRecipe)object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); + } + return null; + } + + public ArrayList hasResource(Object[] recipeItems) { + try { + TileEntityImprinter dummyImprinter = new TileEntityImprinter(); + NBTTagCompound cloneData = new NBTTagCompound(); + this.writeToNBT(cloneData); + dummyImprinter.readFromNBT(cloneData); + ArrayList actualResources = new ArrayList(); + int itemMatch = 0; + block2: for (Object obj : recipeItems) { + if (obj instanceof ItemStack) { + ItemStack recipeItem = (ItemStack)obj; + actualResources.add(recipeItem.copy()); + if (recipeItem == null || !this.doesItemExist(recipeItem, dummyImprinter)) continue; + ++itemMatch; + continue; + } + if (!(obj instanceof ArrayList)) continue; + ArrayList ingredientsList = (ArrayList)obj; + Object[] ingredientsArray = ingredientsList.toArray(); + for (int x = 0; x < ingredientsArray.length; ++x) { + if (ingredientsArray[x] == null || !(ingredientsArray[x] instanceof ItemStack)) continue; + ItemStack recipeItem = (ItemStack)ingredientsArray[x]; + actualResources.add(recipeItem.copy()); + if (recipeItem == null || !this.doesItemExist(recipeItem, dummyImprinter)) continue; + ++itemMatch; + continue block2; + } + } + return itemMatch >= actualResources.size() ? actualResources : null; + } + catch (Exception e) { + System.out.println("Failed to find recipes in the imprinter."); + e.printStackTrace(); + return null; + } + } + + private boolean doesItemExist(ItemStack recipeItem, TileEntityImprinter dummyImprinter) { + for (int i = 0; i < dummyImprinter.containingItems.length; ++i) { + ItemStack checkStack = dummyImprinter.containingItems[i]; + if (checkStack == null || !recipeItem.isItemEqual(checkStack) && (recipeItem.getItem() != checkStack.getItem() || recipeItem.getItemDamage() >= 0)) continue; + dummyImprinter.decrStackSize(i + 12, 1); + return true; + } + return false; + } + + private List getAvaliableInventories() { + ArrayList inventories = new ArrayList<>(); + if (this.searchInventories) { + block0: for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + TileEntity tileEntity = VectorHelper.getTileEntityFromSide(this.worldObj, new Vector3(this), direction); + if (tileEntity == null) continue; + if (tileEntity instanceof TileEntityMulti) { + Vector3 mainBlockPosition = ((TileEntityMulti)tileEntity).mainBlockPosition; + if (mainBlockPosition == null || !(mainBlockPosition.getTileEntity(this.worldObj) instanceof IInventory)) continue; + inventories.add(((IInventory)mainBlockPosition.getTileEntity(this.worldObj))); + continue; + } + if (tileEntity instanceof TileEntityChest) { + inventories.add(((TileEntityChest)tileEntity)); + for (int i = 2; i < 6; ++i) { + TileEntity chest = VectorHelper.getTileEntityFromSide(this.worldObj, new Vector3(tileEntity), ForgeDirection.getOrientation(2)); + if (chest == null || chest.getClass() != tileEntity.getClass()) continue; + inventories.add(((TileEntityChest)chest)); + continue block0; + } + continue; + } + if (!(tileEntity instanceof IInventory) || tileEntity instanceof TileEntityImprinter) continue; + inventories.add(((IInventory)tileEntity)); + } + } + return inventories; + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setBoolean("searchInventories", this.searchInventories); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, getBlockMetadata(), nbt); + } + + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + if (this.worldObj.isRemote) { + NBTTagCompound nbt = pkt.func_148857_g(); + this.searchInventories = nbt.getBoolean("searchInventories"); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + NBTTagList var2 = nbt.getTagList("Items", 10); + this.craftingMatrix = new ItemStack[9]; + this.imprinterMatrix = new ItemStack[3]; + this.containingItems = new ItemStack[18]; + for (int i = 0; i < var2.tagCount(); ++i) { + NBTTagCompound var4 = (NBTTagCompound)var2.getCompoundTagAt(i); + byte var5 = var4.getByte("Slot"); + if (var5 < 0 || var5 >= this.getSizeInventory()) continue; + this.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT((NBTTagCompound)var4)); + } + this.searchInventories = nbt.getBoolean("searchInventories"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + NBTTagList var2 = new NBTTagList(); + for (int i = 0; i < this.getSizeInventory(); ++i) { + if (this.getStackInSlot(i) == null) continue; + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte)i); + this.getStackInSlot(i).writeToNBT(var4); + var2.appendTag((NBTBase)var4); + } + nbt.setTag("Items", (NBTBase)var2); + nbt.setBoolean("searchInventories", this.searchInventories); + } + + @Override + public boolean onUse(IArmbot armbot, String[] args) { + this.markDirty(); + if (this.imprinterMatrix[2] != null) { + armbot.grabItem(this.imprinterMatrix[2].copy()); + this.onPickUpFromResult(null, this.imprinterMatrix[2]); + this.imprinterMatrix[2] = null; + } + return false; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return true; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq((double)this.xCoord + 0.5, (double)this.yCoord + 0.5, (double)this.zCoord + 0.5) <= 64.0; + } + + @Override + public int[] getAccessibleSlotsFromSide(int var1) { + int startIndex = getStartInventorySide(ForgeDirection.getOrientation(var1)); + int size = getSizeInventorySide(ForgeDirection.getOrientation(var1)); + int[] slots = new int[size]; + for (int i = 0; i < size; i++) { + slots[i] = startIndex + i; + } + return slots; + } + + @Override + public boolean canInsertItem(int i, ItemStack itemstack, int j) { + return this.isItemValidForSlot(i, itemstack); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemstack, int j) { + return false; + } + + public int getStartInventorySide(ForgeDirection side) { + if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) { + return this.craftingMatrix.length + this.imprinterMatrix.length; + } + return this.craftingMatrix.length + 1; + } + + public int getSizeInventorySide(ForgeDirection side) { + if (side == ForgeDirection.DOWN || side == ForgeDirection.UP) { + return this.containingItems.length - 1; + } + return 1; + } +} + diff --git a/src/main/java/assemblyline/common/machine/imprinter/WatchedSlot.java b/src/main/java/assemblyline/common/machine/imprinter/WatchedSlot.java new file mode 100644 index 0000000..d5582f8 --- /dev/null +++ b/src/main/java/assemblyline/common/machine/imprinter/WatchedSlot.java @@ -0,0 +1,21 @@ +package assemblyline.common.machine.imprinter; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; + +public class WatchedSlot +extends Slot { + private ISlotWatcher slotWatcher; + + public WatchedSlot(IInventory inventory, int id, int xPosition, int yPosition, ISlotWatcher slotWatcher) { + super(inventory, id, xPosition, yPosition); + this.slotWatcher = slotWatcher; + } + + public void onSlotChanged() { + if (this.slotWatcher != null) { + this.slotWatcher.slotContentsChanged(); + } + } +} + diff --git a/src/main/java/assemblyline/common/network/MessageEncoder.java b/src/main/java/assemblyline/common/network/MessageEncoder.java new file mode 100644 index 0000000..8d68bcd --- /dev/null +++ b/src/main/java/assemblyline/common/network/MessageEncoder.java @@ -0,0 +1,52 @@ +package assemblyline.common.network; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import universalelectricity.core.vector.Vector3; + +public class MessageEncoder implements IMessage { + + public NBTTagCompound nbt; + public Vector3 tileLocation; + + public MessageEncoder() {} + + public MessageEncoder(Vector3 pos, NBTTagCompound nbt) { + this.nbt = nbt; + this.tileLocation = pos; + } + + @Override + public void fromBytes(ByteBuf bytes) { + DataInputStream stream = new DataInputStream(new ByteBufInputStream(bytes)); + try { + NBTTagCompound recTag = CompressedStreamTools.read(stream); + tileLocation = Vector3.readFromNBT(recTag.getCompoundTag("tilePos")); + nbt = recTag.getCompoundTag("data"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void toBytes(ByteBuf bytes) { + NBTTagCompound sendTag = new NBTTagCompound(); + sendTag.setTag("tilePos", tileLocation.writeToNBT(new NBTTagCompound())); + sendTag.setTag("data", nbt); + DataOutputStream stream = new DataOutputStream(new ByteBufOutputStream(bytes)); + try { + CompressedStreamTools.write(sendTag, stream); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/assemblyline/common/network/MessageEncoderHandler.java b/src/main/java/assemblyline/common/network/MessageEncoderHandler.java new file mode 100644 index 0000000..924ffbf --- /dev/null +++ b/src/main/java/assemblyline/common/network/MessageEncoderHandler.java @@ -0,0 +1,23 @@ +package assemblyline.common.network; + +import assemblyline.common.machine.encoder.TileEntityEncoder; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.tileentity.TileEntity; + +public class MessageEncoderHandler implements IMessageHandler { + + @Override + public IMessage onMessage(MessageEncoder msg, MessageContext ctx) { + if (ctx.side == Side.SERVER) { + TileEntity tile = msg.tileLocation.getTileEntity(ctx.getServerHandler().playerEntity.worldObj); + if (tile instanceof TileEntityEncoder) { + ((TileEntityEncoder)tile).handleMessage(msg.nbt); + } + } + return null; + } + +} diff --git a/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java new file mode 100755 index 0000000..4f84caa --- /dev/null +++ b/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -0,0 +1,315 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api; + +import dan200.computercraft.api.filesystem.IMount; +import dan200.computercraft.api.filesystem.IWritableMount; +import dan200.computercraft.api.media.IMediaProvider; +import dan200.computercraft.api.peripheral.IPeripheralProvider; +import dan200.computercraft.api.permissions.ITurtlePermissionProvider; +import dan200.computercraft.api.redstone.IBundledRedstoneProvider; +import dan200.computercraft.api.turtle.ITurtleUpgrade; +import net.minecraft.world.World; + +import java.lang.reflect.Method; + +/** + * The static entry point to the ComputerCraft API. + * Members in this class must be called after mod_ComputerCraft has been initialised, + * but may be called before it is fully loaded. + */ +public final class ComputerCraftAPI +{ + public static boolean isInstalled() + { + findCC(); + return computerCraft != null; + } + + public static String getInstalledVersion() + { + findCC(); + if( computerCraft_getVersion != null ) + { + try { + return (String)computerCraft_getVersion.invoke( null ); + } catch (Exception e) { + // It failed + } + } + return ""; + } + + public static String getAPIVersion() + { + return "1.75"; + } + + /** + * Creates a numbered directory in a subfolder of the save directory for a given world, and returns that number.
+ * Use in conjuction with createSaveDirMount() to create a unique place for your peripherals or media items to store files.
+ * @param world The world for which the save dir should be created. This should be the serverside world object. + * @param parentSubPath The folder path within the save directory where the new directory should be created. eg: "computercraft/disk" + * @return The numerical value of the name of the new folder, or -1 if the folder could not be created for some reason.
+ * eg: if createUniqueNumberedSaveDir( world, "computer/disk" ) was called returns 42, then "computer/disk/42" is now available for writing. + * @see #createSaveDirMount(World, String, long) + */ + public static int createUniqueNumberedSaveDir( World world, String parentSubPath ) + { + findCC(); + if( computerCraft_createUniqueNumberedSaveDir != null ) + { + try { + return (Integer)computerCraft_createUniqueNumberedSaveDir.invoke( null, world, parentSubPath ); + } catch (Exception e) { + // It failed + } + } + return -1; + } + + /** + * Creates a file system mount that maps to a subfolder of the save directory for a given world, and returns it.
+ * Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a folder from the + * users save directory onto a computers file system.
+ * @param world The world for which the save dir can be found. This should be the serverside world object. + * @param subPath The folder path within the save directory that the mount should map to. eg: "computer/disk/42".
+ * Use createUniqueNumberedSaveDir() to create a new numbered folder to use. + * @param capacity The ammount of data that can be stored in the directory before it fills up, in bytes. + * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() + * to mount this on a Computers' file system. + * @see #createUniqueNumberedSaveDir(World, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, dan200.computercraft.api.filesystem.IWritableMount) + * @see dan200.computercraft.api.filesystem.IMount + * @see IWritableMount + */ + public static IWritableMount createSaveDirMount( World world, String subPath, long capacity ) + { + findCC(); + if( computerCraft_createSaveDirMount != null ) + { + try { + return (IWritableMount)computerCraft_createSaveDirMount.invoke( null, world, subPath, capacity ); + } catch (Exception e){ + // It failed + } + } + return null; + } + + /** + * Creates a file system mount to a resource folder, and returns it.
+ * Use in conjuction with IComputerAccess.mount() or IComputerAccess.mountWritable() to mount a resource folder onto a computers file system.
+ * The files in this mount will be a combination of files in the specified mod jar, and resource packs that contain resources with the same domain and path.
+ * @param modClass A class in whose jar to look first for the resources to mount. Using your main mod class is recommended. eg: MyMod.class + * @param domain The domain under which to look for resources. eg: "mymod" + * @param subPath The domain under which to look for resources. eg: "mymod/lua/myfiles" + * @return The mount, or null if it could be created for some reason. Use IComputerAccess.mount() or IComputerAccess.mountWritable() + * to mount this on a Computers' file system. + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, IWritableMount) + * @see dan200.computercraft.api.filesystem.IMount + */ + public static IMount createResourceMount( Class modClass, String domain, String subPath ) + { + findCC(); + if( computerCraft_createResourceMount != null ) + { + try { + return (IMount)computerCraft_createResourceMount.invoke( null, modClass, domain, subPath ); + } catch (Exception e){ + // It failed + } + } + return null; + } + + /** + * Registers a peripheral handler to convert blocks into IPeripheral implementations. + * @see dan200.computercraft.api.peripheral.IPeripheral + * @see dan200.computercraft.api.peripheral.IPeripheralProvider + */ + public static void registerPeripheralProvider( IPeripheralProvider handler ) + { + findCC(); + if ( computerCraft_registerPeripheralProvider != null) + { + try { + computerCraft_registerPeripheralProvider.invoke( null, handler ); + } catch (Exception e){ + // It failed + } + } + } + + /** + * Registers a new turtle turtle for use in ComputerCraft. After calling this, + * users should be able to craft Turtles with your new turtle. It is recommended to call + * this during the load() method of your mod. + * @see dan200.computercraft.api.turtle.ITurtleUpgrade + */ + public static void registerTurtleUpgrade( ITurtleUpgrade upgrade ) + { + if( upgrade != null ) + { + findCC(); + if( computerCraft_registerTurtleUpgrade != null ) + { + try { + computerCraft_registerTurtleUpgrade.invoke( null, upgrade ); + } catch( Exception e ) { + // It failed + } + } + } + } + + /** + * Registers a bundled redstone handler to provide bundled redstone output for blocks + * @see dan200.computercraft.api.redstone.IBundledRedstoneProvider + */ + public static void registerBundledRedstoneProvider( IBundledRedstoneProvider handler ) + { + findCC(); + if( computerCraft_registerBundledRedstoneProvider != null ) + { + try { + computerCraft_registerBundledRedstoneProvider.invoke( null, handler ); + } catch (Exception e) { + // It failed + } + } + } + + /** + * If there is a Computer or Turtle at a certain position in the world, get it's bundled redstone output. + * @see dan200.computercraft.api.redstone.IBundledRedstoneProvider + * @return If there is a block capable of emitting bundled redstone at the location, it's signal (0-65535) will be returned. + * If there is no block capable of emitting bundled redstone at the location, -1 will be returned. + */ + public static int getBundledRedstoneOutput( World world, int x, int y, int z, int side ) + { + findCC(); + if( computerCraft_getDefaultBundledRedstoneOutput != null ) + { + try { + return (Integer)computerCraft_getDefaultBundledRedstoneOutput.invoke( null, world, x, y, z, side ); + } catch (Exception e){ + // It failed + } + } + return -1; + } + + /** + * Registers a media handler to provide IMedia implementations for Items + * @see dan200.computercraft.api.media.IMediaProvider + */ + public static void registerMediaProvider( IMediaProvider handler ) + { + findCC(); + if( computerCraft_registerMediaProvider != null ) + { + try { + computerCraft_registerMediaProvider.invoke( null, handler ); + } catch (Exception e){ + // It failed + } + } + } + + /** + * Registers a permission handler to restrict where turtles can move or build + * @see dan200.computercraft.api.permissions.ITurtlePermissionProvider + */ + public static void registerPermissionProvider( ITurtlePermissionProvider handler ) + { + findCC(); + if( computerCraft_registerPermissionProvider != null ) + { + try { + computerCraft_registerPermissionProvider.invoke( null, handler ); + } catch (Exception e) { + // It failed + } + } + } + + // The functions below here are private, and are used to interface with the non-API ComputerCraft classes. + // Reflection is used here so you can develop your mod without decompiling ComputerCraft and including + // it in your solution, and so your mod won't crash if ComputerCraft is installed. + + private static void findCC() + { + if( !ccSearched ) { + try { + computerCraft = Class.forName( "dan200.computercraft.ComputerCraft" ); + computerCraft_getVersion = findCCMethod( "getVersion", new Class[]{ + } ); + computerCraft_createUniqueNumberedSaveDir = findCCMethod( "createUniqueNumberedSaveDir", new Class[]{ + World.class, String.class + } ); + computerCraft_createSaveDirMount = findCCMethod( "createSaveDirMount", new Class[] { + World.class, String.class, Long.TYPE + } ); + computerCraft_createResourceMount = findCCMethod( "createResourceMount", new Class[] { + Class.class, String.class, String.class + } ); + computerCraft_registerPeripheralProvider = findCCMethod( "registerPeripheralProvider", new Class[] { + IPeripheralProvider.class + } ); + computerCraft_registerTurtleUpgrade = findCCMethod( "registerTurtleUpgrade", new Class[] { + ITurtleUpgrade.class + } ); + computerCraft_registerBundledRedstoneProvider = findCCMethod( "registerBundledRedstoneProvider", new Class[] { + IBundledRedstoneProvider.class + } ); + computerCraft_getDefaultBundledRedstoneOutput = findCCMethod( "getDefaultBundledRedstoneOutput", new Class[] { + World.class, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE + } ); + computerCraft_registerMediaProvider = findCCMethod( "registerMediaProvider", new Class[] { + IMediaProvider.class + } ); + computerCraft_registerPermissionProvider = findCCMethod( "registerPermissionProvider", new Class[] { + ITurtlePermissionProvider.class + } ); + } catch( Exception e ) { + System.out.println( "ComputerCraftAPI: ComputerCraft not found." ); + } finally { + ccSearched = true; + } + } + } + + private static Method findCCMethod( String name, Class[] args ) + { + try { + if( computerCraft != null ) + { + return computerCraft.getMethod( name, args ); + } + return null; + } catch( NoSuchMethodException e ) { + System.out.println( "ComputerCraftAPI: ComputerCraft method " + name + " not found." ); + return null; + } + } + + private static boolean ccSearched = false; + private static Class computerCraft = null; + private static Method computerCraft_getVersion = null; + private static Method computerCraft_createUniqueNumberedSaveDir = null; + private static Method computerCraft_createSaveDirMount = null; + private static Method computerCraft_createResourceMount = null; + private static Method computerCraft_registerPeripheralProvider = null; + private static Method computerCraft_registerTurtleUpgrade = null; + private static Method computerCraft_registerBundledRedstoneProvider = null; + private static Method computerCraft_getDefaultBundledRedstoneOutput = null; + private static Method computerCraft_registerMediaProvider = null; + private static Method computerCraft_registerPermissionProvider = null; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/IMount.java b/src/main/java/dan200/computercraft/api/filesystem/IMount.java new file mode 100755 index 0000000..cf884d9 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/IMount.java @@ -0,0 +1,57 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.filesystem; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** + * Represents a read only part of a virtual filesystem that can be mounted onto a computercraft using IComputerAccess.mount(). + * Ready made implementations of this interface can be created using ComputerCraftAPI.createSaveDirMount() or ComputerCraftAPI.createResourceMount(), or you're free to implement it yourselves! + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mount(String, IMount) + * @see IWritableMount + */ +public interface IMount +{ + /** + * Returns whether a file with a given path exists or not. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return true if the file exists, false otherwise + */ + public boolean exists( String path ) throws IOException; + + /** + * Returns whether a file with a given path is a directory or not. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprograms" + * @return true if the file exists and is a directory, false otherwise + */ + public boolean isDirectory( String path ) throws IOException; + + /** + * Returns the file names of all the files in a directory. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprograms" + * @param contents A list of strings. Add all the file names to this list + */ + public void list( String path, List contents ) throws IOException; + + /** + * Returns the size of a file with a given path, in bytes + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return the size of the file, in bytes + */ + public long getSize( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an inputstream representing it's contents. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream representing the contents of the file + */ + public InputStream openForRead( String path ) throws IOException; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java new file mode 100755 index 0000000..ffe3290 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/IWritableMount.java @@ -0,0 +1,52 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.filesystem; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * Represents a part of a virtual filesystem that can be mounted onto a computercraft using IComputerAccess.mount() or IComputerAccess.mountWritable(), that can also be written to. + * Ready made implementations of this interface can be created using ComputerCraftAPI.createSaveDirMount(), or you're free to implement it yourselves! + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.peripheral.IComputerAccess#mountWritable(String, dan200.computercraft.api.filesystem.IMount) + * @see dan200.computercraft.api.filesystem.IMount + */ +public interface IWritableMount extends IMount +{ + /** + * Creates a directory at a given path inside the virtual file system. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/mynewprograms" + */ + public void makeDirectory( String path ) throws IOException; + + /** + * Deletes a directory at a given path inside the virtual file system. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myoldprograms" + */ + public void delete( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an outputstream for writing to it. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream for writing to + */ + public OutputStream openForWrite( String path ) throws IOException; + + /** + * Opens a file with a given path, and returns an outputstream for appending to it. + * @param path A file path in normalised format, relative to the mount location. ie: "programs/myprogram" + * @return a stream for writing to + */ + public OutputStream openForAppend( String path ) throws IOException; + + /** + * Get the ammount of free space on the mount, in bytes. You should decrease this value as the user writes to the mount, and write operations should fail once it reaches zero. + * @return The ammount of free space, in bytes. + */ + public long getRemainingSpace() throws IOException; +} diff --git a/src/main/java/dan200/computercraft/api/filesystem/package-info.java b/src/main/java/dan200/computercraft/api/filesystem/package-info.java new file mode 100755 index 0000000..d7a2d59 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/filesystem/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|FileSystem", apiVersion="1.75" ) +package dan200.computercraft.api.filesystem; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaContext.java b/src/main/java/dan200/computercraft/api/lua/ILuaContext.java new file mode 100755 index 0000000..1ffbeea --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaContext.java @@ -0,0 +1,58 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An interface passed to peripherals and ILuaObjects' by computers or turtles, providing methods + * that allow the peripheral call to wait for events before returning, just like in lua. + * This is very useful if you need to signal work to be performed on the main thread, and don't want to return + * until the work has been completed. + */ +public interface ILuaContext +{ + /** + * Wait for an event to occur on the computercraft, suspending the thread until it arises. This method is exactly equivalent to os.pullEvent() in lua. + * @param filter A specific event to wait for, or null to wait for any event + * @return An object array containing the name of the event that occurred, and any event parameters + * @throws Exception If the user presses CTRL+T to terminate the current program while pullEvent() is waiting for an event, a "Terminated" exception will be thrown here. + * Do not attempt to common this exception, unless you wish to prevent termination, which is not recommended. + * @throws InterruptedException If the user shuts down or reboots the computercraft while pullEvent() is waiting for an event, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + */ + public Object[] pullEvent( String filter ) throws LuaException, InterruptedException; + + /** + * The same as pullEvent(), except "terminated" events are ignored. Only use this if you want to prevent program termination, which is not recommended. This method is exactly equivalent to os.pullEventRaw() in lua. + * @param filter A specific event to wait for, or null to wait for any event + * @return An object array containing the name of the event that occurred, and any event parameters + * @throws InterruptedException If the user shuts down or reboots the computercraft while pullEventRaw() is waiting for an event, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + * @see #pullEvent(String) + */ + public Object[] pullEventRaw( String filter ) throws InterruptedException; + + /** + * Yield the current coroutine with some arguments until it is resumed. This method is exactly equivalent to coroutine.yield() in lua. Use pullEvent() if you wish to wait for events. + * @param arguments An object array containing the arguments to pass to coroutine.yield() + * @return An object array containing the return values from coroutine.yield() + * @throws InterruptedException If the user shuts down or reboots the computercraft the coroutine is suspended, InterruptedException will be thrown. This exception must not be caught or intercepted, or the computercraft will leak memory and end up in a broken state. + * @see #pullEvent(String) + */ + public Object[] yield( Object[] arguments ) throws InterruptedException; + + /** + * TODO: Document me + * @param task + * @return + */ + public Object[] executeMainThreadTask( ILuaTask task ) throws LuaException, InterruptedException; + + /** + * TODO: Document me + * @param task + * @return + */ + public long issueMainThreadTask( ILuaTask task ) throws LuaException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaObject.java b/src/main/java/dan200/computercraft/api/lua/ILuaObject.java new file mode 100755 index 0000000..abd8b40 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaObject.java @@ -0,0 +1,26 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An interface for representing custom objects returned by IPeripheral.callMethod() calls. + * Return objects implementing this interface to expose objects with methods to lua. + */ +public interface ILuaObject +{ + /** + * Get the names of the methods that this object implements. This works the same as IPeripheral.getMethodNames(). See that method for detailed documentation. + * @see dan200.computercraft.api.peripheral.IPeripheral#getMethodNames() + */ + public String[] getMethodNames(); + + /** + * Called when a user calls one of the methods that this object implements. This works the same as IPeripheral.callMethod(). See that method for detailed documentation. + * @see dan200.computercraft.api.peripheral.IPeripheral#callMethod(dan200.computercraft.api.peripheral.IComputerAccess, ILuaContext, int, Object[]) + */ + public Object[] callMethod( ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/ILuaTask.java b/src/main/java/dan200/computercraft/api/lua/ILuaTask.java new file mode 100755 index 0000000..45feead --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/ILuaTask.java @@ -0,0 +1,12 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +public interface ILuaTask +{ + public Object[] execute() throws LuaException; +} diff --git a/src/main/java/dan200/computercraft/api/lua/LuaException.java b/src/main/java/dan200/computercraft/api/lua/LuaException.java new file mode 100755 index 0000000..6683c4b --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/LuaException.java @@ -0,0 +1,36 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.lua; + +/** + * An exception representing an error in Lua, like that raised by the error() function + */ +public class LuaException extends Exception +{ + private final int m_level; + + public LuaException() + { + this( "error", 1 ); + } + + public LuaException( String message ) + { + this( message, 1 ); + } + + public LuaException( String message, int level ) + { + super( message ); + m_level = level; + } + + public int getLevel() + { + return m_level; + } +} diff --git a/src/main/java/dan200/computercraft/api/lua/package-info.java b/src/main/java/dan200/computercraft/api/lua/package-info.java new file mode 100755 index 0000000..3ea3d91 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/lua/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Lua", apiVersion="1.75" ) +package dan200.computercraft.api.lua; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/media/IMedia.java b/src/main/java/dan200/computercraft/api/media/IMedia.java new file mode 100755 index 0000000..57ebc08 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/IMedia.java @@ -0,0 +1,59 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.media; + +import dan200.computercraft.api.filesystem.IMount; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Represents an item that can be placed in a disk drive and used by a Computer. + * Implement this interface on your Item class to allow it to be used in the drive. + */ +public interface IMedia +{ + /** + * Get a string representing the label of this item. Will be called vi disk.getLabel() in lua. + * @param stack The itemstack to inspect + * @return The label. ie: "Dan's Programs" + */ + public String getLabel( ItemStack stack ); + + /** + * Set a string representing the label of this item. Will be called vi disk.setLabel() in lua. + * @param stack The itemstack to modify. + * @param label The string to set the label to. + * @return true if the label was updated, false if the label may not be modified. + */ + public boolean setLabel( ItemStack stack, String label ); + + /** + * If this disk represents an item with audio (like a record), get the readable name of the audio track. ie: "Jonathon Coulton - Still Alive" + * @param stack The itemstack to inspect. + * @return The name, or null if this item does not represent an item with audio. + */ + public String getAudioTitle( ItemStack stack ); + + /** + * If this disk represents an item with audio (like a record), get the resource name of the audio track to play. + * @param stack The itemstack to inspect. + * @return The name, or null if this item does not represent an item with audio. + */ + public String getAudioRecordName( ItemStack stack ); + + /** + * If this disk represents an item with data (like a floppy disk), get a mount representing it's contents. This will be mounted onto the filesystem of the computercraft while the media is in the disk drive. + * @param stack The itemstack to inspect. + * @param world The world in which the item and disk drive reside. + * @return The mount, or null if this item does not represent an item with data. If the IMount returned also implements IWritableMount, it will mounted using mountWritable() + * @see dan200.computercraft.api.filesystem.IMount + * @see dan200.computercraft.api.filesystem.IWritableMount + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String, long) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + */ + public IMount createDataMount( ItemStack stack, World world ); +} diff --git a/src/main/java/dan200/computercraft/api/media/IMediaProvider.java b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java new file mode 100755 index 0000000..c0aabd5 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/IMediaProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.media; + +import net.minecraft.item.ItemStack; + +/** + * This interface is used to provide IMedia implementations for ItemStack + * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider) + */ +public interface IMediaProvider +{ + /** + * Produce an IMedia implementation from an ItemStack. + * @see dan200.computercraft.api.ComputerCraftAPI#registerMediaProvider(IMediaProvider) + * @return an IMedia implementation, or null if the item is not something you wish to handle + */ + public IMedia getMedia( ItemStack stack ); +} diff --git a/src/main/java/dan200/computercraft/api/media/package-info.java b/src/main/java/dan200/computercraft/api/media/package-info.java new file mode 100755 index 0000000..9e2f507 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/media/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Media", apiVersion="1.75" ) +package dan200.computercraft.api.media; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/package-info.java b/src/main/java/dan200/computercraft/api/package-info.java new file mode 100755 index 0000000..f3a706a --- /dev/null +++ b/src/main/java/dan200/computercraft/api/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API", apiVersion="1.75" ) +package dan200.computercraft.api; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java new file mode 100755 index 0000000..2458c06 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IComputerAccess.java @@ -0,0 +1,102 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import dan200.computercraft.api.filesystem.IMount; +import dan200.computercraft.api.filesystem.IWritableMount; + +/** + * The interface passed to peripherals by computers or turtles, providing methods + * that they can call. This should not be implemented by your classes. Do not interact + * with computers except via this interface. + */ +public interface IComputerAccess +{ + /** + * Mount a mount onto the computers' file system in a read only mode.
+ * @param desiredLocation The location on the computercraft's file system where you would like the mount to be mounted. + * @param mount The mount object to mount on the computercraft. These can be obtained by calling ComputerCraftAPI.createSaveDirMount(), ComputerCraftAPI.createResourceMount() or by creating your own objects that implement the IMount interface. + * @return The location on the computercraft's file system where you the mount mounted, or null if there was already a file in the desired location. Store this value if you wish to unmount the mount later. + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see #mountWritable(String, dan200.computercraft.api.filesystem.IWritableMount) + * @see #unmount(String) + * @see dan200.computercraft.api.filesystem.IMount + */ + public String mount( String desiredLocation, IMount mount ); + + /** + * TODO: Document me + */ + public String mount( String desiredLocation, IMount mount, String driveName ); + + /** + * Mount a mount onto the computers' file system in a writable mode.
+ * @param desiredLocation The location on the computercraft's file system where you would like the mount to be mounted. + * @param mount The mount object to mount on the computercraft. These can be obtained by calling ComputerCraftAPI.createSaveDirMount() or by creating your own objects that implement the IWritableMount interface. + * @return The location on the computercraft's file system where you the mount mounted, or null if there was already a file in the desired location. Store this value if you wish to unmount the mount later. + * @see dan200.computercraft.api.ComputerCraftAPI#createSaveDirMount(World, String) + * @see dan200.computercraft.api.ComputerCraftAPI#createResourceMount(Class, String, String) + * @see #mount(String, IMount) + * @see #unmount(String) + * @see IMount + */ + public String mountWritable( String desiredLocation, IWritableMount mount ); + + /** + * TODO: Document me + */ + public String mountWritable( String desiredLocation, IWritableMount mount, String driveName ); + + /** + * Unmounts a directory previously mounted onto the computers file system by mount() or mountWritable().
+ * When a directory is unmounted, it will disappear from the computers file system, and the user will no longer be able to + * access it. All directories mounted by a mount or mountWritable are automatically unmounted when the peripheral + * is attached if they have not been explicitly unmounted. + * @param location The desired location in the computers file system of the directory to unmount. + * This must be the location of a directory previously mounted by mount() or mountWritable(), as + * indicated by their return value. + * @see #mount(String, IMount) + * @see #mountWritable(String, IWritableMount) + */ + public void unmount( String location ); + + /** + * Returns the numerical ID of this computercraft.
+ * This is the same number obtained by calling os.getComputerID() or running the "id" program from lua, + * and is guarunteed unique. This number will be positive. + * @return The identifier. + */ + public int getID(); + + /** + * Causes an event to be raised on this computercraft, which the computercraft can respond to by calling + * os.pullEvent(). This can be used to notify the computercraft when things happen in the world or to + * this peripheral. + * @param event A string identifying the type of event that has occurred, this will be + * returned as the first value from os.pullEvent(). It is recommended that you + * you choose a name that is unique, and recognisable as originating from your + * peripheral. eg: If your peripheral type is "button", a suitable event would be + * "button_pressed". + * @param arguments In addition to a name, you may pass an array of extra arguments to the event, that will + * be supplied as extra return values to os.pullEvent(). Objects in the array will be converted + * to lua data types in the same fashion as the return values of IPeripheral.callMethod().
+ * You may supply null to indicate that no arguments are to be supplied. + * @see dan200.computercraft.api.peripheral.IPeripheral#callMethod + */ + public void queueEvent( String event, Object[] arguments ); + + /** + * Get a string, unique to the computercraft, by which the computercraft refers to this peripheral. + * For directly attached peripherals this will be "left","right","front","back",etc, but + * for peripherals attached remotely it will be different. It is good practice to supply + * this string when raising events to the computercraft, so that the computercraft knows from + * which peripheral the event came. + * @return A string unique to the computercraft, but not globally. + */ + public String getAttachmentName(); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java new file mode 100755 index 0000000..a28d656 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java @@ -0,0 +1,100 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; + +/** + * The interface that defines a peripheral. This should be implemented by the + * TileEntity of any common that you wish to be interacted with by + * computercraft or turtle. + */ +public interface IPeripheral +{ + /** + * Should return a string that uniquely identifies this type of peripheral. + * This can be queried from lua by calling peripheral.getType() + * @return A string identifying the type of peripheral. + */ + public String getType(); + + /** + * Should return an array of strings that identify the methods that this + * peripheral exposes to Lua. This will be called once before each attachment, + * and should not change when called multiple times. + * @return An array of strings representing method names. + * @see #callMethod + */ + public String[] getMethodNames(); + + /** + * This is called when a lua program on an attached computercraft calls peripheral.call() with + * one of the methods exposed by getMethodNames().
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is making the call. Remember that multiple + * computers can be attached to a peripheral at once. + * @param context The context of the currently running lua thread. This can be used to wait for events + * or otherwise yield. + * @param method An integer identifying which of the methods from getMethodNames() the computercraft + * wishes to call. The integer indicates the index into the getMethodNames() table + * that corresponds to the string passed into peripheral.call() + * @param arguments An array of objects, representing the arguments passed into peripheral.call().
+ * Lua values of type "string" will be represented by Object type String.
+ * Lua values of type "number" will be represented by Object type Double.
+ * Lua values of type "boolean" will be represented by Object type Boolean.
+ * Lua values of any other type will be represented by a null object.
+ * This array will be empty if no arguments are passed. + * @return An array of objects, representing values you wish to return to the lua program.
+ * Integers, Doubles, Floats, Strings, Booleans and null be converted to their corresponding lua type.
+ * All other types will be converted to nil.
+ * You may return null to indicate no values should be returned. + * @throws Exception If you throw any exception from this function, a lua error will be raised with the + * same message as your exception. Use this to throw appropriate errors if the wrong + * arguments are supplied to your method. + * @see #getMethodNames + */ + public Object[] callMethod( IComputerAccess computer, ILuaContext context, int method, Object[] arguments ) throws LuaException, InterruptedException; + + /** + * Is called when canAttachToSide has returned true, and a computercraft is attaching to the peripheral. + * This will occur when a peripheral is placed next to an active computercraft, when a computercraft is turned on next to a peripheral, + * or when a turtle travels into a square next to a peripheral. + * Between calls to attach() and detach(), the attached computercraft can make method calls on the peripheral using peripheral.call(). + * This method can be used to keep track of which computers are attached to the peripheral, or to take action when attachment + * occurs.
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is being attached. Remember that multiple + * computers can be attached to a peripheral at once. + * @see #detach + */ + public void attach( IComputerAccess computer ); + + /** + * Is called when a computercraft is detaching from the peripheral. + * This will occur when a computercraft shuts down, when the peripheral is removed while attached to computers, + * or when a turtle moves away from a square attached to a peripheral. + * This method can be used to keep track of which computers are attached to the peripheral, or to take action when detachment + * occurs.
+ *
+ * Be aware that this will be called from the ComputerCraft Lua thread, and must be thread-safe + * when interacting with minecraft objects. + * @param computer The interface to the computercraft that is being detached. Remember that multiple + * computers can be attached to a peripheral at once. + * @see #detach + */ + public void detach( IComputerAccess computer ); + + /** + * TODO: Document me + */ + public boolean equals( IPeripheral other ); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java new file mode 100755 index 0000000..a2775f9 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/IPeripheralProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.peripheral; + +import net.minecraft.world.World; + +/** + * This interface is used to create peripheral implementations for blocks + * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) + */ +public interface IPeripheralProvider +{ + /** + * Produce an peripheral implementation from a block location. + * @see dan200.computercraft.api.ComputerCraftAPI#registerPeripheralProvider(IPeripheralProvider) + * @return a peripheral, or null if there is not a peripheral here you'd like to handle. + */ + public IPeripheral getPeripheral( World world, int x, int y, int z, int side ); +} diff --git a/src/main/java/dan200/computercraft/api/peripheral/package-info.java b/src/main/java/dan200/computercraft/api/peripheral/package-info.java new file mode 100755 index 0000000..10ea4da --- /dev/null +++ b/src/main/java/dan200/computercraft/api/peripheral/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Peripheral", apiVersion="1.75" ) +package dan200.computercraft.api.peripheral; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java b/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java new file mode 100644 index 0000000..476b4fc --- /dev/null +++ b/src/main/java/dan200/computercraft/api/permissions/ITurtlePermissionProvider.java @@ -0,0 +1,19 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.permissions; + +import net.minecraft.world.World; + +/** + * This interface is used to restrict where turtles can move or build + * @see dan200.computercraft.api.ComputerCraftAPI#registerPermissionProvider(ITurtlePermissionProvider) + */ +public interface ITurtlePermissionProvider +{ + public boolean isBlockEnterable( World world, int x, int y, int z ); + public boolean isBlockEditable( World world, int x, int y, int z ); +} diff --git a/src/main/java/dan200/computercraft/api/permissions/package-info.java b/src/main/java/dan200/computercraft/api/permissions/package-info.java new file mode 100644 index 0000000..a51e7ec --- /dev/null +++ b/src/main/java/dan200/computercraft/api/permissions/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Permissions", apiVersion="1.75" ) +package dan200.computercraft.api.permissions; + +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java new file mode 100755 index 0000000..b85f2ef --- /dev/null +++ b/src/main/java/dan200/computercraft/api/redstone/IBundledRedstoneProvider.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.redstone; + +import net.minecraft.world.World; + +/** + * This interface is used to provide bundled redstone output for blocks + * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) + */ +public interface IBundledRedstoneProvider +{ + /** + * Produce an bundled redstone output from a block location. + * @see dan200.computercraft.api.ComputerCraftAPI#registerBundledRedstoneProvider(IBundledRedstoneProvider) + * @return a number in the range 0-65535 to indicate this block is providing output, or -1 if you do not wish to handle this block + */ + public int getBundledRedstoneOutput( World world, int x, int y, int z, int side ); +} diff --git a/src/main/java/dan200/computercraft/api/redstone/package-info.java b/src/main/java/dan200/computercraft/api/redstone/package-info.java new file mode 100755 index 0000000..e01c623 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/redstone/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Redstone", apiVersion="1.75" ) +package dan200.computercraft.api.redstone; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java new file mode 100755 index 0000000..96c6159 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleAccess.java @@ -0,0 +1,168 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +/** + * The interface passed to turtle by turtles, providing methods that they can call. + * This should not be implemented by your classes. Do not interact with turtles except via this interface and ITurtleUpgrade. + */ +public interface ITurtleAccess +{ + /** + * Returns the world in which the turtle resides. + * @return the world in which the turtle resides. + */ + public World getWorld(); + + /** + * Returns a vector containing the integer co-ordinates at which the turtle resides. + * @return a vector containing the integer co-ordinates at which the turtle resides. + */ + public ChunkCoordinates getPosition(); + + /** + * TODO: Document me + */ + public boolean teleportTo( World world, int x, int y, int z ); + + /** + * Returns a vector containing the floating point co-ordinates at which the turtle is rendered. + * This will shift when the turtle is moving. + * @param f The subframe fraction + * @return a vector containing the floating point co-ordinates at which the turtle resides. + */ + public Vec3 getVisualPosition( float f ); + + /** + * TODO: Document me + */ + public float getVisualYaw( float f ); + + /** + * Returns the world direction the turtle is currently facing. + * @return the world direction the turtle is currently facing. + */ + public int getDirection(); + + /** + * TODO: Document me + */ + public void setDirection( int dir ); + + /** + * TODO: Document me + */ + public int getSelectedSlot(); + + /** + * TODO: Document me + */ + public void setSelectedSlot( int slot ); + + /** + * Sets the colour of the turtle, as if the player had dyed it with a dye item. + * @param dyeColour 0-15 to dye the turtle one of the 16 standard minecraft colours, or -1 to remove the dye from the turtle. + */ + public void setDyeColour( int dyeColour ); + + /** + * Gets the colour the turtle has been dyed. + * @return 0-15 if the turtle has been dyed one of the 16 standard minecraft colours, -1 if the turtle is clean. + */ + public int getDyeColour(); + + /** + * TODO: Document me + */ + public IInventory getInventory(); + + /** + * TODO: Document me + */ + public boolean isFuelNeeded(); + + /** + * TODO: Document me + */ + public int getFuelLevel(); + + /** + * TODO: Document me + */ + public void setFuelLevel( int fuel ); + + /** + * TODO: Document me + */ + public int getFuelLimit(); + + /** + * Removes some fuel from the turtles fuel supply. Negative numbers can be passed in to INCREASE the fuel level of the turtle. + * @return Whether the turtle was able to consume the ammount of fuel specified. Will return false if you supply a number + * greater than the current fuel level of the turtle. + */ + public boolean consumeFuel( int fuel ); + + /** + * TODO: Document me + */ + public void addFuel( int fuel ); + + /** + * Adds a custom command to the turtles command queue. Unlike peripheral methods, these custom commands will be executed + * on the main thread, so are guaranteed to be able to access Minecraft objects safely, and will be queued up + * with the turtles standard movement and tool commands. An issued command will return an unique integer, which will + * be supplied as a parameter to a "turtle_response" event issued to the turtle after the command has completed. Look at the + * lua source code for "rom/apis/turtle" for how to build a lua wrapper around this functionality. + * @param command an object which will execute the custom command when its point in the queue is reached + * @return the objects the command returned when executed. you should probably return these to the player + * unchanged if called from a peripheral method. + * @see ITurtleCommand + */ + public Object[] executeCommand( ILuaContext context, ITurtleCommand command ) throws LuaException, InterruptedException; + + /** + * TODO: Document me + */ + public void playAnimation( TurtleAnimation animation ); + + /** + * Returns the turtle on the specified side of the turtle, if there is one. + * @return the turtle on the specified side of the turtle, if there is one. + */ + public ITurtleUpgrade getUpgrade( TurtleSide side ); + + /** + * TODO: Document me + */ + public void setUpgrade( TurtleSide side, ITurtleUpgrade upgrade ); + + /** + * Returns the peripheral created by the upgrade on the specified side of the turtle, if there is one. + * @return the peripheral created by the upgrade on the specified side of the turtle, if there is one. + */ + public IPeripheral getPeripheral( TurtleSide side ); + + /** + * TODO: Document me + */ + public NBTTagCompound getUpgradeNBTData( TurtleSide side ); + + /** + * TODO: Document me + */ + public void updateUpgradeNBTData( TurtleSide side ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java new file mode 100755 index 0000000..17d113e --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleCommand.java @@ -0,0 +1,25 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An interface for objects executing custom turtle commands, used with ITurtleAccess.issueCommand + * @see ITurtleAccess#executeCommand(dan200.computercraft.api.lua.ILuaContext,ITurtleCommand) + */ +public interface ITurtleCommand +{ + /** + * Will be called by the turtle on the main thread when it is time to execute the custom command. + * The handler should either perform the work of the command, and return success, or return + * failure with an error message to indicate the command cannot be executed at this time. + * @param turtle access to the turtle for whom the command was issued + * @return TurtleCommandResult.success() or TurtleCommandResult.failure( errorMessage ) + * @see ITurtleAccess#executeCommand(dan200.computercraft.api.lua.ILuaContext,ITurtleCommand) + * @see dan200.computercraft.api.turtle.TurtleCommandResult + */ + public TurtleCommandResult execute( ITurtleAccess turtle ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java new file mode 100755 index 0000000..0dcc6e6 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/ITurtleUpgrade.java @@ -0,0 +1,94 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +import dan200.computercraft.api.peripheral.IPeripheral; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +/** + * The primary interface for defining an turtle for Turtles. A turtle turtle + * can either be a new tool, or a new peripheral. + * @see dan200.computercraft.api.ComputerCraftAPI#registerTurtleUpgrade( dan200.computercraft.api.turtle.ITurtleUpgrade ) + */ +public interface ITurtleUpgrade +{ + /** + * Gets a unique numerical identifier representing this type of turtle turtle. + * Like Minecraft common and item IDs, you should strive to make this number unique + * among all turtle turtle that have been released for ComputerCraft. + * The ID must be in the range 64 to 255, as the ID is stored as an 8-bit value, + * and 0-64 is reserved for future use by ComputerCraft. The turtle will + * fail registration if an already used ID is specified. + * @see dan200.computercraft.api.ComputerCraftAPI#registerTurtleUpgrade( dan200.computercraft.api.turtle.ITurtleUpgrade ) + */ + public int getUpgradeID(); + + /** + * Return a String to describe this type of turtle in turtle item names. + * Examples of built-in adjectives are "Wireless", "Mining" and "Crafty". + */ + public String getUnlocalisedAdjective(); + + /** + * Return whether this turtle adds a tool or a peripheral to the turtle. + * Currently, turtle crafting is restricted to one tool & one peripheral per turtle. + * @see TurtleUpgradeType for the differences between the two. + */ + public TurtleUpgradeType getType(); + + /** + * Return an item stack representing the type of item that a turtle must be crafted + * with to create a turtle which holds this turtle. + * Currently, turtle crafting is restricted to one tool & one peripheral per turtle. + */ + public ItemStack getCraftingItem(); + + /** + * Will only be called for Peripheral turtle. Creates a peripheral for a turtle + * being placed using this turtle. The peripheral created will be stored + * for the lifetime of the turtle, will have update() called once-per-tick, and will be + * attach'd detach'd and have methods called in the same manner as a Computer peripheral. + * + * @param turtle Access to the turtle that the peripheral is being created for. + * @param side Which side of the turtle (left or right) that the turtle resides on. + * @return The newly created peripheral. You may return null if this turtle is a Tool + * and this method is not expected to be called. + */ + public IPeripheral createPeripheral( ITurtleAccess turtle, TurtleSide side ); + + /** + * Will only be called for Tool turtle. Called when turtle.dig() or turtle.attack() is called + * by the turtle, and the tool is required to do some work. + * @param turtle Access to the turtle that the tool resides on. + * @param side Which side of the turtle (left or right) the tool resides on. + * @param verb Which action (dig or attack) the turtle is being called on to perform. + * @param direction Which world direction the action should be performed in, relative to the turtles + * position. This will either be up, down, or the direction the turtle is facing, depending on + * whether dig, digUp or digDown was called. + * @return Whether the turtle was able to perform the action, and hence whether the turtle.dig() + * or turtle.attack() lua method should return true. If true is returned, the tool will perform + * a swinging animation. You may return null if this turtle is a Peripheral + * and this method is not expected to be called. + */ + public TurtleCommandResult useTool( ITurtleAccess turtle, TurtleSide side, TurtleVerb verb, int direction ); + + /** + * Called to obtain the IIcon to be used when rendering a turtle peripheral. Needs to be a "common" + * type IIcon for now, as there is no way to determine which texture sheet an IIcon is from by the + * IIcon itself. + * @param turtle Access to the turtle that the peripheral resides on. + * @param side Which side of the turtle (left or right) the peripheral resides on. + * @return The IIcon that you wish to be used to render your turtle peripheral. + */ + public IIcon getIcon( ITurtleAccess turtle, TurtleSide side ); + + /** + * TODO: Document me + */ + public void update( ITurtleAccess turtle, TurtleSide side ); +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java b/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java new file mode 100755 index 0000000..abb4134 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleAnimation.java @@ -0,0 +1,22 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +public enum TurtleAnimation +{ + None, + MoveForward, + MoveBack, + MoveUp, + MoveDown, + TurnLeft, + TurnRight, + SwingLeftTool, + SwingRightTool, + Wait, + ShortWait, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java b/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java new file mode 100755 index 0000000..67046bd --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleCommandResult.java @@ -0,0 +1,73 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +public final class TurtleCommandResult +{ + private static final TurtleCommandResult s_success = new TurtleCommandResult( true, null, null ); + private static final TurtleCommandResult s_emptyFailure = new TurtleCommandResult( false, null, null ); + + public static TurtleCommandResult success() + { + return success( null ); + } + + public static TurtleCommandResult success( Object[] results ) + { + if( results == null || results.length == 0 ) + { + return s_success; + } + else + { + return new TurtleCommandResult( true, null, results ); + } + } + + public static TurtleCommandResult failure() + { + return failure( null ); + } + + public static TurtleCommandResult failure( String errorMessage ) + { + if( errorMessage == null ) + { + return s_emptyFailure; + } + else + { + return new TurtleCommandResult( false, errorMessage, null ); + } + } + + private final boolean m_success; + private final String m_errorMessage; + private final Object[] m_results; + + private TurtleCommandResult( boolean success, String errorMessage, Object[] results ) + { + m_success = success; + m_errorMessage = errorMessage; + m_results = results; + } + + public boolean isSuccess() + { + return m_success; + } + + public String getErrorMessage() + { + return m_errorMessage; + } + + public Object[] getResults() + { + return m_results; + } +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java b/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java new file mode 100755 index 0000000..5fc7c61 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleSide.java @@ -0,0 +1,23 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two sides of the turtle that a turtle turtle might reside. + */ +public enum TurtleSide +{ + /** + * The turtles left side (where the pickaxe usually is on a Wireless Mining Turtle) + */ + Left, + + /** + * The turtles right side (where the modem usually is on a Wireless Mining Turtle) + */ + Right, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java b/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java new file mode 100755 index 0000000..e5fd1af --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleUpgradeType.java @@ -0,0 +1,27 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two different types of turtle that an ITurtleUpgrade + * implementation can add to a turtle. + * @see ITurtleUpgrade + */ +public enum TurtleUpgradeType +{ + /** + * A tool is rendered as an item on the side of the turtle, and responds to the turtle.dig() + * and turtle.attack() methods (Such as pickaxe or sword on Mining and Melee turtles). + */ + Tool, + + /** + * A peripheral adds a special peripheral which is attached to the side of the turtle, + * and can be interacted with the peripheral API (Such as the modem on Wireless Turtles). + */ + Peripheral, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java b/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java new file mode 100755 index 0000000..566fa48 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/TurtleVerb.java @@ -0,0 +1,26 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +package dan200.computercraft.api.turtle; + +/** + * An enum representing the two different actions that an ITurtleUpgrade of type + * Tool may be called on to perform by a turtle. + * @see ITurtleUpgrade + * @see ITurtleUpgrade#useTool + */ +public enum TurtleVerb +{ + /** + * The turtle called turtle.dig(), turtle.digUp() or turtle.digDown() + */ + Dig, + + /** + * The turtle called turtle.attack(), turtle.attackUp() or turtle.attackDown() + */ + Attack, +} diff --git a/src/main/java/dan200/computercraft/api/turtle/package-info.java b/src/main/java/dan200/computercraft/api/turtle/package-info.java new file mode 100755 index 0000000..7825971 --- /dev/null +++ b/src/main/java/dan200/computercraft/api/turtle/package-info.java @@ -0,0 +1,10 @@ +/** + * This file is part of the public ComputerCraft API - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2015. This API may be redistributed unmodified and in full only. + * For help using the API, and posting your mods, visit the forums at computercraft.info. + */ + +@API( owner="ComputerCraft", provides="ComputerCraft|API|Turtle", apiVersion="1.75" ) +package dan200.computercraft.api.turtle; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/dark/library/helpers/ItemFindingHelper.java b/src/main/java/dark/library/helpers/ItemFindingHelper.java new file mode 100644 index 0000000..c7a4139 --- /dev/null +++ b/src/main/java/dark/library/helpers/ItemFindingHelper.java @@ -0,0 +1,76 @@ +package dark.library.helpers; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import universalelectricity.core.vector.Vector3; + +public class ItemFindingHelper { + public static List findAllItemIn(World world, Vector3 start, Vector3 end) { + return world.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox((double)start.x, (double)start.y, (double)start.z, (double)end.x, (double)end.y, (double)end.z)); + } + + public static List findSelectItems(World world, Vector3 start, Vector3 end, List disiredItems) { + List entityItems = ItemFindingHelper.findAllItemIn(world, start, end); + return ItemFindingHelper.filterEntityItemsList(entityItems, disiredItems); + } + + public static List filterEntityItemsList(List entityItems, List disiredItems) { + ArrayList newItemList = new ArrayList(); + block0: for (EntityItem entityItem : entityItems) { + for (ItemStack itemStack : disiredItems) { + if (entityItem.getEntityItem().getItem() != itemStack.getItem() || entityItem.getEntityItem().getItemDamage() != itemStack.getItemDamage() || newItemList.contains((Object)entityItem)) continue; + newItemList.add(entityItem); + continue block0; + } + } + return newItemList; + } + + public static List filterOutEntityItems(List entities) { + ArrayList newEntityList = new ArrayList(); + for (Entity entity : entities) { + if (!(entity instanceof EntityItem)) continue; + newEntityList.add((EntityItem)entity); + } + return newEntityList; + } + + public static List filterItems(List totalItems, List desiredItems) { + ArrayList newItemList = new ArrayList(); + block0: for (ItemStack entityItem : totalItems) { + for (ItemStack itemStack : desiredItems) { + if (entityItem.getItem() != itemStack.getItem() || entityItem.getItemDamage() != itemStack.getItemDamage() || newItemList.contains((Object)entityItem)) continue; + newItemList.add(entityItem); + continue block0; + } + } + return newItemList; + } + + public static boolean dropItemStackExact(World world, double x, double y, double z, ItemStack stack) { + if (!world.isRemote && stack != null) { + EntityItem entity = new EntityItem(world, x, y, z, stack); + entity.delayBeforeCanPickup = 10; + return world.spawnEntityInWorld((Entity)entity); + } + return false; + } + + public static void dropBlockAsItem(World world, int x, int y, int z) { + if (!world.isRemote) { + int meta = world.getBlockMetadata(x, y, z); + Block block = world.getBlock(x, y, z); + ArrayList items = block.getDrops(world, x, y, z, meta, 0); + for (ItemStack item : items) { + ItemFindingHelper.dropItemStackExact(world, (double)x + 0.5, (double)y + 0.5, (double)z + 0.5, item); + } + } + } +} + diff --git a/src/main/resources/al_logo.png b/src/main/resources/al_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f98774a357ffbf1bd8c13d9297c0cfa85b01ef GIT binary patch literal 14526 zcmV;vI6=pWP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001rNNkl^d0O9DtjUPy4(Z+_Wp-L;h5ckU_se9!mn zv-dv2o$jMq#RcJG2rAuVB~wv2G9p0$BnXJ%O!mt2w(XS1Y%P%4r6IIxhgk&)AxqLdQ}OofBre3|qn*2D=?`06yqZ9W z!z zicPKCD+}=R61(L#X+vFlAiSKjAxF+!v%|&j6?Hbvc0f~LP*-I~OborGg^aEN2;pV^ zlC|z>JBy_m^wnLylu#a)^lq)h_3Wk$CnS4+w#vOLY=T~gUN|n4n=q`M8Jm(oKYHA_ zoc`mO`^9>8ZduEyQKQ(naU;c53jKSh!uuVeqzF|1vx_%5SMM&B_&s%ZV#t(aB?ty| zQC>&#cj-paOb<$Fsr+TpMwuZ2RjFT3`?gi+)JeHFKiB>1(%;+;o;q|?N(ft$ft{7j z>DkIScFV`#Tj692s0w%weA#wE6)>o)@?C6-7@xDv{cQO*7oUFkx^LOwA~~bGYWm~o zB29|-|GU=gnyvvBk6Y(PdSRi@o0<>nh2| zwO9IIbb@-*-%e8(`P+&IMV|bYfMC}ix81NO&A8^M&WvkydLFMW1Y%}?=)~PR%W9Tp z7EkrAA|P@r3*@+99OFcsXd_D`s7DZ~91w8=G?u!>@>L~8Oq%wl9rwg1cGN}qbovkJ zq4dAwEbXo#gViyjn8#%Kf%O&wND{%vr&)2+7dZ`M7{iRVkSLy!r6OQyU(?lBfBO|9N9M-YX*?t6b2tva&J>*p-=?xv6UN zCQ!54q+LmN@w13jGws4DZrq;IL)X7;k|5_oAQ; zXRGn=f8e&gX@+%3-EW;Jj@k6A_cmWo<(Z$}wx>P%g~&E_ckd=z6Dd^0asDZ!DE3@ZbenW12v%u=(n9&!GqbHWHmpOz^)#|gVGBO~+2yoH zP5r*-tVfCAH4z&byWc^I5iPqFf+A!iDj|U)`Q42dYH#&vb7&&G+cAz|MBJzi#MHn)%zcOIAy|w3BNu)dCJ=9)2Dy?@WT&pc^*0(#ybFl&Q8D9a03Ef0h00q+u|aeFhZJjwo`$<(R7Kf0yZH{p{SvEcN9y8jx|rE zjLs9sdTzg@k9w%FDZ#G6pYy#QZ8FBn0M!oMn ze2%tdUr|F%eZ&88c>#0LElz zXR~za50yI#%_&{3dTf2~lt~?f_WKRi*{l7|?4i2gm^i|NiWS+j31werNKm5GIbDss zuSWU);w>&WjW_O?`mFD!cP4tKZM-ggBO!N(1vnZ6=aAWa!LdAi*wumVU4z)w$lO9MgCnF`8*%tmZ+@YeIU zEBdJxE_0=4nK-;}-N@KI15O=i zPGE<7^q3Frl!l6Y@ElmVGgkT6b92>1Z-|tX6uNfpN^){Cv9YnVZ{MEQty`0ypU;#j zQ-c3~=cT)Ez4wvVzFt%?ynRMv>MjsQ7z$0otuEx7qc^b1cQwK>IC2#GV0nIt!%I(_ zljx*;^5uB%f>=-Ul$%^nIX$ujeR?Q!D3(rLB&XQ`OZb5bp16BIO8v?rhrHG9L{bDz zR#X>A7b$Cgu%|cHMwIM_r4zm7J&soT$zr*=x-M>1?Gmu&Vei^?lf7Gh-+yhB1p|92 zA5tPK8_OX3cT~uI$G_}_%e2bh|LxL#Dx{0o2~}5ALd~}9<8?0Qjy8rO`K(z$s|KtT z=3h9*IP3k@?!J}28NubQcWtQRZs9osvq}{Z4kL=fh~fhu_JmOh0DH__buLZXq8Cv!=PS4URjY&=dMZkgR$tkj-n_CArL~~I1W-uQc_ar-n~1= z9d|rVRS`wGzo18Rz9j(Ll7vFg>li+byPFrb4kt0IJ?jI1!SJLZ9Ppy|np)nUdMV`0@h_Wru6EEw9&v&S$;`m0e+_CbcGd2)uboSN&OLC@ zN6)j9@o{5QS(fksHsk*GTH}~iQUt6jI`vZe$!&5YO6^!jJsowG@=h0OW1hWOGwT4B z8H5_&9>bOd62#Xx+~Rra_;v>>-{r?EA#CQ${c7m$_un6`bvb{uF$~EkBDD#iRRdNk z|Gs#van9UTZk^w24*6k=%jRF)vxz+d6RpaI^gcKPZpJzO#si-dZo=twv(si!%9Xbd zIIvOOlAzyl$Cd5gHsoKEKQ}u!^qD(`LZRE5Z+`QU5_A#O23jd4LI^w_4~dD1v})Cg z%*;&UCbgdKTsboJytCs#6l^KAYchUP|g!~ z*Rf5TzStpewL787EGtoXe_rm4T(a4X{wF^8euB3uySLI`=Ez?Ur?pbTIg_mctd&RK za)alY-dX#4^77-9irT$)BW2Zg$sn!49@U*ncd`Dl_1W@y2Ova?kkd?fR{M9jqQUXnniEW!fb39@;BE z&bmSWwdUXZbx_Fero2N*{TpxORuj(=V8}-u{^P>UaL8ukJD0JSrnz(6^U5 zj}mDeuHKCP&{nS+tlr%5JngxAzj9uG>@%B7`>T-347NA?`}co#xnQhu*4&4@^F^vS zR~AHRh<89F3(%Q!**IhPdn?^PMCn5j2#yDKH(Q}XK$gb*mtSV1T!9;|I!JjmMeDo1 zAokV2b{Sy3e9ebkHr=8_0(9(@jda4S-MX8q1_1w-Q^57N;nPj=bW5)w6c(7KiIkG6 zsw%?aFsiEJx-O0rDXa$2!XXcqWkuzi)V>ug_~^$TcfY#%^9zU0BPl8Q-<`X3nQJ@F z;Cba-jT_C%Iyb@zRmf{ z$tl{%z87ngu3PB5@bY4Z5ho}R&kRcH$KoafRyDhN>aIf=!KW{FczCt@NLCkR>S3K2 zYCsjot;mUPV#P98&Awu3JCF8T_+@U$-GrA7mYQ}nLXb7fk+YO$-)Les|Kt* z%pNh`yx^VX?jNS`F@9kqqdS6+TK^OUG6es6_+`G>T>qy*^?ugAhj-cC31rSLU|4U3 zZrL4Kz5Z9GeBJPOMxGYngPhKIsUQ?KsHmupDUR zDl03oER$%=B0>e>l;MP3=Dt54fqQ;xYU=qjXU=>o;P>BIRH@OwgTeGmbwrpyT;5vg z()ljqq1Nf5*lEJ9)OO+O=d7XgkMVv!`G54czWl`lQg$D0?<`tgsmgZMqrx2;%BxOo8!=|YLYnP(25V0|~T6AyG@ z(lm`wC=_1(^G|HumdE({IzNtv`5O``EGl8+Z#fh;V1vB6KWM>po?Bp$BzCf`FrtXM zuA}QZnx>&?8eXp#RaMb64MkB1hr@)8DjZiuiPHDLalq^I;SU7y3kTB(lb4rAUS3}9 z7R*}!TtL*ak>!YB?XSbNFP2b?2E^>Z6w2=NXY0E54xk&@-w@HY^bUO6Ajc zMd4!b>SBkTtL4L_9=0t@Y3O$`8Z3FpyT0cT^*#z@K2Gy)^S|8SGW!kdE`JYYMMj3W zO;$Be`PaW?#a66xugUDIJQ5q^4S5*8VehSUxon(qK00$nN*y+>8nE*5_Eis=7tdVw z#~N)<=%~=Pm+~FzUC;Ez4S(XgQ&nDDsnP8!@o{AD6$p zZl~Lu+!0xQl!yF2=1GSm1XwPRrgVJ&OMCdQ`O$UUgLAC}y!^eM;Nz|TdDy)4jUSvpTrt<@OMYAHUPh|OX!Zjx8&XnI=#<@= zwr$%U@O0?VfmW?rp(qNv;u4H^=RPf8LLl-@~55&YKFl~{KcIg7!aq;(CB>4bgLVQ;!e@b(UN6hn7PpHO#%a&v)oxfI^_K7UPD~d)N$5w zmn$DKFF@lx5gVDzB1u4inb$mGUjF*`&VNKPcb7^|f7Hx&isi>5K{T6>mqdaISy@>e z-KQ7byLUg}>DjX<-Me>3RaL@=`%embVVDxPPu4kC%TmhGkVR zFbjqsbugvzDX?U`cg@ikYoqeMa31UTfH9!bgxSj-)-H9QAVtJA_uz(HK+^0kkd-E8 zb2ysJT;_1by~ahZE9Qwz0RdjR_7QW$tKT{QQN`T0S2E@eyDte`Ry`NhW2uOGDE% zs;a6m45OMADYc-aD9Qo zQ6OYuMWg$NH9bU7K(T!K-gyVJD~|@_FVo-o%k}!Co~;fp{`K!1b{-DPDyDcyKjnjV z$@@^)tH9#%-gSL1(Qe8A(wTVNJ;s1t75jcN@nahlt`W_A@~cHcxtt>~a87gSV5|;G z5?cu{`GyJRb<>v|Ik39zRF&69dBTZ-hF8dcer8j=Q9ew(0H|y>Q8|+R>b&J%FD|Mhr@M%lBj)ZKt@p%JRT1o zuNUb!7^Z;|r5;AgQEJ-&(5+iH1`Qg-;6a1v(W6Hsvfush04!Yvq2NZN`-<>7;6zVZ zg$tyL&T|(y=WeQlU3pZfERn_J%YyoXX78J0$KmC+M%l8eBqWLZpS?n_{ij7^z3Y#? zRJ&={SI&gv?=eow|D8eigH;X{IdV9G=H2y&ObH79<{miVkk}jy>-rN_-h0k>9|5uJ zZ{y6rzqI(sfmO#8!P9qprd;(m{qbI{8}4Vvg?GMpvWdkDCuHq*5THko9-MaCX$&4bgq}TnMotK& z`(FWAh6RdCLNvxXrKHq@h_j++J3*k>t&?3r1oUkeKa!wRPk+Agy~FmO-0`G|sDo>z z0_>LS&Ksmo`rD~0vv1VbAAgzlx7`b!M~=VS7`U_i;DRa*_-UJa6oKa5zMXrtQb>p| znzPJatpx3}MUzj_t{tHA;^W>2(6B~5X#8{9q9eNveD6ljRyruJeDkVx!LlvUO`xwf zxM0v9g|eojyaF2N8~%j`C|*CRs-UVWYIUw3kH_QDJsv=E`7u?z@O8s>*Za?c^(C3C z-YM~GHeRo{ma*+`1h;LQa5!8GkhX1;pP$dxty{^>&84KI1lO@p)qOExjRmc0hNYiy z!U>#w@&LMZ?*UmArlGD9fHPPq;kv2KLFMHLSXKVxUgOECJ||CmJK<`_gm z!z@b#sn>SZSb2My%hr|dI8ucYb-ydspcN-Z7p-yc>VJ=M%Jv2_IEEu3SIx40YnvpP zaJ}b6Dr7P)i<`@>;f^6Hy-rh~pn$Omu0NbIuI{HY{c-OYJe1w>fbq<;-yB)6%1RJS zy2&aWcjEF`n|L4K#(epIf zet`NEg*=Jiq6Q%#r^Lgw?~@_mM8&RVe`%k!d3W_x3AZ?(o^|z{50$QNuSzrB29E?s*yZ1PVnR{o>wT7iC0fH zv)1Igr-(+nHe7j}%4?5%$Ka#zt_RG2J-y(_p9a2ry}pw^$_qctwkJK`$Ze;l04h~L z)GMEiWQgsLPuzu9+)IMEt~QUIl*ph5bx#4_T?vdyGPM(tpOYt82Q#y*KKU z$(J4fGTBVsRw##v23#AIj!7odmnT!SC3r}dC4xYae5N_rRjtx5clm9FJC-z|HpsGE z5N$=9y*uQx0rwc0TZ*DnfKDkQADjH9)^%iml>wLOk5zu}TrqCG?R|Z*3oxRoCy=wQ z({njW`Eb@8`|cUvJ1pHIk0F6h(E{OReHGq#-1`tQ?7n}rIrYge?IW&e*PWE69NilS7<1X@Tb zYi(qTqTo0VwrwBeZ{@n~em+&vN#yWP@Q+~%tzsR*A((Wj!kF{7TG#hj!?=N~7|^N^ z!cC|5+3A80rug3b;c@R0zxKxi);oXIekEI3Jo#Pg&Nr7jtjv)^NhI}9y00YoZMGJB zc;Wk$`dL^C@1Z$~#>5XsMNdWJ! zbRf)?(Xh@-j#ilUq;CT8>=-k~eBsg0jyzbU#K5$h^*7LD=+3F;joXVFuMekmQNYJi z9AcyWjjG^7XYZWl4vROrT>Y}ewqM*g$rQnegNcNIK-uvzB7Y?mZh&2@unK-5)%dxv zC}%m-*F>=}o#AJBcp!G!cBG7i{G5LJ>704yne^=06J6J9voko3Qwvy*;~WH7HIAdT z{3;3uQXwEQ0PFK4x4dLCb{<^%Tq&Ky|Gc9^@gwxueizA=Un8}qpCc8P!_Nzx^rTbO zi67nO$^9e2>K~`7^tniTv~;0;?cH;2AHcko4mey^r}uy(5FQuBaRnU`O!betT%F`QpPLA33nvf1bT{t*1aePJMROJp1XVzB;_E=cWCX?Nm?&WJSFt zjF@#I?5w5_p0Rvbyd`2IK7G>X1+xU-{A2OG-woe~eewUhCoDX=+k}}L8(si=uckaxPAww88Y#2Rz_9Pe#*2W9&?}t@m@2UZ;2wpW#L2NgY zcfDgqq?~UyxJ;U^UP>$f1*l%6@X;Jjqa{_6Qzx2(O1^gfe(E*)9nW5@*?$CB9o0tR znOi-N5hi%eRQpV``m6I+I8^1xs}Aybmmp#-tgsrf+9d{TwiJ1JacLbaD-tu<^W87) zVOt80%rWY{bL{{s2Zzx_z$&9OUoJcG9wTc*Bfo#=Ia(oAyxWu*Q2`9dR!Z66-aX)>F3$@gD>yrf$mC}z0%DlhNJe^$^D1$g5C=6J>h+n zWU+DLcys#L509*#)qMN1V-<#8uHC^e?iH6zv$7ATtWl?`r1wxBB63&~)0BFx*zPiE zhIJn4;?K24c-0%Ja5cb*1WD;89(-|0!{yz4w#Irn2&~fDHVYwY6Y`m+Nvl?^IQit0 z88&Pfef#z$7!1}jt-5Vj%_FzZcG$MUok^AwXik^q;ws6oamJs>aR-gM%X8Pren&pP zR=Z@Njnek3x9t1p{=Ba-l?KdT?GDg=MM8|t=+84EfK|(~eoUeyCxD2zYXMvY zfxYgeBf+j}WOjsQjXr>7IUrhzwDR3@*@^cWt$u0bR`mHRbuxOWBPo;!-9`AF!&;Oi z(ElOhqyg83|CIZ?)ED1uaLL{1UU4|v!X=ws23-}teCX2$r{;b0dj~4GYJVVfsy}_< zv8p-e8Sfaus6fp^HT@RPZ2T0AnP%O(=`c(KX)*BlHTovXd8K-s zWz#3JP0mW^Ei#3_b|Py&(0mBZ2Z{c(pZ-GYWH!)EXLf><1`p+%J>5u9OQ=a+wLe>O z9EZxvN=(xvB_)M{0|%0x9!a2D6Qo?jvTD85<-rS1G>b!Ba`C?`9~QGjEX^8~^JA{$ znz80BD9GvKJgfG#mAw1|VO+jwwUmnT`eL)LR};It;d2|_kXF9BGz(WRh{;FRw+ zyKLX+jvzrCz`UxrQx&vTk|s?s-n?(#AHd*Er0v4kbF>Qo0QHFt^PQ(2{x-OwmsCGN}duP(R7*@2TOVgmLGE7yK!S5qQmgl%UHN!fObmfBPzVGwZ9~`DU zZaztSW#Q-JJ)b4`j;vaJv%#gjjs%3Cu5l^e;{JuW$TnZZ*ifc(_s3ZTJ?=iha$RVj zX!6pJ$&}^<5OFpH1r#0`+tooVYlXvaE8GW36S|OqUmm+NU#8dP!G0(i`)8dgck9#f zhHoKY@WU^0T=H@!dOh8ZZ94*ptPr@O*%qi-%N!`>s^$)berLIpNq~OU6%{pizTG~{ zPCD~~@U6GM_lKApV6T*;&(Ronm3A+i-QgEaHG4GLUY8>HVS?A`eUcnZRrog&EYRd( zEgp3;gl#U9->`<0p`2ekktL8QPI&PvyH9xonK_4ahPLffx$23ZSp4y;{QBz#G)*Hh zF%hq~{+vcNVKX&>&m}-t2>)eK7UAz2;SgwDy6X!hNnU8*rV`rJpY12BBvo!|VRN-2p$(N`C ztk@>`W~p-t$pSpGxTLCi25$TZHb%a@nwSW?Dy$CK*-;6p0g=l@8xqTg_y8nk8I{C} z;s?)?tk@PwkK2$qE||89W`!Q2wRq&gsqKmNxbNM5&ffQ48EanhudU{Yuh-FU)mGAT zi%}dGGUK6lJBkK%?#3|e&koVDienEl;F2*Tvn25JjpI5xe8o&64V#e?z)k7w@b!4z9adk9HlHK z%k$!n&AxBm`zXl!YZCePw-~S#G)3~jEjjr&ofgTuQD1UKr~1U~*p7yQSJ`{}>5|XZ z9Q=M^IppS>eiFqTq&S;I(Msevr(V<-l4I%~i?9X9w1JcRWi#}ZcC=5}iQf|sKyGd> z1qB7{-o2ZS9Xry#eS6~L<7cOAF;8qIF5s5S+(BpHCsg~W$jizBgW!^3t-Oo zk-1b;9mk1m7gY^HCiH3zC_jE3AE50WL-})YWu#B{m)yOQik;zelLjkiV2DqLbaCVj z1FO#*l)4SERThjq!2uC2yr7RO)@-X=M|YLLx?hb`PO7lBUwtz-`xXB6@oIv8{a}NK z<3?_M9+Yj`NGJD-;~jPvL0#`g&9EHMRf*;gU4vBbyM9g^q!h&a9Bfx0`t<2DnEmn+ zsfuKKiHG6c%HoghQaajW>E(V;bk|$E)z@GbRq~VTP?i|ODQ=WkSW6jk>Z@>^*z!vK z-A5OuFDnbHbV&&p_RIfXO)IxCN~3sP*5r7|9I(h9B#4+Hn%Ibl-e%U6+iE41&SnmhIcO?^HAos(_*jzExC$ zNkNXa-N-$$2bdLYD6T@&6!z{e(u+VS-?*}k49o$y5zV} zR4IjG6R!ru)T~(1zbq^})zybJ-zy2Ry|i3eke=v{)YPV3S?|i~dI~$Resk6m2J96C9oPoF;W_ooz^D%n=-p`uDH_W7`tC{tI7>JNr3nT$m7>Y_kXqYEmpIf)LN zAcRcqlx(1@lJc-hNk}DRDmaL+s>+bA3R?h{BURfGUIiKS>XLY$LyXr!Rq8i#dQ{1t zN{!v6dX>*hrP9RYmx_p_$B)Ecv@&b@!my-3k|G7ttBFEI{4pup6cJ&| zQo5C@{Tb45fh;07x}d3UL=p&vQT$#vxkI9X%f2#2pFVv;fR7ewk^jfyy6z!ww%OlR;rBN_@1M-? zaK2k(3zJf|3`7IwGL1-Pofg1qk^k4y&^2892RzpYXotlp>M+i?Nd0DVrKJyAq(xff z|IEVD(giKjA}!JaSS`{bEz%+_fYl-`(jxz#0qdZgL^bhIzfYN=>pDK4ul7Wv<~k!y z(+>NTq(xe!MgF^`<`mSn?E~_LX_|&5 zs;X9KnzlX=2nf?OOG-;iuQyH88wdmz`h32filSf`MrlPw#Z_@}apkJ2ezm{TT#K|w zi?oQMC=?eLXQia14Dous|E{R0D6dW}-L`%E_E{HRc;WV$GiP>i9H%u<1xVYrV`E}s z7RJWL?y89(074pY!~TV9nnrPPF+QKKeOz3eT~t(bRZ&q9rKP3)UDtKX%F3p9?AY<= zl#~=oOH0Yk%_S)*>1NY3FVc1W^O`947HN?dX%W|T2?PSf#>SGCmR4Cse!qWkWo6~wKp;SBYAWUBw&a@4oqejALBkEdhD zj)cSEmXT_a7HQcEqU$=9m6Zen0fNDxQCL_wzOu4%Vnsy-Qp&T!;qc|5Q0O}$#5+>T zB2`s!U6(Fhx=2-32OEa*O+rFKZJef>k&$r#U>Sx%I2^|7_3m;UC(h&X%n(AH=s3=2 zp-||PnlOb>C`49P*82ko4m^GN^5y*s3k!EymPJZRN{b_0i?m3K;Pd$?D=TB;#*O6X z=TlKpk=eR+>w9x^bH|sIlxV7|zUTFNFOyO(a$Pr+n3zahTpZoIcmE+NDJf;$x^>r= zm6ai-Br!1&$8iq6$Wls4Fc_=>ojbzeun334x0$AS0&o&w0D-n`+Yag3vnL4&3B$_D z%2w6lR=>-uZKV6a$9Ii$t9qX_{?;O|I((L!r=2A~q}G zx^7xxV&ZkjAAfvTzu$jlZf@?f{YjKz7^gek$SO1N?B`vsty#-4~N5Xp-^ZXa6fQ`q9|l!WRRMg`m<$OeQn!b<@5P!ZQ(WS c3*dhT09{!c7l3Pqw*UYD07*qoM6N<$f}b#rH~;_u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/languages/en_US.properties b/src/main/resources/assets/assemblyline/languages/en_US.properties new file mode 100644 index 0000000..e104d0a --- /dev/null +++ b/src/main/resources/assets/assemblyline/languages/en_US.properties @@ -0,0 +1,27 @@ +# Assembly Line Language Properties +# @author Calclavia + +# Gui +itemGroup.assemblyline=Assembly Line +assemblyline.gui.crafting=Crafting + +# Blocks +tile.crate.name=Crate +tile.crate.0.name=Basic Crate +tile.crate.1.name=Advanced Crate +tile.crate.2.name=Elite Crate +tile.conveyorBelt.name=Conveyor Belt +tile.imprinter.name=Imprinter +tile.encoder.name=Encoder +tile.detector.name=Detector +tile.armbot.name=Armbot +tile.craneController.name=Crane Controller +tile.craneFrame.name=Crane Frame +tile.manipulator.name=Manipulator +tile.rejector.name=Rejector +tile.turntable.name=Turntable + +# Items +item.imprint.name=Imprint +item.disk.name=Disk +item.blueprint.name=Blueprint \ No newline at end of file diff --git a/src/main/resources/assets/assemblyline/sounds.json b/src/main/resources/assets/assemblyline/sounds.json new file mode 100644 index 0000000..079ccd6 --- /dev/null +++ b/src/main/resources/assets/assemblyline/sounds.json @@ -0,0 +1,11 @@ +{ + "conveyor": { + "category": "master", + "sounds": [ + { + "name": "conveyor", + "stream": false + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/assemblyline/sounds/conveyor.ogg b/src/main/resources/assets/assemblyline/sounds/conveyor.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2b2bc8646b2f4801371681f20a52c80c0cbb2304 GIT binary patch literal 7544 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 DztVCv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/crate.png b/src/main/resources/assets/assemblyline/textures/blocks/crate.png new file mode 100644 index 0000000000000000000000000000000000000000..d234dac328bc971e0b55763609ec3476ebe5145e GIT binary patch literal 4352 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/encoder_bottom.png b/src/main/resources/assets/assemblyline/textures/blocks/encoder_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2c325a8035a3f4edc1b59087cd2dc25641a3fabc GIT binary patch literal 4616 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 QVE_OC07*qoM6N<$f}z(6nE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/encoder_top.png b/src/main/resources/assets/assemblyline/textures/blocks/encoder_top.png new file mode 100644 index 0000000000000000000000000000000000000000..99f6860a7409ac4a83c595bdd0fe2ee6957e1e67 GIT binary patch literal 4530 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 QdjJ3c07*qoM6N<$g58UO?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/imprinter_bottom.png b/src/main/resources/assets/assemblyline/textures/blocks/imprinter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..68e2ab09b4ba92ae36200ade1cb276ba08ceca18 GIT binary patch literal 4374 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/imprinter_side.png b/src/main/resources/assets/assemblyline/textures/blocks/imprinter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..10b1978f64f0ef622c0cc04b5d2fb23a587ccbc6 GIT binary patch literal 4565 zcmV;`5i0J9P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000L7Nkl>wA)WRSh)HOL5HQtAy{qe1)jf~BmVXxQXmzQNuRG2mq zRUKpiu{kF5Fg>m*%N&i#cN4WsaHg*-wArM6n1Wju;j11rZMzF)C)-Cj{pl-V06~ zrr-p;ctQw(qpoXw@HiZ*k+yBQ_S#kQJP=h<3ficYxga9sc}|vP7>08Wha=CE`%WBf z8!rQpVH18niLKV7-2hcEnNR=#zY6im2yZjm={yvZY>3mzVcl*cYn^?>;GnN(opHqJ*A-6@$7eg$nRhLRchTLG_4YX5mc2d z^N33|{_w*OGq@2c2N!TY0DU~|&&_!E!w+Vxj4(*cAcLNGIMpk_>` zQvgQeMSgVU3Tta?tgWrFy}ga9va+&5RaMN*%@IPt%ovSE?Cj&vRaX{q;d_2p;W>S5-oc5si@|OM>m)TL4_Uc8#5#9j;%$&d$ybbzLJOoH=ub zrKKfAgyrRBCX)%yIoh^mGMP{m1zTHN!`YiRZ?d(u#pj<`=|>3wO%ut*2&rca;!^$p z?eAB4=+Z?lTsY7C*)*W;JKwckP3Ya-O9 zovL9d$466QjCk*H;=1-4(-0#Ko-AbD05Tjx(>ABb4M0fKEh)cx^(x-`ZWIgS@tCEh zC90}IL|9#2CCf4v7Z)jt0uf;}8nL;#NsN*G{e9Ng*Qu(C7}Mx&nuguoUA*@LVYz?h zzG3!+q9{1HwMPNG`|i5{1K_HvIu+79PrP9~9+O)5;h+>C%d%l#*YzNe9ZBie{VSgt zA`zT(jORu;=P1jPwr!c8pT~PYSgjfnN#C2c!HdT^$7nSA$f;>&c%L|enG$0}E%A); z+=#laQzM!l*NlBhjFHd%_>%zq^#}jLImhq5@kIcheC{gZg_pkh7yw`W^=pjBLr zHvF@O07D}Ja8Ez|v{lnxOmc3%m%5m$o*eD~+H=Lemls7rS(bxrHWex4c1L;=CyadJ zf%CNWA-H+M@$oTU9C?wG=Xs(@9V?>aaI-|UZQE1E^ef2>Rl9?hnOOp2CrWLED{P!bMDjH#KZ>Cg$yjHq!? z)EnDJDuhJk0HU7!fA%GH64jHmI_FX+?8{I!;zQ^-ywX}TXz1JT;GEG#!Ji7VbVjQx zk=UJaciKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000LsNkldB|ySPhJ%sNN{9p481D*pJ;TmScYS0=a>%OcZhxfI>gw#Q$jCR|cq39CK75z~ z5W%UCto)px>kt^nk$H%eZ|^Gra?Yp|oH_u^GQ%(cnJNUjuBY-I096H`ABOU-86KeW zJ>wWr=ZPs2g2!^kVx%{rsyxH6n;(bBIF!wsCXfueF=1xQ96%bkR1UiBK+^;)73cG` z$Czupb4u3@wCg(nG}UxeGitx{`kUr;f<(OGREeqV;+Ht0lai6M%>h9~a83~wvVkZ#b$IUqVHgIScL;)6BF4x^ zfBJwBJjt|#ASR;;imDPqpsFe|84*DcLMX=<6=FzEXce(X6ryT@n${*0V6ec!X)Y+0|5QRn#clfUrV*?oc! zs0w{d{C3aQ^V1_c(t>!>P+cMe~9>LzgU`9FE^prD|xgkc_`4z#P5Is|_D z&O7|<7e6P)SW-;nx&pI68ohOcox8ME=S69~*jLTRb zukl00`Pn%yUOcC18bpNl_L`v;V55l^2!!?JO4al!f7IRM+Pr#)KZ zMTNQ!#F!8jw%aXD({OTfXCaIf$8pXfvO@zP_5*$2)3z-aS1-A@-mv{6ms2bgo6VLG zYRH+GA}J=e+l~+_k{P1H`qsLrVAs#*LYIg?V! z@oahLIK@V`jF~M;sj7_8@IIqvMpZdfN{$c1Sd3c6?WtKx2}_BTjIQhGhQ5FkQxO~I zCb0tV-4Z%cAz8v~mTFr_sH$krg=m&DUDsh|h$tZBeCPx~+qT?nHVZ$~7;&BjJ?G2m zL#R+yvKe)#X_^&v6Y$<)^PXmCN{Mky%S4QEf=L#LopU(n$Q0%C-Y?A5J5ySD-wA~mkbnb zP$@{|oKeW6XvCDr*_KU*VVLUro(Z!_mUsG~UQ2qa6a-TwGn0-3XP4AXsVJd$=;2>w zaa{-6_NXk5yYS3owW@azhl*-0Rx@E^VvHqa#~4W#G0Vi54w@SPU#goeX=ZcR0E7?@ zHn*I)y1Js<4huO&zM8I?nPdr_N^{QTcbwcbE44@Kx?a3;uE4vmc4m3`^j$xp5|?+X zsZ(+45LLYMc<&F0IJa`e37bebiJFMe9<55fo)(lv0w|e@h*R8Sj5zQ1cu|P!y+;t7 zC^iXEn$pqCNR~(`B2yV|k5&xBP=sjcN1Q4mJIRF7T#iFgw|*EH(}?qq7~_smLnNiN z$MoIP9GXJhqA!+8>o)YIPUsBx+$1=43-P+H!+XatjLUy>hct6wpPU6XIY4F@#>wGb zZJC7#C|Tf~o1o7N3A?T*gupP2bX`~aJm+}v#q(0@oz7k19s*Mqn2}OiQqwF?>tZ3M z$kI9McDvnqqeX(-vsXF3_c|Yb`~)-O`1lC3j5>#kTc8yutlAZ~Z{IGpK&Bj+h@35R zeD8JIvsd}><0q5W%(7paRX@jPR<$blgO=>#)pO3y&X(FBQi_c_;n%XpBL`Vap4wo&9Sgqlj>-l4&C9R7gsOi1<#aC7 zb2^P*x}3(n%KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000K-NklP5ygL1B>Q7V(ySeN(k@mmqIvj9w zGzc+70NkBvns9gezUOke(sc=d5CQQj2kTci{7xI1Q*e(34Cj_eEW3N%ok&l4dALJYV& zs)C3%5Y}R?hpN1Lci`}FPuKPQ_~SNCrd8F!IfG9|Y|?{_1r zfpb1nOGUJ0JPaMVl#MO57zo7c^}3cYkh+e$yFHi71fql(khNqA9Nrzczkk@k^!(*{ z168S&`};dYlxmff5;)s_S0% z97jY14Yv}emG1?l3DD~bm>IwP{E2yU7DKfOj>f=!cTZS*wn;GhM%_xSO`Y6Xmdy2fVHgKAG=XYDmDazOdVmgczu$(sez)a(?Is+?|{=`~BV4rd%@D z%cV&(VAarC3prOr8o=gd!QBvP%9T=TLIYeb7gE=gQU^Gf^MzV!qw89-F1-w$p&wpN zQ9-0lSP`hXsi~%v2vJ)=cb0kPd_J?}1vhYSWs4yYLm;dae9?HQrQsoHz|2r-1a1)V zrjp(!W$F?lLWtTF(cP)VD5YXnHe_GUm$h{5ubQ#n-(l-C6cPHq->&mAul;sPskpZj zG%Re2{DOzlX2Bb1H_8aR-Hxxm`igmJ{jX-*J$Lu5r?2VzvKN*mGtbSCEXzX9c^hJR z$xPR2dsYBqDFxdC2&LrPB~e2Q?oDW(k4<NT>2z!v<~8$II`LXBZf!HGZ!FvmfVH;uY*R~8MA+@e z^@bMIYQ;qV!v#HkdE#(5Y+1Yx7((1=$m*cRVR#8x3OO&UKnde8P|DA!nX$}yGbHaH z-*2Uy=b2iK%jLp#Zlida=glX)Im9cJIgrwd_7K-LRa7IT7D7;_;JWrsbx1eb%8GP%0ddS6H)Af1Q8#c3(kSe0-|hH%v&&5;n|is! z`Fv)&UO7G=i7^sm#N1Y%>jvCh%BJ^%P)jA}Hqsll*FCB%%R(vbw_!~vo=&G1T7-bA zwg;%>?r<6uFQN`SeF|w@l<9Iwa^STPtloz@f&=|v( zO^AW6?{Rlx2<&!a1Ca>k&7^jHVz(O+1UK7WVl-$AY%i*5Zd>)naX>`c3yn8cENvFp zMne(de7fLnT<2+JgmFHd2&!~lk4hl*iN5biDe-WBzsd6Xbi%B1ou{qrw~V{4nN@@> zVG(Jj^hU#Zo_TmUw0=z!7tT14myEfiD+ate`@0cgzv19?IuT;RYNgCG=UfKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000R-NklFSi?ujx^R-{`U$20+6OL#(KQ92(5{= z+}g9W^g95=!b5Xm_wI)=#u7!EqOioV#)p6@EK-UuwU>?pl}ZeNF%Iwj1GalB%ZdkV z_s;smA3i}Gd-_1gvVu?le2Wl3i2Jt$P)dHOT}p`%AVxo&^C%^;)&Zck+H&Z9zxf#jYDfi6h(ONu-4LO=f3jXtkPL zx$+@N647qAxq9^)N+}3|D_4HY_}Ca)Yc5^7%;e-G?RJ~ih(I+Y89DP(l7_B5yN+8hh5Ai;rv?7Fnlw}|?8x}b0%Nk0_#KbrY3p<&e znSlTT0YY&2$-`W{c#)eoZ*u(jkGOQ{GQEurR#w(nTDrv1r=MbZd6}i95BTLT|Ak0t z3S+RwBBU5KVL+=AP0o6U;ZL>Ssv12=VR#2@~>8y27S|JehhXW)K zCkc(l*j7XJ)_Yrx)gKO+-#&*F5+6KSmSYM-x7)=N2;O6@ET^usJi2!ReEkR&n2Sd^CZHrA=v>ZEB}cDVql${?=&{zHEJ z%wguAeTr%&qCapr@7T34&%#6VgkU*!`U2aw?_g|voIJ}>N>QmK+`YSk_numtrU+v`W^mq>ocU3XdQ9p z%$w}rzmK=hyoqzAFK0bT8liUY-u0^x0&ATvV~q*6ZQI85)HK`Y=V&&YNCDsd&exGD zW@T+1>ntHSgwW+7l@u)nfiTLNq*jgi_9J^(UhWVAG@DIowHnQ4izw1;_ItFaTWGEB zm%#hL#>OV~dYuy|US+a1MZk0U@&_bILLkR{;o&KAgL4j33=k^XvUj^Zj4@aj`1s?G zaNaRDH^<`QyKI}A9WiRSUxGX{7~>EEjIo?Mcb+GnIK;1i{Sv{$p55QX`M^f6kC1^V zicnHuoh6E5gis6z1B$#L9~Nj8=yo=6HskO2JWM62aPs6S4j%jgZ=QJz@59KKBhO5k z0i`8Elx+COBi|xP5)K{uA`QO7TII2M3RL zIZ`UT_YeeWl7P^J;E=+iwI+(Hv*AYVS+;czSz4zYd*s-Hq9N@jj6b2ax7-Im4BE{zBCNI4B zJgcj#0DSk+eH2ANAV{M7-5vnr9M*Z_IN7pKOiU10Y6u*=c0CM0r_4>1wydY8)J-(HE=c{q(%T*fiVRE zO&rI>aZFl?cY3b5PNeQa8lr&8c&pvY~Y-|kp?AC22o3qsF zb>3Zkmlt1rek(ItM|}R5PdRk(`$!SUt)%AU2iWp`?nv=7< zcJghcj)=9U(P%KYeU90gX{M)|NGZv4!^b0?v{);J!oFqxG*0RytpjNLjG121lJ1bm#Z;2$9XeH25g&Q|+ zaPj>Q5i+6Kn#3B5wHBom&Uu6oNGTZ(hh*81EblYho+7PO&|idvQl$_z#vr65*iwA9 zCR+sWiQ^b!3}64o9)?BW;~UGsGEz!*@A(!!lD1hguZaJ8D2oht;dymEqGuSc9joId?J>)mxaYaQNr{R~nHy6as| zoqD~L;7XyD!UvDmnl!B-gdmRNk<1rZV;_W}5Q6^ZfDk;xJVPp7GNkjIeC-s64E8yPct(!!}RnNM~^-t90L^vUv!g9m@Wg$s+UuCDOH3(xb`nYS5c1FUtNJ$s&?|Kexd zx^PyO@|5Lw^y5 zcb0GcpQG8IZv658Z8Q@?P>klwzx{Cfw;s>`X8>=L63DbEMKAyW002ovPDHLkV1kkl Bsw4ma literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/blocks/turntable_side.png b/src/main/resources/assets/assemblyline/textures/blocks/turntable_side.png new file mode 100644 index 0000000000000000000000000000000000000000..170417696cbda0d3a8b92e45e52517bbe3e9cd55 GIT binary patch literal 4737 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 QG&m1^Z4<33sAI&x0Grs1g#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/gui/gui_encoder.png b/src/main/resources/assets/assemblyline/textures/gui/gui_encoder.png new file mode 100644 index 0000000000000000000000000000000000000000..a71a962a1f45921b5ae786db50fe25863b639229 GIT binary patch literal 3711 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/gui/gui_imprinter.png b/src/main/resources/assets/assemblyline/textures/gui/gui_imprinter.png new file mode 100644 index 0000000000000000000000000000000000000000..12a398503392a315ea91ce642fb7604740f30445 GIT binary patch literal 2391 zcmeHI|2xwO9Di@a)*6{27PZ=BBo?_O-R8?=aXa}gJEoRX`O-G(aOFelA>5%3NwuyM zB409#IL(sV9a?w#O0g6QMe(FB*sULWp8E^#hr8a-^L}3M=l#6juOD8|`%9(|XNxYL zga-g!wx_!<07?_00Ef}Q-l|}K4Ul(w`hEqFWDbBF26(5|;B$ZkI>0Coz^MpeXVO(Oiawm$~trAj6@=7X=&-`=uoRQ1fT7*0{>YB_6iJW zAD1ZJm*c0I_W!ei-walBH(TOgKs>r1#vVrp}}cn7WH%4~DW+lQfRV-v$9#rSZe3r+hhBh_LI!~lY;KZR>tGRoL zi?h$85R=prI6-<>W2bk}yp2A+iO(D;tgCrigPSgOzJ!j;#cXAXrSm_hDKV2eoZ6Ra zdnlYqAt6^LQ3)TE6KZRS6B^MHrqq&=5>@{qw`7KH{}QZp3bl8X(W&GXq>Q|JG-A75 zzb+`SS~ zKLsHS5cB5-sa8DoA!I~gZ1T`sXPK4jL>tn0C8~)1978HFyk`jM9yFV5UHdjL7T3#l z+q1|1Fybw&)%GuIb4an~^(ixKJ)+AVE5g8ssDF{kw~i5MN@Yf5Y_3*9;QfM=l;m^h zavA5Y{?bxVX$jICT}sFteG6JM z={h!e{$h3aU-y$D(&?_oE3@@Ia1^S&YhHs{A9sgI_J`{5PH(yCt;U=1DmZ1ykA@V07YZJ z4qr={{B8Zc3_3ZeWj1IbW_De-!zzNp&{lm%4k_NE92`b?qcf#}E?d#VrO5yNmga9| YjQN4J0>fY3ygt4&HjCq4?aE908*?pKqyPW_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/items/disk.png b/src/main/resources/assets/assemblyline/textures/items/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..192f60b31b6d2243323d4a80a8abe9a6691d4a53 GIT binary patch literal 3245 zcmV;e3{vxnP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005lNkl0))^Gm9Ik*X z@c#rDpP(>4L9sf1V^vUc9ojnkVA<#wMT_caSn&R-00B>+8~}JXPdETbBvG>>;j!BZ z8K0o&z;k2NL8Vr&=HiPaYzZ(vK{+_Qcmcr6atkaQg_#6^r{_oU$V`H=J9AlX@c_WG zQOI(O%-HCa<3uvsplDHblmTtM0dVBGR$x&k%*wG;KnwPV&N+2ZnF94e1V|W&%#~wK zK);6x7y!z}9@3d0oJfoYx6ifeJx?TN1Sncm6Ul5tlA65VADe!lTh9j@JAlabBnA|9zcZ{V)XeSdS zCNfj75!BKmBoh68lfSt#&V+826M=TOQwlEwTiOL$2>=KLVrI<-03dbqzk)AqM5AHB zTd(Hg0N$2;$PV0cBcfF& fE8q&OD!vB**h?s{7)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0004eNklT?hebnu1b_wARtv z%|vwhky4VBk`R%swPdX&hP9TYl=SY5TjV}*mSs#DEaEab6Z;|%k$fD9xP0>^@m2|z zIC3Hi{TOl3gb>bpnx-(0ed00000NkvXXu0mjfXj9Lb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/armbot.png b/src/main/resources/assets/assemblyline/textures/models/armbot.png new file mode 100644 index 0000000000000000000000000000000000000000..137429370760734584a2bea264ad81460088a704 GIT binary patch literal 3377 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/armbot_old.png b/src/main/resources/assets/assemblyline/textures/models/armbot_old.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a44b2e0d7c3795459bdb4f8ba9295bb1917a29 GIT binary patch literal 4007 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame0.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame0.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3561482d31064e946cb8d3d332f1972542e9fb GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv`!Tug$>ip#cgEMs6`n(pc17*cWT z?On&9+Xf;Hi5DO8r5@ZR`|Z$l53xCi*-u&S(wJ_rli{#g_Y;vUsvF8+98{N=wk^- zdHnmsWySORmN%>PGAb|>{PjL?{<*yH)!Va7#Th2QzwX!ZL}D7ll!ONF+*ToB0|qXG z16jreYbPA3uIMp?2+|kVM7@2_BCbA7n@{8!#|8FiI@Q+GL!q-xai&q(C_|qBKR%kNF@E^bVWZs&{-&PF&wb>;Ch4MQZG+X!*s!k=GZ^jWz70N8!cRYtGE`h?hNUkF1E308iTB3uX>|aV;SQ+C8#4C7=aN4Ha+7EgH_Y3 zBbOc6BFxw?2p(bJNf2M4+yV3lAM*>2q=uX#dls$johdnNA0Gy{vM~HLpU0xbY%a%e z>HyCJJ|n2hBtWM5N;w#N>|McPbfCzxAx!}2@ZAh&6@U_7B@(PUuHWHNst|i7w7&gg fmIN?eVt_;X+t@M|HZS4i14((h`njxgN@xNA3a%|y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame1.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc0f8dc732afb061b233bb1f120a619f06f1b6b GIT binary patch literal 49377 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≪@ygzsrV!x%`h+Kkwp=nYqG~72&d~1!3n2_aApZp2N ztq{&Wh?nZwmX{dfQ;va%;PZ9#QYc=dddVtqrsm%Wy2V^_ zoVJ)W2uK9GlY=kS%5QuE{S~dTF3lDK%Qu-7*@RN?b6?zUY2|=sU%}8>g@Jhl*M4y$ z_8uG{sLm`8ewdYaW9$X9dsbCvvA&}mX*4^&wtFaRAv6PB|`=pSW3FLd;M4z z`sAJ@L@2rH`$aD|7czv87qM#KwxU57Mj&_`zNA{i*FJ02s=BtHr^nl&@+qvwc-{;1 zb?kBmcXK_XTt56&v%Di)PIT~;PhWiDpOY7c&w|5W-wr3XG>UB}f{RT`O(Qz+@L1%Of|dm^$)(S%H8UX*7Z^0nn(m&?)6&(bq(`5Vo?5Nm!hF&=hfk2) z1Y8EDMGW$UBAs&agCg#0c<)UKTs8jL5B6cetJ8Mq(du}AODC5|C$x2OD!=Rh*axT)~tx~Xk9KF1ys1|Etx zQzz<>p~O8W>hvSLR92fnpH&wti3YhU8H_k7-lBmxTuj{xC3a1|XZ2V`}XM3 z;t=Rbe~TF_s&~r-K!tK3nalyXfk2Vl5H?0cYS$hj9A9|8ZI}%I(n`7plX45GN5qpG z|F0LcL1b^*;(ztgA?_iqzQa~%dFp3f!FpZMzh!$UBKrtD0g5@Ju^5zfZ_&2v;y}1 zYnO*<)m=L#RGQ~5imJ>mG0(n(zi>JA@DYS@(yln2A5w0by_74GCbG7m{I~i>36mPaG0AfQ^FPz$JJU9(VPX(PLg7-Q%0X zKFV>a2dAFy(lNcq7`^k7ukC}*rgsR^>CJb z_Tvt=1U#}EkDX8Ox%tg5Y?h(jLaHoY@5uL(CXSX9`eWhUPqAy8H9njj(uSC~m51n4 zDR&P$PEV4}lU@1_N!y<8>|9x(`*4N*ZSE6r?ZLWQBnmzmr$3H>cNdJIEXe2j!-%=k z=)A5PP;t8Z0<%eK^?9|&MA-0laSq1t)f>t^4kLG1uG=PQA428)q7FLMV02VPVef?K)d%#PGWW6!3Lcb86ryPvlqY zcBe1=Lf<^vxy^SU3T2)Gia$|PxN;UbmwUH4{ExA?c0|QhLsf@o9c-?aO6@*tL;KJk z#`XbQJXZ8KLJu{Y+{H#~baQRamN8Avz!UA`0~_}Z0x0E6IX?W1$CZ#zlYHS7kd3(oZISdT{wU+x z&i;g8w_h%XijfmCi#HNc=PYoD(t<32;zNqr4hW5T+Ja>Gbo6cJx@IxIFNCPX^+@8P zS2PMp%fER}nc*^Ux1TF2auBVvB_hSU*cV$D*adzVwM_n>L@%QCi|DNtHvFPASNRXo zL&mufy1wmhmhj!zc79@%^-4V6ndA+3tA^7V6ggQ%u6@?y?p}s|K422;}%IudJfp5W&xI&bZv0O;cmQe~vEKN&DZqD?qd8|1$vpIu)n&@aWN?(cCVf5smd zliN3FU;#TQWBtLExFskZezkDwa%m}(pY3$SFvrXZshN`_zt}VuJVmp$c5wO5Oxwa_ zjecC6QYDHDd@q^8i;7M^H$$GAYkGk2M?w&u!;vljTXWk8EnydLYm5h70U!bzGc=j- zkD7kxT0x!GO;Dd25yC~U(}@D=$fldVYP*_WT21HYqkROZI1n)bzi_BxnALzJk^f4u zSjg-Q$dTv*SdO$GOQjqpq;>PHxJX}<_!3G34D5U3S5H)4r@r*8KI(1%TVmG#;ryjz z&5Vj$=R^=!mc*4Jp(cweh((VVSCX`eO?SD!f|nfCtR`4@WyxAR3n_p_%>#>leR04J zHu$g0RjSJe^tpaL976;mXs1+-_DJ4ceYx4~x9zUh@BS=%TI&LQsB@Je^uPIaOz#12 z{(ZK#H$^YnQuvi`7w3#i#s>%QeD@+ku`>IUVuxS`+QZgvRK$JJ`uvQkGNyjDy?@>2kcP?m54t z{!>bi+p}i;uyY&9de~#+p}zHiIRZ$@Y46jafk<~!Bg2}gSRe34t*N>7f6(?GP)!9} z|0qQT1*J(*nu-cY6Odj)k)m`I0ck2-dhY~8nsjLb5=2B$I!G^}2%!fM2t8Co50F40 z?L6-N?)~n2Z>{%V-&+6wJL{}DSu=BHX78E3_v|y7-v~0`-Tqo3f`qec%iZQ~1;>aF zZ0G)qmw_4_Fl4$`HKGK-c!;6Rj~4MfmfJ2Z(#Ms7?}s+`-qOJTI%?-1WSw-hX5ldT zMEJ~MN@z?F1n1ZBTeLls2*i*vY?fqf-D`Ny_hh~Mq=2pY9`<#YExvqsD*i5L)ar~{ z59RSK(K3b9-yu9NwuhW6&OU17T{W6l8AOIl^ZI}U!{SGUn{RQtcI=`)W9eob&2I7S z`d>sDp?)!>pEx#h&(Y)5AUSMD`@6F_)`LhtZ0TBLB|z=x)V|!|21*VKu}T~h4et*d z^S8kPPZf3oQ69sNPfvER=2jn<>UO{?4O`TryJdnoD;{28^(-PZ9TbLCR)G=B3OYxT zpN{xNh!pF81^|I}(=-tL1fN%1)0Tkkoo7ekm$oip}}Lfx{Xhzk-`+U`fWFK-e*F^!{XXX{5B2)|LO)W zedpmZA@@9_|Ho};Yq6V0R8)pKS}L7H+^~i6HiRA4>2)N~wX=eIh&_&uj(@g^%hQ)P zufg7<7CNyaYSud#7aK>=@X?nlP0;6}y0Tk9<|4xXVQA<~@)+j~SP5354K?iBpLaz0 z>^826!JK$!(hi?oh53>e!r2iaX-6o$yLCxeWCQx;-&2N`pvRD%Yz%z25hJx3w*{cg z2EfIDss91CxWs^)Q*iGNp~m*%DA$m``EvS9FC9IAdU=En4PS1yxhDp{C_IVe z4KxRhR-dPcjSXxmhy}*5Pp^#n920G}E;Y)50PZrw;e{%x#a7Ebi}tmk(4|=_jvmzU z?l-@yb@ZGOHxtN8bLG9+0fkWa!_vPdS(mmy5IO#M=0;}h6nhL z{SjVKbZrpwDz9tXT0k;*_y~To>35}|>$~f`kaQ~^>Hlj#PcbJ3!Prw3d$q$w#tIN~ z{bS2%@rqc4I+1vYcAy?eh2%eGBsKIBiAJa!5{@ww?6M< zseB^0$GYtaZ(RZTN$@TR-|;CW&0rrF9EeK{X}&)LyG@9;Zw?kE{~)%K@`-=gCwuRV zSB>v|17oi?FNzbdPh-}*4z(N+z+Q;ZL<)7|M=*lNl@OpvNm2^aT5R8))9fovwZ;qb z9_L3k>;^yK_FUJ3W)kVD)^v6$%BMe%hKz*F4j}FO(R74dtxRy5xWpE0zM=~5RaKJX z?C0jdo}I1?6@^Zb7sJXcM|O@rSB67g@BX{Ts&g&;enInu4rETB`FoZ3pm+aHSDXZm zMx(B9w}Y16rGZnzI2sB!KHoGuLj~;hHl)q@4}*{!)yN+QxW@-TWXjpg`Sb%3FR?5T zvhGj`x~<4GG#uWLm>0`OLeBoJ0A~NTDmVO@)pP+8=kIutPlKx|y(^$bn;w_t`hI(V z7e0;KuPAXJF}G0Q+AHz+D^Dp1R$*uod4(tunUP5#3WSVu)*!3$o=xnPEaF>Ls=Dhp zkjDi&>u5RN&3)qZ7wAA!I#`)OzQDapa*Gvp#l`}#c>vyV^R2dZ+wD6wg?q5^JtK4q`-O5Th)S}{1n=}lpaJB|3!}<_$o8*Q6Hdi6bfkTNo zmc8Jm4~v9tPwqfe1Lz?lp^cpnkb)qWPlNx$##3^lY@t@)>uL)FuUX@_U1N{hzGO0t z!30Z7#%uy-+XoCL*~ym=Pxe^x>+vTnwi&>P4Y2yBHa2%SBHZ)stPk3vB+4tu=6fH7Rd z0}#wRIU8ph4wry?^y-tdW(x+-wZSv89DoS7OMYF3`h+^#pN?G^K)PMmPLMv?b?Y<( zEP%zQV4 z@TuNM0=!xyfGj>jwIn~?*==NNkAv`s2u6l{97~HP^`s!X|;?=#0Z?1AF(QVAA%sog$4%bu_oX-Gm5-haYWdeW{ z_DL*fKFO#ByWDUd|HEbd#=O|a`6!tOqUNYFP9cB!KSA~i*i+e|u<6IVm(@hT z>@-M>sK;w3M_va{1Cu`XpH`ELGcKF<7Ba6zX%YI!z+ff>sRs?_}W); z%1aT36(TaK6pSx855fVs>LiHt&%mH-8X><{w<9pVr-9=<^;lc_&|(J#T&I}?L~x2( zYk>bZOs!Bd>J*BA1`ETNXqJJFGkd5h(MB3tMXH@IzcUDs&&+O|NUi`9z)%$qnFoM( zu($$U=hqk;QWAim0H{MR5!aBf!)MW~K=z17^9>>c6&b^Q*Sit7kEAB9@dCJE15#xs zIAACkI7R6O=ez%)B>I0 zwgOTB>hDe`nGlLMz(AW{0sp841M)a1KzGjm|6DPDFezn583E9*f(SDy|0ETB(#%Wt zIVTbH;hYk!Lj!;;K-S4S9wE3};Ksqq|BU@)QFojRfdNZ8C&W6YzgZJt^t}-BEUk}% zYkeD$6$P|s@18mG4JVQLRX$k^qW_&y6JWV@9!WZzo{>lWYtV6@qUQjF6o-tGLD>Fb z!nNi9g|NMX@$=~j8lW0)0p|dNi2sP_$H@Q1TmR#v|MD@p1nHx><5;|IUHcs`%Sf~O zn5*Ai9$j4kw#cy?yK0>deSYI~E1W&hC2kkc0kG)W09gAR_*FX9EQ<0Ee#1 z<9?!6eTvH|>`!rBfYH|32eM=+KqhVcDKYqGvP9_F(FPJO+7U)LQ9xJA*k8aBv@|CP zzaW_qgJUR_^fSnuj@ld7XUR#K==UY@+@Xjvp zh6~cK`IkosPcB2y#h>J=Ap7HFLIDU&#)WK(Ops0w*KqBDF)gKHbdTlRdA1}UlOgwy z;@XJ=_pcg z7=|F@hgr*s;1>?lz!o^aEpnK=?NR#dMZhjs@Qbi<(bXuiG3C_R;vp4mUHx==G$NTHW=ijF;dW_7uV1x0F$Kq>NALn+i=>oo>3y$7(%lZe zI#BSKbk>&IpC2R6?EUBy80bisxN&1drtDeg}ooa%J~X?^J1{9$6$$9=JOEo0siX9G4cb$l#I_tVI zw=sj{-+Ry5GVA`B7gN`Ryd91l$-p2_E(^i*bGFa)VEYTMS@*Na;|B#VW_kC`&iFR2 zD*?lr{R<@UPilDCM{u@~Md8h|Wld~&Z_q{UGE3d;@P9UV)LIY4z{uVo!FxHyil(%xud(H%%F$N43O@uv-Pm_-&&PcT+0VuftA3Y+ zY+;{(F|si*r@Etnqd~jj2|q-@P(QXQ%7p6)Zrv2+l@WCyTd_ZdKs_l^rpXt|E;>}% z*v(+@%)xRQ^%ksP`n7DyFSCCV^N%e1ehzQrliPlCn)I=h?;`UXFIWvvoQa*v?*W^G za7jCq!a$k4qncd5aeh)i79FZ(8lIWGj|jL?CQ-JdaO4oIs0vF-Lw<1F-L=^Qqgr^P)S&Ce?;0{DUR?0>T99v$Fn1?DJ zi|YsVmWOJ{kX`WqMG3ANbX++N1dF-kEg+QF6?5T$QqpKzn0~>?Mk`0;X!IF`@&-|P z!*9bhsKTy%u)MNr!Y-KW-@@}?bHNg1D%+`5^l=Em%S#Dgr7~|N@C;AMzave+AG11^ zo!E9bDkjhkpGXMRHbv~uPLTlq9n*T&8tHb3m-|dX2!zIa(+_ngphyM93NPwlDzXrm?3|?%tDV;UFoVCG>_5s|4B0i|U zJrT6B>EAr6Z)4gA7mSM6Io8T~zOc^Jst;Grv9LMM z-=uHQ_zcH=qkvWN-?p#~+=<$pLmM@HZ0xXD<3V>IW;!qX+k*`(ue(^wQcP#0lv4XE zQtrHb6Wmf&J5OUtnY?oSropafadOqgH*6j5cf;8Z!pb|Y!8|sDGbK3=$3I(r;l{+GsN6Ry}Fu`-KZk-pMH2qDuSw7CGqq`*@d&&WkRoPM)R+ z3fE8?yBd6NIvVM9Ca7+EIAu;*uhDz{EyOG5SLI-ku@*_BP{@y7fI-KSf#6hb_=kzV zc;SKdOkpk5x@x!T&}&Y~jaexuR0nf(>fc*tPmG_pBz^Mk|B(NPvc3SutCXB~7-G8J zgkKb&AP_F(D<~~CZX5-2&F!#w5)?dCl<|2P{hzijJ-3`pCJFJV*Q8%kdVtOuC=2}r z)jD{}ZP27XxIt}db(X~%m@F<@mxHeV!XRg(Q7~5XWA$n~=>^FPMy5Ol53ULNPY9q& z*S-vXZessQ+l<5Mw`klvTv#4HI-$swY1X3mr|iPPG~` zYStgi7xzlmYNkyp4p8oC4%x_Dp;OfSd5pm%jdr~t7kJl7w7btPxq1LINi!v|&>FV} zkGuvd{#CCxyA^w1|0E3Ud*{Eh2k&m%JJbNIDVx$)9@3P$27fH@QC+gBJqKW@-e;Hy zl&P8CZ7h1QZxWWYUtwH%4|7APy$Pyb$x=>)&fB0aH_jD=Kd~ekogl(%T)@OjK|kPp zHjThr51R1DK_(jvot4%<@sL+iKoP_ z9iRbM5(|cQltF)V{NWq&stsgJn1*~~|ENuwJC{(%IN1;AQQED-K(`mXztrX7yhhSH zhU=`9m4P9<@h}dd_ERE!<7TLCTlDej^6|qHpjDhm{>Kz`KiZYl_`yD+5nFkd>?j{y ziD)@&_>d2IWs1NFOAZ;Vfy&y`D6O(PE?UYF3?okw`{5%N)kQ7_04>4v%z0PKmNmRj zaE+Gxw}>L-TEO=9AmHwcnvdn~H`B-cSB?Z~y=z;#fu>5S zWVFPO_PA#XrcDWhfJ>qcTxT4ffvJ#H6Qfz|%6B^3)PPTY;mzhxklPLbfprun0_Bea zIS*PcDrW75sx&an+t&Stw^y>pmYlu7F9)smvC_2Ko+~kx`K;t;JOLxJYBXG#M_!dZ z`+yaph+QdVOM(XLnxgi{Uiw9t{Ryr)4pLEeWK0rhoZ0FbT3NdMf{e5uJbC$?t8nN2 zqeTKQ`Zd_@YlXeUIqDio$o+Kjm_DvpJ5>{5z(WPWpz33GQDrf?4ATu z40JTWVZ-+X-J}5xfS(~PVC@KnC|q<6@X8hRZ>{-nBliz~;sCe86f!Jl!TDV4dIZf+m-OZeG*J4q@BWM`_f zHns}hdO$#}bDXs<;H9C*_){dZrtk#p))qq|1<*_?V|%Xc@>PBb`!PSnhB$82kT2gg zm@hO?Pz1^WpL}9acHVyBWLO^MTwaGud{{U>ald9Nv|jIH44Pl|hWc}Ma%Ew;hft}7 zDFpv+_$0CYG{z)n{RbLtlygk-=0Cx;?^~k475u1=zMr3)H^Bq2ABKZPA7hG@N*7E+ z{|tnCDcKZuPz3$#&}&^dM9t1pj=*qPRqL=67c!-93Hr@5C5gX;(Bg?2c+fBXIh!zp zs(pLJS;pVA_W6{PWzvDK?(*kn(gj|x)PcR>w_FaSUy@mTLt6{g=T5+sI32LHr@dE2 zw!-D6qvA=&mUs3{hlZD|HZbLbWTJsWhXlV$$L^X+xUUxHC{ezpjQA53va#qFIY{1? zp>z{ZVBO3yvO*e~=JUQlaY_)LRVHr)TfvKi3nqMc^GRs~^9aeYUMqhTTiX85g~h;t z2?%ykelA;iF6hH~uNNLN#NB=Sbtj;m?Hma>=szy**K>&c|NZOS#m$X(+j+=%(dz%P zj2Z`$KDAYJ)t;@fJI$q`_f1``8B)Jfj}$7-Fn%idkAQ^0;c(=g9haxk$f#PLY+VBL zmd!Jhf<@!c_BawN0#kKG7mVUT_b|v}LDR8sxqcSsfH9hmA_j-_A1eN_8{U%MvdeKlQ`oGU8w84LjXJ2a+z25d zIH|q6q)x&G=kf1>f3E|MihXyF?u=M>+*8^nR{gW5AkVVrP$Rx*d$F_WjGbHA)vv=i zM><^axJjG(lc0J~x!h##fa^$b(gYCZ#s|e{A&ELJx6AXe7#D#dxos`tns_TTV`(!u z3n5%#1iioSI^z7|FZ2Vcc7ecWGp%^^`J`L2c@*My7iTT!cr`mj?tXPZ-Tk(C`JtSh zc)yfmhv{5=i*Ynge!5*($juany^(5aUBpxJJNO>%Np|~wu|z@9ezvPe5gGoHv%vw> z;qvIjv~2+Y$L#;`gxp`258wU zYlV?Py}%9d2|3k&^>h1;FpQZ9D#Rb_msJ@beO^YNLTQ{AjRxT$u$|2lB}e zN*N5TY&ZZTwFCUE#z>KoKAsgV3r zNt{4RW)#@v@U|Pj+aP4NA1IP2z=-yTTTBavX(2~j-lUA1X)Negp%A25LRYS5ch+|1 z>&d9*Zv+|C(YOo;9EZ{jI(|5(f=tlmWC39yna#L*9Vh2@6{QX=^j`w`PpP!hQ(*c( zex)g_^TuW;znxV`K0nBV^4WisP;vDCz6zqCI9Ec`E6!1`uE!YBcrnp$FFvqJvAbDgs{OsHvB zVEW{vwlH)2?>lMQciC>7Kl#$k?lRwqPdeX^nY<@E*(??&ZiUjFb&mIL9D&y8;%| zXKUVf9gc+h5D(QoC^GXFRfVR!BpW(h4Op))2j;7+2y8t(c->qj1j1cr{<82~_?t}< zb(KtHlaFQo{1W_=wVJEAAW@wOlR3e_AT;SRFR-r}q<=^DILppZeb`2ht$#w<;L^kU zu4Rv!Ql7X8k@t7pQv>$rwb)a3;FZ$UNKTjD)S|FHWf$Ay%gMFgqos8Gd@pxR8`&f>i%KQMK>-10U!( zT;w?}yX5J2wz);h%`gyAR1Zr0B29WjB}!vv?hgG#S&Z`FAXh2#kj7B&(V8G@)}$hX@Rsz6&!gUz zPVlr;Uhwjp1JJjxPk9fPPb@hVZy0dt-80}5kXe^rmM>vbx}5)WoAf7v#$2@s*BzyO zwV{kQRriaJblxbnUXE^Kz8CCUMF&rqiKXz%lA;`M?FBO6ph-ng zzKHnNUC(?2N+k*sIPm&S=0rMRj&zyVO7W?0cVXiT$GqHEp-+Sr*PAlKmNhZgjNV#} zdEB!wd_7L0jFTpDm@%6}M-*4se}WiG%{`nbA~YfF#D~%{E0Gnv(oZ!Hv$ZS^qAv#c z3+BRQK*C(>Dgnt?k}kRHEyKPqvbYUj9CT3z9d8ck&b>u5)Uhf>EHcd93y69d=Nzp0 zJn&K^Bli7WrpPK6!xPy&jmA{BqtnZ8RSj|uClUCih%yM5aya>8%*Mj7`o|iRI(-&Wjb8f)O-AYy?wL8pi8&8fl_ayLPrEuT`Z(S@gymHb7Ox?XDB*( z@mBWf8v3!zA#3+`0J+cv(CF@tki;&Oc4eexev}Q|G3ktcI!J8xVNNMxj)z#jucN)T zIZ%)+q;M&W=7LWJhbH41w~+vk&XbCL+;_9Zy!U;jSDMA?hVWz|ofLfOrkzYXiqwmqd zYFco}7b7LsK6eMkb(i;#w@=FL6|N|jl1|xP{~;<1*ROtsQ{A6|d5$uTP$c&zQ7NJ#SVE_m7z0hcO2 z>{>K20S*tqRs%`Ow8l@|N-%$!*mg$3Cszm}Z9p$ANLzd#cg!r!rZ?72no0Uudd5@%Vs8|nPr4tlC@Q1Q7p@jU`_8KB&lSXK zw#lR^RV}?t&V)GltxNbj`wUyHR;V}I5bTV1Z0+%kC?~TLc1Y*f!u}3zugaq7BCJM_ znVRr$BO;Z0jj*@5-u7_R^3vQEB$(>DAlo?Y z>&kJFt4rmjs9JkO5t`#dru|`bLQ<6RGbA>$FUn2X?$eXVEwU>ad&IAQ^>vKh@2^^t z&G(XG+W5)@L7Q#xyB8^ac)5_5scoc`SZepoxnOF>d?GG)ytE8O#_XBNcTf%$U9{aR z_ojb{z|$ppWVXlFhx=tG_2hDHM8ZGZ_#n(#zPWDmz+FN6T^GJjgH5fkCWd?3))g9l zI=Wwjx;m6^5tS_F^SZ#X=?N>l2Cc+~a4_|R_#C@$B&YmG7u~);sL`%Vg(G`h{W-J@ z8$}6Pf`7RtLzra-Jr0I?-R(+Gzil=itYn6$cpn>nQfBOP=?+MAL9}-i((yGhxR|j! z1f?-gYrt^1{i;7k)Vk%m{qz{C=a(KCDmB|&_~ZI9wa?KsrE(^AQ9twg6knE&drqtt z`kN=UC!O%iXdY(3#4k^}KONWe;(Oko>ZXl{8ain*4?-JB99C5!`9v8hP0OvxhE{yA z(G2UC;M*(jU^JKgShXXR_W{gzKhNCSxs&7Pvqh~Ql7@nDr@t(gt*4~drsptguWpIt z+TCYfd7#vA?|0{*gZW2AsP)IFnZ{Q(()p#x{!l0Grs187k~4+M5$`2#-7sun#Crh< z85&l2avdFM>Kaj4->2hkt7eXpTKxy&E4tFX$hu7RlB1Ig&dDYp1u2cUQd3lPdy$tW zD&Hpn@!V96uoAa7iV`fE+Udq#)wNtb&6@2z8*8UHGp-irr1j+5V*|HxEmhJYVtf9uaa`Y%j;lwM#hsf64VscpSYw` zekm2#d+%C*$=yf=hSfF@56P(9nS}y%7C!qpmm(dlML)oKE47NJA&)L<@w`Eqh$9-IKT4EH9atF41&y4XBA} zQ%Rf%?hBD_F|^46(Ni{D)!5;jSmYRUs{4Ar&!H%)$N%eJoichcg4)&{y$N!ylR_ur z@DR_Ax-eE#=mFgkbTp=NyVY~ITnZ|DD?=kHkSGB9DbLd2*lDs;AI+}W_6U-*-FfTs z<}w>CrXJbcqwy#)^3v_BIxi5T>-r~})MM4k<7;sRZ06_xIrNctGv@gzphW{zzeEPj zX?eXD3V6sQs2@x?L9O`3nPWwI?`M{zYrfRa&LR};=;h&tj_8C#4ISuT98Z5aae0@Vx&g!2-?h)(I9p9rtm^S?%_kLA*fN+%qrc1`yVmhYLrL|0ly6wJMzEdI78m1-^W9BYPyy>ghm!ovy%M5nU+pH2UZPA4p`%(1=%At2 z1*Q~Ixn)Z4-%Uf21M#+Vr#)j23+N(~A?}MO@tD2)O!zs!UKJ@H_08+*Q#Ed%4|!#^ zIil9=9S+gWeZKS`M->g9z67wz)hbab=+v|R1z?lAu$ApmzD{Um3g4@1>|yM$3tX6t z^;dx}{Mq48Om26(9GOx^MCvByy+j;8{&YcKC$p>gB5t_QWbG1t(P#K?9BEPESFYnQ zGg>$NwSd(|)zWRXxBi;~;|@o#W8NZYGuE;ZqqcD|?4zomHqN;4+ZU!wqf``Ajyt$d z`#1G?_vuO%Wn$?K5*p?E_XaI+Zqj~x{wK+cFa^ovzx7J}#Qgy7t&)I5cb-i`6>y4A z$-eOIo1~`>c~tM~w}#@V(y|bYD1|Rw<()!mjJt2{O%TiSPLiGTVfC9~b?G{cQuUz5 z<+>YRcq(|Nu0;z+6myPO8uVYO{e1ke*@^5QJ9O@0d{p33YC#|Cy|`D*a)Qen{2Av> zETQOJ?|zi8&2g1m)_Z++@{-POQp7-D%bqG1R(??8>Kv1Or|6GzO2lHpLw!ZZ{GIiv z(;WV|?}Pgz(nVXb_quwthQ+6+8{NY83$5Q)y6;W2|9M7wNUt7DnE>0OW?S8!96|Y-^5&*LwU+ipzdI|atKuIpF8T-^((`v9;ka3pchost zNpg%?n6$bYqp9?KD@Cd%lD*V&Uoy)r)#8f4PReIBzFeJTN?ZN=Tc5szkIs4 z_}Wr{a*(J0WsadnR>}^re@pyB?o!dkLZ{?qT>fs*rH8m@6sfwm`-85H7*QKC3_}?A z_>5Kl)ZBkm^}0Zgk&0hpfD-aMVY%T6Yq^Ydo{4^9I-@%AY7dWCoeFYs*ufPB&pm^ezYQpzZZ8l`9^x5T}_sfWclSfZykka z{c-NVZkfH}cFW$gt!Bp5cQd=d^`@@0;E!ySh3yA%X4wT)oiFE<75q-~1;4p?Pz&;zuJn&Q z%XP1`HEs{YW`tOD`k48Pe=C=hif6JZzghlJXN%*wi{k@R!&HvUoHB&sxo4qNY(mrQ zuWzn5C5xXC@66+ZM5nWb(=qw>ovR;1ic3Qw=mw?K_3lpiMu=?sSlZ7+%EZU`^8z^ zioKVtl8jr7mcRDMNp?P}=~H2=uiq}aWTyiD%4nLwH*r-l?*!XDmiT(!e%)B??7c`$8y=xnwKfcuWZMzyhykr!j zW_0FBwDd=hq>mbi0S%(PCv%6*SFlO?l8qzUI>rYBt{-%=?&NuKGaO~`#9Ny#T&Q!3 zY!eUgJ>yyXLg%DHLse2fE_q-q7_U;fX@fehLP}OD*ebaVg4T>vkF) zzPSFbFz;xkZbhSg)}54#!QVITJz0uT-F8_RW@j>9cfBp?hnHQRiwt5x?toZqAf~-r z?SfINZ`3D_w~h_YZhHqq-@pF)P3l?Ai2HPQQC%DpU-xxI(j&>Blm+QKKUu#_7?ZZg zvB)U($ah8;HlX*Fn=De=_^zl?Xpg|!ks>fyqChxAw>CR8TNLX?%O{_(W>9=q!20;YAocxTw(Emwe86%Q{cd@@}= z#&$%zido`)4E1Wa5?bQ0*SMT{lx0&UBJw3C>O0+Bwe1hCyt++Pg!L)3SQpFu$*V>@ zoN0$qJr${*4rH7{)YIh(lW86GlbF^qB!F-;{aCyIf~*>wi_}gjr-^*_zukbG- zJxX%)hF;&2^X6b;ze~ZgKh<)b`lU#l6UN2qi1!LFNIm^-<7I+%)}in36dY8}P9RN| z&2TZ=YOW!-2oYex{FO4mm17I8P@ia*Iq9B_h{1Y{>XdCJ*`3jA-~7JxUf?mlD!S^N zCU@eK;ahs>HKL6G#aU$AwHpUFKY!%dKadiXX4V!vIUY725sz)URbyoQH_?Sx*nMc4 zV5Z$(acMCA;96SL;1KA#GQg2*=a7DZ5_Mm?4ooDrTWf$>pJurwFkk<<<-61$Qmmd` zpVvODUQT8Es(pX<;b62sj}&)Lcc9{W6vk4{oT_mVuw5Y_#@55c=N?MmLHxQsoq{RY zk=wR&mFGV{dQ)8cPM4y#egoBgE4trO@RJnj207SmwkLby3U^Wmcux1t16AP&9g*yy zW3XGO6PP!b-j3_)*E?1Ra0D>F(@bm9Ec)7|%<;{e0EtKCN#9AIqB`G-G~Y71_H($K z!oV&|WctE%m%RRm>zD1cO0tKF^=8S%ha0E3!Y7wsoN6i6nVy1gQ+i8pwr5^+q%kdsmzDK)+Xs1>xnx>YX(C#g$u^Azg3{X%8 zy%!gl&Z0wfoQ?~u6^Av!tnsE-xfR#zbvt8VB>8~5q17Jd5uZhjtQ1)W%SPsIuiQRI zb0r*T!g;(@7{eqT3XMK20_C-#|^vwP5 zHVmaz`M1@Nid-o<9CfeV0vtDt+WB9a{Ls z#)$7auW_%n)v4SjTit7pS_tMtDE)r=%?I{MG8=4q%RX2!$?%ER5rcaAyGp{tQkBg| zdoTi&j(Tc|halBNCFNM383@=W?>&cVVHXG{H?VwF#*>`t>U|(zyFeHhHs)0KRbpSH zY{~J?mYt)|^HmUoo^+TnJ(W#eyWNpMtVuP# zp|rQOqP0AtAIe);4+(sY)b(giF!}>_H4M;^N!r~yFKE9wp2GUI@D#5N+4YUUWT$v6 z=n%RSb!iWC4KA6^{eCggTITEgiTnX$^w3gNPmgtrpHDeF*GsKg_CZ(Drc;DgU?Oj| zIr*GAHz}$pz3{z|XS|M`a_*aH#%5XE>R}dVWeMyBPBaFizUq0|;(Vr(n=}t{3Gxc< z_iZ?0wXV<4zx#Fnvvz3w;@EQ6rqny#w0J=A(LfaX$nwp_?}T$s#V}<*23a}ig}jh{ z@b1~VVr<^*ynRm6L*XyC%Vw^s{u-L;XhWSuuNR&q>NL?7xPANVmfzKfOzQDY$ZtPi zBT-MU_?Am-lZd}U%Zmd~ukc0nc=F%R>Ix|c`>m2ELZH--F{V8#~U8R_f^DzW07tu?dM5j;ghds znYdK9=^>`;;5IVNVd-!X{4jF-xF8fweDKgiC zhepaRxc@$Xu7RqOS_FY7F>3Lh=Q>(F{VCs-wo*p=X$T~x1n|oID^+vVc)Vwyy(MBN zGT_Diy=X!D$sbX(?kb)h=pBW@yzB#$0c_49*ice?NSoBCtJ-wCY#q@$B%m~q6Ub?ZhhT*lOTV>pR z)zk>GTbO4T530-9@Y9=@?yHx5X=Wwcb877w{WHL5hfSjcb@e_iIx)6FoXx?T#Wmr z9tDNzaLq3#I{T6`V=lSZvxfZ?X+2Ns?FN%KHsgfUOTjmCztQHwj9>eBX}K9Kpuy*mR#Lc|$HUF?=;N zcEk{17#rO;O~!RaTUUD_JB+TNvencKh~Vw&X^XOW&F;Un9@8kg0O$KuF4h_9F9dv5 zJc*_fe{i+eFdu5-^V=A8eJ?qqnVmke(sn&BdOYX2=5T?PL?p3m zxVmX|m%LU=p<{QVJ!0!FRnxNh>la;zFn52sTUMcI?sE%kvQ>YFHCT`H{*e68qLzCT zCERaM^!Tw^{LQEVDKq!$T)AC^CscU~OJNO@W%tYsK<(iY_s<7KA8I+pl|9}|pEQYV-`;Vz`hi8Yt_y?Y~g9Qm@&l|z1q z-e;xlTJtU0T3V^j&Zoz@%He?XugK4lsbiQ=PZU#K^7pQFH(ZUI{kCTP^%){C*CJt) zrgqxrT117`WA>&Mw$3$y7z&~I>^mAo&2`%D(=n`|+{}0fyZEroeDBg>rAoR(*r(!#0RYu&sPVSSt$)s6 z9&Oam!yN~`fSy?L*6*mY2pGoZ2QNQ3srewqMVnv?`udi)0NCKjD9>=nm#MGM2I<(0 z-!#l0=NG=^^HRX$`PI<0?VfZ?k$c;l86OEw??3JaMRlF_Vg@ZQ+vn|x4lFE045-e90xA|jX`@F1zrNVK{TH%j@xRvyk2d*{vu=cyKQkfoDt|E zf9o)=EFKg4I}qaZ(JA_H_|A97)1I45N&&Q=&OMqhgsJSf5AQ+vKU=_XLz*A6KDSfI zf+ITv1`qP}`U#11+Y{dS>i5+GXWosO^Y8^O6$)V^uHPD$;Ms zVTf`+($EhFWVrcl($Ltt#>O_sA+0-m<25YtVO4nVvRIkwwZ)^z zD_J@lZn$@pHH^yEz@n-7SFe~m^_0vk#jA=OwBs?FA8JQ;9@x?}x69uQoDX;(`fUUf zP?3F)Wbb6`SiLcWr~JF{*A6O&`b8Yh{5jO)50UKjzxvoQC&>w=tPBEP)oXkwZBAyLUHpY}seh%Hd$|PabMU;E=L*TF-WT16D(@64B^i_u) zTidz@Lk~~t=MmGh-?gj+rwwGC15=dpidioOIk1<#44px@dY z25E}xkcXkUDJU=(izK#qn2~na0yt5-EDyF5PrLJS*5Iy?P9V;C_@ffq=hMd1CUV52 zV}N^l>Wg1 z^aw&~Yn5+58jfU0w<(&;@V`Y!;U?%UE4V=9Jx8X&wY=9>xsq(A&sKci&Ln#USl!i( zEehiTzOuFkm0d+32*PhT_@_3j^uPvbpI!n_)NjHS z^GxGk@x_l;rG;*%WQ3`N`^CPkw)M?dpTsX88;bUt3y=Z;YvNf(isg z0Rce*0$zD)+az*+Q)NkBjCzn%OjvX%7Je#UE?2smq;tpm=BU|&8x+OM*f*bLR|#j^rrM4D zGBb6$vO+ZG3hO=+qfyw~9tV6?t@_in>d;Zg6~PAzlSIo&4b(j66p>=(l;G~*`@@{x zm(7w^GD>0UDPelKz1+hS;p2hqcPdJz5<}^31?X#|a37EMjD$>oIlF~~oRgB!nKK1Ub+42t)R{0Zrhn<&6t0Q9D__R-!GKBXDjHerK5KB<= zC~Pokb#=qz_uGmB2==BXLb6#$LXF=w9nq>#>5LnmV=qYVJhCnFK~d*0E41}-fAoGg zv17JwYO{-aTLtyINsl>0aH_YUFxgem5ufrtr$z7x6--bzk=9FB;&bP1FdWK~NNwEF z8QtXjXcuwk%(&Xj^m@~YMrDKaarMav<&+f*n)PGOx5WIeM4qmrXM63C@XymN;_M?d z{J!fXe$~K;Y6-UkRf)_pJ;{*JZ@JQMknsEUb99xXBhb1uP!1( z9?@u=>9k$`OIeb{lHmnZo%lF)W%mTOi%h;y`7p`-BrVbJZSnm)C72So;GoO?T?SRO zqOpbqbZ#97p75ere}7=bM(u|-4^=IND<%4Yx6F?^fj3FT%`)kIxBX;KhxDM}y_(2b zwUz|QNS`8KRO*6VRO?fzitz>VeDkg5!)Kct+~h6e*G1fFN?RfDGHxVki&Y&_lo)h2 zkkqK8xP6wWTfgw(6Jw>Cy)|RK1w~{+s~0{rym|*i$4_xn&<9&v$7Jivj;uOZ(=PLv zRNWa(c2;bUz1Kq5YE-fk)k-<&U}9ZYvMhgPwS_c=Ur^m^yZ5|`c#Tl?EO*SXFe~_- zi}k5Hgx6X64@IrB0$hS>b4huLw+kD^v$hkYIHFNIJhe4uY}P;fSEWKk9+4YBoFO+-+RE`#WM?0VVKsF^y+Wq8X_s!o9JG^Z$K6TkFaUpUY1U0`IS z$sP|$J&i~O}KTDx7kISg?Aa_AYm!5gUdGDb4L}f-=M@h z%Y1X)*!V`-rn`-!68!QiEDzI?%s&jfK3Acvr?N8F%7XL zlixc$@* z+Oss*rR^T+gD<`4A29Z>UR-#}BEn`5AUK!u_pe&3{-k?uu}aANXj;QmKDaf0o>y9)ukkDh}fdsx}CK18*^`SEGY<=X{ym+9zT#Z2@zDk(h`bgvD1`!UH z2NA$ox@3eV8mmgeYGDytI5bXOLt9&01)+w;VKG=W3{FiIr;S%v!(*|C?-$ZQ0x0SE zyL;fR3H!b`2R!K`k1?5aJO;yJvCu4aG|iua!RhMiE~imbQw0>Nj6f=r$X2B?P~VdL zm4`rPko-OAOivmWv7DFaMhjr-BazDu{kXo5%a{J6Au8iLJAfjFO{8ORXe{POW*|@x zV1hUGCli@8e_I;O$Kcz@_j&r0Su}rd2Ex=v6M+Mw&^WXDXem@oE})oYs-Q#eWn1Bixea?&%TuzlCez)wI8d|4sBgTo1EM z=5M6FPQ&sb|55*c5p*a007wt;_xU040Xp1>pik0F)SV7laEG0Z?MdT@Wr%1VD))cR{#75dbBI+y&tR zMF5l-auHwO zi6M7ExIhsAC5GGu;Q~bflo)asgbNe_P-4hk5H3&zK#3uDLAXE>044s9?vnVq>Vr%L zmU^&&H5~#@*EDc$X^1(&*cR9U{Ph89o6$P%hvD5U*ma5Hh|gB&1jHF{oniA_<856Q zI%TlY;+W6tYK6;mycSfC9oy zyfWRTLmWyK*FeJ zaIru4<>;E*LG;QlMX@W+(t#yTzDlC)8&HoOLrbG72cAxv9$Hs@-U_RM2c82qhzE1C z4do0Y(qB!^xjKD9$y|X)m*EDdQxCLqv*+O(mt{JG!y z$1OHS>f6IyL`~|-7)5E)A#i6r+7`QE-3&A4>V|=g8Xyx08AIltkfSHL)m&n7*hOi9}mh^u;AthaT*QGJFx^Wzs z!L~`6;0!@0X;9K=LG%tv8W}4rZ6Q zUEaHh%Y6U%cKCiYjd=Tx=qRo20t17V_0M>RkgT@$79@84rsb;UVD9Q+tTIYIzM5m5NMfC|& z8l|c{%AOovT)j*c&^e0bCYVU&>tCJ9d26BQuE3aS%enm??01s~q$`4HpQoUNPdrS29==nk zJ%@=G-yd$^L0|lH-T1Rx(Ei3lQ7JB;Z~R_lPA?ubTwZ5igf?W8-s7hQSow|pStbo| z@jZWu8ltvPy^fNmrUd%eSqdpjW7?p@2{`;%CFUfHJ}agP7>(S!=Hlq48x58 zp-x5U7jH2H&T*)>Z^sUcI)3R2Cjcr>eIk+uO*{yw+R2^oy6S4)$z2uN2W(c%l;0?< z1=!|xA@AoVJOS*W*H0cJwkFbsK#_qvymTffwMk@v+5Dp0d+C;)t29*j z;83*9*MmR*PHuZ$hB#y@nT_1hL0_vxt~RpEpi_|4tGw_H0%+6?fajHDPa;+1?gdT+ z#$&b1t~30kYdTE`I+@xve&bMH!7}jL@JBD>L)Eh%z}nZ7g6!dQSRcj7t@oh7W>ml~ zCE3HUl<;)|z*pB7tOeXg3O=Gl!~P4si_ zRzgUy^RZ!BT-ZRTqgM`m@(Ol-+nv&OHsX?x>!Yv#Z0EP}e|69oa^%6l@D(x)l;G1qaFNx`3ZGe^HpNvztJ9I)8W{XG79m z1pCNxNQOB>Q_xLwo97$+z5RkYilaSnE=(RE)+6 zZ&2)Ft~whU3(pB}BX8TQH~id&l)h|lhu*y2d)L)lB4^pLjCx8?g~{=flXiq2x+E93 zBz8vV_@Mgq@yXt1N8Xk(Y=Re#NFg%zg0^;=z4nSEEY=EJQtA)BAZhTB$t5oeX?V|0 zi2a4d-!WEK{dLGBOj9cY(S5itOy@pKvrVp8i!fZwZ=K(+SCl(HdP5Nv3UWe=Q{fb3 zX6vVtIVW_h-7rI%s{*Iann0wfO-|B=j?%iOfTRrIyS1&rRv2@b*1x(ZeI+%uc8yck zDO$%tO?quyFNy9aI87^@G0nV^;k7Rrb7%Mv1EJ(K+)KC*wbP{Vnb~}{=Vc;tkYoU0 zY9T8$Wr1|5IqDEdx$^5b7%lH6!8Lg625yM9IlMCu7d2?N!HIn#IXDJqixZ|IQ|t ztG-4G{N2VEY8?ZLmri~v=Lk8zn<vRHl!7zXwTc9OWJdl_n7(n+YT8y*R!qk*C1SKqf;8Q)m zIIi5ia%E%;I$7`x4oLaEL;?@G=zu?hB6Jk9%a$r-Aq}-~eOH;VuX0yAtX}z1k5IlK z9evym&727PJW-al>+4>aL!#;{-0!SS6-2r!{ytT*sK=NT#{jwQ;bl4m&Uyk#~4c+`pf=Dxs03!k-UB zFw~BTe-_4&%xypp(wlbW@K7za(QryTCJc@wMu){QRk!+8U}gQBM=gNp3yfDkwEtkJjAND!Lea2%yDM@yhI%WVJ_P$> ztTB_`$!rf^>h$Xesl#$_eQwE60oQ$>^X}zp{d_J;HUj(UDsK@JBjSGQz*mQOn>*Cy zkfPoNfxvi+Iqk-}j* zva|urHPalq2aS>I0MhC#DUR^t^f1|5+c+u&cGRH=rVnu~Dc9dj$9M%#7yX%x2U-Hh zQ!~mEs7xd!iJ8~5u_zN!k;$K&pnZa>{P{mA+Bh-ZA?Uzs5vIy#=Xp1+29;&G!P)U) zVa_=&yGWcf#pSPLkQoEv84O@M;LTU7vM-f(mfc8yG3Lj5`(>5*7r9TNBa$*077Z;g zfk;#*uM-ZK$>@K!YbYv`m&i6(Qv0H~47dnOrVpx6rSm-8l47?#D@XEQJH1zF%^#u9 zuBkjHARt&{l%mJ@D4dovpnuMYgl%3Su=74=!$lB??P6SO8O26{*4xHOb$Ioz);8%j z`N059Dkf50(hPWqp9l}I^_7sllN3ZUEt`QQgS8#GbmjexCNX!Q7V8^Vb}>v!AOao; ze~{sLISl?t;p2Di_UM#u=s z-`5DMGVGP+xu2ysY$N<+$syd@f6U|BmHb!So>l=j7l**xK#D2^GKBVS>yj>KBk ztcH&oYDnwf;;B?!wu@S(^nnS7n+wcRZDUh3W;CY|>BPcW-ZNyj#?w{&&X_21hD{`w zbmISM|mb=%%Xm>`4*NI9^8Ggqbr$|od2usFVjTYo12*P?I z@vI-Ee^V6Um-pJ^gn)+p5Pi}Y%qD@} z*PqpAo(yjy8bd0$p$o2kw@CcldTPSa~Oa`Z1;DEvjA zGw~wpZ<7-$3WaMuP+?EDo4u_s0DTZdlJhoJ@eVSQl8#U2j$LW<^+~k@fC24p!2&1n z95#93rt{&9JYNRmFA#yY7m47h7D*}>0@uXP;iKtQs$a^$%vRH;%a-4q|HiDa3?$Lt zj7+{OXK`BTU9@xR_XUylQ2^+7daVbmE;QPR5MD{1&y@#;qPzv z&nWRzM1}6p%2p`z_h$Y3KY$d5P zP57&oFwJJB@KbQLyu6e~e#9O<9KBzbh)beS>Q*V1uXrb!dj39%zkxKRkiVz&!C*>q zxgB@5sS&F(W<;y`=h&$S>phK7xND?-ZJGERr*^7=sc;0_If5S0KzG1k506bYrpaaO zXYb5`DRcJl#KvZo9HC?#pW(#7&%BWzw@{ilFdvw8@QWDwUX68M!Z$3rCRG4;A?Me&vS8L%u6}C3Ob~c+A@Sey|sx z?hRC;%D$Ns(xcIbmrgA+PNo0ukt=!v5pb360zydY_hB<@iGbT$;rBlc$3cb619w>^ z=k$xz!ET5d!KG3)c_RK`*eDDocYBiywZD<_8wZrO_^gjjhGKRDCtq3-9Nyi}a<|=M z_zE9xRcN)I;xG`t;0?MT8RG>&kDGb;zAqu14anEG>u2jh{ylDmuSM z)Bwe@7EAAQoVPjB@5g0*sr&y-3@jo9`g&Sc=0AT%bP~W!IZnGF9!kcl9D0AE{*#FU zG%?IvhZgKzf?=W&t-#zAVoXBZ{w3?M2+KXfK0lOoz`JjdTyc_O zDktrZ>+c1ItzGin4+OwQoE^}wjLB3@7HZUlxTELY(yf9`Di+`jgs@kDYR#!wI>Crl zDu`#K;wPA_1s`!KvX&q>$!B{Z`>c6~{5D^3ips1cD68p~Gauzw>anK}bdr@1 z!&^tL8#}NkYpAnKK1SPFNq42+nw1jdq{8>n1+I-`D?E(LH>Ua)NJ;8hLWE;qXD*2+ zSowbwL^^7qIOxuQli+wU#cSdTql6synM;t--05IQK7x=ob&YG7+?Urui{RZ!NuihC z)>TUFD5aVwKqV289*-kByyx&Xhh6RWY-?^t-BkJB77k=uN;$J6Icmr?3FuF^?ADU)ilUl}lnW<{$DFnO3M0O1IbROwW8DE( zNIaG36L~rLj?F?fBOIYbu~)g6$lsl5YczFF&PD3E+hZEHkjYvG@yh*m#(z5x!OYxG z^1)}^u3V}jegr15oP@Bw%ET^FvR+Rev_f7I+>B^@vQ@_0=oW{2n{wh5^Y6;p2PD=^ z6_f|5sdKHuj_l52Se{?a>T1|CGBh2Ey^PFC0{|z2>>ByZxaxi8IQ0X<`e?4-v&VL3 zZ}cn_93Mr#i!g@Hx-*6osk#Tq)#xQWC>-%{PPm#vazimTi82f*nPLJrfs>cSHznNc zit~GIEh89C= zuHylOrdbhH~qh;EhUNer?xji+Gp_p_+KC%joTVyf$bSbm|R&57$3Z68uF(JL$*O zX3j}@oUu3g+FwAcdvSe*>*6UgSKgB>DSDJ?}8+*i~Z+J(Y5zNk)kD zIhxV7omUa}FhA`DdK)|`iPCrbOs;ukuB%-V0g9AYBwY?1x*v2-bG4BRX@#lIMmxnn zJ<%E(g&$|!+q-q+fN_NeJdH$lExgjFIL zp(t1GVzFXVWFj`y#3v(ZUJ^_WR!L4l_mNNV7sCZVtdx8q2hz1sBJC%KXR+7y5<3CT#cSGIMTD-EW{yUF#5RNH{o$y`~r5ap+y)4I6!ltLAOp zK8z}uW&RFb!m-OAQ7w~xqCc)v;tq)PTlPzG>qxj|+fi!dY9lB2J8*W7YG zAk;t{*}1tKeiIecp*iTT+aU0BaKKyZTR|eO#`Ix%zDftHMHN3G7xk+&K+=q<{L6LH;@r6>ye1WmrizeXwlw(Sr@E*DWfvWzbThxeK29MPDKV|1QeWVm z3g8}L*lDW2zKF)s19P>7XLK?EtFXdEK>(<%)Wx8qQR^LE_bGpr9q&w2*T{_QRz>*q zh_RmzLJphQAkF1qeBorfH5OPx=@8+ZtVf-5`!l#tA<9>(pU0W%i7+llY736ymSEQl zXDR;l$$eO&KS5TgBEGskObaJq`pMyUIR1-Y(FtXS=O1-z>71O(T!Wa;9jxa?csx-S zlLdGp@qd`Bm2@2ksY!^wkzxuTXBlBlKFNAAOFVItBVe8SH>ldFt$C3&B6mc6c!Jv| z#+^U81mCtiFKtc7N-c*vK|j9MB-n=~#;wK|R?}layI&>|rUX#l9YW*5zv;$)p8&=EzF3uQh6aw=98 znF-CFRz3rh{Yx4xMmxuvx0$0Gt);w51PQ4ND9+R7N-Al`JO-QV!=szr;o`o=J-iPv zL!IFO#EgA2kGW5{0gZB)Z%d6SmEoBlq}DcQ}~VvQFcW9J8_ZafSS+!f6&cjzQIE)w$WCJJSNmo40Rw$C(zhe4%i-ob50 z15QK%4EI8BuK?}>0}I_N3A!U#tIe63$b#Xq_I@vXr65Dcb9UBxzHD5~p2_=fk8V}%QnJHH7Ei5NhY zo1Er3s9zQ(;+A703>nMmpT65bEKl3$)w2_7+WYT$V~=KSC+duS^~RCAGsfu(+@Dcu z`#dt^DCwcyHnrPAC2fNH>%lhuJqd9*+H2eXmBG~cFX@+fMTaVWgW(JLY$boG7p$_# zP5k>{%WN@QHGP>sWd=2rkIVU8xQUAV_M#*lAtx_{BV5Xi^|A>OUY0grPZ5PGO>43D z`9u7;Jb~wbNbyflyKiKmgN2%}Y*Lf6O*|?J}h~ZKuhRQVH zFd7pDd&k(COly757X0`*4zr@KlV+fcE<3PrOKyEzN?b~?X;`E>1?S~rQ%9!e`CzUA zil9^Do_=|;JB_y*pfB{I@q!7+x8c1mwYBN3%e5T$G{y9h#i~=crVjM zAuJE2?YgMfvXhIp*4{brFmCq{_&&6itmqga}HlOXe(GipSOoADw4gjKIsgO-uw;YSDN$$;$T ziw6SpiO}{o^{1Aw3)2^{v`)M~)U9@q#*iQ!v!TE{L2MzSVn2*ZB)L{$X*J#yPubr> z88;lGOK%HG8?c>kaMyG_-cEYQms{tq;F4PN`GK~%IxBqkq6_VM(F*cI)D2I=$tqEp zb04HNjyBdeXf1OJ!>`#`{qt-o)_kmLh7|91d#mUgul}bty0CKSbJ)V+`o5l@>KssK z@5T1>7sZPQ_Wb6`lZyL-oFus2s)}jOhw76b7s4ZiHi*0|$?CWu!jy+mamqg(BEhs! zJ(H8+_b2BG08sXscHN>v8zV;X92wdbUeZ~3@ADpo-2AcsPnC7C(sRy9{JRgF z=f+nViNK233DCH4bE`U>?r2-9Td?O{=4T5reH+!ukex$?vKs#og~xOSLI+Nl;X5uX z1fNG6W8U4EHK};-x7TGbb4=;_DmkuQA~T4yc}4!PH(nAg15v*lir{+ste2;L(hJ~> z-X)SstNQf{pUbpvlC{=Fw%1QfB^KqXA(-m+I(d=@hvv1!w!~8*$H!TWT_d-|xiMVm zMEN|{X(Ets=d52IA-~N=9XD5dXq-|%a@^DPGbW=~QEtpqicp2*Q~iBb1&P@3`9Rmt zO3AfUNy6wOlm62RJ|4S3TrYtwX zIRWe_aI2>Rg;1~-l?1U6k(wlyvVC|#kqN)V@Kix*lNfj5mG&__z$vp9L27AfI}i&m z1pie&z{e-J&8osrFdaTf1{$glnJ9twYOo~U!^h(L!o+BO<%ukOxu`{`5Gd6Z0=){{ zQTco)OYhb&?;ur&NEvmxaA#Q?*<84a#|orpn9$m~#nGq<*=A>nBK!`TFaSB<9g+W$ zds>yS)){K7yT#%c3`CsZI7Tt^nnnz%68$oO%wTXj-IS$f8 zWRV3d9!-x$O*YN=Eoiv(L6)K>wS)aMr<1HcVg-6+<_<5B+qFOJZMOy8(1$9<9#_qj zmIfvXFJp5mRxYL}UW8XXhBJ_Ddwaf}*pJ#jqa@1ib5@ID__tc zh%PTI=#o0t*=+QD4?8-z{Z>wtcY4hR9ZeCGc)O#mw>EsBY4Rta*3%OL8*k57vAd6% zU2UE*2xr1i{M}hVM(G{VdS;z{r@c5ArUKdFl z_{>o>%8mEO`(=t_DcHwYos2Xx1J@%^G}bZnw^C{_M_tQdyzIFL%O-5oCAhyevp08S z4y_DPtDr$LiO{mmQ?OJ?s1ROnq^zROriI@DbvhC+WOl03rLbiV< zkJ8+u8>`or3#zh(9vAppGD$rUdcOOpp(9ubLGl9n|1?hChu8XveF~>7nd(TIMbqav zCCO6FU#algRrTn(BFT>L_Ldr|?2&**{}c$PDa+&xeAaZ<)B5_vaAuP9k|C&NQR8$| zrW|J00MBF)d_hiq=;Y}-9`Zy=<=1{kdU#a=x9Ye~n=P=f@rcGONOiHPg5pI&N{027 zmYKw3rg+RXPWs*QkTl|x=LkgUuOAfu0w>G?u$jJ5AKdGB?oZf7wy+CYnR7}ZCekFK zJ}=#C-I*Q{Yuwtdlsg&GO48FW<}|0Z8jG{qLEb~~0h70o?LDBdCzfqffPdD8BD_ql zfj3WK+x#6NIfQtf>D-MM+GDF3#UC!ovZjOLcYaIU2_8OUueeR|eZ{(HA0WzZ`PyQ^ zT;>WoY20e|bC!2_qK)xfsVjz}|EB*px|+%Z_U;A=KlvMy-+1)Mmf^6ByV86VT+T!!3(Qd}ea*v209z)yDCEmspU8(sHz`NYj6cQxgEuG?!4#%! zA&hTMi7AY2^LeLl=(p!M3zq&a74C3^b(z1wYQddb+UBQ-`yTREmZjvcEz2Y}h2Z!63avpW!GDSt;@Q zozuyOqIms{B8rKG!;$rWC{i{Kt$w^ReIJ8V^6+e~*#G#$XV4RcOy`CwH#YruHK}fR zz2_=zBvGFYhQ|jDL{LcduC?U!kgCcF;^JY{UpPN1WYPX`1G%r{+Y-4qR!$Ks(-D5| z=j0MG-UY0th&y41t0G$MAs0?D6A8EEe@^DEWTfQIt+N?mjOZ357#-RVM?B)LxC!-YpGwB3zxdq{u`3Am3;$co= z%4TfdeT`AP1g3z(ql_-xx@|qteYuG_=|nb4O0?AT%1Dfnun+Msf1yUC^du@h@%kAN zj&fKnv`s9DWgOpYehILqG}!-UvJn4CsOV!q+%cfys(T}Gy7Xf}?)PGMOq*}YNDU_? z1A-jxv}A|yq*|A%z+w1%KuXPw$(ijb+QZ|-(uLj#C~^dG_xs4NrVxNpwddpz-7Ieu z)eTM8da!XS*%uY5940pfO-{a|o0NGWO3H%FJvwUG9)#J3zhl|of_iP;EV8<9eBut$ zjTPmii&?#!RE*yZwJ(p*oY3EN5Xa$TRm6PuwYuTQ*kBMKc727%ST2J^eNmiHlEIkO83&%s&NM#aT2}}Ga!hU5F z^`)w)SboqmigR`fO=gq)o}ithAQQxx1FMZ9GixEOYNIMA&7Pz=1N#A{v@XOxH!nLC znVZscsZGAx($75(Bs14J0Lnd&y%2y5%{MZaS>B>hrh8bgDz6E{nbTVgD!;aaa{6;O*rD-L>=f+(=IB_k9 zq&N`%s*Pe3Ys54GGXZew?4NZ^-lL4VPmQP@7En+TC_g~ZA_-0}Z%-C&`D3_C} zYCJ{$ZI^zXV?$q?($R~K{;OI(K%x1`|1@|+xK<0X*AJIr3n5CvF7|`muJ>c_YI+GU zybPb_WJazL=l|R$K`SGUp{!wYSU6eU**jLWS70Pia}|}eg4s%CzP9;i!0(~m8Pwn# z$|jm7`77IV&1>Bo#`nfG&&8>YX3MS}r*!V`0KJJhTFC}KKp2=*MG89*=8bi;70MS% zhqcYg)}C>lLkjI%im})zwq2iIj+HhlA=he*5k2_q!r?q;^NM8IFCB6^oax*;3B=4h z5VywiQ=*8%*-3W4s=+OVY>DonRHdW)?2hnXb$1Uw`;;&3~K!cv$(Dk50uvLh=y z&z-4Q&x%in_*I`HLGsYI$+@EUo!5u$N~+-pUV}vA!#+6fE1#Cq2GU2wt&haRZQs1 zb=ZIW*7^b57HUUFO-m$73Vaw9lwmbtFJ9CvH_=r&d`;;16=7gU1zbomY8YFHzI}#s zQn?*&j0P%xDtpKeT@24pbK*4|*LuHJQJQ>}j(H6L6aD2uUaUO%e+-gMJ`CS^at7+q zu0C|7)ye2bUGOQbsa4CtpI~w#r~nKk0-g^)U{mItt`4r3IAW!D0;NFA4-C%h-)brj zN!vecUZF~QUQyor2G&sg1lmCc@t#>?&SnOfUte)n??~^g?z-X(t}%`Ad}$ARLk~Tje)>bHQWnPtbdu-m z@s_VOpax<7T#GryJgGfY+NpE;R52apcR=toia2Eq+xX?(dLR1$(AT#(FtU$EyZG@R zlw6H=cI!yAMI4#zWdRt#aAyLEFI8abUIfj2_{!$f=Z;gR&M6v6Lo@wt=e@ft!i}H2 zMj_7PHmrGEU-H%@EcIc{A!<0{ybb^2NW=*vahET7DW8@Zm>c~%b8e9n3hmL$;Hhtp>^ATS3<;*7t4^hMyYu*A(>TB_=6*g za_4E11CoOEqx(HR6@N316;`Khy9DNgG~BjvzqBQw9qQZj>YP32b&J0eM+(=x!iKpq z-p|8uW!L@QQS{pt`|_iNylz*oil0vFbKaLZK+1lgrMsALqk{1eulYug{Nq z(U?dt$~@XR&8fW)O(8BQMs-Z6M?4LkC|rFvGe7V@)C#mT(C4N{LJ}Ro!x6|6>m}2M zggFHSk_eoX7?V+3b``Cbmc_ZJ`H(@!egi*{?P1@p0Yk4eneIDZxznZr#TBBbjGWb_ z(h@_hR39q2t0OmPf}2V3iDah#uS4XzdwC*8^^y$Ku?6ZRR>~y&IAX)zu}H{rC)&5c1r@2<7rj|qap)}e zB>SadMlb4#giC1&U6vit=30JB(&V|MA2wxm>AW46*FnWI?6!#eGcD;Db-*$2tJ;mR{oL^k-?l~5mBNQc z?o|J*2TWz7gJ-cvuR~4nj(^uD=Iw)+>cjTTLlh3DLEH}D3H&Do0fWxIQ~e(#ujXU` znv948DCJ9MDGkK|CgqPxAMpkbhX=s6JRLgb-AqvfsJtNLd>j;-d)p4l1>a1a4xJ?3 ztrg#4KM$JF&oxi4J`g!};yzg{z#c`S%e2+keCmH4(FEnS(sb&QIDY7OvkU_e`hzwu zRLeaWvJCD65xzhw6g=4T$;Jl%MS#KnjJgFIK?9UT;EGx_zyBQq9;2r_41(!qmeSzU z6PaxLIi=6TDYjgt$Gh>xikR56Wh`17VXeOM7w~f^aA&&GD{`S#Emo(ly2;8Yk)g7LLX9YvqbbzlldqJ*PSpA9@pz>ll0`QKv}tc?b5F?{bN z4lt0aBX=vROB7A*A6>$c(j?BFoYokaW&q@y5dUWmO_c1ODf59T29v{sth}q(NoUI3W)!BLdpq$9~0F`tUvY>BHsd8W^1I=jNyKmbzg-oBLgce6N;7%09 zl8vpq^X*vE?r85bEr;aHA=|8=EjBMb$%s(Jl{Y%5FCWNwCrdrOD%%LgpO4(0ZnyrK zaAP@7-;)M^SQO6EL^F&?aC6Nv!E$v^S*Gst2DO0T%Wqpl%wa9@rE@>#_vL1GNHL}BbrjM!gNkuSd}e; zh-3;Op3RB+7{OZJ>vjA(VPVF17x!}MqwljOzc)`9@@z*JjQOI9ZC^t5i^4ArBtxMX zMck8F{>vCdcJ3gaFeGsQadc=F`8{-HV}i0sor zZK*+cNeyrhhz771oMDc6lDZ6tb>&EQ-F>T6A^jfV+(S5UAz~v@X>2F)z;8E$J7AwI z55aBZV9X;sTd1w()oG|u*i1;flcPCBNUySq$dSr;mhC8Fam+d(eS74l+O#@|R}F_sdWP;t@e&sZhJXs6DoU*|e7 zgCkcHU&QkRIp0spvXVP2r|X8l)`eYyNQxlC3xHy0L!<5;25dq!+u_*~L;vbFMYO8G z61Q@%+jF6fHQ7vX%fAvuCN6^~4VUV#K>W>MpUV(Qr~|5wY;|{c<-uAlU6XXDhY(AO z0nq+lW_#@k$2G6fPo$&KuJZ9|VhI;C#@hKk#-T9QvHZ9mD8_7P2_`54Gi@I|Ts?-D z$5!OfA9ayB&)I){HdawsD$!|>GTBflJC5<)qaGZxlFv1_iNo31F*bl%FqI@|+OY^E z>0EIomU%!h2*$bKTiav1Bh|Y>j&rRXKE}N>Az{Qg1BP_beFGeG2sh%!@(nQ6Dek-{ zxFN!oHcOi7*mem5p=7C>865l6z&*a3Aexqje@8(wHN0*+u1g7?mSn%Fe*YK{HJC^M zX}GB9@p13E?bZtSd-v@^BY7o?w_MadGxCai!lO?`vy%NHs)Hfcu;Hl|tsXytQ9h&U z2gVBioQWw>^kDw+uGlB1WGxa17yawEqxV#(hS#_vnEcyi-(H=nDh~q?7G=HnL`rgA zM5er(#zG9CXk4a2G|$Qcfj6Bq!vi6M!emlJxOY2ST-zIT95HtkakZkaHk|gal+ur= zS4NK_4}Pfw*19_1SJ+dnp+p$XZFA8lDHDzAZ;)*(G}1O0e8s%38^bD$dtrWSgrfnW zcZdEBEds)R;cqKMn{lMuZrFO{{`Tb^5X6{hBRXD%C9!Cwh&7oxfD|kt<>}(|dNSt^ z1hU#N@2*uX1G#)@PfDa_euAHBg1NXKMtPIdNamwa>LvBKc&HxoLhMH046rTmS|GTd zH|Bm12`ch{g?HOplVY)d`xp2S(`1v;=8H2TQs=fOnDqvT@m-1y2yo?XwNY|O;5@dW zL1T9`7V}z-ed^a3hpgpIqeG24nDIPjYN>@D2xc6nymtCGl$vf_Yyh1fM&Z1ueO5ue{3o?uF8EOB?aqWt(iq*2CT@j(0IYt<|g37ZL?-&vX<_kK_P z;_YFi2#oo5Bu6EUky|-O*R@7YU2Ym1?GmZ3M_LvI^ZK!uY`ug}PED1__YNzP{g4A~ z?NT`lMjh>lX{EaKgPV(nQVl$f3gpnnL>EZKp8=tT$6hMcJ8glyed8;%dEu}ug-Cx7YDfp4>{GaXJ4A}SxE4fdSHX{2MpURZKs_&hu`*{UN{QfZzsIy z#bjRtJKI5X+=lroLXhhEd=*iD+Xglt^07{mGYzqngRI{zrR@yRcE+HAV{s#$+WMn;Y(<{>qs0%BG_gcm zh7gh!47;Qg)o-Sl0D7mwuy1%3$qE|iuQ;Z2*zP(yk^(ak$AR$!2YP28#obxn!UN_G zqxFv*6RKHrAl_fdAjNyyaUs_AD7ljXTa7i@J&u5l63PVl;XJX1--Mh*NYLe7f)i|t z5lk-`5Wp&jO>)4vxW-dL9I$<;yPXK&g3xG;W1kPNZ~Nr{WM98t1(S`H?N#pNt>-Bh zE)Lir9TD_@CfGh)N@LFmbQU0HBAF!+4FhCO?l+9kHC&Z*y=z}Q&V?YQH0(iDplq{ znF|{19&??Pw{ESS4jlXu8>s-wHiG<=Y!)702V)Hw^sIXJdmWR;X{O$`jOElvXLD^5 z32FY>$dh>VYrcr*!UKf_M=z`;uiX<+C624;h0>lYdCYnU@eWS+O01);=5Bct`ttrP z!6$a3nU!R%hb=!tWo{j7QT`h+-InRD1b_eWY)6>8!^Asros<~OQ2PHL^($PWXqB3I zcvHWa{}c6F9r}Nxe$M}>pQK06(*K}-$iw41aOr4MnSH5O0Ddf%Ls7ux!GLE2qLx4K|R&daChi=rDJyFevUxVg3lADZ)$16aFr|1B|u{LtV@ z3PQ63CQ_$;OqraP!jLT}tm8whQtJ&B>s!lb=UW%(TgRrp;uzXb)=#Gs8<$ux!J8PP zePLCEr5No&b%>e@8EF%*ZA|0{2kc4d*%QNGxU}Yczvk*}5(*ugw?@jFd^$g(OO_Nt zDxD;Xjmtc-M4y>y2E+bDLlK`LkgssAy=sD&a!hnEC4#TCAcL5)G@A*Jm?QClFoF6> znv=s~gxK|Zu@F7^O!G%wPpdOqU_k-aOYnCWGB(H?hpI%{_Dhrf1eJUXpPquclAS^- z(01bK)FQ=nE(6RKn5jgqg9XdN!?m{xZLV<=&CX7dM&?O?zDK(%Fmn$9xE0Q_VH~7naFA{DTC=7rp9b zVBNCALy~*8u9c4Ae4P^e42k?8r(CEuQGLwb$vnrV+$-Tqa zMvgQ7vzDIU@P{^%q-qySpf?UI7uwfrkED9XHm%&Z)t(_^hiBFZz4t+SuGBjp(y_IiV>_X=(>0`?WhDbT!l9If=>?b;ksW&`6NsYE9A zAK(-Y913If058Lxj4Lc>8_Pwh*MG>iRaQhtH~hKDTtw*oA}1MJ$cbz_PY<%d$RG`Tp4+km-jp#`bi$5gGD0kvH>A2VDr%UMuqZ@AE(w(4cD4d&R$7ZLUNSvRKe#{iJ z|FGYbyWt&FR^Y_*z+v1%7IFgC)=yk-I0+DKK7wODt)Nfea&QWe`1RbCB;vOrEIRb0 zmD@eJk#)NBi11oq3kLyS9;K&uk)`3=h_t(MXF5tTzVu8|bUDrl%6ho-D8y0iNFg5su#KmkHSCDL8W zgXb$22QH_7c36fi$v_ELGN?nYFRT7|i#`e02aom!C4NE87drd*=&fE~b52rkfTw?M zxDF$Zpa)tb0Yy+v_e*e5i4qAB{n_WIIuq7O;xTva%_PtOG79uS=la6ef3wAqng#fQ zaS|Nhs24ak(&9B)`*w$AYUD_O#WM_VVQbRm_Sx_V{turBl%zs=e6@yatxfMtw`0f4 zcYO&Kzwh9-KbALp4!CxoYXP(S)HOC*C-1W>@~?GaMLEDX+_d57>^=w+ZcN;{hs`Bg zSslc?_ueI}7`cZv49AszAc8?Q~WtSw2?!Q!(b6%g{Zlu*XFX))b_z7poiv< zwH!lc)}BMaXS3@^LFS#&oFADz#|Cs9-s9Im$e|ljZcnl83IliBYdpqZ1NV(x zcKQGj0ZqF>=UcAqXA*~969`#D?yHRVsmNnz8X!UG{Lb6+F2<*Y1~f$R6l&Ju&HP&S z-1d_FJc~Cs@Oips`m8VjjM}os_Kdx7v)gkeWw8i7^I@0)!2L-KSR}Q5@(_IYBIGBv z)^WNlIanHR@JLT~n;q1A>McX!xGU9_@{C-wBXe+}@9*CF->UboSM}c1)|ss{Gd;zgw&}*Vy}4cOLhN==D1v_sV|w;orHcEB}co*aPNH zz-o9ZFgci^sc`4(V}l!*@6qq3)J2~$z}imj+K&^2;t4J+`Nn7|{e;(@FAK2Na4Oxs zFGV#v7SfcE7sHNOTliarTlm{9)AVOS*%6np#O98@4yeWVsOr|)b-gb>INmF`N2g*=L6u9&X?$N>?m>c8FUjh%Dy=pC;5Bn8lw%to`@36lT)zhyj z!NgMa02sBDOHuMvjmuM9pNupDwjy=bAp!~crZC;-dY|5f_}r9Xi_KaQdZb#STAX`9lH51%AbTnoXrUm$yv-5oFWe-e=_LT{ zk(7eEg!*YgXCFoRaR)w8RD7`cD+FK1>5^c7`rsw zJ>-vFxrXcgm&yO9Py7$h_`2iOfHqxr2n8W4_T}6JzpRSMW6D&bvp36YQt)%a;sR@0g#G96R;B^DIxt~VX%ChWYs@0D2 zSYvJT5;>Lh+#pm@Jfvfu2 zESO}}Tf^2GBSh86eq+(c=gkRZN7E%v;>l4R)UeDWP*V=mYz>563!)dmz1ypY14tfY zXl^`{V9QpyAuK+p>zd7ZF^c&x(U-3bVHJ$rJ`#WYttBt6#YTg_hwR~2f})!1x%*RB zqcpMNz~c3lp5V+t`9To7*S(s(FHpbZl&#q+&t!w)ZpWI0ca^Lkj`Glav#@sWx6-cr zq$-&16RG&wc6AP1as9b^<(UMz#=|4X`|km4gx&w60c`GyOP=h* zd*?zw0^rSdd}mA{xIi{-(Z!T{YM8MYs*1>7aT{dKL2ZTMhx>$D|3U};S| zyBHcwTZAou!1C9DuW=UuBAx$Pl#U~Ju2!0ki*fw1$TFOGEYh{ntp60~RD|6Fk{4l< zjd&?G&}$LpKxDyf5rTur%>Xc3y&`LkbqxocQ%6b&Ms%~gtCDH`8c^hbI3p`CBzp_z zQ?hkN3-i40hIR+=K(ORJxZv~Akecgmrx5eCQJ03#oH!KB(s~{ei5o@pb*}DAt?+O>y$*BpDcUW8JNfHW%sMu{i+{UqgIThE`VF;Y8P902ZE8aQnau z=sOyKyN3T=yF~J#ea~D2F!Wf-n}3P&KMFqQIlg9ilef7pt_pIIrijVAO2%nojjN!f zK4>tI<3DtxQk4}$8i4)h$iFn80mN-}r{9Vn?%d^QX$#dUT8cjwy>_Lsdyd3iXG>|B z*24-CQI#hJ`v8m-C9W0Q03kRnI4Hn&>R|qKi~a;65z4n?_tkRj-Wua9025e@yyZj` z-tN4jf?NGpC9vZ1aT3n52w4VneUJNx12-%{RU-wPPK4Y&Rd~ae*-Y6;_EUX@FDKDll={Du0rhsSS?(*FbK1MH1@jL z=0I3F8P}P8cw@^xmWbt${jy|Hv9nVnhJ$xnK>&;vE*Aj&zGdAI+<#snibTMc{>=>i zitouoqW|+F|B+`h zagjzb$I`ezAs>hnqa@l?WEwKt+n0g1+rE*7K(Gci4i2{M_LS7blM$fo?B0*B8A$I% z{Cl?!KqD^?c3_YKV9=%n;wNm=v$PV=`Wn%T)7iWEj1>&RVKF;@%C!DCmIKn|#yvXO-K8rjI+# zN=K`0k2(Tn+#FyP0SAYyJC1AKt-o9YS#l}-@BYNr_*-8lp$Y&%EFy51cN%kjx`pWU zi*76DBTGxa*VbT4g6p;huZ_@cZ7{$_g%~1eegYG3iuE_^=dPM zZ&Ic_BuwgqhfkZV%*ay!f>tjdbCUuYy+!PT^V7Hd#_mcX*)NZ`OR<@lVCK!9rg>?s zvhkB!5ksOYFLV~;<b6%Y^zv4bhZ8ft7TFt;Z(dw?;#wNdcugaJm+u_?}R#*DK z82C7nGk67)yf1R>zJhty#oho2m=wv{lmGK$+@5|2egy`csiSuujf+-4-4Z<1GS>;7 zEWr1^gzvjPT4Ty($=NeTN`p!%yc|o1;!)QcJ-F0C_*0HxK7z}^7^}8P4}qIubFcz3 z1_!S%M@wY?xY%oB{&zQ#5JP0I0LRZVuRoK3q_<6>vXA;niHop0#BDXUqO=DKZ?csfj4s1M7 z|FAQQ#@>hNl>)eMA7rYg)6b(PxR5M&VSXu5L0<_B_bR8u25H-ES?qxqTVG9n``a&@ zS^m{S{yB5q`14Yls+gpwq3`_Z`3QF4=sjI#!ym&^f<}Oc&6zD0H^P!jgVO(+?KwBn z`GIM{&29Ud8ZjY;> zc|!6L{jb9@W&9nwhF_8req^YF`C%|(lZ!7_>)iy2fBk_TGW{R!1y(1l2}Za+SPOFa zR%gIcZB=Y@lBD5pvDIe(Wt$HMx?*p>hI>D8{G!M6Q;o)Ri5UxHnNJlCbzw35Tg`*G z2m55;8%PSgyUAMF?K}5k1$mi+dL&q_1I-A#)~r0yvG#$o-cL3qDz6!AZo8_nwN$M^ zj)Gv1j_o`15uXE(voFTvz6*l(F5Upo#iGG>4QIY*BUWS6-caAsp^KIXJ*GE^ZGD(~ zM#PC&)$uG8_NG{dD4#pK_*8c1FoVJ^=YmP+cfrQ_kcuVNDElWm|IB3Y=h!|nsbhdq zZ;+<)a4o-?&~$A2hVNS92)8=|5wwCy4p&In%8L)_<|htaz=KruLo&0Ep}vnQ1S$?B z&ujvu;297jc57dKmN3<3l*p#ZR2$swuAKFVGYRt^W_&s}8u(Bwm^5jRLQry=(4l zdtq$FvI{O0v{5lpVB2OiZWttW$*<}EyD~^g6zhom4@nTUfXnJRTmYYA-ZE5XTPhcV zlTMsS4c06e-)UzEn~1sr;Xgvl?0E0!`&U_2j#O6HOj`vo{o8n6?k<}E^u>Bqiql4+ ztgQHu%{zweD3-BViEzv`M3L6E;>xniRw|xk>`H*Uz9sZ{VHShqIM8pTtrO`4xx364 z1cHb>cD-S2zAaMI?;S5DUgfY{n0)gn$?S63Vboej!DnUk4wJvogjmL~zXueba#tUK z{IB4F9XdCCJjpy}`R>Zhdzfw`eR`iixgRyRyTGqE+0wNF3Rm zfCOuO*z1tKX)#(bKc5)HF{6svyM3(DfQ?{XtxQLlW)J%WjWVL-o*uMOVor z%A4AP3H}D#dU3Z8W|=CDAu>6}=C|j!XlgaTLoh!opcVXgEbIXGz;+kmIxT68?Jxs2p;0v{>-1EWs?Z8h~vL?-x28xJ3A9lDh!)!h9=*X8mo zgzhA`vWpz-x*L!w$Z$IKh0IxPi)6QA%SUf;0&8m4ZvRWOjbe4DMW0#js-688!Y}C{ zqhjw)>R*So5wC&ELnab;lEelHqT+6dlJq25!1KANHTN4X1hHH8SNNw6PZ4Ge4%q0~$A!q^qn9GB0E3 z%ig{BCNoJGZWe{Q^n21T;W@(w8m<0uDZG8w4OWv>)h!@>zJ?U0#5Wl8~M8Z z+W~_qWZ98r;pk0*cS;wxb(y+p1vPwPE*y^UDrc4qt38&KR?#hN0DQ&U^Es@kqnneI zLeO3Khc`cQrAvOMdCboU`xPrKu~w>m{9%h0ALLz7EcFZgMCwHax_e(xt-_y1;YSMt zAN`F`Rxy(Yn9E+e5&M!aXd=lh#dK7sRdX_*-#tmCl{m4~SEj!;a3^zvL`wPR<@tHy zMDGV|fk(YSr^~{slPhjMalQ;3ROj5}n%8uPW7GZ9VbxL5pZL*ZkNl6;z{7oOn>rkA z@~+5(*F@z`0ci!Ea;xU`w;&9)#}w0kqIGkJ&BZT|^@0=FK<k-?2xO$9S>cV43*JCB3ZJEAT(*DqgR z;oAAp*nfto$5Bq0=Firl%@@@-NwyME)zG%nrqB7HkNQvqkKm}*7NDXt72h#m77 zN;~WtdK@xtTwCm@g(F7k-`F3jSki_Ja%~Ya5AaHX$bG+eyuu_4x{n2CQfz^M96mq2 zPkf(!s7tGKd7M7wvvI~*?@`~@hij=8PJ#>k=!|_QsoxSmf^$qThp0_KGR~{SGuU0YEj$X+McGKgN@`yHZ()L9$I0OO_1-kj`q_n6jG>$aVkC zL0Y1A%UdTVyOfpmj>UIeOrD4-^US@v{}^YADyElC-V-3Ya7vc{V=eL_*!l|58Vjnb zIMc;&HqY<%k8Z5q|A1Yy9=S4l&s2C2DYSxOgvld@W;7Dz6`Y4XiSL0g*-nZE#7(LD4t_#U;YCHsDwr#`Q>L zcV~B@_h)dR5j1K-u%aQyMfA4=mfj7ef8IUeYqR5Z1#eO6_J!Q68G}2ak`aigI^0Jm zz`wobzk}RA`NRoggDP-p0d*^q#@dC65`B~EOqB`jLbzp`5}Atx8NU3qjb>AW+jQrL#?GkElDX{CC)P+?Vp`@TsRY)hrgKDVG%>7BH|UsO=(bRES1m*%2*uvX2nHS{LqZ))dK^3^)##7lks>pPJG_m2v= zqcI028_X}kEcVg8<=WdMV3wZ*w|As^RD(4|{CuZD7b_Br*)og%pKn{e@RTCC>RGbYQPg|p@AL{*Tts)y&pmNSB+@fv)VqvDZ;n^5 z3+V4JK7Tvfsj0fap-?Ekx89WjfMT3I3bKyNk&%%JS;X_icP_5xPVnjVj+#xqrk&_C z%=I1sj(y-~Iy*hEBzpd#jx&vEt$&EwOwaU&n5W`(n*E zb8Xc!^-ZC5pqz0fLzXj3r;&3WCw!iPXy&ZW|-VN^P=;$OVHrVew0<6v+ zESLABV|w%Jl?od4fq7K4BRka$5iFB#KMiWD=Y=s{?_vw=|KbiMgF)(VuWJttj$VM@ zk7y$VG4EH|YcAHxnQd{^CvRC<=Wd+HpRibOV>sZ_pXaUtQR81+_h2_Jp+|KVR|kiA z7o9<(42iTiGPxK4IORew>-nf;1)Ms$s0y9Tcj|oA2+{=d?QXqEYFt3roa@X*paTMj zPNn`>jqQo-S>?FgNbc4wj^Ik`b-D<$oKb;+2;rk=m>v|N{nU5AzYlS?QiIRV*v8Ge zo=fkeYyQ9T8m)D@h(RsV#d7j%D)j%DL#`s>@*&bIE@Q- zX74^%SwpKiKCR5VICtb672j7uZ}GQxXRPi9WI=hVbh=+0JB{0a_}l#%Q@@O2H=mO_ z`+C(U*g64neugj;w=F0`2coeEf6#Ap%)b zAZT=fE?*ym=yft4)zc&S>d6H5%>53A95P^d5Hp?LbffiBX5iPPz^)iC zc)ew2aD#-@y|yI{?E2+S-^vv z$`;+lmo|8KFX{hVy)!4b1pa@XfBv75zg2HAcgrE?+*O(?4|UuCTdL|ax<|Kr_Edvs z)Q{p46A}^${S^P#4*IIv(VSK2>nV%gkGm>5pe6_posBSbN_g!>({t>^ZMf79@bgDmK>A_T8LRH1TTu@7mKLqyM4wm@P_8f zth^3%WA5nupsYN@TVov&n4E+X9(w*t{=4SzXA%ZS35NTQd73>P&SB#76lmC;mu22z zdcT7N%A*&aOHRS5!tyGZTTGQVETCyz5R#v|O3zjGEnjQc5)8_;Uvu$!+1sVte7T&x zKh&g0+38T~_ zEhdfUTI`&n+al`{WpvW_^MCGR{=^d*$`vE}B2>wmDu`3mzj=z}O%P~A80-(-$XgoZ zzW{%E+eza^Xx;v5hK zfU?}s)ebLI8AOkMEh4%RR>dmvR{1nr#rP!ZuCEVQE<_Z-!?Z2yoAe;@o{Pph`1=Zt z^Vr=HM;XB7?y&lz1Dv9PRyuTrV)40egi)-0fbx64dtsCpkoq8<($qyk*lEfx07`a%US zmdkrHQZv)U{0{VbqTY_6TRo|hi>c#4CXo%qI>^i4;acF@I!a@#RdasR5)TJnKZ zIp&(q;tyJer*X3gl;1xakBSh*l`e@YsV}`+C z`ptc$52W#Gmtoa`V|AcT-yYLcCyU)hIerN5V<0;NS>D+g8oZ zUVWQaw@$h=FdU!fzUUzMUgKIj=5Qb8Nj4ypvQ;E_-2`7<7BT)lWt&-^O{%M&IG^~l z{D!IuK;O(sn)t$Z<&~%cdx(4>aky#Cp9j#*Y`q!%JN2ZZIn(?=2gi_b>kLbk_HGZl zQSc4x-%f|=AzhzhSSHN`|)C8#4JE18ATd1Sm?T*(ICifQ4{D3Lv z)jkmSHBF-;5*c>FL9&R*gmrnP?E5*TT$$l*FZ}1_g1vSC@~C|h!$W7zKK(at8)3tB zXQ8JgEkT_E+1$IBbrXT+t0zaRTq#b=V$E}2P7HUMdS#7X$#;ep!x;!Otxu!k6C-rr ztzCo-MmWn@eR&hMhjqeUoN;K9Swve66sZWdK2MD9V6Wf;>~=t&-NpB0Wm>yWU@k08 zQ-5U01eVuj=XGRrSJCF3w5GCgM5DU znTN4*cia4>i==9JFLF?cPJXa1nt9IBsXOF);@5_I2J|-msnl~yU_|ba+>dejKJh+p4a(Z3RUvKZ zR&&BXPH8EFw))A{^D!%$nGa{#v&>y`VpQNIZUk;5JVsG0)HprwJdvSvME{5Hd4FnK zc3vx~rHZ}`YQ`{_)&%CGZxK68_GX&ekpVjMwBG`rZiIu0?t9a!hRPh{&cA!R<<>7= zUA|u^Zg&;b=8C=kWxQ@SE3!4Wc)s=V32&~|3+j!R(oN3?dPZyv)1>$=z0GxfJB zce3nkT_X&b+Uygzlj<+EoGVr2Fe{YJ7t_HKO)npJjna6N4%pnCmtdA1snAu;c|~xx z0RLPo(s$ZX*DsRfkg|hcX8Bh|%T0@yj1pNT!mLU^jX^Gt0M+t`-~L_F>zO#DlW2Pj zj_At&j2ZTkvJFVuO4ubleR7H;=2w2{?wrFbnNIfREb$?pC>elYm1R@wkkinEY{AMJ z`~Whnd~bxFY$xabG;*pGm*w$$UNwu7b+p&w5DZ=_+%1)17^KAGDa>rC5yZtaDjpgU z$G0k-jto}gPrJLH9L|fnF@^zJB8C!H)hh3$Abvk5A1ZqmCP}f`0bs%CRC+KZiZr-s z6NrB7u*ivS*)x-lB#Oig>%yAM>7y@m8n~Q`Bf&B~ih}GceZ{05<{V_OH`qSr;VN&6 z@py&a5nkOy7fS1`n#hKF$T_R0XJ*f_I%G_0sEUuKah*|@D@fhToWFhVtXInWGFa(> z;!uE7-|4f5s(+}+x#60`%;vNLhuxk;miS9Gyk{P&sUKc_d(==Gd+``IF*BFU5t<55 z$cf?%CRumAUwm10cn3B2zkGoL*s=v}-83 zT5Bzi==Ul5t5!kEhmzl8)0oEA+e!97PfwBbFv7{YLf7sCE?eC@&QJQERSI|WJjqas z@I!L~eoD|Z+4kriG)B=YcL;%U_IsY(-(9C8K5txW?N<^?2)p+*tHB*W>9qZYDCJVF z`jR}hfX?vty+cn4XI++`oGL`PTB9}pMHTl*Zr|5bT$%x>E7*p2tl%b83NmLoMRc)`9dOFlOIL&J;f%2QMgxI^6={Q`Kd8E>2lCD ztfS5_XOuK3fbil(!X}Q9y{{7JYS$`Y;1G5V?syZ#KR0hLNF&D?bW`R-X~X}UfTnbg zOj9j1Hdno8yyEfVtAc|+2Y_jh1=D_a`FG#U*j?$)u&XL}*vz#ky0n9C*JF<&3<`bfYIJf2Z&k;Wa?{zz>>quOX}`ULy}NdPc$%q-{g` z;d1WVm1B4+N1kTe#iy|hzQSipnwhOXAE*+@LG4#jIwaEJ-n^`Q@Biw^DT=2TmrvWy z9_k;RtUot2f>)b_7A#uKl$LA>r)X6qP|a4kwBf5BEkYd+~}Xoa1F+~u6UVp^=?P7bi9WL zsZb)p&Eb9-`XQe!h9Xy~$AcQ%6QUi>@ZCjz&G=ijiLEhhU|~f}n(gD_EyE=OAKe0d z4#w!12Z74gwa)zTRs4iNk~=HDT|@-xxLL^*X3_E&&r)GnKjiI7h5pIc1teifAeWV^ zxbveIRLDi|-?GA<3cC*#X6u~4p0bLmGDK`y+nmB%2fawsCZx3A8sRQ(*ULpD!&7dC zmT|kxh3#}g`D#Jc$?PA=>4WJl3LL3)H8*kJII=_D=soRoJk!Sy4O36ZGlE_!ej(IU z%j_+^ix?}^+qy?u{1q~Qz^q9A%C#M%hO38IaGLJatUi@@@Y&^@vN;1^vKDu@UYInW z%kSI`PLuOiMd%ime51NIaR+bK_5kta_^}4-F-f_UXbh=Ve6z&R(TFj^S;YIu=PGFh zEGd}uw^4cseeBD;SLU1G!m^91!CfPhvk6N|1l`oI6B*$N5H zUA%H118CL{60Ph{Yd?)Ch%}r_*N!ONZ+P^LrHW;iJc=i@lyRzBYv@7!*UQ(fc37X7 z(c26oO_D{r4SuQd;dv>|6(VosXRHUh46kRqPbgoNfs9$qV|!udp4wqz=&)bgksQ;7 z#E1adB9(Q|s~?s4(3OJMno_p;2ipih!(_r9ny=qio8VuxVwopqYW{ztnEw+#katJyz4`tqI%bx zZ39Ne|M}ce6RL)J9}eJ&U4VH+NFOgJMH>W*D9BUli!8O{r6{k_mzx|5W;q86Jv9}_ zZM0WGm){Dx>^+>P5q|r}GtxJF*^Kn3VgbUgoFY8&A|c=^yuGP-4I_rjTxZfg$S}7uD_wp0$ZI?rZYStDR>>vUyC#LD{qejTUd zsa>k zNq>G;Hs;h@c_nlaUIGdCbJl+YjSf{gs`;+4`*`}|ke_;=I*oXV+7YTVhe;5$e{09M z%mc=SBDaunkJZ|8bz>2~2TqD;2l|GthP3cMB8Om6BlYdk$x=_x6OAcBEtn_>(^dBmn@_IOQDT{s8`?@Gu$aN{ z^&5}bfd@k6G+8hGL6}dh5Mcah$DhZ1>~Um%wJTH0l7j-exBC1UkAJ!OXl_GG6mnE# z2Tz~>AtX2#QY5pPbOdEOu|gYM z$mg*)GoM6`>E*@nF(%(0vNqtkHD2ZpA68gP?YAAh+iRsv37VfEkMt`)x&Y5MVdqJ#L3Y8N z9-~DWN$=}?t`bLA0xov_jiK>(xh~a~x}AO(8G*(T zGJK|Ln#~bilmX$rcPkW*iEml>RpRtmu=E|8Z9acr{kSvMAZ0%amS17KA?$orcuh{) z)~$ml&E_3^l{)AK`SQ{)@zd38T-)(h_7=On26w}aY`f9Zl>69bNOg$A`m|xjN+m5r zYT>WxXDk5W&zawx?|JQe$C^Hgd7dPjgjk7^AQ!R|TZ(A;QrPb0eMm3ZBZ+)4k*Za~ zFURK*-%Z$+bN2z`AQeRSrEt$}NEzez5;X;z$5qvIPlla7 zt7Wm}xieFoWw6AV=`RyD*oAfQ`+D85Y<(lKlO?)SRyiejVol8|g4GPlN~3S;{Sp60 z(*HR59KcE-=4E^@!g%j#DhaZ*@fi>6M74TVvvn3*^4);%JI~*&M$7FxE|1Yu>25nc z74$}mtuKc8)2tl;Xv{(SzxO)1BIG_POkeI@YTZ2b2p=MH!x6$SYSzYBr3bWOR^dmhmfErbfj%g(G^ouLV@w z>~Z$szk5zNbWI$jpzzIH3SQoCIT7DU7Hchk zFy%Gu!a~iiyGzwCsK2<^@rO_yP%5OXDWu~vu0aav;)O}Xwwj4l+vgY@>T&v|>JXur zJe{N6KCI$xZxXvv3GYYbhcMT&9F0+nC*mFqRP@jAXpU#w9ugSwcG#Ue+MTgJU;ZLJpP)-aC{=nB|@#rcXc^t zIL;r_@}y2j_iutDE04?Q9Lhkov+CYR+zEMV#K!D>%yy z6m)Vsn1AuL2pja*)4AmHf&=k=D<=t#EK(G|DqF9Vs%F!j7p5cw!jP+EktT8QQ@S@t z{E}=b!z|awhJJDos2Xp!|0U2l$PUPwOKQbLR>Wp{0)gU|4qA!zT3=Z>R@i>}UYExK@#F z(7y&g#rF`|%k!O56+EwFXs1I>yRn@zLzm*|N%30?!;9H%MPB-qinE?nN5UNgRa2^^ z^i#^Oh>w=#>2%f-wP4*88XpL$ZlVI!>@Ew;q{ftiv~l`m%u?Hp>OIk5jD+vApjubM z(678YrcyK`72}IfH=gc*T2Uv;5Ege?%3wj8Lfz}<%685it?KLrwV7qPWTMA>f}#wuZ803fX)8z5O+$0gRt%k4Xcim zCx`e8$gxk=o)Y*rZ5(`)=a7y0aA(D zZ&c1G6w<@1QLoEocZH6?sBRL1*;N*laLXNG+r~^koMqC{`)-wsWt85d3-%h_8Ab(# zL4cQ)ADHPP`da;C!eE$K+2z5Wm96LdO#p?4NH7oS9rOI$^e3!YCgF|?m4vI;ASbVh zNT(XlZ}Ae&Yy!|N;pR{H)+VOJCTFChdCS{@eim!$uC4Jpe}GQfzG|Y0hkLh#j!Wb4 z%q)0jS%F_e;p(YzI4Pmw2>6-Fr@P-# zx0;Hk%2ouJ+GqrR5P2E?Zd)oQZ(+$gC-F7Ux2F~JWOBbo=es&!S5e!AR|#q@#0AbJ zU!C)N2iFq&J>v5_Z|6u9(yK~x(H#PD4~SV2z_|_fh<-PYXTOwFM!RL7P6xgQ(SL}f z`fjNIW4_PTx{Bw=XO5rosvK?Ih>tK24FAOD;x26jd+zvc|I~e#^>~Gn#;`4U4VY#m z&pc^25R~Ot->iBrOD3{p7+|l@>J;g#L(@x2#k3I|?(a@P@3~%e*zojYMFVSyKYJ0c z7Q+h3Z0gUe=E65c2APNy=ebd;hrkXj(P{aZKjbuQ>arjRj(+*tRkkRM(R3+2&W!V; zHU-s)`%y(-gilkIwM{er9>nLEBUejKT0RuTk`S>H?zRnANPo-zprf3UbPfbcF2lKJ z{uQnx)1B%+rf&;92=o2$;wXxXbmm9If{U!1D?AZaZ@MxTC|K#!Bte2CX8`)Yb=Tv3f;i{EZC3P_S+!l#zvhuWRvpnV@or@YI%vC-@hSa$6I4bWUx`p$iP&r|Juwg>Zh;H0i9A8jO+z5 zJRzovpU%dEMmLwBSIr)E3Y&aJsZv5WLG$NiX60*s@)8(-GLwNNq2|O+kRz<8y6-xp zIsG0uu!HF#eqAmLi=^aSi1N29wPQiiNyprWS!3Q(#BNuORwGF}yRqB~<-kX|CB!+T ziMksUsR)gL*1=?0wK=YojPMAsK-)qZxUCJ(p*{V z~?O1(Z($f;_s9jZ4y)ayk9=W#_@}MI%VCP>3_NK? zr~XFT19YE?qDWiU_8bL1H&_4EqT5isNA??ZKkJ?)yvZItL^1 zwSRHP(JVvZ1E-g)8(LrB52Bv@JkW01FHALCMc1XCa6B%-nu<{26VmVQOk8c)&pi>9 z-i99t=G4kWov1l00a25&`3kGA?@}3urA^wE@08iR?0CJG%1p3SjJHg#rA?561PgO| zL>jH-(D>=3QX0|85SNCie3P?g(d50{y1_XZUM!1dPj|UUB3%G~TG_OlYy75z>0+8Q zAJb7X^Q~)cUoqgV>PxJAe(@_C+7-PZ;m1b0UsXC4K`9wMpbL9=l$6m*Pa0Njxt$j^ zm2+8lx=f2fW9XHfoK^bDETof3=RkVU5pMZs+0{qpIqqeHL}qL zXfVDQl^9)7acRMacptsGR5XZt95F0x;PQ|ux3}=>PM+jyaMMi1a|10vXNbUyo0WN{ z;}#-i4+n=LDuyEFD6!Z)5`Vdo!EO4Nb^4U|sR|ot;zEB+Q@%-=ruu>)Oc&>CE%Ofl z#B~{F)ZoM*aX{+1(Lvt&M68}zxTojsWv)yJ&i+@}*RYhy^Dl3tQXKP-$orbeVi!ub z%!=MY{c?@tcZurfJjp|=R21o3Ht2e`IHU2n>Pw7#`g_t(Hx<3I0;rG>n7& z)>d+;aUNRqk$~$Au`tJW6T+ugJv6&&jD5#0@&ndiUe$dTW+INa1Qa>27T|UmGAc7{ z@reE>__Cv($^GMw#Wzud zfsU2+5K3Gxwxmn9x^$B7?{J`9nqAcC7~6N->;A`7(!RuBZZn#1sM+k;&yfJ+pFP}I zQ>r($CbM1OvMoKuITGOI{u31Ie8jU;DboIjBE9AZiefYG(&SnwzO2G7R zr4TAu=qu+J2qRx^94*K z#~{y_j`zg`3!ULnSCk-UX;qGjcxq*!B{Xbot`dA35B{!578h0RG5M^XAVXck*s>>x z@sB<=GPiOOc1lG+yT+GKW30_j_?u{%(O=zmcM-5)LYAZJM3@_GiTlIH zrrFD$Nw?!W9^<~}FJCYf-m8<1U{>s~Iq#otm5W)(vGL3x?HuJPk64xI#tIrjm}WBR zi6vnY>~>1(mC$@+d|fT8_z@~ImAzcK#L*u%YaxbDF{6{)N;~@ur^GJw&Eyy8*EJ!( z*ZC^s$XCw79%QNQI3vRG>nLT+a4Y(TMefmTjri0wrJGU=#8c7ApX(~>dgDSKj_8Onm?BGS2Qh&3bbZBxB}x;@JYgn9QDhK@__|cWq!}E++Lnhy{;E%=|DX&W&38oIg5h>o`&$+vDWC z7V#zhvkgE9gz0FP=sX(>qewR|p2_fef=XsaX{<{+f+XC==YaLBCSEXrJU;Am=xbtNEnPKbuccVIZt=cKU6Czo-s|-%8qz!8 z-)HL`Jib1Q>})5D&-blj;}dFFolCw=RlANAx^zAo-wo7iNGEKw9CE2K%_L~z&J0`% ztb%o{&Q6eMQaue5%nXyNUIl+R3P1Gs+v9nv@ZfLGr}|gl_KBTr=Ab*h*Bs=L)4e87 zpam0tJUtT`Ci#5Te(wnx^BhA{QO#{w6OR|WhKbx+X8dQoWsh%T` ziY%Jh(d@4SEy;R^dQP47+fmHx??T!G08dSq+*Ekax(`vB3Q%l)OJ*NfKHiJiaFtwLPW+;^I)YM$af1=nkv zsdCA5xi%gQrM{{j=pas=X_8j;Z+|5E>)kJ2jXRwWHf}@ag_wV_Wzz&z&RUr}O=QqA zJMpS8+l|0vDoKn}qceLpMlWt^guML_V~w6DnfMSrG4zREBjsU4$@rJM2nV?_OVN8> zMywCEO=U=gI&D8)Js6QOoa;Hu=F7AAO9ZqSqhmJU&sRO4q?H@2?Z}kF@TQjifSh$YtUy- zZnq#tzn-TV%-nu1(W_bq5J^*qKroYo&i!-Xj{Mw%4c;Ps%*GWz#^!dTNjDTPb1a3r z2fr?!Pp-VQip-Q}e;T}svz7sSS~%Mkw&M0x1TD>AEPu1byv5Hu8Z#L;TVmJ3A$oiM zF){LzHY99@DfZHHie)6yBb!X&y+Wx+pI;OvrL97Px)dOl0y@`2oT_MVeNfp5$ElZlP26)zDfW;mZ_@3$w3 zCa99j^9tQkFEEPyi$xIWpndt+xJ=yp|JB~PM?<;war_zM78TvdrD=>)@2Z$FBaF#l z5cQT)3B3tpjB%L@Gs6rjmpY*%R1)Q&-g0s|RL+Ss$fc0cBy^KYg^#{y1yBe>~6HYu29qe1E^a_h)~fwdRl6&&Go1vVyw>gmLF21)>9@-rBIfq9TB$ zr|{34VGPERy5OT51`esHH}>*$EChe_OI=MzK(4nTLmJDGX`GU*aZ?qL+y+G$;9OhS?bSJ6 zx`nG&>qt)UJC9`RvG0dC+wKTfOsG8WlC*qt^0C8a6Q`^;$!7NFR}y1<$qD*feo-uR zS!ATmB;$n4fp_tObICo@HSEGezoC^hIydcWZ4&8)wWI?DxJOA{PQay!JDbeRmOK+H zUdg}9L8CId+WY#Oqv^W>#@)bu(`usU_(QLjQY(U>m~LaH1`;gUp#s*z(Ea zsQ;P05~RSoLo#$TDX225Tf_g7-`12BhbLkKCE4-KD`lg0IO$20J0%;z2X#v5|LWzD zJ&D4K{kPw&kWa(ew|;6zR#(1?B>$*gI z+@G2(M-C>AJ=~sJ)_lO~keXvoR#$qWLTWfpT?NnOCI|4o_MITGOJcCW@Ww z`wPyMk{=?Ub(xNLFO?AXp$gCUP+a@Z9&kFw!Qx?9;KOp$|9Rd@im%=PE_%hlI0b|RCoMK#v5Mysqy>P8PU__uhGip15Q@4 zM|<^d-Oks@tWR;DUhkdyy2USG6zBZB`P2ge6&T-*7G1c$ZSiu$y4H!QGQ@U|l-jYN zXXC5x{9cS7Xt+{0QKVQakxqyAY;qre;9NF#uHf+he|1&Fv_jhjja0#gEGYmG*7`cS z@LlY8l4u+jmg>dvq+^AwfZ2b8npp?~s5E~%AMHtJ__E2Ew|B}hXkRZf#@Wc;z&^m5 z?&G^HluO?iy33Ik>Q6KE!dRFqnF&c?0v4T5MGIL>HjgAEV`lS`!1_!x4uhVR@cqdc z%1no77kdXZc%CjDZG<(@rx_R*63X8{@pq+i$UK|0>4EJr+ zmtlNKNVlQ#>E<9N5D-D1Ky)-PArUr{@W%i8Dt=D%O}IVB%hx;Pzl9r<42kpMUy0_! z&2Tehz9Kcd3^SAbru}~r^r9^Q3<%;fXV=M#hNCm-EIOOd10mx74AF~5^5$?^RKB?{ zi^`zm0@w^Q+?U3`9N*liL7#vY#VvUB^UxR8_HU_t;r_RzpGyjN0tqgR3&sVB03qzi2x)q>@FA=Bm$7cu)APfkO)8$!|sA{ zK_UQ247&@)1&IJ8G3+iF7bF6Z#IUYC%K?d2H_-mfYX))#fW{b65` z`n|e~7C%p>thA@8Mg_f52PXF?p>4OYQ%#-)Y7-FT3cPHn`yAQD+1Q`}Lh- z36ci{iV@YTa$7bw2eJ0=KXAU_M#+@LPyzl{>(D*(J*7+H(vfj;JRqY|oTpcRjiK`) z&&;GbmIC~-5{&t%F(O)-c5tNsBruX1>Ml8L;uo>ZJnP_v%^gW}4Nw2bmwLVR*Hduo zP=iKi2Q9enW#JRc#NzafX-$fUF)RJ}(<1eWk3AJ?@1jROe(;R0(m8N7e)LQ|K(qy7 zE)J)o4rWii->Wd}JkgMuD|fo6$4^~d>mf(#bV9hhWuo1d(3ba~70G)T>EY`90jH|5#|PE# z`njM&2W4EA)Xy)&kw18&QW47gL*Uk(rAzn?2zIGv@PH8PbeQt!krqWZLd7V8SONrk z{kbq@V`;iEltdLRN(fDNo3<9E>zU&6`3ZnGiz1IPW$$56Z>~o(Wv_NCMO=!u^j;h# zay0_vJf>U`mWUJ!LIm-1DgI6)f}RK-CD*8PoYD)lmraL@5!x>Db?%Qf!5g36KbE_` z_)LOZ36M+~tC+)Nr>r9tE#?k4RW-NX?avCuyUQCEwl&dy>R1+*CVj?xjkKIx6xDDo~L`Bd8TVV{YftLubunKhQGN17cEA-+yp}{g2tqs!dkXwuJwM##2Z=QkS4RI%8I;0 z%wvdkDm05FujqhEZY@!0kd@0Xtuv?anUJ9s?|=3xT8z=1kj0nSr(_Z-;wIuapf;fQ z19p`xJ6bK${l@hC`14Az>eCF+Mvv_|3IlO^sk(lL&5N22AG?IyCS0Q5!Gum7cUHbN z-FlX~9)lzv8lGSw>03~pGsk`Hx%V{gdH@g{)k<)Bv#~(|T7Qv(E4sbc0$UjZ9=vQR zMD0Ax-dZC(_lvgiS<$?RP`(G}72>BlXp?tFzyS)Rm4rm9wTB*9710A%dt%K|Z?qv{J>03;&D!%AIZ0iR~ z*`lrOnDbEZ)(zGY+20dij4tnkcJ6Oi3z0s=H0#PD;nsCRUs0y$UFNaK`{#?_sHa3# z-Nrnzf7&E_cisfiYz-Em{43b_p5-8O5*SL)-VKC1ge5Nu7qA>l!bYly z>V;%y7pAd9q|k6h)rOXef)?2i-SLZUsV4fSRVQmzZ=YW^U$lz<3Tk4zn?BTVALMUp z9jLVpEqk&c_*IAI?*SvzfnTZMe7A9ySw(H7d!cF}9xsM*p}W2SLnF1aPQBJ2!qf9b5k$;`A_DzJj9FHDOZT zg!-ekZKKuOXG=DUp-27F|K)K?zwxyz7)v=XE4VNjU0HsjdNh%D#Gu@h@JD^wx6#A8 zS?c6ES2+_GIRguDLK^JJ(%QEsG%K{GzXto=MHQ8fwWD@Px_g0jhRuA4c&~lpx&_{- zdI6cxN<`Y^A=#C&XyOvd3HtNOF=~wTOhJdEVsXW*L@;=CIwLq~ntHB2Vh2XQ@blLN zUe0-(N6^|iI)te{v@M4OH*mAYm3uldD2jNE7p){+;@zpHD|d3tgv^f#>&p5CV!x{4 zl#T|4w6wloV`RJ(K{Do}HaHY)OuWJh#AyW68k)2LyDw|YK7|YaT_+Q58iGmvhQ9j4 z^JDLNJWu*@fQ=3p5^yLkErc|zIj6{#sDlQ~IT;d?*zhK(Q%3oGu1Ovc5tS~L#x9j- zspMWFAz(+YZ#F2YZ*N$F!0#I(C3%~yEi5>H;Dp5XzN#jZB2m0iD-DmrrwJM-o>hA$ z9rqDmq8Es%f*K@jcX*dHor0Ucys1XfUAn0kQmuApNTHOMia+d#XGQt?C|-fH{nJ*6 zbNm-1`mc;tb*%SgLfv0zBJQG+SRXs3B#u4QF|@%TZ*8tNzo@)E*ZYvawiz<+;X~oL zmq-5dGuP`t8Ja7+wH5fh*3;g;u$-NnH$B_&i_+Q|>O#3NOcTAR*atBJnd}PfbTBSXBDT=v6b@SbTK>%02 zEdMt>OM0IM(G3~c$zO9N@2#DE%!P@JPe8uJ6sE>`ZuRcD1@7BqEVt6I4bl*srZxA! zqtCZ_r2xaxuT*6^e!HZ>oVP!f;@4Y8K~8e`RL|y8u=e)iZkO1pujSYKPV{?>0=1s< zuf1(dQ@^Ovob>DBYkGSmK{N35)oIQQAwk&9DBNHF%{qUu`wm^TJ0`i=BxNw2BH71> zb!6u{gFo2ZA*K}bi6D7c?I+20&UnkG7JSU(a`HkcZR&4^-;0z};wW34+>TB{8jHEU z$kMAZRy&^2uDn-MJTs%IM>YNWzRg*ihQk(NV7^_p)SzO)RZ7NtgM$bD#>^yH>B5RV z#?3wY=iH8 z2E$-6e%gv*wOE#UqPj8fN&S;GH`*^CqX<~wHHwc#&0lId))-GVDqKs(5_U}% zj{$b@msYrz5qW7*JpPpCsl&jDhrlm9=}EXow0}(TaX&S=_(gB%tvnB6C+GzoAmGUJ zE+B6H@A+Jw!fTLr=vqszXpV^6n4DwYW@(sVd8lk^AX8HNUt@#rPhqyjuNUekzyChx z8W5sM{K2o+U=`D%3S98KUj&~Y@4zm<(UoCh2QEkL`itqd##esHsCl8S@pAcd?7J`S z>jjOYMzFY@)oFIw=AltWOU8pMx%m7EfkSMr+Ji;1wx|dxmerT;iIFV%QCztZ!)Fc( zFD*`A_nXP3iAl%nC+JJXr?$kCyhoFWX7ISjIczbkB<}<$(uqOCng)o3!{-~w?k8GL z10cx1Y10gR%0hfmvPNnCnRw-#$d=WYs~5B{=ddK0JwUyu09iYM?JeB2Rc40Iw-~7f zRqgL%2R}liEF->i`RD)6hhKkid|w2Wnfj{-lY`unsI%)C;RqCG>JQ)8;oy`+!IY$xmvGFWv$th6!!wQ0hn8yAtRq)Cp|9 z>;eaH&S8?UNdASHF+51P{w}Nf8g8g+k|KP5amz{EZDE8Xs};81-ILL**7tT<)V=J9 z>F+M9&j+AS{;;@BnlNLK zR^6HiggG<&Uf7o3;+7e8+flJI%on(tWE5qK>X)-hR|O8Vbdznb_l&Cw(M1GrPbieA z3H4TUGst=*P(F#6fc9zFTkbJv!4y`!O+4wK}av%MXlzRr*KnS|yi(Qp0Idq=IfL*r}f z)w4ts^#T3y-`)y@zgWYmUm?6@*C#7r=|-9r8pBNJl4$MOz3j{;btC@##36f6GJF1n zA*)?f;H!d@($j60^LL$511ZKP#W9YbbM9r+%zx0UZ#2#|aXWa;`Bi0sXxaZzr+S^v zVZG%usXe(2}ka;QIpCGf>f=dG@53m*#Rj&#+6shPl*|6vY;pFa-*l;Zf!PiCs}sipnwd znx_>DqpgPI0sKGlV~}EB7bB^?z{1`WPX5oGB&uDCX+MUSy}*&fD7xtSrur`Pd{Weq z(Fj8>x!5e3S<^dPV*g6mL#`cmMOD51G`*4%wyqm`^W9{4HlMxsI-}@_d4?g#6Duv~ zw`@g@IPl_W1c9oTllig6-*BZBIK2ZI=UttNq+{>?hbBztCpQ!P%{K)8VmoUkx=jbf zEEEXRKCfLfQV{Cp5deH&dv7Ak;fqy;-A3eLD&@h^xHDh-b^x=aO*5l0I33Gev$Q{Se68H1f zt~>iUNp$b>C;D2+TD(1>YDr&vLDyR)Lm)#r;re`7yj1O*D=4dAcJ^W1`R!bmTP`Kn zSoDXnrS6T^yn*ZuLGZ@~U{-Z&#%Q0C&4z-_b^jEgh5-Jac{Xaj|EBFcDq!mw8Rrv> z@JD5w=Pk#zr;6{FrFcb3FCzumM8L7HlK1nWC6HOK3$n_kn7A7&#x}ihXLQDI=pQ1I z$EIn_=I@AO_9n)Yu6d37LddO!>^~3}6x&MEm%pD+zf)SMemw@)PgL6pZ5lYMZG8=` zV8}3k5$R|v*PeQ5`I|f|8Ke9Cx21th<=bJU+GPJcSs6o{E3s(g_{p0QPN84q;V#-Z z&IVJTrFjq*q;(%d=&$y=t)yufuk{IJ?q*-E8kkkEdCf1+&RlFlWkeBOO^ft;5vmpU z;8IFT!;dcb7(V^$JdTx`nRfiF2FXfYQA%b4ZvI#tO!M~leYy=vFdjS^X%H{R7-YAL zUePi^k>To$YPO+6VQtP~K}Ew|)}0r}d(zHnftBpbAHl5I7vqx|O9H*SysIF=GLN$6 zcE-C7vv^;Q;sb3NUfSFjdYspPp=l>6ipTCP2|h~2F3L4n2vrS%p$?Gk%a5h_BRN^Q zF7=`n13bZ$(Wlvj*qUxk6*>m{N8;7|Em5^=*ffoOq zFJK8A`#-pl^3ikjoM)r(rYl68rzulsruuO6`|lab$~0qowy1BbFzCsf^CEt3m8mW2EjNJu z5`tkm>AE?yc^CMRKSPM|P#`yaMt91#b4A!snPnn^M&5)I+7|So z<=8G--$=-sru3yhQETzH>1`=Ro@Y0Lpx?IRaM1Bdg>Sf(9B&d#g2mh$<2`KTK`aO$(pYR&fB7bi7caN_I z=vS41$=!a8hbdEhAU2WrQW%{$8p|EwfZlY}$ZXuPP4N3!_xy#s#W5by2oL^3$wCWk zN-o^^ds8_9DncGk88ur)CGGK4_A&{IIOuPvQo;yhX1H}`U!Gc6JLvrsiMs7@m^$n|_EX7ie1FiO8D}oc|-> zx25h8mG@t5MC9<0&6kq-S>hlvczE052=5H4+g`4h$b_iV9cwZ5#a$As=4PHKzGCICvd(=!JRW;D=`l8k9z5eg=CH1?ZCq zbJVlpJLK!ttggH$hqLz9S6?b`qZ?3Quc%~{{p6g_%o){moz88nJvEGLwE5&quS>!F+)cw z)jEn0AYZe&qo%7z@0fk(*uDu@tZ&2mPSMDiFxE4#U7xGw(BvvsCzh%|zL&QKcL<&2 z&Z$PkGYdf*6Wkl?&eN`OrJEn^Y=Hqp`Wvy17>U<8txFt1C5lSdwLE|Qn;N8z_u?IB z>F(z#A3hcZ!tAmksRssHQ>L4;Zd_=yzz`jOCvY z64A`CY(24Y{WS36Q!&awFiJu8xX;D3>6*0TKq$gdV7#tLsl~hg_M%%k!e6%MquaZCikK|fHFUa5@=agjx!8kyuYT#C zI0ey?*z%STU1HGKz4Nb7GDJYZK7E=`gO;6KR#s`Yan##Z&Z7d-j}g|;JW}!42KI7Q z1D8GqD$38)gkpOcrbN(t1s`_ldwyC>q61*f7e|dHU#eQ{)`;i#=<9DtruI)RE*l@_ z*2bb`=Yw5QFOU^+P9gCzi?R9T%tWXT1Qc_W;?&^G*4OZ?1#CF64SS%!_{Dzfe_LKt z6UukR;=K!ZD!RC#DCbnN?61A=g?(9ajATu6waXH2jiAa#vG2loRmuu1MJEnQA7F{V zqFU?0wxRlU_Q+a0S>GZN3Whwoqm;>_Ql=sAzWVCW$T~0dm`^dc&p?*A<2>M~q0d%P zH*x2)gFII2vO}uHq!#exN)(G$sMm%=V>OrC<Uc$XUjIRYm9!KEAm57j^^FHPG87oGyh`;sG0qiYFNw2ZC<`?s*8#qtu{K8uKo8>7_fT&H*#5Hr#- z^U+}@tbdsAHSMo#4w{*@GUF;*dTs=wcPAW1s?7Wihp{`-hTrFTJ>XP!d#A_HGow1} zE7wJfnnkvkgY1EwaWTYtOY6YWAckB->IrGVj(R{}=yWbu(O-sX+YDNBVE5Bv2f`*D zfA&}Dfi-`I6$6evCB%RE(o+o3(&nR6%%w;B+W!!nm$O<2h}iuLAgdU`Gwq zWc!sIzjl@)+zbe0iTfRSxRwiVodotGw6=|^ybDh4y=bN-N$BH)}`La`7M7-$Q{KBp6svW zgs_hOps~YrS=OOwOc|YpZ`gFN14UY79w;qCPQ`i%Ncut1eIuY}^6hkDN+_oG<7!<; z#Yj7Y?JtKQ`Yx|zKiAgk)cQZd6+vZ8zB4|Y%e{a|f*PsE3cSz${Dv!qaty2F>7U(j!x}x!c7#T3yL@YOOE-%b!5L}wcRhSDwcv-4>7C_m!+{$MR{W}rt&UR1z9D1vR+zP4$NS}!ARTH)7DQ1U~ zh-=8yyHXX;ZJp&oo+~1r?RN|2`*;aFJ-r5^s`6eou=Bdh&_5r`x-(8hSg<{Jqdv1> zbKNoXpZg;NNT&9>>^yT~wcVh=%lf|%eUp?=dt&xXlZLFzk{)uf(_52_(5=*u`yJiY zQ7k0ox_`~qF3r}?SZ3dZ2e*e7wdLOcp5f41-Ssq-*%hijWbMa3dCq%ecA6FsD~TSN z9X6|P(n2>FY;N)l^0`ibYb|MH{{{MEV@J8T0{BDuE>)Srnb*Dln$H#!aA$8Ouo<-^ z8|(LIE`!*kelIW5k~qe*&+^tUDD8B`%HXA88FipAJq{iWbF}umz`T*0l(H#hKam*O zY|G{uOYJmUJxuQ;BRsT4l0A{o{Ty^W-#MxO< zjQ)fvt#dKNOjhogB~=gXb+&(xO6yWl9I}z6P^WrTeUni_CE0(}+y1?D_CQ%r8&s$l zkw8HSaeK0Wh5FHm*=OKt+nO@+$Dr7M`}p4D-8h;cuMLT2kd^eBNxF!6=G%9AZ#l5; zxkh;Ue(Mfj5If85sJ{tNG(4;7TkeTS?V_49Xn~!p4`jawo|p^PWq68A3crrHX!22} z6AjXRC;dj0QbUGF%_%gmz+6bWe>CrRog{z$soow2*fqTpQ+94{{TmVK4>F_@2mlCb zwk-(|NyP}1M+F;QjTE7}v^nB$Frvx)(V}!eeGJb>99LqN2>&(^oka>?zXNE}q;_aq zwNh(c$(pvi^JmzZ+8=vJMGL2;cF4JHMPF`2yyB{!M)(BkS>Ir!d)@2e6u{?PIP&T>6-=6tIP@?=1Et z%vUXitQq-?W^E+QEBksF51^a?$vi_ED`!ObdgWIqhjkH8d`QXA-J+%HTrZU3Bs!~P z;dqn|A-3S%pN8$w)%khfY0&8bCthKjw_Jh%*p%M3-^mq2LVf17io}_jSnVbd>0SNJ zlgj@+j#w?z*=5WK8r+45TwbaLaCgYs&|FvTQcWaWT*+~PzIpO!*n?6Er=NwkOhrJ5YXQ`NW=t8nDavHG;`w?sD4XQFi_5-%e`1#b4KW>Dd0SL>(HSyD46gwdG6m zd1aZRchiE6>D1nsotgj*d`xT6s~k{ILoM_sv@$^QRVY)@Xlud*o)OOhRmPXxg%aP* zFW#M}RGG0IezK6#PH9x+ci~XR;&k3`4?1p!x}WY@4$Tt~X(GDT6|U#SY9W?27;MHt z$FvMPu09^aKkljD1+-jK@0=E)FS;xx^om-fZW0qVlew~Bzb=6a`X5+;Z?!FrZuN84kNfTQAxXAKnd_w>VVX}!nPa%v6+kt zOo9zpZgBZKL_Ya+Px^FIm)!qTqY+N-m?%Ac5ZxoBWc?SU)a?p2Q?~HGAxkXp2zg5u z(Lyep1+1vL#^qS|)Ub`7lh{+nE8rSd$g+HoT>vZStv7YNeM**(R@W zi~lVim$NUYb`M7};QbztcC|zv7bk+16`cc|{4O(E($@WBxHai{LP!Fo!o-?wZ86wN zm!wzi8ASj^OwVqK4%TZ*`jFfW_gCqPZuokxGP_}7H2#)cc4Iy`W*36Zulk9VKe{so zH(3#f7MF9S^qcPnVy%B`Hz?$m|OYSKPn34DV=TsYrieVczQ> zEIgfjCf1inNi%i*J8V9U9+6C7>=67%wT6m4&+~0K#V2;6O{&PjRbuE&ehz9ZN0qX!;^HEIKz?m zce)?!MAs;c2)uuREuK7bN&D~@pZs^+#n|v%g(<3FP%4Wsb?4V1tfq@6k@uL9$tR*Q zRf5&j&o(V+#|fV!y5xRh#ZKkR(KGCRy_0d}%sct(#L1i5376KOffx44QAJCn_SX*t z`R7Tn4Mg6E)tQiLj=l-ePRRM}YCqgkcRwA@8bTa|k=?mQz`6DA1xbu$)qwo2&6IE5 z3p3@P+aJk|`7wvL!{!X1q&BUEn$kwU&&k`R`C^fXKWrB6#0@L(FR{24$Jc@8rAl8a zNf-F>%f_RphM4#Kd(fjt(xXq ze3-s~{sURHA`yX;?c3}8tIyn?A$wD9n1ycBxV2kKa%$bSFx31@~=|mBrTAfw%L&XCS_NI(C?d*wv~tEx*#t=p{OncES5h7II-O!N80UbJagj zxQ2;gw`7(SvT+v6n==5lgEMJ{z5bel^4$o=B9FG}e*nBk&6|Qxv^QV_aLUFE0=VJT6MkWuERxaY}mD0t1TtqSrK*NFW3>Mn0pNifhE0)N{xj=#vP(00-ipskR|NO~qn15x~f6X4S!lSvR|g!5qi z#=mBonG0j(eQtvujw7S{dwF}xtvTu9x=>cE_umu3Ud=`-ak#TajVGCcxHKx@6|oAj ze5AsBTz0IVwG=UMUSl8VwS->hJkfA7C*(9qWx}#j>btm8@N{5#xg=gaLpW9vz4`x~ zN5%osudUY7JOg}7f~$Q-)SlCGXn)XSxXIK$(m4ro3MFdiP<93oaPL%%ls( znl5=}AXS+jXJkf2g0L0g$1~&8uR0bnHxYcIuk=lup#z{>c#{f-z2WLSrB*V!DiCgll271ZVnW9A)R!ZPdW zsW(;(ZMZ3Dc)#Bp%NT&dZ1;5p{-`SIEKm55Q(9&0mKJL!78c@0|IJ+m?9e+7efgAa zuP&8Cv&T3zarH%@{ijO|9cz679l~llImgP!m;xsc&5OyKe~X7_%=j#tn%p&K?wwg}qse8mnAsBibliZHMf=ZWyXGw4oWon|XKexICKCz5 zl$RIS`)*(hX0g^sROjU2vSc#>BMhJ;$+itD*wd^roolinw6Y-Vj@wZ55gapK_}JG} z=AY%tNpY9w8!o0oO0D-H-S9(I@^MGobM2Qfs|ByLG~u*7)4zGz?h96(v0p|`dt_n@ zw-5T5Rf?XVhHMKSxf)@J0U*#<3MVly8qVBJFVc*tyeQ#7;-I`@SuE|Y5Uz^(Hgc(MX zFh*>jHnIxsF&Y^LrQT#7A>brfZ`{JBwvr2NvugRoU6 ziJ5wj(f&I(JM*m)kCL;!wg1{RM`S?K*kp?z&j>b)Gy-4>nH``%uc?_74mk z2lJRb{cw;WE+>wUhyX4glXiW6$QUEe^d`zQWrWV=Ui&Vg<=R4qyi;1SOS@MNHpV^? zoj!o_S4gMcZ5o&V}KCHp>{At1~eLb%e$A_z!4o#Sk}UQWriiTU-j$y>pp zv?_ApGpe#z&jBh3y7Q3~>d!)y6SNxD!O{D0yD^8YUsgWpBr=h&_rp*Jol#lEUqGtevYp~gDnZF^zav9 z_8<25ANKbj_V*w5_aFB6ANKbj_V*w5_aFB6|8@4ayu9i(Z%3nADEW09WSSgszS~|o z6`9{6nfHtajg+KU`7IVo_@FZaZ%+fi9tCZMP)~hgtW44?m7RJ}pFPgNEz+Nz7tU1M zP$}G=#WKju8_>izU}745V)M0zw0^e4Wn#<7v@k#kU(d28p;>ta`(C-B^ zS!ltZpV33`_bGobg#?6At$%4a!6WUD_w?bMC*7LG*v8BXq3z+6`CrqOv+C& zN><8Mh1JY6Y&_aO9Xgi|%$;RPp#%%4E_I*oRf~DgX?RuDVEE_3_x`UdkX>BHn$oK& z#e+V@3r3Wj^dNSf?#eMC0{TAv3xW4MhN?mMvL~;D@}L&;FJ!bO>RLNLdkd1jyyo!p zo;Vsnqsa+agcN!!sg5rMb+2LX%HVsiefC2~B5*9LXN0YyBk@}sW(u7FRCb1chsk0N zRY$21AHR0hcbqUOr@F!3E~({pc9@aeB5YZFYL#`b2mr&oVv!?Miac#GzX zUI$s`6Q(0oii9@JOg{6#h2BuXfaCQB^W-)vJh>`7%qU*rPuFrn?dpmNr`?h4Q~*~g z1kJ^+n+qd9Db<$&#L;uZUnE&sy51T$JgM_^d{68>rft5UJCcGiFN;GbzugOX@_Di8 zz{@%f66O&T{L~+3=_4sGmQCFQ@pD5Drv<4doZ_bI3;?xtHL@#0Ox_b4N3md%CA^_*>Y~fEpQQK~^n0NG)Bk%ZP8b zd^!iQ&D3nkuxmI4<>Z@S2;>J8Ya%j%pD&X>KH#2g?kf$)JQAznn5Nq?Mg=bym(JSiSkVB#NU!vnA-m12$W>f2wo(%I`{=wJjNX zT=zuG7f0f zdvpSQbl5af8N&O{`RZU~<%9?=Xq8~FJEV-_H$h8a6_$>2TFMBrnT-|`&Yh5&Inw`u zPj}M)Q?~vph3KADQ@E1(tE1ibi8A6Ze?uvwW779+@W;pNFP?tK!;u;%S1NI8A%ZmB zX}GQ)X{dU*LysKI_t~P)p<|;c51NCk61|&7n=WqFc&TM?$(_w#Pr|MN4^b&LM|Lbz%(eTW+tr|K=Rt$?a5lVb9;qJJMz!< ze48~wNAM3$_kCasZ2juwC$h1*K4!|92~;ktg9{J?KFm%}DIkwf4xqb>-I*2Vl{Un~ z+13!~F87MGuHuaO0|#`A3?8R~Ff5;kRn0r!CU|8U*y@{1RhhyRpqWSxp<590;dX}q zQWeG4n1~ZA$ZaML*F^TePMtwIkY3nB8N?fi=AUj+UL9}jXG?d~hI{r+ z{FmiEKZbS=?J!~6)^eFAKd;)Fe_o$wKEP&A!Tuq>S=XLzJ?yPX52z62If)_iqQ(@~ zT^OUxi16NB=qBB?-=)ul#ooOWhZ^0YE5n`hqYS}_{x;SHj>DDtg5YB4FNc!hPdxChtikJlCUN^e~x{`9n#P)!;IWd5G->MTQ4!gQbudZr|yy#sZ zh2JgjVqAnTU^VqNk$EBe65C<>o2nUusTW_688f%tNUs9}MR5bkfC6zgg!k3qR^6oI z*i;-MKt#6Rd`t01Qae{bSWA)T)~V07lHYP6HMJJ9n-k}ssAg_(kp3Vd)^2Smdi9Om zyq%^#;Iu}$EfTwx7}WjHZEbBmvG=e#jkSXZ`2k<-xL}hq-aofDu@)ab`&A($o{?8m zLW@dTn(^ZF_n(a!rJMzcLW<^Woe3DsxWgn;|c~ z)r8qzY#bC^|LoWwxY}sKzyW*C3cUci7=9ZXX!M0vKAzzi9oQA-@ChNEUW2+{KA7xc zGzf~Ls7lm^7c2Odnhg&PS~q1v z_YT58wsrisQaiENC3)=84nmPdrg zcm{KUvc9p){-o5x;np0~$=G10$daD12fHNA7s_&tx`@EPoC$Ma=& zXQ9Ia3xD(7idXGXx=3os%&YE-P~0~Ak47jChY52^gRcnH`K#Mer-0TO_*vSIl4I;R z*};|lm@164nI1onSc1RCUMrj2%ph@L9mhVmOTNqpD(6k}E1H^Yq`cpO_+48HI8OEG z+Rx`Y3ed z;>%iDz46GrU1S@KaNwahyFkpkB@aqL}FQijU@?rB8Jf7cj*sWk?4AFkBWu^i2x-CNH z88=>Q;i!I8eZT83%yO#%+m*d|;Pn@uwK}A!MU7t9e-MYb#Ux+r0AbuP=Ux@$&$;Zu zM{A&g6hzGcEn-Yd;3@F4qv_DaffdKsa*_O32aX-OCoxBWTzP)a$%so-xs-bbFB66NB+NT;{ULW zoGt7j2l~VSf`DJocu*|j^0Af;CsG8hPmZUF~%k^el3xR7pk4rHC zVBg4=yz;XVUkWVq=lyWbgBDN-qRR49F+yC}#YX!#M7I1$hd|dg_^4Z0`tjy$nZB|m2 z>Sg;={xM|vmC2?0omWy}!pz~yZKjdtS?T68BZ^kzf}wKj!xn&;iygegZ~uU1%YMbP zvDO(tordrG{139i*YYyvK3g1wyaw#BjU#SOH?CWKLYjVaV1E*7rQYTFgv??*3u|d4 zwJb4~Bb~YQ-TP%r&!H+yb>a6A4f}(Fto$?Q1|Gc>x_4K$96O^|PK5F3Wz&mZbKf`P zsAny_NQbP9rWS@DM;REpi+-laJQt`9_$-z$OWI$&t9f+u3wyqLkZMMg=8rX7_G!Qj z@@|;8^Z}%8HI3Q@WwrzkBlnztYiN5Pyz$cx7-L@#;usbC4Ga{~cJpeI5F4Zuzb4ko zMBK*0hE~W?$6Ta;dyzXLcl4J>n+3=uL;%%#NByiQQpSMxv5UZv(hK$ZNU8H2l~neV z26mRixJF}3ki{gt^+Cy*#lWza?W%~%zWI0)*WyYC6nZ>z_dZ|=0p8<3a$Q2aYoo6b z_Z#K^xhpkMJYq}Qe|!ZIKT~?xA|Lr!PPf5xplYHXFq-|u^YVDlnSA9<8g=Tf!JTMU z0ltTQL4V}^jdBMnuJ4$RDS!k0vMY9b_X zoxB7ZIdkq5{riJOfbE<&pm!mw%Y3V+Ko@4=8VE4cLhj8GXHUDPfV+yJ5#8%#B)d-!wranbbGn_p{E)3ZM{}fmOTYD6 z6g4c3*?ig4 z7IvHQ-ILZnMT_;1B9Z$76%tN88^`y}iCS;Fob?(5Zl>!EzyUp9rzvgso@QLSyG*?& z=P6g8NesMEDLqlQ^qQf;0vloeuIOuMx~i}?m#erN%7T+0*|uh0M*xnJFNP%xd9rpd z*oc=jpCbJsoQG zRF%i@zJpF-f6c}}JFJ#Y1FK+XiA zoBs7S=TyJ{>&Wg+Tw5QdW!{&G$uhQY|hHT#v&0dji?#BB-@9xM~GkQ5wH&xsv4 zKk}8+@=r}a1baLx<0{(|J~j6ikpRXgE`PAt-#6L`fY=gU-;@lKd;NgNfhG{S-`DC+ zMXPe^LNzm|E~ve@MRVyWk*Rv;d`1Vb<~by{fhOE&_;CM->ijFxX2}3qwH0811lRt{ z_mVX-Fz%&T_-dZ3@6HuVx)m>?Y{4EGn7djwmS@qTJF4R=a>1$W^}XCzh96;b^RJRX zs{t34(@1Z2o9qR!*oH_J2q_vnmguLPH@ewM5i}Ndos0VDR&3L4Q_HKuw0x+%vTDNA zo9geA=f(DdK0r&LORg|!7)(ox3R*+cX@${@ObG?UCqUAq7G;+v9Tp$b^Q?`50R!&AI+3=c3dO`%Oxf71+^~ znC5Cwa1<5Ly+wWkY zX$?(9^*Ufb9@pRg*}A1B){-0#ehK7?$p{waV(+Wvr(wb9X=t){p3EwH01s;bUXxb$ zj#o6{pO&51v#fu>5$PU6GO+luuWNb;NRFvn8i9t6HpYEhxw)SZ*rhq^^J@ym*zGPe z`FtPGam>l=a5r1nMDzHuqX#R$@vPdzmn%K0AGzs_TQ)#0*8nVpFIXY=%Mqk<<3K=@x&29m!+wRR{%0^oK z$eg-3(ytet&PzIqfqQcf!f}Mx)p=u_br!XPj&BW9*XQWzKeY-94DOEIw7pWPLPb~4?OQ@(_za_ z*UVBTCsR78^)lb@8d^@7-ztZ^)aBqW^I6<*nFtj031F7xsy~UI7caapoXM~4G_2aM zI&qp4wIdew@>MuHy>kCvW_BAjuMf{~9{7;MgIb>lq!o?JKJn4oZMs?HoPfbFa)d<} z8#hlqspj@b9AUx^;$k=1DFYchm>T+%ac~wIshVU=(HBRVgJr%MopQ&osa2Y!hBnc) z46f5iJ>xjp>N1b&KM@ET$>ja0`Lc%B4u1=G0wPc^0*2O^-6xnJrR$%D68%8?oqBSc z7$?`%9;F}i4uLIb)br=-J}=io9M0RR7T!>sf>Vu#bC1TrAw!5OuFXkmVJi*BJdYR4 zV;(mVjhV?pn3I?-B|xABxS}EX4MHV<9m{28f5|$2aku5@nQp9}ztM1&>CSXzW6?=1 zOU}pXlk?^g4})1G|6i4S)%t0V!T_{jLo<8uD#k6LgT<^w(V&d@Xly$82-QKtFdkBU zC@dMD+i?AMF4v)Hljw}?FFTCR5c*(F;Cv1r{I+x62y(x1F3|bLOaEs~n1;k*~h_rUV@|X6~ z+$89#H2iv#`;He`nClqRg0)EovuQqzaHt0e6;VwMSHcISfcW*zhaR(oSOJx{dBb~R zfS(HPpiLo(2E>`4j8Nmim{FNM6^qX}!VTFgx?gqHxx3)}sV*DpG@9HoQfDA0h8#8> z_oHBGzq$o&KK4~?3%gibx!|}&wsPJg{&++^46}tdelQDcJg>Ztvk(fa1hps;H?gKVngjXUD{(jNIn zSgR>|2x${z1X36WrJPj=NU~!scIQ}LZ_9wDKGCK>j~3kZ00bxqPk0KQdQu*@+!IOL z_Z4p-m^Z2G1GQI@MwDE?y;<>E>nFu(HMzTpiO;9Sy`k|K6_CWDN^(#pzzWGl z<9E2Q&TZo*f12^V^)tJKHb>@Gl%1->nHpzydWTn+?!QGWn+;v+YEb3xh4L)IXpf8o zObaT^xb8-Dg0tA4=v;!f0j)g9g*zbqpN@lJw}k| zZGbs4PR}S1~szR6_$!%|L&vt+H^U(!|jd7RNW!m$9w?>dV!nDph$2`n8 zT`!NCWI8=S*UNgqcCc^=G^_^s&KB_ZRrBwg+#l_UW9TZ8&-g6tJh9uK1X+IBUI(05 zwjz4xpm^yOD(2?!rFYp%-zjQe;mp?$iG74JK>*{=9em^NCO9ewJvjNYU)5>S)4^~# zyCc@f3bJ-Mt~mAZxtI#Sp&^Wzrd+IzP=sMziuNn z@W^FM`&GDR=Ej$!Bel#6xbyQ%X#1f)B%tCsB+2!ohE5a6buBr1|3;K+3+7uqQ3LY&raWilr&4uj z2EI<&N^GBxzg&SIyDF}He8ZRL^iB$SFk($*4*$lT#xT6IP<_`3nBv4i?i|P;R3QwY zS;>$n_=P_Gf!6TIlELO#`4Hk(MYx0Oxp>F^y12iq9Oc-pP)phESBTH%qFc}qVwWG) zjx(BcJ5$YISyd~C_AP{x3-+cmZqwTURP3EM;X<1OPaK>FbN~2m;0_^6Jp8(_=;<+$ zd%h?%mo7Hv_2I78^G^sOpIR5}d9;(EprGgd)5QH)^?#^|o26!-E&foZE=vOrWt)pH z?}Z_s_v~t$sLQS`1@SxhCd5U)r~K&Qi_+-pOQoG=#>@(Z!C&wCb*`}a%=?jRARFfo zULON80&eoqrvPwJ&~6?AB7XP6#O2dX2~toMp3b*7YS(HfDvLDvE2mMnYV{Vt_w`Q` zq+!`6vp(`~69^3XP~=9}!q>H;;7~=>ex+0C^6kR28@OCuT$fcdq?rntZeoz0<0J+| z)*}{Oyv{jMkl<1FoAx#2w`Z)yA6as3@zd|B{ zc_&Dkm4LubROA(iqjMYj0r_*QQ6Cq9g^E1EM{Az*fr3yGC-F#|Er|d0P-m-5d%&&7 zS>6SL{nq0&@BGizKZW~=q$)-11mJ5RU%?#UN)A!Go!@jE?C0(FYCa)OmIwa?(mCZl z`VMmE=JZd)Wt(~tvmbl^{;qNZr$tu%=R(K+_;7=~Drp-tD1gu^UFxg?CIhbAP!J|? zxd4JL0OEuelD8gUua7*>qXYxskp4U1%}(&2e`f_))gdk#=BG{0^XC8jdD*%>{0y1V zgxCS_S0dZr4!>za(Eeo#f+8nxEp2no#_K<{03cUE0quDQ7LYYq7Xs#eLvV(4>^`}( z3aCUnhaf$%GT|<_pxC`Ugv$h@7 zuvNhHT~UB1D#&Z6+n)jcRCk4^1^$thF<&?8ojh-^7taib8r~6$!eLXb-e=eLENTe3)!cO!OMIW@R-XbBliEtw~g<~07WE7|=lHK{^$aP^)q|sWIg+i*90k|eNb5ur$=G4S? z=!{kGbDqXW9ZLCDjgGtB;WuPoBM%M^j^iTzJU>H$iVS`d*>r6aYacJ=ZgbyK5A(OB zCmKTi#FDKha$9O&La45`5qVZy$bDhIT*cQ{)%)59j6jVcRVX)HV~L^ae7Tg`0$F+d znwEC@+7_RV#%u%r{7Ce}^c5g%G{a#Ba%~@YP-A?#x1W99?#oXROL{Gq1qT2V&Nb7X z4GWhY5yux)+{Uw?*j?7=DhIG{ufK|`pM{#AsZEF6dixBVi2O7i+2PwU&9uK3-maP( zLKfGmb)cu&!F+t6ya!L=T`&x*@z0)H50Mrk{ZCKnM-4lkiSFK3{aI7FZ_?)=qpnA0 z?AOyNdvxj5#(tEe9X2=6Nu&BpuX;ea;AGaI?WlL`1k%rrq4P{``BuT^NqP49nGMsh z;I7>5I%jKV%F?!X8kn_0t&{Q4cGT+aR_6zJ?E;L!XjdY!1zx(3 zAY-*h9b?t9J_;GES z1;r`|7(NT@&T{NY+f6l|3~4Tc@k36>`6)n9h^*HI$DH_bv?3)5;4C+_8CtJkY1J++ z+Hv0b*9rOOS!tjoO!R+zNfh3ojYyBPo)wO}8!jL9%|92R;;{eyOArdm-9>16)hguO z!*De$Cn78-LUJdUZe;ri*P~jKRKGf7_li-NXnnvG zeq&{AL6S z>4bMy-OzxcWl-_TDG%63nW;Q#u+6^@?FRbC@@!3L_sOWQ%k7Dj14?T4q6Ev76L&+0tqSSG70(>;Ri+(| zW8>y3769}<@uvk1)*_==^eXp`ZnxEQUB^ET!fvHfF00w+t{SsCq$f^tkjcz&yl%-l#cYW@8e6VDH<-vuIB_1ZVFEC z&^o@28a1xWZFSL3u{UMH_-=WqMf_31aK6#-^S{}p3<9nyFHT9Sfmf#w&h|=5Q{0qR zpg!?&Fy4V@Y?7aq2S4CY*a%VFx5-xSYO@OxoFTY{puH$@3)1}V%T*da`%HNJh$tw# zjJnA{cGVc1#0i&3>cDUHk5LGGhu*~rH z({*Ojv`G;H)*Ze}7oP8{T>;a)+1@Mfj{!vmuW650F7+uz9;r|%JyT&|;@{v~5h@`Q zy`S@S7ydIEOGly*+7lv=*HDI?p!ms!FMAAKDMWjB;9Al|JBJaN@w%PF6~nBRZRnEt zwiI-qn~lQSj41^Km=pozyyV<@>X@T~DvAOR@O=1~I0gqf2ft5iAoAL^C%^HnMRwLZ z-&d?68%?QxE3#+!YSson9G>Z^8jr(KBl+MI+Qd4Yqav&1Ujc-rIu4d7fwH;ew;X)@ zt3egCe6M9s(&hAy!|r*wGiQPL0jyLT;vR7iVlnNNR)C)uN$f`M4cUkRF1801=d6zi z>PSTc7YXK`d4%XjT6xQAcwz<-o`*gq3aYYEy%flnX-u#?y}EBLp^|wr3BFkhEX$=5 z^G76wZ!WCNgeSIO?nnyW)UVwS$C)ld6VR+EQ=r0^>UIBS{eF)?5odc7BGra=6zElT zFCPa&6DwR~M{bRy$~JkAF8yl#NZRIvv}e}?k*|rA>FEjNK3^#9PDxBn67by9>0()jOmAk;Zi{%OSn$0#zdp=s^Sp(S$i=%w7>L0GbhgQ z4T41>{-$)>R6B;&K=^fEVcd}kcBJRioD%7AaN`mIVQvA5_B$&u4c&g}-Z-JS?MOV# z*}mHDX;5juAy{xM^vGLM4wU;zO_a3X-kfm5CRBR&vfNDgfk-L*ip==utr%~6{P$MmD`u7lij_D^mrWel@c=C12EWlpCUCpN>7*kk&u`O zP)YoCq2L)B9Ibrq=}#vEQq+7DKT-KGGF%&s9|-RLA&Qpus_UKF7S~R-WYK_NRMz|a z{Xoq6i`n&H!s0|6sEe6S>w-XR=}7HSLde=@~XkV$t(q zg>MUod)VK_7qu3FHA=+jFpkZ@1oU;-!S+TQ$Cy6m+^J_k!day|$Z1(ww*W_s0iz!; zBs6A4QYQU=W-)VWa0{c?jD(--CO{Ili=(q|$JC?s%5gPlu;w)I1gFWjohzMX8@{5? z)p$vFu*95TyCBdw?P^PLkE&Z-mrb%gu<(ciBh~CAEIKws{mt@uP=AP>m}$nVpdExQ z;{5cvGM;g`X4o(F=QF`QYxG zei<^!{+e*=X%pK{|EsaX8VKHSj$TL{yNhw2Mbj%%av5x{O;&I83C=lk*C0xvBpb#4 zpOCR`%>2;6$E&G6;?5VU8DfO}Ha#9O zHsJP-d>n=*0vl~|bFW0=X&E3iYe3@5sAP{|kDC%<_52c#s%Wzj#!uU%gnkRH_{y1x zMdj3oQw(WF_L&iKM@5e4jySBkVKl@@O}A{mfn;d!+t1lQtD81CWE2wlU-&k{DGaK7 za&Gx~W%YL^8(MF?)n-UPc|TbV24dZJBb5&nJ4Bv+c5}?Cox8lym@RB|;8tahy!xiM zVmQUOK0SA~{*LZtmMJ6g>I>0^XMJ5m<~m6torXyvGmYFg6dMGN=`2^tl~72 zm{HYt65_=bzb|7>RE9<)qo~mufhBhDMYu?0<&)K&s%xown`PT+HrKD9+Egu8u^Vx< z7buNz~v@R~GU5ARG5s`rkc9QxPN_A#mMOP!v)}7OC5w{CJnFrDX-nKm_Pan$vB*JGo zQpTn>BIVlebipz~ov(U%>MWo5mhID{y5h+5$H=kC>Gk2NHn+rpF-3zu9%5d3X zk~{QD6Np+%;V$sW$qhLK<3~-tL+2i|g*uuYUGLL!-cDA!6qyjuTPDC)A(94*F3r9A zFml;8p4`mcF1q{MD`ePb^~=q@GCVOsm`~E`oB)Kj8yQ#$7ZQ~h_>p;JI(Pp)bP=*s zr}@exhlQ-xUG|!ja|&hg;2>gF_J&3KOf8Au?xHWyA-pg8{8c!7j5pn_EKC))jcAQ5` zs4+e`Xp0^lSm=t#Dd7Za{!+%Li4cV6jmg|q?+=bVoS?W|`^C$svjaw=n>n}d;=C?W z+YhCtYV1Cq&dr)~hh*;8J^DmbK{JIP#u`{mIbNwU@SyhN1xK?b!aZX6u7!~#Oe5NIbfNV2 zSux2aG<)c4r1NbFO4mjYPmVkV9<_k;#_S}f!hUSvpl8d01l76F5EtGYky#hpmvU6_ zVjhRGh(*rcM#xp>^T^LbhogLjI}y*id*wzrr>7h3{0{RCtt;&hCfa|#fpg$Wd80-H z4-~b-x#1rNG(#>!m4prNtsx9a{k2W1+v5UJjZq(OyQ9m=-*cm1h2U|1II~d(E5J2^ z0j!a;5a$rl!-cqTZ9hIKNkT2Y`Bsz!*=6!l{X_0FJ0G4W27<`d)(Y^#YaaWZhchI+ zuYbCPdIT>R;(nFRgIbmn1jnAocwYv$HWV(y1(2yLRH}O^2I<~8m1sF^^o&|wANGcmmWPMD}(kU00(WzV79jKv^;vU~QqSRbetJa%|vy4bbg2w0o z*xX){Tzv^Xz8%PWymci_5q`sBo<2@Y#+|kE_67LcxVb2rWfYqkqG2B+KEh!gRfyls{^_!^23N2ac zkrv!}T4&q;ZkehBQgNmMwNb5*ccK`*EapdLCMr?wpvg+f@#8k&Od7 zGlSOZ!04MS`$`k_cF*$^AH6OYZFkP1azWlGBBS!h~{oZ zyzq>De>oM^a=4zp&S0g)Qg2JLL)u) z*Il!1o$eXxVP>q_QbT0Kp3)bPJ`P9aW63Yi*~DzMwZlkL~ShjGrP!@ zHmkZkwAHR1Z}r`eMw7=>*pUrv-!JD*njf6UDswlE$}6ZJ588fENTbhoq9!;^p@}lo zTEM8Y3~J-_aJ{Bk|Ab>Hj)hiIKF)n?Moi0xQ1(qrB5&ya68%cp>oEQdK#MNms)re( zxAP+SsH!(J@3z(&t5HsOYGV#jF1zlZ`eNJcDoT+nG5nFS>6MX z80Bhx-)UzKk$5jPaj|oua{a{FyED|dposTP&8Yo!dSP885kt>I5jYRGSNsAW{a4aY z6YB8Y@$=;nsi0srjLl9)u_nFvHiie1DDtDg_GKUUe6y8%U>lWQu*RUR6H~mVJo@oy zy=6QBZtG%-0AUNOxNCL&@zQh73pIini_fG(jEom*|72) z;>eAp!N=cAi?Mct*c@z#>EY7C;lBK7dTgXr_0rQ)2jmhT^N2PWqO5>hJGRK%swhxi z{;TQoA7rQ4YiCQe(w$E21}sYyW-|9vPt%ObUcUU48S)utuG-`aRd(GrB+&4xvsm$* zIK!!i)1PRMP%2?rDjAt_l`EAjm>-92p&U!JaRx`i9w%SO4`2vLlG#}9Ldsru$1&&@ zy?l4`HprnQQ)$?kPSBZxi2NxE$>CJXLv-DjZI)*?mZ!82XaQ2mPaE&U4AV|r`{JRU zf~HJ~0%WR-VFq&zS%qK^J>mjX4_k^IkZ^sBY3ihXIyn5?VN9WHJJ$3XSN`$mrBEj6 zo2sy?yE56|z8axZI$FOqVnVqNYQukY{P<%M#o;k8Gas=$`{l)m&M0R@6J3p(`c{k$ zEvxKH#UWM~-hPz*_tWon*`feK;ds|&cjZ8ww&Abp)?7ft-|>yGQv zfKRbhdVO~Lh*UY6$-DN$S&pGFcN$*m-X2epjgT{aK^?TlMWo3p4E$rmk8_TLj~@K( z$#nc#-k#vDsjblSG+Y>`Jbkx_ymA8?qXAAIFX%F!uR##_gzVJ;r!alOAkEdGj;90& ztnf13>mtC;*D`=M3)hqiuYlg*7z9Sn?=@p}W9{U-d5z=M-vYAc| z|LaH(ii&C4%V~`1ZXx9l5AU1Gm81_BE6pN`Pd2Zh`LFK3y^<5H)4B?Hg6hn-lkG7s z&wW-y(MkrJaHKz>2G2*65J171OdyivhTjmsLpL> z93R}8GTj-SbDWdZhUebdsdqg(S3eW3-j%B40a-GYC!s$kaU1n0qWY<%5=OWJTo z{x|`(d}Bwm3*gC7`1WNaFP)%+%V(uIuk`yD3K%cP=iNROxseHOEnrESdh*Lhyv^*G zo?-lKL{M6l^F->j&=!@#LJ^-1$-xs<6VT}O28vef=ZkQfty{ABalDT@do%LB(nSc> zyyZFjkK5obeCqYKI`Jn6gJ;bl3*HQ1(Z1J3F2Hx(=>b}FX5J#Ps;}fu38a#PD`6a^ z;@dn2Kv*XZ`qUB)jJFAm*P=ev6KN86pwTIJz5vsFbk0zvK1nGh)emqr^#oF#hhHha zi|G#%D7o0%F|}~fSOX9!@%gdhq8a66CDYNS=?B})mSZek<=VQAh1yoRe2Nybqvryz z^ESRmHPbi1)<4A^&R*E?@ibmmbZCxN`x#)X>Y>0NyT5bi=&(2n#n6~_iq;5W`<`jC zi!%an(zzFcd2ogg;!dUxU5qj0FPOg+IwlMoUJB{$HEeNnDF?I+?CFb7cE4||G?)Btwooh{dS_db{e&mpWby@G-L`Q>J;0`g228Iqg!DQ-fBH=}VYpNL$%GF_F8SL~qR%>7UuJq7%qm#F ze0csfTK;)UC-fb}8O}MjHn&Y0!jLt37oX~H(jG4olIXO=F9#&)N>cx@?DI|YtZkG( z6UXD5*YUQ}qO}e6P$TKaC8ApO3-)p%Aa_}**spu?uB?vM-;1H(r3%F&&Q#*p%f|dy z1=^|51iR^BqK5%(2&|LR5iih5(D+53@6qiG4hQjqAWDPzC{!{=El5~7lUFq)W<#bC#cBdO%q3=i5$32~=$bK^^pPN`eGHF)ady@%v2 zfqOw7Zy685m~kh+gv{EDJ31W2LTU{bM|`-;-5Z2(Zty99H}&C5y*i28qvkJ+wT>o? zA{d`Pcx}UBUmR6XCEet?9S;k@NzrGQPhJ=ql*V0kLmzV@&`r~yi;-j5Os&_(3E0;y z))4c4PQ-t$77^q`lpWd}*U>x}bAZO6u%^y-$}W}MiuHDS!2+lT9w;x}+*v=P)yG*Q z+<({92rylkC+GC4OWAZ&n&<1U7tqx<5a_)!bPW6Ip|(dR(*eO_#6F6NsNf_scP3HK zLhn|vf}KEqJSCJXA{!(5c|5uJF(-Z=i25Uyf+nWw*pmBsP*-KoRZ3$rCeWvi>LF@P z77dNC@U*||r%Q!HZvG!OSr5}j+(fV)FY8T*;x@M9%U6_XX3`HuM#9emAsq# z;~|~=l+5-h6M@)YwlFRy>1<`t@#Ux~y+&=@BZP=Y5|OWBmkyE~Xlo?*MI`j&VzTu4 z;!TgY;j*7soM=}-`Ga9Q*v}k_|Oh2Tqh4@P(J+G(&lPCj&%zBVM?a>O4K>`J`q8I zs=CD)40vXw_`XTKu5btMd+r{gEud^IAtjgjN%gc|S(I$g7PiAQ1joaQ5zWRhMd~e+ ztGMH>7S~T`E&iF0<%DODe7c;veJ#dlRE!xBhSd8T&wGH%w{&nv_^gm8J??Hr@puTKaCo0OV6UX-(M zLIt@Uuw6)NM?DT1x##dy6qLv`4MCF^W$T|h)p zKpiF!nT_KmG1R|7{-Q>U@IFy~9Z6K+mkGjG2@^yaP>f_j_U00|;P=cILArIe6heEr zE~{<$&2$2_*t}g`uP?I1{E=4Qf<6W%{5Z>aC6Zv1bAaE|fEPJiv~F1N2JD%o7rl*D zJMDrWSRp4(-n2^Awayfd!V;BEFH_iDCvQI;E@70tsxMoOqkG*x`{>!k2xW9q-vnR@ z$@8urqrBWB2TWt+Gs~Y(MMd09NPoV_QKoZ%c~U8!Z0?s)+%SlQd{>pRuCg1La~C>N z8=#?%?8G>lSaMeGsM7NoInVK4d2w0uftLz9+5}KwO`C_@q(~`GG0)+zuTKXk7>z$x z%^82rO6Q`>igM{{(Tb#cJlkfB|37Gt#b*8 z@L1w;Z$=Y(+!sJ5*5&bl1!SYwflQtgQBxXL#dEmn*WtQf15H>D@{l#WL1Y_z)4~bRv z$Zs98y?q^f4IM<9W);C@SkK@&rl4V4G|D=wtDxvPgcBlN$%PTZm#LlYLH3eyjD}3- zpd*Z%skkCjPB5|D#{?WSGF=Y5yB};V3Ktes>`=Kc9p41n2hpdGVWS?rucvNi#%LD_ z0e6fpoJ5!z9dkC2Qr~`b+}?&l{Ger=oac+O42jD++95%Xq(x2-9~-1ExWwH(-?8fT zJbS@Nm5*5?9zreMW`5Q?(JT=$n`!Qng4;gKS{kw>)`{TO0Z~n+l4A=)gcvMk6wARm zdZ_9urqM%0hH^Vu60yTy%$NOjp1_BHY{+cxQk-DhlQ-g@-*Qy>e_vrQlfYj*4SJBK zuxSSkMy(+fGej(R$YRYFirpB0a%i z6BrlY*_tMP0Im|BIcv*@)3#xh=h@^%L}8e@Qa`3oc&@BOq@ng0wMY33SDv@&KkD%0 zy?G%W1bSZ|)Ea#ObvJHPep7S(*lic(t~@MdG;;FpQ-tUC`0biMp3-}4JQox)@IzG@ z&(?6@OoZ@S7t}^-)y*^sTG$0ch5AJji5mLdvsNohj@1PConNSBY_M6S0UYt>r z9s%v{rRmwtew4xrjo9TiCuh3FRhr(Io>jI&?~K#Y{^9wfl%#lTO0Tc!UspL=Sl>d0!~NlrxcDcUI*oi-ITAY9vYY$R%U*brT|R(&BUE z0Pa2iWh*^(@8{tZZCP0Ta-_KoRql!Desf~Q04;w<+A0^&CqORJrfx|B3RdWK{$Ahr zeauEY?bWfbn4#yfOA`RDKXv?$Rhn{p<6r$;05OY($|S z6|#V|)vF8-42H43r+7ZKU9B83h7g@}Xuh02pX6YDa8U|GwzRJKr}ZmE(}eWF9_Xa1 ze~T*SS>t1Q5})EH?(Y_1U2Wo;BQ<%ma-quhU55$oi3G>Re`*JN*8}*8Ir_DwU?KqU`P1 z^dyKoHAtj#3HbIPc;Cx&hxLingRRW>wQQeuv2D$#!JFMz&+$Viy7lS6d1Ii1^*swW zR>HBi#-=Qfm+WNc%iQzD*DWUp%GC#J+DzFdcp-5=*BmaCh@_7bU4|YN7&kK9GI02q z;B^ml9Y3pglh%@wL?tQK4V2g!)#Yntor#CQJmEM@y3ZnN>SrJxf#Y4PALQR-T57!K zx<-gRh4#NN>1x};wzq-Sr5HiM38}|rKcJlqKGH0bgd&+w)_}Kf*xM|S=)Ljpt^`vm z*bK1@^5T2*GW(?tMp(o$_qmTkSW@r7dHeSaiZGpWB0~EdKU+V4;9MnG-zFwT2(`NX0Z;3`n`cf zw#vRX?8M0iQF*V{NBrO3e0!;c*8X7i?v{Bj;8keSFh-QQT;fC$>bt;zy~Im@&GjP@ zC&ISgjv*bc88tqH-?|SsyB#YUdmBDB@Sa>L;bBP8XvRILwZw=CKW2w6?Sl;iF&v(D zi}#lg`bgm?7cTd?wA5Wl6)eyX_?ED@Ab8JR1e|Coy-zeW^itHb^*s7eMwwqlrwd;3 zdKSkmXj#MO@EB5_*ekPmt0wi$rI4)M?^YnRSgY+`(vXQ^#p*%rz6S0A>WY1K4Alcl zr5B4uzhS5syBT`-R+>~LmDG)36*EfXw_!v*x8moydP6$=x}9n{CH{a>zIaRX3#Hsj zE0rD*EO^z#8M}A%bI=Eoo22M`8gQpS4I+xiZ!U}?_rS8CdQ7A+ z5Qd*&?2FrPRXQ>%7Nx;7t>x$nOR{MT0 zEm;M3?D(Eg?G$33v=CnrSga%q#;5Jd9)U~bn@AFdGin4p!?w-YYq^4~` zsqO0w_URrxT48xJ|FezNXDSz^iv35*+FO)-SSyQ&2;R&Hc2Q-Q107A?+7e`YGQv#R z@!C)Yi6Cp6y^d3H$8l0`perQtkVlo}hAjpyi#ovLg>T>a+a#%j&^@GYIXFdA)sFCvp)FC!hXibzF+-Zq9H#BwW zn-col$vXNUm%T)RrN?sC(2kKE;KfuykJ6#|4@icXa81j@uA??=hCz*%3+n zz83w)yz<+&-l_61=jF61xnHy8qjwkF| zvy-ty9>yrwDs*jG)$+K++=KHlLK-W|mg+-p*!kyp=UfylqSbP3Zw* z4@5kL?i|>exf;`X+S%H>2ziRq|LIrgZu^gHc6z!$C9XE2^b&vUkWO1kmF{jzT{Ajf zHjbAj9DE#fe4K2Y+&ujJ{H%0b9Go2N99-<2TrWBKg}AwdI5_D3TIlbl7NDaOaW*v< zQkRzfYj=0wMCmPET^)tk**!cw*gUw|9GorKIRym;|8T>__3}>f(#6Z()!6f;y$i#? zoc!%a+RVko*~-z?%E6xQ55LCm9o$?+>FNL2(Z83!%4O&H?;Y8@{Kf8$BD<%tBReM> z2m8N0-x-SBF%gn-HZyj0aMo~euoe4P$z`pa%{&~OZCvQ2-tf|K-dVA6vhmYtS=pO9 zc({nL|5vMj4&xt(X41y4W@2}k?f`MUL2K{4e?cGlHfj{|4yj=4|_CJ(-%Yo7tM#nc2I# z+(G30&k#*bgv=eB?TlT;tn7>}%-9|6EkxM=$^37R?_WoK7bkZi%Kq;d{rk}WUAO;N zHvZxMf5rX3oc`X)FTwqd>o=}nBJfM%-_i9O*Dn$HCGqd*`i<+C2>g=xcXa*6^-BbP zN&Gvye&hNj0>32w9bLb1{Stv+690~_-?)B>z%Pk^N7rv$zeM1d#J{8KH?ChI@Jr&~ z(e)eGFA?}9@$cyRjq8^P{F3;0bp6KlO9XyN{5!gSz4@plK8)kt_T10 z`Y^M<>+0cg*QX;X15NsFa+jo6(h?eXBY-ce*w2YS1fDRj5h+~seXZYv*seA={G7ZTHD z8}-@h{6H47OC^AEc;>^+4yNCH0bW5nJX=WqPpr8cQzQn)NJ&V8#@3YGVQ}z9} zt(iPyDk0MGb5u5!Z@l6#YlrnA+D1#8!0+#oS%JkpO)^zzcY{Et=7n!-iYMQ1I{hh5 zE3W@mGqr4QZm9Mf8^F&E?lTAQD}P&7Xcp{Ex?+GCchBry#>hxH(}SwI6(3ESuRDH( zD8{v4zqWzI2ei7q+vA8aFvK%N&S6wmCU_h@AXjCr(U1bBk4L(6ymdPZqn}-(K;A=B zJL&pqw95fP+;u=;1rdh1mkV*OQSSa(iA}ar)#BN3vK?QxC5u~3x;|zX8=APjzmLby z*B7v(optAW2h1FO!mu=byD`CO3WhGNz@`N;$4%&yVJ-_R-ObzOQUcdz6xHxcq(B-Z&#|C}yeq<;z zT8M_!G^DO;I-(SLtDsa-JRl|ih{}ZZvtKJvfa{;sWces?yqf1;V{ilwULh$J8!bfvf=P|KN)b!PNl z3@B=NE;c<%&yNRWKC=eu4ug+L@9iX!F`-WPvfHKoX%1I z*fP9_%SE&yEIol6!a?*cR?57#jPfOSzS}@;HJQY;~qu_=Vm88E2G){0mSHH)Bn}mNy z&K*;d&5L5=2a@LV9YL_hT|8uFE-o#)-cWY{!)SaWeNjsDP~31sBNch?QU-GWGx&|5x3*Q`0>&t9$jV?pfVaQ_rlhZ}O5K-s8WAfr0t(RqBh<>(TG8^bX-Q z?-eo_c|E*w68)<3?sfBiXB_%^jbtyS=>!9Vn(sD4zMoaKRDo^PgOq zpVIay6iSby7PQC^Hh5xhfwDH%C*z!ED}3sGu1u>^_lpI%A~;+QVpn#j3%uV@`>mtgqQ@$P!%NOI~^B z%3}$5`z4(lP!BBYG@4&;8Q7oi94~|zZHK&6k7QS6f2d8Hd^|PlEi*mYP38x*0R2eX zp=c{JkKFT*-2S&{w=iiWz%*h|=kYFx2b%P4eruom+_AudNXf07@T z7#>cX-wWQV^DxS=69%Q0?0wsbYMW>SZHc!$`6qn!Lha zKz}X*8mq=^;FDZfoB>+}G)viJu%}+7&Js zfeqz;6Q}hH#L4vzQu_8%+Qu;nX&~6uO}`cxQ<#<}?c?5}$|{?>3Cl!{Bma7xR!(rd z>oHdSGDlinIBn(>_fAjn=PLFE{M)KYVubWeUhA_GfXv;`n3##VjG)9h;>CvW z0}#b>(ytrToa;E}fX!?8LF$H(jvVX{{yVh}Y;!*YBC$3(U`o@4KVPaiuq8)NO9W1v zRW&SQc~+06bTvw+r49U=#O1&bkT9AsN5N;L=HQpcN<*JhRw4B{d|y}oC5*pm3sz*zrpy1yc^C_FL%;L!s2MimrP$ncYqD~X1OmMp2W50mI ztL&@v?5nO)@mvLhV{BOc%%P%wg!BP1G>s7=94%(X#w>v-!Lj`xYj8!eWgfnjg+-!~ z1WaKqe0w7n$Bic3?~5o8{e#hI{W)|4aVn zPVkhoJHE|P9$u0->nDE+k~`GR_5CGPxc-6AoP!6#zP#- zAKH{WAHJ677gNxu4=7_k;KtZ`tE}gdTUtfm=u5c!8wH5&C%L87bJJ`H5I_oWQ2!7Os{B8OAqYB2@r=qT=Sm5KQN>(;=9 zR-dlFDje4)d2^cLO|{C5XAfr!`I#`uFxoOulN(1(eAZ!N+tt{|ravKl8uJi{4+ zATk+T?w2h{_ZFphjFEM886qq%UTEDHkxrI)6F6f|+9|28d?_7@grhV96$B`9rWcPB zGlR_~tV)s;->7PAu1MEuzR6q}k~BbDe*M^EsY^p)4A(Z=D_?DtH)buv<#<3rjq#(U z7OAplK%Qh{oA`ZgiQbpSFlNWrW{sLMhF;qY$L7+D)+>y!C@MJ($RDC1N$JN}HO`WG zR2#km5?5qMvWFa{220;sM}J0S`!E>F_%^yZ@k-oygh$|H-j~s^zu9jzIjtn_vyp@Z zA=9cRCPn-QWYT8`Xs>`0U+xdGRt|JnL@fjj{AAh89MAd{|B?(BcpF|!j2ZhSC$Tfe z=-lNr58!IlNJ9$sMN6tSmdj!^2x; zkfcR_CzO)auY1Pu{*!4b|Mr`#bteJPCnv)y^Ke!&)Sgz3&j**VRn`f&KOgl_B_qRB zB}_o~xbX-v*4|>$_Ywl{jZ3EBNZ_o8FPwRPp^DAyD@S=pmz)m~;{k5^Lmt1fgAW4U zk$L%?xjgyAEj3*)=1G47s)cN}QsbCrutJSb~fp0_kIbrDEYM9 zF!Q7Mnsu0uR$<~nxDif-cJE{2mX`WML*1D4w+>Xd_QTmPdPCp~)^CMYv z!$+^IrQaK0ei|~AN)r-`*GkY5jZbZh$EJZ1j-qsaMmcTMslw~_k|7fs4{aI7MoQ|Yd1szhXwtX^YX6iL<4t=_(j)^7vk zYl2SYum;7y9e#t+24_?Zj`)u@YKJjPshCGNZLo`b~;Xi-Emw{#mznz$Xs?IIVSm#* z&gj!3;8Z{A^Mu;bdfZr4JbozG?X@IgqFgF)(9bB!7SyU>5UchdZtKO}+v=NA;3EqU z+MAXx{l?dq*)(i6C@O<{eZ{Z9o=URyCM}ffYpv06Tf*or^7|c^ojfKB39U)|q!#=X ztEv2t0Tr^cl4`l3yR`7MJ{bU~c){e&VoYz*4ieSeJtAK{DGEVfcd7k>#Gk)yxH63m zSiWI|wwRJfO*~ress+Jcz3@g{kn^%Z=cvv_apEketBUfvI!}RLeO6jvp*!4JB?^F{_MAkb`+w+E;Qsb z`&437cu0uMv--GWhW=xj^$oD-_YzZL^m`*I_BY67-$U)|u!~{~^r`)M4N-~mf5)zW zla0(Va9tu53MH)>%=7a8!i9i?d|v_~c8%e8o3{0SYb#u1UqZ?qR{jn}3Zdwx$4}vN z=JkxA4wWu~RC0-7GOdbRw(#*Czq3>)=#Hpn4=%lm0JNnM^6*1{bRnOq|30JWjCP(f zzy&ESpjfgp2jF`H7mlvrYHM_^+!Q9ezE5F|%kosOFJjYwOxJ>F2m3J1)%t+$Ep)J1 zs?lv02DwdlR)7Xuf1x=*`2^0jB_fB8i%>^$8@4zu z`naTzhfYjW*irp!UnuHC>QImPYD7G&cpV;Pb$lr+Ft(OL<3;NT@5UK;v$Id*t{)e( z9CHa+C!^>lS9`bH^M4h8{YuBYk$? z;IhCXguOcB5=X@cE28)zN&JsE6cVCdJK%lfyX52i@zTKs*Bjib)#$hfQ>qTlFgtiE zKX|(EbucXW{dKY11A=R0BYf_Atm5k6!0^n=(@DFFn_Z%E+Gi+X<4Dr z3|FXpjwvG`(BZa6LvSD3Vz;SM$+YBR&`y@^iIg?uar8!Fre3mo9?)n^1hJz^hygj6 zCkGFEC}d0$WGL^hh!z^Vq&F9>m*th6B%L@=+-59oml<%Ce)DE6yqlWISmo(Ila%!misn9 zNttaCd}wnT$@~H_sjg&8OH;Qi^e`|f2F4r7qKTWR7f4U+b93 z**^hP01QFXt_&drO0GbeN}aezxkGM_F=yku>>%_Ff;2q}#z?;n(D()6brBbv{Om6A zuA`ULDwuLE@xC>)_0X4_D}#^flqWZAUSrmxd!64?j($3vk8FjH+CEgPZNWCr^?pfj zjmlh52eWJH5e$mJNn6#L05>DS4@PclUv;+MUFkIlIP?G!LUa!m1d<4-$9*_kO*trz z(ssvR+RiPbv~>B*NXp)OW44$0&FzWGu)lfW1r}RO;d$+heZ;wRl2CVElXDJE1;d@W z3PlQykqKBo#6KHI@epCKvq*fikdalJN@Xe+#*Z5>9+yoRqsk03%ktK$oaaoGgB@Sn$XE^Op!h*k zAD%-WT!GtSc;Fn|Kp(8fD>j&W^q(@6;JH^Bo|v6uFeEkqo?Yh>XUKpqx`L-=>mWRD zns@0pkLRwUb7bDX+6d2K$6YGJ^)x{NXRvd0#9=&XS3C8OWAUq>WOR?S$z$;Y1o*dW zR!ZqyD;Am!_ro*U7n}8}uj3ar4cx4FuWjc*;kESR6+B+7X2(`Ni?gGxvkrGg<87sX zSs0#^O)jR+ey#?Zh+)01_)9<^>>G}vJJzO6BnCJeZ4J+(e>Luj*3p^s+V)oQ#%T1v zXbw)qaK383-k9FiH~d8BRa20^(sNJuA0uBrEjFilG+Mi!b!mpWprD0i@@khwW{StS zV)|%d^D{RvqFLu_)^4o7tJr7gZ>YJI+k@A}M_!lDC{JQp%FLNiahS_(uDdi^TxK%U zIW-m-X%kPMNboeUS>9aY@&X)&^eHCZl}kShe2uv>UnjAQLYxw8&eGMnZ)iU27px@= z>)2QdxeoVlS08ZIuI2wR(C?`so)?d;HhJ(nSFxSNteg*@lM*5oBVoe$o9^u~ZUnZ$ zfsl@ks6st{urFt;k&TLjbN{4O_vEoYYph4()g@Nbu z$7#5@K1X&JV6G#QBQPM3Uyy=vwZHT2t*?d^9KO(txB@E`no-<6mS@Z?%FGi?nW#A( z@oAS^T@pHB_RKR*y`oxuX<(8y6|U%s_6Pow^Y%Y9Q%N^o4uNKgku85D=@1<9;GbaF zs4BjIg`;Re*_uLAT4^yWa6$zBF;HpA^8tHLs*8cx{P8wR%o{O<1H?0uZdHyg@|#|{aBs;zZpY8h_|aLCoA6|}csm|gi?Juq zu0vvdangdNu@!B>8d$)|XS-h^xL}`xV~RBQMpa9xtgNzZy-4zQma_sJ?r^j5JRCr5 zBU6Qfw*3Gl5rH@{hR{)l0p|F#v^$g7GZ!f$=812ul8y4J2T>hzd-&UD_$@;0+2f0w z+vbIvTXge)U%?`4GF1264^mpSiC{={u*~9b4=2ioG97|AK3FvT7d zIU;Tv`4D%#@Q2-WOL9b^1jl$kxe7|J8sfTb-CV=!c)L0uQ*awvP##`DpH!jIVt9yE zbAwKmn?{WNJTAv(EMFRQ(ae=&{X!*h;9rdD8PIyz??3>g ze-M0K0=V+@%(O4XXb#~lHl`}W@`gs*_GEI3?mI2XP9Z`N)B&tRm#eJfUy~GDtPymH za>RDO3YWs&#YV!p-y3xDF2i}@4J3zOM%AIqtLonI4(%dG3FZCl5El>x=s~~LJIu0E zg6GAem!d-T8Gh3~t61HcpS04dX2w;v^*!)J9Zp-1RU3Nij3RfXjnd?~zMxd~x}`@` z&_cVcshGk<^vmCrS=*8nl@zES0#qbofzLOzzE-~M&(uN@wJKdx zFOJu9f*B?PNh}fV*VOTwQzjPnx6OOEdul>z0{9`o)jYyDmk=mUdWt7SrEJ%5Dy&qx}p zZZw6(&5~zC@KMFRxpdYGr6@P>(#0J=gf_bv9`KD>^mx>27}y`Yvtt?uW-gsS;+c*G zwY91~HwT{^gKwm?Vtt`5RRdJ|cp(_Id7g11bD^bs!Jh#?tK=3}VvTXW`I>#h4ngnK z*@RL9w{rFF>#s)Ji0^r`t6k-sk}Js{sT(RXLZ;6~~I#NDGjB~rSS#X6@^FtF&=v&ZB@Z7=Lo{o>w3`lDiY)wul zfBwjp+fa5~`jD5E0KZdSI?3@^as2&UXc*rLiHG^8D)s_?;^QAtipF+805w#{=y>SO z@mXBVLguMv^}Jjwluyb)*4>h$(^X29C_9#G`1nZxxx3RvD~H1LB)5_%VQ@e|6_H&uM%bxn$AND&;_Px)`M#rcL?0x;(f(l<<%|X}ow;{i|%X>2}1n7}n z4kN|sky)Q;xvsq-KG?HIJ(eyxv1*RvzPAlcgIfA2Uyg*VsAqH-)nVL_cCMIHGMUT;uHO`rN2%Pk8PUb2p3Vc&9`8D6Hv zgG!^u7Df#lT2$e+|FpKa1i0U)lbea?S}BbOZXd{%RQd+WJ*CRw+i^Gz-E&$XdOcYg z^6W&eO2&G=E|&pJk;Q8(q}Vp`ObZ+h%d!VOu@b0hNV;86MCX$iogCHUo*0gZ9RkUe z@+1gCHshL6#%d?YZXfk$k#J`dShB6q0_FGu00N|{BD^`U$RikFcN zBmP_)N8R6{vRkZ_(KA&ChKV)9N8O!2BGY>0Wk$>;@fC?a);wgC5{V3*^>_X#TR4%^ zR09@jh9}??3_8LtBS8b35eKv#EZS4XeruO_@0~w8f1ZNjM$|V1+ zNzRP)%sR$CP^>X}gJmamph)N=qjOa~u+|rz+C#Lc-3Gc=9L}cky)fdf&u|f#;r|qV z)8Z~iCK#acS&UGSKv@Fwn{7y5ff1kB&_rHwy$DzSrREVrj6-@AqU7S@mLDcgATC4} z=;amAYEkMVkc!~{6&j>_H&z7gQDcsOK#0QihKbbp!X1_mKCeP7xfzusU}Zjp9#DGorS3iKbE(w9d>BM*QVJrnlgDe@NOW^SmNv zsWn(veT&I?s_g3zX7V{lJNRWA!RfQ){-4xGB%%RzVHT08br`9Y*ed!i*nWWaP8ylt z?8*2@*l5Fq&y0#wcfnlPsA`~(>SUb7OC(Q+#MBNPwpI1r)_P081#Pf&6v4&0 z8BId_8mpC#_d$C*m(TL?x9uL20efRa1)i=5%guE!Xo~FdLd(f9o|UINMCATmdS|P9 zB;u*iGhf#Tc-02IYEV%0<`ci$2Jv=-(LG^0s#UaZyzsJM_w?N|lhEj)7fvTp>&>aX zaJUQ4_cu#qN0M+)QCev!Bzn$=3lW${&|eD40qoVy2eHy;Zp<5S^%pmNE$Kbk!!xKQ zNE&&y5()U`t?mNF3WE6vI>RNU)mF`Xb|2Q#X3nx3E}OcEHCKM!qoyN!e-yNC96wBP zji{?wUCJxZ6nvWFZB8e4L+n=ZQbt2G6THg-_BGaxKZI2Ih;?m1SlUCc)6dQCu&{h2R*C&}E-!t#tmA|Zh~5#?F& zZp-%Mut?qJR+-H4uttK8ZXt&$wZ%xwz5xdRLLTBUmC~)9*R)}bZ zvv3oVe!py*k)p`JL!Ccy!Wi-+t&*b|yKMKJ# zO=Pq!tGfU~%;1Itt^jJlAkr%F$4mfb*P@}+-O}MhoCC{d zPhg=UNOXF{zcAlI(_A`jk8z$4Npx9F_~1^cgA^Jxz7AmPw`W(4|$BylVm2X6j`nR&p4%6S)S2D-`xcF47u9waL=%Y zGAf%|;I!Y7lYSP1{N9wqQmFltY%QYNem|QL+&Z0w<$v(WD3Lr?^SX?Q6B<=>2@M5B z|C<8(i3SYHvyE`0n*$~Qat@!^Uz~DXCI;1`{=Y$#AD{bItkSHYtoWQp-*?&BPux*R zmJMMhAwe*_Y6v8Xwm1Ri&Y+>8@9*$X$Rfy$Spyl8E^;(5@koRa3h1kH-UXA}4a60# zTb=myM!2u4Xc=+EdM1cjpwz~j;r$Ukbh2QHG8JNJXy@+`6gQ0&%o+j;5_c zM$9v%auMQ2-temRT_THdtX}Zy9Kbo@=Lqgegi=#{SK%4k=XN5WLtJJbFnX9sqkgm= zedBVw!1uF%Tj=Wwu3khFeU)?8tX@?7WghBtWZZmuLH?q7)KZ1-jtsRy4 zv|RKUe`q8WJjw+pkHOaR8gi)%7ur4;;7Uuhqy+A9bQ#r_+RhdK0hB z_r3{Ee=Ervi`x+{+{CRe=wfYD>Ik)dq>!6`sSm~4hhx*XER=|k#KUuFayFBTl;UFW zI~fF{T}vH?z7IZ``Vy#}HY8Z$6Zb!Yle?v|z6E%iyc#v3Tt~MKSx<>eB7o2CW!{Oz zR%S+SL-TgyzWdSx^0NOunzSyl`X8c6Esmhc(kKjMp1oOlE=`5h^IiMC6b%!VJMS1W zi;JNF?tEvvzC7V1I>rmKt|SzN5cngOFFr!EL;ERD(I;`2V*1`G*&Nd`LZKgP=J)jw z&3tNS1~Ng!s<{ufd?@=^HVp&r|Gxo~BWos(;>Wd4ee$_?i~|s7JMZ;sKt-X;SGffF z58H~#RQg2$^pODOCO96!P*GR7Z|_(29bVR|-2^VKBwn}$^}Z;oW{H?uoG`!7zlvfv zO3nR_LPAS-_}DH@@Ta6!k<&IwU&)?M=mun{VTEF4fne?%c}G4L8D%ln{gQSGB#3bCzsWW~(&5Z1$*DiN^KI3%Zv590g zviql`o4(u|xZdbkQd%4QMz_a1re)$o5|3j9x493dbE0U&ztJ>pRU*mOF|!ueC=YX- zqNMiN4nB*cCbDZ6s3;xkPUQ~QO@{B-<2CAsQ!DQ!Y^HZtTGr|pXSYlG`wy*AZA|N2 z6F|~+w`_0)8{T_$n>W{>^dnGRqZ*||V9Edv18K0+6zI!E4?ntXQDqY$Ga8JJoC}N@ z`-WnglP`T9i>ADmXG>gHjSER#T8>374Tb9_*@@K@5Kv@j0Q{nA8jEYuXAI_p~E ztb!|+MyB!otyo}QJx>q=m=9?b-RXc-_4TXR&=BQA?KHxr$eTDp;?-@68rCL_CWYJk zDzBC1^omvOoR&+5XqQmthyF;pBPDN;$5ED}E}KU3FWykk8~mqjN#i%fCkpdOs<#rl^Y%RO$x10 zmz((HkF6X0A~;lE?&BjWB5*hiZUK#sf21V^pP%YoGx!4N1zL6 zAE<(wh{B{@Mm?g9{vgd6{kWy;PWpIaYMiVQA`Zlli3-q&Qaj-XEvU=;VPpPMMYe00_;UQKf`Z^@V-jXEsBc$&i;k=!iiY;fh{5@2 z{3}-^{tGbDQn#REt`=jg3JR>X;(KK`o?M##LphgHkZg2bDQB~%9oH5i<=b>cLcH~V zcq%+q7wKemxm5av$@c#_w)jB&B=!F>TU@%S{h}Y*Z?^Qkgm2bbqk$XWSoNt&3T_@=d&UV_4d^@+_+hQ@iB{9e-6p$B>}%y^7~E>$mR5z;_X*i<_fe zLJJqRJ3DiecTd5_IOF$-;Gf;Qxt3>{GWv73*B=rV&?q}|oA$&`L#gzPRH>h;T`I5u z@g3h$ZfMgw#-oc4QlK0|mcBhtCS}>J)mhlk>TSTK2GgVR;AM6i4ts8e<{2S)!6{EI zc^n;38f8cKtG@YWdonLUYrw&HyIb!XcaRp(_;kq$xPHEwkeq@vtNyf(%Ec)>7{JH z9-5yWVhYg9Zae2{FWTTHmdR;|+8bZ@yRKgV)M861cuOrM`UH{QDRlIp&T?L^9{JH9 zFnWex_V^BgY90n_2KjMe@!uFmPRju*1^xN94lfUSn-ss{}n!W2Q z!E?y~r?8*X{lh1Vh9>^Pf$aacP>=t*;x8geAMG1X_!kcJ`2@!OubQkkMq_QI|6s># za{j+T;&^G6hx$K80>oV_OxGCGGx_bY4T*Zi49&)|>5a@L^H#rPC-sj<*o?pvSj;gz zaQ`^wm8mYb_DOi`N*d^C#560VjC3`l;ZV(}H)pbW(YR|E!BgkQ1F_jnQr+b1X)L=o zHH@t(Jdru56!?@*2`NnF2`t@*Xl?sDD^!@_%(vTAcsYO=By*XY?l#*Dzn>>oug;xB z|8l4%R+}u&4^ri5`E9PkJgQk5Eg=^Mn95VsjQB0x%{P!Mj@yE!o<5;m9-N~;cBVm~ zN~r5_qh){dq>f^|R?hQe;dCPp=da6`1wPv}VTf3kF0<70fh74tXHD!~Yyq&Es7vbb z5Ka5GDh^DcO*@(I>w$AT#_6!TKIV4!BO6B;(}JfcOxb6rvB@o;38aQP?hv4378|u` z)T>~AVL;dlyD&{U$ixeX+pc$GeM$U+Xl{ahhW-sLCFBL>zJ&@wBKwKJyEE!3#1jfS zkOxW0xLw+bw3E!G`30i^CzT_Ido^}^g4T>U;p>H9NBd^7rUZI%>Mm$XOG z=m(P6*zTN~Y-QC+IRn3CX^l1{h;}};tEp3ZI5Kdq(a4_jHJe{`RkmuUq% zg6UC|@z_p%FKboYmdRyIGSc?tD-8$tJ7u2Oqm->IG(jBv^icMKb=uR^n)90SrV;Y; zCB-$`7>Qx?P=2ag+T-D?%BQ6fSXZ@ZO1q~3f~=phO5Zbhsi7D zqqmEXlqXQ>*_>4#?F#Ei9iRJKBMU)8i&DeGf9RiQ5JNkx_Qz9xQKNd+o0rUa|I7ru zC7wSMqh7}5+UzA$?A{e}Gz6VUXr83M1J*WdJsnmC*5CVr((D_?isu*AUOq~<2;(>1 zSZ&c$yI#62_H_W8_jLfuDmrA-nB35rV^$k!%nwxUEA?8Y0q z^nx!74819A0+m&heNY`AMe{&31$O8PpqP1pijB^#>{sY*Y@RE{7EXlaAEDVaLHuW1 zX;rfwdS+H3d7~!|ZKpC^5}a$eDk}Cr#Y6!3lZ(~DZK*$i3;Z&7&>>Sy^ZiDezJ0!t zxLRWq$?^9vb0F1=IIX8j_GM1J`6#Vzm-=sE059Pf*f%?yt>QcQtxfPQkb8Lnz!DieiN-$Az z+&%IvRW*^IRiZ;BQVrVB90K27>E}6IlZZ^&g`!PEhtFFX)Rw1mmy()Qp4UUGRtxlW zDy<94kH(L`AAeorB#v~uTr&*3taj%vMJuhUQK)_%WMuHc{x-Qt=@J_(hMxUlzL8c5 z$$h{yP6yu5HWRl+-YLy~jX@2Ukgq2_;#$Ax&dWDg(~0cdcGkCIlV1}c7>}L54kRk8 z9#$X7={qUbGmhol`rS-6j7Dj#%*FkA@$Jubyr2CBeaz|)(BbT+;(4EP0rtv4pK-G? z-RYIxQYlDSIsN|T&2weIi%Xgy?zhz-Rh_hav?yLK?AqR|s%k9^e!p?7^3v~Ku6c`& zrFDbi?e6X+FF|GB=K|1F$U1X4TN-)Qvp?O|s(Ap?L&K-NIwFf1kDuru#rr!j9>$z8zf9RY9@wk&OsZ)fcXVJw(b_M9ST=7FSQew>9bB$C0xub z{INJ<)!)4cL&AcQVpaWPqcLHZ3E6Zk~?Oh76APb)#Wpq{39Ca8$KqG4a^p=Z>iGK zrO8jssMT+0Jgc6=p^9q(Eg^B@M7Vt^_(|)pV@^~sAm68}F_?jjR5R4IC`N%DGXF<|%QF)E-(etxjm&;$s6u-H-L&ekc zk-4HyxiDK;^5X(bMR6{mutfX-b@SPl3yLxF#{qQH(t^%zvxs|Kv-@*N-b(vVD#uk3XsD;+kwPd@>M=O@W^ zjAZY!YVK;oLVL+O?DK1Hl`HCSk{1nmMl&L`Tht)(b|yV#DG(|4@JC6|z|YAyKbJSn z4^zfJvfa>F+Qfda@J?#!Hd>)N=~i@Y;Q7_a-IU(2G?-xVG37>o!DQY0iP`#=oYroF zrW>&2zK#$r*=aZGwHQ$O-&($8XkKg57W@Pd(F=P{Qll zqqc9(HrqQljN}Z1zi<-7=$4J@*jfh?%rA72CC~;aP7CegESyi>L;O&W8Z@ShqKd5Z zmeXa^T^I1{%#ZzaeKu;+GpdfO_ss3ynPvR@Sg$jbS{#m=TZ6m8Y?{0Gdjk~X%J=qd zEoC6xyPvuzWw7f9%`IS5qN(#*pOCWVE-FHuy0gNQ0T5}Nar73QfCKQqhkiEy9{O$A zKZv$W_UgLFt@!}~VyP#$(VE*^V&|vzhs$~)_&7}L!4&-NJ+OKz$k4UtL1V4KITL-5 z#&qvBT8reu%WA)ofcgF6JgnZ?xow1>;2C;u(Lyu)J#HgW>;8hXhSN#>o24_PtcG>h zO9T1!)`!!D0=p1+rLtaFiZRql!T52znJMF!i(HvOy^L>A#MiH>jIc5B5EaKxFIb%7 zpd#wI)lU%FLRTrdF8oZ+v>D;${%sMTBQnknA$i>>-H}-jtBbjOS7=?-;D@`RErfQr z1)Yt61A|r<`N2Bve3#QXVw=;G$;R>F)te^%cZEyoo;*Cq)o5UfjslkfK;S9z4;}&D zptH;j*Ml^J^NpYJ%X(uJ+%3rCX9t0A=J@$cKM+6Z3!4&?3_1I)5q8LS6>_ZQiodbm zs!%{8PX96Sc`&%bUTPn|9zhDplaRO*5uN0`9Z~P)5XR1F&1`B<=B*az9i5X-?f?R( zkf&6sEn9y$}OqHbZsP6A&8K097xKwslEb>&A;f3SQ! z8C$==gbCO{|I-^>j$e%4=3kAZE|-=v25Ds^McijgNX;A@qT|$<@&1ynwSg~qWZDuY zYxME#kmjcZ;C=BpK~!}5u{qk*RKpG24^$MPvfuAtU&yd|E*Bge<{C4 zv8E|Trwf04d(RPeb*}xHgg4|Is_^EIM(qh31{lF}ttnReON7k{(|ayGAt8B&k(y6Q zgWH#kyJV8f0W;5#z!t*xv(}HdP;a60H_(8`^A&Dz`ePB4H}vVh&zNoIm>bU<>Z2fo zq(|A1ebS@OSW$QbU>`c|d>7BLpvhzBE_$x%s$U+n*MaK6VA+SxQRvn6VC5JT>hkog zP*_*>SP6-O-orrQy%Aov*A4!qX4j1Of(8e;A%zsAR|Ua$8SX#H3D`-aDgs7zhSurp@Qm5olhUx^3nm&_hn zEyf@K!M)}tU>5jvFZ=+y%?5jsLY%-P^;*QDP@}x3BA}fLR0rCw2%hfb{{31>;#L8= zRtz~@Czu6*z5Z3<<~-`CvrZH0zHVbh0QP$RTdRD|stFPk_WA(IAKA9+Yio~bCc(6W zXpn92Nla$?IsEh8<4yJ+(5V~xSNl%j*S3K(mLBiGF;TBd{~`J}xBI)oUp7IfOu^ee zjpa5s=cj)Q8?`Dop8!;^#y0MaM9ztcLKs+yDgcbEe&l?K6x~w7-cMg zuF2fJ)S~Z6Kru;2PiIZR@z1u}%Lf1w1KS$_Y|lzs`Mf=t1n2eY98`o?nfb4gKiTNC zf>wI5*m`C?t!(2Eb;17odDayT{1ry4;P#BN4+HbQ{(ntQ^_G9H^gl0oot&9bamzd? z63SBeU&&}cN9D(UikDE5vW-o5yFNpf8rG~NT6Sm8nmr21e}|C^6Z`b&gd1$|pS%0l z4j>e=d_EXM0wrptR*m*b-dudV*zC3Itkmy>{Jvl6FaxXe{zmD2_J0kjzq?3+G`BWH z&)QJ~DVHL(ZVqz^9wT`E|SX4)Dv>?g;QH_YSAN@`{#@d3+alKTaO3 zQ?Uf9Ub1^kaLv@V(9)l+HULSFXF{0y9)XaT$9b+-k7R8Ai4x1pW(e3H1PZ@>L_rmg2JTpLJg@5+?wyPuMs^Gbw>}$H{)i4f2AS z1}Vjf>)UO#1HlMpHL_t@aow+;9lbbW%#2x@qSC6ia&POaS<-3keTC zYh-tgucus5Grqv=ObSG|@nPYfUOGrI@l%x#W4-M;7_A~f;>phTtLMpr61S6g*XwcEEn zyw?`taC`S}`=WRF@)ben95SAkM>!jxuB$*;}B37Ha72AJhM5pSz>$Kb+c@sXo#9IGE4? zhyk$fyVn!jPFzR-zgT+hJ#A*Qu&VY@@J@usM`)nW4F@-|4i{+WFQB*vHZ0sKJx}ZPyLRW^;Zg!@oTW`jp>y zV9q5RIDQVf-t&1}*!RBwr>s21@a#CYH3@N!$!8;QZH$!Q>NKXX*NO z$~B}53Omn>s(=%xsg155Cf7a8gAN3Gr&6|>`>yW@aRUL;hAu;%SE21GGnrfa5;OMsW8ZL5N) zC-WCOeP?QRQ0#FK&rAw_OF9tB?2Po2!9~l4sI7J#EvXKbr<&h!vs@K~Hy;JQVRGM5 z>&Ze9*KBJX;Z)9ln+%!=S{zxo8HN)h^VG6{X@Wxg;N_|sh(}FXu7i(@EnQBATn~TG z9A-77vU=k1{9AP>$nxmFN31r_#HX<*pXXHkM&H+?@(=vz-+a||z+^P+F;f>{Eg}t= z5<=fxwEOLu(JjpHc(6Hb$#)#EzFWKg>lC4UiVaV>{kWWQ%I6`F4OnkDlkGW>p&T0z zZBEROWk;_s{;R?+{_Buy{=2B^giTy#^T6B$*5Z0r_2}-oJ(3(6@chYp6L(To<~m_) zBF%VQ=Jrntmm4Tg-pcn0TE@2^o`B*Cnq;V3ugTY+IWAkh>yWSMZ`xhID%9A4OS0^p zpyt2#jI?F|<;bN9UHgRhX<&~nOt2QOfQK&LwN@@if0X2QJW8F|Nru#~s(ObTON8&(ig2 zbkBvsXZ=v$+cHeCc^krjL`PhQYd=_;=T;xGuXc$N2?i|K9zcl0PPX2*+v^k;V1T2_W^OJ(|YNlI-Jv%EJqo->W>z*1$*so1qLcpy$ zuJzJ$SbOr@!=o13c8Sd7L{7P_bR+q#>`t;t-Abe``q}5=jU|uEtdun0NxJ82D}u1(Ijv4H3MV3)LK{9Ia6bG_^tMnk=Yk2KVV7V47o~!aoF&gP{s!7zZWchHMj}n-Jb@;rMbvqzYL-(A@ zB+PYaa$<|?FElI9rO0=b&FaNg94l=La?kBFzaA0<76{bvEOeO!CFia)wR@hfDqU(- z8$&&QhHmbebT9^`1SE9cXFnzao;|X9FdV4RQ?_>5ahbLz{rAKV9#v5n2A0gJqz)YM z3N-A=M5lSDJc zQF}Zm8;F;nAly=B95&xSkb`#Ey^)7NFh(_wj&>am6jVf0k)WKMzE7{|NghW2ceMdP z-CZ5-!XSmf;4LY{Z`hVsX(f)$4WbXLyMOxyBOHvypm+b4>HOzwq2Sx|-E|0mcL?%Y z8eS`ILvV>yQ=LUNg0et5S3P)Q)0paOi!0qb->jb*(Bt*n0<-t$l{*Ax&$`S@$Exj) zJA>rh9bpxLhes^CPU}8xjc!5AdE@~Peq(9^Y_5`#g#aK15wyoQgT6W2Ms)edw3iDI zD@%1T?+YtqKpf|Boo#eB73S)6(5rxh?+)w&I%-Upfv6FD;wt zb9Svvh_G=XyDUNo*+HTUS|-W|uTSOvjE5(hn0m>oJS(`6Xbe%2D^a5x{BeJXI>>ij#^lri-yyZWHU!4PC+@gH zR?#U3VkaJ}=oj7W4S>KYvFv@tzrQ9N=!W6fV8FR1YWL}ccs1*`@R5#%Zpc(2uFnsdP92d85^fO&fxBz!sFrZKImP?z}9uc^QwV&lxJH=}_~-?i>p9 z2xd?U;KqKCtD4EUh?(TRV}1bhPmK=#hHt!IITJoa(_zQ#0KDA(W;z()uwriY&*1Lw zx!dO7SF)7F#Jvsu7pxbfn1SQ>v{?;*jZ5*H0G_tzb{Om^a~?I)@LP`8{Akw)#zoiL z*{fHD9~N0ojBeR?pU7gzRfkv5z~A_gigaKOk4e$9iVfAv(7}KQ>J_G%IidgA;7OgC z*y2Qc@=H8Es! zN8_rvyR;3B(o+7U$isyZFk*{aAWlbrk~pCL(BLlPKUy!eHfe)D%KgDcnA5L16P9MD zW|x~R3xA8LHvgZp`FNl^?)F=R&vU1*2E4yDsJ)h%FfitYG|@0uX5)X=yoiUe&qjVh zB)|t-ER{We^Bk*pSGmZi!qvLa%l!;N^_sge5bWuR zLstRfOVCNq<+#F6VbK2N8{maR4A{Qm-0ytUdVIzQ>Nhrg*&1oU_y)0K2=mB{Je8?u|l(tzpt56;gJJlEZohNyC@$U^Tnez6oY>X~o3Y`p@!GH$08qQ^F3L2sea_6p?0)%Bj&l#{;CYNFs z$H=xNtgx8@+G6bF2+nx<8|$=YhOPMrG{Zvc|BLpTBQ`9VPcCM&&^vhlh9}2C6jQO{ ziVXv8R!kP!wSSy24wktR)D9S|3|0}xINkkMPY|_$tLk}dpny~U3RG@KCJ%y@O`1## z(Jq|W?Vt~zjJ^foK1Ipx`s^A8R9RP!R#w-{SO+rxxA45$TQLO~O7yA~r;kBdSa2a* zc*Y$_=J7eH2=oj@nZ~Z-+N#@5CV_bTT8O8&tC>1Hv^m5wbGa z4VMKn+RHWAFyy@*hrhYi;bjJ|>M=UH8GK7q`)9hUmF&FYvWaK=3$aY!D3+ZkL}1&% zPeO50&)xzu3g4Ly?hqDcC3ng8G!-|HOmsO|=L#B}E^sf%?e?`<*~Rml+BZQ~-uc%Y zlBt!$o5t^YlGn|!_e+KCq_22kuIn>h_)Bhn676Qy4KvUzObulHGZ29tKG_D`fptFY zcgo(jeq6M;m>j|~A&c32d~HyG%{||?No@$K=2n4T8W2>-V&>;(40_Lktft?4b@Cfm&LZsvVqpFGn!axYD;dGMLG+x0~#?P*A5 zHyPM%FEC4({%raysf)%o@m|HYuffnH#>~9Kp;5b?d~LVYkV)aXgS`>qpM02Ev5%Mb z&vAX!d*JGbk=TPcsX>acxCf#lJ4G7!az1+9TJ#!w@GF2KG5>WZLA&*&{IS6 z74i6xaFJ`6k|XUa-~FZJEM0kJzED)(V_tJqbLO!m>p~?P5Ug==e&ah>VS|caHbsB+ z9R5-ug4=Fg(Cjvw#y?q*zabai^qpMNLZxu3?$;J+ z7y1L*1B}7F0*-ET`_6E|%D2CdriDO`dQ8-I3C?br{K~%-o`Bo&n3gZMgZQ>0-7dQr zSM-^zp;;DVAowISaujnTv^&cr?eLzX(C^jyq~Bd^OKyhL!`X-JWni!!w5mBnAEQ&W zP3Sd#wC0$yde9Dk`7y~P)MBj0dVjvUrR1!hr{LTC*=5_fpV=Z-{C^DcO~>~`dNat1 z6Z7Knn?#?~ZXTO5O|uFr_~d*99M?_3JOx&JA}y;kN((IPsjK{g<@%gCg_{ZObu@ldNPd31#0~^~qEKSOu*yGoP z<<5cWg_keQL3h{MD;9Nz#g?M z6^6bsMeANeL+hM?sD}Z+AnX<`SVuR)P~`xFUGm;)^WS%%Pomgjkb7b~;Vv!GsqG}z ztqCAi!ZB_pJn#bmHKb?!rOy2sPTL>IWFG~~H^@1Z)k_5O!GI zD>3=y>|}jrzX=INLdL9fkLo`sSTkfXoovd!5aFeBisD}zu@50O*NC<_P*ugb9-6CV zVgJwA=GvnVn01@c>yPgliw>hiR*@`lOQ7|SDjT7Dv^6x3>zVO2w3JAsGcVNiYGxufk|G;m6RVEw|SrpI~n`{ysgGG>EA-rk>Pu{_}pQ`Qc?k)EH z4hi}Qjh+;)XvlRHA9Tdfxg!lPdM5pBcfGISttvf!klS?=a2HfM5)oa8{p1YzZ>{;? zM(#i2iBrTTWzh5@@-nS2lp0%k-PHh|S$ClP}9o6($^>?#hFYe2=@IoBjPOHxSg0ALb?wBcJ=NVS(V>OWk zx3U#3hIi0lV~L^O3Ai?LF`U)QuDHyIZSckag&x8}w-eX&B1PfFP1aYsg5 zbfa)K``G?U?R^k1CrFIlKUP1k!I&ZPGGOuOD^s>(!?E!-v)zlzQ4C5)x?6}-zWZof zKGa){VGYA;;Gb~{F0AmnB>Q^W42AV-i0}E%o zSPIZ-Bg;_XsX;Se7;W0g@0C@5zZuZws?<`B+)}`o`%y1CBaeIG_~X#8i}oG?IN*PU zxIgZ3sQ=H)eCB;Ki8bz@3wP3t_RnR;)z z|Ko;+A`l47;i1#p==I2Y<{V8V)xL$kLE);a`0mAp7xwP%&MS1xr;OQPp3k5g7!V-2 zaPRHZR9#|`NTk49pUOZ$G1dVI*}&$?$;pK-;dtS?6j$>k`u6!m&!yeaOm-RP`HV|6 zG~PA%Xg{3+lo-B~8x?%(Rr1Bq;R69BVB;aJaRQ#-#&3)J<1DuF>@>0r z&7gIl+zAz9=5s6O(FrFYLASLIl%8n-yww2 z@7LICF4xPM?6B3RZ&_I8Z=K1WGu!N-IpMNj=5GMe6JOo-VYjYf$90z1he!FBUBTk? zNi?@|d1wGQ_0k~w<(PB@oGRr<6)HvG%;mZXqzx3<+kTVWw1}|1(4CJ&1qKbD$^5k* z-xu4r&UL+&-m6&}#g^9VcH?KeAcKMsqQ@`Ly+{Iw>7V}po?z`{hF+YrO_+DTls!Pz z{O3r4^mCSA6W(wef!q1a!{<4*mLUui-A;FiS&OFYfF?kt};N6)G$~$#Hfo#y~zYG}{8YokXq;J6FJbd+e1LRgVB41dej7%&{%3i2J=* zPkqLlMjH)&E?zuaY{611e49q6VbyHp)Ius!~;nX*ufqB&}CLK+0%vb@M53U5&f&-A@?-!Fj<@q3mf8G^S8b zpr2m+CIyG#Z#RXP3j)aE<(YE+6?+S0yWqM)u3{U63M;HIkTxdi%g}TmzN<6tkjS36 zF_~tA8^I1c`sN+96wGqSed{xy^l*1(|XMPy%|dw=#pmgQ_@TM1Gec0Mgm4?)0G1Fl{#$*(79GEf69 zKv`{wCJlRsE_vDR%bx!skpC%_W?Ise|G$?s=^d8XoMgvE>EwH~d|dtirG!eO|Ibwr z4$i$2n%{JY{PZM7m(YWf(1U``gW^9P>N>-TTYj=)zdVA4E9L7T54D^p_0wOx`F~t2 z(;kelZnzFia;(V@(bKMja5IB?F@nAFeu5!K^k`nhY?lx1SiOun_%#WzJJuUsZmfs}0m&WZP6l1?m|4}(5P9v1Ef7K9*&7JJ&w|Dwmdy5SaBC@dg!2>?C9hS)3z zo(QZqEUhZGOx!1$xovx0Owc? zk1r0($}@emHV{E6$w<-Rm;8!9wMV`X(>qDgKXS^~?(K95ms}u6!SG&{`Ggw`1`CzP zEWVVUhEs;;S1`4jscu?A)43tUzx7mJsvBCp*0RGNlIytP7Vvhk&#?V^HTP(`)hI@8 zbd<52YD{Hp@O+z_CVN(foOfUB+Dl|`vlloonjg6F`4mv{<1NeS#JOiRDk?YegCz4BskR85MAVzrO9F z_9n3D;2*uFLX|@v3G>rC+Hhq;0JAcH0zSe07w!c*xUx8Cp#PI+REfmcCG;Z}Gnu#E z{Y5Pw?DF$I1;62y*=fxR*-*V8({(hPa(ij=&T<-!8z+XQH=;7`nUL9}`wgHdH+Hkf z2~!2pp?nBA3)g_yMVhx>|>cTHQ5VuYcOI(|MR*CgKC zg(-F7!NUS-9uyJ7n3JSST<9E$-|^2rc%E~!4OezLqv=2J!xR}{Rr>qGgfCah`!dtA z(k1*44SJ*Bj-uMUs8Wil;z6cS4Mb#nBZbL4(hoxj3B0Q4RVlWabh(%{-c+3+ej2Uj zM-7!fZWAOPyTkBkq}-M7SsNv?m`T4KC{Bi35yknxC@52&hPJGcQ-FR@8+~$sGCw~m zKb)qJcOFkcdb-xSya+EJGKWe|M!^FW)gYkny0SDwuC^3APEpDS*OfNXk7dfyH?)?2 zQF6RZTR%Ygjze&#*w>1MChlBUTQ7Q;aN1+R-_w?_$KBB)B(7sm$2>k|8VzOKKDzUT zG+pn}FY^0eskw5OksqFM(NwPYi{@J+r4{q zGh~4gxV(?Vhrkb;);rKg2QV+v0lC!eAHp}y@U;~&lb_ReS>-t-dYVZKNx#c)DXRc< zEnFl?9Db|(;!5nHia|sXW;K5wL$`7aW)1P`NyKw!1c8oDp%FHjR%#tRp0s1&Tb8M9 zP59L#A99i z;}2pvc7h?&$f(2(MU|XKxux7$5$zlS3ko6Ly8uPx0kQFs3s=A48~4rdk-GD+Gve0Z zE}2aJ94ANdu#!iwSa1X(s`(FsYBdiv{^;X{!w za@JqpgzsaVF_-6@+N72-)&oD(gxg*w#dNY)a0B)_Auk@_da*FBKf<>Vm8GsfHf97X z>ap`Vv3aPyG;)7%eGm9Tg?Timg%xX#IJ`IO_dHRKyp>l7> z;+3nkdPLvdkP5BhP+bhuyp?lL=*{Fw9gK9Wz$7wRz{|4GuJsKKoeGiAE^i?IjNlTT zcQ}Jox|8P6U)W^d!=i~}#^GEd^4;PDHST|mvq4niqi&~TgRa))Hzj*5r<++p@}5`k zzRFPyIraM`IzhX-i-_4<$(@YoYy;A$=2gImykUi36N>$k{XSY0waaTF?_}F72>v>! zrw-W}rc^J)u4-pJnPbnkaLtWXgO|ADyA$(%jAo|78u;Xk4QC+!eE6CFx3+cnwTecX z_^aR+G`(3(PytF@RMm8Uwz=ajP(_@|j zsdfDDf$&0+Tv(LQ^QZ6HDegS5P;o*UNOA))dX5amtL@e8*rA#$tJw4f^@+IrIJ_ZC zsqFlkz#-Wnof}tgKQ%>Ob8!9POm$QOHl7Ku1zhIxSw@IjRXsz`qqd&$Pn&8N^X~Qy z!icfmA!#SM{z}KCQcVH9O3`vT6C&08>RI;~wGYXF?Slm=Ci&3{J@s6E{PRWlms+v@ zv(CCdV#$uFySQam|I~Ecb@)gr?yAI?)aho>cPpbnje?Q4|CSAUCy!{Q+TVgBy9>Uc zM|@@M0+Y8B_Xy6OpJ9mvRbP3ypkiI!jdV(WP3cz1u-qJbZGWH~0w6+01hK#5_ z9Hk@O&3!a;H(iR&_8eSL&!%7*>$5xpgO`i;O6BN>C~$a-vRZ3|u?Y;yM<0n2+EmU) zhpKUBJUmX17R22d!U3(3!-;Del@C)9gD=U3%U*;_lW%nbn9;hGp7cp#4esyo#Xogg z=Ek({o6ANKMxjUaV9geEF;}?_+%CmYV7XppVRq*JVvPfo zpI(wHh0S(NR6{-Fg2l@#tM^0`GA=V*B|zP@!Jx+-tm$nb*s*`!C*yM!qViaIIMBKO z?8OuHzm#M=aBU(c3mT!L9xp;G+~pd+b5HfO5B%SsHk8I)KEqDV&ZlsOrNI+(qq#ze zH{2f8A4{3-RhBJ_m8sf0`_;vC$|ueQ4h4y|zq7~%kl;3xsvI)RtkO@}H~hF>Z!3=c zEMg@rgQgNS6YX(zqFWn10JG-NU5lqz;x%C`!+v(xCJpc2eQnZKnd8SIFKZ*c^cWzib(+@vHaVL@am0)>2U?wa?lN|v(7ko zj3hXa;PO<;HlBgKzY^$X-zH?_7=8opd=o4#TxT{=&ytq~TN zr`bDE@ob5|@bK>;V8(ON?2m_{{&#bBH`;RyzjN42fX`2XTNTI*d({-6&C{CBgZS}eVt3IoMnk4DN>ke zMp})J_P_y!G%MYr-uUR~pEH!iP#2ZR@IVj`>NgWyi=nPNL9Sf0#|bQ(;OR*sl7xSI zbWnzRB4CFm&r|93q{8%uzKfy%>8iMH^1a&B&V(kYs3JDq?pg7+@iM-zUZEi;Lrm=B zAXS@M7eV+MZekEI-l|_WA-*PdPCAuIyqx1j8VuuqXSH>g85 z2dzkfMsRfs`zJEG5IW03CrUl-E$nyBoX|H0to=^shPYwjnu+-zp;yXZ3A8n``br-l z#)}NLACeS*gA5?htI~~mcH>lV%}`4&v)!6CRz*kOJ+5inbMO^QaZlT&Y0HJ;?t_qY z1s`>UUQx++%7>G9ICFM~h_5Hlv{+7v%Vor4Npuogq=t`2O%N_(KF7Y-$*W*#;pBf! zvcsqoKc@XMzeHE&J!B2`<}M|Nprl0DT>~?z^`oS@G_t%R=z<@|o4A^-2>-&>JMS5Q zdgCz3+TpDB^SF{&!-Z_^sLG>;r{9^YnCHl%dBaK>rmJ;^AJ>1odfjG^@r@n3k1*1u znPuDIS6UxlmQr6M@<)Hid7{d2dUyIo3e@RInIt@S7H1!793_Q~__rS`FkVWH3Xv{R z+Vt}Os>Fq^7QWV&u`4*-iM+|>jQcryG9gyHAN#WJkJ`B4{CtZ`$Vrj8W3}t?OxIt1 z^lK8OK->iIv8GXsF#6lDLF9FmmbCeUEsQx$sF77|S8^DxCGN95Uwk$72R>|@FjB!U z7f#wx4fOj60B_tP%rjEWvKh@{KJ!0U*P=Hhj<1U74f@!esjSx#U9-RVWU zU^9b%=~gHm4yx&`1iMxD%Wz0Hb#;rCYLN9s4#Vm?K2v*_8xtZ<-f!@Aysp=~n(a2K zJPVrf@X6-@BH;i#(T1|t*pM+f{~!-8%bxn>=?Kdrz=N>lDU5E$%k#2v z=f28ok;{k@NQA$O;Tvd7nA&m8Po=$QGnYq#R0mY)M9Wl8P~CZSqOikTdxjNWFgEON z`!4>OMth!K9Aa?b^assA|M2y&4(_MBVOaENeMd}+4C_Ub2?eNC+i&r**>YgzruoOm zu;gC{kIG^k)_bFk!6o?=u1RcvAn`)#(-KAtAkce*R9tz1n&@zo{b*IsRb}&zSpa zkbGfIROUo*N!pQDx?RS#)BT;dG_FvHJ{AS#hA0stq_`GSrE?f{h2^?1BAeWIFXL`! zKZ~8vDN5j?O}{^3X~1!By2=|ls<4qcXg}89Z=*H#9m@Kvh{0GhquoWop7)8-Q&qLof1I>0ndaU zg6`Z0j~Rw2A$qSwd+$x!*pb5uha)?IF|&|V`-_i6T$WYV|K!)@I0GMpo;-|#YEo3z zG*m9*(H+J%|LPL^m^$4n5&Vf^NNkl2Z#U5hS8&}Tj6CoGCk5$=D&H?e$8-u3P-!gB1C$^U-#4D?u7CyD1ViCh=2WO|#HTV5Wcq1Kfl5zoH z!I$thc^GN3&zeSjSK9P~mu0eAv#P}=n=R!*;LqKcZ`NWI4xCoT=_vJfoLPl^?j$yr z!UL$+4*}E`Aj84^F78N$&q^~_`&T-*te$~AQIatT(|n)NLmy0Eu16|`N9Ypl_Hf9xnxu5HKUTz1p8$8Q2l*D+Y&?KE>HLAdA942J zN-f@Pa!AiSk086Xy=vpu5G#={xcV$xg6w9)c7xE#Ji5$y*63|i9%Y?pTU7Azeb0^jNxW2R^@}mTVGkB& ze$!K`c}exvqfRiC@{mF)bzLa~n|T9L%8)EdCbH8`qTIPaW0B7?uGEJKBot|#>BIJk9?i>7f$x)ERR_LN*OO&9wE)M z&%6gx5IvICTxk-t_dC7KmYVa5p?)S*KXCn=>GvVhO^Mc7v#vSNm`k@wjf%Y_>su1_ zXFu1XxRmc|qHFH^8H`5QXY8R{_$z&2~wk zdh&bUdu=$VR4Jz^ziV8n63^;W*U94R(P&?0QKmor{xUm}7p9WNcrB|~t4$9rUew2^f_<)ZLV^1#|ziZh!8DX7lYC!?<2jK^U{JRl0WP7!OC1hdk=&zBz zj(ly;b;*8@_v7eTXYw6fYDNZFM?~`jKjY1>6*z< zk5)`9v2L>Ng4&R$st{%md5REW+akT2mrNaBliX+q?ujKAPd)UkQNB7q!;tfgX$Kz} zPZ*qR%DWynbpe1>`)s(jefQUiSG?;zKL>Z-r3N+Fx8f z_Cs#>`~t^M3-a=s0#>E-VrN`>J593Z*w-TQb-huVA@oxNc zwU-pGZ9AvH6e^;ZjA^^GL7o+3_OdNu!ddXg+H_M=;Gz9Rr_6IXw z#@uLrN*oH8D7!k`x3=?ozXc%I5)0ua!LumH%XrR`Z5rXUSV^#U19JABjB>8=`ko-= z!X^aW7H#>AYh!9gWO`0AmcOzSDHE@`xof^&QC);>1h9+&`D`Lj=3f89E%0U z`7_sSuV5_TtmiQD;qe6-L^y*fYBkYZ{KxXO)G0;u*jnVDKj!T|UX_qM55+c#SA9u) z_F-!Ni7d6onET$jh~hkSa8eEp&InuA_H~t`jv{i3(jxzPS|i4Xr2r z@k}V_y3dg)WmJ{qp*n@)9}}@4fb*N|k$>DdUo@(wj`hg1&IG*%(S3-b{Aq0XYoXuG zri%C17tY@a>YVL8h)*z2wBY2{(jHADd)~zT{M6IWezrz`;HsowOT z6T0@W!*IV39LLezB(uLF7hUDu-QY>Edb8E>AmK{iW+~!3GJ5b`Q_R{Q~?0O$F35R>nt^Nj81(Cq2kNW}7Z0s`2b*H5m~D zk3N>ZmkZ>i6u;Gt4fmkTk7`TqZW~EF#$(sm(&IlDP|D~a{4l>_2iAoSSC;SYZ(p#O z5^qr)eQIq1Sg$P82?jJ|?)qpgiw!kNd^9qX_;X|K9{t--_mEbl8%D}O1W$~u5~Q{D zq}I#B@6&KVp24PGP^gvAPE!9pon8G_kg^QMoywwTPOLe#7v>D_t?s|cY{_^C4(eol zf?Joz%q%TEAFBHOTH{1me99^BN%pvp43YbFll5rw?p_>^QaSKxUI|eyNs`_sc^X11 zux%&>)+5fq?TRxKM)d0+!S(EOXBB)hH716D3Fod@DXQ@_?3<*u<8(KcI>jRy1=Hlj zJX5h0>(f27>dy@imJLYJNVIOe$ySq~j8pl^s`ekbHEfRl%izO^$*C;37w&tXA!nPu ztMt!#3Ly%uhyRXgK@*J_!EH3d>t2N*mJyBHjM1+QPyV)ddOJ=No`a{XX*J)-dV(HN zlK*(8XLo@FUsz~udOhU`ne@ z(v6VV3azv$}YTp%Xn6>$?wr{bH#+NJNIWyg^(s!6MovqNI zQD{09XBV~pGE3PMVmf=GbK3rLMKz0mKG6+OW7m&I6;-OnUe7NL_M6yf0<{=8#-zqp z)m&R~?;-a1uau4ApGA&{8o54U%lRn zK}r9EDOw^fpEy8abZCd}Rh=QlBg&!%>iDof-AgnN+8OW3v8c(zwNvZSx=cQ2#uW zggwIgc`vfCDm7)g)=k>pZLSy`p7j|d*oJ&9Z63kG2H&YT*0>BW z`AWfchnbn;dI;b%Yo6NOH70)Jmj!_vudeI9h%yo-SOI=GvJ_%>=`$-cZ41PknsNXd z7Sqq(6-;yTKKJ^_<@TO5IPKt1hAH36gT2gjq3Z-t}qV3brNSSf$W|D=&cXtI1VoJ)_5`UCZy{MgyIz8=(}~ zK1@lsUUlh|z`v0o`*i#0vvIbcb~k^XQOf!eeZ7xpz9Z*y;=V)y?*8s$$D7l9sI-~v zgI4V5$S>{y-X6a}aW2QayFYw>m>`V%FP7ZAu@8%QF2kO%R@mDv!T5#Dj#k?Mu^d_7 z{1i6z;u^bE{|s~=Hg{7R*i=PS5WYkgSVP8~@faE$Zo(6mFdmp3EiVq3SgujNA1xop zBr~n?ad)&ZS7}wQnq*pKkQFq1e7+KVZx8;hN*DjA+Gq4#JG~2Y4QI=lB*H!Z+{Dzz zP0%G13GJR(Ig7QiI2CNBVM2X#-`hjLLJ$>#f|skR>}l)9Mv>v}G$kHSo|)yWcqQNa zcf2P3FJEym7Co$!k7QErw7vK<)20x+m}~2mNzygOTOPS4*Mku@hA_@%(Gf|*q}c6M zG%KM6Cb)V!)(NAO=4$(S3Q1$XY}Z4LSr7coF-JKPqRc zfmA(E6xK~{^80bU#V<%-%N|3cuJ^Y-mv~?8F(r%fvrpe+{r9F(TcM;{pNUAlaA=`V z-l_O^#DEuKrMG$!R)&3aiLYEu@xIOja)^Z;7?6=#__B1If@s_Xd#(6L3TQ2u#`bYh=LL_3Kf+-=T^8>3b@y#6CT!O3 zXWTH!gV1#c6TLvr82ZjU!XY&p5POYpT29E4Tq(dX)Sacq3-TQR!a6mqDIlO4e>?}9 z1_mdczpLmrS_I9qu({X<#*52psYY6uX4DsnwmQf?-#ngK@ zFhAlj<-bpxvW{dEhJ=K1~cPOOIRG`#=BF!yAX_t-ad&k#PmA5tVe#$_+kqX z0iioPq`J<>!^tx&if1!@pCeP4kXjqkP9Q1wiFsf>3)vQ9lEwV(rkCSFvWK793)R@- z5Jv0|nvQ@9QYaM3`(+KXe>wY__wiLZ7~9^l6`DPymB1W1fP8G6 zrPml=DzYWU!sV{$U7$33w{i83f6$l{fr+n{%1~vi2sa_8m8mX=n zce^p*Co*)k)FcQ8k|l(H342Whtfj4{=(Cb2*DF3ytNUTclK*<+nwkXf=ldLk!)G_= zQC%Gb2?c&tYyu(;Yx61hp=$SuQn&6WlLtXM4H*ROR>Q6}W?A^nJXt}@K~=EMwYf=R zZA#W~;jD0(>NW6(lPx!faRcqC8O1GMPSp;^g8kAm2!0r#JdoR2+gB%3-_m4_?2 zL#0Tz_o&+ob0pPVR*o|Kh0;rJ`2b!Ivpp@<*aCbF8p7QzrS-_k@hV{VdB1_kZ*;r^Hu8)?FUoY9%By}}rSckf$d+at>)v)5Qg6rRzt8>eByEPpS zr}0-0bP}b_Hp{99bUYPr)Nka|!s~jxd2cc=B?5}AnkOl9*ULPpqk>o1iPl8fZiS}O zh-00bT-bBa2JzFQWF1Fn8`NaUqhsZSzHCcZvEI4X==i9hWA$nto{OpaKj z%kJ~_;{h7<*_GELAwxYc8Vx)AW3e@&e=t%`F9{D8hQPD;?@coG@=g2(a3;9lB;-im zi29c%uNXR_mq^(&SzWbx0^g+%EM-z}J?hh-u-mHdTYImP$V=Fd+jk2-1T>Te?VIZX z%avD4Wg7|fN`1@&|5RJmq?a{}6P9u)lXVirb2^BN-00Jcz3pOL&rCVyP%r&w@QXoh zql3|e5*e{+_SF-L%9#k z$myp4d9ecgZuSsH`SIcZ_P#Q!<*3${I{%)vcFwntkCUsgt1(8}aRwMwDDPr@V)YH%cXGjBl(`eX z3JF4|o1VshXo|D6GpyWrm)ubAk<0pf>v7*6a;5^sJB=?~RaOyskq5 zhN>FAL@E7IMwwJ1*^$9A$RtG`g716P{St8wvMGGhjYRh+5Qs85%L@2AA6z8+Wo7Ro zm|Ppoj-Ee$y1}Er{I`=gXbyx^BQTY@^#P{{*})?tL%J|dR8rmR_MEwJYYnzH8*8KO zerv9S#n5&x-X`n#5_{-1KQE^CQ^!>mMy`gh%etXcq*0$joznFn_B-&evfocMq{isJ$!NAQP72t%T4(-1_c8iK9oI-7cI?@drMVGO z-v7SIaVW5Tw2N4C^WlEh3G*{87Zqcbx1O;2KF>0>zw?Ra4R=vP=E&l%wgAofvrX)0 zJFSo{|dudNP(wtQC z*{4LGeU+mJ7R29K^=<2I?t+>t{L;J&qZQRH7Y>fJK6P(sm*%){7%#h(-?q6sOgSby z5tSIi(G^)Tt;|l9HzekN>zGuw=8E+VdQKR%Bcfl`by#2PotHdO^%ykw8raHB-TP#9 zNqM2|*A3ZW6D!0yk6U&to_(2Y!S7E;_PpgWaJb#e9Z@K_DfC{zkWp+QudGu4CPLSs-U;LJtxGDCYzrAW-! z?6ZDmI`oc3ibN0v1A^3QHCgRKmMbG5s;8&tqz#Scj4GT}aWX`pah9o^rcHkF@qtxB zr9^>9RP$y;B}27fHl%|GnImGE@GRXr`PAO_F(w)YM~`+~hms|BIkV zI15k_tBjg@P9h-$N5Rps3{jyFslSFO5;DYcWwZeCl0*w4U`Qd0U_x_)zq!8YRiimU zBMQxC^p~a2KHJ}=GspdRv7a`@C&2_4$A#mCFp2SW;kYmnz$C`gh2z3R0FxL`7mf=P0Zd{%T{tdG1Tcy5bm6!#5x^wI z(}m;0L;#Z*PZy3069G(OJY6_0Oaw5Ae=}WXbEiIF8G6)1jh^XXIc={10Ajko4<{J? z2k=ggtc`6``@An@&E>QUJ7VRDe>mq;MCjWub=_RQTx%ZODn4?2*Ok;&PL!ITYwuT& zOhj7~OwzyVW{SI(9gMZ)zMe2342wSd;%*18LFg*;Wr$&{lCDnJbo`pWDYx%Tq;*1g zNJxY{>>mZ024S9Usm&jOtDWRt!*%vi^!2|7=Ytu)Zg)-)26EOGH?>v;j0o%)ji=qu z2J+6g1oj2pd+N632Fq_N(Y5H+io(&DfUU%4DR4G3ZO?lh+)I3NwXC$bpx{D-E_7$u zS-nfGxVW6Y{@g;sUAOC@LB!WKVlljJ{T{PRJa`9Z@d4o3M_)9+FIGOVHEUbSyg~vJ zS9CqMi#u(y6Fo*6EFH9UOJ)Tr2h z%(3EHRogu%(>;%MsC0z4#%@9V$Fb>O@=dN&jo2L`!)UYL%f7{kqAE9y!!suh@e1=T zjofNYDaI+s?yoEy^|D!Kb-T{k+liQREHt@4eCTq&PG5vh5MelWe($nVYm%7l)$JMA zmbDBxW?W+N?LPFbxkUA`vt^@=kN5^{SUz;aA$4FLI^d?I)3o%G7Zse;GnjmBfge|2h~h1osm>?*J@eDKY^HLpr`IX+E1p|zP^@e952MU z_izRngBYhSBpg7DzjHs*+z2AZe}81AJ!#H%`J4^$EZ8o7<9x#8XM8`C@Vo`A~6gJ2E5rXw2VCGq@31Q`fr+4HTHe1lEaC>xqZNZ{h__YC5s4P24Lw6 sq&NXJRzQy_5M!*R8?o)M4i7pcQ%^d&J{kXd@}!pkx{W@C-0-A-0~5q=@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame3.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..39bc39272788227b1bfe7b5f583833754d215253 GIT binary patch literal 49444 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame4.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame4.png new file mode 100644 index 0000000000000000000000000000000000000000..bdce6684ee3cca5e288c1ef1c05acb7a692afcb8 GIT binary patch literal 49399 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame5.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame5.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9b3e53f15e34c5a4a33ae1bbe824a0fa3e9f36 GIT binary patch literal 49447 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame9.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame9.png new file mode 100644 index 0000000000000000000000000000000000000000..67af3dd8d39c08a15dd46438c47abdc376e954a7 GIT binary patch literal 49395 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 Hho<}sxFTh_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/crane_controller_off.png b/src/main/resources/assets/assemblyline/textures/models/crane_controller_off.png new file mode 100644 index 0000000000000000000000000000000000000000..08e15bfeb18d48f3769874275d3cf818c99456cd GIT binary patch literal 7190 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¬0VLMq5B)-*^+e#{Gr_0-_8XlM*4^cLYyrB?~55as^Bd|O#y83*BtE+9ssOu Lq*bN)BJ#fgO($Ud literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/crane_controller_on.png b/src/main/resources/assets/assemblyline/textures/models/crane_controller_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1634f5080aed24bb704536271abacbc8570652c7 GIT binary patch literal 61213 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

    $?Wc1r;AXV!zM(tp`Zh(JarB%d`sct+Ic9Q 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 P@|?W1id4D8`+)xi&1}k^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/crane_frame.png b/src/main/resources/assets/assemblyline/textures/models/crane_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..280107ac9f9d67f3ecdc82e24bfee735b4b4f5f2 GIT binary patch literal 2982 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/injector.png b/src/main/resources/assets/assemblyline/textures/models/injector.png new file mode 100644 index 0000000000000000000000000000000000000000..f63471e5ebd33701b52bd50a220a98f3c12f5cb0 GIT binary patch literal 957 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 z zp0ksqlWU%HY-?}(*uu(1|YbD&tEz73;uTyU5;$Q)^Gh($G6YN!WC3Xqe>D zv>ov^E_lU(F!zYjbNe%s-~6cddE&~=#+!t@JD>b^s)@^&EI(Q1yi$CnUb~aep;rPZk!bsLgLFP_oT8n!~;psYl zgYzA+tF7xwb8mpG^!>d%$D6JG)BZf$Z{`?HmO^;LMb2H0KJ1$h7ayl_rlp-j$+LD( z9AqVkq?)I- zMp;==cxcGmyai)2>8=~SJ@a0xZy_)Hl`BSLueemE4?vhiM8KGwbdUrkAh!cLj3h?~ zI7l&OZeaJF;`+}Ksn0Z2vv)aT_%@O|ZzQ`x)7?P$GOQI!O8Vl4*|;7aSbM&K#z3Sr zAQY=HD6cWO_}V)jN3zaG96rs%PQ|$Ij*Ni$Ed^C`-CUoA^<#P_+01Uk3zc#KES{K& zBNcwoNX)T>+>V7PoN+rO_0O!-u{CVYZsLv|-&yQVxZ5ekn4_g=%MF0xp3x0fC{-W~v4?KghhA$WYXMEP$TNuCnl1JBcif zlm_nl@V3&4bpTvc`@2z;TWB7v_`AbomY6tD;TR170djQz?LME3{O#w=tH;|FrmG5Q z%;K@Fe@OW5oCBcK0MEHF-R+NC-=Lyf7w2hycE0MG>2s9FkENY1ZJUxK?~(r#a6?{W zS6-t}l$6M-cBM)g@KHw3ej5tCOz~-v1w4l4o9r+6YC7nlAa(|yegZFBj{l1e@PD)i z6t|s04t(1V*tBygVmz7jC8!=@+UW7Zv8((+gaT6vmlcd=5WKY)_Jw zbYAO4vkJ=LZ6xl?pOi{${nx{(g-8VQoymtUMv>mu`4^v3Zw^qq^Zy*=^@Fl9V^AE`XXtM4in9cy1+<#J z;+2}e$=vwK)k;rX^d&<`7l;3b23MM+Xr|*?l>~JC7sUP!_yR5%LR_&~zYBhXC=QI$ zRZ@%p5|AR1!UGJ1mmhqcBD8QS)kBN{Ody}?q$RK+;Q?h`2u~qa*#BZ2B#R6K00fW$D4-%`@Pc8g z85_pfqPFe#GslmYl!sJ?cqlM#d$r+ET07G9KMyZXXfbmA2{r!w4gXuJr4_~i98EP! Tjq$33fOPb=jkT)ac2EBUX2_Y1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/quarryControllerOn.png b/src/main/resources/assets/assemblyline/textures/models/quarryControllerOn.png new file mode 100644 index 0000000000000000000000000000000000000000..f36357abc21ab5ca37c5d0587d15be397a04272d GIT binary patch literal 61496 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 Cn0=W5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/rejector.png b/src/main/resources/assets/assemblyline/textures/models/rejector.png new file mode 100644 index 0000000000000000000000000000000000000000..468311960371723f533e1a1f529d5adb97b04a6b GIT binary patch literal 6324 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame1.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd49121d5016083d75019e13d2c391ab41c933d GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1JhGa7srr_xVN(c{SGBauvBaK9sPTMwX5MojwiQMvM)!E2 zceC|6p~!2G9vAIgbFy@A-1R3~i{^Zb*7x1CSsQ# zUZmv^m7>*GdQKRk-uU=;m(YeSCqiUi&ruHmt55HH-wCnknx+2&u=;Z{_k|%Attp=8 z09HT8a-TZHqKM}phkaMNUb_42^{)}{;^%uGh1#@)d&B%0p^R~Vx9pE<4Vm*d$@=_U zkfvP>zd6H1A4E<(|4(j5eXZ8Hx{Y(6`<)j1^>^-$-u}#)FF$*||NibyrPhDnPx{;+ z@*bU+`X;z@6_bqMjptud7^kI1e&3_>NP_c^&VhMP^S^&8>|wFnedD|O|BrRYI~srM zh&0^(+Z)3uav+{Dg*}F$==c5qi(B0f9Q*!NV)y^syG?2ugaa4~er})MSWsuPkLiGD z00V1-I>YgDMiGX23^Mmw0~jip3Tnh17$0yR_!v7XNiYz0Fv!n)ytg&9ZHXT+7ch9b L`njxgN@xNA*ThG1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame10.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame10.png new file mode 100644 index 0000000000000000000000000000000000000000..5d86d398d56be28512fe32e8a9580a70d863c7b1 GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M_T87srr_xVN(%gQ6WpnEw{5&G!Cjvv0~=>xn6htRX@bGvqQZ z=R_RH__A~xSImaH|Nq@^lt2DhFzDazH!n+~s_yH?Y@5g+!`Hr4GFET;((iWkIRz5K@8r+=I~lf1eaoIud+d53gWcoCUB%N5C^OvNcGfTM=iLYPDzPu$RLlPVxL0ob z^4ggP=1;f%w!bmIbGK@Rx7VHTTNq-taXn=SxN>AB4})HGYY~G+)+3*9b_~FVdQ&MBb@0Fp$E ADF6Tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame11.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame11.png new file mode 100644 index 0000000000000000000000000000000000000000..15d2474c0912bf928ee286d97b7618cb1eaf2f98 GIT binary patch literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@0R7srr_xVN(d{h}QOSRT*eEY>`Ccxl1ADJ-rEO+pWAS49Ty z_;a}3cCT;w-iwECET6w${(hU>^UpsgeER$M@4}tOj~{m~-fmMei{-(?hYtg``TP5~ zKhv9jdg0D!IVsi!ydQpE1W^T#8TRBfoPK&dTj=@cyYVakyx#ea@mu3%wj0yGF1N`P zY54w~A%Fe1?U{S-bLBSFuIXXAV0&PnQvW;?t^@!7aaG)8dB6V8^!P=*1zXO2-5JPm zi{W+an|Ttf3%)a!UEf)EPlF-1;j2@bKTsdrjo9bEDiYT|KDGKPTnDGe_i+QOp8~~UsTGU zt-abmr~VZ0h2y*J4^6DD6KPodogw~f*5jnuBQwES4`52zSK5Y-qsA} z+`_m*WvLaTf^Od?S%#2FL30@Br#Fy*P)RVd|0)b%rHJ1Gh0Zcm=Hz zX1Mf7<2Iv%s^(QrhRnh#Zy6R$n(~UJVT;A7GKK(8uTmz5D4A4ihEZdOLLhw8UmT!X Vf4q6;PheJN@O1TaS?83{1OO`%tnvT= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame12.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame12.png new file mode 100644 index 0000000000000000000000000000000000000000..c50a1d187b11e9e9398e3c4b34b82f7af6110397 GIT binary patch literal 1027 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M^Z(7srr_xVN)o!)65vuqb9TnLn+%GbP3UXXSxp8_zG3W>p78 z?D@g4efi6E`3_SaZ39uf2tye||YVp% zZewon3R)%1aOsi8ZAJ%G&8wUYnT1o{GAx)hA545P*li9mQSG@qs3(K?hL Qn2Q-aUHx3vIVCg!0Bo$6=l}o! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame13.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame13.png new file mode 100644 index 0000000000000000000000000000000000000000..3823f4535e24111274ec1f192d248fb1029fcf6d GIT binary patch literal 1025 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M^}}7srr_xVN(d{iFj0SRT(g`7CJ8@#%+l3UfNSv8W!}y{d9i z!OwPno4>Q(-MV<|M*DO7etGBq%P+Th|9to`@%o*gHTO)*&pWq!GRVoxm#6;z@?}f* zyP}JR_-wLgRT z&D!GMcQhDs8{W3AnJ2-z;5%d3^__qBfGoSs9cgRGxHZTzOjA3dFT6I6F=+kWc*d}J>8;czdUQgd)ou$ zdvEQyWwF$pfv=r;c~$eJ2jY|REcPys5&jV=@_p`s)2a5~?jDFD$L|kZzr-)o8{rbxDXi!;+(c+n5`?f>sGLTzaH& zo6$j4^C~ApX5o~#3=1YrdBxJO#o|;MLx87ODU(B#OsX}*3YDc+j0(Dan`9Y6CI!u9 xm>}kUlaE2mbEO}HNB80!_EBSpL?Ha*?PyS~pZ#ME6EF`mc)I$ztaD0e0ssepoag`m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame14.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame14.png new file mode 100644 index 0000000000000000000000000000000000000000..b95e4289ab4a015e75d51334c4d2e8feedc20d87 GIT binary patch literal 1020 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@sj7srr_xVN*T!=eI3SQL|m)Sp(&nUdmHS@XhZol23%+s#1% ze|{(~FTWgH{yCuUe%&2D=k3dvFIRke|FoUGeg52X?!$eP8RqycUn@EH{PVS+^Ac}p zFyuD;m!BBOaEqaw&q4aZImQg;JC;B}YxW1F%yZ7i-=AbLSFXF3Xjv z|D~d&6J+OuEP-fqn9uxXU2*L_knLZc%H~V3F5um;``p(`B+X_A-dSCL-ph1>EkZx# zdnZWq?$TQCKX>=l z{yF`54cYUVel0$iZc(&fp7p`4VwX#3$*^xEC8I{3A%@ z``iQPPuIQK-8kLlw%QJrr8|FbVSKhJRD-=?(K5@)j0V%!I$1J^n4X;}^H(O}T-m7* zrd$Rs&y{`*9^H#`*cqlS2~lTQax`!obAwmVDq)68k2G#GI;d)1iwPskMveb%ELAP&{EJMhopt%ea#N2Q4jT$>70^zUh_X8~T U*SF2{0%l(ZPgg&ebxsLQ0QO^&{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame15.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame15.png new file mode 100644 index 0000000000000000000000000000000000000000..b5319b469ebe38b02481d8a0a5851b9a677fb6b8 GIT binary patch literal 1044 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@ad7srr_xVN(d^P(IDSe(zX?3;4_vG>e7Cpo)vEW?z3ugwb6 z-2LMr^Rn$P*O@c1EMFeKJ)e2|>8G34RF#)+H~IbH!v>S@Q``N58SXgk-M>Hn)VGfx z3p3wU?bSP5`*dL-L)dl)=>+*niy5{seiPkUbxDIEx8Z8kx3j%W7uaruKY8T|k_pSc zX>QI1R2V;TwR$hphdqqzuFLEH)0_TTKJNdwi1|!muWjr=3LaD_?pAkWtoSYW;Oo_Y zzgqX*<;rcSmFPhj_UCo*fzN6c)lcpBcbFZ>ntS}Y8)F8ujDE`ZBN_~~{2O+kd;A<^ zw?*8Ecb$O@w-|Q6wyC=Za@FJ3H}fP|7w{6RWbV1=pD({%ef_q6q58Z2=wG%QU!{ND z^Zl9KYyWfqPxD?lzx)2-iPbeC4OhQ2%>SD8IP3A0I0lQkesf;2Pigx%;Y;J>>Qk>- z_K6?A?)RYVX8#}a4~sW$?>48}XNLYN(bul8JIm~k?6u@u9sRcSqab^Hd& zmZ3(CW(+fz1!yz0ES)%wxxpuRg($!lvI6;>1s;*b z3=DinK$vl=HlH*D1M^N#7srr_xVN(d{h}QOSl-S#`7CHoyZ6I8nw%3ISUMk+W`$`j z|8toA-n_E%y@ob7kIV0uYi~UMv&PQG#)e0uUhn6ZFI!6Q+45NXF@6v_$IW6bKmBy- z^Bucqm~tI>{P^*;3AY$t7xptzMiGTn^F+dnepgcVo<8ezUH) z_MQeqZo^lnviTCM3wSr|KKHe9F~gp`hSN`f&))p`=a=@=`~T*BeOe-)V7l>eqDX_; zfhxt_{yj_|KIS)k5C8pJ{8yp&9VsX21lye;D_*z0u`}d4kp7=_Pae~&Q}w)Sc{lW( zN3!BK@vhjyc#ZpJZ4$`NcUIS*_rkpL_+`njkDorieg6FUefh^~_4j@y{X2Smt?_=V z^7Zl-vUeG_?_(|T{;n;v^L{^5!RzP)d*gCra_3x{jX6Oryf=#>W7RA}t19_~V@0b{ zm~t76d>4i>aCj^0vNOzF7NE`0vUK7!<_4eO6`~A>E_s}0bXcZ&g^M9EbIDT%h07vY ztPLAXE)_9M$mH6}!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@ad7srr_xVN(d{h}QOSRT(g`7CHoyZ6I8okzMHSX7&~uZmo{ z;LqW9+r4k!RVjZ?nLn@2b|0^e-t^O(UfsQW_tKlghYw%66E0`v%UHnu_20ib&D+P1 zA78rj_19e{->0^_F-F{F%5A9i=wrITb|d`BE6>FYTNuN#Z$-U+AepVxYKuWizlrXwx}?EyUiv}R-;a;p7g_#)_%;80seHoLbC1Ca z`ouR?Cy6v{pU)T<|91WT7q`~}EowiAFzmqof7})KSn}8Zd2W6YXw&B(V4EJdzL_V% zy5Kj%?$_BD@=RpL_fq+o~`PxD^5zWe^+iPd!?4Oh=I%>SD8IP3A0I0lQkesf;2Pid>0@TGBb z^~u*P`^1l5_j^!wv;U9Ths7JWaoWwga_03d2IHMsAlp%s3gkSc+lRs95KPMpR(YV42* bg#Rp|F{<^m|Nr<2%+?H^u6{1-oD!M!lvI6;>1s;*b z3=DinK$vl=HlH*D1M?;O)d$ZXPqLy z*8MQJeR=)vdmK8ye|-3D#S`=V^Us3fV&esWwmrFf_wKdI>jrNuSPvvy^b5S%qc{EZ zxx#S6Y>|fBw{Ndi+{$?Eu^j6H-VJdl-U%;e*uq$LeWzW%NQ2pdD#hLYJxmwaZp1$S zwI`6_7Q^e-H+F_x4$=wbb6*FgpZa?YYP><7DV!DTZ0A(t7%RBZh8i`RG0a>Rpv};- zbmBDT2A|*+q6~*Fd7Nf+Sf+V}iy<*{$x{Y}%OY8<4I4}@6){Z6b{F>rV*>#~m;J0t?(A8SC(-_l8sCw&5DX$DVM KKbLh*2~7ZrXQ9{t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame19.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame19.png new file mode 100644 index 0000000000000000000000000000000000000000..ef94c7bd53d6a289103fe7d1f09db86406778dd1 GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M^l-7srr_xVN(d^P(IDSe(zX?3;4_vG>e7Cpo)vEW?z3ugwb6 z-2LMr^Rn$P*O@c1EMFeKJ)e2|>8G34RF#)+H~IbH!v>S@Q``N58SXgk-M>Hn)VGfx z3p3wU?bSP5`*dL-L)dl)=>+*niy5{seiPkUbxDIEx8Z8kx3j%W7uaruKY8T|k_pSc zX>QI1R2V;TwK_;9Vr}aEJ0PXCuIuKRfMm8#t1U({&*OKvNl|Pd1PgsL*@&9PkD=-%lG&_s4lE|%aS+!?}>V5d#UW%4;Fi#wOP+=FnP6` zDT7JqSqa{TnK7oT7#FO}I`-nlcLw8W!K%U;%o8%XwlX``E@X7F_Nb6Mw<&;$T{8knvC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame2.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame2.png new file mode 100644 index 0000000000000000000000000000000000000000..bc807688710038e6faf574a927c7a4b2280af75a GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1GAT>i(^Pd+}qi{evcDGSaQ#aJP)$;*Ap#PuM<;nXfRl!qZPk# z=24!vex*+{TMqsC@Ws?Ie)(liuYWe*YV6+s+7n%I!-s2w&gpeM*Glhxt=#^>Af!R> z!2fU-(FNQFI~Zac4zj*r;?Z*uPbgsA#n8-sfmI>~sNexp2_u_05lS9BWm@z4uXbmu z<(|c#?%vNmdR@I~o6u~vFU*Ru4R4#@{FPn7Apf8L!?(NtzO~lv;o9GNf%S$TAJFy< zwG;O4Pqvfc<3Ikma951p<*on!ygIrkrfL1XpY<;t8TVZ6pR-uJL2B`x*Md8C$Ax&h zF|8L*nD;#Pck})UTVB83V84btA^t=E-}(2y-FVOTZ%Op@2kKLH)L&+Oa6@a7u!Es+ zxDlhpwyq~E0cVa(eZ%f36YW|gjwbBG(6?5}l2OFCP*u1gd9{Zh!%?4@lPuUw7*#ry cL!gd@@yD;yRcm@JfLV>f)78&qol`;+09HS1@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame20.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame20.png new file mode 100644 index 0000000000000000000000000000000000000000..300b6d82a02d1a87791d6966bc4b6932d2f39c12 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M?;O)d$ZXPqLS z%G;g!_T{x+|AtCCyFYa@Y;w;(|12mjHeT>&+mpL@?_R6CZt%u}^+2*kzrdTC7`^Fp zAFoTgropg%`}Sz(Eao-GZMhtz6ZTHHtM0~_!Te@jaqT?~hTMj)PG$2YSQqea*nRG6 zqa$b^UoS(*?E&{gm&Wfeg18cE669Z;r(ff9VHBKYzY?Q)Bn{ z>8JSfYvcU>b4U2TDF7QAcjBG!Vun5cq#rz8{r73>zI$Brc^C3-n0E(Z`Gd9PjQ+D5 zs-D`nUSo?mo({6SN^!S;57UL`I4y;^++v>J^7iAmx4(b?{{Nk0zW@HbIr^u+|NOa{ z_jk75EBK{reqd|cU%8a{kAM2tOWZp1e)56OY!-6;(XqU>ikYuXV-9aHJ7Buyhy3*q zKQ_t#%zNN&yOq;!)|E5ww=$*`U0uP}uxyp&Vn&0>tKCc)OhV5}$o^HxI99YOg(;W8 z$ai5F1BbV=E<3}_WdYg@ElVd(V{Y&XULneG=#s~2Mu%mZSGX7wGnYJNP`E6T#oDmJ z{P1pP_74J5F Q0?g73p00i_>zopr022wDtpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame21.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame21.png new file mode 100644 index 0000000000000000000000000000000000000000..b8191855eaa6dfc176a17218a75e168e7142ac23 GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M^l-7srr_xVN(d{h}QOSRT(g`7CHoyZ6I8okzMHSX7&~uZmo{ z;LqW9+r4k!RVm-Tv3z;__I&2;r=MNG2@% zrnxy6P+|PU)#@Obh_$Kr?|_unx~`jN0+QJ}t+p7SAvXC9ufHDe-hcY(pZ4qf?_U4U z6!zN24rJ(q3dP;(Zj2Sbr5=2}`tMigzPnsNb0vBZ4*2sr_P}Sgit4BK_MK)2vgRIt z?#7tGETf-?xymB$#JkQwhFc7~U)$8(ds$;=e>bk=?!HdzkKcDJ zy)V4FF6?}D{=3a}Pyg({!%(~Tx2??1-|mbNwY(o9*PE>~^LxqKaQWqtm30o8FW5ch zEq1o=@q18RSo4-8Z~EU8`ONlG*|Q%k_B?B|j@MxFYBy5`lhCsgybUvBOjj{3SebR~ z#f#?*#?yjTg)^8ZWO8j~a)^-1v}8D8(i+96pwqiWh9PB^(^>|BX>L(`3`V{S!x%Wc zm37$}W-bfRW@uSDaT;@jPw)y+hC`P;PBS_z)4amPkeIpTDTBggku27R4JMb07)Fg9 c5`i#ZevfKB6GOprV6JBHboFyt=akR{0NbaVN&o-= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame22.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame22.png new file mode 100644 index 0000000000000000000000000000000000000000..c89d9ce3227e1088316a689ded3d3eecc167b690 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M?;O)d$ZXPqLS z%G;g!_T{x+|AtCCyFYa@Y;w;(|12mjHeT>&+mpL@?_R6CZt%u}^+2*kzrdTC7`^Fp zAFoTgropg%`}Sz(Eao-GZMhtz6ZTHHtM0~_!Te@jaqT?~hTMj)PG$2YSQqea*nRG6 zqa$b^UoS(*?E&{gm&Wfeg18cE669Z%&LMHn|O_pFZEb`SZ^& z(@)piZm+WZYhGZw@o*x@*eb={{yj_|e&shzU;k~o_^&GM8nYIla1oN_+wZa3J^7iAmx4(b?{{Nk0zW@HbIr^u+|NOa{_jk75 zEBK{reqd|cU%8a{kAM2tOWZp1e)56OY!-6;(XqU>ikYuXV-9aHJ7Buyhy3*qKQ_t# z%zNN&yOq;!)|E5ww=$*`U0uP}uxyp&Vn&0>tKCc)OhV5}$o^HxI99YOg(;W8$ai5F z1BbV=E<3}_WdYg@ElVd(V{Y&XULneG=#s~2Mu%mZSGX7wGnYJNP`E6T#oDmJ{rSAMKJ!8xX%KHqS Lu6{1-oD!M<*x;IE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame23.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame23.png new file mode 100644 index 0000000000000000000000000000000000000000..254a9735efada5196f27999e2ed17500231b0f96 GIT binary patch literal 1020 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@sj7srr_xVN(d^P~a=STon1&p z1rN3{>P?ql|L@!HyYg}Wzs3CLopbHy50I4)K01Z@FJQRypZCMJy!z^e-=i1uZs21U zX)rsmOKG|KLWV!DLl5K%-?{&Ddv^x2&+D2RKA?j?R4A@i4`8U0Pbi(+KY#n%vfa~P zpW0g|H2ufV9ZT;E2isr%d~bI3wf;Gar624KsQ&j^_{YDWVnrWja_-4%$h|%7SHr#u zTfRumd$_^ufbo_e^4AOYzMc4<5cI4fkJXODMX!f~{eh*0Br*gPmC+%nre# z$y>~uX2h7T%4P5k?YYQ+O@#>qNCD%5m0gBX3_k0mt}bP0 Hl+XkKTDXz! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame3.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame3.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef2228370972cdf9fd4deec8f012db8e03d4ee6 GIT binary patch literal 1012 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M@Ub7srr_xVN(t{h|UTSby(QlbfAno6~jOHgn@fLy_it_ZoZp z>Ss;a_xR(PA4g4g*!=zXgRyqa>nhXA+jV>Y{N43#-M)SI-?vN2_8(vPeBWnhZp{M^ z3nXrRE3x9W-JW~Q~57crGEK5JYwDS&YogUGhZohuk(8!8v9Pzh|_7%$2Ddj|A$-IdzCv5{mloN{-935-CkJhz|->#`TK9*7u&aoE4CqU&iwkkn{Uhf zpC3H`{)pMi{;kbv_Tj5~5gPjW6eaAc|vLteCN5tD{N zq3Z8`1rS@@p|MkYCc~X=T~Am75*~S}F>GI}WXUKpW5*=U1G%d`{1{l()}=5N+}4^T gJgRgUg+LwK2~X*k^2(4TV76uOboFyt=akR{05bWVl>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame4.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame4.png new file mode 100644 index 0000000000000000000000000000000000000000..5e25ae6774a0402d202b136675b23323c1ebc5fa GIT binary patch literal 1009 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D1M_507srr_xVN(}=FW1IVEGv=d_m;v1(7A{>V1z+IQcyhKBLYr z8K)z8|K29+H_fcKPoF=|S2f2^-Q#ES&Cfq=s_q-dY@5g+!`IGlyen@1|6hL}Zm7>_ zyZ-v?!m9tx5?l`4AHE7YG5)yC6tHm%!|Ria7=UD}&wK~Q48~=zWA^j2E?|w&Px-|H zRA~_V{8z08gYJPU#mnje3{ed)t**a!1}eP9J=3m{=>n6_^__L{K!qFPPJH1MX%I`; zb?)nLkixG{%lsDrO}<>Z?tVK^;TmzHS|*^$Gu9RVwF4>KJK?1;$mEi_ufH#ZJE0=F zVf%T8efxIYKF|2?_0FpXzg#Y4CGD1lTG5%i|NefN{^NI_7TvV{_55vj<^R0;|99SM z-Fe*1^&!%}=%1?igUG|n9_(=!XMG@-Ja?|=1Ad0v+s@wk@muTzx98&ZhwE;d|K>jN zzm{{)zPB6Sv(+7o^8PS$%8vb+j5~5fPcbf7(P=En5VMWzDMP@OBQxLp2eZW-0)^9! z7_h0}VbF_iEn?8fdgQ~#Fnz6)C4-1*p&E0;>9B<|3|+Gn!-G4?2rhA{|uL!80)8BSRVz!lvI6;>1s;*b z3=DinK$vl=HlH*D1M>_|7srr_xVN(d^MV*fSZmjD-Vk}67;N)B)b>H8;=Wjo}%w_rI%*&tmeV!~9)bRM@ zj+M7R|J?Jk^7XE~s(a;iLRtsjvhEP8-OI9l|Ih2kcQdRH77|^+{b85l_I*IPbnyp) zH}noHZhI!@&iaDs46p0N0LEPmS8|GDLK^fA+zAlj1gds8Yj)g~KGN&NAKdq6zF)`p z;a+mBQpc>{%H=oTmgP@Bq(A?N>c2a`!nQrT`Kzjb-uF=ZqJNXP3v|EVe9!vj<2!e& zbGCh42I9s-R}aK9PD@=F_gGK-kJBaZ`|W>^*4?`A@bmxr#?$LjdY58J*lS8Dh3`6^$w#P9dGj-kYbz7MO7vJYD@<);T3K0RY;l Bp+f)w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame6.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame6.png new file mode 100644 index 0000000000000000000000000000000000000000..9081ae0545f3585622cd975b00eda77e449299e4 GIT binary patch literal 1005 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEa{HEjtmSN`?>!lvI6;>1s;*b z3=DinK$vl=HlH*D19QKpi(^Pd+}qjFc~OocEIT8GH)vivyiB3GNJ#TZqTos870Tk8 zb$=3=p6+7HJ|#;%WlpH^n^X8xq7 zU#n`n&iz+uV!FUoQ#U1m;hz2h-M-sGHm~RYkKWE2;mXIlfHh)m^1q)N4F97TUZs9B zKTx$vgF*K|mEvXf0EVcBmsZ!`J2Pf5UgMr=*9bJl=lae%c`gU;4RI&FaEdgDCG0x) z^*2c2SEptE3mCRATrORAza6M>jkr-Q6VUV->x%!{ffVkY@KP9La>?A+-xmTEzHarI z?*KG;+3T47{2*uOr~G08nrsmJ{8uf^3ETeG{V%hTE1!Nk_4}Lo+r>XWU*34Xp6|oG z_i`T{S%0jOxBNea`@^cl-~ziv-Ao@kHl91D@`1Y{_jX#|pGxi@txGOmPu%~e`!DO0 z{~KBA_PpKro~`akl=p{;Q+7Px!Vt5K>nTIPl_N8G81$lBix@Pr9{GH$2eY{stmrhB z#HxagVftDpO9m0sLN(@w(_sr`7`kRzOlCZgx;lW5!PR%pNrnfTLN(YM7O9;}VJNt% uHHFzBP&nO)VMmVWDaKJ_heROkXXG$ste^U!lvI6;>1s;*b z3=DinK$vl=HlH*D1M_T87srr_xVN(%^P~brSd1-&4==UgpPp2tuI_SZ(?s1f=hsiv z(#zj;Ab88})A@oApFTZ*o&QC4?DhRma({pQ#rL|Z;(MO_-ZC4xcA>fFpD%pA@3S+v z=7E-}@y7ctKJySu^e-d~U7mFpKXo#~eB z%z6;okQ%w-`;Q6S{~Rx^vv2=9kz%-7?q-{dpz7h3E6Vd}IU?_V+%+|@e4 zxnM>o_e_SE?Oa7n8flN5zWoQY#T^WV#f=zuJRL%=LF_m22WQ%mvv4FO#po7lh^!lvI6;>1s;*b z3=DinK$vl=HlH*D1M?hD7srr_xVN(dgJwBOuqdW8=^d@yBl5&gZKGH63YA}-dv9IZ z^FzVf`oE8HYUHlH|9{?cSpWDVhvxs-Z|~may{wIYxJj4uK;8cO6EAB1{hM;NZvSuP z?f+}@r9S+unJ2gN=l8`7TNvig*B5Cx&RWs)@aOWsl_t|yf4Fuds-dz-gF*Meo(Wgg z0~qwg9~5!kdp-Go^!E9T%NP~{HC?v4wqKt0K|HsEZJIsvnaQq<8H~?b*Vr{OU0_D>mBrV37alaM#lN0cXS8GHdI~ zr@IfnU}%S L)z4*}Q$iB}iAa{J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame9.png b/src/main/resources/assets/assemblyline/textures/models/slantedbelt/frame9.png new file mode 100644 index 0000000000000000000000000000000000000000..541e193fe32e9ad466e7cb51c417f5b9afe64329 GIT binary patch literal 1011 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 z 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 DK`~{P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame7.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame7.png new file mode 100644 index 0000000000000000000000000000000000000000..c195a322cfd8473bf8f49d9f8856abb9a1c685e5 GIT binary patch literal 49298 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 Mhcmv&`asOT0NT+^+W-In literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/assemblyline/textures/models/belt/frame8.png b/src/main/resources/assets/assemblyline/textures/models/belt/frame8.png new file mode 100644 index 0000000000000000000000000000000000000000..01741c1dafa846d00b571519375a834aba8baa63 GIT binary patch literal 49735 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