From e00be3615419b6c5052873985a8ede0197be7171 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Thu, 22 Dec 2022 17:22:45 +0100 Subject: [PATCH] feat: opensourced RP2 port --- .gitignore | 1 + build.gradle | 8 +- src/main/java/cofh/api/CoFHAPIProps.java | 8 + .../java/cofh/api/energy/EnergyStorage.java | 121 + .../cofh/api/energy/IEnergyConnection.java | 7 + .../cofh/api/energy/IEnergyContainerItem.java | 13 + .../java/cofh/api/energy/IEnergyHandler.java | 17 + .../java/cofh/api/energy/IEnergyProvider.java | 11 + .../java/cofh/api/energy/IEnergyReceiver.java | 11 + .../java/cofh/api/energy/IEnergyStorage.java | 11 + .../cofh/api/energy/IEnergyTransport.java | 34 + .../cofh/api/energy/ItemEnergyContainer.java | 88 + .../cofh/api/energy/TileEnergyHandler.java | 44 + src/main/java/com/eloraam/redpower/Flags.java | 6 + .../com/eloraam/redpower/RedPowerBase.java | 525 +++++ .../com/eloraam/redpower/RedPowerCompat.java | 129 ++ .../com/eloraam/redpower/RedPowerControl.java | 307 +++ .../com/eloraam/redpower/RedPowerCore.java | 108 + .../eloraam/redpower/RedPowerLighting.java | 216 ++ .../com/eloraam/redpower/RedPowerLogic.java | 313 +++ .../com/eloraam/redpower/RedPowerMachine.java | 1223 ++++++++++ .../eloraam/redpower/RedPowerNEIPlugin.java | 195 ++ .../com/eloraam/redpower/RedPowerWiring.java | 270 +++ .../com/eloraam/redpower/RedPowerWorld.java | 495 ++++ .../eloraam/redpower/base/BlockAppliance.java | 39 + .../com/eloraam/redpower/base/BlockMicro.java | 34 + .../eloraam/redpower/base/BlockNikolite.java | 10 + .../redpower/base/ContainerAdvBench.java | 442 ++++ .../redpower/base/ContainerAlloyFurnace.java | 115 + .../eloraam/redpower/base/ContainerBag.java | 107 + .../eloraam/redpower/base/ContainerBusId.java | 66 + .../eloraam/redpower/base/GuiAdvBench.java | 114 + .../redpower/base/GuiAlloyFurnace.java | 42 + .../com/eloraam/redpower/base/GuiBag.java | 36 + .../com/eloraam/redpower/base/GuiBusId.java | 76 + .../redpower/base/InventorySubCraft.java | 48 + .../com/eloraam/redpower/base/ItemBag.java | 185 ++ .../eloraam/redpower/base/ItemDrawplate.java | 18 + .../eloraam/redpower/base/ItemDyeIndigo.java | 31 + .../eloraam/redpower/base/ItemHandsaw.java | 25 + .../com/eloraam/redpower/base/ItemMicro.java | 276 +++ .../com/eloraam/redpower/base/ItemPlan.java | 74 + .../redpower/base/ItemScrewdriver.java | 105 + .../com/eloraam/redpower/base/RecipeBag.java | 66 + .../eloraam/redpower/base/RenderAdvBench.java | 79 + .../redpower/base/RenderAlloyFurnace.java | 111 + .../redpower/base/SlotAlloyFurnace.java | 45 + .../redpower/base/SlotCraftRefill.java | 133 ++ .../eloraam/redpower/base/TileAdvBench.java | 175 ++ .../redpower/base/TileAlloyFurnace.java | 285 +++ .../eloraam/redpower/base/TileAppliance.java | 83 + .../redpower/compat/BlockMachineCompat.java | 32 + .../redpower/compat/ItemMachineCompat.java | 72 + .../redpower/compat/RenderBlueEngine.java | 92 + .../redpower/compat/TileBlueEngine.java | 193 ++ .../redpower/compat/TileMachineCompat.java | 177 ++ .../redpower/control/BlockPeripheral.java | 42 + .../redpower/control/ContainerCPU.java | 106 + .../redpower/control/ContainerDisplay.java | 246 ++ .../com/eloraam/redpower/control/GuiCPU.java | 151 ++ .../eloraam/redpower/control/GuiDisplay.java | 124 + .../redpower/control/ItemBackplane.java | 108 + .../eloraam/redpower/control/ItemDisk.java | 92 + .../control/MicroPlacementRibbon.java | 26 + .../redpower/control/RenderBackplane.java | 109 + .../eloraam/redpower/control/RenderCPU.java | 81 + .../redpower/control/RenderDiskDrive.java | 93 + .../redpower/control/RenderDisplay.java | 81 + .../redpower/control/RenderIOExpander.java | 74 + .../redpower/control/RenderRibbon.java | 70 + .../redpower/control/TileBackplane.java | 132 ++ .../com/eloraam/redpower/control/TileCPU.java | 2028 ++++++++++++++++ .../redpower/control/TileDiskDrive.java | 609 +++++ .../eloraam/redpower/control/TileDisplay.java | 346 +++ .../redpower/control/TileIOExpander.java | 231 ++ .../com/eloraam/redpower/control/TileRAM.java | 91 + .../eloraam/redpower/control/TileRibbon.java | 23 + .../com/eloraam/redpower/core/AchieveLib.java | 94 + .../eloraam/redpower/core/BlockCoverable.java | 50 + .../eloraam/redpower/core/BlockExtended.java | 212 ++ .../redpower/core/BlockMultiblock.java | 106 + .../eloraam/redpower/core/BlockMultipart.java | 163 ++ .../redpower/core/BlockReplaceHelper.java | 72 + .../redpower/core/BluePowerConductor.java | 201 ++ .../redpower/core/BluePowerEndpoint.java | 44 + .../eloraam/redpower/core/BluePowerLib.java | 4 + .../com/eloraam/redpower/core/Config.java | 49 + .../com/eloraam/redpower/core/CoreEvents.java | 49 + .../com/eloraam/redpower/core/CoreLib.java | 337 +++ .../com/eloraam/redpower/core/CoverLib.java | 1374 +++++++++++ .../eloraam/redpower/core/CoverRecipe.java | 346 +++ .../eloraam/redpower/core/CoverRenderer.java | 546 +++++ .../com/eloraam/redpower/core/CraftLib.java | 138 ++ .../redpower/core/CreativeExtraTabs.java | 36 + .../com/eloraam/redpower/core/DiskLib.java | 27 + .../redpower/core/EntityCustomDiggingFX.java | 73 + .../com/eloraam/redpower/core/EnvironLib.java | 32 + .../redpower/core/FakePlayerNetHandler.java | 12 + .../eloraam/redpower/core/FluidBuffer.java | 78 + .../com/eloraam/redpower/core/FractalLib.java | 220 ++ .../com/eloraam/redpower/core/FrameLib.java | 144 ++ .../eloraam/redpower/core/GuiExtended.java | 13 + .../com/eloraam/redpower/core/GuiWidget.java | 21 + .../eloraam/redpower/core/IBlockHardness.java | 5 + .../redpower/core/IBluePowerConnectable.java | 5 + .../eloraam/redpower/core/IChargeable.java | 4 + .../eloraam/redpower/core/IConnectable.java | 9 + .../com/eloraam/redpower/core/ICoverable.java | 13 + .../com/eloraam/redpower/core/IFrameLink.java | 11 + .../eloraam/redpower/core/IFrameSupport.java | 16 + .../redpower/core/IHandleGuiEvent.java | 5 + .../redpower/core/IMicroPlacement.java | 15 + .../eloraam/redpower/core/IMultiblock.java | 12 + .../com/eloraam/redpower/core/IMultipart.java | 12 + .../com/eloraam/redpower/core/IPaintable.java | 5 + .../redpower/core/IPipeConnectable.java | 11 + .../redpower/core/IRedPowerConnectable.java | 5 + .../redpower/core/IRedPowerWiring.java | 9 + .../redpower/core/IRedbusConnectable.java | 49 + .../com/eloraam/redpower/core/IRotatable.java | 9 + .../redpower/core/ITubeConnectable.java | 15 + .../com/eloraam/redpower/core/ITubeFlow.java | 7 + .../eloraam/redpower/core/ITubeRequest.java | 5 + .../com/eloraam/redpower/core/IWiring.java | 7 + .../eloraam/redpower/core/ItemExtended.java | 67 + .../redpower/core/ItemPartialCraft.java | 36 + .../com/eloraam/redpower/core/ItemParts.java | 70 + .../eloraam/redpower/core/ItemTextured.java | 9 + .../com/eloraam/redpower/core/MachineLib.java | 588 +++++ .../com/eloraam/redpower/core/MathLib.java | 43 + .../com/eloraam/redpower/core/Matrix3.java | 106 + .../com/eloraam/redpower/core/MultiLib.java | 50 + .../com/eloraam/redpower/core/OreStack.java | 16 + .../eloraam/redpower/core/PacketGuiEvent.java | 59 + .../eloraam/redpower/core/PacketHandler.java | 33 + .../com/eloraam/redpower/core/PipeLib.java | 256 ++ .../com/eloraam/redpower/core/PowerLib.java | 18 + .../java/com/eloraam/redpower/core/Quat.java | 103 + .../eloraam/redpower/core/RedPowerLib.java | 903 ++++++++ .../com/eloraam/redpower/core/RedbusLib.java | 44 + .../com/eloraam/redpower/core/ReflectLib.java | 74 + .../eloraam/redpower/core/RenderContext.java | 1228 ++++++++++ .../eloraam/redpower/core/RenderCovers.java | 20 + .../redpower/core/RenderCustomBlock.java | 214 ++ .../eloraam/redpower/core/RenderEvents.java | 4 + .../redpower/core/RenderHighlight.java | 298 +++ .../com/eloraam/redpower/core/RenderLib.java | 264 +++ .../eloraam/redpower/core/RenderModel.java | 257 ++ .../redpower/core/RenderSimpleCovered.java | 43 + .../com/eloraam/redpower/core/SlotLocked.java | 27 + .../com/eloraam/redpower/core/TagFile.java | 456 ++++ .../com/eloraam/redpower/core/TexVertex.java | 46 + .../eloraam/redpower/core/TileCoverable.java | 241 ++ .../eloraam/redpower/core/TileCovered.java | 214 ++ .../eloraam/redpower/core/TileExtended.java | 177 ++ .../eloraam/redpower/core/TileMultiblock.java | 68 + .../eloraam/redpower/core/TileMultipart.java | 49 + .../com/eloraam/redpower/core/TubeBuffer.java | 119 + .../com/eloraam/redpower/core/TubeFlow.java | 142 ++ .../com/eloraam/redpower/core/TubeItem.java | 83 + .../com/eloraam/redpower/core/TubeLib.java | 329 +++ .../com/eloraam/redpower/core/Vector3.java | 106 + .../eloraam/redpower/core/WirePathfinder.java | 80 + .../com/eloraam/redpower/core/WorldCoord.java | 188 ++ .../eloraam/redpower/lighting/BlockLamp.java | 56 + .../redpower/lighting/BlockShapedLamp.java | 93 + .../eloraam/redpower/lighting/ItemLamp.java | 15 + .../eloraam/redpower/lighting/RenderLamp.java | 140 ++ .../redpower/lighting/RenderShapedLamp.java | 153 ++ .../eloraam/redpower/lighting/TileLamp.java | 132 ++ .../redpower/lighting/TileShapedLamp.java | 175 ++ .../eloraam/redpower/logic/BlockLogic.java | 41 + .../redpower/logic/ContainerCounter.java | 112 + .../redpower/logic/ContainerTimer.java | 77 + .../eloraam/redpower/logic/GuiCounter.java | 188 ++ .../com/eloraam/redpower/logic/GuiTimer.java | 97 + .../eloraam/redpower/logic/IPointerTile.java | 9 + .../com/eloraam/redpower/logic/ItemLogic.java | 119 + .../eloraam/redpower/logic/RenderLogic.java | 269 +++ .../redpower/logic/RenderLogicAdv.java | 94 + .../redpower/logic/RenderLogicArray.java | 191 ++ .../redpower/logic/RenderLogicPointer.java | 177 ++ .../redpower/logic/RenderLogicSimple.java | 601 +++++ .../redpower/logic/RenderLogicStorage.java | 107 + .../com/eloraam/redpower/logic/TileLogic.java | 359 +++ .../eloraam/redpower/logic/TileLogicAdv.java | 336 +++ .../redpower/logic/TileLogicArray.java | 183 ++ .../redpower/logic/TileLogicPointer.java | 436 ++++ .../redpower/logic/TileLogicSimple.java | 805 +++++++ .../redpower/logic/TileLogicStorage.java | 304 +++ .../eloraam/redpower/machine/BlockFrame.java | 38 + .../redpower/machine/BlockMachine.java | 64 + .../redpower/machine/BlockMachinePanel.java | 39 + .../redpower/machine/ContainerAssemble.java | 137 ++ .../redpower/machine/ContainerBatteryBox.java | 105 + .../machine/ContainerBlueAlloyFurnace.java | 119 + .../machine/ContainerBlueFurnace.java | 113 + .../machine/ContainerBufferChest.java | 70 + .../machine/ContainerChargingBench.java | 102 + .../redpower/machine/ContainerDeploy.java | 70 + .../redpower/machine/ContainerEject.java | 70 + .../redpower/machine/ContainerFilter.java | 108 + .../redpower/machine/ContainerItemDetect.java | 109 + .../redpower/machine/ContainerManager.java | 153 ++ .../redpower/machine/ContainerRegulator.java | 124 + .../redpower/machine/ContainerRetriever.java | 149 ++ .../redpower/machine/ContainerSorter.java | 185 ++ .../machine/ContainerWindTurbine.java | 94 + .../eloraam/redpower/machine/GuiAssemble.java | 114 + .../redpower/machine/GuiBatteryBox.java | 58 + .../redpower/machine/GuiBlueAlloyFurnace.java | 49 + .../redpower/machine/GuiBlueFurnace.java | 49 + .../redpower/machine/GuiBufferChest.java | 35 + .../redpower/machine/GuiChargingBench.java | 54 + .../eloraam/redpower/machine/GuiDeploy.java | 34 + .../eloraam/redpower/machine/GuiEject.java | 36 + .../eloraam/redpower/machine/GuiFilter.java | 100 + .../redpower/machine/GuiItemDetect.java | 66 + .../eloraam/redpower/machine/GuiManager.java | 164 ++ .../redpower/machine/GuiRegulator.java | 130 ++ .../redpower/machine/GuiRetriever.java | 142 ++ .../eloraam/redpower/machine/GuiSorter.java | 211 ++ .../redpower/machine/GuiWindTurbine.java | 38 + .../eloraam/redpower/machine/ItemBattery.java | 44 + .../redpower/machine/ItemMachinePanel.java | 74 + .../redpower/machine/ItemSonicDriver.java | 32 + .../redpower/machine/ItemVoltmeter.java | 55 + .../redpower/machine/ItemWindmill.java | 49 + .../redpower/machine/MicroPlacementTube.java | 93 + .../eloraam/redpower/machine/RenderAccel.java | 152 ++ .../redpower/machine/RenderBatteryBox.java | 69 + .../machine/RenderBlueAlloyFurnace.java | 79 + .../redpower/machine/RenderBlueFurnace.java | 79 + .../redpower/machine/RenderBreaker.java | 74 + .../redpower/machine/RenderBufferChest.java | 80 + .../redpower/machine/RenderChargingBench.java | 90 + .../eloraam/redpower/machine/RenderFrame.java | 102 + .../redpower/machine/RenderFrameMoving.java | 119 + .../machine/RenderFrameRedstoneTube.java | 188 ++ .../redpower/machine/RenderFrameTube.java | 186 ++ .../eloraam/redpower/machine/RenderGrate.java | 91 + .../redpower/machine/RenderMachine.java | 347 +++ .../eloraam/redpower/machine/RenderMotor.java | 87 + .../eloraam/redpower/machine/RenderPipe.java | 241 ++ .../eloraam/redpower/machine/RenderPump.java | 94 + .../redpower/machine/RenderRedstoneTube.java | 136 ++ .../redpower/machine/RenderSolarPanel.java | 78 + .../redpower/machine/RenderThermopile.java | 76 + .../redpower/machine/RenderTransformer.java | 64 + .../eloraam/redpower/machine/RenderTube.java | 356 +++ .../redpower/machine/RenderWindTurbine.java | 145 ++ .../eloraam/redpower/machine/TileAccel.java | 286 +++ .../redpower/machine/TileAssemble.java | 357 +++ .../redpower/machine/TileBatteryBox.java | 374 +++ .../machine/TileBlueAlloyFurnace.java | 297 +++ .../redpower/machine/TileBlueFurnace.java | 310 +++ .../eloraam/redpower/machine/TileBreaker.java | 185 ++ .../redpower/machine/TileBufferChest.java | 229 ++ .../redpower/machine/TileChargingBench.java | 287 +++ .../eloraam/redpower/machine/TileDeploy.java | 201 ++ .../redpower/machine/TileDeployBase.java | 178 ++ .../eloraam/redpower/machine/TileEject.java | 49 + .../redpower/machine/TileEjectBase.java | 240 ++ .../eloraam/redpower/machine/TileFilter.java | 252 ++ .../eloraam/redpower/machine/TileFrame.java | 318 +++ .../redpower/machine/TileFrameMoving.java | 432 ++++ .../machine/TileFrameRedstoneTube.java | 148 ++ .../redpower/machine/TileFrameTube.java | 150 ++ .../eloraam/redpower/machine/TileGrate.java | 421 ++++ .../eloraam/redpower/machine/TileIgniter.java | 83 + .../redpower/machine/TileItemDetect.java | 336 +++ .../eloraam/redpower/machine/TileMachine.java | 155 ++ .../redpower/machine/TileMachinePanel.java | 192 ++ .../eloraam/redpower/machine/TileMagTube.java | 42 + .../eloraam/redpower/machine/TileManager.java | 626 +++++ .../eloraam/redpower/machine/TileMotor.java | 452 ++++ .../eloraam/redpower/machine/TilePipe.java | 295 +++ .../eloraam/redpower/machine/TilePump.java | 219 ++ .../redpower/machine/TileRedstoneTube.java | 163 ++ .../redpower/machine/TileRegulator.java | 440 ++++ .../eloraam/redpower/machine/TileRelay.java | 75 + .../redpower/machine/TileRestrictTube.java | 13 + .../redpower/machine/TileRetriever.java | 309 +++ .../redpower/machine/TileSolarPanel.java | 91 + .../eloraam/redpower/machine/TileSorter.java | 791 +++++++ .../eloraam/redpower/machine/TileSortron.java | 469 ++++ .../redpower/machine/TileThermopile.java | 177 ++ .../redpower/machine/TileTransformer.java | 190 ++ .../redpower/machine/TileTranspose.java | 346 +++ .../eloraam/redpower/machine/TileTube.java | 333 +++ .../redpower/machine/TileWindTurbine.java | 572 +++++ .../nei/AlloyFurnaceOverlayHandler.java | 24 + .../nei/AlloyFurnaceRecipeHandler.java | 173 ++ .../eloraam/redpower/nei/ComboGenerator.java | 90 + .../redpower/nei/MicroRecipeHandler.java | 438 ++++ .../redpower/wiring/MicroPlacementJacket.java | 153 ++ .../redpower/wiring/MicroPlacementWire.java | 157 ++ .../redpower/wiring/RenderRedwire.java | 497 ++++ .../eloraam/redpower/wiring/RenderWiring.java | 605 +++++ .../eloraam/redpower/wiring/TileBluewire.java | 169 ++ .../eloraam/redpower/wiring/TileCable.java | 75 + .../redpower/wiring/TileInsulatedWire.java | 93 + .../eloraam/redpower/wiring/TileRedwire.java | 133 ++ .../eloraam/redpower/wiring/TileWiring.java | 508 ++++ .../redpower/world/BlockBrickMossifier.java | 94 + .../redpower/world/BlockCobbleMossifier.java | 66 + .../redpower/world/BlockCustomCrops.java | 227 ++ .../redpower/world/BlockCustomFlower.java | 99 + .../redpower/world/BlockCustomLeaves.java | 138 ++ .../redpower/world/BlockCustomLog.java | 54 + .../redpower/world/BlockCustomOre.java | 103 + .../redpower/world/BlockCustomStone.java | 122 + .../eloraam/redpower/world/BlockStorage.java | 48 + .../redpower/world/ContainerSeedBag.java | 110 + .../world/EnchantmentDisjunction.java | 37 + .../redpower/world/EnchantmentVorpal.java | 43 + .../eloraam/redpower/world/GuiSeedBag.java | 36 + .../eloraam/redpower/world/ItemAthame.java | 48 + .../eloraam/redpower/world/ItemCustomAxe.java | 20 + .../redpower/world/ItemCustomFlower.java | 51 + .../eloraam/redpower/world/ItemCustomHoe.java | 20 + .../eloraam/redpower/world/ItemCustomOre.java | 40 + .../redpower/world/ItemCustomPickaxe.java | 20 + .../redpower/world/ItemCustomSeeds.java | 63 + .../redpower/world/ItemCustomShovel.java | 20 + .../redpower/world/ItemCustomStone.java | 42 + .../redpower/world/ItemCustomSword.java | 23 + .../redpower/world/ItemPaintBrush.java | 53 + .../eloraam/redpower/world/ItemPaintCan.java | 36 + .../eloraam/redpower/world/ItemSeedBag.java | 356 +++ .../eloraam/redpower/world/ItemSickle.java | 95 + .../eloraam/redpower/world/ItemStorage.java | 44 + .../eloraam/redpower/world/ItemWoolCard.java | 21 + .../eloraam/redpower/world/WorldEvents.java | 95 + .../redpower/world/WorldGenCustomOre.java | 71 + .../redpower/world/WorldGenHandler.java | 131 ++ .../redpower/world/WorldGenMarble.java | 117 + .../redpower/world/WorldGenRubberTree.java | 168 ++ .../redpower/world/WorldGenVolcano.java | 141 ++ .../resources/assets/rpbase/lang/en_US.lang | 147 ++ .../resources/assets/rpbase/lang/ru_RU.lang | 147 ++ src/main/resources/assets/rpbase/rpbanner.png | Bin 0 -> 19187 bytes .../textures/blocks/alloyFurnaceFront.png | Bin 0 -> 684 bytes .../textures/blocks/alloyFurnaceFrontOn.png | Bin 0 -> 708 bytes .../textures/blocks/alloyFurnaceSide.png | Bin 0 -> 570 bytes .../textures/blocks/alloyFurnaceVert.png | Bin 0 -> 481 bytes .../textures/blocks/projectTableBottom.png | Bin 0 -> 706 bytes .../textures/blocks/projectTableFront.png | Bin 0 -> 736 bytes .../textures/blocks/projectTableSide.png | Bin 0 -> 757 bytes .../textures/blocks/projectTableTop.png | Bin 0 -> 545 bytes .../assets/rpbase/textures/gui/advbench.png | Bin 0 -> 1595 bytes .../rpbase/textures/gui/afurnacegui.png | Bin 0 -> 1572 bytes .../assets/rpbase/textures/gui/baggui.png | Bin 0 -> 1248 bytes .../assets/rpbase/textures/gui/idgui.png | Bin 0 -> 5272 bytes .../assets/rpbase/textures/items/bag/0.png | Bin 0 -> 628 bytes .../assets/rpbase/textures/items/bag/1.png | Bin 0 -> 584 bytes .../assets/rpbase/textures/items/bag/10.png | Bin 0 -> 559 bytes .../assets/rpbase/textures/items/bag/11.png | Bin 0 -> 480 bytes .../assets/rpbase/textures/items/bag/12.png | Bin 0 -> 492 bytes .../assets/rpbase/textures/items/bag/13.png | Bin 0 -> 469 bytes .../assets/rpbase/textures/items/bag/14.png | Bin 0 -> 474 bytes .../assets/rpbase/textures/items/bag/15.png | Bin 0 -> 481 bytes .../assets/rpbase/textures/items/bag/2.png | Bin 0 -> 585 bytes .../assets/rpbase/textures/items/bag/3.png | Bin 0 -> 598 bytes .../assets/rpbase/textures/items/bag/4.png | Bin 0 -> 563 bytes .../assets/rpbase/textures/items/bag/5.png | Bin 0 -> 492 bytes .../assets/rpbase/textures/items/bag/6.png | Bin 0 -> 614 bytes .../assets/rpbase/textures/items/bag/7.png | Bin 0 -> 538 bytes .../assets/rpbase/textures/items/bag/8.png | Bin 0 -> 578 bytes .../assets/rpbase/textures/items/bag/9.png | Bin 0 -> 562 bytes .../rpbase/textures/items/bouleSilicon.png | Bin 0 -> 548 bytes .../assets/rpbase/textures/items/btMotor.png | Bin 0 -> 485 bytes .../assets/rpbase/textures/items/canvas.png | Bin 0 -> 431 bytes .../rpbase/textures/items/copperCoil.png | Bin 0 -> 616 bytes .../rpbase/textures/items/copperIngot.png | Bin 0 -> 292 bytes .../textures/items/diamondDrawplate.png | Bin 0 -> 385 bytes .../rpbase/textures/items/dustSilver.png | Bin 0 -> 401 bytes .../rpbase/textures/items/dustTungsten.png | Bin 0 -> 261 bytes .../rpbase/textures/items/dyeIndigo.png | Bin 0 -> 285 bytes .../rpbase/textures/items/fineCopper.png | Bin 0 -> 465 bytes .../assets/rpbase/textures/items/fineIron.png | Bin 0 -> 462 bytes .../rpbase/textures/items/greenSapphire.png | Bin 0 -> 487 bytes .../rpbase/textures/items/ingotBlue.png | Bin 0 -> 475 bytes .../rpbase/textures/items/ingotBrass.png | Bin 0 -> 303 bytes .../assets/rpbase/textures/items/ingotRed.png | Bin 0 -> 438 bytes .../rpbase/textures/items/ingotTungsten.png | Bin 0 -> 431 bytes .../assets/rpbase/textures/items/lumar/0.png | Bin 0 -> 308 bytes .../assets/rpbase/textures/items/lumar/1.png | Bin 0 -> 353 bytes .../assets/rpbase/textures/items/lumar/10.png | Bin 0 -> 359 bytes .../assets/rpbase/textures/items/lumar/11.png | Bin 0 -> 357 bytes .../assets/rpbase/textures/items/lumar/12.png | Bin 0 -> 348 bytes .../assets/rpbase/textures/items/lumar/13.png | Bin 0 -> 350 bytes .../assets/rpbase/textures/items/lumar/14.png | Bin 0 -> 355 bytes .../assets/rpbase/textures/items/lumar/15.png | Bin 0 -> 322 bytes .../assets/rpbase/textures/items/lumar/2.png | Bin 0 -> 364 bytes .../assets/rpbase/textures/items/lumar/3.png | Bin 0 -> 364 bytes .../assets/rpbase/textures/items/lumar/4.png | Bin 0 -> 333 bytes .../assets/rpbase/textures/items/lumar/5.png | Bin 0 -> 355 bytes .../assets/rpbase/textures/items/lumar/6.png | Bin 0 -> 364 bytes .../assets/rpbase/textures/items/lumar/7.png | Bin 0 -> 341 bytes .../assets/rpbase/textures/items/lumar/8.png | Bin 0 -> 345 bytes .../assets/rpbase/textures/items/lumar/9.png | Bin 0 -> 345 bytes .../assets/rpbase/textures/items/nikolite.png | Bin 0 -> 273 bytes .../rpbase/textures/items/nuggetCopper.png | Bin 0 -> 256 bytes .../rpbase/textures/items/nuggetIron.png | Bin 0 -> 251 bytes .../rpbase/textures/items/nuggetSilver.png | Bin 0 -> 256 bytes .../rpbase/textures/items/nuggetTin.png | Bin 0 -> 258 bytes .../rpbase/textures/items/nuggetTungsten.png | Bin 0 -> 237 bytes .../assets/rpbase/textures/items/paintCan.png | Bin 0 -> 311 bytes .../rpbase/textures/items/planBlank.png | Bin 0 -> 363 bytes .../assets/rpbase/textures/items/planFull.png | Bin 0 -> 476 bytes .../assets/rpbase/textures/items/ruby.png | Bin 0 -> 486 bytes .../assets/rpbase/textures/items/sapphire.png | Bin 0 -> 510 bytes .../rpbase/textures/items/screwdriver.png | Bin 0 -> 201 bytes .../rpbase/textures/items/silverIngot.png | Bin 0 -> 291 bytes .../assets/rpbase/textures/items/tinIngot.png | Bin 0 -> 276 bytes .../assets/rpbase/textures/items/tinPlate.png | Bin 0 -> 330 bytes .../rpbase/textures/items/waferBlue.png | Bin 0 -> 617 bytes .../assets/rpbase/textures/items/waferRed.png | Bin 0 -> 582 bytes .../rpbase/textures/items/waferSilicon.png | Bin 0 -> 507 bytes .../resources/assets/rpcompat/lang/en_US.lang | 4 + .../resources/assets/rpcompat/lang/ru_RU.lang | 4 + .../assets/rpcompat/models/btengine1.obj | 125 + .../assets/rpcompat/models/btengine2.obj | 23 + .../assets/rpcompat/models/btengine3.obj | 107 + .../assets/rpcompat/models/compat1.png | Bin 0 -> 6084 bytes .../textures/items/densePlateTungsten.png | Bin 0 -> 278 bytes .../assets/rpcompat/textures/items/gear.png | Bin 0 -> 555 bytes .../assets/rpcontrol/forth/redforth.img | Bin 0 -> 5888 bytes .../assets/rpcontrol/forth/redforthxp.img | Bin 0 -> 6912 bytes .../assets/rpcontrol/forth/rpcboot.bin | Bin 0 -> 82 bytes .../assets/rpcontrol/lang/en_US.lang | 18 + .../assets/rpcontrol/lang/ru_RU.lang | 18 + .../assets/rpcontrol/models/modem.obj | 470 ++++ .../assets/rpcontrol/models/modem.png | Bin 0 -> 3225 bytes .../textures/blocks/backplaneFace.png | Bin 0 -> 127 bytes .../textures/blocks/backplaneSide.png | Bin 0 -> 149 bytes .../textures/blocks/backplaneTop.png | Bin 0 -> 602 bytes .../rpcontrol/textures/blocks/cpuFront.png | Bin 0 -> 712 bytes .../textures/blocks/diskDriveFront.png | Bin 0 -> 546 bytes .../textures/blocks/diskDriveFrontFull.png | Bin 0 -> 584 bytes .../textures/blocks/diskDriveFrontOn.png | Bin 0 -> 593 bytes .../textures/blocks/diskDriveSide.png | Bin 0 -> 707 bytes .../textures/blocks/diskDriveTop.png | Bin 0 -> 662 bytes .../textures/blocks/displayFront.png | Bin 0 -> 561 bytes .../textures/blocks/peripheralBack.png | Bin 0 -> 725 bytes .../textures/blocks/peripheralBottom.png | Bin 0 -> 461 bytes .../textures/blocks/peripheralSide.png | Bin 0 -> 690 bytes .../textures/blocks/peripheralTop.png | Bin 0 -> 719 bytes .../rpcontrol/textures/blocks/ram8kFace.png | Bin 0 -> 494 bytes .../rpcontrol/textures/blocks/ram8kSide.png | Bin 0 -> 452 bytes .../rpcontrol/textures/blocks/ram8kTop.png | Bin 0 -> 356 bytes .../rpcontrol/textures/blocks/ribbonFace.png | Bin 0 -> 177 bytes .../rpcontrol/textures/blocks/ribbonTop.png | Bin 0 -> 424 bytes .../assets/rpcontrol/textures/gui/cpugui.png | Bin 0 -> 7034 bytes .../rpcontrol/textures/gui/displaygui.png | Bin 0 -> 4507 bytes .../assets/rpcontrol/textures/items/disk.png | Bin 0 -> 331 bytes .../rpcontrol/textures/items/diskForth.png | Bin 0 -> 350 bytes .../textures/items/diskForthExtended.png | Bin 0 -> 354 bytes src/main/resources/assets/rpcore/default.cfg | 37 + .../resources/assets/rpcore/lang/en_US.lang | 2055 ++++++++++++++++ .../resources/assets/rpcore/lang/ru_RU.lang | 2059 +++++++++++++++++ .../assets/rpcore/textures/blocks/missing.png | Bin 0 -> 89 bytes .../assets/rplighting/lang/en_US.lang | 103 + .../assets/rplighting/lang/ru_RU.lang | 103 + .../assets/rplighting/models/shlamp.png | Bin 0 -> 2715 bytes .../assets/rplighting/models/shlamp1.obj | 112 + .../assets/rplighting/models/shlamp2.obj | 170 ++ .../rplighting/textures/blocks/lampOff/0.png | Bin 0 -> 671 bytes .../rplighting/textures/blocks/lampOff/1.png | Bin 0 -> 568 bytes .../rplighting/textures/blocks/lampOff/10.png | Bin 0 -> 546 bytes .../rplighting/textures/blocks/lampOff/11.png | Bin 0 -> 528 bytes .../rplighting/textures/blocks/lampOff/12.png | Bin 0 -> 466 bytes .../rplighting/textures/blocks/lampOff/13.png | Bin 0 -> 486 bytes .../rplighting/textures/blocks/lampOff/14.png | Bin 0 -> 497 bytes .../rplighting/textures/blocks/lampOff/15.png | Bin 0 -> 395 bytes .../rplighting/textures/blocks/lampOff/2.png | Bin 0 -> 572 bytes .../rplighting/textures/blocks/lampOff/3.png | Bin 0 -> 609 bytes .../rplighting/textures/blocks/lampOff/4.png | Bin 0 -> 561 bytes .../rplighting/textures/blocks/lampOff/5.png | Bin 0 -> 600 bytes .../rplighting/textures/blocks/lampOff/6.png | Bin 0 -> 604 bytes .../rplighting/textures/blocks/lampOff/7.png | Bin 0 -> 489 bytes .../rplighting/textures/blocks/lampOff/8.png | Bin 0 -> 550 bytes .../rplighting/textures/blocks/lampOff/9.png | Bin 0 -> 513 bytes .../rplighting/textures/blocks/lampOn/0.png | Bin 0 -> 671 bytes .../rplighting/textures/blocks/lampOn/1.png | Bin 0 -> 555 bytes .../rplighting/textures/blocks/lampOn/10.png | Bin 0 -> 546 bytes .../rplighting/textures/blocks/lampOn/11.png | Bin 0 -> 507 bytes .../rplighting/textures/blocks/lampOn/12.png | Bin 0 -> 452 bytes .../rplighting/textures/blocks/lampOn/13.png | Bin 0 -> 450 bytes .../rplighting/textures/blocks/lampOn/14.png | Bin 0 -> 485 bytes .../rplighting/textures/blocks/lampOn/15.png | Bin 0 -> 395 bytes .../rplighting/textures/blocks/lampOn/2.png | Bin 0 -> 570 bytes .../rplighting/textures/blocks/lampOn/3.png | Bin 0 -> 602 bytes .../rplighting/textures/blocks/lampOn/4.png | Bin 0 -> 533 bytes .../rplighting/textures/blocks/lampOn/5.png | Bin 0 -> 556 bytes .../rplighting/textures/blocks/lampOn/6.png | Bin 0 -> 605 bytes .../rplighting/textures/blocks/lampOn/7.png | Bin 0 -> 489 bytes .../rplighting/textures/blocks/lampOn/8.png | Bin 0 -> 550 bytes .../rplighting/textures/blocks/lampOn/9.png | Bin 0 -> 472 bytes .../textures/blocks/out/line0/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line0/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line1/0.png | Bin 0 -> 671 bytes .../textures/blocks/out/line1/1.png | Bin 0 -> 568 bytes .../textures/blocks/out/line1/10.png | Bin 0 -> 546 bytes .../textures/blocks/out/line1/11.png | Bin 0 -> 528 bytes .../textures/blocks/out/line1/12.png | Bin 0 -> 466 bytes .../textures/blocks/out/line1/13.png | Bin 0 -> 486 bytes .../textures/blocks/out/line1/14.png | Bin 0 -> 497 bytes .../textures/blocks/out/line1/15.png | Bin 0 -> 395 bytes .../textures/blocks/out/line1/2.png | Bin 0 -> 572 bytes .../textures/blocks/out/line1/3.png | Bin 0 -> 609 bytes .../textures/blocks/out/line1/4.png | Bin 0 -> 561 bytes .../textures/blocks/out/line1/5.png | Bin 0 -> 600 bytes .../textures/blocks/out/line1/6.png | Bin 0 -> 604 bytes .../textures/blocks/out/line1/7.png | Bin 0 -> 489 bytes .../textures/blocks/out/line1/8.png | Bin 0 -> 550 bytes .../textures/blocks/out/line1/9.png | Bin 0 -> 513 bytes .../textures/blocks/out/line10/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line10/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line11/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line12/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line13/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line14/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line15/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line2/0.png | Bin 0 -> 671 bytes .../textures/blocks/out/line2/1.png | Bin 0 -> 555 bytes .../textures/blocks/out/line2/10.png | Bin 0 -> 546 bytes .../textures/blocks/out/line2/11.png | Bin 0 -> 507 bytes .../textures/blocks/out/line2/12.png | Bin 0 -> 452 bytes .../textures/blocks/out/line2/13.png | Bin 0 -> 450 bytes .../textures/blocks/out/line2/14.png | Bin 0 -> 485 bytes .../textures/blocks/out/line2/15.png | Bin 0 -> 395 bytes .../textures/blocks/out/line2/2.png | Bin 0 -> 570 bytes .../textures/blocks/out/line2/3.png | Bin 0 -> 602 bytes .../textures/blocks/out/line2/4.png | Bin 0 -> 533 bytes .../textures/blocks/out/line2/5.png | Bin 0 -> 556 bytes .../textures/blocks/out/line2/6.png | Bin 0 -> 605 bytes .../textures/blocks/out/line2/7.png | Bin 0 -> 489 bytes .../textures/blocks/out/line2/8.png | Bin 0 -> 550 bytes .../textures/blocks/out/line2/9.png | Bin 0 -> 472 bytes .../textures/blocks/out/line3/0.png | Bin 0 -> 427 bytes .../textures/blocks/out/line3/1.png | Bin 0 -> 352 bytes .../textures/blocks/out/line3/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/2.png | Bin 0 -> 272 bytes .../textures/blocks/out/line3/3.png | Bin 0 -> 341 bytes .../textures/blocks/out/line3/4.png | Bin 0 -> 229 bytes .../textures/blocks/out/line3/5.png | Bin 0 -> 304 bytes .../textures/blocks/out/line3/6.png | Bin 0 -> 176 bytes .../textures/blocks/out/line3/7.png | Bin 0 -> 195 bytes .../textures/blocks/out/line3/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line3/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line4/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line5/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line6/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line7/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line8/9.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/0.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/1.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/10.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/11.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/12.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/13.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/14.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/15.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/2.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/3.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/4.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/5.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/6.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/7.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/8.png | Bin 0 -> 89 bytes .../textures/blocks/out/line9/9.png | Bin 0 -> 89 bytes .../resources/assets/rplogic/lang/en_US.lang | 36 + .../resources/assets/rplogic/lang/ru_RU.lang | 36 + .../assets/rplogic/models/arraycells.obj | 608 +++++ .../assets/rplogic/models/arraytex.png | Bin 0 -> 7208 bytes .../assets/rplogic/models/busxcvr.obj | 1360 +++++++++++ .../rplogic/textures/blocks/logic1/0.png | Bin 0 -> 271 bytes .../rplogic/textures/blocks/logic1/1.png | Bin 0 -> 128 bytes .../rplogic/textures/blocks/logic1/10.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/100.png | Bin 0 -> 524 bytes .../rplogic/textures/blocks/logic1/101.png | Bin 0 -> 536 bytes .../rplogic/textures/blocks/logic1/102.png | Bin 0 -> 536 bytes .../rplogic/textures/blocks/logic1/103.png | Bin 0 -> 532 bytes .../rplogic/textures/blocks/logic1/104.png | Bin 0 -> 539 bytes .../rplogic/textures/blocks/logic1/105.png | Bin 0 -> 537 bytes .../rplogic/textures/blocks/logic1/106.png | Bin 0 -> 541 bytes .../rplogic/textures/blocks/logic1/107.png | Bin 0 -> 531 bytes .../rplogic/textures/blocks/logic1/108.png | Bin 0 -> 537 bytes .../rplogic/textures/blocks/logic1/109.png | Bin 0 -> 534 bytes .../rplogic/textures/blocks/logic1/11.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/110.png | Bin 0 -> 534 bytes .../rplogic/textures/blocks/logic1/111.png | Bin 0 -> 513 bytes .../rplogic/textures/blocks/logic1/112.png | Bin 0 -> 508 bytes .../rplogic/textures/blocks/logic1/113.png | Bin 0 -> 517 bytes .../rplogic/textures/blocks/logic1/114.png | Bin 0 -> 531 bytes .../rplogic/textures/blocks/logic1/115.png | Bin 0 -> 526 bytes .../rplogic/textures/blocks/logic1/116.png | Bin 0 -> 524 bytes .../rplogic/textures/blocks/logic1/117.png | Bin 0 -> 529 bytes .../rplogic/textures/blocks/logic1/118.png | Bin 0 -> 532 bytes .../rplogic/textures/blocks/logic1/119.png | Bin 0 -> 527 bytes .../rplogic/textures/blocks/logic1/12.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/120.png | Bin 0 -> 532 bytes .../rplogic/textures/blocks/logic1/121.png | Bin 0 -> 527 bytes .../rplogic/textures/blocks/logic1/122.png | Bin 0 -> 533 bytes .../rplogic/textures/blocks/logic1/123.png | Bin 0 -> 526 bytes .../rplogic/textures/blocks/logic1/124.png | Bin 0 -> 532 bytes .../rplogic/textures/blocks/logic1/125.png | Bin 0 -> 523 bytes .../rplogic/textures/blocks/logic1/126.png | Bin 0 -> 523 bytes .../rplogic/textures/blocks/logic1/127.png | Bin 0 -> 509 bytes .../rplogic/textures/blocks/logic1/128.png | Bin 0 -> 459 bytes .../rplogic/textures/blocks/logic1/129.png | Bin 0 -> 465 bytes .../rplogic/textures/blocks/logic1/13.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/130.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/131.png | Bin 0 -> 459 bytes .../rplogic/textures/blocks/logic1/132.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic1/133.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/134.png | Bin 0 -> 470 bytes .../rplogic/textures/blocks/logic1/135.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/136.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/137.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/138.png | Bin 0 -> 470 bytes .../rplogic/textures/blocks/logic1/139.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/14.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/140.png | Bin 0 -> 342 bytes .../rplogic/textures/blocks/logic1/141.png | Bin 0 -> 355 bytes .../rplogic/textures/blocks/logic1/142.png | Bin 0 -> 354 bytes .../rplogic/textures/blocks/logic1/143.png | Bin 0 -> 340 bytes .../rplogic/textures/blocks/logic1/144.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/145.png | Bin 0 -> 465 bytes .../rplogic/textures/blocks/logic1/146.png | Bin 0 -> 470 bytes .../rplogic/textures/blocks/logic1/147.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/148.png | Bin 0 -> 471 bytes .../rplogic/textures/blocks/logic1/149.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/15.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic1/150.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/151.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/152.png | Bin 0 -> 473 bytes .../rplogic/textures/blocks/logic1/153.png | Bin 0 -> 476 bytes .../rplogic/textures/blocks/logic1/154.png | Bin 0 -> 476 bytes .../rplogic/textures/blocks/logic1/155.png | Bin 0 -> 472 bytes .../rplogic/textures/blocks/logic1/156.png | Bin 0 -> 470 bytes .../rplogic/textures/blocks/logic1/157.png | Bin 0 -> 471 bytes .../rplogic/textures/blocks/logic1/158.png | Bin 0 -> 475 bytes .../rplogic/textures/blocks/logic1/159.png | Bin 0 -> 472 bytes .../rplogic/textures/blocks/logic1/16.png | Bin 0 -> 417 bytes .../rplogic/textures/blocks/logic1/160.png | Bin 0 -> 504 bytes .../rplogic/textures/blocks/logic1/161.png | Bin 0 -> 505 bytes .../rplogic/textures/blocks/logic1/162.png | Bin 0 -> 507 bytes .../rplogic/textures/blocks/logic1/163.png | Bin 0 -> 502 bytes .../rplogic/textures/blocks/logic1/164.png | Bin 0 -> 508 bytes .../rplogic/textures/blocks/logic1/165.png | Bin 0 -> 509 bytes .../rplogic/textures/blocks/logic1/166.png | Bin 0 -> 508 bytes .../rplogic/textures/blocks/logic1/167.png | Bin 0 -> 502 bytes .../rplogic/textures/blocks/logic1/168.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/169.png | Bin 0 -> 511 bytes .../rplogic/textures/blocks/logic1/17.png | Bin 0 -> 434 bytes .../rplogic/textures/blocks/logic1/170.png | Bin 0 -> 513 bytes .../rplogic/textures/blocks/logic1/171.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/172.png | Bin 0 -> 514 bytes .../rplogic/textures/blocks/logic1/173.png | Bin 0 -> 515 bytes .../rplogic/textures/blocks/logic1/174.png | Bin 0 -> 514 bytes .../rplogic/textures/blocks/logic1/175.png | Bin 0 -> 511 bytes .../rplogic/textures/blocks/logic1/176.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/177.png | Bin 0 -> 512 bytes .../rplogic/textures/blocks/logic1/178.png | Bin 0 -> 513 bytes .../rplogic/textures/blocks/logic1/179.png | Bin 0 -> 511 bytes .../rplogic/textures/blocks/logic1/18.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/180.png | Bin 0 -> 514 bytes .../rplogic/textures/blocks/logic1/181.png | Bin 0 -> 514 bytes .../rplogic/textures/blocks/logic1/182.png | Bin 0 -> 514 bytes .../rplogic/textures/blocks/logic1/183.png | Bin 0 -> 511 bytes .../rplogic/textures/blocks/logic1/184.png | Bin 0 -> 504 bytes .../rplogic/textures/blocks/logic1/185.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/186.png | Bin 0 -> 511 bytes .../rplogic/textures/blocks/logic1/187.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/188.png | Bin 0 -> 505 bytes .../rplogic/textures/blocks/logic1/189.png | Bin 0 -> 510 bytes .../rplogic/textures/blocks/logic1/19.png | Bin 0 -> 433 bytes .../rplogic/textures/blocks/logic1/190.png | Bin 0 -> 509 bytes .../rplogic/textures/blocks/logic1/191.png | Bin 0 -> 506 bytes .../rplogic/textures/blocks/logic1/192.png | Bin 0 -> 455 bytes .../rplogic/textures/blocks/logic1/193.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/194.png | Bin 0 -> 464 bytes .../rplogic/textures/blocks/logic1/195.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/196.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/197.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/198.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/199.png | Bin 0 -> 461 bytes .../rplogic/textures/blocks/logic1/2.png | Bin 0 -> 125 bytes .../rplogic/textures/blocks/logic1/20.png | Bin 0 -> 435 bytes .../rplogic/textures/blocks/logic1/200.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/201.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/202.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/203.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/204.png | Bin 0 -> 465 bytes .../rplogic/textures/blocks/logic1/205.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/206.png | Bin 0 -> 462 bytes .../rplogic/textures/blocks/logic1/207.png | Bin 0 -> 455 bytes .../rplogic/textures/blocks/logic1/208.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/209.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/21.png | Bin 0 -> 426 bytes .../rplogic/textures/blocks/logic1/210.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/211.png | Bin 0 -> 464 bytes .../rplogic/textures/blocks/logic1/212.png | Bin 0 -> 465 bytes .../rplogic/textures/blocks/logic1/213.png | Bin 0 -> 464 bytes .../rplogic/textures/blocks/logic1/214.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic1/215.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic1/216.png | Bin 0 -> 472 bytes .../rplogic/textures/blocks/logic1/217.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/218.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/219.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic1/22.png | Bin 0 -> 433 bytes .../rplogic/textures/blocks/logic1/220.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic1/221.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/222.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic1/223.png | Bin 0 -> 473 bytes .../rplogic/textures/blocks/logic1/224.png | Bin 0 -> 367 bytes .../rplogic/textures/blocks/logic1/225.png | Bin 0 -> 380 bytes .../rplogic/textures/blocks/logic1/226.png | Bin 0 -> 380 bytes .../rplogic/textures/blocks/logic1/227.png | Bin 0 -> 367 bytes .../rplogic/textures/blocks/logic1/228.png | Bin 0 -> 365 bytes .../rplogic/textures/blocks/logic1/229.png | Bin 0 -> 377 bytes .../rplogic/textures/blocks/logic1/23.png | Bin 0 -> 412 bytes .../rplogic/textures/blocks/logic1/230.png | Bin 0 -> 378 bytes .../rplogic/textures/blocks/logic1/231.png | Bin 0 -> 366 bytes .../rplogic/textures/blocks/logic1/24.png | Bin 0 -> 410 bytes .../rplogic/textures/blocks/logic1/25.png | Bin 0 -> 422 bytes .../rplogic/textures/blocks/logic1/26.png | Bin 0 -> 422 bytes .../rplogic/textures/blocks/logic1/27.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic1/28.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic1/29.png | Bin 0 -> 415 bytes .../rplogic/textures/blocks/logic1/3.png | Bin 0 -> 285 bytes .../rplogic/textures/blocks/logic1/30.png | Bin 0 -> 415 bytes .../rplogic/textures/blocks/logic1/31.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic1/32.png | Bin 0 -> 423 bytes .../rplogic/textures/blocks/logic1/33.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/34.png | Bin 0 -> 428 bytes .../rplogic/textures/blocks/logic1/35.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/36.png | Bin 0 -> 428 bytes .../rplogic/textures/blocks/logic1/37.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/38.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/39.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/4.png | Bin 0 -> 286 bytes .../rplogic/textures/blocks/logic1/40.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/41.png | Bin 0 -> 426 bytes .../rplogic/textures/blocks/logic1/42.png | Bin 0 -> 425 bytes .../rplogic/textures/blocks/logic1/43.png | Bin 0 -> 424 bytes .../rplogic/textures/blocks/logic1/44.png | Bin 0 -> 427 bytes .../rplogic/textures/blocks/logic1/45.png | Bin 0 -> 425 bytes .../rplogic/textures/blocks/logic1/46.png | Bin 0 -> 426 bytes .../rplogic/textures/blocks/logic1/47.png | Bin 0 -> 424 bytes .../rplogic/textures/blocks/logic1/48.png | Bin 0 -> 432 bytes .../rplogic/textures/blocks/logic1/49.png | Bin 0 -> 431 bytes .../rplogic/textures/blocks/logic1/5.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic1/50.png | Bin 0 -> 431 bytes .../rplogic/textures/blocks/logic1/51.png | Bin 0 -> 430 bytes .../rplogic/textures/blocks/logic1/52.png | Bin 0 -> 431 bytes .../rplogic/textures/blocks/logic1/53.png | Bin 0 -> 429 bytes .../rplogic/textures/blocks/logic1/54.png | Bin 0 -> 430 bytes .../rplogic/textures/blocks/logic1/55.png | Bin 0 -> 429 bytes .../rplogic/textures/blocks/logic1/56.png | Bin 0 -> 425 bytes .../rplogic/textures/blocks/logic1/57.png | Bin 0 -> 424 bytes .../rplogic/textures/blocks/logic1/58.png | Bin 0 -> 424 bytes .../rplogic/textures/blocks/logic1/59.png | Bin 0 -> 422 bytes .../rplogic/textures/blocks/logic1/6.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic1/60.png | Bin 0 -> 425 bytes .../rplogic/textures/blocks/logic1/61.png | Bin 0 -> 423 bytes .../rplogic/textures/blocks/logic1/62.png | Bin 0 -> 421 bytes .../rplogic/textures/blocks/logic1/63.png | Bin 0 -> 414 bytes .../rplogic/textures/blocks/logic1/64.png | Bin 0 -> 412 bytes .../rplogic/textures/blocks/logic1/65.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/66.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/67.png | Bin 0 -> 417 bytes .../rplogic/textures/blocks/logic1/68.png | Bin 0 -> 414 bytes .../rplogic/textures/blocks/logic1/69.png | Bin 0 -> 415 bytes .../rplogic/textures/blocks/logic1/7.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic1/70.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/71.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/72.png | Bin 0 -> 419 bytes .../rplogic/textures/blocks/logic1/73.png | Bin 0 -> 418 bytes .../rplogic/textures/blocks/logic1/74.png | Bin 0 -> 417 bytes .../rplogic/textures/blocks/logic1/75.png | Bin 0 -> 417 bytes .../rplogic/textures/blocks/logic1/76.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/77.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/78.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/79.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/8.png | Bin 0 -> 133 bytes .../rplogic/textures/blocks/logic1/80.png | Bin 0 -> 420 bytes .../rplogic/textures/blocks/logic1/81.png | Bin 0 -> 419 bytes .../rplogic/textures/blocks/logic1/82.png | Bin 0 -> 421 bytes .../rplogic/textures/blocks/logic1/83.png | Bin 0 -> 419 bytes .../rplogic/textures/blocks/logic1/84.png | Bin 0 -> 420 bytes .../rplogic/textures/blocks/logic1/85.png | Bin 0 -> 420 bytes .../rplogic/textures/blocks/logic1/86.png | Bin 0 -> 420 bytes .../rplogic/textures/blocks/logic1/87.png | Bin 0 -> 420 bytes .../rplogic/textures/blocks/logic1/88.png | Bin 0 -> 418 bytes .../rplogic/textures/blocks/logic1/89.png | Bin 0 -> 415 bytes .../rplogic/textures/blocks/logic1/9.png | Bin 0 -> 129 bytes .../rplogic/textures/blocks/logic1/90.png | Bin 0 -> 416 bytes .../rplogic/textures/blocks/logic1/91.png | Bin 0 -> 412 bytes .../rplogic/textures/blocks/logic1/92.png | Bin 0 -> 415 bytes .../rplogic/textures/blocks/logic1/93.png | Bin 0 -> 414 bytes .../rplogic/textures/blocks/logic1/94.png | Bin 0 -> 414 bytes .../rplogic/textures/blocks/logic1/95.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic1/96.png | Bin 0 -> 513 bytes .../rplogic/textures/blocks/logic1/97.png | Bin 0 -> 534 bytes .../rplogic/textures/blocks/logic1/98.png | Bin 0 -> 536 bytes .../rplogic/textures/blocks/logic1/99.png | Bin 0 -> 537 bytes .../rplogic/textures/blocks/logic2/0.png | Bin 0 -> 271 bytes .../rplogic/textures/blocks/logic2/1.png | Bin 0 -> 464 bytes .../rplogic/textures/blocks/logic2/10.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/100.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/101.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/102.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/103.png | Bin 0 -> 395 bytes .../rplogic/textures/blocks/logic2/104.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/105.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/106.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/107.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/108.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/109.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/11.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/110.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/111.png | Bin 0 -> 394 bytes .../rplogic/textures/blocks/logic2/112.png | Bin 0 -> 386 bytes .../rplogic/textures/blocks/logic2/113.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/114.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/115.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/116.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/117.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/118.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/119.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/12.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/120.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/121.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/122.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/123.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/124.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/125.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/126.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/127.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/128.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/129.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/13.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/130.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/131.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/132.png | Bin 0 -> 396 bytes .../rplogic/textures/blocks/logic2/133.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/134.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/135.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/136.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/137.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/138.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/139.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/14.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/140.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/141.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/142.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/143.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/144.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/145.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/146.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/147.png | Bin 0 -> 386 bytes .../rplogic/textures/blocks/logic2/148.png | Bin 0 -> 394 bytes .../rplogic/textures/blocks/logic2/149.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/15.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/150.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/151.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/152.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/153.png | Bin 0 -> 395 bytes .../rplogic/textures/blocks/logic2/154.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/155.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/156.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/157.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/158.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/159.png | Bin 0 -> 400 bytes .../rplogic/textures/blocks/logic2/16.png | Bin 0 -> 375 bytes .../rplogic/textures/blocks/logic2/160.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/161.png | Bin 0 -> 406 bytes .../rplogic/textures/blocks/logic2/162.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/163.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/164.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/165.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/166.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/167.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/168.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/169.png | Bin 0 -> 401 bytes .../rplogic/textures/blocks/logic2/17.png | Bin 0 -> 390 bytes .../rplogic/textures/blocks/logic2/170.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/171.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/172.png | Bin 0 -> 479 bytes .../rplogic/textures/blocks/logic2/173.png | Bin 0 -> 484 bytes .../rplogic/textures/blocks/logic2/174.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/175.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/176.png | Bin 0 -> 482 bytes .../rplogic/textures/blocks/logic2/177.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/178.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/179.png | Bin 0 -> 492 bytes .../rplogic/textures/blocks/logic2/18.png | Bin 0 -> 385 bytes .../rplogic/textures/blocks/logic2/180.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/181.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/182.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/183.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/184.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/185.png | Bin 0 -> 493 bytes .../rplogic/textures/blocks/logic2/186.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/187.png | Bin 0 -> 492 bytes .../rplogic/textures/blocks/logic2/188.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/189.png | Bin 0 -> 491 bytes .../rplogic/textures/blocks/logic2/19.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/190.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/191.png | Bin 0 -> 483 bytes .../rplogic/textures/blocks/logic2/192.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/193.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/194.png | Bin 0 -> 491 bytes .../rplogic/textures/blocks/logic2/195.png | Bin 0 -> 492 bytes .../rplogic/textures/blocks/logic2/196.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/197.png | Bin 0 -> 493 bytes .../rplogic/textures/blocks/logic2/198.png | Bin 0 -> 493 bytes .../rplogic/textures/blocks/logic2/199.png | Bin 0 -> 491 bytes .../rplogic/textures/blocks/logic2/2.png | Bin 0 -> 461 bytes .../rplogic/textures/blocks/logic2/20.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/200.png | Bin 0 -> 482 bytes .../rplogic/textures/blocks/logic2/201.png | Bin 0 -> 486 bytes .../rplogic/textures/blocks/logic2/202.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/203.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/204.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/205.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/206.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/207.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/208.png | Bin 0 -> 481 bytes .../rplogic/textures/blocks/logic2/209.png | Bin 0 -> 486 bytes .../rplogic/textures/blocks/logic2/21.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/210.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/211.png | Bin 0 -> 491 bytes .../rplogic/textures/blocks/logic2/212.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/213.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/214.png | Bin 0 -> 488 bytes .../rplogic/textures/blocks/logic2/215.png | Bin 0 -> 484 bytes .../rplogic/textures/blocks/logic2/216.png | Bin 0 -> 483 bytes .../rplogic/textures/blocks/logic2/217.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/218.png | Bin 0 -> 487 bytes .../rplogic/textures/blocks/logic2/219.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/22.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/220.png | Bin 0 -> 483 bytes .../rplogic/textures/blocks/logic2/221.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/222.png | Bin 0 -> 491 bytes .../rplogic/textures/blocks/logic2/223.png | Bin 0 -> 490 bytes .../rplogic/textures/blocks/logic2/224.png | Bin 0 -> 493 bytes .../rplogic/textures/blocks/logic2/225.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/226.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/227.png | Bin 0 -> 481 bytes .../rplogic/textures/blocks/logic2/228.png | Bin 0 -> 492 bytes .../rplogic/textures/blocks/logic2/229.png | Bin 0 -> 485 bytes .../rplogic/textures/blocks/logic2/23.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/230.png | Bin 0 -> 489 bytes .../rplogic/textures/blocks/logic2/231.png | Bin 0 -> 481 bytes .../rplogic/textures/blocks/logic2/232.png | Bin 0 -> 492 bytes .../rplogic/textures/blocks/logic2/233.png | Bin 0 -> 484 bytes .../rplogic/textures/blocks/logic2/234.png | Bin 0 -> 486 bytes .../rplogic/textures/blocks/logic2/235.png | Bin 0 -> 478 bytes .../rplogic/textures/blocks/logic2/236.png | Bin 0 -> 452 bytes .../rplogic/textures/blocks/logic2/237.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic2/238.png | Bin 0 -> 461 bytes .../rplogic/textures/blocks/logic2/239.png | Bin 0 -> 450 bytes .../rplogic/textures/blocks/logic2/24.png | Bin 0 -> 387 bytes .../rplogic/textures/blocks/logic2/240.png | Bin 0 -> 458 bytes .../rplogic/textures/blocks/logic2/241.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic2/242.png | Bin 0 -> 455 bytes .../rplogic/textures/blocks/logic2/243.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic2/244.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic2/245.png | Bin 0 -> 456 bytes .../rplogic/textures/blocks/logic2/246.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic2/247.png | Bin 0 -> 456 bytes .../rplogic/textures/blocks/logic2/248.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic2/249.png | Bin 0 -> 460 bytes .../rplogic/textures/blocks/logic2/25.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/250.png | Bin 0 -> 463 bytes .../rplogic/textures/blocks/logic2/251.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic2/252.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic2/253.png | Bin 0 -> 469 bytes .../rplogic/textures/blocks/logic2/254.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic2/255.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic2/26.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/27.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/28.png | Bin 0 -> 394 bytes .../rplogic/textures/blocks/logic2/29.png | Bin 0 -> 390 bytes .../rplogic/textures/blocks/logic2/3.png | Bin 0 -> 462 bytes .../rplogic/textures/blocks/logic2/30.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/31.png | Bin 0 -> 376 bytes .../rplogic/textures/blocks/logic2/32.png | Bin 0 -> 388 bytes .../rplogic/textures/blocks/logic2/33.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/34.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/35.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/36.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/37.png | Bin 0 -> 404 bytes .../rplogic/textures/blocks/logic2/38.png | Bin 0 -> 408 bytes .../rplogic/textures/blocks/logic2/39.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/4.png | Bin 0 -> 468 bytes .../rplogic/textures/blocks/logic2/40.png | Bin 0 -> 384 bytes .../rplogic/textures/blocks/logic2/41.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/42.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/43.png | Bin 0 -> 396 bytes .../rplogic/textures/blocks/logic2/44.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/45.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/46.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/47.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/48.png | Bin 0 -> 390 bytes .../rplogic/textures/blocks/logic2/49.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/5.png | Bin 0 -> 466 bytes .../rplogic/textures/blocks/logic2/50.png | Bin 0 -> 398 bytes .../rplogic/textures/blocks/logic2/51.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/52.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/53.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/54.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/55.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/56.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/57.png | Bin 0 -> 406 bytes .../rplogic/textures/blocks/logic2/58.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/59.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/6.png | Bin 0 -> 467 bytes .../rplogic/textures/blocks/logic2/60.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/61.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/62.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/63.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/64.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/65.png | Bin 0 -> 406 bytes .../rplogic/textures/blocks/logic2/66.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/67.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/68.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/69.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/7.png | Bin 0 -> 462 bytes .../rplogic/textures/blocks/logic2/70.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/71.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/72.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/73.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/logic2/74.png | Bin 0 -> 407 bytes .../rplogic/textures/blocks/logic2/75.png | Bin 0 -> 402 bytes .../rplogic/textures/blocks/logic2/76.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/77.png | Bin 0 -> 406 bytes .../rplogic/textures/blocks/logic2/78.png | Bin 0 -> 405 bytes .../rplogic/textures/blocks/logic2/79.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/8.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/80.png | Bin 0 -> 379 bytes .../rplogic/textures/blocks/logic2/81.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/82.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/83.png | Bin 0 -> 396 bytes .../rplogic/textures/blocks/logic2/84.png | Bin 0 -> 390 bytes .../rplogic/textures/blocks/logic2/85.png | Bin 0 -> 393 bytes .../rplogic/textures/blocks/logic2/86.png | Bin 0 -> 395 bytes .../rplogic/textures/blocks/logic2/87.png | Bin 0 -> 396 bytes .../rplogic/textures/blocks/logic2/88.png | Bin 0 -> 396 bytes .../rplogic/textures/blocks/logic2/89.png | Bin 0 -> 395 bytes .../rplogic/textures/blocks/logic2/9.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/logic2/90.png | Bin 0 -> 392 bytes .../rplogic/textures/blocks/logic2/91.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/92.png | Bin 0 -> 397 bytes .../rplogic/textures/blocks/logic2/93.png | Bin 0 -> 389 bytes .../rplogic/textures/blocks/logic2/94.png | Bin 0 -> 391 bytes .../rplogic/textures/blocks/logic2/95.png | Bin 0 -> 375 bytes .../rplogic/textures/blocks/logic2/96.png | Bin 0 -> 387 bytes .../rplogic/textures/blocks/logic2/97.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/98.png | Bin 0 -> 399 bytes .../rplogic/textures/blocks/logic2/99.png | Bin 0 -> 403 bytes .../rplogic/textures/blocks/sensors/0.png | Bin 0 -> 271 bytes .../rplogic/textures/blocks/sensors/1.png | Bin 0 -> 346 bytes .../rplogic/textures/blocks/sensors/10.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/11.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/12.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/13.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/14.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/15.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/16.png | Bin 0 -> 241 bytes .../rplogic/textures/blocks/sensors/17.png | Bin 0 -> 235 bytes .../rplogic/textures/blocks/sensors/18.png | Bin 0 -> 230 bytes .../rplogic/textures/blocks/sensors/19.png | Bin 0 -> 226 bytes .../rplogic/textures/blocks/sensors/2.png | Bin 0 -> 347 bytes .../rplogic/textures/blocks/sensors/20.png | Bin 0 -> 107 bytes .../rplogic/textures/blocks/sensors/21.png | Bin 0 -> 233 bytes .../rplogic/textures/blocks/sensors/22.png | Bin 0 -> 222 bytes .../rplogic/textures/blocks/sensors/3.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/4.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/5.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/6.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/7.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/8.png | Bin 0 -> 89 bytes .../rplogic/textures/blocks/sensors/9.png | Bin 0 -> 89 bytes .../rplogic/textures/gui/countergui.png | Bin 0 -> 639 bytes .../assets/rplogic/textures/gui/timersgui.png | Bin 0 -> 595 bytes .../assets/rplogic/textures/items/anode.png | Bin 0 -> 406 bytes .../assets/rplogic/textures/items/bundle.png | Bin 0 -> 442 bytes .../assets/rplogic/textures/items/cathode.png | Bin 0 -> 425 bytes .../assets/rplogic/textures/items/chip.png | Bin 0 -> 441 bytes .../assets/rplogic/textures/items/plate.png | Bin 0 -> 497 bytes .../assets/rplogic/textures/items/pointer.png | Bin 0 -> 433 bytes .../assets/rplogic/textures/items/redWire.png | Bin 0 -> 412 bytes .../assets/rplogic/textures/items/tchip.png | Bin 0 -> 456 bytes .../assets/rplogic/textures/items/wafer.png | Bin 0 -> 336 bytes .../assets/rplogic/textures/items/wire.png | Bin 0 -> 394 bytes .../assets/rpmachine/lang/en_US.lang | 70 + .../assets/rpmachine/lang/ru_RU.lang | 70 + .../assets/rpmachine/models/accel.obj | 292 +++ .../assets/rpmachine/models/machine1.png | Bin 0 -> 8169 bytes .../assets/rpmachine/models/machine2.png | Bin 0 -> 5068 bytes .../assets/rpmachine/models/pump1.obj | 170 ++ .../assets/rpmachine/models/pump2.obj | 44 + .../assets/rpmachine/models/transform.obj | 107 + .../assets/rpmachine/models/vawt.obj | 503 ++++ .../assets/rpmachine/models/vawt.png | Bin 0 -> 4283 bytes .../assets/rpmachine/models/windmill.obj | 160 ++ .../textures/blocks/assemblerBack.png | Bin 0 -> 650 bytes .../textures/blocks/assemblerBackOn.png | Bin 0 -> 668 bytes .../textures/blocks/assemblerFront.png | Bin 0 -> 825 bytes .../textures/blocks/assemblerFrontOn.png | Bin 0 -> 749 bytes .../textures/blocks/assemblerSide.png | Bin 0 -> 805 bytes .../textures/blocks/assemblerSideAlt.png | Bin 0 -> 796 bytes .../textures/blocks/batterySide/0.png | Bin 0 -> 564 bytes .../textures/blocks/batterySide/1.png | Bin 0 -> 578 bytes .../textures/blocks/batterySide/2.png | Bin 0 -> 585 bytes .../textures/blocks/batterySide/3.png | Bin 0 -> 591 bytes .../textures/blocks/batterySide/4.png | Bin 0 -> 593 bytes .../textures/blocks/batterySide/5.png | Bin 0 -> 598 bytes .../textures/blocks/batterySide/6.png | Bin 0 -> 599 bytes .../textures/blocks/batterySide/7.png | Bin 0 -> 592 bytes .../textures/blocks/batterySide/8.png | Bin 0 -> 589 bytes .../rpmachine/textures/blocks/batteryTop.png | Bin 0 -> 581 bytes .../rpmachine/textures/blocks/breakerBack.png | Bin 0 -> 619 bytes .../textures/blocks/breakerFront.png | Bin 0 -> 643 bytes .../textures/blocks/breakerFrontOn.png | Bin 0 -> 651 bytes .../rpmachine/textures/blocks/breakerSide.png | Bin 0 -> 693 bytes .../textures/blocks/breakerSideOn.png | Bin 0 -> 691 bytes .../textures/blocks/btAlloyFurnaceFront.png | Bin 0 -> 764 bytes .../textures/blocks/btAlloyFurnaceFrontOn.png | Bin 0 -> 804 bytes .../textures/blocks/btAlloyFurnaceSide.png | Bin 0 -> 634 bytes .../textures/blocks/btAlloyFurnaceTop.png | Bin 0 -> 480 bytes .../textures/blocks/btChargerBottom.png | Bin 0 -> 701 bytes .../textures/blocks/btChargerFront/0.png | Bin 0 -> 802 bytes .../textures/blocks/btChargerFront/1.png | Bin 0 -> 808 bytes .../textures/blocks/btChargerFront/2.png | Bin 0 -> 814 bytes .../textures/blocks/btChargerFront/3.png | Bin 0 -> 817 bytes .../textures/blocks/btChargerFront/4.png | Bin 0 -> 817 bytes .../blocks/btChargerFrontActive/0.png | Bin 0 -> 865 bytes .../blocks/btChargerFrontActive/1.png | Bin 0 -> 868 bytes .../blocks/btChargerFrontActive/2.png | Bin 0 -> 868 bytes .../blocks/btChargerFrontActive/3.png | Bin 0 -> 870 bytes .../blocks/btChargerFrontActive/4.png | Bin 0 -> 869 bytes .../blocks/btChargerFrontPowered/0.png | Bin 0 -> 804 bytes .../blocks/btChargerFrontPowered/1.png | Bin 0 -> 811 bytes .../blocks/btChargerFrontPowered/2.png | Bin 0 -> 819 bytes .../blocks/btChargerFrontPowered/3.png | Bin 0 -> 821 bytes .../blocks/btChargerFrontPowered/4.png | Bin 0 -> 820 bytes .../textures/blocks/btChargerSide.png | Bin 0 -> 765 bytes .../textures/blocks/btChargerSideOn.png | Bin 0 -> 829 bytes .../textures/blocks/btChargerTop.png | Bin 0 -> 630 bytes .../textures/blocks/btChargerTopOn.png | Bin 0 -> 801 bytes .../textures/blocks/btFurnaceFront.png | Bin 0 -> 661 bytes .../textures/blocks/btFurnaceFrontOn.png | Bin 0 -> 701 bytes .../textures/blocks/btFurnaceSide.png | Bin 0 -> 528 bytes .../textures/blocks/btFurnaceTop.png | Bin 0 -> 603 bytes .../rpmachine/textures/blocks/bufferBack.png | Bin 0 -> 450 bytes .../rpmachine/textures/blocks/bufferFront.png | Bin 0 -> 522 bytes .../rpmachine/textures/blocks/bufferSide.png | Bin 0 -> 487 bytes .../rpmachine/textures/blocks/crate.png | Bin 0 -> 778 bytes .../textures/blocks/deployerBack.png | Bin 0 -> 589 bytes .../textures/blocks/deployerFront.png | Bin 0 -> 671 bytes .../textures/blocks/deployerFrontOn.png | Bin 0 -> 584 bytes .../textures/blocks/deployerSide.png | Bin 0 -> 621 bytes .../textures/blocks/deployerSideAlt.png | Bin 0 -> 683 bytes .../textures/blocks/detectorBack.png | Bin 0 -> 831 bytes .../textures/blocks/detectorFront.png | Bin 0 -> 742 bytes .../textures/blocks/detectorSide.png | Bin 0 -> 882 bytes .../textures/blocks/detectorSideAlt.png | Bin 0 -> 827 bytes .../textures/blocks/detectorSideAltOn.png | Bin 0 -> 827 bytes .../textures/blocks/detectorSideCharged.png | Bin 0 -> 881 bytes .../textures/blocks/detectorSideChargedOn.png | Bin 0 -> 881 bytes .../textures/blocks/detectorSideOn.png | Bin 0 -> 883 bytes .../rpmachine/textures/blocks/ejectorSide.png | Bin 0 -> 679 bytes .../textures/blocks/ejectorSideOn.png | Bin 0 -> 691 bytes .../textures/blocks/electronicsBottom.png | Bin 0 -> 457 bytes .../rpmachine/textures/blocks/filterSide.png | Bin 0 -> 700 bytes .../textures/blocks/filterSideOn.png | Bin 0 -> 706 bytes .../textures/blocks/frameCovered.png | Bin 0 -> 312 bytes .../textures/blocks/frameCrossed.png | Bin 0 -> 401 bytes .../textures/blocks/framePaneled.png | Bin 0 -> 383 bytes .../rpmachine/textures/blocks/grateBack.png | Bin 0 -> 686 bytes .../textures/blocks/grateEmptyBack.png | Bin 0 -> 624 bytes .../textures/blocks/grateMossySide.png | Bin 0 -> 698 bytes .../rpmachine/textures/blocks/grateSide.png | Bin 0 -> 642 bytes .../textures/blocks/igniterFront.png | Bin 0 -> 878 bytes .../textures/blocks/igniterFrontOn.png | Bin 0 -> 904 bytes .../rpmachine/textures/blocks/igniterSide.png | Bin 0 -> 765 bytes .../textures/blocks/igniterSideAlt.png | Bin 0 -> 763 bytes .../textures/blocks/magneticTubeFace.png | Bin 0 -> 386 bytes .../textures/blocks/magneticTubeFaceNR.png | Bin 0 -> 325 bytes .../textures/blocks/magneticTubeRing.png | Bin 0 -> 412 bytes .../textures/blocks/magneticTubeSide.png | Bin 0 -> 495 bytes .../textures/blocks/magneticTubeSideNR.png | Bin 0 -> 345 bytes .../rpmachine/textures/blocks/managerBack.png | Bin 0 -> 792 bytes .../textures/blocks/managerFront.png | Bin 0 -> 598 bytes .../textures/blocks/managerSide/0.png | Bin 0 -> 678 bytes .../textures/blocks/managerSide/1.png | Bin 0 -> 715 bytes .../textures/blocks/managerSide/2.png | Bin 0 -> 720 bytes .../textures/blocks/managerSide/3.png | Bin 0 -> 706 bytes .../textures/blocks/managerSideCharged/0.png | Bin 0 -> 679 bytes .../textures/blocks/managerSideCharged/1.png | Bin 0 -> 715 bytes .../textures/blocks/managerSideCharged/2.png | Bin 0 -> 721 bytes .../textures/blocks/managerSideCharged/3.png | Bin 0 -> 706 bytes .../rpmachine/textures/blocks/motorBottom.png | Bin 0 -> 757 bytes .../rpmachine/textures/blocks/motorFront.png | Bin 0 -> 872 bytes .../textures/blocks/motorFrontActive.png | Bin 0 -> 1013 bytes .../blocks/motorFrontActive.png.mcmeta | 11 + .../textures/blocks/motorFrontCharged.png | Bin 0 -> 883 bytes .../rpmachine/textures/blocks/motorSide.png | Bin 0 -> 789 bytes .../rpmachine/textures/blocks/motorTop.png | Bin 0 -> 846 bytes .../textures/blocks/motorTopActive.png | Bin 0 -> 1136 bytes .../textures/blocks/motorTopActive.png.mcmeta | 11 + .../rpmachine/textures/blocks/pipeFace.png | Bin 0 -> 234 bytes .../rpmachine/textures/blocks/pipeFlanges.png | Bin 0 -> 460 bytes .../rpmachine/textures/blocks/pipeSide.png | Bin 0 -> 370 bytes .../textures/blocks/redstoneTubeFace/0.png | Bin 0 -> 313 bytes .../textures/blocks/redstoneTubeFace/1.png | Bin 0 -> 313 bytes .../textures/blocks/redstoneTubeFace/2.png | Bin 0 -> 314 bytes .../textures/blocks/redstoneTubeFace/3.png | Bin 0 -> 456 bytes .../textures/blocks/redstoneTubeSide/0.png | Bin 0 -> 360 bytes .../textures/blocks/redstoneTubeSide/1.png | Bin 0 -> 360 bytes .../textures/blocks/redstoneTubeSide/2.png | Bin 0 -> 358 bytes .../textures/blocks/redstoneTubeSide/3.png | Bin 0 -> 403 bytes .../textures/blocks/regulatorBack.png | Bin 0 -> 831 bytes .../textures/blocks/regulatorFront.png | Bin 0 -> 742 bytes .../textures/blocks/regulatorSide.png | Bin 0 -> 868 bytes .../textures/blocks/regulatorSideAlt.png | Bin 0 -> 838 bytes .../blocks/regulatorSideAltCharged.png | Bin 0 -> 834 bytes .../textures/blocks/regulatorSideCharged.png | Bin 0 -> 862 bytes .../blocks/regulatorSideChargedOn.png | Bin 0 -> 863 bytes .../textures/blocks/regulatorSideOn.png | Bin 0 -> 868 bytes .../rpmachine/textures/blocks/relaySide.png | Bin 0 -> 686 bytes .../textures/blocks/relaySideAlt.png | Bin 0 -> 548 bytes .../rpmachine/textures/blocks/relaySideOn.png | Bin 0 -> 705 bytes .../textures/blocks/restrictionTubeFace.png | Bin 0 -> 326 bytes .../blocks/restrictionTubeFaceColor.png | Bin 0 -> 235 bytes .../textures/blocks/restrictionTubeSide.png | Bin 0 -> 436 bytes .../blocks/restrictionTubeSideColor.png | Bin 0 -> 317 bytes .../textures/blocks/retrieverBack.png | Bin 0 -> 599 bytes .../textures/blocks/retrieverFront.png | Bin 0 -> 815 bytes .../textures/blocks/retrieverSide.png | Bin 0 -> 795 bytes .../textures/blocks/retrieverSideCharged.png | Bin 0 -> 811 bytes .../blocks/retrieverSideChargedOn.png | Bin 0 -> 824 bytes .../textures/blocks/retrieverSideOn.png | Bin 0 -> 801 bytes .../textures/blocks/solarPanelSide.png | Bin 0 -> 321 bytes .../textures/blocks/solarPanelTop.png | Bin 0 -> 663 bytes .../rpmachine/textures/blocks/sorterBack.png | Bin 0 -> 694 bytes .../textures/blocks/sorterBackCharged.png | Bin 0 -> 703 bytes .../textures/blocks/sorterBackChargedOn.png | Bin 0 -> 713 bytes .../rpmachine/textures/blocks/sorterFront.png | Bin 0 -> 611 bytes .../rpmachine/textures/blocks/sorterSide.png | Bin 0 -> 716 bytes .../textures/blocks/sorterSideCharged.png | Bin 0 -> 718 bytes .../textures/blocks/sorterSideChargedOn.png | Bin 0 -> 721 bytes .../textures/blocks/sorterSideOn.png | Bin 0 -> 716 bytes .../rpmachine/textures/blocks/sortronBack.png | Bin 0 -> 393 bytes .../textures/blocks/sortronFront.png | Bin 0 -> 860 bytes .../rpmachine/textures/blocks/sortronSide.png | Bin 0 -> 723 bytes .../textures/blocks/sortronSideAlt.png | Bin 0 -> 679 bytes .../textures/blocks/sortronSideAltCharged.png | Bin 0 -> 693 bytes .../textures/blocks/sortronSideCharged.png | Bin 0 -> 722 bytes .../textures/blocks/sortronSideChargedOn.png | Bin 0 -> 724 bytes .../textures/blocks/sortronSideOn.png | Bin 0 -> 725 bytes .../textures/blocks/thermopileFront.png | Bin 0 -> 735 bytes .../textures/blocks/thermopileSide.png | Bin 0 -> 654 bytes .../textures/blocks/thermopileTop.png | Bin 0 -> 492 bytes .../textures/blocks/transposerFront.png | Bin 0 -> 659 bytes .../textures/blocks/transposerSide.png | Bin 0 -> 682 bytes .../textures/blocks/transposerSideOn.png | Bin 0 -> 683 bytes .../rpmachine/textures/blocks/tubeFace.png | Bin 0 -> 321 bytes .../textures/blocks/tubeFaceColor.png | Bin 0 -> 510 bytes .../textures/blocks/tubeItemOverlay.png | Bin 0 -> 353 bytes .../rpmachine/textures/blocks/tubeSide.png | Bin 0 -> 352 bytes .../textures/blocks/tubeSideColor.png | Bin 0 -> 482 bytes .../textures/blocks/turbineFront.png | Bin 0 -> 777 bytes .../rpmachine/textures/blocks/turbineSide.png | Bin 0 -> 844 bytes .../textures/blocks/turbineSideAlt.png | Bin 0 -> 827 bytes .../rpmachine/textures/gui/assembler.png | Bin 0 -> 1981 bytes .../rpmachine/textures/gui/assembler2.png | Bin 0 -> 2200 bytes .../assets/rpmachine/textures/gui/batbox.png | Bin 0 -> 2486 bytes .../rpmachine/textures/gui/btafurnace.png | Bin 0 -> 1619 bytes .../rpmachine/textures/gui/btfurnace.png | Bin 0 -> 1528 bytes .../assets/rpmachine/textures/gui/buffer.png | Bin 0 -> 1239 bytes .../rpmachine/textures/gui/charging.png | Bin 0 -> 2729 bytes .../assets/rpmachine/textures/gui/filter.png | Bin 0 -> 1297 bytes .../assets/rpmachine/textures/gui/filter9.png | Bin 0 -> 1317 bytes .../assets/rpmachine/textures/gui/itemdet.png | Bin 0 -> 1876 bytes .../assets/rpmachine/textures/gui/manager.png | Bin 0 -> 2556 bytes .../rpmachine/textures/gui/regulator.png | Bin 0 -> 2296 bytes .../rpmachine/textures/gui/retriever.png | Bin 0 -> 2505 bytes .../rpmachine/textures/gui/sortmachine.png | Bin 0 -> 4109 bytes .../assets/rpmachine/textures/gui/windgui.png | Bin 0 -> 1959 bytes .../rpmachine/textures/items/battery.png | Bin 0 -> 465 bytes .../rpmachine/textures/items/emptyBattery.png | Bin 0 -> 465 bytes .../textures/items/sonicScrewdriver.png | Bin 0 -> 412 bytes .../rpmachine/textures/items/voltmeter.png | Bin 0 -> 522 bytes .../rpmachine/textures/items/windSailWood.png | Bin 0 -> 330 bytes .../rpmachine/textures/items/windTurbine.png | Bin 0 -> 399 bytes .../rpmachine/textures/items/windmill.png | Bin 0 -> 345 bytes .../resources/assets/rpwiring/lang/en_US.lang | 240 ++ .../resources/assets/rpwiring/lang/ru_RU.lang | 243 ++ .../textures/blocks/bluewireCable.png | Bin 0 -> 236 bytes .../rpwiring/textures/blocks/bundledCable.png | Bin 0 -> 255 bytes .../textures/blocks/bundledColFace/0.png | Bin 0 -> 443 bytes .../textures/blocks/bundledColFace/1.png | Bin 0 -> 442 bytes .../textures/blocks/bundledColFace/10.png | Bin 0 -> 445 bytes .../textures/blocks/bundledColFace/11.png | Bin 0 -> 443 bytes .../textures/blocks/bundledColFace/12.png | Bin 0 -> 437 bytes .../textures/blocks/bundledColFace/13.png | Bin 0 -> 441 bytes .../textures/blocks/bundledColFace/14.png | Bin 0 -> 437 bytes .../textures/blocks/bundledColFace/15.png | Bin 0 -> 436 bytes .../textures/blocks/bundledColFace/2.png | Bin 0 -> 443 bytes .../textures/blocks/bundledColFace/3.png | Bin 0 -> 448 bytes .../textures/blocks/bundledColFace/4.png | Bin 0 -> 442 bytes .../textures/blocks/bundledColFace/5.png | Bin 0 -> 444 bytes .../textures/blocks/bundledColFace/6.png | Bin 0 -> 448 bytes .../textures/blocks/bundledColFace/7.png | Bin 0 -> 440 bytes .../textures/blocks/bundledColFace/8.png | Bin 0 -> 445 bytes .../textures/blocks/bundledColFace/9.png | Bin 0 -> 443 bytes .../textures/blocks/bundledColTop/0.png | Bin 0 -> 650 bytes .../textures/blocks/bundledColTop/1.png | Bin 0 -> 635 bytes .../textures/blocks/bundledColTop/10.png | Bin 0 -> 637 bytes .../textures/blocks/bundledColTop/11.png | Bin 0 -> 634 bytes .../textures/blocks/bundledColTop/12.png | Bin 0 -> 626 bytes .../textures/blocks/bundledColTop/13.png | Bin 0 -> 626 bytes .../textures/blocks/bundledColTop/14.png | Bin 0 -> 630 bytes .../textures/blocks/bundledColTop/15.png | Bin 0 -> 622 bytes .../textures/blocks/bundledColTop/2.png | Bin 0 -> 641 bytes .../textures/blocks/bundledColTop/3.png | Bin 0 -> 655 bytes .../textures/blocks/bundledColTop/4.png | Bin 0 -> 636 bytes .../textures/blocks/bundledColTop/5.png | Bin 0 -> 643 bytes .../textures/blocks/bundledColTop/6.png | Bin 0 -> 653 bytes .../textures/blocks/bundledColTop/7.png | Bin 0 -> 630 bytes .../textures/blocks/bundledColTop/8.png | Bin 0 -> 637 bytes .../textures/blocks/bundledColTop/9.png | Bin 0 -> 629 bytes .../rpwiring/textures/blocks/bundledFace.png | Bin 0 -> 448 bytes .../rpwiring/textures/blocks/bundledTop.png | Bin 0 -> 560 bytes .../textures/blocks/highPowerFace.png | Bin 0 -> 294 bytes .../rpwiring/textures/blocks/highPowerTop.png | Bin 0 -> 544 bytes .../textures/blocks/insulatedFaceOff/.png | Bin 0 -> 289 bytes .../textures/blocks/insulatedFaceOff/0.png | Bin 0 -> 280 bytes .../textures/blocks/insulatedFaceOff/1.png | Bin 0 -> 266 bytes .../textures/blocks/insulatedFaceOff/10.png | Bin 0 -> 274 bytes .../textures/blocks/insulatedFaceOff/11.png | Bin 0 -> 270 bytes .../textures/blocks/insulatedFaceOff/12.png | Bin 0 -> 247 bytes .../textures/blocks/insulatedFaceOff/13.png | Bin 0 -> 244 bytes .../textures/blocks/insulatedFaceOff/14.png | Bin 0 -> 267 bytes .../textures/blocks/insulatedFaceOff/15.png | Bin 0 -> 235 bytes .../textures/blocks/insulatedFaceOff/2.png | Bin 0 -> 290 bytes .../textures/blocks/insulatedFaceOff/3.png | Bin 0 -> 289 bytes .../textures/blocks/insulatedFaceOff/4.png | Bin 0 -> 257 bytes .../textures/blocks/insulatedFaceOff/5.png | Bin 0 -> 268 bytes .../textures/blocks/insulatedFaceOff/6.png | Bin 0 -> 289 bytes .../textures/blocks/insulatedFaceOff/7.png | Bin 0 -> 257 bytes .../textures/blocks/insulatedFaceOff/8.png | Bin 0 -> 267 bytes .../textures/blocks/insulatedFaceOff/9.png | Bin 0 -> 251 bytes .../textures/blocks/insulatedFaceOn/0.png | Bin 0 -> 274 bytes .../textures/blocks/insulatedFaceOn/1.png | Bin 0 -> 266 bytes .../textures/blocks/insulatedFaceOn/10.png | Bin 0 -> 282 bytes .../textures/blocks/insulatedFaceOn/11.png | Bin 0 -> 271 bytes .../textures/blocks/insulatedFaceOn/12.png | Bin 0 -> 249 bytes .../textures/blocks/insulatedFaceOn/13.png | Bin 0 -> 244 bytes .../textures/blocks/insulatedFaceOn/14.png | Bin 0 -> 267 bytes .../textures/blocks/insulatedFaceOn/15.png | Bin 0 -> 232 bytes .../textures/blocks/insulatedFaceOn/2.png | Bin 0 -> 287 bytes .../textures/blocks/insulatedFaceOn/3.png | Bin 0 -> 289 bytes .../textures/blocks/insulatedFaceOn/4.png | Bin 0 -> 254 bytes .../textures/blocks/insulatedFaceOn/5.png | Bin 0 -> 269 bytes .../textures/blocks/insulatedFaceOn/6.png | Bin 0 -> 289 bytes .../textures/blocks/insulatedFaceOn/7.png | Bin 0 -> 259 bytes .../textures/blocks/insulatedFaceOn/8.png | Bin 0 -> 265 bytes .../textures/blocks/insulatedFaceOn/9.png | Bin 0 -> 253 bytes .../textures/blocks/insulatedTop/0.png | Bin 0 -> 240 bytes .../textures/blocks/insulatedTop/1.png | Bin 0 -> 239 bytes .../textures/blocks/insulatedTop/10.png | Bin 0 -> 251 bytes .../textures/blocks/insulatedTop/11.png | Bin 0 -> 234 bytes .../textures/blocks/insulatedTop/12.png | Bin 0 -> 232 bytes .../textures/blocks/insulatedTop/13.png | Bin 0 -> 216 bytes .../textures/blocks/insulatedTop/14.png | Bin 0 -> 237 bytes .../textures/blocks/insulatedTop/15.png | Bin 0 -> 212 bytes .../textures/blocks/insulatedTop/2.png | Bin 0 -> 249 bytes .../textures/blocks/insulatedTop/3.png | Bin 0 -> 255 bytes .../textures/blocks/insulatedTop/4.png | Bin 0 -> 229 bytes .../textures/blocks/insulatedTop/5.png | Bin 0 -> 239 bytes .../textures/blocks/insulatedTop/6.png | Bin 0 -> 256 bytes .../textures/blocks/insulatedTop/7.png | Bin 0 -> 229 bytes .../textures/blocks/insulatedTop/8.png | Bin 0 -> 239 bytes .../textures/blocks/insulatedTop/9.png | Bin 0 -> 225 bytes .../rpwiring/textures/blocks/jumboCent.png | Bin 0 -> 235 bytes .../textures/blocks/jumboCentSide.png | Bin 0 -> 113 bytes .../rpwiring/textures/blocks/jumboCorners.png | Bin 0 -> 267 bytes .../rpwiring/textures/blocks/jumboEnd.png | Bin 0 -> 180 bytes .../rpwiring/textures/blocks/jumboSides.png | Bin 0 -> 272 bytes .../rpwiring/textures/blocks/jumboTop.png | Bin 0 -> 303 bytes .../rpwiring/textures/blocks/powerFace.png | Bin 0 -> 240 bytes .../rpwiring/textures/blocks/powerTop.png | Bin 0 -> 337 bytes .../textures/blocks/redwireCableOff.png | Bin 0 -> 191 bytes .../textures/blocks/redwireCableOn.png | Bin 0 -> 197 bytes .../rpwiring/textures/blocks/redwireFace.png | Bin 0 -> 161 bytes .../rpwiring/textures/blocks/redwireTop.png | Bin 0 -> 228 bytes .../assets/rpworld/textures/blocks/basalt.png | Bin 0 -> 502 bytes .../rpworld/textures/blocks/basaltBrick.png | Bin 0 -> 586 bytes .../rpworld/textures/blocks/basaltCobble.png | Bin 0 -> 695 bytes .../rpworld/textures/blocks/basaltPaver.png | Bin 0 -> 555 bytes .../textures/blocks/chiseledBasaltBrick.png | Bin 0 -> 613 bytes .../rpworld/textures/blocks/flaxCrop/0.png | Bin 0 -> 627 bytes .../rpworld/textures/blocks/flaxCrop/1.png | Bin 0 -> 637 bytes .../rpworld/textures/blocks/flaxCrop/2.png | Bin 0 -> 463 bytes .../rpworld/textures/blocks/flaxCrop/3.png | Bin 0 -> 555 bytes .../rpworld/textures/blocks/flaxCrop/4.png | Bin 0 -> 603 bytes .../rpworld/textures/blocks/flaxCrop/5.png | Bin 0 -> 585 bytes .../rpworld/textures/blocks/indigoFlower.png | Bin 0 -> 468 bytes .../assets/rpworld/textures/blocks/marble.png | Bin 0 -> 620 bytes .../rpworld/textures/blocks/marbleBrick.png | Bin 0 -> 727 bytes .../assets/rpworld/textures/blocks/ore/0.png | Bin 0 -> 464 bytes .../assets/rpworld/textures/blocks/ore/1.png | Bin 0 -> 461 bytes .../assets/rpworld/textures/blocks/ore/2.png | Bin 0 -> 469 bytes .../assets/rpworld/textures/blocks/ore/3.png | Bin 0 -> 422 bytes .../assets/rpworld/textures/blocks/ore/4.png | Bin 0 -> 401 bytes .../assets/rpworld/textures/blocks/ore/5.png | Bin 0 -> 419 bytes .../assets/rpworld/textures/blocks/ore/6.png | Bin 0 -> 420 bytes .../assets/rpworld/textures/blocks/ore/7.png | Bin 0 -> 444 bytes .../textures/blocks/rubberLeaves_opaque.png | Bin 0 -> 510 bytes .../blocks/rubberLeaves_transparent.png | Bin 0 -> 553 bytes .../rpworld/textures/blocks/rubberLogSide.png | Bin 0 -> 526 bytes .../rpworld/textures/blocks/rubberLogTop.png | Bin 0 -> 798 bytes .../rpworld/textures/blocks/rubberSapling.png | Bin 0 -> 434 bytes .../rpworld/textures/blocks/storage/0.png | Bin 0 -> 802 bytes .../rpworld/textures/blocks/storage/1.png | Bin 0 -> 929 bytes .../rpworld/textures/blocks/storage/2.png | Bin 0 -> 1206 bytes .../rpworld/textures/blocks/storage/3.png | Bin 0 -> 769 bytes .../rpworld/textures/blocks/storage/4.png | Bin 0 -> 647 bytes .../rpworld/textures/blocks/storage/5.png | Bin 0 -> 758 bytes .../rpworld/textures/blocks/storage/6.png | Bin 0 -> 418 bytes .../rpworld/textures/blocks/storage/7.png | Bin 0 -> 563 bytes .../assets/rpworld/textures/items/athame.png | Bin 0 -> 292 bytes .../textures/items/axeGreenSapphire.png | Bin 0 -> 283 bytes .../assets/rpworld/textures/items/axeRuby.png | Bin 0 -> 283 bytes .../rpworld/textures/items/axeSapphire.png | Bin 0 -> 282 bytes .../rpworld/textures/items/brushDry.png | Bin 0 -> 257 bytes .../rpworld/textures/items/handsawDiamond.png | Bin 0 -> 211 bytes .../textures/items/handsawGreenSapphire.png | Bin 0 -> 211 bytes .../rpworld/textures/items/handsawIron.png | Bin 0 -> 207 bytes .../rpworld/textures/items/handsawRuby.png | Bin 0 -> 211 bytes .../textures/items/handsawSapphire.png | Bin 0 -> 211 bytes .../textures/items/hoeGreenSapphire.png | Bin 0 -> 228 bytes .../assets/rpworld/textures/items/hoeRuby.png | Bin 0 -> 228 bytes .../rpworld/textures/items/hoeSapphire.png | Bin 0 -> 228 bytes .../rpworld/textures/items/itemSeedsFlax.png | Bin 0 -> 300 bytes .../rpworld/textures/items/paintBrush/0.png | Bin 0 -> 275 bytes .../rpworld/textures/items/paintBrush/1.png | Bin 0 -> 281 bytes .../rpworld/textures/items/paintBrush/10.png | Bin 0 -> 282 bytes .../rpworld/textures/items/paintBrush/11.png | Bin 0 -> 272 bytes .../rpworld/textures/items/paintBrush/12.png | Bin 0 -> 280 bytes .../rpworld/textures/items/paintBrush/13.png | Bin 0 -> 276 bytes .../rpworld/textures/items/paintBrush/14.png | Bin 0 -> 275 bytes .../rpworld/textures/items/paintBrush/15.png | Bin 0 -> 279 bytes .../rpworld/textures/items/paintBrush/2.png | Bin 0 -> 283 bytes .../rpworld/textures/items/paintBrush/3.png | Bin 0 -> 283 bytes .../rpworld/textures/items/paintBrush/4.png | Bin 0 -> 281 bytes .../rpworld/textures/items/paintBrush/5.png | Bin 0 -> 275 bytes .../rpworld/textures/items/paintBrush/6.png | Bin 0 -> 284 bytes .../rpworld/textures/items/paintBrush/7.png | Bin 0 -> 278 bytes .../rpworld/textures/items/paintBrush/8.png | Bin 0 -> 282 bytes .../rpworld/textures/items/paintBrush/9.png | Bin 0 -> 278 bytes .../rpworld/textures/items/paintCan/0.png | Bin 0 -> 366 bytes .../rpworld/textures/items/paintCan/1.png | Bin 0 -> 393 bytes .../rpworld/textures/items/paintCan/10.png | Bin 0 -> 392 bytes .../rpworld/textures/items/paintCan/11.png | Bin 0 -> 386 bytes .../rpworld/textures/items/paintCan/12.png | Bin 0 -> 360 bytes .../rpworld/textures/items/paintCan/13.png | Bin 0 -> 376 bytes .../rpworld/textures/items/paintCan/14.png | Bin 0 -> 387 bytes .../rpworld/textures/items/paintCan/15.png | Bin 0 -> 320 bytes .../rpworld/textures/items/paintCan/2.png | Bin 0 -> 389 bytes .../rpworld/textures/items/paintCan/3.png | Bin 0 -> 391 bytes .../rpworld/textures/items/paintCan/4.png | Bin 0 -> 390 bytes .../rpworld/textures/items/paintCan/5.png | Bin 0 -> 390 bytes .../rpworld/textures/items/paintCan/6.png | Bin 0 -> 391 bytes .../rpworld/textures/items/paintCan/7.png | Bin 0 -> 322 bytes .../rpworld/textures/items/paintCan/8.png | Bin 0 -> 354 bytes .../rpworld/textures/items/paintCan/9.png | Bin 0 -> 391 bytes .../rpworld/textures/items/paintCanEmpty.png | Bin 0 -> 311 bytes .../textures/items/pickaxeGreenSapphire.png | Bin 0 -> 485 bytes .../rpworld/textures/items/pickaxeRuby.png | Bin 0 -> 474 bytes .../textures/items/pickaxeSapphire.png | Bin 0 -> 685 bytes .../rpworld/textures/items/seedBagEmpty.png | Bin 0 -> 354 bytes .../rpworld/textures/items/seedBagFull.png | Bin 0 -> 368 bytes .../rpworld/textures/items/seedsFlax.png | Bin 0 -> 300 bytes .../textures/items/shovelGreenSapphire.png | Bin 0 -> 388 bytes .../rpworld/textures/items/shovelRuby.png | Bin 0 -> 392 bytes .../rpworld/textures/items/shovelSapphire.png | Bin 0 -> 381 bytes .../rpworld/textures/items/sickleDiamond.png | Bin 0 -> 188 bytes .../rpworld/textures/items/sickleGold.png | Bin 0 -> 188 bytes .../textures/items/sickleGreenSapphire.png | Bin 0 -> 187 bytes .../rpworld/textures/items/sickleIron.png | Bin 0 -> 191 bytes .../rpworld/textures/items/sickleRuby.png | Bin 0 -> 187 bytes .../rpworld/textures/items/sickleSapphire.png | Bin 0 -> 205 bytes .../rpworld/textures/items/sickleStone.png | Bin 0 -> 187 bytes .../rpworld/textures/items/sickleWood.png | Bin 0 -> 187 bytes .../textures/items/swordGreenSapphire.png | Bin 0 -> 214 bytes .../rpworld/textures/items/swordRuby.png | Bin 0 -> 214 bytes .../rpworld/textures/items/swordSapphire.png | Bin 0 -> 214 bytes .../rpworld/textures/items/woolCard.png | Bin 0 -> 377 bytes src/main/resources/mcmod.info | 136 ++ 1692 files changed, 62734 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cofh/api/CoFHAPIProps.java create mode 100644 src/main/java/cofh/api/energy/EnergyStorage.java create mode 100644 src/main/java/cofh/api/energy/IEnergyConnection.java create mode 100644 src/main/java/cofh/api/energy/IEnergyContainerItem.java create mode 100644 src/main/java/cofh/api/energy/IEnergyHandler.java create mode 100644 src/main/java/cofh/api/energy/IEnergyProvider.java create mode 100644 src/main/java/cofh/api/energy/IEnergyReceiver.java create mode 100644 src/main/java/cofh/api/energy/IEnergyStorage.java create mode 100644 src/main/java/cofh/api/energy/IEnergyTransport.java create mode 100644 src/main/java/cofh/api/energy/ItemEnergyContainer.java create mode 100644 src/main/java/cofh/api/energy/TileEnergyHandler.java create mode 100644 src/main/java/com/eloraam/redpower/Flags.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerBase.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerCompat.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerControl.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerCore.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerLighting.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerLogic.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerMachine.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerNEIPlugin.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerWiring.java create mode 100644 src/main/java/com/eloraam/redpower/RedPowerWorld.java create mode 100644 src/main/java/com/eloraam/redpower/base/BlockAppliance.java create mode 100644 src/main/java/com/eloraam/redpower/base/BlockMicro.java create mode 100644 src/main/java/com/eloraam/redpower/base/BlockNikolite.java create mode 100644 src/main/java/com/eloraam/redpower/base/ContainerAdvBench.java create mode 100644 src/main/java/com/eloraam/redpower/base/ContainerAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/base/ContainerBag.java create mode 100644 src/main/java/com/eloraam/redpower/base/ContainerBusId.java create mode 100644 src/main/java/com/eloraam/redpower/base/GuiAdvBench.java create mode 100644 src/main/java/com/eloraam/redpower/base/GuiAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/base/GuiBag.java create mode 100644 src/main/java/com/eloraam/redpower/base/GuiBusId.java create mode 100644 src/main/java/com/eloraam/redpower/base/InventorySubCraft.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemBag.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemDrawplate.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemDyeIndigo.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemHandsaw.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemMicro.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemPlan.java create mode 100644 src/main/java/com/eloraam/redpower/base/ItemScrewdriver.java create mode 100644 src/main/java/com/eloraam/redpower/base/RecipeBag.java create mode 100644 src/main/java/com/eloraam/redpower/base/RenderAdvBench.java create mode 100644 src/main/java/com/eloraam/redpower/base/RenderAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/base/SlotAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/base/SlotCraftRefill.java create mode 100644 src/main/java/com/eloraam/redpower/base/TileAdvBench.java create mode 100644 src/main/java/com/eloraam/redpower/base/TileAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/base/TileAppliance.java create mode 100644 src/main/java/com/eloraam/redpower/compat/BlockMachineCompat.java create mode 100644 src/main/java/com/eloraam/redpower/compat/ItemMachineCompat.java create mode 100644 src/main/java/com/eloraam/redpower/compat/RenderBlueEngine.java create mode 100644 src/main/java/com/eloraam/redpower/compat/TileBlueEngine.java create mode 100644 src/main/java/com/eloraam/redpower/compat/TileMachineCompat.java create mode 100644 src/main/java/com/eloraam/redpower/control/BlockPeripheral.java create mode 100644 src/main/java/com/eloraam/redpower/control/ContainerCPU.java create mode 100644 src/main/java/com/eloraam/redpower/control/ContainerDisplay.java create mode 100644 src/main/java/com/eloraam/redpower/control/GuiCPU.java create mode 100644 src/main/java/com/eloraam/redpower/control/GuiDisplay.java create mode 100644 src/main/java/com/eloraam/redpower/control/ItemBackplane.java create mode 100644 src/main/java/com/eloraam/redpower/control/ItemDisk.java create mode 100644 src/main/java/com/eloraam/redpower/control/MicroPlacementRibbon.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderBackplane.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderCPU.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderDiskDrive.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderDisplay.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderIOExpander.java create mode 100644 src/main/java/com/eloraam/redpower/control/RenderRibbon.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileBackplane.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileCPU.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileDiskDrive.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileDisplay.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileIOExpander.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileRAM.java create mode 100644 src/main/java/com/eloraam/redpower/control/TileRibbon.java create mode 100644 src/main/java/com/eloraam/redpower/core/AchieveLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/BlockCoverable.java create mode 100644 src/main/java/com/eloraam/redpower/core/BlockExtended.java create mode 100644 src/main/java/com/eloraam/redpower/core/BlockMultiblock.java create mode 100644 src/main/java/com/eloraam/redpower/core/BlockMultipart.java create mode 100644 src/main/java/com/eloraam/redpower/core/BlockReplaceHelper.java create mode 100644 src/main/java/com/eloraam/redpower/core/BluePowerConductor.java create mode 100644 src/main/java/com/eloraam/redpower/core/BluePowerEndpoint.java create mode 100644 src/main/java/com/eloraam/redpower/core/BluePowerLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/Config.java create mode 100644 src/main/java/com/eloraam/redpower/core/CoreEvents.java create mode 100644 src/main/java/com/eloraam/redpower/core/CoreLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/CoverLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/CoverRecipe.java create mode 100644 src/main/java/com/eloraam/redpower/core/CoverRenderer.java create mode 100644 src/main/java/com/eloraam/redpower/core/CraftLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/CreativeExtraTabs.java create mode 100644 src/main/java/com/eloraam/redpower/core/DiskLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/EntityCustomDiggingFX.java create mode 100644 src/main/java/com/eloraam/redpower/core/EnvironLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/FakePlayerNetHandler.java create mode 100644 src/main/java/com/eloraam/redpower/core/FluidBuffer.java create mode 100644 src/main/java/com/eloraam/redpower/core/FractalLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/FrameLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/GuiExtended.java create mode 100644 src/main/java/com/eloraam/redpower/core/GuiWidget.java create mode 100644 src/main/java/com/eloraam/redpower/core/IBlockHardness.java create mode 100644 src/main/java/com/eloraam/redpower/core/IBluePowerConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IChargeable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/ICoverable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IFrameLink.java create mode 100644 src/main/java/com/eloraam/redpower/core/IFrameSupport.java create mode 100644 src/main/java/com/eloraam/redpower/core/IHandleGuiEvent.java create mode 100644 src/main/java/com/eloraam/redpower/core/IMicroPlacement.java create mode 100644 src/main/java/com/eloraam/redpower/core/IMultiblock.java create mode 100644 src/main/java/com/eloraam/redpower/core/IMultipart.java create mode 100644 src/main/java/com/eloraam/redpower/core/IPaintable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IPipeConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IRedPowerConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IRedPowerWiring.java create mode 100644 src/main/java/com/eloraam/redpower/core/IRedbusConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/IRotatable.java create mode 100644 src/main/java/com/eloraam/redpower/core/ITubeConnectable.java create mode 100644 src/main/java/com/eloraam/redpower/core/ITubeFlow.java create mode 100644 src/main/java/com/eloraam/redpower/core/ITubeRequest.java create mode 100644 src/main/java/com/eloraam/redpower/core/IWiring.java create mode 100644 src/main/java/com/eloraam/redpower/core/ItemExtended.java create mode 100644 src/main/java/com/eloraam/redpower/core/ItemPartialCraft.java create mode 100644 src/main/java/com/eloraam/redpower/core/ItemParts.java create mode 100644 src/main/java/com/eloraam/redpower/core/ItemTextured.java create mode 100644 src/main/java/com/eloraam/redpower/core/MachineLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/MathLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/Matrix3.java create mode 100644 src/main/java/com/eloraam/redpower/core/MultiLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/OreStack.java create mode 100644 src/main/java/com/eloraam/redpower/core/PacketGuiEvent.java create mode 100644 src/main/java/com/eloraam/redpower/core/PacketHandler.java create mode 100644 src/main/java/com/eloraam/redpower/core/PipeLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/PowerLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/Quat.java create mode 100644 src/main/java/com/eloraam/redpower/core/RedPowerLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/RedbusLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/ReflectLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderContext.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderCovers.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderCustomBlock.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderEvents.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderHighlight.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderModel.java create mode 100644 src/main/java/com/eloraam/redpower/core/RenderSimpleCovered.java create mode 100644 src/main/java/com/eloraam/redpower/core/SlotLocked.java create mode 100644 src/main/java/com/eloraam/redpower/core/TagFile.java create mode 100644 src/main/java/com/eloraam/redpower/core/TexVertex.java create mode 100644 src/main/java/com/eloraam/redpower/core/TileCoverable.java create mode 100644 src/main/java/com/eloraam/redpower/core/TileCovered.java create mode 100644 src/main/java/com/eloraam/redpower/core/TileExtended.java create mode 100644 src/main/java/com/eloraam/redpower/core/TileMultiblock.java create mode 100644 src/main/java/com/eloraam/redpower/core/TileMultipart.java create mode 100644 src/main/java/com/eloraam/redpower/core/TubeBuffer.java create mode 100644 src/main/java/com/eloraam/redpower/core/TubeFlow.java create mode 100644 src/main/java/com/eloraam/redpower/core/TubeItem.java create mode 100644 src/main/java/com/eloraam/redpower/core/TubeLib.java create mode 100644 src/main/java/com/eloraam/redpower/core/Vector3.java create mode 100644 src/main/java/com/eloraam/redpower/core/WirePathfinder.java create mode 100644 src/main/java/com/eloraam/redpower/core/WorldCoord.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/BlockLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/BlockShapedLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/ItemLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/RenderLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/RenderShapedLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/TileLamp.java create mode 100644 src/main/java/com/eloraam/redpower/lighting/TileShapedLamp.java create mode 100644 src/main/java/com/eloraam/redpower/logic/BlockLogic.java create mode 100644 src/main/java/com/eloraam/redpower/logic/ContainerCounter.java create mode 100644 src/main/java/com/eloraam/redpower/logic/ContainerTimer.java create mode 100644 src/main/java/com/eloraam/redpower/logic/GuiCounter.java create mode 100644 src/main/java/com/eloraam/redpower/logic/GuiTimer.java create mode 100644 src/main/java/com/eloraam/redpower/logic/IPointerTile.java create mode 100644 src/main/java/com/eloraam/redpower/logic/ItemLogic.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogic.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogicAdv.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogicArray.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogicPointer.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogicSimple.java create mode 100644 src/main/java/com/eloraam/redpower/logic/RenderLogicStorage.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogic.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogicAdv.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogicArray.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogicPointer.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogicSimple.java create mode 100644 src/main/java/com/eloraam/redpower/logic/TileLogicStorage.java create mode 100644 src/main/java/com/eloraam/redpower/machine/BlockFrame.java create mode 100644 src/main/java/com/eloraam/redpower/machine/BlockMachine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/BlockMachinePanel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerAssemble.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerBatteryBox.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerBlueAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerBlueFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerBufferChest.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerChargingBench.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerDeploy.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerEject.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerFilter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerItemDetect.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerManager.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerRegulator.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerRetriever.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerSorter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ContainerWindTurbine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiAssemble.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiBatteryBox.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiBlueAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiBlueFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiBufferChest.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiChargingBench.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiDeploy.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiEject.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiFilter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiItemDetect.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiManager.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiRegulator.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiRetriever.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiSorter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/GuiWindTurbine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ItemBattery.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ItemMachinePanel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ItemSonicDriver.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ItemVoltmeter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/ItemWindmill.java create mode 100644 src/main/java/com/eloraam/redpower/machine/MicroPlacementTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderAccel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderBatteryBox.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderBlueAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderBlueFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderBreaker.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderBufferChest.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderChargingBench.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderFrame.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderFrameMoving.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderFrameRedstoneTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderFrameTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderGrate.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderMachine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderMotor.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderPipe.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderPump.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderRedstoneTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderSolarPanel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderThermopile.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderTransformer.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/RenderWindTurbine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileAccel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileAssemble.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileBatteryBox.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileBlueAlloyFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileBlueFurnace.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileBreaker.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileBufferChest.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileChargingBench.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileDeploy.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileDeployBase.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileEject.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileEjectBase.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileFilter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileFrame.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileFrameMoving.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileFrameRedstoneTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileFrameTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileGrate.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileIgniter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileItemDetect.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileMachine.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileMachinePanel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileMagTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileManager.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileMotor.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TilePipe.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TilePump.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileRedstoneTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileRegulator.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileRelay.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileRestrictTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileRetriever.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileSolarPanel.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileSorter.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileSortron.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileThermopile.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileTransformer.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileTranspose.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileTube.java create mode 100644 src/main/java/com/eloraam/redpower/machine/TileWindTurbine.java create mode 100644 src/main/java/com/eloraam/redpower/nei/AlloyFurnaceOverlayHandler.java create mode 100644 src/main/java/com/eloraam/redpower/nei/AlloyFurnaceRecipeHandler.java create mode 100644 src/main/java/com/eloraam/redpower/nei/ComboGenerator.java create mode 100644 src/main/java/com/eloraam/redpower/nei/MicroRecipeHandler.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/MicroPlacementJacket.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/MicroPlacementWire.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/RenderRedwire.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/RenderWiring.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/TileBluewire.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/TileCable.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/TileInsulatedWire.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/TileRedwire.java create mode 100644 src/main/java/com/eloraam/redpower/wiring/TileWiring.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockBrickMossifier.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCobbleMossifier.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomCrops.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomFlower.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomLeaves.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomLog.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomOre.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockCustomStone.java create mode 100644 src/main/java/com/eloraam/redpower/world/BlockStorage.java create mode 100644 src/main/java/com/eloraam/redpower/world/ContainerSeedBag.java create mode 100644 src/main/java/com/eloraam/redpower/world/EnchantmentDisjunction.java create mode 100644 src/main/java/com/eloraam/redpower/world/EnchantmentVorpal.java create mode 100644 src/main/java/com/eloraam/redpower/world/GuiSeedBag.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemAthame.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomAxe.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomFlower.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomHoe.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomOre.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomPickaxe.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomSeeds.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomShovel.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomStone.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemCustomSword.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemPaintBrush.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemPaintCan.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemSeedBag.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemSickle.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemStorage.java create mode 100644 src/main/java/com/eloraam/redpower/world/ItemWoolCard.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldEvents.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldGenCustomOre.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldGenHandler.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldGenMarble.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldGenRubberTree.java create mode 100644 src/main/java/com/eloraam/redpower/world/WorldGenVolcano.java create mode 100644 src/main/resources/assets/rpbase/lang/en_US.lang create mode 100644 src/main/resources/assets/rpbase/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpbase/rpbanner.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceFront.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceFrontOn.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceSide.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceVert.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/projectTableBottom.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/projectTableFront.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/projectTableSide.png create mode 100644 src/main/resources/assets/rpbase/textures/blocks/projectTableTop.png create mode 100644 src/main/resources/assets/rpbase/textures/gui/advbench.png create mode 100644 src/main/resources/assets/rpbase/textures/gui/afurnacegui.png create mode 100644 src/main/resources/assets/rpbase/textures/gui/baggui.png create mode 100644 src/main/resources/assets/rpbase/textures/gui/idgui.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/0.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/1.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/10.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/11.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/12.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/13.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/14.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/15.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/2.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/3.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/4.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/5.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/6.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/7.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/8.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bag/9.png create mode 100644 src/main/resources/assets/rpbase/textures/items/bouleSilicon.png create mode 100644 src/main/resources/assets/rpbase/textures/items/btMotor.png create mode 100644 src/main/resources/assets/rpbase/textures/items/canvas.png create mode 100644 src/main/resources/assets/rpbase/textures/items/copperCoil.png create mode 100644 src/main/resources/assets/rpbase/textures/items/copperIngot.png create mode 100644 src/main/resources/assets/rpbase/textures/items/diamondDrawplate.png create mode 100644 src/main/resources/assets/rpbase/textures/items/dustSilver.png create mode 100644 src/main/resources/assets/rpbase/textures/items/dustTungsten.png create mode 100644 src/main/resources/assets/rpbase/textures/items/dyeIndigo.png create mode 100644 src/main/resources/assets/rpbase/textures/items/fineCopper.png create mode 100644 src/main/resources/assets/rpbase/textures/items/fineIron.png create mode 100644 src/main/resources/assets/rpbase/textures/items/greenSapphire.png create mode 100644 src/main/resources/assets/rpbase/textures/items/ingotBlue.png create mode 100644 src/main/resources/assets/rpbase/textures/items/ingotBrass.png create mode 100644 src/main/resources/assets/rpbase/textures/items/ingotRed.png create mode 100644 src/main/resources/assets/rpbase/textures/items/ingotTungsten.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/0.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/1.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/10.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/11.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/12.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/13.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/14.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/15.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/2.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/3.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/4.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/5.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/6.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/7.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/8.png create mode 100644 src/main/resources/assets/rpbase/textures/items/lumar/9.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nikolite.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nuggetCopper.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nuggetIron.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nuggetSilver.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nuggetTin.png create mode 100644 src/main/resources/assets/rpbase/textures/items/nuggetTungsten.png create mode 100644 src/main/resources/assets/rpbase/textures/items/paintCan.png create mode 100644 src/main/resources/assets/rpbase/textures/items/planBlank.png create mode 100644 src/main/resources/assets/rpbase/textures/items/planFull.png create mode 100644 src/main/resources/assets/rpbase/textures/items/ruby.png create mode 100644 src/main/resources/assets/rpbase/textures/items/sapphire.png create mode 100644 src/main/resources/assets/rpbase/textures/items/screwdriver.png create mode 100644 src/main/resources/assets/rpbase/textures/items/silverIngot.png create mode 100644 src/main/resources/assets/rpbase/textures/items/tinIngot.png create mode 100644 src/main/resources/assets/rpbase/textures/items/tinPlate.png create mode 100644 src/main/resources/assets/rpbase/textures/items/waferBlue.png create mode 100644 src/main/resources/assets/rpbase/textures/items/waferRed.png create mode 100644 src/main/resources/assets/rpbase/textures/items/waferSilicon.png create mode 100644 src/main/resources/assets/rpcompat/lang/en_US.lang create mode 100644 src/main/resources/assets/rpcompat/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpcompat/models/btengine1.obj create mode 100644 src/main/resources/assets/rpcompat/models/btengine2.obj create mode 100644 src/main/resources/assets/rpcompat/models/btengine3.obj create mode 100644 src/main/resources/assets/rpcompat/models/compat1.png create mode 100644 src/main/resources/assets/rpcompat/textures/items/densePlateTungsten.png create mode 100644 src/main/resources/assets/rpcompat/textures/items/gear.png create mode 100644 src/main/resources/assets/rpcontrol/forth/redforth.img create mode 100644 src/main/resources/assets/rpcontrol/forth/redforthxp.img create mode 100644 src/main/resources/assets/rpcontrol/forth/rpcboot.bin create mode 100644 src/main/resources/assets/rpcontrol/lang/en_US.lang create mode 100644 src/main/resources/assets/rpcontrol/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpcontrol/models/modem.obj create mode 100644 src/main/resources/assets/rpcontrol/models/modem.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/backplaneFace.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/backplaneSide.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/backplaneTop.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/cpuFront.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/diskDriveFront.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/diskDriveFrontFull.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/diskDriveFrontOn.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/diskDriveSide.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/diskDriveTop.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/displayFront.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/peripheralBack.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/peripheralBottom.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/peripheralSide.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/peripheralTop.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/ram8kFace.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/ram8kSide.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/ram8kTop.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/ribbonFace.png create mode 100644 src/main/resources/assets/rpcontrol/textures/blocks/ribbonTop.png create mode 100644 src/main/resources/assets/rpcontrol/textures/gui/cpugui.png create mode 100644 src/main/resources/assets/rpcontrol/textures/gui/displaygui.png create mode 100644 src/main/resources/assets/rpcontrol/textures/items/disk.png create mode 100644 src/main/resources/assets/rpcontrol/textures/items/diskForth.png create mode 100644 src/main/resources/assets/rpcontrol/textures/items/diskForthExtended.png create mode 100644 src/main/resources/assets/rpcore/default.cfg create mode 100644 src/main/resources/assets/rpcore/lang/en_US.lang create mode 100644 src/main/resources/assets/rpcore/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpcore/textures/blocks/missing.png create mode 100644 src/main/resources/assets/rplighting/lang/en_US.lang create mode 100644 src/main/resources/assets/rplighting/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rplighting/models/shlamp.png create mode 100644 src/main/resources/assets/rplighting/models/shlamp1.obj create mode 100644 src/main/resources/assets/rplighting/models/shlamp2.obj create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOff/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/lampOn/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line0/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line1/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line10/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line11/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line12/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line13/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line14/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line15/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line2/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line3/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line4/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line5/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line6/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line7/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line8/9.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/0.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/1.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/10.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/11.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/12.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/13.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/14.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/15.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/2.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/3.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/4.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/5.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/6.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/7.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/8.png create mode 100644 src/main/resources/assets/rplighting/textures/blocks/out/line9/9.png create mode 100644 src/main/resources/assets/rplogic/lang/en_US.lang create mode 100644 src/main/resources/assets/rplogic/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rplogic/models/arraycells.obj create mode 100644 src/main/resources/assets/rplogic/models/arraytex.png create mode 100644 src/main/resources/assets/rplogic/models/busxcvr.obj create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/0.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/1.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/10.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/100.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/101.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/102.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/103.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/104.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/105.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/106.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/107.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/108.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/109.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/11.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/110.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/111.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/112.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/113.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/114.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/115.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/116.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/117.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/118.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/119.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/12.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/120.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/121.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/122.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/123.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/124.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/125.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/126.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/127.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/128.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/129.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/13.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/130.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/131.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/132.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/133.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/134.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/135.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/136.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/137.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/138.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/139.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/14.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/140.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/141.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/142.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/143.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/144.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/145.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/146.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/147.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/148.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/149.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/15.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/150.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/151.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/152.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/153.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/154.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/155.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/156.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/157.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/158.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/159.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/16.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/160.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/161.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/162.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/163.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/164.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/165.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/166.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/167.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/168.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/169.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/17.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/170.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/171.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/172.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/173.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/174.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/175.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/176.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/177.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/178.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/179.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/18.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/180.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/181.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/182.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/183.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/184.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/185.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/186.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/187.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/188.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/189.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/19.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/190.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/191.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/192.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/193.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/194.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/195.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/196.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/197.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/198.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/199.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/2.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/20.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/200.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/201.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/202.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/203.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/204.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/205.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/206.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/207.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/208.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/209.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/21.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/210.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/211.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/212.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/213.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/214.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/215.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/216.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/217.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/218.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/219.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/22.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/220.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/221.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/222.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/223.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/224.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/225.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/226.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/227.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/228.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/229.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/23.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/230.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/231.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/24.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/25.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/26.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/27.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/28.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/29.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/3.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/30.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/31.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/32.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/33.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/34.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/35.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/36.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/37.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/38.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/39.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/4.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/40.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/41.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/42.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/43.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/44.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/45.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/46.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/47.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/48.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/49.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/5.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/50.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/51.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/52.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/53.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/54.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/55.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/56.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/57.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/58.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/59.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/6.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/60.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/61.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/62.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/63.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/64.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/65.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/66.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/67.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/68.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/69.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/7.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/70.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/71.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/72.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/73.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/74.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/75.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/76.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/77.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/78.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/79.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/8.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/80.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/81.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/82.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/83.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/84.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/85.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/86.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/87.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/88.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/89.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/9.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/90.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/91.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/92.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/93.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/94.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/95.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/96.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/97.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/98.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic1/99.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/0.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/1.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/10.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/100.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/101.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/102.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/103.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/104.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/105.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/106.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/107.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/108.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/109.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/11.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/110.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/111.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/112.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/113.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/114.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/115.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/116.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/117.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/118.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/119.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/12.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/120.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/121.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/122.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/123.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/124.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/125.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/126.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/127.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/128.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/129.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/13.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/130.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/131.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/132.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/133.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/134.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/135.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/136.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/137.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/138.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/139.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/14.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/140.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/141.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/142.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/143.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/144.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/145.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/146.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/147.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/148.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/149.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/15.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/150.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/151.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/152.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/153.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/154.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/155.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/156.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/157.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/158.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/159.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/16.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/160.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/161.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/162.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/163.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/164.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/165.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/166.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/167.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/168.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/169.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/17.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/170.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/171.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/172.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/173.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/174.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/175.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/176.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/177.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/178.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/179.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/18.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/180.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/181.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/182.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/183.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/184.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/185.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/186.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/187.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/188.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/189.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/19.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/190.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/191.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/192.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/193.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/194.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/195.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/196.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/197.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/198.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/199.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/2.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/20.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/200.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/201.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/202.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/203.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/204.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/205.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/206.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/207.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/208.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/209.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/21.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/210.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/211.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/212.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/213.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/214.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/215.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/216.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/217.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/218.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/219.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/22.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/220.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/221.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/222.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/223.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/224.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/225.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/226.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/227.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/228.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/229.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/23.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/230.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/231.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/232.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/233.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/234.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/235.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/236.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/237.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/238.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/239.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/24.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/240.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/241.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/242.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/243.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/244.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/245.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/246.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/247.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/248.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/249.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/25.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/250.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/251.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/252.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/253.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/254.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/255.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/26.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/27.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/28.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/29.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/3.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/30.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/31.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/32.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/33.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/34.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/35.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/36.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/37.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/38.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/39.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/4.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/40.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/41.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/42.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/43.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/44.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/45.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/46.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/47.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/48.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/49.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/5.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/50.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/51.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/52.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/53.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/54.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/55.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/56.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/57.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/58.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/59.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/6.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/60.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/61.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/62.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/63.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/64.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/65.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/66.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/67.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/68.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/69.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/7.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/70.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/71.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/72.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/73.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/74.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/75.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/76.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/77.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/78.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/79.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/8.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/80.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/81.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/82.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/83.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/84.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/85.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/86.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/87.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/88.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/89.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/9.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/90.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/91.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/92.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/93.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/94.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/95.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/96.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/97.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/98.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/logic2/99.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/0.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/1.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/10.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/11.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/12.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/13.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/14.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/15.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/16.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/17.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/18.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/19.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/2.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/20.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/21.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/22.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/3.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/4.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/5.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/6.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/7.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/8.png create mode 100644 src/main/resources/assets/rplogic/textures/blocks/sensors/9.png create mode 100644 src/main/resources/assets/rplogic/textures/gui/countergui.png create mode 100644 src/main/resources/assets/rplogic/textures/gui/timersgui.png create mode 100644 src/main/resources/assets/rplogic/textures/items/anode.png create mode 100644 src/main/resources/assets/rplogic/textures/items/bundle.png create mode 100644 src/main/resources/assets/rplogic/textures/items/cathode.png create mode 100644 src/main/resources/assets/rplogic/textures/items/chip.png create mode 100644 src/main/resources/assets/rplogic/textures/items/plate.png create mode 100644 src/main/resources/assets/rplogic/textures/items/pointer.png create mode 100644 src/main/resources/assets/rplogic/textures/items/redWire.png create mode 100644 src/main/resources/assets/rplogic/textures/items/tchip.png create mode 100644 src/main/resources/assets/rplogic/textures/items/wafer.png create mode 100644 src/main/resources/assets/rplogic/textures/items/wire.png create mode 100644 src/main/resources/assets/rpmachine/lang/en_US.lang create mode 100644 src/main/resources/assets/rpmachine/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpmachine/models/accel.obj create mode 100644 src/main/resources/assets/rpmachine/models/machine1.png create mode 100644 src/main/resources/assets/rpmachine/models/machine2.png create mode 100644 src/main/resources/assets/rpmachine/models/pump1.obj create mode 100644 src/main/resources/assets/rpmachine/models/pump2.obj create mode 100644 src/main/resources/assets/rpmachine/models/transform.obj create mode 100644 src/main/resources/assets/rpmachine/models/vawt.obj create mode 100644 src/main/resources/assets/rpmachine/models/vawt.png create mode 100644 src/main/resources/assets/rpmachine/models/windmill.obj create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerBackOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/assemblerSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/4.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/5.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/6.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/7.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batterySide/8.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/batteryTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/breakerBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/breakerFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/breakerFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/breakerSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/breakerSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerBottom.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/4.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/4.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/4.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btChargerTopOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btFurnaceSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/btFurnaceTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/bufferBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/bufferFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/bufferSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/crate.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/deployerBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/deployerFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/deployerFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/deployerSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/deployerSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSideAltOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSideCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSideChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/detectorSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/ejectorSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/ejectorSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/electronicsBottom.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/filterSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/filterSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/frameCovered.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/frameCrossed.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/framePaneled.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/grateBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/grateEmptyBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/grateMossySide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/grateSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/igniterFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/igniterFrontOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/igniterSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/igniterSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFace.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFaceNR.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/magneticTubeRing.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/magneticTubeSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/magneticTubeSideNR.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSide/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSide/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSide/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSide/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorBottom.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorFrontActive.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorFrontActive.png.mcmeta create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorFrontCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorTopActive.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/motorTopActive.png.mcmeta create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/pipeFace.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/pipeFlanges.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/pipeSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/0.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/1.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/2.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/3.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSideAltCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSideCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSideChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/regulatorSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/relaySide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/relaySideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/relaySideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeFace.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeFaceColor.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeSideColor.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverSideCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverSideChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/retrieverSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/solarPanelSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/solarPanelTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterBackCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterBackChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterSideCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterSideChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sorterSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronBack.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSideAltCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSideCharged.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSideChargedOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/sortronSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/thermopileFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/thermopileSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/thermopileTop.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/transposerFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/transposerSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/transposerSideOn.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/tubeFace.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/tubeFaceColor.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/tubeItemOverlay.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/tubeSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/tubeSideColor.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/turbineFront.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/turbineSide.png create mode 100644 src/main/resources/assets/rpmachine/textures/blocks/turbineSideAlt.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/assembler.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/assembler2.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/batbox.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/btafurnace.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/btfurnace.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/buffer.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/charging.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/filter.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/filter9.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/itemdet.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/manager.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/regulator.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/retriever.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/sortmachine.png create mode 100644 src/main/resources/assets/rpmachine/textures/gui/windgui.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/battery.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/emptyBattery.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/sonicScrewdriver.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/voltmeter.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/windSailWood.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/windTurbine.png create mode 100644 src/main/resources/assets/rpmachine/textures/items/windmill.png create mode 100644 src/main/resources/assets/rpwiring/lang/en_US.lang create mode 100644 src/main/resources/assets/rpwiring/lang/ru_RU.lang create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bluewireCable.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledCable.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/0.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/1.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/10.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/11.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/12.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/13.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/14.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/15.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/2.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/3.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/4.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/5.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/6.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/7.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/8.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/9.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/0.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/1.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/10.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/11.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/12.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/13.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/14.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/15.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/2.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/3.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/4.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/5.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/6.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/7.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/8.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/9.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledFace.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/bundledTop.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/highPowerFace.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/highPowerTop.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/0.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/1.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/10.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/11.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/12.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/13.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/14.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/15.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/2.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/3.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/4.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/5.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/6.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/7.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/8.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/9.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/0.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/1.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/10.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/11.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/12.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/13.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/14.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/15.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/2.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/3.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/4.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/5.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/6.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/7.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/8.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/9.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/0.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/1.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/10.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/11.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/12.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/13.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/14.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/15.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/2.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/3.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/4.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/5.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/6.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/7.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/8.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/9.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboCent.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboCentSide.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboCorners.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboEnd.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboSides.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/jumboTop.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/powerFace.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/powerTop.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/redwireCableOff.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/redwireCableOn.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/redwireFace.png create mode 100644 src/main/resources/assets/rpwiring/textures/blocks/redwireTop.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/basalt.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/basaltBrick.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/basaltCobble.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/basaltPaver.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/chiseledBasaltBrick.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/0.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/1.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/2.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/3.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/4.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/flaxCrop/5.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/indigoFlower.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/marble.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/marbleBrick.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/0.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/1.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/2.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/3.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/4.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/5.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/6.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/ore/7.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/rubberLeaves_opaque.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/rubberLeaves_transparent.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/rubberLogSide.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/rubberLogTop.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/rubberSapling.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/0.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/1.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/2.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/3.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/4.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/5.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/6.png create mode 100644 src/main/resources/assets/rpworld/textures/blocks/storage/7.png create mode 100644 src/main/resources/assets/rpworld/textures/items/athame.png create mode 100644 src/main/resources/assets/rpworld/textures/items/axeGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/axeRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/axeSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/brushDry.png create mode 100644 src/main/resources/assets/rpworld/textures/items/handsawDiamond.png create mode 100644 src/main/resources/assets/rpworld/textures/items/handsawGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/handsawIron.png create mode 100644 src/main/resources/assets/rpworld/textures/items/handsawRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/handsawSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/hoeGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/hoeRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/hoeSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/itemSeedsFlax.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/0.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/1.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/10.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/11.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/12.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/13.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/14.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/15.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/2.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/3.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/4.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/5.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/6.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/7.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/8.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintBrush/9.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/0.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/1.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/10.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/11.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/12.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/13.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/14.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/15.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/2.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/3.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/4.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/5.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/6.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/7.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/8.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCan/9.png create mode 100644 src/main/resources/assets/rpworld/textures/items/paintCanEmpty.png create mode 100644 src/main/resources/assets/rpworld/textures/items/pickaxeGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/pickaxeRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/pickaxeSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/seedBagEmpty.png create mode 100644 src/main/resources/assets/rpworld/textures/items/seedBagFull.png create mode 100644 src/main/resources/assets/rpworld/textures/items/seedsFlax.png create mode 100644 src/main/resources/assets/rpworld/textures/items/shovelGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/shovelRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/shovelSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleDiamond.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleGold.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleIron.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleStone.png create mode 100644 src/main/resources/assets/rpworld/textures/items/sickleWood.png create mode 100644 src/main/resources/assets/rpworld/textures/items/swordGreenSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/swordRuby.png create mode 100644 src/main/resources/assets/rpworld/textures/items/swordSapphire.png create mode 100644 src/main/resources/assets/rpworld/textures/items/woolCard.png create mode 100644 src/main/resources/mcmod.info diff --git a/.gitignore b/.gitignore index 8d16946..2066b4c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .idea build run +bin diff --git a/build.gradle b/build.gradle index 585fd0f..6bdce9f 100644 --- a/build.gradle +++ b/build.gradle @@ -34,10 +34,16 @@ minecraft { repositories { maven { url = "https://maven.tilera.xyz" } + maven { + name 'central' + url 'https://maven.thorfusion.com/artifactory/central/' + } } dependencies { - + implementation "codechicken:CodeChickenLib:1.7.10-1.1.3.141:dev" + implementation "codechicken:NotEnoughItems:1.7.10-1.0.5.120:dev" + implementation "codechicken:CodeChickenCore:1.7.10-1.0.7.48:dev" } processResources { diff --git a/src/main/java/cofh/api/CoFHAPIProps.java b/src/main/java/cofh/api/CoFHAPIProps.java new file mode 100644 index 0000000..fb3eac6 --- /dev/null +++ b/src/main/java/cofh/api/CoFHAPIProps.java @@ -0,0 +1,8 @@ +package cofh.api; + +public class CoFHAPIProps { + public static final String VERSION = "1.7.10R1.3.1"; + + private CoFHAPIProps() { + } +} diff --git a/src/main/java/cofh/api/energy/EnergyStorage.java b/src/main/java/cofh/api/energy/EnergyStorage.java new file mode 100644 index 0000000..7fe351b --- /dev/null +++ b/src/main/java/cofh/api/energy/EnergyStorage.java @@ -0,0 +1,121 @@ +package cofh.api.energy; + +import net.minecraft.nbt.NBTTagCompound; + +public class EnergyStorage implements IEnergyStorage { + protected int energy; + protected int capacity; + protected int maxReceive; + protected int maxExtract; + + public EnergyStorage(int capacity) { + this(capacity, capacity, capacity); + } + + public EnergyStorage(int capacity, int maxTransfer) { + this(capacity, maxTransfer, maxTransfer); + } + + public EnergyStorage(int capacity, int maxReceive, int maxExtract) { + this.capacity = capacity; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + } + + public EnergyStorage readFromNBT(NBTTagCompound nbt) { + this.energy = nbt.getInteger("Energy"); + if (this.energy > this.capacity) { + this.energy = this.capacity; + } + + return this; + } + + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + if (this.energy < 0) { + this.energy = 0; + } + + nbt.setInteger("Energy", this.energy); + return nbt; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + if (this.energy > capacity) { + this.energy = capacity; + } + + } + + public void setMaxTransfer(int maxTransfer) { + this.setMaxReceive(maxTransfer); + this.setMaxExtract(maxTransfer); + } + + public void setMaxReceive(int maxReceive) { + this.maxReceive = maxReceive; + } + + public void setMaxExtract(int maxExtract) { + this.maxExtract = maxExtract; + } + + public int getMaxReceive() { + return this.maxReceive; + } + + public int getMaxExtract() { + return this.maxExtract; + } + + public void setEnergyStored(int energy) { + this.energy = energy; + if (this.energy > this.capacity) { + this.energy = this.capacity; + } else if (this.energy < 0) { + this.energy = 0; + } + + } + + public void modifyEnergyStored(int energy) { + this.energy += energy; + if (this.energy > this.capacity) { + this.energy = this.capacity; + } else if (this.energy < 0) { + this.energy = 0; + } + + } + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + int energyReceived = Math.min(this.capacity - this.energy, Math.min(this.maxReceive, maxReceive)); + if (!simulate) { + this.energy += energyReceived; + } + + return energyReceived; + } + + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + int energyExtracted = Math.min(this.energy, Math.min(this.maxExtract, maxExtract)); + if (!simulate) { + this.energy -= energyExtracted; + } + + return energyExtracted; + } + + @Override + public int getEnergyStored() { + return this.energy; + } + + @Override + public int getMaxEnergyStored() { + return this.capacity; + } +} diff --git a/src/main/java/cofh/api/energy/IEnergyConnection.java b/src/main/java/cofh/api/energy/IEnergyConnection.java new file mode 100644 index 0000000..f587e4b --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyConnection.java @@ -0,0 +1,7 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyConnection { + boolean canConnectEnergy(ForgeDirection var1); +} diff --git a/src/main/java/cofh/api/energy/IEnergyContainerItem.java b/src/main/java/cofh/api/energy/IEnergyContainerItem.java new file mode 100644 index 0000000..667a9a6 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyContainerItem.java @@ -0,0 +1,13 @@ +package cofh.api.energy; + +import net.minecraft.item.ItemStack; + +public interface IEnergyContainerItem { + int receiveEnergy(ItemStack var1, int var2, boolean var3); + + int extractEnergy(ItemStack var1, int var2, boolean var3); + + int getEnergyStored(ItemStack var1); + + int getMaxEnergyStored(ItemStack var1); +} diff --git a/src/main/java/cofh/api/energy/IEnergyHandler.java b/src/main/java/cofh/api/energy/IEnergyHandler.java new file mode 100644 index 0000000..b626bab --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyHandler.java @@ -0,0 +1,17 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyHandler extends IEnergyProvider, IEnergyReceiver { + @Override + int receiveEnergy(ForgeDirection var1, int var2, boolean var3); + + @Override + int extractEnergy(ForgeDirection var1, int var2, boolean var3); + + @Override + int getEnergyStored(ForgeDirection var1); + + @Override + int getMaxEnergyStored(ForgeDirection var1); +} diff --git a/src/main/java/cofh/api/energy/IEnergyProvider.java b/src/main/java/cofh/api/energy/IEnergyProvider.java new file mode 100644 index 0000000..324a4b8 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyProvider.java @@ -0,0 +1,11 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyProvider extends IEnergyConnection { + int extractEnergy(ForgeDirection var1, int var2, boolean var3); + + int getEnergyStored(ForgeDirection var1); + + int getMaxEnergyStored(ForgeDirection var1); +} diff --git a/src/main/java/cofh/api/energy/IEnergyReceiver.java b/src/main/java/cofh/api/energy/IEnergyReceiver.java new file mode 100644 index 0000000..3281b5c --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyReceiver.java @@ -0,0 +1,11 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyReceiver extends IEnergyConnection { + int receiveEnergy(ForgeDirection var1, int var2, boolean var3); + + int getEnergyStored(ForgeDirection var1); + + int getMaxEnergyStored(ForgeDirection var1); +} diff --git a/src/main/java/cofh/api/energy/IEnergyStorage.java b/src/main/java/cofh/api/energy/IEnergyStorage.java new file mode 100644 index 0000000..4fb7f81 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyStorage.java @@ -0,0 +1,11 @@ +package cofh.api.energy; + +public interface IEnergyStorage { + int receiveEnergy(int var1, boolean var2); + + int extractEnergy(int var1, boolean var2); + + int getEnergyStored(); + + int getMaxEnergyStored(); +} diff --git a/src/main/java/cofh/api/energy/IEnergyTransport.java b/src/main/java/cofh/api/energy/IEnergyTransport.java new file mode 100644 index 0000000..cf56d8f --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyTransport.java @@ -0,0 +1,34 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyTransport extends IEnergyProvider, IEnergyReceiver { + @Override + int getEnergyStored(ForgeDirection var1); + + IEnergyTransport.InterfaceType getTransportState(ForgeDirection var1); + + boolean setTransportState(IEnergyTransport.InterfaceType var1, ForgeDirection var2); + + public static enum InterfaceType { + SEND, + RECEIVE, + BALANCE; + + public IEnergyTransport.InterfaceType getOpposite() { + return this == BALANCE ? BALANCE : (this == SEND ? RECEIVE : SEND); + } + + public IEnergyTransport.InterfaceType rotate() { + return this.rotate(true); + } + + public IEnergyTransport.InterfaceType rotate(boolean forward) { + if (forward) { + return this == BALANCE ? RECEIVE : (this == RECEIVE ? SEND : BALANCE); + } else { + return this == BALANCE ? SEND : (this == SEND ? RECEIVE : BALANCE); + } + } + } +} diff --git a/src/main/java/cofh/api/energy/ItemEnergyContainer.java b/src/main/java/cofh/api/energy/ItemEnergyContainer.java new file mode 100644 index 0000000..9b33d2e --- /dev/null +++ b/src/main/java/cofh/api/energy/ItemEnergyContainer.java @@ -0,0 +1,88 @@ +package cofh.api.energy; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemEnergyContainer extends Item implements IEnergyContainerItem { + protected int capacity; + protected int maxReceive; + protected int maxExtract; + + public ItemEnergyContainer() { + } + + public ItemEnergyContainer(int capacity) { + this(capacity, capacity, capacity); + } + + public ItemEnergyContainer(int capacity, int maxTransfer) { + this(capacity, maxTransfer, maxTransfer); + } + + public ItemEnergyContainer(int capacity, int maxReceive, int maxExtract) { + this.capacity = capacity; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + } + + public ItemEnergyContainer setCapacity(int capacity) { + this.capacity = capacity; + return this; + } + + public void setMaxTransfer(int maxTransfer) { + this.setMaxReceive(maxTransfer); + this.setMaxExtract(maxTransfer); + } + + public void setMaxReceive(int maxReceive) { + this.maxReceive = maxReceive; + } + + public void setMaxExtract(int maxExtract) { + this.maxExtract = maxExtract; + } + + @Override + public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) { + if (container.stackTagCompound == null) { + container.stackTagCompound = new NBTTagCompound(); + } + + int energy = container.stackTagCompound.getInteger("Energy"); + int energyReceived = Math.min(this.capacity - energy, Math.min(this.maxReceive, maxReceive)); + if (!simulate) { + energy += energyReceived; + container.stackTagCompound.setInteger("Energy", energy); + } + + return energyReceived; + } + + @Override + public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) { + if (container.stackTagCompound != null && container.stackTagCompound.hasKey("Energy")) { + int energy = container.stackTagCompound.getInteger("Energy"); + int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); + if (!simulate) { + energy -= energyExtracted; + container.stackTagCompound.setInteger("Energy", energy); + } + + return energyExtracted; + } else { + return 0; + } + } + + @Override + public int getEnergyStored(ItemStack container) { + return container.stackTagCompound != null && container.stackTagCompound.hasKey("Energy") ? container.stackTagCompound.getInteger("Energy") : 0; + } + + @Override + public int getMaxEnergyStored(ItemStack container) { + return this.capacity; + } +} diff --git a/src/main/java/cofh/api/energy/TileEnergyHandler.java b/src/main/java/cofh/api/energy/TileEnergyHandler.java new file mode 100644 index 0000000..f52386e --- /dev/null +++ b/src/main/java/cofh/api/energy/TileEnergyHandler.java @@ -0,0 +1,44 @@ +package cofh.api.energy; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEnergyHandler extends TileEntity implements IEnergyHandler { + protected EnergyStorage storage = new EnergyStorage(32000); + + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.storage.readFromNBT(nbt); + } + + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.storage.writeToNBT(nbt); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from) { + return true; + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { + return this.storage.extractEnergy(maxExtract, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from) { + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from) { + return this.storage.getMaxEnergyStored(); + } +} diff --git a/src/main/java/com/eloraam/redpower/Flags.java b/src/main/java/com/eloraam/redpower/Flags.java new file mode 100644 index 0000000..4b9505a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/Flags.java @@ -0,0 +1,6 @@ +package com.eloraam.redpower; + +public class Flags { + public static final boolean SERVER = true; + public static final boolean CLIENT = true; +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerBase.java b/src/main/java/com/eloraam/redpower/RedPowerBase.java new file mode 100644 index 0000000..9b24ac0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerBase.java @@ -0,0 +1,525 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.base.BlockAppliance; +import com.eloraam.redpower.base.BlockMicro; +import com.eloraam.redpower.base.ContainerAdvBench; +import com.eloraam.redpower.base.ContainerAlloyFurnace; +import com.eloraam.redpower.base.ContainerBag; +import com.eloraam.redpower.base.ContainerBusId; +import com.eloraam.redpower.base.GuiAdvBench; +import com.eloraam.redpower.base.GuiAlloyFurnace; +import com.eloraam.redpower.base.GuiBag; +import com.eloraam.redpower.base.GuiBusId; +import com.eloraam.redpower.base.ItemBag; +import com.eloraam.redpower.base.ItemDrawplate; +import com.eloraam.redpower.base.ItemDyeIndigo; +import com.eloraam.redpower.base.ItemHandsaw; +import com.eloraam.redpower.base.ItemMicro; +import com.eloraam.redpower.base.ItemPlan; +import com.eloraam.redpower.base.ItemScrewdriver; +import com.eloraam.redpower.base.RecipeBag; +import com.eloraam.redpower.base.RenderAdvBench; +import com.eloraam.redpower.base.RenderAlloyFurnace; +import com.eloraam.redpower.base.TileAdvBench; +import com.eloraam.redpower.base.TileAlloyFurnace; +import com.eloraam.redpower.core.AchieveLib; +import com.eloraam.redpower.core.BlockMultiblock; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.ItemExtended; +import com.eloraam.redpower.core.ItemParts; +import com.eloraam.redpower.core.OreStack; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.core.TileMultiblock; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryBasic; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.stats.AchievementList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.AchievementPage; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.oredict.OreDictionary; + +@Mod( + modid = "RedPowerBase", + name = "RedPower Base", + version = "2.0pr6", + dependencies = "required-after:RedPowerCore" +) +public class RedPowerBase implements IGuiHandler { + @Instance("RedPowerBase") + public static RedPowerBase instance; + public static BlockAppliance blockAppliance; + public static Item itemHandsawIron; + public static Item itemHandsawDiamond; + public static ItemParts itemLumar; + public static ItemParts itemResource; + public static ItemStack itemRuby; + public static ItemStack itemGreenSapphire; + public static ItemStack itemSapphire; + public static ItemStack itemIngotSilver; + public static ItemStack itemIngotTin; + public static ItemStack itemIngotCopper; + public static ItemStack itemIngotTungsten; + public static ItemStack itemDustTungsten; + public static ItemStack itemDustSilver; + public static ItemStack itemNikolite; + public static ItemParts itemAlloy; + public static ItemStack itemIngotRed; + public static ItemStack itemIngotBlue; + public static ItemStack itemIngotBrass; + public static ItemStack itemBouleSilicon; + public static ItemStack itemWaferSilicon; + public static ItemStack itemWaferBlue; + public static ItemStack itemWaferRed; + public static ItemStack itemTinplate; + public static ItemStack itemFineCopper; + public static ItemStack itemFineIron; + public static ItemStack itemCopperCoil; + public static ItemStack itemMotor; + public static ItemStack itemCanvas; + public static ItemParts itemNugget; + public static ItemStack itemNuggetIron; + public static ItemStack itemNuggetSilver; + public static ItemStack itemNuggetTin; + public static ItemStack itemNuggetCopper; + public static ItemStack itemNuggetTungsten; + public static Item itemDyeIndigo; + public static BlockMicro blockMicro; + public static BlockMultiblock blockMultiblock; + public static ItemScrewdriver itemScrewdriver; + public static Item itemDrawplateDiamond; + public static Item itemPlanBlank; + public static Item itemPlanFull; + public static Item itemBag; + @SideOnly(Side.CLIENT) + public static IIcon projectTableTop; + @SideOnly(Side.CLIENT) + public static IIcon projectTableBottom; + @SideOnly(Side.CLIENT) + public static IIcon projectTableFront; + @SideOnly(Side.CLIENT) + public static IIcon projectTableSide; + @SideOnly(Side.CLIENT) + public static IIcon alloyFurnaceVert; + @SideOnly(Side.CLIENT) + public static IIcon alloyFurnaceSide; + @SideOnly(Side.CLIENT) + public static IIcon alloyFurnaceFront; + @SideOnly(Side.CLIENT) + public static IIcon alloyFurnaceFrontOn; + + public static void initBaseItems() { + itemLumar = new ItemParts(); + itemLumar.setCreativeTab(CreativeTabs.tabMaterials); + + for(int color = 0; color < 16; ++color) { + itemLumar.addItem(color, "rpbase:lumar/" + color, "item.rplumar." + CoreLib.rawColorNames[color]); + ItemStack dye = new ItemStack(Items.dye, 1, 15 - color); + GameRegistry.addShapelessRecipe(new ItemStack(itemLumar, 2, color), new Object[]{Items.redstone, dye, dye, Items.glowstone_dust}); + } + + itemResource = new ItemParts(); + itemAlloy = new ItemParts(); + itemResource.setCreativeTab(CreativeTabs.tabMaterials); + itemAlloy.setCreativeTab(CreativeTabs.tabMaterials); + itemResource.addItem(0, "rpbase:ruby", "item.ruby"); + itemResource.addItem(1, "rpbase:greenSapphire", "item.greenSapphire"); + itemResource.addItem(2, "rpbase:sapphire", "item.sapphire"); + itemResource.addItem(3, "rpbase:silverIngot", "item.ingotSilver"); + itemResource.addItem(4, "rpbase:tinIngot", "item.ingotTin"); + itemResource.addItem(5, "rpbase:copperIngot", "item.ingotCopper"); + itemResource.addItem(6, "rpbase:nikolite", "item.nikolite"); + itemResource.addItem(7, "rpbase:ingotTungsten", "item.ingotTungsten"); + itemResource.addItem(8, "rpbase:dustTungsten", "item.dustTungsten"); + itemResource.addItem(9, "rpbase:dustSilver", "item.dustSilver"); + itemAlloy.addItem(0, "rpbase:ingotRed", "item.ingotRed"); + itemAlloy.addItem(1, "rpbase:ingotBlue", "item.ingotBlue"); + itemAlloy.addItem(2, "rpbase:ingotBrass", "item.ingotBrass"); + itemAlloy.addItem(3, "rpbase:bouleSilicon", "item.bouleSilicon"); + itemAlloy.addItem(4, "rpbase:waferSilicon", "item.waferSilicon"); + itemAlloy.addItem(5, "rpbase:waferBlue", "item.waferBlue"); + itemAlloy.addItem(6, "rpbase:waferRed", "item.waferRed"); + itemAlloy.addItem(7, "rpbase:tinPlate", "item.tinplate"); + itemAlloy.addItem(8, "rpbase:fineCopper", "item.finecopper"); + itemAlloy.addItem(9, "rpbase:fineIron", "item.fineiron"); + itemAlloy.addItem(10, "rpbase:copperCoil", "item.coppercoil"); + itemAlloy.addItem(11, "rpbase:btMotor", "item.btmotor"); + itemAlloy.addItem(12, "rpbase:canvas", "item.rpcanvas"); + itemRuby = new ItemStack(itemResource, 1, 0); + itemGreenSapphire = new ItemStack(itemResource, 1, 1); + itemSapphire = new ItemStack(itemResource, 1, 2); + itemIngotSilver = new ItemStack(itemResource, 1, 3); + itemIngotTin = new ItemStack(itemResource, 1, 4); + itemIngotCopper = new ItemStack(itemResource, 1, 5); + itemNikolite = new ItemStack(itemResource, 1, 6); + itemIngotTungsten = new ItemStack(itemResource, 1, 7); + itemDustTungsten = new ItemStack(itemResource, 1, 8); + itemDustSilver = new ItemStack(itemResource, 1, 9); + itemIngotRed = new ItemStack(itemAlloy, 1, 0); + itemIngotBlue = new ItemStack(itemAlloy, 1, 1); + itemIngotBrass = new ItemStack(itemAlloy, 1, 2); + itemBouleSilicon = new ItemStack(itemAlloy, 1, 3); + itemWaferSilicon = new ItemStack(itemAlloy, 1, 4); + itemWaferBlue = new ItemStack(itemAlloy, 1, 5); + itemWaferRed = new ItemStack(itemAlloy, 1, 6); + itemTinplate = new ItemStack(itemAlloy, 1, 7); + itemFineCopper = new ItemStack(itemAlloy, 1, 8); + itemFineIron = new ItemStack(itemAlloy, 1, 9); + itemCopperCoil = new ItemStack(itemAlloy, 1, 10); + itemMotor = new ItemStack(itemAlloy, 1, 11); + itemCanvas = new ItemStack(itemAlloy, 1, 12); + itemNugget = new ItemParts(); + itemNugget.setCreativeTab(CreativeTabs.tabMaterials); + itemNugget.addItem(0, "rpbase:nuggetIron", "item.nuggetIron"); + itemNugget.addItem(1, "rpbase:nuggetSilver", "item.nuggetSilver"); + itemNugget.addItem(2, "rpbase:nuggetTin", "item.nuggetTin"); + itemNugget.addItem(3, "rpbase:nuggetCopper", "item.nuggetCopper"); + itemNugget.addItem(4, "rpbase:nuggetTungsten", "item.nuggetTungsten"); + itemNuggetIron = new ItemStack(itemNugget, 1, 0); + itemNuggetSilver = new ItemStack(itemNugget, 1, 1); + itemNuggetTin = new ItemStack(itemNugget, 1, 2); + itemNuggetCopper = new ItemStack(itemNugget, 1, 3); + itemNuggetTungsten = new ItemStack(itemNugget, 1, 4); + itemDrawplateDiamond = new ItemDrawplate(); + itemDrawplateDiamond.setUnlocalizedName("drawplateDiamond").setMaxDamage(255).setTextureName("rpbase:diamondDrawplate"); + GameRegistry.registerItem(itemDrawplateDiamond, "drawplateDiamond"); + itemBag = new ItemBag(); + GameRegistry.addRecipe(new ItemStack(itemBag, 1, 0), new Object[]{"CCC", "C C", "CCC", 'C', itemCanvas}); + + for(int color = 1; color < 16; ++color) { + GameRegistry.addRecipe( + new ItemStack(itemBag, 1, color), new Object[]{"CCC", "CDC", "CCC", 'C', itemCanvas, 'D', new ItemStack(Items.dye, 1, 15 - color)} + ); + } + + GameRegistry.registerItem(itemLumar, "lumar"); + GameRegistry.registerItem(itemResource, "resource"); + OreDictionary.registerOre("gemRuby", itemRuby); + OreDictionary.registerOre("gemGreenSapphire", itemGreenSapphire); + OreDictionary.registerOre("gemSapphire", itemSapphire); + OreDictionary.registerOre("ingotTin", itemIngotTin); + OreDictionary.registerOre("ingotCopper", itemIngotCopper); + OreDictionary.registerOre("ingotSilver", itemIngotSilver); + OreDictionary.registerOre("ingotTungsten", itemIngotTungsten); + OreDictionary.registerOre("dustNikolite", itemNikolite); + OreDictionary.registerOre("dustTungsten", itemDustTungsten); + GameRegistry.registerItem(itemAlloy, "alloy"); + OreDictionary.registerOre("ingotBrass", itemIngotBrass); + GameRegistry.registerItem(itemNugget, "nugget"); + OreDictionary.registerOre("nuggetIron", itemNuggetIron); + OreDictionary.registerOre("nuggetSilver", itemNuggetSilver); + OreDictionary.registerOre("nuggetTin", itemNuggetTin); + OreDictionary.registerOre("nuggetCopper", itemNuggetCopper); + OreDictionary.registerOre("nuggetTungsten", itemNuggetTungsten); + GameRegistry.registerItem(itemBag, "canvasBag"); + } + + public static void initIndigo() { + itemDyeIndigo = new ItemDyeIndigo(); + GameRegistry.registerItem(itemDyeIndigo, "dyeIndigo"); + OreDictionary.registerOre("dyeBlue", new ItemStack(itemDyeIndigo)); + GameRegistry.addShapelessRecipe(new ItemStack(Blocks.wool, 1, 11), new Object[]{itemDyeIndigo, Blocks.wool}); + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 12), new Object[]{itemDyeIndigo, new ItemStack(Items.dye, 1, 15)}); + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 6), new Object[]{itemDyeIndigo, new ItemStack(Items.dye, 1, 2)}); + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 5), new Object[]{itemDyeIndigo, new ItemStack(Items.dye, 1, 1)}); + GameRegistry.addShapelessRecipe( + new ItemStack(Items.dye, 3, 13), new Object[]{itemDyeIndigo, new ItemStack(Items.dye, 1, 1), new ItemStack(Items.dye, 1, 9)} + ); + GameRegistry.addShapelessRecipe( + new ItemStack(Items.dye, 4, 13), + new Object[]{itemDyeIndigo, new ItemStack(Items.dye, 1, 1), new ItemStack(Items.dye, 1, 1), new ItemStack(Items.dye, 1, 15)} + ); + CraftLib.addShapelessOreRecipe(new ItemStack(itemLumar, 2, 11), Items.redstone, "dyeBlue", "dyeBlue", Items.glowstone_dust); + CraftLib.addOreRecipe(new ItemStack(itemBag, 1, 11), "CCC", "CDC", "CCC", 'C', itemCanvas, 'D', "dyeBlue"); + itemPlanBlank = new Item().setTextureName("rpbase:planBlank"); + itemPlanBlank.setUnlocalizedName("planBlank"); + itemPlanBlank.setCreativeTab(CreativeTabs.tabMisc); + GameRegistry.addShapelessRecipe(new ItemStack(itemPlanBlank), new Object[]{Items.paper, itemDyeIndigo}); + GameRegistry.registerItem(itemPlanBlank, "planBlank"); + itemPlanFull = new ItemPlan(); + GameRegistry.registerItem(itemPlanFull, "planFull"); + } + + public static void initAlloys() { + CraftLib.addAlloyResult(itemIngotRed, new ItemStack(Items.redstone, 4), new ItemStack(Items.iron_ingot, 1)); + CraftLib.addAlloyResult(itemIngotRed, new ItemStack(Items.redstone, 4), new OreStack("ingotCopper")); + CraftLib.addAlloyResult(CoreLib.copyStack(itemIngotBrass, 4), new OreStack("ingotTin"), new OreStack("ingotCopper", 3)); + CraftLib.addAlloyResult(CoreLib.copyStack(itemTinplate, 4), new OreStack("ingotTin"), new ItemStack(Items.iron_ingot, 2)); + CraftLib.addAlloyResult(itemIngotBlue, new OreStack("ingotSilver"), new OreStack("dustNikolite", 4)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 3), new ItemStack(Blocks.rail, 8)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 3), new ItemStack(Items.bucket, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 5), new ItemStack(Items.minecart, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 6), new ItemStack(Items.iron_door, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 3), new ItemStack(Blocks.iron_bars, 8)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 31), new ItemStack(Blocks.anvil, 1, 0)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 31), new ItemStack(Blocks.anvil, 1, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 31), new ItemStack(Blocks.anvil, 1, 2)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 2), new ItemStack(Items.iron_sword, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 3), new ItemStack(Items.iron_pickaxe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 3), new ItemStack(Items.iron_axe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 1), new ItemStack(Items.iron_shovel, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 2), new ItemStack(Items.iron_hoe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 2), new ItemStack(Items.golden_sword, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 3), new ItemStack(Items.golden_pickaxe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 3), new ItemStack(Items.golden_axe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 1), new ItemStack(Items.golden_shovel, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 2), new ItemStack(Items.golden_hoe, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 5), new ItemStack(Items.iron_helmet, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 8), new ItemStack(Items.iron_chestplate, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 7), new ItemStack(Items.iron_leggings, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 4), new ItemStack(Items.iron_boots, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 5), new ItemStack(Items.iron_horse_armor, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 5), new ItemStack(Items.golden_helmet, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 8), new ItemStack(Items.golden_chestplate, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 7), new ItemStack(Items.golden_leggings, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 4), new ItemStack(Items.golden_boots, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 5), new ItemStack(Items.golden_horse_armor, 1)); + CraftLib.addAlloyResult(new ItemStack(Items.gold_ingot, 1), new ItemStack(Items.gold_nugget, 9)); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 1), CoreLib.copyStack(itemNuggetIron, 9)); + CraftLib.addAlloyResult(itemIngotSilver, CoreLib.copyStack(itemNuggetSilver, 9)); + CraftLib.addAlloyResult(itemIngotCopper, CoreLib.copyStack(itemNuggetCopper, 9)); + CraftLib.addAlloyResult(itemIngotTin, CoreLib.copyStack(itemNuggetTin, 9)); + CraftLib.addAlloyResult(itemIngotTungsten, CoreLib.copyStack(itemNuggetTungsten, 9)); + CraftLib.addAlloyResult(itemIngotCopper, itemFineCopper); + CraftLib.addAlloyResult(new ItemStack(Items.iron_ingot, 1), itemFineIron); + CraftLib.addAlloyResult(itemBouleSilicon, new ItemStack(Items.coal, 8, 0), new ItemStack(Blocks.sand, 8)); + CraftLib.addAlloyResult(itemBouleSilicon, new ItemStack(Items.coal, 8, 1), new ItemStack(Blocks.sand, 8)); + CraftLib.addAlloyResult(itemWaferBlue, CoreLib.copyStack(itemWaferSilicon, 1), new OreStack("dustNikolite", 4)); + CraftLib.addAlloyResult(itemWaferRed, CoreLib.copyStack(itemWaferSilicon, 1), new ItemStack(Items.redstone, 4)); + } + + public static void initMicroblocks() { + blockMicro = new BlockMicro(); + blockMicro.setBlockName("rpwire"); + GameRegistry.registerBlock(blockMicro, ItemMicro.class, "microblock"); + blockMicro.addTileEntityMapping(0, TileCovered::new); + CoverLib.blockCoverPlate = blockMicro; + } + + public static void initCoverMaterials() { + CoverLib.addMaterial(0, 1, Blocks.cobblestone, "cobble"); + CoverLib.addMaterial(1, 1, Blocks.stone, "stone"); + CoverLib.addMaterial(2, 0, Blocks.planks, "planks"); + CoverLib.addMaterial(3, 1, Blocks.sandstone, "sandstone"); + CoverLib.addMaterial(4, 1, Blocks.mossy_cobblestone, "moss"); + CoverLib.addMaterial(5, 1, Blocks.brick_block, "brick"); + CoverLib.addMaterial(6, 2, Blocks.obsidian, "obsidian"); + CoverLib.addMaterial(7, 1, true, Blocks.glass, "glass"); + CoverLib.addMaterial(8, 0, Blocks.dirt, "dirt"); + CoverLib.addMaterial(9, 0, Blocks.clay, "clay"); + CoverLib.addMaterial(10, 0, Blocks.bookshelf, "books"); + CoverLib.addMaterial(11, 0, Blocks.netherrack, "netherrack"); + CoverLib.addMaterial(12, 0, Blocks.log, 0, "wood"); + CoverLib.addMaterial(13, 0, Blocks.log, 1, "wood1"); + CoverLib.addMaterial(14, 0, Blocks.log, 2, "wood2"); + CoverLib.addMaterial(15, 0, Blocks.soul_sand, "soul"); + CoverLib.addMaterial(16, 1, Blocks.stone_slab, "slab"); + CoverLib.addMaterial(17, 1, Blocks.iron_block, "iron"); + CoverLib.addMaterial(18, 1, Blocks.gold_block, "gold"); + CoverLib.addMaterial(19, 2, Blocks.diamond_block, "diamond"); + CoverLib.addMaterial(20, 1, Blocks.lapis_block, "lapis"); + CoverLib.addMaterial(21, 0, Blocks.snow, "snow"); + CoverLib.addMaterial(22, 0, Blocks.pumpkin, "pumpkin"); + CoverLib.addMaterial(23, 1, Blocks.stonebrick, 0, "stonebrick"); + CoverLib.addMaterial(24, 1, Blocks.stonebrick, 1, "stonebrick1"); + CoverLib.addMaterial(25, 1, Blocks.stonebrick, 2, "stonebrick2"); + CoverLib.addMaterial(26, 1, Blocks.nether_brick, "netherbrick"); + CoverLib.addMaterial(27, 1, Blocks.stonebrick, 3, "stonebrick3"); + CoverLib.addMaterial(28, 0, Blocks.planks, 1, "planks1"); + CoverLib.addMaterial(29, 0, Blocks.planks, 2, "planks2"); + CoverLib.addMaterial(30, 0, Blocks.planks, 3, "planks3"); + CoverLib.addMaterial(31, 1, Blocks.sandstone, 1, "sandstone1"); + + for(int color = 0; color < 16; ++color) { + CoverLib.addMaterial(32 + color, 0, Blocks.wool, color, "wool." + CoreLib.rawColorNames[color]); + } + + CoverLib.addMaterial(64, 1, Blocks.sandstone, 2, "sandstone2"); + CoverLib.addMaterial(65, 0, Blocks.log, 3, "wood3"); + } + + public static void initAchievements() { + AchieveLib.registerAchievement("rpMakeAlloy", 0, 0, new ItemStack(blockAppliance, 1, 0), AchievementList.buildFurnace); + AchieveLib.registerAchievement("rpMakeSaw", 4, 0, new ItemStack(itemHandsawDiamond), AchievementList.diamonds); + AchieveLib.registerAchievement("rpIngotRed", 2, 2, itemIngotRed, "rpMakeAlloy"); + AchieveLib.registerAchievement("rpIngotBlue", 2, 4, itemIngotBlue, "rpMakeAlloy"); + AchieveLib.registerAchievement("rpIngotBrass", 2, 6, itemIngotBrass, "rpMakeAlloy"); + AchieveLib.registerAchievement("rpAdvBench", -2, 0, new ItemStack(blockAppliance, 1, 3), AchievementList.buildWorkBench); + AchieveLib.addCraftingAchievement(new ItemStack(blockAppliance, 1, 0), "rpMakeAlloy"); + AchieveLib.addCraftingAchievement(new ItemStack(blockAppliance, 1, 3), "rpAdvBench"); + AchieveLib.addCraftingAchievement(new ItemStack(itemHandsawDiamond), "rpMakeSaw"); + AchieveLib.addAlloyAchievement(itemIngotRed, "rpIngotRed"); + AchieveLib.addAlloyAchievement(itemIngotBlue, "rpIngotBlue"); + AchieveLib.addAlloyAchievement(itemIngotBrass, "rpIngotBrass"); + AchievementPage.registerAchievementPage(AchieveLib.achievepage); + } + + public static void initBlocks() { + blockMultiblock = new BlockMultiblock(); + GameRegistry.registerBlock(blockMultiblock, "multiblock"); + GameRegistry.registerTileEntity(TileMultiblock.class, "RPMulti"); + blockAppliance = new BlockAppliance(); + GameRegistry.registerBlock(blockAppliance, ItemExtended.class, "appliance"); + GameRegistry.registerTileEntity(TileAlloyFurnace.class, "RPAFurnace"); + blockAppliance.addTileEntityMapping(0, TileAlloyFurnace::new); + blockAppliance.setBlockName(0, "rpafurnace"); + GameRegistry.addRecipe(new ItemStack(blockAppliance, 1, 0), new Object[]{"BBB", "B B", "BBB", 'B', Blocks.brick_block}); + GameRegistry.registerTileEntity(TileAdvBench.class, "RPAdvBench"); + blockAppliance.addTileEntityMapping(3, TileAdvBench::new); + blockAppliance.setBlockName(3, "rpabench"); + CraftLib.addOreRecipe( + new ItemStack(blockAppliance, 1, 3), "SSS", "WTW", "WCW", 'S', Blocks.stone, 'W', "plankWood", 'T', Blocks.crafting_table, 'C', Blocks.chest + ); + itemHandsawIron = new ItemHandsaw(0); + itemHandsawIron.setUnlocalizedName("handsawIron"); + itemHandsawIron.setTextureName("rpworld:handsawIron"); + itemHandsawIron.setMaxDamage(320); + GameRegistry.registerItem(itemHandsawIron, "ironHandshaw"); + itemHandsawDiamond = new ItemHandsaw(2); + itemHandsawDiamond.setUnlocalizedName("handsawDiamond"); + itemHandsawDiamond.setTextureName("rpworld:handsawDiamond"); + itemHandsawDiamond.setMaxDamage(1280); + GameRegistry.registerItem(itemHandsawDiamond, "diamondHandshaw"); + GameRegistry.addRecipe(new ItemStack(itemHandsawIron, 1), new Object[]{"WWW", " II", " II", 'I', Items.iron_ingot, 'W', Items.stick}); + GameRegistry.addRecipe( + new ItemStack(itemHandsawDiamond, 1), new Object[]{"WWW", " II", " DD", 'I', Items.iron_ingot, 'D', Items.diamond, 'W', Items.stick} + ); + GameRegistry.addShapelessRecipe(CoreLib.copyStack(itemWaferSilicon, 16), new Object[]{itemBouleSilicon, new ItemStack(itemHandsawDiamond, 1, 32767)}); + itemScrewdriver = new ItemScrewdriver(); + GameRegistry.addRecipe(new ItemStack(itemScrewdriver, 1), new Object[]{"I ", " W", 'I', Items.iron_ingot, 'W', Items.stick}); + GameRegistry.registerItem(itemScrewdriver, "screwdriver"); + GameRegistry.addRecipe( + new ItemStack(itemDrawplateDiamond, 1), + new Object[]{" I ", "IDI", " I ", 'I', new ItemStack(blockMicro, 1, 5649), 'D', new ItemStack(blockMicro, 1, 4115)} + ); + GameRegistry.addShapelessRecipe(itemFineIron, new Object[]{Items.iron_ingot, new ItemStack(itemDrawplateDiamond, 1, 32767)}); + CraftLib.addShapelessOreRecipe(itemFineCopper, "ingotCopper", new ItemStack(itemDrawplateDiamond, 1, 32767)); + GameRegistry.addRecipe(CoreLib.copyStack(itemNuggetIron, 9), new Object[]{"I", 'I', Items.iron_ingot}); + CraftLib.addOreRecipe(CoreLib.copyStack(itemNuggetCopper, 9), "I", 'I', "ingotCopper"); + CraftLib.addOreRecipe(CoreLib.copyStack(itemNuggetTin, 9), "I", 'I', "ingotTin"); + CraftLib.addOreRecipe(CoreLib.copyStack(itemNuggetSilver, 9), "I", 'I', "ingotSilver"); + CraftLib.addOreRecipe(CoreLib.copyStack(itemNuggetTungsten, 9), "I", 'I', "ingotTungsten"); + GameRegistry.addRecipe(new ItemStack(Items.iron_ingot, 1, 0), new Object[]{"III", "III", "III", 'I', itemNuggetIron}); + GameRegistry.addRecipe(itemIngotSilver, new Object[]{"III", "III", "III", 'I', itemNuggetSilver}); + GameRegistry.addRecipe(itemIngotTin, new Object[]{"III", "III", "III", 'I', itemNuggetTin}); + GameRegistry.addRecipe(itemIngotCopper, new Object[]{"III", "III", "III", 'I', itemNuggetCopper}); + GameRegistry.addRecipe(itemIngotTungsten, new Object[]{"III", "III", "III", 'I', itemNuggetTungsten}); + GameRegistry.addRecipe(itemCanvas, new Object[]{"SSS", "SWS", "SSS", 'S', Items.string, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(Items.diamond, 2), new Object[]{"D", 'D', new ItemStack(blockMicro, 1, 4115)}); + GameRegistry.addRecipe(new ItemStack(Items.diamond, 1), new Object[]{"D", 'D', new ItemStack(blockMicro, 1, 19)}); + GameRegistry.addRecipe(new ItemStack(Items.iron_ingot, 2), new Object[]{"I", 'I', new ItemStack(blockMicro, 1, 4113)}); + GameRegistry.addRecipe(new ItemStack(Items.iron_ingot, 1), new Object[]{"I", 'I', new ItemStack(blockMicro, 1, 17)}); + } + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + initBaseItems(); + initAlloys(); + initIndigo(); + initMicroblocks(); + initCoverMaterials(); + initBlocks(); + initAchievements(); + CraftingManager.getInstance().getRecipeList().add(new RecipeBag()); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setRenderer(blockAppliance, 0, RenderAlloyFurnace::new); + RenderLib.setRenderer(blockAppliance, 3, RenderAdvBench::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileAlloyFurnace.class, new RenderAlloyFurnace(blockAppliance)); + ClientRegistry.bindTileEntitySpecialRenderer(TileAdvBench.class, new RenderAdvBench(blockAppliance)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + projectTableTop = map.registerIcon("rpbase:projectTableTop"); + projectTableBottom = map.registerIcon("rpbase:projectTableBottom"); + projectTableFront = map.registerIcon("rpbase:projectTableFront"); + projectTableSide = map.registerIcon("rpbase:projectTableSide"); + alloyFurnaceVert = map.registerIcon("rpbase:alloyFurnaceVert"); + alloyFurnaceSide = map.registerIcon("rpbase:alloyFurnaceSide"); + alloyFurnaceFront = map.registerIcon("rpbase:alloyFurnaceFront"); + alloyFurnaceFrontOn = map.registerIcon("rpbase:alloyFurnaceFrontOn"); + } + + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch(ID) { + case 1: + return new GuiAlloyFurnace(player.inventory, CoreLib.getGuiTileEntity(world, x, y, z, TileAlloyFurnace.class)); + case 2: + return new GuiAdvBench(player.inventory, CoreLib.getGuiTileEntity(world, x, y, z, TileAdvBench.class)); + case 3: + return new GuiBusId(player.inventory, new IRedbusConnectable.Dummy(), CoreLib.getGuiTileEntity(world, x, y, z, TileEntity.class)); + case 4: + return new GuiBag(player.inventory, new InventoryBasic("", true, 27)); + default: + return null; + } + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch(ID) { + case 1: + return new ContainerAlloyFurnace(player.inventory, CoreLib.getTileEntity(world, x, y, z, TileAlloyFurnace.class)); + case 2: + return new ContainerAdvBench(player.inventory, CoreLib.getTileEntity(world, x, y, z, TileAdvBench.class)); + case 3: + return new ContainerBusId(player.inventory, CoreLib.getTileEntity(world, x, y, z, IRedbusConnectable.class)); + case 4: + ItemStack heldItem = player.getHeldItem(); + return new ContainerBag(player.inventory, ItemBag.getBagInventory(heldItem, player), heldItem); + default: + return null; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerCompat.java b/src/main/java/com/eloraam/redpower/RedPowerCompat.java new file mode 100644 index 0000000..9ae688e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerCompat.java @@ -0,0 +1,129 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.compat.BlockMachineCompat; +import com.eloraam.redpower.compat.ItemMachineCompat; +import com.eloraam.redpower.compat.RenderBlueEngine; +import com.eloraam.redpower.compat.TileBlueEngine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.ItemParts; +import com.eloraam.redpower.core.RenderLib; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +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.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +//import ic2.api.recipe.ICraftingRecipeManager; +//import ic2.api.recipe.Recipes; +//import ic2.core.Ic2Items; +//import ic2.core.block.machine.tileentity.TileEntityMacerator; +//import ic2.core.block.machine.tileentity.TileEntityRotary; +//import ic2.core.block.machine.tileentity.TileEntitySingularity; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +@Mod( + modid = "RedPowerCompat", + name = "RedPower Compat", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase;required-after:RedPowerMachine;required-after:RedPowerWorld;after:IC2;after:Waila" +) +public class RedPowerCompat implements IGuiHandler { + @Instance("RedPowerCompat") + public static RedPowerCompat instance; + public static BlockMachineCompat blockMachineCompat; + public static ItemParts itemCompatParts; + public static ItemStack itemGearBrass; + public static ItemStack itemDenseTungstenPlate; + static boolean ic2reworked; + static boolean waila; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + for(ModContainer modContainer : Loader.instance().getActiveModList()) { + if (modContainer.getName().equalsIgnoreCase("Industrial Craft Reworked")) { + ic2reworked = true; + break; + } + } + + waila = Loader.isModLoaded("Waila"); + } + + @EventHandler + public void load(FMLInitializationEvent event) { + this.setupBlocks(); + if (event.getSide().isClient()) { + this.registerRenderers(); + } + + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setRenderer(blockMachineCompat, 0, RenderBlueEngine::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileBlueEngine.class, new RenderBlueEngine(blockMachineCompat)); + } + + private void setupBlocks() { + GameRegistry.registerTileEntity(TileBlueEngine.class, "RPBTEngine"); + blockMachineCompat = new BlockMachineCompat(); + GameRegistry.registerBlock(blockMachineCompat, ItemMachineCompat.class, "compat"); + blockMachineCompat.setBlockName(0, "rpbtengine"); + blockMachineCompat.addTileEntityMapping(0, TileBlueEngine::new); + itemCompatParts = new ItemParts(); + itemCompatParts.addItem(0, "rpcompat:gear", "item.rpbgear"); + itemCompatParts.addItem(1, "rpcompat:densePlateTungsten", "item.densePlateTungsten"); + itemCompatParts.setCreativeTab(CreativeTabs.tabMaterials); + GameRegistry.registerItem(itemCompatParts, "parts"); + itemGearBrass = new ItemStack(itemCompatParts, 1, 0); + itemDenseTungstenPlate = new ItemStack(itemCompatParts, 1, 1); + CraftLib.addOreRecipe(new ItemStack(itemCompatParts, 1, 0), " B ", "BIB", " B ", 'B', "ingotBrass", 'I', new ItemStack(RedPowerBase.blockMicro, 1, 5649)); + CraftLib.addOreRecipe( + new ItemStack(blockMachineCompat, 1, 0), "BBB", " G ", "ZMZ", 'B', "ingotBrass", 'G', Blocks.glass, 'Z', itemGearBrass, 'M', RedPowerBase.itemMotor + ); + //TODO: IC2 Classic compat + /*if (ic2reworked) { + TileEntityRotary.addRecipe(new ItemStack(RedPowerWorld.blockOres, 1, 6), new ItemStack(RedPowerBase.itemResource, 2, 8)); + TileEntityMacerator.addRecipe(new ItemStack(RedPowerWorld.blockOres, 1, 3), new ItemStack(RedPowerBase.itemResource, 2, 9)); + TileEntityRotary.addRecipe(RedPowerBase.itemIngotTungsten, new ItemStack(RedPowerBase.itemResource, 1, 8)); + TileEntitySingularity.addRecipe(CoreLib.copyStack(RedPowerBase.itemIngotTungsten, 8), itemDenseTungstenPlate); + ICraftingRecipeManager advRecipes = Recipes.advRecipes; + advRecipes.addRecipe(RedPowerBase.itemRuby, new Object[]{" MM", "MMM", "MM ", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerBase.itemSapphire, new Object[]{"MM ", "MMM", " MM", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerBase.itemGreenSapphire, new Object[]{" MM", "MMM", " MM", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerBase.itemNikolite, new Object[]{"MMM", " M ", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerBase.itemDustSilver, new Object[]{" M", " MM", " M", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerBase.itemDustTungsten, new Object[]{"MMM", "MDM", "MMM", 'M', Ic2Items.matter, 'D', Items.diamond, true}); + advRecipes.addRecipe(RedPowerWorld.itemMarble, new Object[]{"M ", " ", " ", 'M', Ic2Items.matter, true}); + advRecipes.addRecipe(RedPowerWorld.itemBasalt, new Object[]{" M", " ", " ", 'M', Ic2Items.matter, true}); + }*/ + + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerControl.java b/src/main/java/com/eloraam/redpower/RedPowerControl.java new file mode 100644 index 0000000..d5d261a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerControl.java @@ -0,0 +1,307 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.control.BlockPeripheral; +import com.eloraam.redpower.control.ContainerCPU; +import com.eloraam.redpower.control.ContainerDisplay; +import com.eloraam.redpower.control.GuiCPU; +import com.eloraam.redpower.control.GuiDisplay; +import com.eloraam.redpower.control.ItemBackplane; +import com.eloraam.redpower.control.ItemDisk; +import com.eloraam.redpower.control.MicroPlacementRibbon; +import com.eloraam.redpower.control.RenderBackplane; +import com.eloraam.redpower.control.RenderCPU; +import com.eloraam.redpower.control.RenderDiskDrive; +import com.eloraam.redpower.control.RenderDisplay; +import com.eloraam.redpower.control.RenderIOExpander; +import com.eloraam.redpower.control.RenderRibbon; +import com.eloraam.redpower.control.TileBackplane; +import com.eloraam.redpower.control.TileCPU; +import com.eloraam.redpower.control.TileDiskDrive; +import com.eloraam.redpower.control.TileDisplay; +import com.eloraam.redpower.control.TileIOExpander; +import com.eloraam.redpower.control.TileRAM; +import com.eloraam.redpower.control.TileRibbon; +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.ItemExtended; +import com.eloraam.redpower.core.RenderLib; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.World; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerControl", + name = "RedPower Control", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerControl implements IGuiHandler { + @Instance("RedPowerControl") + public static RedPowerControl instance; + public static BlockExtended blockBackplane; + public static BlockExtended blockPeripheral; + public static BlockExtended blockFlatPeripheral; + public static ItemDisk itemDisk; + public static IIcon ribbonTop; + public static IIcon ribbonFace; + @SideOnly(Side.CLIENT) + public static IIcon backplaneTop; + @SideOnly(Side.CLIENT) + public static IIcon backplaneFace; + @SideOnly(Side.CLIENT) + public static IIcon backplaneSide; + @SideOnly(Side.CLIENT) + public static IIcon ram8kTop; + @SideOnly(Side.CLIENT) + public static IIcon ram8kFace; + @SideOnly(Side.CLIENT) + public static IIcon ram8kSide; + @SideOnly(Side.CLIENT) + public static IIcon peripheralBottom; + @SideOnly(Side.CLIENT) + public static IIcon peripheralTop; + @SideOnly(Side.CLIENT) + public static IIcon peripheralSide; + @SideOnly(Side.CLIENT) + public static IIcon peripheralBack; + @SideOnly(Side.CLIENT) + public static IIcon cpuFront; + @SideOnly(Side.CLIENT) + public static IIcon displayFront; + @SideOnly(Side.CLIENT) + public static IIcon diskDriveSide; + @SideOnly(Side.CLIENT) + public static IIcon diskDriveTop; + @SideOnly(Side.CLIENT) + public static IIcon diskDriveFront; + @SideOnly(Side.CLIENT) + public static IIcon diskDriveFrontFull; + @SideOnly(Side.CLIENT) + public static IIcon diskDriveFrontOn; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + setupBlocks(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + private static void setupBlocks() { + blockBackplane = new BlockMultipart(CoreLib.materialRedpower); + GameRegistry.registerBlock(blockBackplane, ItemBackplane.class, "backplane"); + blockBackplane.setCreativeTab(CreativeExtraTabs.tabMachine); + blockBackplane.setHardness(1.0F); + blockBackplane.setBlockName(0, "rpbackplane"); + blockBackplane.setBlockName(1, "rpram"); + blockPeripheral = new BlockPeripheral(); + GameRegistry.registerBlock(blockPeripheral, ItemExtended.class, "peripheral"); + blockPeripheral.setHardness(1.0F); + blockPeripheral.setBlockName(0, "rpdisplay"); + blockPeripheral.setBlockName(1, "rpcpu"); + blockPeripheral.setBlockName(2, "rpdiskdrive"); + blockFlatPeripheral = new BlockMultipart(Material.rock); + blockFlatPeripheral.setCreativeTab(CreativeExtraTabs.tabMachine); + GameRegistry.registerBlock(blockFlatPeripheral, ItemExtended.class, "peripheralFlat"); + blockFlatPeripheral.setHardness(1.0F); + blockFlatPeripheral.setBlockName(0, "rpioexp"); + GameRegistry.registerTileEntity(TileBackplane.class, "RPConBP"); + blockBackplane.addTileEntityMapping(0, TileBackplane::new); + GameRegistry.registerTileEntity(TileRAM.class, "RPConRAM"); + blockBackplane.addTileEntityMapping(1, TileRAM::new); + GameRegistry.registerTileEntity(TileDisplay.class, "RPConDisp"); + blockPeripheral.addTileEntityMapping(0, TileDisplay::new); + GameRegistry.registerTileEntity(TileDiskDrive.class, "RPConDDrv"); + blockPeripheral.addTileEntityMapping(2, TileDiskDrive::new); + GameRegistry.registerTileEntity(TileCPU.class, "RPConCPU"); + blockPeripheral.addTileEntityMapping(1, TileCPU::new); + GameRegistry.registerTileEntity(TileIOExpander.class, "RPConIOX"); + blockFlatPeripheral.addTileEntityMapping(0, TileIOExpander::new); + GameRegistry.registerTileEntity(TileRibbon.class, "RPConRibbon"); + RedPowerBase.blockMicro.addTileEntityMapping(12, TileRibbon::new); + MicroPlacementRibbon imp = new MicroPlacementRibbon(); + RedPowerBase.blockMicro.registerPlacement(12, imp); + itemDisk = new ItemDisk(); + itemDisk.setCreativeTab(CreativeExtraTabs.tabMachine); + CraftLib.addOreRecipe(new ItemStack(itemDisk, 1), "WWW", "W W", "WIW", 'I', Items.iron_ingot, 'W', "plankWood"); + GameRegistry.addShapelessRecipe(new ItemStack(itemDisk, 1, 1), new Object[]{new ItemStack(itemDisk, 1, 0), Items.redstone}); + GameRegistry.registerItem(itemDisk, "diskette"); + GameRegistry.addShapelessRecipe(new ItemStack(itemDisk, 1, 2), new Object[]{new ItemStack(itemDisk, 1, 1), Items.redstone}); + GameRegistry.addRecipe( + new ItemStack(blockBackplane, 1, 0), new Object[]{"ICI", "IGI", "ICI", 'C', RedPowerBase.itemFineCopper, 'I', Blocks.iron_bars, 'G', Items.gold_ingot} + ); + GameRegistry.addRecipe( + new ItemStack(blockBackplane, 1, 1), new Object[]{"IRI", "RDR", "IRI", 'I', Blocks.iron_bars, 'R', RedPowerBase.itemWaferRed, 'D', Items.diamond} + ); + CraftLib.addOreRecipe( + new ItemStack(blockPeripheral, 1, 0), + "GWW", + "GPR", + "GBW", + 'P', + new ItemStack(RedPowerBase.itemLumar, 1, 5), + 'G', + Blocks.glass, + 'W', + "plankWood", + 'R', + RedPowerBase.itemWaferRed, + 'B', + new ItemStack(RedPowerBase.blockMicro, 1, 3072) + ); + CraftLib.addOreRecipe( + new ItemStack(blockPeripheral, 1, 1), + "WWW", + "RDR", + "WBW", + 'W', + "plankWood", + 'D', + Blocks.diamond_block, + 'R', + RedPowerBase.itemWaferRed, + 'B', + new ItemStack(RedPowerBase.blockMicro, 1, 3072) + ); + CraftLib.addOreRecipe( + new ItemStack(blockPeripheral, 1, 2), + "WWW", + "WMR", + "WBW", + 'G', + Blocks.glass, + 'W', + "plankWood", + 'M', + RedPowerBase.itemMotor, + 'R', + RedPowerBase.itemWaferRed, + 'B', + new ItemStack(RedPowerBase.blockMicro, 1, 3072) + ); + CraftLib.addOreRecipe( + new ItemStack(blockFlatPeripheral, 1, 0), + "WCW", + "WRW", + "WBW", + 'W', + "plankWood", + 'R', + RedPowerBase.itemWaferRed, + 'C', + new ItemStack(RedPowerBase.blockMicro, 1, 768), + 'B', + new ItemStack(RedPowerBase.blockMicro, 1, 3072) + ); + GameRegistry.addRecipe(new ItemStack(RedPowerBase.blockMicro, 8, 3072), new Object[]{"C", "C", "C", 'C', RedPowerBase.itemFineCopper}); + ChestGenHooks.addItem("dungeonChest", new WeightedRandomChestContent(new ItemStack(itemDisk, 1, 1), 0, 1, 1)); + ChestGenHooks.addItem("dungeonChest", new WeightedRandomChestContent(new ItemStack(itemDisk, 1, 2), 0, 1, 1)); + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setRenderer(blockBackplane, 0, RenderBackplane::new); + RenderLib.setRenderer(blockBackplane, 1, RenderBackplane::new); + RenderLib.setRenderer(blockPeripheral, 0, RenderDisplay::new); + RenderLib.setRenderer(blockPeripheral, 1, RenderCPU::new); + RenderLib.setRenderer(blockPeripheral, 2, RenderDiskDrive::new); + RenderLib.setRenderer(blockFlatPeripheral, 0, RenderIOExpander::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 12, RenderRibbon::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileBackplane.class, new RenderBackplane(blockBackplane)); + ClientRegistry.bindTileEntitySpecialRenderer(TileRibbon.class, new RenderRibbon(RedPowerBase.blockMicro)); + ClientRegistry.bindTileEntitySpecialRenderer(TileIOExpander.class, new RenderIOExpander(blockPeripheral)); + ClientRegistry.bindTileEntitySpecialRenderer(TileCPU.class, new RenderCPU(blockPeripheral)); + ClientRegistry.bindTileEntitySpecialRenderer(TileDiskDrive.class, new RenderDiskDrive(blockPeripheral)); + ClientRegistry.bindTileEntitySpecialRenderer(TileDisplay.class, new RenderDisplay(blockPeripheral)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + ribbonTop = map.registerIcon("rpcontrol:ribbonTop"); + ribbonFace = map.registerIcon("rpcontrol:ribbonFace"); + backplaneTop = map.registerIcon("rpcontrol:backplaneTop"); + backplaneFace = map.registerIcon("rpcontrol:backplaneFace"); + backplaneSide = map.registerIcon("rpcontrol:backplaneSide"); + ram8kTop = map.registerIcon("rpcontrol:ram8kTop"); + ram8kFace = map.registerIcon("rpcontrol:ram8kFace"); + ram8kSide = map.registerIcon("rpcontrol:ram8kSide"); + peripheralBottom = map.registerIcon("rpcontrol:peripheralBottom"); + peripheralTop = map.registerIcon("rpcontrol:peripheralTop"); + peripheralSide = map.registerIcon("rpcontrol:peripheralSide"); + peripheralBack = map.registerIcon("rpcontrol:peripheralBack"); + cpuFront = map.registerIcon("rpcontrol:cpuFront"); + displayFront = map.registerIcon("rpcontrol:displayFront"); + diskDriveSide = map.registerIcon("rpcontrol:diskDriveSide"); + diskDriveTop = map.registerIcon("rpcontrol:diskDriveTop"); + diskDriveFront = map.registerIcon("rpcontrol:diskDriveFront"); + diskDriveFrontFull = map.registerIcon("rpcontrol:diskDriveFrontFull"); + diskDriveFrontOn = map.registerIcon("rpcontrol:diskDriveFrontOn"); + } + + } + + public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + switch(id) { + case 1: + return new GuiDisplay(player.inventory, CoreLib.getGuiTileEntity(world, x, y, z, TileDisplay.class)); + case 2: + return new GuiCPU(player.inventory, CoreLib.getGuiTileEntity(world, x, y, z, TileCPU.class)); + default: + return null; + } + } + + public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { + switch(id) { + case 1: + return new ContainerDisplay(player.inventory, CoreLib.getTileEntity(world, x, y, z, TileDisplay.class)); + case 2: + return new ContainerCPU(player.inventory, CoreLib.getTileEntity(world, x, y, z, TileCPU.class)); + default: + return null; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerCore.java b/src/main/java/com/eloraam/redpower/RedPowerCore.java new file mode 100644 index 0000000..592e526 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerCore.java @@ -0,0 +1,108 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.core.Config; +import com.eloraam.redpower.core.CoreEvents; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverRecipe; +import com.eloraam.redpower.core.PacketHandler; +import com.eloraam.redpower.core.RenderHighlight; +import com.eloraam.redpower.core.RenderSimpleCovered; +import com.eloraam.redpower.core.TileCovered; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.io.File; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.ICrafting; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerCore", + name = "RedPower Core", + version = "2.0pr6" +) +public class RedPowerCore { + @Instance("RedPowerCore") + public static RedPowerCore instance; + public static PacketHandler packetHandler = new PacketHandler(); + public static int customBlockModel = -1; + public static int nullBlockModel = -1; + @SideOnly(Side.CLIENT) + public static IIcon missing; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + Config.loadConfig(); + CoreLib.readOres(); + MinecraftForge.EVENT_BUS.register(new CoreEvents()); + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + packetHandler.init(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.setupRenderers(); + } + + CraftingManager.getInstance().getRecipeList().add(new CoverRecipe()); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + Config.saveConfig(); + } + + public static File getSaveDir(World world) { + return DimensionManager.getCurrentSaveRootDirectory(); + } + + public static void sendPacketToServer(IMessage msg) { + packetHandler.sendToServer(msg); + } + + public static void sendPacketToCrafting(ICrafting icr, IMessage msg) { + if (icr instanceof EntityPlayerMP) { + EntityPlayerMP player = (EntityPlayerMP)icr; + packetHandler.sendTo(msg, player); + } + + } + + @SideOnly(Side.CLIENT) + public void setupRenderers() { + customBlockModel = RenderingRegistry.getNextAvailableRenderId(); + nullBlockModel = RenderingRegistry.getNextAvailableRenderId(); + MinecraftForge.EVENT_BUS.register(new RenderHighlight()); + ClientRegistry.bindTileEntitySpecialRenderer(TileCovered.class, new RenderSimpleCovered()); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + missing = map.registerIcon("rpcore:missing"); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerLighting.java b/src/main/java/com/eloraam/redpower/RedPowerLighting.java new file mode 100644 index 0000000..4fedf4c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerLighting.java @@ -0,0 +1,216 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.lighting.BlockLamp; +import com.eloraam.redpower.lighting.BlockShapedLamp; +import com.eloraam.redpower.lighting.ItemLamp; +import com.eloraam.redpower.lighting.RenderLamp; +import com.eloraam.redpower.lighting.RenderShapedLamp; +import com.eloraam.redpower.lighting.TileLamp; +import com.eloraam.redpower.lighting.TileShapedLamp; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerLighting", + name = "RedPower Lighting", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerLighting { + @Instance("RedPowerLighting") + public static RedPowerLighting instance; + public static BlockLamp blockLamp; + public static BlockShapedLamp blockShapedLamp; + public static CreativeTabs tabLamp = new CreativeTabs(CreativeTabs.getNextID(), "RPLights") { + public ItemStack getIconItemStack() { + return new ItemStack(RedPowerLighting.blockLamp, 1, 16); + } + + public Item getTabIconItem() { + return null; + } + }; + public static IIcon[] lampOff; + public static IIcon[] lampOn; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + setupLighting(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + public static void setupLighting() { + blockLamp = new BlockLamp(); + blockLamp.setBlockName("rplamp"); + GameRegistry.registerBlock(blockLamp, ItemLamp.class, "lampo"); + GameRegistry.registerTileEntity(TileLamp.class, "RPLamp"); + blockLamp.addTileEntityMapping(0, TileLamp::new); + + for(int color = 0; color < 16; ++color) { + String nm = "rplamp." + CoreLib.rawColorNames[color]; + blockLamp.setBlockName(color, nm); + GameRegistry.addRecipe( + new ItemStack(blockLamp, 1, color), + new Object[]{"GLG", "GLG", "GRG", 'G', Blocks.glass_pane, 'L', new ItemStack(RedPowerBase.itemLumar, 1, color), 'R', Items.redstone} + ); + } + + for(int color = 0; color < 16; ++color) { + String nm = "rpilamp." + CoreLib.rawColorNames[color]; + blockLamp.setBlockName(color + 16, nm); + GameRegistry.addRecipe( + new ItemStack(blockLamp, 1, 16 + color), + new Object[]{"GLG", "GLG", "GRG", 'G', Blocks.glass_pane, 'L', new ItemStack(RedPowerBase.itemLumar, 1, color), 'R', Blocks.redstone_torch} + ); + } + + blockShapedLamp = new BlockShapedLamp(); + GameRegistry.registerBlock(blockShapedLamp, ItemLamp.class, "shlamp"); + GameRegistry.registerTileEntity(TileShapedLamp.class, "RPShLamp"); + blockShapedLamp.addTileEntityMapping(0, TileShapedLamp::new); + + for(int color = 0; color < 16; ++color) { + String nm = "rpshlamp." + CoreLib.rawColorNames[color]; + blockShapedLamp.setBlockName(color, nm); + GameRegistry.addRecipe( + new ItemStack(blockShapedLamp, 1, color), + new Object[]{ + "GLG", "GLG", "SRS", 'G', Blocks.glass_pane, 'L', new ItemStack(RedPowerBase.itemLumar, 1, color), 'R', Items.redstone, 'S', Blocks.stone_slab + } + ); + } + + for(int color = 0; color < 16; ++color) { + String nm = "rpishlamp." + CoreLib.rawColorNames[color]; + blockShapedLamp.setBlockName(color + 16, nm); + GameRegistry.addRecipe( + new ItemStack(blockShapedLamp, 1, 16 + color), + new Object[]{ + "GLG", + "GLG", + "SRS", + 'G', + Blocks.glass_pane, + 'L', + new ItemStack(RedPowerBase.itemLumar, 1, color), + 'R', + Blocks.redstone_torch, + 'S', + new ItemStack(Blocks.stone_slab, 1, 0) + } + ); + } + + for(int color = 0; color < 16; ++color) { + String nm = "rpshlamp2." + CoreLib.rawColorNames[color]; + blockShapedLamp.setBlockName(color + 32, nm); + GameRegistry.addRecipe( + new ItemStack(blockShapedLamp, 1, 32 + color), + new Object[]{ + "ILI", + "GLG", + "SRS", + 'G', + Blocks.glass_pane, + 'L', + new ItemStack(RedPowerBase.itemLumar, 1, color), + 'R', + Items.redstone, + 'I', + Blocks.iron_bars, + 'S', + new ItemStack(Blocks.stone_slab, 1, 0) + } + ); + } + + for(int color = 0; color < 16; ++color) { + String nm = "rpishlamp2." + CoreLib.rawColorNames[color]; + blockShapedLamp.setBlockName(color + 48, nm); + GameRegistry.addRecipe( + new ItemStack(blockShapedLamp, 1, 48 + color), + new Object[]{ + "ILI", + "GLG", + "SRS", + 'G', + Blocks.glass_pane, + 'L', + new ItemStack(RedPowerBase.itemLumar, 1, color), + 'R', + Blocks.redstone_torch, + 'I', + Blocks.iron_bars, + 'S', + Blocks.stone_slab + } + ); + } + + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setDefaultRenderer(blockLamp, 10, RenderLamp::new); + RenderLib.setDefaultRenderer(blockShapedLamp, 10, RenderShapedLamp::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileLamp.class, new RenderLamp(blockLamp)); + ClientRegistry.bindTileEntitySpecialRenderer(TileShapedLamp.class, new RenderShapedLamp(blockShapedLamp)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + if (lampOff == null) { + lampOff = new IIcon[16]; + } + + if (lampOn == null) { + lampOn = new IIcon[16]; + } + + for(int i = 0; i < 16; ++i) { + lampOff[i] = map.registerIcon("rplighting:lampOff/" + i); + lampOn[i] = map.registerIcon("rplighting:lampOn/" + i); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerLogic.java b/src/main/java/com/eloraam/redpower/RedPowerLogic.java new file mode 100644 index 0000000..54c23e8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerLogic.java @@ -0,0 +1,313 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.core.Config; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ItemParts; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.logic.BlockLogic; +import com.eloraam.redpower.logic.ContainerCounter; +import com.eloraam.redpower.logic.ContainerTimer; +import com.eloraam.redpower.logic.GuiCounter; +import com.eloraam.redpower.logic.GuiTimer; +import com.eloraam.redpower.logic.ItemLogic; +import com.eloraam.redpower.logic.RenderLogicAdv; +import com.eloraam.redpower.logic.RenderLogicArray; +import com.eloraam.redpower.logic.RenderLogicPointer; +import com.eloraam.redpower.logic.RenderLogicSimple; +import com.eloraam.redpower.logic.RenderLogicStorage; +import com.eloraam.redpower.logic.TileLogicAdv; +import com.eloraam.redpower.logic.TileLogicArray; +import com.eloraam.redpower.logic.TileLogicPointer; +import com.eloraam.redpower.logic.TileLogicSimple; +import com.eloraam.redpower.logic.TileLogicStorage; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.TextureStitchEvent.Post; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerLogic", + name = "RedPower Logic", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerLogic implements IGuiHandler { + @Instance("RedPowerLogic") + public static RedPowerLogic instance; + public static BlockLogic blockLogic; + public static ItemParts itemParts; + public static ItemStack itemAnode; + public static ItemStack itemCathode; + public static ItemStack itemWire; + public static ItemStack itemWafer; + public static ItemStack itemPointer; + public static ItemStack itemPlate; + public static ItemStack itemWaferRedwire; + public static ItemStack itemChip; + public static ItemStack itemTaintedChip; + public static ItemStack itemWaferBundle; + public static boolean soundsEnabled; + @SideOnly(Side.CLIENT) + public static IIcon torch; + @SideOnly(Side.CLIENT) + public static IIcon torchOn; + @SideOnly(Side.CLIENT) + public static IIcon lever; + @SideOnly(Side.CLIENT) + public static IIcon cobblestone; + public static IIcon[] logicOne = new IIcon[232]; + public static IIcon[] logicTwo = new IIcon[256]; + public static IIcon[] logicSensor = new IIcon[23]; + + private static void setupLogic() { + GameRegistry.registerTileEntity(TileLogicSimple.class, "RPLgSmp"); + GameRegistry.registerTileEntity(TileLogicArray.class, "RPLgAr"); + GameRegistry.registerTileEntity(TileLogicStorage.class, "RPLgStor"); + GameRegistry.registerTileEntity(TileLogicAdv.class, "RPLgAdv"); + GameRegistry.registerTileEntity(TileLogicPointer.class, "RPLgPtr"); + itemParts = new ItemParts(); + itemParts.addItem(0, "rplogic:wafer", "item.irwafer"); + itemParts.addItem(1, "rplogic:wire", "item.irwire"); + itemParts.addItem(2, "rplogic:anode", "item.iranode"); + itemParts.addItem(3, "rplogic:cathode", "item.ircathode"); + itemParts.addItem(4, "rplogic:pointer", "item.irpointer"); + itemParts.addItem(5, "rplogic:redWire", "item.irredwire"); + itemParts.addItem(6, "rplogic:plate", "item.irplate"); + itemParts.addItem(7, "rplogic:chip", "item.irchip"); + itemParts.addItem(8, "rplogic:tchip", "item.irtchip"); + itemParts.addItem(9, "rplogic:bundle", "item.irbundle"); + GameRegistry.registerItem(itemParts, "parts"); + itemWafer = new ItemStack(itemParts, 1, 0); + itemWire = new ItemStack(itemParts, 1, 1); + itemAnode = new ItemStack(itemParts, 1, 2); + itemCathode = new ItemStack(itemParts, 1, 3); + itemPointer = new ItemStack(itemParts, 1, 4); + itemWaferRedwire = new ItemStack(itemParts, 1, 5); + itemPlate = new ItemStack(itemParts, 1, 6); + itemChip = new ItemStack(itemParts, 1, 7); + itemTaintedChip = new ItemStack(itemParts, 1, 8); + itemWaferBundle = new ItemStack(itemParts, 1, 9); + FurnaceRecipes.smelting().func_151393_a(Blocks.stone, new ItemStack(itemParts, 2, 0), 0.1F); + GameRegistry.addRecipe(itemWire, new Object[]{"R", "B", 'B', itemWafer, 'R', Items.redstone}); + GameRegistry.addRecipe(new ItemStack(itemParts, 3, 2), new Object[]{" R ", "RRR", "BBB", 'B', itemWafer, 'R', Items.redstone}); + GameRegistry.addRecipe(itemCathode, new Object[]{"T", "B", 'B', itemWafer, 'T', Blocks.redstone_torch}); + GameRegistry.addRecipe(itemPointer, new Object[]{"S", "T", "B", 'B', itemWafer, 'S', Blocks.stone, 'T', Blocks.redstone_torch}); + GameRegistry.addRecipe(itemWaferRedwire, new Object[]{"W", "B", 'B', itemWafer, 'W', new ItemStack(RedPowerBase.blockMicro, 1, 256)}); + GameRegistry.addRecipe(itemPlate, new Object[]{" B ", "SRS", "BCB", 'B', itemWafer, 'C', itemCathode, 'R', RedPowerBase.itemIngotRed, 'S', Items.stick}); + GameRegistry.addRecipe(CoreLib.copyStack(itemChip, 3), new Object[]{" R ", "BBB", 'B', itemWafer, 'R', RedPowerBase.itemWaferRed}); + GameRegistry.addShapelessRecipe(CoreLib.copyStack(itemTaintedChip, 1), new Object[]{itemChip, Items.glowstone_dust}); + GameRegistry.addRecipe(itemWaferBundle, new Object[]{"W", "B", 'B', itemWafer, 'W', new ItemStack(RedPowerBase.blockMicro, 1, 768)}); + blockLogic = new BlockLogic(); + GameRegistry.registerBlock(blockLogic, ItemLogic.class, "logic"); + blockLogic.addTileEntityMapping(0, TileLogicPointer::new); + blockLogic.addTileEntityMapping(1, TileLogicSimple::new); + blockLogic.addTileEntityMapping(2, TileLogicArray::new); + blockLogic.addTileEntityMapping(3, TileLogicStorage::new); + blockLogic.addTileEntityMapping(4, TileLogicAdv::new); + blockLogic.setBlockName(0, "irtimer"); + blockLogic.setBlockName(1, "irseq"); + blockLogic.setBlockName(2, "irstate"); + blockLogic.setBlockName(256, "irlatch"); + blockLogic.setBlockName(257, "irnor"); + blockLogic.setBlockName(258, "iror"); + blockLogic.setBlockName(259, "irnand"); + blockLogic.setBlockName(260, "irand"); + blockLogic.setBlockName(261, "irxnor"); + blockLogic.setBlockName(262, "irxor"); + blockLogic.setBlockName(263, "irpulse"); + blockLogic.setBlockName(264, "irtoggle"); + blockLogic.setBlockName(265, "irnot"); + blockLogic.setBlockName(266, "irbuf"); + blockLogic.setBlockName(267, "irmux"); + blockLogic.setBlockName(268, "irrepeater"); + blockLogic.setBlockName(269, "irsync"); + blockLogic.setBlockName(270, "irrand"); + blockLogic.setBlockName(271, "irdlatch"); + blockLogic.setBlockName(272, "rplightsensor"); + blockLogic.setBlockName(512, "rpanc"); + blockLogic.setBlockName(513, "rpainv"); + blockLogic.setBlockName(514, "rpaninv"); + blockLogic.setBlockName(768, "ircounter"); + blockLogic.setBlockName(1024, "irbusxcvr"); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 0), new Object[]{"BWB", "WPW", "ACA", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode, 'P', itemPointer} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 1), new Object[]{"BCB", "CPC", "BCB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode, 'P', itemPointer} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 2), + new Object[]{"BAC", "WSP", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode, 'P', itemPointer, 'S', itemChip} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 256), new Object[]{"WWA", "CBC", "AWW", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 257), new Object[]{"BAB", "WCW", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe(new ItemStack(blockLogic, 1, 258), new Object[]{"BCB", "WCW", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode}); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 259), new Object[]{"AAA", "CCC", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 260), new Object[]{"ACA", "CCC", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 261), new Object[]{"ACA", "CAC", "WCW", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 262), new Object[]{"AWA", "CAC", "WCW", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 263), new Object[]{"ACA", "CAC", "WWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 264), new Object[]{"BCB", "WLW", "BCB", 'L', Blocks.lever, 'W', itemWire, 'B', itemWafer, 'C', itemCathode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 265), new Object[]{"BAB", "ACA", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 266), new Object[]{"ACA", "WCW", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 267), new Object[]{"ACA", "CBC", "ACW", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 268), new Object[]{"BCW", "BAW", "BWC", 'W', itemWire, 'B', itemWafer, 'A', itemAnode, 'C', itemCathode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 269), new Object[]{"WCW", "SAS", "WWW", 'W', itemWire, 'B', itemWafer, 'A', itemAnode, 'C', itemCathode, 'S', itemChip} + ); + GameRegistry.addRecipe(new ItemStack(blockLogic, 1, 270), new Object[]{"BSB", "WWW", "SWS", 'W', itemWire, 'B', itemWafer, 'S', itemTaintedChip}); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 271), new Object[]{"ACW", "CCC", "CWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'A', itemAnode} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 272), new Object[]{"BWB", "BSB", "BBB", 'W', itemWire, 'B', itemWafer, 'S', RedPowerBase.itemWaferBlue} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 768), new Object[]{"BWB", "CPC", "BWB", 'W', itemWire, 'B', itemWafer, 'C', itemCathode, 'P', itemPointer} + ); + GameRegistry.addRecipe(new ItemStack(blockLogic, 1, 512), new Object[]{"BRB", "RRR", "BRB", 'B', itemWafer, 'R', itemWaferRedwire}); + GameRegistry.addRecipe(new ItemStack(blockLogic, 1, 513), new Object[]{"BRB", "RPR", "BRB", 'B', itemWafer, 'R', itemWaferRedwire, 'P', itemPlate}); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 514), new Object[]{"BRB", "RPR", "BRC", 'B', itemWafer, 'C', itemCathode, 'R', itemWaferRedwire, 'P', itemPlate} + ); + GameRegistry.addRecipe( + new ItemStack(blockLogic, 1, 1024), new Object[]{"CCC", "WBW", "CCC", 'B', itemWafer, 'W', RedPowerBase.itemWaferRed, 'C', itemWaferBundle} + ); + } + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + soundsEnabled = Config.getInt("settings.logic.enableSounds", 1) > 0; + setupLogic(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int X, int Y, int Z) { + switch(ID) { + case 1: + return new GuiCounter(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileLogicStorage.class)); + case 2: + return new GuiTimer(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileLogicPointer.class)); + default: + return null; + } + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int X, int Y, int Z) { + switch(ID) { + case 1: + return new ContainerCounter(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileLogicStorage.class)); + case 2: + return new ContainerTimer(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileLogicPointer.class)); + default: + return null; + } + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setHighRenderer(blockLogic, 0, RenderLogicPointer::new); + RenderLib.setHighRenderer(blockLogic, 1, RenderLogicSimple::new); + RenderLib.setHighRenderer(blockLogic, 2, RenderLogicArray::new); + RenderLib.setHighRenderer(blockLogic, 3, RenderLogicStorage::new); + RenderLib.setHighRenderer(blockLogic, 4, RenderLogicAdv::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileLogicAdv.class, new RenderLogicAdv(blockLogic)); + ClientRegistry.bindTileEntitySpecialRenderer(TileLogicSimple.class, new RenderLogicSimple(blockLogic)); + ClientRegistry.bindTileEntitySpecialRenderer(TileLogicArray.class, new RenderLogicArray(blockLogic)); + ClientRegistry.bindTileEntitySpecialRenderer(TileLogicStorage.class, new RenderLogicStorage(blockLogic)); + ClientRegistry.bindTileEntitySpecialRenderer(TileLogicPointer.class, new RenderLogicPointer(blockLogic)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + for(int i = 0; i < 232; ++i) { + logicOne[i] = map.registerIcon("rplogic:logic1/" + i); + } + + for(int i = 0; i < 256; ++i) { + logicTwo[i] = map.registerIcon("rplogic:logic2/" + i); + } + + for(int i = 0; i < 23; ++i) { + logicSensor[i] = map.registerIcon("rplogic:sensors/" + i); + } + } + + } + + @SubscribeEvent + public void onTextureStitch(Post evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + torch = map.getAtlasSprite("redstone_torch_off"); + torchOn = map.getAtlasSprite("redstone_torch_on"); + lever = map.getAtlasSprite("lever"); + cobblestone = map.getAtlasSprite("cobblestone"); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerMachine.java b/src/main/java/com/eloraam/redpower/RedPowerMachine.java new file mode 100644 index 0000000..aebabef --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerMachine.java @@ -0,0 +1,1223 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.core.AchieveLib; +import com.eloraam.redpower.core.Config; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.ItemExtended; +import com.eloraam.redpower.core.ItemParts; +import com.eloraam.redpower.core.ItemTextured; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.machine.BlockFrame; +import com.eloraam.redpower.machine.BlockMachine; +import com.eloraam.redpower.machine.BlockMachinePanel; +import com.eloraam.redpower.machine.ContainerAssemble; +import com.eloraam.redpower.machine.ContainerBatteryBox; +import com.eloraam.redpower.machine.ContainerBlueAlloyFurnace; +import com.eloraam.redpower.machine.ContainerBlueFurnace; +import com.eloraam.redpower.machine.ContainerBufferChest; +import com.eloraam.redpower.machine.ContainerChargingBench; +import com.eloraam.redpower.machine.ContainerDeploy; +import com.eloraam.redpower.machine.ContainerEject; +import com.eloraam.redpower.machine.ContainerFilter; +import com.eloraam.redpower.machine.ContainerItemDetect; +import com.eloraam.redpower.machine.ContainerManager; +import com.eloraam.redpower.machine.ContainerRegulator; +import com.eloraam.redpower.machine.ContainerRetriever; +import com.eloraam.redpower.machine.ContainerSorter; +import com.eloraam.redpower.machine.ContainerWindTurbine; +import com.eloraam.redpower.machine.GuiAssemble; +import com.eloraam.redpower.machine.GuiBatteryBox; +import com.eloraam.redpower.machine.GuiBlueAlloyFurnace; +import com.eloraam.redpower.machine.GuiBlueFurnace; +import com.eloraam.redpower.machine.GuiBufferChest; +import com.eloraam.redpower.machine.GuiChargingBench; +import com.eloraam.redpower.machine.GuiDeploy; +import com.eloraam.redpower.machine.GuiEject; +import com.eloraam.redpower.machine.GuiFilter; +import com.eloraam.redpower.machine.GuiItemDetect; +import com.eloraam.redpower.machine.GuiManager; +import com.eloraam.redpower.machine.GuiRegulator; +import com.eloraam.redpower.machine.GuiRetriever; +import com.eloraam.redpower.machine.GuiSorter; +import com.eloraam.redpower.machine.GuiWindTurbine; +import com.eloraam.redpower.machine.ItemBattery; +import com.eloraam.redpower.machine.ItemMachinePanel; +import com.eloraam.redpower.machine.ItemSonicDriver; +import com.eloraam.redpower.machine.ItemVoltmeter; +import com.eloraam.redpower.machine.ItemWindmill; +import com.eloraam.redpower.machine.MicroPlacementTube; +import com.eloraam.redpower.machine.RenderAccel; +import com.eloraam.redpower.machine.RenderBatteryBox; +import com.eloraam.redpower.machine.RenderBlueAlloyFurnace; +import com.eloraam.redpower.machine.RenderBlueFurnace; +import com.eloraam.redpower.machine.RenderBreaker; +import com.eloraam.redpower.machine.RenderBufferChest; +import com.eloraam.redpower.machine.RenderChargingBench; +import com.eloraam.redpower.machine.RenderFrame; +import com.eloraam.redpower.machine.RenderFrameMoving; +import com.eloraam.redpower.machine.RenderFrameRedstoneTube; +import com.eloraam.redpower.machine.RenderFrameTube; +import com.eloraam.redpower.machine.RenderGrate; +import com.eloraam.redpower.machine.RenderMachine; +import com.eloraam.redpower.machine.RenderMotor; +import com.eloraam.redpower.machine.RenderPipe; +import com.eloraam.redpower.machine.RenderPump; +import com.eloraam.redpower.machine.RenderRedstoneTube; +import com.eloraam.redpower.machine.RenderSolarPanel; +import com.eloraam.redpower.machine.RenderThermopile; +import com.eloraam.redpower.machine.RenderTransformer; +import com.eloraam.redpower.machine.RenderTube; +import com.eloraam.redpower.machine.RenderWindTurbine; +import com.eloraam.redpower.machine.TileAccel; +import com.eloraam.redpower.machine.TileAssemble; +import com.eloraam.redpower.machine.TileBatteryBox; +import com.eloraam.redpower.machine.TileBlueAlloyFurnace; +import com.eloraam.redpower.machine.TileBlueFurnace; +import com.eloraam.redpower.machine.TileBreaker; +import com.eloraam.redpower.machine.TileBufferChest; +import com.eloraam.redpower.machine.TileChargingBench; +import com.eloraam.redpower.machine.TileDeploy; +import com.eloraam.redpower.machine.TileEject; +import com.eloraam.redpower.machine.TileEjectBase; +import com.eloraam.redpower.machine.TileFilter; +import com.eloraam.redpower.machine.TileFrame; +import com.eloraam.redpower.machine.TileFrameMoving; +import com.eloraam.redpower.machine.TileFrameRedstoneTube; +import com.eloraam.redpower.machine.TileFrameTube; +import com.eloraam.redpower.machine.TileGrate; +import com.eloraam.redpower.machine.TileIgniter; +import com.eloraam.redpower.machine.TileItemDetect; +import com.eloraam.redpower.machine.TileMachine; +import com.eloraam.redpower.machine.TileMagTube; +import com.eloraam.redpower.machine.TileManager; +import com.eloraam.redpower.machine.TileMotor; +import com.eloraam.redpower.machine.TilePipe; +import com.eloraam.redpower.machine.TilePump; +import com.eloraam.redpower.machine.TileRedstoneTube; +import com.eloraam.redpower.machine.TileRegulator; +import com.eloraam.redpower.machine.TileRelay; +import com.eloraam.redpower.machine.TileRestrictTube; +import com.eloraam.redpower.machine.TileRetriever; +import com.eloraam.redpower.machine.TileSolarPanel; +import com.eloraam.redpower.machine.TileSorter; +import com.eloraam.redpower.machine.TileSortron; +import com.eloraam.redpower.machine.TileThermopile; +import com.eloraam.redpower.machine.TileTransformer; +import com.eloraam.redpower.machine.TileTranspose; +import com.eloraam.redpower.machine.TileTube; +import com.eloraam.redpower.machine.TileWindTurbine; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.network.IGuiHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.AchievementList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerMachine", + name = "RedPower Machine", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerMachine implements IGuiHandler { + @Instance("RedPowerMachine") + public static RedPowerMachine instance; + public static BlockMachine blockMachine; + public static BlockMachine blockMachine2; + public static BlockMachinePanel blockMachinePanel; + public static BlockFrame blockFrame; + public static ItemVoltmeter itemVoltmeter; + public static ItemSonicDriver itemSonicDriver; + public static Item itemBatteryEmpty; + public static Item itemBatteryPowered; + public static ItemParts itemMachineParts; + public static ItemStack itemWoodSail; + public static Item itemWoodTurbine; + public static Item itemWoodWindmill; + public static boolean FrameAlwaysCrate; + public static int FrameLinkSize; + public static boolean AllowGrateDump; + @SideOnly(Side.CLIENT) + public static IIcon frameCrossed; + @SideOnly(Side.CLIENT) + public static IIcon frameCovered; + @SideOnly(Side.CLIENT) + public static IIcon framePaneled; + @SideOnly(Side.CLIENT) + public static IIcon crate; + @SideOnly(Side.CLIENT) + public static IIcon baseTubeSide; + @SideOnly(Side.CLIENT) + public static IIcon baseTubeFace; + @SideOnly(Side.CLIENT) + public static IIcon baseTubeSideColor; + @SideOnly(Side.CLIENT) + public static IIcon baseTubeFaceColor; + public static IIcon[] redstoneTubeSide = new IIcon[4]; + public static IIcon[] redstoneTubeFace = new IIcon[4]; + @SideOnly(Side.CLIENT) + public static IIcon pipeSide; + @SideOnly(Side.CLIENT) + public static IIcon pipeFace; + @SideOnly(Side.CLIENT) + public static IIcon pipeFlanges; + @SideOnly(Side.CLIENT) + public static IIcon restrictTubeSide; + @SideOnly(Side.CLIENT) + public static IIcon restrictTubeFace; + @SideOnly(Side.CLIENT) + public static IIcon restrictTubeSideColor; + @SideOnly(Side.CLIENT) + public static IIcon restrictTubeFaceColor; + @SideOnly(Side.CLIENT) + public static IIcon magTubeSide; + @SideOnly(Side.CLIENT) + public static IIcon magTubeRing; + @SideOnly(Side.CLIENT) + public static IIcon magTubeFace; + @SideOnly(Side.CLIENT) + public static IIcon magTubeSideNR; + @SideOnly(Side.CLIENT) + public static IIcon magTubeFaceNR; + @SideOnly(Side.CLIENT) + public static IIcon tubeItemOverlay; + @SideOnly(Side.CLIENT) + public static IIcon electronicsBottom; + @SideOnly(Side.CLIENT) + public static IIcon batteryTop; + public static IIcon[] batterySide = new IIcon[9]; + @SideOnly(Side.CLIENT) + public static IIcon retrieverFront; + @SideOnly(Side.CLIENT) + public static IIcon retrieverBack; + @SideOnly(Side.CLIENT) + public static IIcon retrieverSide; + @SideOnly(Side.CLIENT) + public static IIcon retrieverSideOn; + @SideOnly(Side.CLIENT) + public static IIcon retrieverSideCharged; + @SideOnly(Side.CLIENT) + public static IIcon retrieverSideChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon transposerFront; + @SideOnly(Side.CLIENT) + public static IIcon transposerSide; + @SideOnly(Side.CLIENT) + public static IIcon transposerSideOn; + @SideOnly(Side.CLIENT) + public static IIcon filterSide; + @SideOnly(Side.CLIENT) + public static IIcon filterSideOn; + @SideOnly(Side.CLIENT) + public static IIcon breakerFront; + @SideOnly(Side.CLIENT) + public static IIcon breakerFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon breakerBack; + @SideOnly(Side.CLIENT) + public static IIcon breakerSide; + @SideOnly(Side.CLIENT) + public static IIcon breakerSideOn; + @SideOnly(Side.CLIENT) + public static IIcon deployerBack; + @SideOnly(Side.CLIENT) + public static IIcon deployerFront; + @SideOnly(Side.CLIENT) + public static IIcon deployerFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon deployerSide; + @SideOnly(Side.CLIENT) + public static IIcon deployerSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon motorBottom; + @SideOnly(Side.CLIENT) + public static IIcon motorSide; + @SideOnly(Side.CLIENT) + public static IIcon motorFront; + @SideOnly(Side.CLIENT) + public static IIcon motorFrontCharged; + @SideOnly(Side.CLIENT) + public static IIcon motorFrontActive; + @SideOnly(Side.CLIENT) + public static IIcon motorTop; + @SideOnly(Side.CLIENT) + public static IIcon motorTopActive; + @SideOnly(Side.CLIENT) + public static IIcon turbineFront; + @SideOnly(Side.CLIENT) + public static IIcon turbineSide; + @SideOnly(Side.CLIENT) + public static IIcon turbineSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon thermopileFront; + @SideOnly(Side.CLIENT) + public static IIcon thermopileSide; + @SideOnly(Side.CLIENT) + public static IIcon thermopileTop; + @SideOnly(Side.CLIENT) + public static IIcon btFurnaceTop; + @SideOnly(Side.CLIENT) + public static IIcon btFurnaceSide; + @SideOnly(Side.CLIENT) + public static IIcon btFurnaceFront; + @SideOnly(Side.CLIENT) + public static IIcon btFurnaceFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon btAlloyFurnaceTop; + @SideOnly(Side.CLIENT) + public static IIcon btAlloyFurnaceSide; + @SideOnly(Side.CLIENT) + public static IIcon btAlloyFurnaceFront; + @SideOnly(Side.CLIENT) + public static IIcon btAlloyFurnaceFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon btChargerTop; + @SideOnly(Side.CLIENT) + public static IIcon btChargerTopOn; + @SideOnly(Side.CLIENT) + public static IIcon btChargerBottom; + @SideOnly(Side.CLIENT) + public static IIcon btChargerSide; + @SideOnly(Side.CLIENT) + public static IIcon btChargerSideOn; + public static IIcon[] btChargerFront = new IIcon[6]; + public static IIcon[] btChargerFrontPowered = new IIcon[5]; + public static IIcon[] btChargerFrontActive = new IIcon[5]; + @SideOnly(Side.CLIENT) + public static IIcon bufferFront; + @SideOnly(Side.CLIENT) + public static IIcon bufferBack; + @SideOnly(Side.CLIENT) + public static IIcon bufferSide; + @SideOnly(Side.CLIENT) + public static IIcon sorterFront; + @SideOnly(Side.CLIENT) + public static IIcon sorterBack; + @SideOnly(Side.CLIENT) + public static IIcon sorterBackCharged; + @SideOnly(Side.CLIENT) + public static IIcon sorterBackChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon sorterSide; + @SideOnly(Side.CLIENT) + public static IIcon sorterSideOn; + @SideOnly(Side.CLIENT) + public static IIcon sorterSideCharged; + @SideOnly(Side.CLIENT) + public static IIcon sorterSideChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon detectorSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon detectorSideAltOn; + @SideOnly(Side.CLIENT) + public static IIcon detectorSide; + @SideOnly(Side.CLIENT) + public static IIcon detectorSideOn; + @SideOnly(Side.CLIENT) + public static IIcon detectorSideCharged; + @SideOnly(Side.CLIENT) + public static IIcon detectorSideChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon regulatorFront; + @SideOnly(Side.CLIENT) + public static IIcon regulatorBack; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSideAltCharged; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSide; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSideOn; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSideCharged; + @SideOnly(Side.CLIENT) + public static IIcon regulatorSideChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon sortronFront; + @SideOnly(Side.CLIENT) + public static IIcon sortronBack; + @SideOnly(Side.CLIENT) + public static IIcon sortronSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon sortronSideAltCharged; + @SideOnly(Side.CLIENT) + public static IIcon sortronSide; + @SideOnly(Side.CLIENT) + public static IIcon sortronSideCharged; + @SideOnly(Side.CLIENT) + public static IIcon sortronSideOn; + @SideOnly(Side.CLIENT) + public static IIcon sortronSideChargedOn; + @SideOnly(Side.CLIENT) + public static IIcon managerFront; + @SideOnly(Side.CLIENT) + public static IIcon managerBack; + public static IIcon[] managerSide = new IIcon[4]; + public static IIcon[] managerSideCharged = new IIcon[4]; + @SideOnly(Side.CLIENT) + public static IIcon assemblerFront; + @SideOnly(Side.CLIENT) + public static IIcon assemblerFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon assemblerBack; + @SideOnly(Side.CLIENT) + public static IIcon assemblerBackOn; + @SideOnly(Side.CLIENT) + public static IIcon igniterFront; + @SideOnly(Side.CLIENT) + public static IIcon igniterFrontOn; + @SideOnly(Side.CLIENT) + public static IIcon igniterSide; + @SideOnly(Side.CLIENT) + public static IIcon igniterSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon assemblerSide; + @SideOnly(Side.CLIENT) + public static IIcon assemblerSideAlt; + @SideOnly(Side.CLIENT) + public static IIcon ejectorSide; + @SideOnly(Side.CLIENT) + public static IIcon ejectorSideOn; + @SideOnly(Side.CLIENT) + public static IIcon relaySide; + @SideOnly(Side.CLIENT) + public static IIcon relaySideOn; + @SideOnly(Side.CLIENT) + public static IIcon relaySideAlt; + @SideOnly(Side.CLIENT) + public static IIcon solarPanelTop; + @SideOnly(Side.CLIENT) + public static IIcon solarPanelSide; + @SideOnly(Side.CLIENT) + public static IIcon grateSide; + @SideOnly(Side.CLIENT) + public static IIcon grateBack; + @SideOnly(Side.CLIENT) + public static IIcon grateMossySide; + @SideOnly(Side.CLIENT) + public static IIcon grateEmptyBack; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + } + + @EventHandler + public void load(FMLInitializationEvent event) { + FrameAlwaysCrate = Config.getInt("settings.machine.frame.alwayscrate", 0) > 0; + FrameLinkSize = Config.getInt("settings.machine.frame.linksize", 1000); + AllowGrateDump = Config.getInt("settings.machine.frame.allowgratedump", 1) > 0; + setupItems(); + setupBlocks(); + initAchievements(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + private static void setupItems() { + itemVoltmeter = new ItemVoltmeter(); + itemBatteryEmpty = new ItemTextured("rpmachine:battery").setUnlocalizedName("btbattery").setCreativeTab(CreativeTabs.tabRedstone); + itemBatteryPowered = new ItemBattery(); + CraftLib.addOreRecipe(new ItemStack(itemVoltmeter), "WWW", "WNW", "CCC", 'W', "plankWood", 'N', RedPowerBase.itemNikolite, 'C', "ingotCopper"); + GameRegistry.registerItem(itemVoltmeter, "voltmeter"); + CraftLib.addOreRecipe(new ItemStack(itemBatteryEmpty, 1), "NCN", "NTN", "NCN", 'N', RedPowerBase.itemNikolite, 'C', "ingotCopper", 'T', "ingotTin"); + GameRegistry.registerItem(itemBatteryEmpty, "batteryEmpty"); + GameRegistry.registerItem(itemBatteryPowered, "batteryPowered"); + itemSonicDriver = new ItemSonicDriver(); + itemSonicDriver.setUnlocalizedName("sonicDriver").setTextureName("rpmachine:sonicScrewdriver"); + GameRegistry.addRecipe( + new ItemStack(itemSonicDriver, 1, itemSonicDriver.getMaxDamage()), + new Object[]{"E ", " R ", " B", 'R', RedPowerBase.itemIngotBrass, 'E', RedPowerBase.itemGreenSapphire, 'B', itemBatteryEmpty} + ); + GameRegistry.registerItem(itemSonicDriver, "sonicDriver"); + itemWoodTurbine = new ItemWindmill(1); + itemWoodWindmill = new ItemWindmill(2).setUnlocalizedName("windmillWood").setTextureName("rpmachine:windmill"); + itemMachineParts = new ItemParts(); + itemMachineParts.addItem(0, "rpmachine:windSailWood", "item.windSailWood"); + itemWoodSail = new ItemStack(itemMachineParts, 1, 0); + GameRegistry.registerItem(itemMachineParts, "machineParts"); + CraftLib.addOreRecipe(itemWoodSail, "CCS", "CCW", "CCS", 'C', RedPowerBase.itemCanvas, 'W', "plankWood", 'S', Items.stick); + GameRegistry.addRecipe( + new ItemStack(itemWoodTurbine), new Object[]{"SAS", "SAS", "SAS", 'S', itemWoodSail, 'A', new ItemStack(RedPowerBase.blockMicro, 1, 5905)} + ); + GameRegistry.addRecipe( + new ItemStack(itemWoodWindmill), new Object[]{" S ", "SAS", " S ", 'S', itemWoodSail, 'A', new ItemStack(RedPowerBase.blockMicro, 1, 5905)} + ); + GameRegistry.registerItem(itemWoodTurbine, "woodTurbine"); + GameRegistry.registerItem(itemWoodWindmill, "woodWindmill"); + } + + private static void setupBlocks() { + blockMachine = new BlockMachine(); + blockMachine.setBlockName("rpmachine"); + GameRegistry.registerBlock(blockMachine, ItemExtended.class, "machine"); + blockMachine.setBlockName(0, "rpdeploy"); + blockMachine.setBlockName(1, "rpbreaker"); + blockMachine.setBlockName(2, "rptranspose"); + blockMachine.setBlockName(3, "rpfilter"); + blockMachine.setBlockName(4, "rpitemdet"); + blockMachine.setBlockName(5, "rpsorter"); + blockMachine.setBlockName(6, "rpbatbox"); + blockMachine.setBlockName(7, "rpmotor"); + blockMachine.setBlockName(8, "rpretriever"); + blockMachine.setBlockName(9, "rpkgen"); + blockMachine.setBlockName(10, "rpregulate"); + blockMachine.setBlockName(11, "rpthermo"); + blockMachine.setBlockName(12, "rpignite"); + blockMachine.setBlockName(13, "rpassemble"); + blockMachine.setBlockName(14, "rpeject"); + blockMachine.setBlockName(15, "rprelay"); + GameRegistry.registerTileEntity(TileWindTurbine.class, "RPWind"); + GameRegistry.registerTileEntity(TilePipe.class, "RPPipe"); + GameRegistry.registerTileEntity(TilePump.class, "RPPump"); + GameRegistry.registerTileEntity(TileTube.class, "RPTube"); + GameRegistry.registerTileEntity(TileRedstoneTube.class, "RPRSTube"); + GameRegistry.registerTileEntity(TileRestrictTube.class, "RPRTube"); + GameRegistry.registerTileEntity(TileMagTube.class, "RPMTube"); + GameRegistry.registerTileEntity(TileAccel.class, "RPAccel"); + GameRegistry.registerTileEntity(TileDeploy.class, "RPDeploy"); + GameRegistry.registerTileEntity(TileBreaker.class, "RPBreaker"); + GameRegistry.registerTileEntity(TileTranspose.class, "RPTranspose"); + GameRegistry.registerTileEntity(TileFilter.class, "RPFilter"); + GameRegistry.registerTileEntity(TileItemDetect.class, "RPItemDet"); + GameRegistry.registerTileEntity(TileSorter.class, "RPSorter"); + GameRegistry.registerTileEntity(TileBatteryBox.class, "RPBatBox"); + GameRegistry.registerTileEntity(TileMotor.class, "RPMotor"); + GameRegistry.registerTileEntity(TileRetriever.class, "RPRetrieve"); + GameRegistry.registerTileEntity(TileRegulator.class, "RPRegulate"); + GameRegistry.registerTileEntity(TileThermopile.class, "RPThermo"); + GameRegistry.registerTileEntity(TileIgniter.class, "RPIgnite"); + GameRegistry.registerTileEntity(TileAssemble.class, "RPAssemble"); + GameRegistry.registerTileEntity(TileEject.class, "RPEject"); + GameRegistry.registerTileEntity(TileRelay.class, "RPRelay"); + blockMachine.addTileEntityMapping(0, TileDeploy::new); + blockMachine.addTileEntityMapping(1, TileBreaker::new); + blockMachine.addTileEntityMapping(2, TileTranspose::new); + blockMachine.addTileEntityMapping(3, TileFilter::new); + blockMachine.addTileEntityMapping(4, TileItemDetect::new); + blockMachine.addTileEntityMapping(5, TileSorter::new); + blockMachine.addTileEntityMapping(6, TileBatteryBox::new); + blockMachine.addTileEntityMapping(7, TileMotor::new); + blockMachine.addTileEntityMapping(8, TileRetriever::new); + blockMachine.addTileEntityMapping(9, TileWindTurbine::new); + blockMachine.addTileEntityMapping(10, TileRegulator::new); + blockMachine.addTileEntityMapping(11, TileThermopile::new); + blockMachine.addTileEntityMapping(12, TileIgniter::new); + blockMachine.addTileEntityMapping(13, TileAssemble::new); + blockMachine.addTileEntityMapping(14, TileEject::new); + blockMachine.addTileEntityMapping(15, TileRelay::new); + blockMachine2 = new BlockMachine(); + blockMachine.setBlockName("rpmachine2"); + GameRegistry.registerBlock(blockMachine2, ItemExtended.class, "machine2"); + blockMachine2.setBlockName(0, "rpsortron"); + blockMachine2.setBlockName(1, "rpmanager"); + GameRegistry.registerTileEntity(TileSortron.class, "RPSortron"); + GameRegistry.registerTileEntity(TileManager.class, "RPManager"); + blockMachine2.addTileEntityMapping(0, TileSortron::new); + blockMachine2.addTileEntityMapping(1, TileManager::new); + blockMachinePanel = new BlockMachinePanel(); + GameRegistry.registerBlock(blockMachinePanel, ItemMachinePanel.class, "machinePanel"); + GameRegistry.registerTileEntity(TileSolarPanel.class, "RPSolar"); + GameRegistry.registerTileEntity(TileGrate.class, "RPGrate"); + GameRegistry.registerTileEntity(TileTransformer.class, "RPXfmr"); + blockMachinePanel.addTileEntityMapping(0, TileSolarPanel::new); + blockMachinePanel.addTileEntityMapping(1, TilePump::new); + blockMachinePanel.addTileEntityMapping(2, TileAccel::new); + blockMachinePanel.addTileEntityMapping(3, TileGrate::new); + blockMachinePanel.addTileEntityMapping(4, TileTransformer::new); + blockMachinePanel.setBlockName(0, "rpsolar"); + blockMachinePanel.setBlockName(1, "rppump"); + blockMachinePanel.setBlockName(2, "rpaccel"); + blockMachinePanel.setBlockName(3, "rpgrate"); + blockMachinePanel.setBlockName(4, "rptransformer"); + GameRegistry.registerTileEntity(TileBlueFurnace.class, "RPBFurnace"); + GameRegistry.registerTileEntity(TileBufferChest.class, "RPBuffer"); + GameRegistry.registerTileEntity(TileBlueAlloyFurnace.class, "RPBAFurnace"); + GameRegistry.registerTileEntity(TileChargingBench.class, "RPCharge"); + RedPowerBase.blockAppliance.setBlockName(1, "rpbfurnace"); + RedPowerBase.blockAppliance.addTileEntityMapping(1, TileBlueFurnace::new); + RedPowerBase.blockAppliance.setBlockName(2, "rpbuffer"); + RedPowerBase.blockAppliance.addTileEntityMapping(2, TileBufferChest::new); + RedPowerBase.blockAppliance.setBlockName(4, "rpbafurnace"); + RedPowerBase.blockAppliance.addTileEntityMapping(4, TileBlueAlloyFurnace::new); + RedPowerBase.blockAppliance.setBlockName(5, "rpcharge"); + RedPowerBase.blockAppliance.addTileEntityMapping(5, TileChargingBench::new); + blockFrame = new BlockFrame(); + GameRegistry.registerBlock(blockFrame, ItemExtended.class, "frame"); + blockFrame.setBlockName("rpframe"); + blockFrame.setBlockName(0, "rpframe"); + blockFrame.setBlockName(2, "rptframe"); + blockFrame.setBlockName(3, "rprtframe"); + GameRegistry.registerTileEntity(TileFrame.class, "RPFrame"); + GameRegistry.registerTileEntity(TileFrameMoving.class, "RPMFrame"); + GameRegistry.registerTileEntity(TileFrameTube.class, "RPTFrame"); + GameRegistry.registerTileEntity(TileFrameRedstoneTube.class, "RPRTFrame"); + blockFrame.addTileEntityMapping(0, TileFrame::new); + blockFrame.addTileEntityMapping(1, TileFrameMoving::new); + blockFrame.addTileEntityMapping(2, TileFrameTube::new); + blockFrame.addTileEntityMapping(3, TileFrameRedstoneTube::new); + MicroPlacementTube imp = new MicroPlacementTube(); + RedPowerBase.blockMicro.registerPlacement(7, imp); + RedPowerBase.blockMicro.registerPlacement(8, imp); + RedPowerBase.blockMicro.registerPlacement(9, imp); + RedPowerBase.blockMicro.registerPlacement(10, imp); + RedPowerBase.blockMicro.registerPlacement(11, imp); + RedPowerBase.blockMicro.addTileEntityMapping(7, TilePipe::new); + RedPowerBase.blockMicro.addTileEntityMapping(8, TileTube::new); + RedPowerBase.blockMicro.addTileEntityMapping(9, TileRedstoneTube::new); + RedPowerBase.blockMicro.addTileEntityMapping(10, TileRestrictTube::new); + RedPowerBase.blockMicro.addTileEntityMapping(11, TileMagTube::new); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 0), + new Object[]{"SCS", "SPS", "SRS", 'S', Blocks.cobblestone, 'C', Blocks.chest, 'R', Items.redstone, 'P', Blocks.piston} + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 1), + new Object[]{"SAS", "SPS", "SRS", 'S', Blocks.cobblestone, 'A', Items.iron_pickaxe, 'R', Items.redstone, 'P', Blocks.piston} + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 2), "SSS", "WPW", "SRS", 'S', Blocks.cobblestone, 'R', Items.redstone, 'P', Blocks.piston, 'W', "plankWood" + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 3), + new Object[]{"SSS", "GPG", "SRS", 'S', Blocks.cobblestone, 'R', RedPowerBase.itemWaferRed, 'P', Blocks.piston, 'G', Items.gold_ingot} + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 4), + "BTB", + "RPR", + "WTW", + 'B', + "ingotBrass", + 'T', + new ItemStack(RedPowerBase.blockMicro, 1, 2048), + 'R', + RedPowerBase.itemWaferRed, + 'W', + "plankWood", + 'P', + Blocks.wooden_pressure_plate + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 5), + new Object[]{ + "III", "RFR", "IBI", 'B', RedPowerBase.itemIngotBlue, 'R', RedPowerBase.itemWaferRed, 'F', new ItemStack(blockMachine, 1, 3), 'I', Items.iron_ingot + } + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 8), + new Object[]{ + "BLB", + "EFE", + "INI", + 'N', + RedPowerBase.itemIngotBlue, + 'B', + RedPowerBase.itemIngotBrass, + 'E', + Items.ender_pearl, + 'L', + Items.leather, + 'F', + new ItemStack(blockMachine, 1, 3), + 'I', + Items.iron_ingot + } + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 9), + new Object[]{ + "IBI", "IMI", "IUI", 'I', Items.iron_ingot, 'B', RedPowerBase.itemIngotBrass, 'M', RedPowerBase.itemMotor, 'U', RedPowerBase.itemIngotBlue + } + ); + CraftLib.addOreRecipe(new ItemStack(RedPowerBase.blockAppliance, 1, 2), "BWB", "W W", "BWB", 'B', Blocks.iron_bars, 'W', "plankWood"); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 10), + "BCB", + "RDR", + "WCW", + 'R', + RedPowerBase.itemWaferRed, + 'B', + "ingotBrass", + 'D', + new ItemStack(blockMachine, 1, 4), + 'W', + "plankWood", + 'C', + new ItemStack(RedPowerBase.blockAppliance, 1, 2) + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 11), + "CIC", + "WBW", + "CIC", + 'I', + Items.iron_ingot, + 'B', + RedPowerBase.itemIngotBlue, + 'W', + RedPowerBase.itemWaferBlue, + 'C', + "ingotCopper" + ); + CraftLib.addOreRecipe(new ItemStack(RedPowerBase.blockMicro, 8, 2048), "BGB", 'G', Blocks.glass, 'B', "ingotBrass"); + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 2304), new Object[]{Items.redstone, new ItemStack(RedPowerBase.blockMicro, 1, 2048)} + ); + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 2560), new Object[]{Items.iron_ingot, new ItemStack(RedPowerBase.blockMicro, 1, 2048)} + ); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 8, 2816), + new Object[]{"CCC", "OGO", "CCC", 'G', Blocks.glass, 'O', Blocks.obsidian, 'C', RedPowerBase.itemFineCopper} + ); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockAppliance, 1, 1), + new Object[]{"CCC", "C C", "IBI", 'C', Blocks.clay, 'B', RedPowerBase.itemIngotBlue, 'I', Items.iron_ingot} + ); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockAppliance, 1, 4), + new Object[]{"CCC", "C C", "IBI", 'C', Blocks.brick_block, 'B', RedPowerBase.itemIngotBlue, 'I', Items.iron_ingot} + ); + GameRegistry.addRecipe( + new ItemStack(blockMachinePanel, 1, 0), new Object[]{"WWW", "WBW", "WWW", 'W', RedPowerBase.itemWaferBlue, 'B', RedPowerBase.itemIngotBlue} + ); + GameRegistry.addRecipe(new ItemStack(blockMachinePanel, 1, 2), new Object[]{"BOB", "O O", "BOB", 'O', Blocks.obsidian, 'B', RedPowerBase.itemIngotBlue}); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 6), + "BWB", + "BIB", + "IAI", + 'I', + Items.iron_ingot, + 'W', + "plankWood", + 'A', + RedPowerBase.itemIngotBlue, + 'B', + itemBatteryEmpty + ); + GameRegistry.addRecipe( + new ItemStack(blockMachinePanel, 1, 4), + new Object[]{"III", "CIC", "BIB", 'I', Items.iron_ingot, 'C', RedPowerBase.itemCopperCoil, 'B', RedPowerBase.itemIngotBlue} + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine2, 1, 0), + new Object[]{ + "IDI", + "RSR", + "IWI", + 'D', + Items.diamond, + 'I', + Items.iron_ingot, + 'R', + RedPowerBase.itemWaferRed, + 'W', + new ItemStack(RedPowerBase.blockMicro, 1, 3072), + 'S', + new ItemStack(blockMachine, 1, 5) + } + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine2, 1, 1), + "IMI", + "RSR", + "WBW", + 'I', + Items.iron_ingot, + 'R', + RedPowerBase.itemWaferRed, + 'S', + new ItemStack(blockMachine, 1, 5), + 'M', + new ItemStack(blockMachine, 1, 10), + 'W', + "plankWood", + 'B', + RedPowerBase.itemIngotBlue + ); + CraftLib.addOreRecipe( + new ItemStack(RedPowerBase.blockAppliance, 1, 5), + "OQO", + "BCB", + "WUW", + 'O', + Blocks.obsidian, + 'W', + "plankWood", + 'U', + RedPowerBase.itemIngotBlue, + 'C', + Blocks.chest, + 'Q', + RedPowerBase.itemCopperCoil, + 'B', + itemBatteryEmpty + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 12), + new Object[]{ + "NFN", + "SDS", + "SRS", + 'N', + Blocks.netherrack, + 'F', + Items.flint_and_steel, + 'D', + new ItemStack(blockMachine, 1, 0), + 'S', + Blocks.cobblestone, + 'R', + Items.redstone + } + ); + GameRegistry.addRecipe( + new ItemStack(blockMachine, 1, 13), + new Object[]{ + "BIB", + "CDC", + "IRI", + 'I', + Items.iron_ingot, + 'D', + new ItemStack(blockMachine, 1, 0), + 'C', + new ItemStack(RedPowerBase.blockMicro, 1, 768), + 'R', + RedPowerBase.itemWaferRed, + 'B', + RedPowerBase.itemIngotBrass + } + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 14), + "WBW", + "WTW", + "SRS", + 'R', + Items.redstone, + 'T', + new ItemStack(blockMachine, 1, 2), + 'W', + "plankWood", + 'B', + new ItemStack(RedPowerBase.blockAppliance, 1, 2), + 'S', + Blocks.cobblestone + ); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 15), + "WBW", + "WTW", + "SRS", + 'R', + RedPowerBase.itemWaferRed, + 'T', + new ItemStack(blockMachine, 1, 2), + 'W', + "plankWood", + 'B', + new ItemStack(RedPowerBase.blockAppliance, 1, 2), + 'S', + Blocks.cobblestone + ); + GameRegistry.addRecipe( + RedPowerBase.itemCopperCoil, new Object[]{"FBF", "BIB", "FBF", 'F', RedPowerBase.itemFineCopper, 'B', Blocks.iron_bars, 'I', Items.iron_ingot} + ); + GameRegistry.addRecipe( + RedPowerBase.itemMotor, new Object[]{"ICI", "ICI", "IBI", 'C', RedPowerBase.itemCopperCoil, 'B', RedPowerBase.itemIngotBlue, 'I', Items.iron_ingot} + ); + CraftLib.addOreRecipe(new ItemStack(blockFrame, 1), "SSS", "SBS", "SSS", 'S', Items.stick, 'B', "ingotBrass"); + GameRegistry.addShapelessRecipe( + new ItemStack(blockFrame, 1, 2), new Object[]{new ItemStack(blockFrame, 1), new ItemStack(RedPowerBase.blockMicro, 1, 2048)} + ); + GameRegistry.addShapelessRecipe( + new ItemStack(blockFrame, 1, 3), new Object[]{new ItemStack(blockFrame, 1), new ItemStack(RedPowerBase.blockMicro, 1, 2304)} + ); + GameRegistry.addShapelessRecipe(new ItemStack(blockFrame, 1, 3), new Object[]{new ItemStack(blockFrame, 1, 2), Items.redstone}); + CraftLib.addOreRecipe( + new ItemStack(blockMachine, 1, 7), + "III", + "BMB", + "IAI", + 'I', + Items.iron_ingot, + 'A', + RedPowerBase.itemIngotBlue, + 'B', + "ingotBrass", + 'M', + RedPowerBase.itemMotor + ); + CraftLib.addOreRecipe(new ItemStack(RedPowerBase.blockMicro, 16, 1792), "B B", "BGB", "B B", 'G', Blocks.glass, 'B', "ingotBrass"); + GameRegistry.addRecipe( + new ItemStack(blockMachinePanel, 1, 3), new Object[]{"III", "I I", "IPI", 'P', new ItemStack(RedPowerBase.blockMicro, 1, 1792), 'I', Blocks.iron_bars} + ); + GameRegistry.addRecipe( + new ItemStack(blockMachinePanel, 1, 1), + new Object[]{ + "III", + "PMP", + "IAI", + 'I', + Items.iron_ingot, + 'A', + RedPowerBase.itemIngotBlue, + 'P', + new ItemStack(RedPowerBase.blockMicro, 1, 1792), + 'M', + RedPowerBase.itemMotor + } + ); + } + + public static void initAchievements() { + AchieveLib.registerAchievement("rpTranspose", -2, 2, new ItemStack(blockMachine, 1, 2), AchievementList.acquireIron); + AchieveLib.registerAchievement("rpBreaker", -2, 4, new ItemStack(blockMachine, 1, 1), AchievementList.acquireIron); + AchieveLib.registerAchievement("rpDeploy", -2, 6, new ItemStack(blockMachine, 1, 0), AchievementList.acquireIron); + AchieveLib.addCraftingAchievement(new ItemStack(blockMachine, 1, 2), "rpTranspose"); + AchieveLib.addCraftingAchievement(new ItemStack(blockMachine, 1, 1), "rpBreaker"); + AchieveLib.addCraftingAchievement(new ItemStack(blockMachine, 1, 0), "rpDeploy"); + AchieveLib.registerAchievement("rpFrames", 4, 4, new ItemStack(blockMachine, 1, 7), "rpIngotBlue"); + AchieveLib.registerAchievement("rpPump", 4, 5, new ItemStack(blockMachinePanel, 1, 1), "rpIngotBlue"); + AchieveLib.addCraftingAchievement(new ItemStack(blockMachine, 1, 7), "rpFrames"); + AchieveLib.addCraftingAchievement(new ItemStack(blockMachinePanel, 1, 1), "rpPump"); + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int X, int Y, int Z) { + switch(ID) { + case 1: + return new GuiDeploy(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileDeploy.class)); + case 2: + return new GuiFilter(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileFilter.class)); + case 3: + return new GuiBlueFurnace(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileBlueFurnace.class)); + case 4: + return new GuiBufferChest(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileBufferChest.class)); + case 5: + return new GuiSorter(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileSorter.class)); + case 6: + return new GuiItemDetect(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileItemDetect.class)); + case 7: + return new GuiRetriever(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileRetriever.class)); + case 8: + return new GuiBatteryBox(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileBatteryBox.class)); + case 9: + return new GuiRegulator(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileRegulator.class)); + case 10: + return new GuiBlueAlloyFurnace(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileBlueAlloyFurnace.class)); + case 11: + return new GuiAssemble(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileAssemble.class)); + case 12: + return new GuiEject(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileEjectBase.class)); + case 13: + return new GuiEject(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileRelay.class)); + case 14: + return new GuiChargingBench(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileChargingBench.class)); + case 15: + return new GuiWindTurbine(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileWindTurbine.class)); + case 16: + return new GuiManager(player.inventory, CoreLib.getGuiTileEntity(world, X, Y, Z, TileManager.class)); + default: + return null; + } + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int X, int Y, int Z) { + switch(ID) { + case 1: + return new ContainerDeploy(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileDeploy.class)); + case 2: + return new ContainerFilter(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileFilter.class)); + case 3: + return new ContainerBlueFurnace(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileBlueFurnace.class)); + case 4: + return new ContainerBufferChest(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileBufferChest.class)); + case 5: + return new ContainerSorter(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileSorter.class)); + case 6: + return new ContainerItemDetect(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileItemDetect.class)); + case 7: + return new ContainerRetriever(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileRetriever.class)); + case 8: + return new ContainerBatteryBox(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileBatteryBox.class)); + case 9: + return new ContainerRegulator(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileRegulator.class)); + case 10: + return new ContainerBlueAlloyFurnace(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileBlueAlloyFurnace.class)); + case 11: + return new ContainerAssemble(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileAssemble.class)); + case 12: + return new ContainerEject(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileEjectBase.class)); + case 13: + return new ContainerEject(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileRelay.class)); + case 14: + return new ContainerChargingBench(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileChargingBench.class)); + case 15: + return new ContainerWindTurbine(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileWindTurbine.class)); + case 16: + return new ContainerManager(player.inventory, CoreLib.getTileEntity(world, X, Y, Z, TileManager.class)); + default: + return null; + } + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setRenderer(blockMachine, 0, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 1, RenderBreaker::new); + RenderLib.setRenderer(blockMachine, 2, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 3, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 4, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 5, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 6, RenderBatteryBox::new); + RenderLib.setRenderer(blockMachine, 7, RenderMotor::new); + RenderLib.setRenderer(blockMachine, 8, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 9, RenderWindTurbine::new); + RenderLib.setRenderer(blockMachine, 10, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 11, RenderThermopile::new); + RenderLib.setRenderer(blockMachine, 12, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 13, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 14, RenderMachine::new); + RenderLib.setRenderer(blockMachine, 15, RenderMachine::new); + RenderLib.setRenderer(blockMachine2, 0, RenderMachine::new); + RenderLib.setRenderer(blockMachine2, 1, RenderMachine::new); + RenderLib.setRenderer(RedPowerBase.blockAppliance, 1, RenderBlueFurnace::new); + RenderLib.setRenderer(RedPowerBase.blockAppliance, 2, RenderBufferChest::new); + RenderLib.setRenderer(RedPowerBase.blockAppliance, 4, RenderBlueAlloyFurnace::new); + RenderLib.setRenderer(RedPowerBase.blockAppliance, 5, RenderChargingBench::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 7, RenderPipe::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 8, RenderTube::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 9, RenderRedstoneTube::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 10, RenderTube::new); + RenderLib.setHighRenderer(RedPowerBase.blockMicro, 11, RenderTube::new); + RenderLib.setRenderer(blockMachinePanel, 0, RenderSolarPanel::new); + RenderLib.setRenderer(blockMachinePanel, 1, RenderPump::new); + RenderLib.setRenderer(blockMachinePanel, 2, RenderAccel::new); + RenderLib.setRenderer(blockMachinePanel, 3, RenderGrate::new); + RenderLib.setRenderer(blockMachinePanel, 4, RenderTransformer::new); + RenderLib.setRenderer(blockFrame, 0, RenderFrame::new); + RenderLib.setRenderer(blockFrame, 1, RenderFrameMoving::new); + RenderLib.setRenderer(blockFrame, 2, RenderFrameTube::new); + RenderLib.setRenderer(blockFrame, 3, RenderFrameRedstoneTube::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileBreaker.class, new RenderBreaker(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TileFrame.class, new RenderFrame(blockFrame)); + ClientRegistry.bindTileEntitySpecialRenderer(TileFrameTube.class, new RenderFrameTube(blockFrame)); + ClientRegistry.bindTileEntitySpecialRenderer(TileFrameRedstoneTube.class, new RenderFrameRedstoneTube(blockFrame)); + ClientRegistry.bindTileEntitySpecialRenderer(TileFrameMoving.class, new RenderFrameMoving(blockFrame)); + ClientRegistry.bindTileEntitySpecialRenderer(TileMachine.class, new RenderMachine(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TileTube.class, new RenderTube(RedPowerBase.blockMicro)); + ClientRegistry.bindTileEntitySpecialRenderer(TileRedstoneTube.class, new RenderRedstoneTube(RedPowerBase.blockMicro)); + ClientRegistry.bindTileEntitySpecialRenderer(TileMotor.class, new RenderMotor(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TileAccel.class, new RenderAccel(blockMachinePanel)); + ClientRegistry.bindTileEntitySpecialRenderer(TilePump.class, new RenderPump(blockMachinePanel)); + ClientRegistry.bindTileEntitySpecialRenderer(TileTransformer.class, new RenderTransformer(blockMachinePanel)); + ClientRegistry.bindTileEntitySpecialRenderer(TileThermopile.class, new RenderThermopile(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TilePipe.class, new RenderPipe(RedPowerBase.blockMicro)); + ClientRegistry.bindTileEntitySpecialRenderer(TileWindTurbine.class, new RenderWindTurbine(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TileGrate.class, new RenderGrate(blockMachinePanel)); + ClientRegistry.bindTileEntitySpecialRenderer(TileSolarPanel.class, new RenderSolarPanel(blockMachinePanel)); + ClientRegistry.bindTileEntitySpecialRenderer(TileBatteryBox.class, new RenderBatteryBox(blockMachine)); + ClientRegistry.bindTileEntitySpecialRenderer(TileBlueFurnace.class, new RenderBlueFurnace(RedPowerBase.blockAppliance)); + ClientRegistry.bindTileEntitySpecialRenderer(TileBlueAlloyFurnace.class, new RenderBlueAlloyFurnace(RedPowerBase.blockAppliance)); + ClientRegistry.bindTileEntitySpecialRenderer(TileChargingBench.class, new RenderChargingBench(RedPowerBase.blockAppliance)); + ClientRegistry.bindTileEntitySpecialRenderer(TileBufferChest.class, new RenderBufferChest(RedPowerBase.blockAppliance)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + frameCrossed = map.registerIcon("rpmachine:frameCrossed"); + frameCovered = map.registerIcon("rpmachine:frameCovered"); + framePaneled = map.registerIcon("rpmachine:framePaneled"); + crate = map.registerIcon("rpmachine:crate"); + electronicsBottom = map.registerIcon("rpmachine:electronicsBottom"); + batteryTop = map.registerIcon("rpmachine:batteryTop"); + + for(int i = 0; i < 9; ++i) { + batterySide[i] = map.registerIcon("rpmachine:batterySide/" + i); + } + + retrieverFront = map.registerIcon("rpmachine:retrieverFront"); + retrieverBack = map.registerIcon("rpmachine:retrieverBack"); + retrieverSide = map.registerIcon("rpmachine:retrieverSide"); + retrieverSideOn = map.registerIcon("rpmachine:retrieverSideOn"); + retrieverSideCharged = map.registerIcon("rpmachine:retrieverSideCharged"); + retrieverSideChargedOn = map.registerIcon("rpmachine:retrieverSideChargedOn"); + transposerFront = map.registerIcon("rpmachine:transposerFront"); + transposerSide = map.registerIcon("rpmachine:transposerSide"); + transposerSideOn = map.registerIcon("rpmachine:transposerSideOn"); + filterSide = map.registerIcon("rpmachine:filterSide"); + filterSideOn = map.registerIcon("rpmachine:filterSideOn"); + breakerFront = map.registerIcon("rpmachine:breakerFront"); + breakerFrontOn = map.registerIcon("rpmachine:breakerFrontOn"); + breakerBack = map.registerIcon("rpmachine:breakerBack"); + breakerSide = map.registerIcon("rpmachine:breakerSide"); + breakerSideOn = map.registerIcon("rpmachine:breakerSideOn"); + deployerBack = map.registerIcon("rpmachine:deployerBack"); + deployerFront = map.registerIcon("rpmachine:deployerFront"); + deployerFrontOn = map.registerIcon("rpmachine:deployerFrontOn"); + deployerSide = map.registerIcon("rpmachine:deployerSide"); + deployerSideAlt = map.registerIcon("rpmachine:deployerSideAlt"); + motorBottom = map.registerIcon("rpmachine:motorBottom"); + motorSide = map.registerIcon("rpmachine:motorSide"); + motorFront = map.registerIcon("rpmachine:motorFront"); + motorFrontActive = map.registerIcon("rpmachine:motorFrontActive"); + motorFrontCharged = map.registerIcon("rpmachine:motorFrontCharged"); + motorTop = map.registerIcon("rpmachine:motorTop"); + motorTopActive = map.registerIcon("rpmachine:motorTopActive"); + turbineFront = map.registerIcon("rpmachine:turbineFront"); + turbineSide = map.registerIcon("rpmachine:turbineSide"); + turbineSideAlt = map.registerIcon("rpmachine:turbineSideAlt"); + thermopileFront = map.registerIcon("rpmachine:thermopileFront"); + thermopileSide = map.registerIcon("rpmachine:thermopileSide"); + thermopileTop = map.registerIcon("rpmachine:thermopileTop"); + btFurnaceTop = map.registerIcon("rpmachine:btFurnaceTop"); + btFurnaceSide = map.registerIcon("rpmachine:btFurnaceSide"); + btFurnaceFront = map.registerIcon("rpmachine:btFurnaceFront"); + btFurnaceFrontOn = map.registerIcon("rpmachine:btFurnaceFrontOn"); + btAlloyFurnaceTop = map.registerIcon("rpmachine:btAlloyFurnaceTop"); + btAlloyFurnaceSide = map.registerIcon("rpmachine:btAlloyFurnaceSide"); + btAlloyFurnaceFront = map.registerIcon("rpmachine:btAlloyFurnaceFront"); + btAlloyFurnaceFrontOn = map.registerIcon("rpmachine:btAlloyFurnaceFrontOn"); + btChargerTop = map.registerIcon("rpmachine:btChargerTop"); + btChargerTopOn = map.registerIcon("rpmachine:btChargerTopOn"); + btChargerBottom = map.registerIcon("rpmachine:btChargerBottom"); + btChargerSide = map.registerIcon("rpmachine:btChargerSide"); + btChargerSideOn = map.registerIcon("rpmachine:btChargerSideOn"); + + for(int i = 0; i < 5; ++i) { + btChargerFront[i] = map.registerIcon("rpmachine:btChargerFront/" + i); + btChargerFrontPowered[i] = map.registerIcon("rpmachine:btChargerFrontPowered/" + i); + btChargerFrontActive[i] = map.registerIcon("rpmachine:btChargerFrontActive/" + i); + } + + bufferFront = map.registerIcon("rpmachine:bufferFront"); + bufferBack = map.registerIcon("rpmachine:bufferBack"); + bufferSide = map.registerIcon("rpmachine:bufferSide"); + igniterFront = map.registerIcon("rpmachine:igniterFront"); + igniterFrontOn = map.registerIcon("rpmachine:igniterFrontOn"); + igniterSide = map.registerIcon("rpmachine:igniterSide"); + igniterSideAlt = map.registerIcon("rpmachine:igniterSideAlt"); + sorterFront = map.registerIcon("rpmachine:sorterFront"); + sorterBack = map.registerIcon("rpmachine:sorterBack"); + sorterBackCharged = map.registerIcon("rpmachine:sorterBackCharged"); + sorterBackChargedOn = map.registerIcon("rpmachine:sorterBackChargedOn"); + sorterSide = map.registerIcon("rpmachine:sorterSide"); + sorterSideOn = map.registerIcon("rpmachine:sorterSideOn"); + sorterSideCharged = map.registerIcon("rpmachine:sorterSideCharged"); + sorterSideChargedOn = map.registerIcon("rpmachine:sorterSideChargedOn"); + detectorSideAlt = map.registerIcon("rpmachine:detectorSideAlt"); + detectorSideAltOn = map.registerIcon("rpmachine:detectorSideAltOn"); + detectorSide = map.registerIcon("rpmachine:detectorSide"); + detectorSideOn = map.registerIcon("rpmachine:detectorSideOn"); + detectorSideCharged = map.registerIcon("rpmachine:detectorSideCharged"); + detectorSideChargedOn = map.registerIcon("rpmachine:detectorSideChargedOn"); + regulatorFront = map.registerIcon("rpmachine:regulatorFront"); + regulatorBack = map.registerIcon("rpmachine:regulatorBack"); + regulatorSideAlt = map.registerIcon("rpmachine:regulatorSideAlt"); + regulatorSideAltCharged = map.registerIcon("rpmachine:regulatorSideAltCharged"); + regulatorSide = map.registerIcon("rpmachine:regulatorSide"); + regulatorSideOn = map.registerIcon("rpmachine:regulatorSideOn"); + regulatorSideCharged = map.registerIcon("rpmachine:regulatorSideCharged"); + regulatorSideChargedOn = map.registerIcon("rpmachine:regulatorSideChargedOn"); + sortronFront = map.registerIcon("rpmachine:sortronFront"); + sortronBack = map.registerIcon("rpmachine:sortronBack"); + sortronSideAlt = map.registerIcon("rpmachine:sortronSideAlt"); + sortronSideAltCharged = map.registerIcon("rpmachine:sortronSideAltCharged"); + sortronSide = map.registerIcon("rpmachine:sortronSide"); + sortronSideOn = map.registerIcon("rpmachine:sortronSideOn"); + sortronSideCharged = map.registerIcon("rpmachine:sortronSideCharged"); + sortronSideChargedOn = map.registerIcon("rpmachine:sortronSideChargedOn"); + managerFront = map.registerIcon("rpmachine:managerFront"); + managerBack = map.registerIcon("rpmachine:managerBack"); + + for(int i = 0; i < 4; ++i) { + managerSide[i] = map.registerIcon("rpmachine:managerSide/" + i); + } + + for(int i = 0; i < 4; ++i) { + managerSideCharged[i] = map.registerIcon("rpmachine:managerSideCharged/" + i); + } + + assemblerFront = map.registerIcon("rpmachine:assemblerFront"); + assemblerFrontOn = map.registerIcon("rpmachine:assemblerFrontOn"); + assemblerBack = map.registerIcon("rpmachine:assemblerBack"); + assemblerBackOn = map.registerIcon("rpmachine:assemblerBackOn"); + assemblerSide = map.registerIcon("rpmachine:assemblerSide"); + assemblerSideAlt = map.registerIcon("rpmachine:assemblerSideAlt"); + ejectorSide = map.registerIcon("rpmachine:ejectorSide"); + ejectorSideOn = map.registerIcon("rpmachine:ejectorSideOn"); + relaySide = map.registerIcon("rpmachine:relaySide"); + relaySideOn = map.registerIcon("rpmachine:relaySideOn"); + relaySideAlt = map.registerIcon("rpmachine:relaySideAlt"); + pipeSide = map.registerIcon("rpmachine:pipeSide"); + pipeFace = map.registerIcon("rpmachine:pipeFace"); + pipeFlanges = map.registerIcon("rpmachine:pipeFlanges"); + baseTubeSide = map.registerIcon("rpmachine:tubeSide"); + baseTubeFace = map.registerIcon("rpmachine:tubeFace"); + baseTubeSideColor = map.registerIcon("rpmachine:tubeSideColor"); + baseTubeFaceColor = map.registerIcon("rpmachine:tubeFaceColor"); + + for(int i = 0; i < 4; ++i) { + redstoneTubeSide[i] = map.registerIcon("rpmachine:redstoneTubeSide/" + i); + redstoneTubeFace[i] = map.registerIcon("rpmachine:redstoneTubeFace/" + i); + } + + restrictTubeSide = map.registerIcon("rpmachine:restrictionTubeSide"); + restrictTubeFace = map.registerIcon("rpmachine:restrictionTubeFace"); + restrictTubeSideColor = map.registerIcon("rpmachine:restrictionTubeSideColor"); + restrictTubeFaceColor = map.registerIcon("rpmachine:restrictionTubeFaceColor"); + magTubeSide = map.registerIcon("rpmachine:magneticTubeSide"); + magTubeRing = map.registerIcon("rpmachine:magneticTubeRing"); + magTubeFace = map.registerIcon("rpmachine:magneticTubeFace"); + magTubeSideNR = map.registerIcon("rpmachine:magneticTubeSideNR"); + magTubeFaceNR = map.registerIcon("rpmachine:magneticTubeFaceNR"); + tubeItemOverlay = map.registerIcon("rpmachine:tubeItemOverlay"); + solarPanelTop = map.registerIcon("rpmachine:solarPanelTop"); + solarPanelSide = map.registerIcon("rpmachine:solarPanelSide"); + grateSide = map.registerIcon("rpmachine:grateSide"); + grateMossySide = map.registerIcon("rpmachine:grateMossySide"); + grateBack = map.registerIcon("rpmachine:grateBack"); + grateEmptyBack = map.registerIcon("rpmachine:grateEmptyBack"); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerNEIPlugin.java b/src/main/java/com/eloraam/redpower/RedPowerNEIPlugin.java new file mode 100644 index 0000000..58e5e02 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerNEIPlugin.java @@ -0,0 +1,195 @@ +package com.eloraam.redpower; + +import codechicken.nei.ItemStackSet; +import codechicken.nei.SubsetWidget.SubsetTag; +import codechicken.nei.api.API; +import codechicken.nei.guihook.GuiContainerManager; +import codechicken.nei.recipe.DefaultOverlayHandler; +import com.eloraam.redpower.base.GuiAdvBench; +import com.eloraam.redpower.base.GuiAlloyFurnace; +import com.eloraam.redpower.base.ItemHandsaw; +import com.eloraam.redpower.nei.AlloyFurnaceOverlayHandler; +import com.eloraam.redpower.nei.AlloyFurnaceRecipeHandler; +import com.eloraam.redpower.nei.MicroRecipeHandler; +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.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +@Mod( + modid = "RedPowerNEIPlugin", + name = "RedPower NEI Plugin", + version = "1.4.3.1", + dependencies = "after:NotEnoughItems;after:RedPowerBase;after:RedPowerCompat;after:RedPowerControl;after:RedPowerCore;after:RedPowerLighting;after:RedPowerLogic;after:RedPowerMachine;after:RedPowerWiring;after:RedPowerWorld" +) +public class RedPowerNEIPlugin { + @Instance("RedPowerNEIPlugin") + public static RedPowerNEIPlugin instance; + public static boolean wiring; + public static boolean logic; + public static boolean control; + public static boolean lighting; + public static boolean world; + public static boolean machine; + public static boolean base; + public static boolean compat; + static Block micro; + private List validMicroTypes = new ArrayList(); + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + } + + @EventHandler + public void load(FMLInitializationEvent event) { + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isServer()) { + FMLLog.severe("[RedPowerNEIPlugin] Server env detected, disabling...", new Object[0]); + } else { + if (Loader.isModLoaded("NotEnoughItems")) { + wiring = Loader.isModLoaded("RedPowerWiring"); + logic = Loader.isModLoaded("RedPowerLogic"); + control = Loader.isModLoaded("RedPowerControl"); + lighting = Loader.isModLoaded("RedPowerLighting"); + world = Loader.isModLoaded("RedPowerWorld"); + machine = Loader.isModLoaded("RedPowerMachine"); + base = Loader.isModLoaded("RedPowerBase"); + compat = Loader.isModLoaded("RedPowerCompat"); + if (base) { + this.loadCoverSubSets(); + this.loadSaws(); + API.registerGuiOverlay(GuiAlloyFurnace.class, "alloy"); + API.registerGuiOverlay(GuiAdvBench.class, "crafting", 23, 12); + API.registerGuiOverlayHandler(GuiAlloyFurnace.class, new AlloyFurnaceOverlayHandler(), "alloy"); + API.registerGuiOverlayHandler(GuiAdvBench.class, new DefaultOverlayHandler(23, 12), "crafting"); + API.hideItem(new ItemStack(RedPowerBase.blockMultiblock)); + API.registerRecipeHandler(new AlloyFurnaceRecipeHandler()); + API.registerUsageHandler(new AlloyFurnaceRecipeHandler()); + API.registerRecipeHandler(new MicroRecipeHandler()); + API.registerUsageHandler(new MicroRecipeHandler()); + } + } else { + FMLCommonHandler.instance().getFMLLogger().warn("[RedPowerNEIPlugin] No NEI detected, disabling..."); + } + + } + } + + private void loadSaws() { + List saws = new ArrayList(); + + for(Object item : Item.itemRegistry) { + if (item instanceof ItemHandsaw) { + saws.add((ItemHandsaw)item); + } + } + + MicroRecipeHandler.saws = new ItemHandsaw[saws.size()]; + + for(int i = 0; i < saws.size(); ++i) { + MicroRecipeHandler.saws[i] = (ItemHandsaw)saws.get(i); + } + + ItemStackSet set = new ItemStackSet().with(MicroRecipeHandler.saws); + API.addSubset(new SubsetTag("RedPower.Tools.Saws", set)); + API.addSubset(new SubsetTag("Items.Tools.Saws", set)); + } + + private void loadCoverSubSets() { + if (base) { + micro = RedPowerBase.blockMicro; + int startRange = -1; + + for(int i = 0; i < 256; ++i) { + ItemStack stack = new ItemStack(micro, 1, i); + String name = GuiContainerManager.itemDisplayNameShort(stack); + if (!name.endsWith("Unnamed") && !name.endsWith("null")) { + if (startRange == -1) { + startRange = i; + } + } else if (startRange != -1) { + this.validMicroTypes.add(new RedPowerNEIPlugin.ItemRange(micro, startRange, i - 1)); + startRange = -1; + } + } + + this.registerMicroSet("MicroBlocks.Cover", 0); + this.registerMicroSet("MicroBlocks.Panel", 16); + this.registerMicroSet("MicroBlocks.Slab", 17); + this.registerMicroSet("MicroBlocks.Hollow Cover", 24); + this.registerMicroSet("MicroBlocks.Hollow Panel", 25); + this.registerMicroSet("MicroBlocks.Hollow Slab", 26); + this.registerMicroSet("MicroBlocks.Cover Corner", 18); + this.registerMicroSet("MicroBlocks.Panel Corner", 19); + this.registerMicroSet("MicroBlocks.Slab Corner", 20); + this.registerMicroSet("MicroBlocks.Cover Strip", 21); + this.registerMicroSet("MicroBlocks.Panel Strip", 22); + this.registerMicroSet("MicroBlocks.Slab Strip", 23); + this.registerMicroSet("MicroBlocks.Triple Cover", 27); + this.registerMicroSet("MicroBlocks.Cover Slab", 28); + this.registerMicroSet("MicroBlocks.Triple Panel", 29); + this.registerMicroSet("MicroBlocks.Anticover", 30); + this.registerMicroSet("MicroBlocks.Hollow Triple Cover", 31); + this.registerMicroSet("MicroBlocks.Hollow Cover Slab", 32); + this.registerMicroSet("MicroBlocks.Hollow Triple Panel", 33); + this.registerMicroSet("MicroBlocks.Hollow Anticover", 34); + this.registerMicroSet("MicroBlocks.Triple Cover Corner", 35); + this.registerMicroSet("MicroBlocks.Cover Slab Corner", 36); + this.registerMicroSet("MicroBlocks.Triple Panel Corner", 37); + this.registerMicroSet("MicroBlocks.Anticover Corner", 38); + this.registerMicroSet("MicroBlocks.Triple Cover Strip", 39); + this.registerMicroSet("MicroBlocks.Cover Slab Strip", 40); + this.registerMicroSet("MicroBlocks.Triple Panel Strip", 41); + this.registerMicroSet("MicroBlocks.Anticover Strip", 42); + this.registerMicroSet("MicroBlocks.Post", 43); + this.registerMicroSet("MicroBlocks.Pillar", 44); + this.registerMicroSet("MicroBlocks.Column", 45); + if (wiring) { + this.registerMicroSet("Wiring.Jacketed Wire", 64); + this.registerMicroSet("Wiring.Jacketed Cable", 65); + this.registerMicroSet("Bluetricity.Jacketed Bluewire", 66); + } + } + + } + + private void registerMicroSet(String RPName, int microID) { + ItemStackSet set = new ItemStackSet(); + + for(RedPowerNEIPlugin.ItemRange type : this.validMicroTypes) { + set.with( + (ItemStack[])IntStream.rangeClosed(type.start, type.end) + .mapToObj(i -> new ItemStack(type.bl, 1, i + microID * 256)) + .toArray(x$0 -> new ItemStack[x$0]) + ); + } + + API.addSubset("RedPower." + RPName, set); + } + + private class ItemRange { + private final Block bl; + private final int start; + private final int end; + + public ItemRange(Block bl, int start, int end) { + this.bl = bl; + this.start = start; + this.end = end; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerWiring.java b/src/main/java/com/eloraam/redpower/RedPowerWiring.java new file mode 100644 index 0000000..7fcc459 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerWiring.java @@ -0,0 +1,270 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.wiring.MicroPlacementJacket; +import com.eloraam.redpower.wiring.MicroPlacementWire; +import com.eloraam.redpower.wiring.RenderRedwire; +import com.eloraam.redpower.wiring.TileBluewire; +import com.eloraam.redpower.wiring.TileCable; +import com.eloraam.redpower.wiring.TileInsulatedWire; +import com.eloraam.redpower.wiring.TileRedwire; +import com.eloraam.redpower.wiring.TileWiring; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.event.TextureStitchEvent.Pre; +import net.minecraftforge.common.MinecraftForge; + +@Mod( + modid = "RedPowerWiring", + name = "RedPower Wiring", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerWiring { + @Instance("RedPowerWiring") + public static RedPowerWiring instance; + @SideOnly(Side.CLIENT) + public static IIcon redwireTop; + @SideOnly(Side.CLIENT) + public static IIcon redwireFace; + @SideOnly(Side.CLIENT) + public static IIcon bundledTop; + @SideOnly(Side.CLIENT) + public static IIcon bundledFace; + @SideOnly(Side.CLIENT) + public static IIcon powerTop; + @SideOnly(Side.CLIENT) + public static IIcon powerFace; + @SideOnly(Side.CLIENT) + public static IIcon highPowerTop; + @SideOnly(Side.CLIENT) + public static IIcon highPowerFace; + @SideOnly(Side.CLIENT) + public static IIcon jumboSides; + @SideOnly(Side.CLIENT) + public static IIcon jumboTop; + @SideOnly(Side.CLIENT) + public static IIcon jumboCent; + @SideOnly(Side.CLIENT) + public static IIcon jumboCentSide; + @SideOnly(Side.CLIENT) + public static IIcon jumboEnd; + @SideOnly(Side.CLIENT) + public static IIcon jumboCorners; + @SideOnly(Side.CLIENT) + public static IIcon redwireCableOff; + @SideOnly(Side.CLIENT) + public static IIcon redwireCableOn; + @SideOnly(Side.CLIENT) + public static IIcon bluewireCable; + @SideOnly(Side.CLIENT) + public static IIcon bundledCable; + public static IIcon[] insulatedTop = new IIcon[16]; + public static IIcon[] insulatedFaceOff = new IIcon[16]; + public static IIcon[] insulatedFaceOn = new IIcon[16]; + public static IIcon[] bundledColTop = new IIcon[16]; + public static IIcon[] bundledColFace = new IIcon[16]; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + if (FMLCommonHandler.instance().getSide().isClient()) { + MinecraftForge.EVENT_BUS.register(instance); + } + + } + + @EventHandler + public void load(FMLInitializationEvent event) { + initJacketRecipes(); + setupWires(); + if (FMLCommonHandler.instance().getSide().isClient()) { + this.registerRenderers(); + } + + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + private static void initJacketRecipes() { + CoverLib.addMaterialHandler( + material -> { + if (!CoverLib.isTransparent(material)) { + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 4, 16384 + material), + new Object[]{"SSS", "SRS", "SSS", 'S', new ItemStack(RedPowerBase.blockMicro, 1, material), 'R', RedPowerBase.itemIngotRed} + ); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 16640 + material), + new Object[]{ + "SSS", "SCS", "SSS", 'S', new ItemStack(RedPowerBase.blockMicro, 1, material), 'C', new ItemStack(RedPowerBase.blockMicro, 1, 768) + } + ); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 4, 16896 + material), + new Object[]{"SSS", "SBS", "SSS", 'S', new ItemStack(RedPowerBase.blockMicro, 1, material), 'B', RedPowerBase.itemIngotBlue} + ); + CraftLib.addAlloyResult(CoreLib.copyStack(RedPowerBase.itemIngotRed, 1), new ItemStack(RedPowerBase.blockMicro, 4, 16384 + material)); + CraftLib.addAlloyResult(CoreLib.copyStack(RedPowerBase.itemIngotRed, 5), new ItemStack(RedPowerBase.blockMicro, 8, 16640 + material)); + CraftLib.addAlloyResult(CoreLib.copyStack(RedPowerBase.itemIngotBlue, 1), new ItemStack(RedPowerBase.blockMicro, 4, 16896 + material)); + } + + } + ); + } + + public static void setupWires() { + GameRegistry.registerTileEntity(TileRedwire.class, "Redwire"); + GameRegistry.registerTileEntity(TileInsulatedWire.class, "InsRedwire"); + GameRegistry.registerTileEntity(TileCable.class, "RedCable"); + GameRegistry.registerTileEntity(TileCovered.class, "Covers"); + GameRegistry.registerTileEntity(TileBluewire.class, "Bluewire"); + MicroPlacementWire wre = new MicroPlacementWire(); + RedPowerBase.blockMicro.registerPlacement(1, wre); + RedPowerBase.blockMicro.registerPlacement(2, wre); + RedPowerBase.blockMicro.registerPlacement(3, wre); + RedPowerBase.blockMicro.registerPlacement(5, wre); + MicroPlacementJacket jkt = new MicroPlacementJacket(); + RedPowerBase.blockMicro.registerPlacement(64, jkt); + RedPowerBase.blockMicro.registerPlacement(65, jkt); + RedPowerBase.blockMicro.registerPlacement(66, jkt); + RedPowerBase.blockMicro.addTileEntityMapping(1, TileRedwire::new); + RedPowerBase.blockMicro.addTileEntityMapping(2, TileInsulatedWire::new); + RedPowerBase.blockMicro.addTileEntityMapping(3, TileCable::new); + RedPowerBase.blockMicro.addTileEntityMapping(5, TileBluewire::new); + GameRegistry.addRecipe(new ItemStack(RedPowerBase.blockMicro, 12, 256), new Object[]{"R", "R", "R", 'R', RedPowerBase.itemIngotRed}); + CraftLib.addAlloyResult(RedPowerBase.itemIngotRed, new ItemStack(RedPowerBase.blockMicro, 4, 256)); + CraftLib.addAlloyResult(CoreLib.copyStack(RedPowerBase.itemIngotRed, 5), new ItemStack(RedPowerBase.blockMicro, 8, 768)); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 12, 1280), new Object[]{"WBW", "WBW", "WBW", 'B', RedPowerBase.itemIngotBlue, 'W', Blocks.wool} + ); + CraftLib.addAlloyResult(RedPowerBase.itemIngotBlue, new ItemStack(RedPowerBase.blockMicro, 4, 1280)); + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 1281), new Object[]{new ItemStack(RedPowerBase.blockMicro, 1, 1280), Blocks.wool} + ); + CraftLib.addAlloyResult(RedPowerBase.itemIngotBlue, new ItemStack(RedPowerBase.blockMicro, 4, 1281)); + + for(int color = 0; color < 16; ++color) { + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 12, 512 + color), + new Object[]{"WRW", "WRW", "WRW", 'R', RedPowerBase.itemIngotRed, 'W', new ItemStack(Blocks.wool, 1, color)} + ); + + for(int j = 0; j < 16; ++j) { + if (color != j) { + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 512 + color), + new Object[]{new ItemStack(RedPowerBase.blockMicro, 1, 512 + j), new ItemStack(Items.dye, 1, 15 - color)} + ); + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 769 + color), + new Object[]{new ItemStack(RedPowerBase.blockMicro, 1, 769 + j), new ItemStack(Items.dye, 1, 15 - color)} + ); + } + } + + CraftLib.addAlloyResult(RedPowerBase.itemIngotRed, new ItemStack(RedPowerBase.blockMicro, 4, 512 + color)); + GameRegistry.addRecipe( + new ItemStack(RedPowerBase.blockMicro, 2, 768), + new Object[]{"SWS", "WWW", "SWS", 'W', new ItemStack(RedPowerBase.blockMicro, 1, 512 + color), 'S', Items.string} + ); + GameRegistry.addShapelessRecipe( + new ItemStack(RedPowerBase.blockMicro, 1, 769 + color), + new Object[]{new ItemStack(RedPowerBase.blockMicro, 1, 768), new ItemStack(Items.dye, 1, 15 - color), Items.paper} + ); + CraftLib.addAlloyResult(CoreLib.copyStack(RedPowerBase.itemIngotRed, 5), new ItemStack(RedPowerBase.blockMicro, 8, 769 + color)); + } + + for(int i = 0; i < 16; ++i) { + if (i != 11) { + CraftLib.addShapelessOreRecipe(new ItemStack(RedPowerBase.blockMicro, 1, 523), new ItemStack(RedPowerBase.blockMicro, 1, 512 + i), "dyeBlue"); + CraftLib.addShapelessOreRecipe(new ItemStack(RedPowerBase.blockMicro, 1, 780), new ItemStack(RedPowerBase.blockMicro, 1, 769 + i), "dyeBlue"); + } + } + + CraftLib.addShapelessOreRecipe(new ItemStack(RedPowerBase.blockMicro, 1, 780), new ItemStack(RedPowerBase.blockMicro, 1, 768), "dyeBlue", Items.paper); + RedPowerLib.addCompatibleMapping(0, 1); + + for(int i = 0; i < 16; ++i) { + RedPowerLib.addCompatibleMapping(0, 2 + i); + RedPowerLib.addCompatibleMapping(1, 2 + i); + RedPowerLib.addCompatibleMapping(65, 2 + i); + + for(int j = 0; j < 16; ++j) { + RedPowerLib.addCompatibleMapping(19 + j, 2 + i); + } + + RedPowerLib.addCompatibleMapping(18, 2 + i); + RedPowerLib.addCompatibleMapping(18, 19 + i); + } + + RedPowerLib.addCompatibleMapping(0, 65); + RedPowerLib.addCompatibleMapping(1, 65); + RedPowerLib.addCompatibleMapping(64, 65); + RedPowerLib.addCompatibleMapping(64, 67); + RedPowerLib.addCompatibleMapping(65, 67); + RedPowerLib.addCompatibleMapping(66, 67); + } + + @SideOnly(Side.CLIENT) + public void registerRenderers() { + RenderLib.setDefaultRenderer(RedPowerBase.blockMicro, 8, RenderRedwire::new); + ClientRegistry.bindTileEntitySpecialRenderer(TileWiring.class, new RenderRedwire(RedPowerBase.blockMicro)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onTextureStitch(Pre evt) { + TextureMap map = evt.map; + if (map.getTextureType() == 0) { + redwireTop = map.registerIcon("rpwiring:redwireTop"); + redwireFace = map.registerIcon("rpwiring:redwireFace"); + bundledTop = map.registerIcon("rpwiring:bundledTop"); + bundledFace = map.registerIcon("rpwiring:bundledFace"); + powerTop = map.registerIcon("rpwiring:powerTop"); + powerFace = map.registerIcon("rpwiring:powerFace"); + highPowerTop = map.registerIcon("rpwiring:highPowerTop"); + highPowerFace = map.registerIcon("rpwiring:highPowerFace"); + jumboSides = map.registerIcon("rpwiring:jumboSides"); + jumboTop = map.registerIcon("rpwiring:jumboTop"); + jumboCent = map.registerIcon("rpwiring:jumboCent"); + jumboCentSide = map.registerIcon("rpwiring:jumboCentSide"); + jumboEnd = map.registerIcon("rpwiring:jumboEnd"); + jumboCorners = map.registerIcon("rpwiring:jumboCorners"); + redwireCableOff = map.registerIcon("rpwiring:redwireCableOff"); + redwireCableOn = map.registerIcon("rpwiring:redwireCableOn"); + bluewireCable = map.registerIcon("rpwiring:bluewireCable"); + bundledCable = map.registerIcon("rpwiring:bundledCable"); + + for(int col = 0; col < 16; ++col) { + insulatedTop[col] = map.registerIcon("rpwiring:insulatedTop/" + col); + insulatedFaceOff[col] = map.registerIcon("rpwiring:insulatedFaceOff/" + col); + insulatedFaceOn[col] = map.registerIcon("rpwiring:insulatedFaceOn/" + col); + bundledColTop[col] = map.registerIcon("rpwiring:bundledColTop/" + col); + bundledColFace[col] = map.registerIcon("rpwiring:bundledColFace/" + col); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/RedPowerWorld.java b/src/main/java/com/eloraam/redpower/RedPowerWorld.java new file mode 100644 index 0000000..69c60b1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/RedPowerWorld.java @@ -0,0 +1,495 @@ +package com.eloraam.redpower; + +import com.eloraam.redpower.base.ItemHandsaw; +import com.eloraam.redpower.core.Config; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.ItemPartialCraft; +import com.eloraam.redpower.core.ItemTextured; +import com.eloraam.redpower.world.BlockCustomCrops; +import com.eloraam.redpower.world.BlockCustomFlower; +import com.eloraam.redpower.world.BlockCustomLeaves; +import com.eloraam.redpower.world.BlockCustomLog; +import com.eloraam.redpower.world.BlockCustomOre; +import com.eloraam.redpower.world.BlockCustomStone; +import com.eloraam.redpower.world.BlockStorage; +import com.eloraam.redpower.world.ContainerSeedBag; +import com.eloraam.redpower.world.EnchantmentDisjunction; +import com.eloraam.redpower.world.EnchantmentVorpal; +import com.eloraam.redpower.world.GuiSeedBag; +import com.eloraam.redpower.world.ItemAthame; +import com.eloraam.redpower.world.ItemCustomAxe; +import com.eloraam.redpower.world.ItemCustomFlower; +import com.eloraam.redpower.world.ItemCustomHoe; +import com.eloraam.redpower.world.ItemCustomOre; +import com.eloraam.redpower.world.ItemCustomPickaxe; +import com.eloraam.redpower.world.ItemCustomSeeds; +import com.eloraam.redpower.world.ItemCustomShovel; +import com.eloraam.redpower.world.ItemCustomStone; +import com.eloraam.redpower.world.ItemCustomSword; +import com.eloraam.redpower.world.ItemPaintBrush; +import com.eloraam.redpower.world.ItemPaintCan; +import com.eloraam.redpower.world.ItemSeedBag; +import com.eloraam.redpower.world.ItemSickle; +import com.eloraam.redpower.world.ItemStorage; +import com.eloraam.redpower.world.ItemWoolCard; +import com.eloraam.redpower.world.WorldEvents; +import com.eloraam.redpower.world.WorldGenHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +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.registry.GameRegistry; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryBasic; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.oredict.OreDictionary; + +@Mod( + modid = "RedPowerWorld", + name = "RedPower World", + version = "2.0pr6", + dependencies = "required-after:RedPowerBase" +) +public class RedPowerWorld implements IGuiHandler { + @Instance("RedPowerWorld") + public static RedPowerWorld instance; + public static BlockCustomFlower blockPlants; + public static BlockCustomOre blockOres; + public static BlockCustomLeaves blockLeaves; + public static BlockCustomLog blockLogs; + public static BlockCustomStone blockStone; + public static BlockCustomCrops blockCrops; + public static BlockStorage blockStorage; + public static ItemStack itemOreRuby; + public static ItemStack itemOreGreenSapphire; + public static ItemStack itemOreSapphire; + public static ItemStack itemMarble; + public static ItemStack itemBasalt; + public static ItemStack itemBasaltCobble; + public static ToolMaterial toolMaterialRuby; + public static ToolMaterial toolMaterialGreenSapphire; + public static ToolMaterial toolMaterialSapphire; + public static ItemSickle itemSickleWood; + public static ItemSickle itemSickleStone; + public static ItemSickle itemSickleIron; + public static ItemSickle itemSickleDiamond; + public static ItemSickle itemSickleGold; + public static ItemSickle itemSickleRuby; + public static ItemSickle itemSickleGreenSapphire; + public static ItemSickle itemSickleSapphire; + public static ItemCustomPickaxe itemPickaxeRuby; + public static ItemCustomPickaxe itemPickaxeGreenSapphire; + public static ItemCustomPickaxe itemPickaxeSapphire; + public static ItemCustomShovel itemShovelRuby; + public static ItemCustomShovel setUnlocalizedName; + public static ItemCustomShovel itemShovelSapphire; + public static ItemCustomShovel itemShovelGreenSapphire; + public static ItemCustomAxe itemAxeRuby; + public static ItemCustomAxe itemAxeGreenSapphire; + public static ItemCustomAxe itemAxeSapphire; + public static ItemCustomSword itemSwordRuby; + public static ItemCustomSword itemSwordGreenSapphire; + public static ItemCustomSword itemSwordSapphire; + public static ItemAthame itemAthame; + public static ItemCustomHoe itemHoeRuby; + public static ItemCustomHoe itemHoeGreenSapphire; + public static ItemCustomHoe itemHoeSapphire; + public static ItemCustomSeeds itemSeeds; + public static Item itemHandsawRuby; + public static Item itemHandsawGreenSapphire; + public static Item itemHandsawSapphire; + public static Item itemBrushDry; + public static Item itemPaintCanEmpty; + public static Item[] itemBrushPaint = new Item[16]; + public static ItemPartialCraft[] itemPaintCanPaint = new ItemPartialCraft[16]; + public static Item itemWoolCard; + public static Item itemSeedBag; + public static Enchantment enchantDisjunction; + public static Enchantment enchantVorpal; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) { + MinecraftForge.EVENT_BUS.register(new WorldEvents()); + } + + @EventHandler + public void load(FMLInitializationEvent event) { + GameRegistry.registerWorldGenerator(new WorldGenHandler(), 1); + this.setupOres(); + this.setupPlants(); + this.setupTools(); + this.setupMisc(); + NetworkRegistry.INSTANCE.registerGuiHandler(instance, instance); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) { + } + + public void setupPlants() { + blockPlants = new BlockCustomFlower("rpworld:indigoFlower", "rpworld:rubberSapling"); + blockPlants.setBlockName("plant"); + GameRegistry.registerBlock(blockPlants, ItemCustomFlower.class, "plants"); + GameRegistry.addShapelessRecipe(new ItemStack(RedPowerBase.itemDyeIndigo, 2, 0), new Object[]{blockPlants}); + itemSeeds = new ItemCustomSeeds(); + MinecraftForge.addGrassSeed(new ItemStack(itemSeeds, 1, 0), 5); + blockCrops = new BlockCustomCrops(); + GameRegistry.registerBlock(blockCrops, "flax"); + GameRegistry.registerItem(itemSeeds, "flaxseeds"); + blockLeaves = new BlockCustomLeaves("rpworld:rubberLeaves_opaque", "rpworld:rubberLeaves_transparent"); + blockLeaves.setBlockName("rpleaves"); + GameRegistry.registerBlock(blockLeaves, "leaves"); + blockLogs = new BlockCustomLog("rpworld:rubberLogSide", "rpworld:rubberLogTop"); + blockLogs.setBlockName("rplog"); + GameRegistry.registerBlock(blockLogs, "logs"); + blockLogs.setHarvestLevel("axe", 0, 0); + OreDictionary.registerOre("woodRubber", new ItemStack(blockLogs)); + GameRegistry.addRecipe(new ItemStack(Items.stick, 8), new Object[]{"W", 'W', blockLogs}); + GameRegistry.addSmelting(new ItemStack(blockLogs, 1, 0), new ItemStack(Items.coal, 1, 1), 0.15F); + CoverLib.addMaterial(53, 0, blockLogs, 0, "rplog"); + } + + public void setupOres() { + blockStone = new BlockCustomStone(); + blockStone.setBlockName("rpstone"); + GameRegistry.registerBlock(blockStone, ItemCustomStone.class, "stone"); + itemMarble = new ItemStack(blockStone, 0); + itemBasalt = new ItemStack(blockStone, 1); + itemBasaltCobble = new ItemStack(blockStone, 3); + blockStone.setHarvestLevel("pickaxe", 0); + blockStone.setBlockTexture(0, "rpworld:marble"); + blockStone.setBlockTexture(1, "rpworld:basalt"); + blockStone.setBlockTexture(2, "rpworld:marbleBrick"); + blockStone.setBlockTexture(3, "rpworld:basaltCobble"); + blockStone.setBlockTexture(4, "rpworld:basaltBrick"); + blockStone.setBlockTexture(5, "rpworld:chiseledBasaltBrick"); + blockStone.setBlockTexture(6, "rpworld:basaltPaver"); + CoverLib.addMaterial(48, 1, blockStone, 0, "marble"); + CoverLib.addMaterial(49, 1, blockStone, 1, "basalt"); + CoverLib.addMaterial(50, 1, blockStone, 2, "marbleBrick"); + CoverLib.addMaterial(51, 1, blockStone, 3, "basaltCobble"); + CoverLib.addMaterial(52, 1, blockStone, 4, "basaltBrick"); + CoverLib.addMaterial(57, 1, blockStone, 5, "basaltCircle"); + CoverLib.addMaterial(58, 1, blockStone, 6, "basaltPaver"); + blockOres = new BlockCustomOre(); + GameRegistry.registerBlock(blockOres, ItemCustomOre.class, "ores"); + itemOreRuby = new ItemStack(blockOres, 1, 0); + itemOreGreenSapphire = new ItemStack(blockOres, 1, 1); + itemOreSapphire = new ItemStack(blockOres, 1, 2); + blockOres.setHarvestLevel("pickaxe", 2, 0); + blockOres.setHarvestLevel("pickaxe", 2, 1); + blockOres.setHarvestLevel("pickaxe", 2, 2); + blockOres.setHarvestLevel("pickaxe", 1, 3); + blockOres.setHarvestLevel("pickaxe", 0, 4); + blockOres.setHarvestLevel("pickaxe", 0, 5); + blockOres.setHarvestLevel("pickaxe", 2, 6); + blockOres.setHarvestLevel("pickaxe", 2, 7); + GameRegistry.addSmelting(new ItemStack(blockOres, 1, 3), RedPowerBase.itemIngotSilver, 1.0F); + GameRegistry.addSmelting(new ItemStack(blockOres, 1, 4), RedPowerBase.itemIngotTin, 0.7F); + GameRegistry.addSmelting(new ItemStack(blockOres, 1, 5), RedPowerBase.itemIngotCopper, 0.7F); + GameRegistry.addSmelting(new ItemStack(blockOres, 1, 6), RedPowerBase.itemIngotTungsten, 1.2F); + GameRegistry.addSmelting(new ItemStack(RedPowerBase.itemResource, 2, 9), RedPowerBase.itemIngotSilver, 1.0F); + GameRegistry.addSmelting(new ItemStack(RedPowerBase.itemResource, 2, 8), RedPowerBase.itemIngotTungsten, 1.2F); + OreDictionary.registerOre("oreRuby", new ItemStack(blockOres, 1, 0)); + OreDictionary.registerOre("oreGreenSapphire", new ItemStack(blockOres, 1, 1)); + OreDictionary.registerOre("oreSapphire", new ItemStack(blockOres, 1, 2)); + OreDictionary.registerOre("oreSilver", new ItemStack(blockOres, 1, 3)); + OreDictionary.registerOre("oreTin", new ItemStack(blockOres, 1, 4)); + OreDictionary.registerOre("oreCopper", new ItemStack(blockOres, 1, 5)); + OreDictionary.registerOre("oreTungsten", new ItemStack(blockOres, 1, 6)); + OreDictionary.registerOre("oreNikolite", new ItemStack(blockOres, 1, 7)); + GameRegistry.addRecipe(new ItemStack(blockStone, 4, 2), new Object[]{"SS", "SS", 'S', new ItemStack(blockStone, 1, 0)}); + GameRegistry.addSmelting(new ItemStack(blockStone, 1, 3), new ItemStack(blockStone, 1, 1), 0.2F); + GameRegistry.addRecipe(new ItemStack(blockStone, 4, 4), new Object[]{"SS", "SS", 'S', new ItemStack(blockStone, 1, 1)}); + GameRegistry.addRecipe(new ItemStack(blockStone, 4, 5), new Object[]{"SS", "SS", 'S', new ItemStack(blockStone, 1, 4)}); + GameRegistry.addRecipe(new ItemStack(blockStone, 1, 6), new Object[]{"S", 'S', new ItemStack(blockStone, 1, 1)}); + blockStorage = new BlockStorage(); + GameRegistry.registerBlock(blockStorage, ItemStorage.class, "orestorage"); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 0), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemRuby}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 1), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemGreenSapphire}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 2), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemSapphire}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 3), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemIngotSilver}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 4), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemIngotTin}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 5), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemIngotCopper}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 6), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemIngotTungsten}); + GameRegistry.addRecipe(new ItemStack(blockStorage, 1, 7), new Object[]{"GGG", "GGG", "GGG", 'G', RedPowerBase.itemNikolite}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemRuby, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 0)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemGreenSapphire, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 1)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemSapphire, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 2)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemIngotSilver, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 3)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemIngotTin, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 4)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemIngotCopper, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 5)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemIngotTungsten, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 6)}); + GameRegistry.addRecipe(CoreLib.copyStack(RedPowerBase.itemNikolite, 9), new Object[]{"G", 'G', new ItemStack(blockStorage, 1, 7)}); + blockStorage.setHarvestLevel("pickaxe", 2, 0); + blockStorage.setHarvestLevel("pickaxe", 2, 1); + blockStorage.setHarvestLevel("pickaxe", 2, 2); + blockStorage.setHarvestLevel("pickaxe", 2, 3); + blockStorage.setHarvestLevel("pickaxe", 2, 4); + blockStorage.setHarvestLevel("pickaxe", 2, 5); + blockStorage.setHarvestLevel("pickaxe", 3, 6); + blockStorage.setHarvestLevel("pickaxe", 2, 7); + CoverLib.addMaterial(54, 2, blockStorage, 0, "rubyBlock"); + CoverLib.addMaterial(55, 2, blockStorage, 1, "greenSapphireBlock"); + CoverLib.addMaterial(56, 2, blockStorage, 2, "sapphireBlock"); + CoverLib.addMaterial(66, 2, blockStorage, 3, "silverBlock"); + CoverLib.addMaterial(67, 2, blockStorage, 4, "tinBlock"); + CoverLib.addMaterial(68, 2, blockStorage, 5, "copperBlock"); + CoverLib.addMaterial(69, 2, blockStorage, 6, "tungstenBlock"); + } + + public void setupTools() { + toolMaterialRuby = EnumHelper.addToolMaterial("RUBY", 2, 500, 8.0F, 3.0F, 12); + toolMaterialGreenSapphire = EnumHelper.addToolMaterial("GREENSAPPHIRE", 2, 500, 8.0F, 3.0F, 12); + toolMaterialSapphire = EnumHelper.addToolMaterial("SAPPHIRE", 2, 500, 8.0F, 3.0F, 12); + itemPickaxeRuby = new ItemCustomPickaxe(toolMaterialRuby); + itemPickaxeRuby.setUnlocalizedName("pickaxeRuby"); + itemPickaxeRuby.setTextureName("rpworld:pickaxeRuby"); + GameRegistry.registerItem(itemPickaxeRuby, "rubyPickaxe"); + itemPickaxeGreenSapphire = new ItemCustomPickaxe(toolMaterialGreenSapphire); + itemPickaxeGreenSapphire.setUnlocalizedName("pickaxeGreenSapphire"); + itemPickaxeGreenSapphire.setTextureName("rpworld:pickaxeGreenSapphire"); + GameRegistry.registerItem(itemPickaxeGreenSapphire, "greenSapphirePickaxe"); + itemPickaxeSapphire = new ItemCustomPickaxe(toolMaterialSapphire); + itemPickaxeSapphire.setUnlocalizedName("pickaxeSapphire"); + itemPickaxeSapphire.setTextureName("rpworld:pickaxeSapphire"); + GameRegistry.registerItem(itemPickaxeSapphire, "sapphirePickaxe"); + itemPickaxeRuby.setHarvestLevel("pickaxe", 2); + itemPickaxeGreenSapphire.setHarvestLevel("pickaxe", 2); + itemPickaxeSapphire.setHarvestLevel("pickaxe", 2); + GameRegistry.addRecipe(new ItemStack(itemPickaxeRuby, 1), new Object[]{"GGG", " W ", " W ", 'G', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe( + new ItemStack(itemPickaxeGreenSapphire, 1), new Object[]{"GGG", " W ", " W ", 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick} + ); + GameRegistry.addRecipe(new ItemStack(itemPickaxeSapphire, 1), new Object[]{"GGG", " W ", " W ", 'G', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemShovelRuby = new ItemCustomShovel(toolMaterialRuby); + itemShovelRuby.setUnlocalizedName("shovelRuby"); + itemShovelRuby.setTextureName("rpworld:shovelRuby"); + GameRegistry.registerItem(itemShovelRuby, "rubyShovel"); + itemShovelGreenSapphire = new ItemCustomShovel(toolMaterialGreenSapphire); + itemShovelGreenSapphire.setUnlocalizedName("shovelGreenSapphire"); + itemShovelGreenSapphire.setTextureName("rpworld:shovelGreenSapphire"); + GameRegistry.registerItem(itemShovelGreenSapphire, "greenSapphireShovel"); + itemShovelSapphire = new ItemCustomShovel(toolMaterialSapphire); + itemShovelSapphire.setUnlocalizedName("shovelSapphire"); + itemShovelSapphire.setTextureName("rpworld:shovelSapphire"); + GameRegistry.registerItem(itemShovelSapphire, "sapphireShovel"); + itemShovelRuby.setHarvestLevel("shovel", 2); + itemShovelGreenSapphire.setHarvestLevel("shovel", 2); + itemShovelSapphire.setHarvestLevel("shovel", 2); + GameRegistry.addRecipe(new ItemStack(itemShovelRuby, 1), new Object[]{"G", "W", "W", 'G', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemShovelGreenSapphire, 1), new Object[]{"G", "W", "W", 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemShovelSapphire, 1), new Object[]{"G", "W", "W", 'G', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemAxeRuby = new ItemCustomAxe(toolMaterialRuby); + itemAxeRuby.setUnlocalizedName("axeRuby"); + itemAxeRuby.setTextureName("rpworld:axeRuby"); + GameRegistry.registerItem(itemAxeRuby, "rubyAxe"); + itemAxeGreenSapphire = new ItemCustomAxe(toolMaterialGreenSapphire); + itemAxeGreenSapphire.setUnlocalizedName("axeGreenSapphire"); + itemAxeGreenSapphire.setTextureName("rpworld:axeGreenSapphire"); + GameRegistry.registerItem(itemAxeGreenSapphire, "greenSapphireAxe"); + itemAxeSapphire = new ItemCustomAxe(toolMaterialSapphire); + itemAxeSapphire.setUnlocalizedName("axeSapphire"); + itemAxeSapphire.setTextureName("rpworld:axeSapphire"); + GameRegistry.registerItem(itemAxeSapphire, "sapphireAxe"); + itemAxeRuby.setHarvestLevel("axe", 2); + itemAxeGreenSapphire.setHarvestLevel("axe", 2); + itemAxeSapphire.setHarvestLevel("axe", 2); + GameRegistry.addRecipe(new ItemStack(itemAxeRuby, 1), new Object[]{"GG", "GW", " W", 'G', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemAxeGreenSapphire, 1), new Object[]{"GG", "GW", " W", 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemAxeSapphire, 1), new Object[]{"GG", "GW", " W", 'G', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemSwordRuby = new ItemCustomSword(toolMaterialRuby); + itemSwordRuby.setUnlocalizedName("swordRuby"); + itemSwordRuby.setTextureName("rpworld:swordRuby"); + GameRegistry.registerItem(itemSwordRuby, "rubySword"); + itemSwordGreenSapphire = new ItemCustomSword(toolMaterialGreenSapphire); + itemSwordGreenSapphire.setUnlocalizedName("swordGreenSapphire"); + itemSwordGreenSapphire.setTextureName("rpworld:swordGreenSapphire"); + GameRegistry.registerItem(itemSwordGreenSapphire, "greenSapphireSword"); + itemSwordSapphire = new ItemCustomSword(toolMaterialSapphire); + itemSwordSapphire.setUnlocalizedName("swordSapphire"); + itemSwordSapphire.setTextureName("rpworld:swordSapphire"); + GameRegistry.registerItem(itemSwordSapphire, "sapphireSword"); + itemAthame = new ItemAthame(); + itemAthame.setUnlocalizedName("athame"); + GameRegistry.registerItem(itemAthame, "athame"); + CraftLib.addOreRecipe(new ItemStack(itemAthame, 1), "S", "W", 'S', "ingotSilver", 'W', Items.stick); + GameRegistry.addRecipe(new ItemStack(itemSwordRuby, 1), new Object[]{"G", "G", "W", 'G', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSwordGreenSapphire, 1), new Object[]{"G", "G", "W", 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSwordSapphire, 1), new Object[]{"G", "G", "W", 'G', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemHoeRuby = new ItemCustomHoe(toolMaterialRuby); + itemHoeRuby.setUnlocalizedName("hoeRuby"); + itemHoeRuby.setTextureName("rpworld:hoeRuby"); + itemHoeRuby.setMaxDamage(500); + GameRegistry.registerItem(itemHoeRuby, "rubyHoe"); + itemHoeGreenSapphire = new ItemCustomHoe(toolMaterialGreenSapphire); + itemHoeGreenSapphire.setUnlocalizedName("hoeGreenSapphire"); + itemHoeGreenSapphire.setTextureName("rpworld:hoeGreenSapphire"); + itemHoeGreenSapphire.setMaxDamage(500); + GameRegistry.registerItem(itemHoeGreenSapphire, "greenSapphireHoe"); + itemHoeSapphire = new ItemCustomHoe(toolMaterialSapphire); + itemHoeSapphire.setUnlocalizedName("hoeSapphire"); + itemHoeSapphire.setTextureName("rpworld:hoeSapphire"); + itemHoeSapphire.setMaxDamage(500); + GameRegistry.registerItem(itemHoeSapphire, "sapphireHoe"); + itemHoeRuby.setHarvestLevel("hoe", 2); + itemHoeGreenSapphire.setHarvestLevel("hoe", 2); + itemHoeSapphire.setHarvestLevel("hoe", 2); + GameRegistry.addRecipe(new ItemStack(itemHoeRuby, 1), new Object[]{"GG", " W", " W", 'G', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemHoeGreenSapphire, 1), new Object[]{"GG", " W", " W", 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemHoeSapphire, 1), new Object[]{"GG", " W", " W", 'G', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemSickleWood = new ItemSickle(ToolMaterial.WOOD); + itemSickleWood.setUnlocalizedName("sickleWood"); + itemSickleWood.setTextureName("rpworld:sickleWood"); + GameRegistry.registerItem(itemSickleWood, "woodenSickle"); + itemSickleStone = new ItemSickle(ToolMaterial.STONE); + itemSickleStone.setUnlocalizedName("sickleStone"); + itemSickleStone.setTextureName("rpworld:sickleStone"); + GameRegistry.registerItem(itemSickleStone, "stoneSickle"); + itemSickleIron = new ItemSickle(ToolMaterial.IRON); + itemSickleIron.setUnlocalizedName("sickleIron"); + itemSickleIron.setTextureName("rpworld:sickleIron"); + GameRegistry.registerItem(itemSickleIron, "ironSickle"); + itemSickleDiamond = new ItemSickle(ToolMaterial.EMERALD); + itemSickleDiamond.setUnlocalizedName("sickleDiamond"); + itemSickleDiamond.setTextureName("rpworld:sickleDiamond"); + GameRegistry.registerItem(itemSickleDiamond, "diamondSickle"); + itemSickleGold = new ItemSickle(ToolMaterial.GOLD); + itemSickleGold.setUnlocalizedName("sickleGold"); + itemSickleGold.setTextureName("rpworld:sickleGold"); + GameRegistry.registerItem(itemSickleGold, "goldSickle"); + itemSickleRuby = new ItemSickle(toolMaterialRuby); + itemSickleRuby.setUnlocalizedName("sickleRuby"); + itemSickleRuby.setTextureName("rpworld:sickleRuby"); + GameRegistry.registerItem(itemSickleRuby, "rubySickle"); + itemSickleGreenSapphire = new ItemSickle(toolMaterialGreenSapphire); + itemSickleGreenSapphire.setUnlocalizedName("sickleGreenSapphire"); + itemSickleGreenSapphire.setTextureName("rpworld:sickleGreenSapphire"); + GameRegistry.registerItem(itemSickleGreenSapphire, "greenSapphireSickle"); + itemSickleSapphire = new ItemSickle(toolMaterialSapphire); + itemSickleSapphire.setUnlocalizedName("sickleSapphire"); + itemSickleSapphire.setTextureName("rpworld:sickleSapphire"); + GameRegistry.registerItem(itemSickleSapphire, "sapphireSickle"); + CraftLib.addOreRecipe(new ItemStack(itemSickleWood, 1), " I ", " I", "WI ", 'I', "plankWood", 'W', Items.stick); + GameRegistry.addRecipe(new ItemStack(itemSickleStone, 1), new Object[]{" I ", " I", "WI ", 'I', Blocks.cobblestone, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSickleIron, 1), new Object[]{" I ", " I", "WI ", 'I', Items.iron_ingot, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSickleDiamond, 1), new Object[]{" I ", " I", "WI ", 'I', Items.diamond, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSickleGold, 1), new Object[]{" I ", " I", "WI ", 'I', Items.gold_ingot, 'W', Items.stick}); + GameRegistry.addRecipe(new ItemStack(itemSickleRuby, 1), new Object[]{" I ", " I", "WI ", 'I', RedPowerBase.itemRuby, 'W', Items.stick}); + GameRegistry.addRecipe( + new ItemStack(itemSickleGreenSapphire, 1), new Object[]{" I ", " I", "WI ", 'I', RedPowerBase.itemGreenSapphire, 'W', Items.stick} + ); + GameRegistry.addRecipe(new ItemStack(itemSickleSapphire, 1), new Object[]{" I ", " I", "WI ", 'I', RedPowerBase.itemSapphire, 'W', Items.stick}); + itemHandsawRuby = new ItemHandsaw(1); + itemHandsawGreenSapphire = new ItemHandsaw(1); + itemHandsawSapphire = new ItemHandsaw(1); + itemHandsawRuby.setUnlocalizedName("handsawRuby").setTextureName("rpworld:handsawRuby"); + itemHandsawGreenSapphire.setUnlocalizedName("handsawGreenSapphire").setTextureName("rpworld:handsawGreenSapphire"); + itemHandsawSapphire.setUnlocalizedName("handsawSapphire").setTextureName("rpworld:handsawSapphire"); + itemHandsawRuby.setMaxDamage(640); + itemHandsawGreenSapphire.setMaxDamage(640); + itemHandsawSapphire.setMaxDamage(640); + GameRegistry.registerItem(itemHandsawRuby, "rubyHandshaw"); + GameRegistry.registerItem(itemHandsawGreenSapphire, "greenSapphireHandshaw"); + GameRegistry.registerItem(itemHandsawSapphire, "sapphireHandshaw"); + GameRegistry.addRecipe( + new ItemStack(itemHandsawRuby, 1), new Object[]{"WWW", " II", " GG", 'I', Items.iron_ingot, 'G', RedPowerBase.itemRuby, 'W', Items.stick} + ); + GameRegistry.addRecipe( + new ItemStack(itemHandsawGreenSapphire, 1), + new Object[]{"WWW", " II", " GG", 'I', Items.iron_ingot, 'G', RedPowerBase.itemGreenSapphire, 'W', Items.stick} + ); + GameRegistry.addRecipe( + new ItemStack(itemHandsawSapphire, 1), new Object[]{"WWW", " II", " GG", 'I', Items.iron_ingot, 'G', RedPowerBase.itemSapphire, 'W', Items.stick} + ); + itemWoolCard = new ItemWoolCard(); + GameRegistry.registerItem(itemWoolCard, "woolCard"); + CraftLib.addOreRecipe(new ItemStack(itemWoolCard, 1), "W", "P", "S", 'W', RedPowerBase.itemFineIron, 'P', "plankWood", 'S', Items.stick); + GameRegistry.addShapelessRecipe(new ItemStack(Items.string, 4), new Object[]{new ItemStack(itemWoolCard, 1, 32767), new ItemStack(Blocks.wool, 1, 32767)}); + itemBrushDry = new ItemTextured("rpworld:brushDry"); + itemBrushDry.setCreativeTab(CreativeTabs.tabTools); + itemBrushDry.setUnlocalizedName("paintbrush.dry"); + GameRegistry.registerItem(itemBrushDry, "dryBush"); + GameRegistry.addRecipe(new ItemStack(itemBrushDry), new Object[]{"W ", " S", 'S', Items.stick, 'W', Blocks.wool}); + itemPaintCanEmpty = new ItemTextured("rpworld:paintCanEmpty"); + itemPaintCanEmpty.setCreativeTab(CreativeTabs.tabTools); + itemPaintCanEmpty.setUnlocalizedName("paintcan.empty"); + GameRegistry.registerItem(itemPaintCanEmpty, "emptyPainCan"); + GameRegistry.addRecipe(new ItemStack(itemPaintCanEmpty, 3), new Object[]{"T T", "T T", "TTT", 'T', RedPowerBase.itemTinplate}); + + for(int color = 0; color < 16; ++color) { + itemPaintCanPaint[color] = new ItemPaintCan(color); + itemPaintCanPaint[color].setUnlocalizedName("paintcan." + CoreLib.rawColorNames[color]); + itemPaintCanPaint[color].setEmptyItem(new ItemStack(itemPaintCanEmpty)); + GameRegistry.registerItem(itemPaintCanPaint[color], CoreLib.rawColorNames[color] + "PainCan"); + GameRegistry.addShapelessRecipe( + new ItemStack(itemPaintCanPaint[color]), + new Object[]{itemPaintCanEmpty, new ItemStack(Items.dye, 1, 15 - color), new ItemStack(itemSeeds, 1, 0), new ItemStack(itemSeeds, 1, 0)} + ); + } + + for(int color = 0; color < 16; ++color) { + itemBrushPaint[color] = new ItemPaintBrush(color); + itemBrushPaint[color].setUnlocalizedName("paintbrush." + CoreLib.rawColorNames[color]); + GameRegistry.registerItem(itemBrushPaint[color], CoreLib.rawColorNames[color] + "PainBrush"); + GameRegistry.addShapelessRecipe(new ItemStack(itemBrushPaint[color]), new Object[]{new ItemStack(itemPaintCanPaint[color], 1, 32767), itemBrushDry}); + } + + CraftLib.addShapelessOreRecipe( + new ItemStack(itemPaintCanPaint[11]), itemPaintCanEmpty, "dyeBlue", new ItemStack(itemSeeds, 1, 0), new ItemStack(itemSeeds, 1, 0) + ); + itemSeedBag = new ItemSeedBag(); + GameRegistry.registerItem(itemSeedBag, "seedBag"); + GameRegistry.addRecipe(new ItemStack(itemSeedBag, 1, 0), new Object[]{" S ", "C C", "CCC", 'S', Items.string, 'C', RedPowerBase.itemCanvas}); + } + + public void setupMisc() { + if (Config.getInt("settings.world.tweaks.spreadmoss", 1) > 0) { + } + + if (Config.getInt("settings.world.tweaks.craftcircle", 1) > 0) { + GameRegistry.addRecipe(new ItemStack(Blocks.stonebrick, 4, 3), new Object[]{"BB", "BB", 'B', new ItemStack(Blocks.stonebrick, 1, 0)}); + } + + if (Config.getInt("settings.world.tweaks.unbricks", 1) > 0) { + GameRegistry.addShapelessRecipe(new ItemStack(Items.brick, 4, 0), new Object[]{new ItemStack(Blocks.brick_block, 1, 0)}); + } + + enchantDisjunction = new EnchantmentDisjunction(Config.getInt("enchant.disjunction.id", 79), 10); + enchantVorpal = new EnchantmentVorpal(Config.getInt("enchant.vorpal.id", 80), 10); + } + + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch(ID) { + case 1: + return new GuiSeedBag(player.inventory, new InventoryBasic("", true, 9)); + default: + return null; + } + } + + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch(ID) { + case 1: + ItemStack heldItem = player.getHeldItem(); + return new ContainerSeedBag(player.inventory, ItemSeedBag.getBagInventory(heldItem, player), heldItem); + default: + return null; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/base/BlockAppliance.java b/src/main/java/com/eloraam/redpower/base/BlockAppliance.java new file mode 100644 index 0000000..313d807 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/BlockAppliance.java @@ -0,0 +1,39 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; + +public class BlockAppliance extends BlockExtended { + public BlockAppliance() { + super(Material.rock); + this.setHardness(2.0F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + public int getLightValue(IBlockAccess iba, int i, int j, int k) { + TileAppliance taf = CoreLib.getTileEntity(iba, i, j, k, TileAppliance.class); + return taf == null ? super.getLightValue(iba, i, j, k) : taf.getLightValue(); + } + + @Override + public boolean isOpaqueCube() { + return true; + } + + public boolean isNormalCube() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return true; + } + + @Override + public int damageDropped(int meta) { + return meta; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/BlockMicro.java b/src/main/java/com/eloraam/redpower/base/BlockMicro.java new file mode 100644 index 0000000..13a4440 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/BlockMicro.java @@ -0,0 +1,34 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.BlockCoverable; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.IMicroPlacement; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.item.Item; +import net.minecraft.world.IBlockAccess; + +public class BlockMicro extends BlockCoverable { + public BlockMicro() { + super(CoreLib.materialRedpower); + this.setHardness(0.1F); + this.setCreativeTab(CreativeExtraTabs.tabWires); + } + + public boolean canProvidePower() { + return !RedPowerLib.isSearching(); + } + + public boolean canConnectRedstone(IBlockAccess iba, int x, int y, int z, int side) { + if (RedPowerLib.isSearching()) { + return false; + } else { + int md = iba.getBlockMetadata(x, y, z); + return md == 1 || md == 2; + } + } + + public void registerPlacement(int md, IMicroPlacement imp) { + ((ItemMicro)Item.getItemFromBlock(this)).registerPlacement(md, imp); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/BlockNikolite.java b/src/main/java/com/eloraam/redpower/base/BlockNikolite.java new file mode 100644 index 0000000..17a567c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/BlockNikolite.java @@ -0,0 +1,10 @@ +package com.eloraam.redpower.base; + +import net.minecraft.block.BlockCompressed; +import net.minecraft.block.material.MapColor; + +public class BlockNikolite extends BlockCompressed { + public BlockNikolite() { + super(MapColor.cyanColor); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ContainerAdvBench.java b/src/main/java/com/eloraam/redpower/base/ContainerAdvBench.java new file mode 100644 index 0000000..f512b4b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ContainerAdvBench.java @@ -0,0 +1,442 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +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.InventoryCraftResult; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class ContainerAdvBench extends Container implements IHandleGuiEvent { + SlotCraftRefill slotCraft; + private TileAdvBench tileAdvBench; + public InventorySubCraft craftMatrix; + public IInventory craftResult; + public InventoryCrafting fakeInv; + public int satisfyMask; + + public ContainerAdvBench(InventoryPlayer inv, TileAdvBench td) { + this.tileAdvBench = td; + this.craftMatrix = new InventorySubCraft(this, td); + this.craftResult = new InventoryCraftResult(); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(this.craftMatrix, j + i * 3, 48 + j * 18, 18 + i * 18)); + } + } + + this.addSlotToContainer(new ContainerAdvBench.SlotPlan(new ContainerAdvBench.InventorySubUpdate(td, 9, 1), 0, 17, 36)); + this.slotCraft = new SlotCraftRefill(inv.player, this.craftMatrix, this.craftResult, td, this, 0, 143, 36); + this.addSlotToContainer(this.slotCraft); + ContainerAdvBench.InventorySubUpdate ingrid = new ContainerAdvBench.InventorySubUpdate(td, 10, 18); + + for(int i = 0; i < 2; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(ingrid, j + i * 9, 8 + j * 18, 90 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 140 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 198)); + } + + this.fakeInv = new InventoryCrafting(new ContainerAdvBench.ContainerNull(), 3, 3); + this.onCraftMatrixChanged(this.craftMatrix); + } + + public void putStackInSlot(int num, ItemStack ist) { + super.putStackInSlot(num, ist); + } + + public static ItemStack[] getShadowItems(ItemStack ist) { + if (ist.stackTagCompound == null) { + return null; + } else { + NBTTagList require = ist.stackTagCompound.getTagList("requires", 10); + if (require == null) { + return null; + } else { + ItemStack[] tr = new ItemStack[9]; + + for(int i = 0; i < require.tagCount(); ++i) { + NBTTagCompound item = require.getCompoundTagAt(i); + ItemStack is2 = ItemStack.loadItemStackFromNBT(item); + byte sl = item.getByte("Slot"); + if (sl >= 0 && sl < 9) { + tr[sl] = is2; + } + } + + return tr; + } + } + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileAdvBench.isUseableByPlayer(player); + } + + public ItemStack[] getPlanItems() { + ItemStack plan = this.tileAdvBench.getStackInSlot(9); + return plan == null ? null : getShadowItems(plan); + } + + public int getSatisfyMask() { + ItemStack plan = this.tileAdvBench.getStackInSlot(9); + ItemStack[] items = null; + if (plan != null) { + items = getShadowItems(plan); + } + + int bits = 0; + + for(int i = 0; i < 9; ++i) { + ItemStack test = this.tileAdvBench.getStackInSlot(i); + if (test != null) { + bits |= 1 << i; + } else if (items == null || items[i] == null) { + bits |= 1 << i; + } + } + + if (bits == 511) { + return 511; + } else { + for(int var9 = 0; var9 < 18; ++var9) { + ItemStack test = this.tileAdvBench.getStackInSlot(10 + var9); + if (test != null && test.stackSize != 0) { + int sc = test.stackSize; + + for(int j = 0; j < 9; ++j) { + if ((bits & 1 << j) <= 0) { + ItemStack st = this.tileAdvBench.getStackInSlot(j); + if (st == null) { + st = items[j]; + if (st != null && CoreLib.matchItemStackOre(st, test)) { + bits |= 1 << j; + if (--sc == 0) { + break; + } + } + } + } + } + } + } + + return bits; + } + } + + private int findMatch(ItemStack a) { + for(int i = 0; i < 18; ++i) { + ItemStack test = this.tileAdvBench.getStackInSlot(10 + i); + if (test != null && test.stackSize != 0 && CoreLib.matchItemStackOre(a, test)) { + return 10 + i; + } + } + + return -1; + } + + public void onCraftMatrixChanged(IInventory iinventory) { + ItemStack plan = this.tileAdvBench.getStackInSlot(9); + ItemStack[] items = null; + if (plan != null) { + items = getShadowItems(plan); + } + + for(int i = 0; i < 9; ++i) { + ItemStack tos = this.tileAdvBench.getStackInSlot(i); + if (tos == null && items != null && items[i] != null) { + int j = this.findMatch(items[i]); + if (j > 0) { + tos = this.tileAdvBench.getStackInSlot(j); + } + } + + this.fakeInv.setInventorySlotContents(i, tos); + } + + this.satisfyMask = this.getSatisfyMask(); + if (this.satisfyMask == 511) { + this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.fakeInv, this.tileAdvBench.getWorldObj())); + } else { + this.craftResult.setInventorySlotContents(0, (ItemStack)null); + } + + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i == 10) { + this.mergeCrafting(player, slot, 29, 65); + return null; + } + + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 11, 29, false)) { + return null; + } + } else if (i < 29) { + if (!this.mergeItemStack(itemstack1, 29, 65, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 11, 29, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + protected boolean canFit(ItemStack ist, int st, int ed) { + int ms = 0; + + for(int i = st; i < ed; ++i) { + Slot slot = (Slot)super.inventorySlots.get(i); + ItemStack is2 = slot.getStack(); + if (is2 == null) { + return true; + } + + if (CoreLib.compareItemStack(is2, ist) == 0) { + ms += is2.getMaxStackSize() - is2.stackSize; + if (ms >= ist.stackSize) { + return true; + } + } + } + + return false; + } + + protected void fitItem(ItemStack ist, int st, int ed) { + if (ist.isStackable()) { + for(int i = st; i < ed; ++i) { + Slot slot = (Slot)super.inventorySlots.get(i); + ItemStack is2 = slot.getStack(); + if (is2 != null && CoreLib.compareItemStack(is2, ist) == 0) { + int n = Math.min(ist.stackSize, ist.getMaxStackSize() - is2.stackSize); + if (n != 0) { + ist.stackSize -= n; + is2.stackSize += n; + slot.onSlotChanged(); + if (ist.stackSize == 0) { + return; + } + } + } + } + } + + for(int i = st; i < ed; ++i) { + Slot slot = (Slot)super.inventorySlots.get(i); + ItemStack is2 = slot.getStack(); + if (is2 == null) { + slot.putStack(ist); + slot.onSlotChanged(); + return; + } + } + + } + + protected void mergeCrafting(EntityPlayer player, Slot cslot, int st, int ed) { + int cc = 0; + ItemStack ist = cslot.getStack(); + if (ist != null && ist.stackSize != 0) { + ItemStack craftas = ist.copy(); + int mss = craftas.getMaxStackSize(); + if (mss == 1) { + mss = 16; + } + + do { + if (!this.canFit(ist, st, ed)) { + return; + } + + cc += ist.stackSize; + this.fitItem(ist, st, ed); + cslot.onPickupFromSlot(player, ist); + if (cc >= mss) { + return; + } + + if (this.slotCraft.isLastUse()) { + return; + } + + ist = cslot.getStack(); + if (ist == null || ist.stackSize == 0) { + return; + } + } while(CoreLib.compareItemStack(ist, craftas) == 0); + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + if (this.tileAdvBench.getWorldObj() != null && !this.tileAdvBench.getWorldObj().isRemote) { + try { + if (message.eventId == 1) { + ItemStack blank = this.tileAdvBench.getStackInSlot(9); + if (blank != null && blank.getItem() == RedPowerBase.itemPlanBlank) { + ItemStack plan = new ItemStack(RedPowerBase.itemPlanFull); + plan.stackTagCompound = new NBTTagCompound(); + NBTTagCompound result = new NBTTagCompound(); + this.craftResult.getStackInSlot(0).writeToNBT(result); + plan.stackTagCompound.setTag("result", result); + NBTTagList requires = new NBTTagList(); + + for(int i = 0; i < 9; ++i) { + ItemStack is1 = this.craftMatrix.getStackInSlot(i); + if (is1 != null) { + ItemStack ist = CoreLib.copyStack(is1, 1); + NBTTagCompound item = new NBTTagCompound(); + ist.writeToNBT(item); + item.setByte("Slot", (byte)i); + requires.appendTag(item); + } + } + + plan.stackTagCompound.setTag("requires", requires); + this.tileAdvBench.setInventorySlotContents(9, plan); + } + } + } catch (Throwable var10) { + } + } + + } + + public static class ContainerNull extends Container { + public boolean canInteractWith(EntityPlayer player) { + return false; + } + + public void onCraftMatrixChanged(IInventory inv) { + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + } + + public class InventorySubUpdate implements IInventory { + int size; + int start; + IInventory parent; + + public InventorySubUpdate(IInventory par, int st, int sz) { + this.parent = par; + this.start = st; + this.size = sz; + } + + public int getSizeInventory() { + return this.size; + } + + public ItemStack getStackInSlot(int idx) { + return this.parent.getStackInSlot(idx + this.start); + } + + public ItemStack decrStackSize(int idx, int num) { + ItemStack tr = this.parent.decrStackSize(idx + this.start, num); + if (tr != null) { + ContainerAdvBench.this.onCraftMatrixChanged(this); + } + + return tr; + } + + public ItemStack getStackInSlotOnClosing(int idx) { + return this.parent.getStackInSlotOnClosing(idx + this.start); + } + + public void setInventorySlotContents(int idx, ItemStack ist) { + this.parent.setInventorySlotContents(idx + this.start, ist); + ContainerAdvBench.this.onCraftMatrixChanged(this); + } + + public String getInventoryName() { + return this.parent.getInventoryName(); + } + + public int getInventoryStackLimit() { + return this.parent.getInventoryStackLimit(); + } + + public void markDirty() { + ContainerAdvBench.this.onCraftMatrixChanged(this); + this.parent.markDirty(); + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean hasCustomInventoryName() { + return true; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return true; + } + } + + public static class SlotPlan extends Slot { + public SlotPlan(IInventory inv, int i, int j, int k) { + super(inv, i, j, k); + } + + public boolean isItemValid(ItemStack ist) { + return ist.getItem() == RedPowerBase.itemPlanBlank || ist.getItem() == RedPowerBase.itemPlanFull; + } + + public int getSlotStackLimit() { + return 1; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ContainerAlloyFurnace.java b/src/main/java/com/eloraam/redpower/base/ContainerAlloyFurnace.java new file mode 100644 index 0000000..220fc2b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ContainerAlloyFurnace.java @@ -0,0 +1,115 @@ +package com.eloraam.redpower.base; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerAlloyFurnace extends Container { + private TileAlloyFurnace tileFurnace; + public int totalburn = 0; + public int burntime = 0; + public int cooktime = 0; + + public ContainerAlloyFurnace(InventoryPlayer inv, TileAlloyFurnace td) { + this.tileFurnace = td; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(td, j + i * 3, 48 + j * 18, 17 + i * 18)); + } + } + + this.addSlotToContainer(new Slot(td, 9, 17, 42)); + this.addSlotToContainer(new SlotAlloyFurnace(inv.player, td, 10, 141, 35)); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileFurnace.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 11) { + if (!this.mergeItemStack(itemstack1, 11, 47, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List )super.crafters) { + if (this.totalburn != this.tileFurnace.totalburn) { + ic.sendProgressBarUpdate(this, 0, this.tileFurnace.totalburn); + } + + if (this.burntime != this.tileFurnace.burntime) { + ic.sendProgressBarUpdate(this, 1, this.tileFurnace.burntime); + } + + if (this.cooktime != this.tileFurnace.cooktime) { + ic.sendProgressBarUpdate(this, 2, this.tileFurnace.cooktime); + } + } + + this.totalburn = this.tileFurnace.totalburn; + this.cooktime = this.tileFurnace.cooktime; + this.burntime = this.tileFurnace.burntime; + } + + public void updateProgressBar(int id, int value) { + switch(id) { + case 0: + this.tileFurnace.totalburn = value; + break; + case 1: + this.tileFurnace.burntime = value; + break; + case 2: + this.tileFurnace.cooktime = value; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ContainerBag.java b/src/main/java/com/eloraam/redpower/base/ContainerBag.java new file mode 100644 index 0000000..20894b0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ContainerBag.java @@ -0,0 +1,107 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.SlotLocked; +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 ContainerBag extends Container { + private ItemStack itemBag; + private int hotbarIndex; + + public ContainerBag(InventoryPlayer inv, IInventory bag, ItemStack stack) { + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new ContainerBag.SlotBag(bag, j + i * 9, 8 + j * 18, 18 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 86 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + if (inv.currentItem == i) { + this.addSlotToContainer(new SlotLocked(inv, i, 8 + i * 18, 144)); + } else { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 144)); + } + } + + this.itemBag = stack; + this.hotbarIndex = inv.currentItem; + } + + public boolean canInteractWith(EntityPlayer player) { + return player.worldObj.isRemote || this.itemBag == player.getHeldItem(); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) { + if (!player.worldObj.isRemote && this.itemBag != player.getHeldItem()) { + player.closeScreen(); + return null; + } else { + ItemStack result = null; + Slot slot = (Slot)super.inventorySlots.get(slotId); + if (slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + if (slotStack.getItem() instanceof ItemBag) { + return null; + } + + result = slotStack.copy(); + if (slotId < 27) { + if (!this.mergeItemStack(slotStack, 27, 63, true)) { + return null; + } + } else if (!this.mergeItemStack(slotStack, 0, 27, false)) { + return null; + } + + if (slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (slotStack.stackSize == result.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, slotStack); + } + + return result; + } + } + + public ItemStack slotClick(int slotId, int dragModeOrBtn, int mode, EntityPlayer player) { + if (!this.canInteractWith(player)) { + return null; + } else { + if (mode == 2 && dragModeOrBtn >= 0 && dragModeOrBtn < 9) { + Slot hotbarSlot = this.getSlot(54 + dragModeOrBtn); + if (hotbarSlot instanceof SlotLocked) { + return null; + } + } + + return super.slotClick(slotId, dragModeOrBtn, mode, player); + } + } + + public static class SlotBag extends Slot { + public SlotBag(IInventory inv, int index, int x, int y) { + super(inv, index, x, y); + } + + public boolean isItemValid(ItemStack stack) { + return !(stack.getItem() instanceof ItemBag); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ContainerBusId.java b/src/main/java/com/eloraam/redpower/base/ContainerBusId.java new file mode 100644 index 0000000..bffe425 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ContainerBusId.java @@ -0,0 +1,66 @@ +package com.eloraam.redpower.base; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ContainerBusId extends Container implements IHandleGuiEvent { + private IRedbusConnectable rbConn; + private int addr = 0; + + public ContainerBusId(IInventory inv, IRedbusConnectable irc) { + this.rbConn = irc; + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return true; + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + return null; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.rbConn.rbGetAddr() != this.addr) { + ic.sendProgressBarUpdate(this, 0, this.rbConn.rbGetAddr()); + } + } + + this.addr = this.rbConn.rbGetAddr(); + } + + public void updateProgressBar(int id, int value) { + switch(id) { + case 0: + this.rbConn.rbSetAddr(value); + return; + } + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + if (message.eventId != 1) { + return; + } + + this.rbConn.rbSetAddr(message.parameters[0]); + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/base/GuiAdvBench.java b/src/main/java/com/eloraam/redpower/base/GuiAdvBench.java new file mode 100644 index 0000000..eb77b31 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/GuiAdvBench.java @@ -0,0 +1,114 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiAdvBench extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpbase", "textures/gui/advbench.png"); + private TileAdvBench bench; + + public GuiAdvBench(InventoryPlayer pli, TileAdvBench td) { + super(new ContainerAdvBench(pli, td)); + this.bench = td; + super.ySize = 222; + } + + public GuiAdvBench(Container cn) { + super(cn); + super.ySize = 222; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpabench.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + ItemStack plan = super.inventorySlots.getSlot(9).getStack(); + ItemStack craft = super.inventorySlots.getSlot(10).getStack(); + if (plan != null && craft != null && plan.getItem() == RedPowerBase.itemPlanBlank) { + this.drawTexturedModalRect(j + 18, k + 55, 176, 0, 14, 14); + } + + if (plan != null && plan.getItem() == RedPowerBase.itemPlanFull) { + ContainerAdvBench cont = (ContainerAdvBench)super.inventorySlots; + ItemStack[] ist = ContainerAdvBench.getShadowItems(plan); + RenderHelper.enableGUIStandardItemLighting(); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glEnable(32826); + GL11.glEnable(2896); + GL11.glEnable(2929); + + for(int n = 0; n < 9; ++n) { + if (ist[n] != null) { + Slot sl = super.inventorySlots.getSlot(n); + if (sl.getStack() == null) { + int slx = sl.xDisplayPosition + j; + int sly = sl.yDisplayPosition + k; + GuiScreen.itemRender.renderItemIntoGUI(super.fontRendererObj, super.mc.renderEngine, ist[n], slx, sly); + GuiScreen.itemRender.renderItemOverlayIntoGUI(super.fontRendererObj, super.mc.renderEngine, ist[n], slx, sly); + } + } + } + + GL11.glDisable(2896); + GL11.glDisable(2929); + GL11.glEnable(3042); + super.mc.renderEngine.bindTexture(res); + + for(int n = 0; n < 9; ++n) { + if (ist[n] != null) { + Slot sl = super.inventorySlots.getSlot(n); + if (sl.getStack() == null) { + int slx = sl.xDisplayPosition; + int sly = sl.yDisplayPosition; + if ((cont.satisfyMask & 1 << n) > 0) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + } else { + GL11.glColor4f(1.0F, 0.1F, 0.1F, 0.6F); + } + + this.drawTexturedModalRect(j + slx, k + sly, slx, sly, 16, 16); + } + } + } + + GL11.glDisable(3042); + } + + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x >= 18 && y >= 55 && x <= 32 && y <= 69) { + ItemStack plan = super.inventorySlots.getSlot(9).getStack(); + ItemStack craft = super.inventorySlots.getSlot(10).getStack(); + if (plan == null || craft == null || plan.getItem() != RedPowerBase.itemPlanBlank) { + return; + } + + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId)); + } + + super.mouseClicked(i, j, k); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/GuiAlloyFurnace.java b/src/main/java/com/eloraam/redpower/base/GuiAlloyFurnace.java new file mode 100644 index 0000000..fc8a5cb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/GuiAlloyFurnace.java @@ -0,0 +1,42 @@ +package com.eloraam.redpower.base; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiAlloyFurnace extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpbase", "textures/gui/afurnacegui.png"); + private TileAlloyFurnace furnace; + + public GuiAlloyFurnace(InventoryPlayer pli, TileAlloyFurnace td) { + super(new ContainerAlloyFurnace(pli, td)); + this.furnace = td; + } + + public GuiAlloyFurnace(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpafurnace.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + if (this.furnace.burntime > 0) { + int i1 = this.furnace.getBurnScaled(12); + this.drawTexturedModalRect(j + 17, k + 25 + 12 - i1, 176, 12 - i1, 14, i1 + 2); + } + + int i1 = this.furnace.getCookScaled(24); + this.drawTexturedModalRect(j + 107, k + 34, 176, 14, i1 + 1, 16); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/GuiBag.java b/src/main/java/com/eloraam/redpower/base/GuiBag.java new file mode 100644 index 0000000..ec489f4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/GuiBag.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.base; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBag extends GuiContainer { + private static ResourceLocation res = new ResourceLocation("rpbase", "textures/gui/baggui.png"); + + public GuiBag(InventoryPlayer pli, IInventory td) { + super(new ContainerBag(pli, td, null)); + super.ySize = 167; + } + + public GuiBag(Container cn) { + super(cn); + super.ySize = 167; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("item.rpBag.name", new Object[0]), 8, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 94 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int halfWidth = (super.width - super.xSize) / 2; + int halfHeight = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(halfWidth, halfHeight, 0, 0, super.xSize, super.ySize); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/GuiBusId.java b/src/main/java/com/eloraam/redpower/base/GuiBusId.java new file mode 100644 index 0000000..95e14d7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/GuiBusId.java @@ -0,0 +1,76 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBusId extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpbase", "textures/gui/idgui.png"); + private IRedbusConnectable rbConn; + private TileEntity tile; + + public GuiBusId(InventoryPlayer pli, IRedbusConnectable irc, TileEntity tile) { + super(new ContainerBusId(pli, irc)); + this.rbConn = irc; + this.tile = tile; + super.ySize = 81; + super.xSize = 123; + } + + public GuiBusId(Container cn) { + super(cn); + super.ySize = 81; + super.xSize = 123; + } + + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + super.fontRendererObj.drawString(I18n.format("gui.busid", new Object[0]), 32, 6, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int bits = this.rbConn.rbGetAddr() & 0xFF; + + for(int n = 0; n < 8; ++n) { + if ((bits & 1 << n) != 0) { + this.drawTexturedModalRect(j + 16 + n * 12, k + 25, 123, 0, 8, 16); + } + } + + this.drawCenteredString(super.fontRendererObj, String.format("ID: %d", bits), super.width / 2, k + 60, -1); + } + + private void sendAddr() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, (byte)this.rbConn.rbGetAddr())); + } + + } + + protected void mouseClicked(int mouseX, int mouseY, int button) { + int x = mouseX - (super.width - super.xSize) / 2; + int y = mouseY - (super.height - super.ySize) / 2; + if (y >= 25 && y <= 41) { + for(int n = 0; n < 8; ++n) { + if (x >= 16 + n * 12 && x <= 24 + n * 12) { + this.rbConn.rbSetAddr(this.rbConn.rbGetAddr() ^ 1 << n); + this.sendAddr(); + return; + } + } + } + + super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/InventorySubCraft.java b/src/main/java/com/eloraam/redpower/base/InventorySubCraft.java new file mode 100644 index 0000000..7e887aa --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/InventorySubCraft.java @@ -0,0 +1,48 @@ +package com.eloraam.redpower.base; + +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; + +public class InventorySubCraft extends InventoryCrafting { + private Container eventHandler; + private IInventory parent; + + public InventorySubCraft(Container container, IInventory par) { + super(container, 3, 3); + this.parent = par; + this.eventHandler = container; + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int i) { + return i >= 9 ? null : this.parent.getStackInSlot(i); + } + + public ItemStack getStackInRowAndColumn(int i, int j) { + if (i >= 0 && i < 3) { + int k = i + j * 3; + return this.getStackInSlot(k); + } else { + return null; + } + } + + public ItemStack decrStackSize(int i, int j) { + ItemStack tr = this.parent.decrStackSize(i, j); + if (tr != null) { + this.eventHandler.onCraftMatrixChanged(this); + } + + return tr; + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.parent.setInventorySlotContents(i, ist); + this.eventHandler.onCraftMatrixChanged(this); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemBag.java b/src/main/java/com/eloraam/redpower/base/ItemBag.java new file mode 100644 index 0000000..9de6dcf --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemBag.java @@ -0,0 +1,185 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +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.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBag extends Item { + private IIcon[] icons = new IIcon[16]; + + public ItemBag() { + this.setMaxStackSize(1); + this.setHasSubtypes(true); + this.setUnlocalizedName("rpBag"); + this.setCreativeTab(CreativeTabs.tabMisc); + } + + public static IInventory getBagInventory(ItemStack ist, EntityPlayer player) { + return !(ist.getItem() instanceof ItemBag) ? null : ((ItemBag)ist.getItem()).new InventoryBag(ist, player); + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister registerer) { + for(int color = 0; color < 16; ++color) { + this.icons[color] = registerer.registerIcon("rpbase:bag/" + color); + } + + } + + public int getMaxItemUseDuration(ItemStack ist) { + return 1; + } + + public IIcon getIconFromDamage(int meta) { + return this.icons[meta % this.icons.length]; + } + + public ItemStack onItemRightClick(ItemStack ist, World world, EntityPlayer player) { + if (!world.isRemote && !player.isSneaking()) { + player.openGui(RedPowerBase.instance, 4, world, 0, 0, 0); + } + + return ist; + } + + public class InventoryBag implements IInventory { + ItemStack bagitem; + ItemStack[] items; + EntityPlayer player; + + InventoryBag(ItemStack ist, EntityPlayer host) { + this.bagitem = ist; + this.player = host; + this.unpackInventory(); + } + + private void unpackInventory() { + this.items = new ItemStack[27]; + if (this.bagitem.stackTagCompound != null) { + NBTTagList list = this.bagitem.stackTagCompound.getTagList("contents", 10); + + for(int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound item = list.getCompoundTagAt(i); + byte slt = item.getByte("Slot"); + if (slt < 27) { + this.items[slt] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + } + + private void packInventory() { + if (this.bagitem.stackTagCompound == null) { + this.bagitem.setTagCompound(new NBTTagCompound()); + } + + NBTTagList contents = new NBTTagList(); + + for(int i = 0; i < 27; ++i) { + if (this.items[i] != null) { + NBTTagCompound cpd = new NBTTagCompound(); + this.items[i].writeToNBT(cpd); + cpd.setByte("Slot", (byte)i); + contents.appendTag(cpd); + } + } + + this.bagitem.stackTagCompound.setTag("contents", contents); + } + + public int getSizeInventory() { + return 27; + } + + public ItemStack getStackInSlot(int slot) { + return this.items[slot]; + } + + public ItemStack decrStackSize(int slot, int num) { + if (this.bagitem != this.player.getHeldItem()) { + this.markDirty(); + this.player.closeScreen(); + return null; + } else if (this.items[slot] == null) { + return null; + } else if (this.items[slot].stackSize <= num) { + ItemStack tr = this.items[slot]; + this.items[slot] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.items[slot].splitStack(num); + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int slot) { + if (this.items[slot] == null) { + return null; + } else { + ItemStack tr = this.items[slot]; + this.items[slot] = null; + return tr; + } + } + + public void setInventorySlotContents(int slot, ItemStack ist) { + if (this.bagitem != this.player.getHeldItem()) { + this.markDirty(); + this.player.closeScreen(); + } else { + this.items[slot] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + } + } + + public String getInventoryName() { + return "item.rpBag.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public void markDirty() { + this.packInventory(); + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return this.bagitem == this.player.getHeldItem(); + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return this.bagitem != null && stack.getItem() != ItemBag.this; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemDrawplate.java b/src/main/java/com/eloraam/redpower/base/ItemDrawplate.java new file mode 100644 index 0000000..79e85d2 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemDrawplate.java @@ -0,0 +1,18 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.ItemPartialCraft; +import net.minecraft.creativetab.CreativeTabs; + +public class ItemDrawplate extends ItemPartialCraft { + public ItemDrawplate() { + this.setCreativeTab(CreativeTabs.tabTools); + } + + public boolean isFull3D() { + return true; + } + + public boolean shouldRotateAroundWhenRendering() { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemDyeIndigo.java b/src/main/java/com/eloraam/redpower/base/ItemDyeIndigo.java new file mode 100644 index 0000000..941f072 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemDyeIndigo.java @@ -0,0 +1,31 @@ +package com.eloraam.redpower.base; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntitySheep; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemDyeIndigo extends Item { + public ItemDyeIndigo() { + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setUnlocalizedName("dyeIndigo"); + this.setTextureName("rpbase:dyeIndigo"); + this.setCreativeTab(CreativeTabs.tabMaterials); + } + + public boolean itemInteractionForEntity(ItemStack ist, EntityPlayer player, EntityLivingBase entity) { + if (ist.getItemDamage() == 0 && entity instanceof EntitySheep) { + EntitySheep entitysheep = (EntitySheep)entity; + if (!entitysheep.getSheared() && entitysheep.getFleeceColor() != 11) { + entitysheep.setFleeceColor(11); + --ist.stackSize; + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemHandsaw.java b/src/main/java/com/eloraam/redpower/base/ItemHandsaw.java new file mode 100644 index 0000000..ab5bb6d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemHandsaw.java @@ -0,0 +1,25 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.ItemPartialCraft; +import net.minecraft.creativetab.CreativeTabs; + +public class ItemHandsaw extends ItemPartialCraft { + private int sharp; + + public ItemHandsaw(int sh) { + this.sharp = sh; + this.setCreativeTab(CreativeTabs.tabTools); + } + + public boolean isFull3D() { + return true; + } + + public boolean shouldRotateAroundWhenRendering() { + return true; + } + + public int getSharpness() { + return this.sharp; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemMicro.java b/src/main/java/com/eloraam/redpower/base/ItemMicro.java new file mode 100644 index 0000000..9836093 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemMicro.java @@ -0,0 +1,276 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.ICoverable; +import com.eloraam.redpower.core.IMicroPlacement; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; +import net.minecraftforge.event.world.BlockEvent.PlaceEvent; + +public class ItemMicro extends ItemBlock { + private IMicroPlacement[] placers = new IMicroPlacement[256]; + + public ItemMicro(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + private boolean useCover(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side) { + MovingObjectPosition pos = CoreLib.retraceBlock(world, player, x, y, z); + if (pos == null) { + return false; + } else if (pos.typeOfHit != MovingObjectType.BLOCK) { + return false; + } else { + pos = CoverLib.getPlacement(world, pos, ist.getItemDamage()); + if (pos == null) { + return false; + } else { + Block oldBlock = world.getBlock(pos.blockX, pos.blockY, pos.blockZ); + if (world.canPlaceEntityOnSide(oldBlock, pos.blockX, pos.blockY, pos.blockZ, false, side, player, ist)) { + world.setBlock(pos.blockX, pos.blockY, pos.blockZ, RedPowerBase.blockMicro, 0, 3); + } + + TileEntity te = world.getTileEntity(pos.blockX, pos.blockY, pos.blockZ); + Block newBlock = world.getBlock(pos.blockX, pos.blockY, pos.blockZ); + int newMeta = world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ); + if (!(te instanceof ICoverable)) { + return false; + } else { + ICoverable icv = (ICoverable)te; + PlayerInteractEvent event = new PlayerInteractEvent(player, Action.RIGHT_CLICK_BLOCK, pos.blockX, pos.blockY, pos.blockZ, side, world); + if (!MinecraftForge.EVENT_BUS.post(event)) { + NBTTagCompound nbt = new NBTTagCompound(); + te.writeToNBT(nbt); + BlockSnapshot snapshot = new BlockSnapshot(world, pos.blockX, pos.blockY, pos.blockZ, newBlock, newMeta, nbt); + PlaceEvent plvt = new PlaceEvent(snapshot, oldBlock, player); + if (!MinecraftForge.EVENT_BUS.post(plvt)) { + if (icv.tryAddCover(pos.subHit, CoverLib.damageToCoverValue(ist.getItemDamage()))) { + if (!player.capabilities.isCreativeMode) { + --ist.stackSize; + } + + CoreLib.placeNoise(world, pos.blockX, pos.blockY, pos.blockZ, CoverLib.getBlock(ist.getItemDamage() & 0xFF)); + RedPowerLib.updateIndirectNeighbors(world, pos.blockX, pos.blockY, pos.blockZ, RedPowerBase.blockMicro); + world.markBlockForUpdate(pos.blockX, pos.blockY, pos.blockZ); + return true; + } + + return false; + } + } + + return false; + } + } + } + } + + @SideOnly(Side.CLIENT) + public boolean func_150936_a(World world, int x, int y, int z, int side, EntityPlayer player, ItemStack ist) { + return true; + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return player != null && !player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + private boolean itemUseShared(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side) { + int hb = ist.getItemDamage(); + hb >>= 8; + return hb != 0 && (hb < 16 || hb > 45) + ? this.placers[hb] != null && this.placers[hb].onPlaceMicro(ist, player, world, new WorldCoord(x, y, z), side) + : this.useCover(ist, player, world, x, y, z, side); + } + + private String getMicroName(int hb) { + switch(hb) { + case 0: + return "rpcover"; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + default: + return null; + case 16: + return "rppanel"; + case 17: + return "rpslab"; + case 18: + return "rpcovc"; + case 19: + return "rppanc"; + case 20: + return "rpslabc"; + case 21: + return "rpcovs"; + case 22: + return "rppans"; + case 23: + return "rpslabs"; + case 24: + return "rphcover"; + case 25: + return "rphpanel"; + case 26: + return "rphslab"; + case 27: + return "rpcov3"; + case 28: + return "rpcov5"; + case 29: + return "rpcov6"; + case 30: + return "rpcov7"; + case 31: + return "rphcov3"; + case 32: + return "rphcov5"; + case 33: + return "rphcov6"; + case 34: + return "rphcov7"; + case 35: + return "rpcov3c"; + case 36: + return "rpcov5c"; + case 37: + return "rpcov6c"; + case 38: + return "rpcov7c"; + case 39: + return "rpcov3s"; + case 40: + return "rpcov5s"; + case 41: + return "rpcov6s"; + case 42: + return "rpcov7s"; + case 43: + return "rppole1"; + case 44: + return "rppole2"; + case 45: + return "rppole3"; + } + } + + public String getUnlocalizedName(ItemStack ist) { + int hb = ist.getItemDamage(); + int lb = hb & 0xFF; + hb >>= 8; + String stub = this.getMicroName(hb); + if (stub != null) { + String name = CoverLib.getName(lb); + if (name == null) { + throw new IndexOutOfBoundsException(); + } else { + return "tile." + stub + "." + name; + } + } else if (this.placers[hb] == null) { + throw new IndexOutOfBoundsException(); + } else { + String name = this.placers[hb].getMicroName(hb, lb); + if (name == null) { + throw new IndexOutOfBoundsException(); + } else { + return name; + } + } + } + + public void registerPlacement(int md, IMicroPlacement imp) { + this.placers[md] = imp; + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs tab, List list) { + if (tab != CreativeExtraTabs.tabWires && tab != CreativeExtraTabs.tabMachine) { + if (tab == CreativeExtraTabs.tabMicros) { + for(int i = 0; i < 255; ++i) { + String stub = CoverLib.getName(i); + if (stub != null) { + list.add(new ItemStack(RedPowerBase.blockMicro, 1, i)); + } + } + + for(int i = 1; i < 255; ++i) { + String stub = this.getMicroName(i); + if (stub != null) { + list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8)); + } + } + + for(int i = 1; i < 255; ++i) { + String stub = this.getMicroName(i); + if (stub != null) { + list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 2)); + } + } + + for(int i = 1; i < 255; ++i) { + String stub = this.getMicroName(i); + if (stub != null) { + list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 23)); + } + } + + for(int i = 1; i < 255; ++i) { + String stub = this.getMicroName(i); + if (stub != null) { + list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 26)); + } + } + } + } else { + for(int i = 0; i < 255; ++i) { + if (this.placers[i] != null) { + this.placers[i].addCreativeItems(i, tab, list); + } + } + } + + } + + public CreativeTabs[] getCreativeTabs() { + return new CreativeTabs[]{CreativeExtraTabs.tabWires, CreativeExtraTabs.tabMicros, CreativeExtraTabs.tabMachine}; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemPlan.java b/src/main/java/com/eloraam/redpower/base/ItemPlan.java new file mode 100644 index 0000000..adeae92 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemPlan.java @@ -0,0 +1,74 @@ +package com.eloraam.redpower.base; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class ItemPlan extends Item { + public ItemPlan() { + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setUnlocalizedName("planFull"); + this.setTextureName("rpbase:planFull"); + this.setMaxStackSize(1); + } + + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack ist) { + if (ist.stackTagCompound == null) { + return super.getItemStackDisplayName(ist); + } else if (!ist.stackTagCompound.hasKey("result")) { + return super.getItemStackDisplayName(ist); + } else { + NBTTagCompound res = ist.stackTagCompound.getCompoundTag("result"); + ItemStack result = ItemStack.loadItemStackFromNBT(res); + return result.getItem().getItemStackDisplayName(result) + " Plan"; + } + } + + public void addInformation(ItemStack ist, EntityPlayer player, List lines, boolean par4) { + if (ist.stackTagCompound != null) { + NBTTagList require = ist.stackTagCompound.getTagList("requires", 10); + if (require != null) { + HashMap, Integer> counts = new HashMap(); + + for(int i = 0; i < require.tagCount(); ++i) { + NBTTagCompound kv = require.getCompoundTagAt(i); + ItemStack li = ItemStack.loadItemStackFromNBT(kv); + HashMap i2d = new HashMap(); + i2d.put(li.getItem(), li.getItemDamage()); + Integer lc = (Integer)counts.get(i2d); + if (lc == null) { + lc = 0; + } + + counts.put(i2d, lc + 1); + } + + for(Entry, Integer> entry : counts.entrySet()) { + HashMap keySet = (HashMap)entry.getKey(); + ItemStack itemStack = new ItemStack((Item)keySet.keySet().iterator().next(), 1, keySet.values().iterator().next()); + lines.add(entry.getValue() + " x " + itemStack.getItem().getItemStackDisplayName(itemStack)); + } + } + } + + } + + @SideOnly(Side.CLIENT) + public EnumRarity getRarity(ItemStack ist) { + return EnumRarity.rare; + } + + public boolean getShareTag() { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/ItemScrewdriver.java b/src/main/java/com/eloraam/redpower/base/ItemScrewdriver.java new file mode 100644 index 0000000..edcef1a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/ItemScrewdriver.java @@ -0,0 +1,105 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.control.TileCPU; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.IRotatable; +import com.google.common.collect.Multimap; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ItemScrewdriver extends Item { + public ItemScrewdriver() { + this.setMaxDamage(200); + this.setMaxStackSize(1); + this.setCreativeTab(CreativeTabs.tabTools); + this.setUnlocalizedName("screwdriver"); + this.setTextureName("rpbase:screwdriver"); + } + + public boolean hitEntity(ItemStack ist, EntityLivingBase ent, EntityLivingBase hitter) { + ist.damageItem(8, hitter); + return true; + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + if (!world.isRemote) { + boolean sec = false; + if (player != null && player.isSneaking()) { + sec = true; + } + + Block bid = world.getBlock(x, y, z); + int md = world.getBlockMetadata(x, y, z); + if (bid == Blocks.unpowered_repeater || bid == Blocks.powered_repeater) { + world.setBlock(x, y, z, bid, md & 12 | md + 1 & 3, 3); + ist.damageItem(1, player); + return true; + } else if (bid == Blocks.dispenser) { + md = md & 3 ^ md >> 2; + md += 2; + world.setBlock(x, y, z, bid, md, 3); + ist.damageItem(1, player); + return true; + } else if (bid != Blocks.piston && bid != Blocks.sticky_piston) { + if (player.isSneaking()) { + IRedbusConnectable irb = CoreLib.getTileEntity(world, x, y, z, IRedbusConnectable.class); + if (irb != null && !(irb instanceof TileCPU)) { + player.openGui(RedPowerBase.instance, 3, world, x, y, z); + return true; + } + } + + IRotatable ir = CoreLib.getTileEntity(world, x, y, z, IRotatable.class); + if (ir == null) { + return false; + } else { + MovingObjectPosition mop = CoreLib.retraceBlock(world, player, x, y, z); + if (mop == null) { + return false; + } else { + int rm = ir.getPartMaxRotation(mop.subHit, sec); + if (rm == 0) { + return false; + } else { + int r = ir.getPartRotation(mop.subHit, sec); + if (++r > rm) { + r = 0; + } + + ir.setPartRotation(mop.subHit, sec, r); + ist.damageItem(1, player); + return true; + } + } + } + } else { + if (++md > 5) { + md = 0; + } + + world.setBlock(x, y, z, bid, md, 3); + ist.damageItem(1, player); + return true; + } + } else { + return false; + } + } + + public Multimap getAttributeModifiers(ItemStack stack) { + Multimap map = super.getAttributeModifiers(stack); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(Item.field_111210_e, "Weapon modifier", 4.0, 0)); + return map; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/RecipeBag.java b/src/main/java/com/eloraam/redpower/base/RecipeBag.java new file mode 100644 index 0000000..2e4614c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/RecipeBag.java @@ -0,0 +1,66 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import net.minecraft.init.Items; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; + +public class RecipeBag implements IRecipe { + public int getRecipeSize() { + return 2; + } + + public ItemStack getRecipeOutput() { + return new ItemStack(RedPowerBase.itemBag, 1, 0); + } + + private ItemStack findResult(InventoryCrafting inv) { + ItemStack bag = null; + int color = -1; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + ItemStack ist = inv.getStackInRowAndColumn(i, j); + if (ist != null) { + if (ist.getItem() instanceof ItemBag) { + if (bag != null) { + return null; + } + + bag = ist; + } else { + if (ist.getItem() != Items.dye) { + return null; + } + + if (color >= 0) { + return null; + } + + color = 15 - ist.getItemDamage(); + } + } + } + } + + if (bag == null || color < 0) { + return null; + } else if (bag.getItemDamage() == color) { + return null; + } else { + bag = bag.copy(); + bag.setItemDamage(color); + return bag; + } + } + + public ItemStack getCraftingResult(InventoryCrafting inv) { + return this.findResult(inv).copy(); + } + + public boolean matches(InventoryCrafting inv, World world) { + return this.findResult(inv) != null; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/RenderAdvBench.java b/src/main/java/com/eloraam/redpower/base/RenderAdvBench.java new file mode 100644 index 0000000..2ed40c4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/RenderAdvBench.java @@ -0,0 +1,79 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderAdvBench extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderAdvBench(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileAdvBench bench = (TileAdvBench)tile; + World world = bench.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, bench.xCoord, bench.yCoord, bench.zCoord); + this.context + .setIcon( + RedPowerBase.projectTableBottom, + RedPowerBase.projectTableTop, + RedPowerBase.projectTableFront, + RedPowerBase.projectTableSide, + RedPowerBase.projectTableSide, + RedPowerBase.projectTableSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(bench.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerBase.projectTableBottom, + RedPowerBase.projectTableTop, + RedPowerBase.projectTableSide, + RedPowerBase.projectTableSide, + RedPowerBase.projectTableSide, + RedPowerBase.projectTableFront + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/RenderAlloyFurnace.java b/src/main/java/com/eloraam/redpower/base/RenderAlloyFurnace.java new file mode 100644 index 0000000..326e47d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/RenderAlloyFurnace.java @@ -0,0 +1,111 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderAlloyFurnace extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderAlloyFurnace(Block block) { + super(block); + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + TileAlloyFurnace tb = CoreLib.getTileEntity(world, x, y, z, TileAlloyFurnace.class); + if (tb != null && tb.Active) { + float f = (float)x + 0.5F; + float f1 = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F; + float f2 = (float)z + 0.5F; + float f3 = 0.52F; + float f4 = random.nextFloat() * 0.6F - 0.3F; + switch(tb.Rotation) { + case 0: + world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0, 0.0, 0.0); + world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0, 0.0, 0.0); + break; + case 1: + world.spawnParticle("smoke", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0, 0.0, 0.0); + world.spawnParticle("flame", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0, 0.0, 0.0); + break; + case 2: + world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0, 0.0, 0.0); + world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0, 0.0, 0.0); + break; + case 3: + world.spawnParticle("smoke", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0, 0.0, 0.0); + world.spawnParticle("flame", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0, 0.0, 0.0); + } + } + + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileAlloyFurnace alloyFurnace = (TileAlloyFurnace)tile; + World world = alloyFurnace.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, alloyFurnace.xCoord, alloyFurnace.yCoord, alloyFurnace.zCoord); + this.context + .setIcon( + RedPowerBase.alloyFurnaceVert, + RedPowerBase.alloyFurnaceVert, + alloyFurnace.Active ? RedPowerBase.alloyFurnaceFrontOn : RedPowerBase.alloyFurnaceFront, + RedPowerBase.alloyFurnaceSide, + RedPowerBase.alloyFurnaceSide, + RedPowerBase.alloyFurnaceSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(alloyFurnace.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerBase.alloyFurnaceVert, + RedPowerBase.alloyFurnaceVert, + RedPowerBase.alloyFurnaceSide, + RedPowerBase.alloyFurnaceSide, + RedPowerBase.alloyFurnaceSide, + RedPowerBase.alloyFurnaceFront + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/SlotAlloyFurnace.java b/src/main/java/com/eloraam/redpower/base/SlotAlloyFurnace.java new file mode 100644 index 0000000..553bbf4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/SlotAlloyFurnace.java @@ -0,0 +1,45 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.AchieveLib; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotAlloyFurnace extends Slot { + private EntityPlayer thePlayer; + int totalCrafted; + + public SlotAlloyFurnace(EntityPlayer player, IInventory inv, int x, int y, int z) { + super(inv, x, y, z); + this.thePlayer = player; + } + + public boolean isItemValid(ItemStack ist) { + return false; + } + + public ItemStack decrStackSize(int num) { + if (this.getHasStack()) { + this.totalCrafted += Math.min(num, this.getStack().stackSize); + } + + return super.decrStackSize(num); + } + + public void onPickupFromSlot(EntityPlayer player, ItemStack ist) { + this.onCrafting(ist); + super.onPickupFromSlot(player, ist); + } + + protected void onCrafting(ItemStack ist, int num) { + this.totalCrafted += num; + this.onCrafting(ist); + } + + protected void onCrafting(ItemStack ist) { + ist.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.totalCrafted); + this.totalCrafted = 0; + AchieveLib.onAlloy(this.thePlayer, ist); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/SlotCraftRefill.java b/src/main/java/com/eloraam/redpower/base/SlotCraftRefill.java new file mode 100644 index 0000000..c58f555 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/SlotCraftRefill.java @@ -0,0 +1,133 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.core.CoreLib; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.SlotCrafting; +import net.minecraft.item.ItemStack; + +public class SlotCraftRefill extends SlotCrafting { + private IInventory inv; + private IInventory craftingMatrix; + private ContainerAdvBench bench; + + public SlotCraftRefill(EntityPlayer player, IInventory matrix, IInventory result, IInventory all, ContainerAdvBench evh, int id, int x, int y) { + super(player, matrix, result, id, x, y); + this.inv = all; + this.craftingMatrix = matrix; + this.bench = evh; + } + + private int findMatch(ItemStack a) { + for(int i = 0; i < 18; ++i) { + ItemStack test = this.inv.getStackInSlot(10 + i); + if (test != null && test.stackSize != 0 && CoreLib.matchItemStackOre(a, test)) { + return 10 + i; + } + } + + return -1; + } + + public boolean isLastUse() { + int bits = 0; + + for(int i = 0; i < 9; ++i) { + ItemStack test = this.inv.getStackInSlot(i); + if (test == null) { + bits |= 1 << i; + } else if (!test.isStackable()) { + bits |= 1 << i; + } else if (test.stackSize > 1) { + bits |= 1 << i; + } + } + + if (bits == 511) { + return false; + } else { + for(int i = 0; i < 18; ++i) { + ItemStack test = this.inv.getStackInSlot(10 + i); + if (test != null && test.stackSize != 0) { + int sc = test.stackSize; + + for(int j = 0; j < 9; ++j) { + if ((bits & 1 << j) <= 0) { + ItemStack st = this.inv.getStackInSlot(j); + if (st != null && CoreLib.matchItemStackOre(st, test)) { + bits |= 1 << j; + if (--sc == 0) { + break; + } + } + } + } + } + } + + return bits != 511; + } + } + + public void onPickupFromSlot(EntityPlayer player, ItemStack ist) { + ItemStack[] plan = this.bench.getPlanItems(); + ItemStack[] cur = new ItemStack[9]; + + for(int i = 0; i < 9; ++i) { + ItemStack idx = this.inv.getStackInSlot(i); + if (idx == null) { + cur[i] = null; + } else { + cur[i] = idx.copy(); + } + } + + boolean lastUse = this.isLastUse(); + if (plan != null) { + for(int i = 0; i < 9; ++i) { + if (cur[i] == null && plan[i] != null) { + int m = this.findMatch(plan[i]); + if (m >= 0) { + ItemStack ch = this.inv.getStackInSlot(m); + if (ch != null) { + this.inv.decrStackSize(m, 1); + if (ch.getItem().getContainerItem() != null) { + ItemStack s = ch.getItem().getContainerItem(ch); + this.inv.setInventorySlotContents(m, s); + } + } + } + } + } + } + + super.onPickupFromSlot(player, ist); + if (!lastUse) { + for(int i = 0; i < 9; ++i) { + if (cur[i] != null) { + ItemStack nsl = this.inv.getStackInSlot(i); + if (plan == null || plan[i] == null) { + if (nsl != null) { + if (!CoreLib.matchItemStackOre(nsl, cur[i]) && cur[i].getItem().getContainerItem() != null) { + ItemStack ctr = cur[i].getItem().getContainerItem(cur[i]); + if (ctr != null && ctr.getItem() == nsl.getItem()) { + int id = this.findMatch(cur[i]); + if (id >= 0) { + this.inv.setInventorySlotContents(id, nsl); + } + } + } + } else { + int id = this.findMatch(cur[i]); + if (id >= 0) { + this.inv.setInventorySlotContents(i, this.inv.decrStackSize(id, 1)); + } + } + } + } + } + } + + this.bench.onCraftMatrixChanged(this.craftingMatrix); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/TileAdvBench.java b/src/main/java/com/eloraam/redpower/base/TileAdvBench.java new file mode 100644 index 0000000..2a49b10 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/TileAdvBench.java @@ -0,0 +1,175 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.CoreLib; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +public class TileAdvBench extends TileAppliance implements ISidedInventory { + private ItemStack[] contents = new ItemStack[28]; + + @Override + public int getExtendedID() { + return 3; + } + + public boolean canUpdate() { + return true; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerBase.instance, 2, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 27; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + public int getSizeInventory() { + return 28; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpabench.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + TileEntity tile = super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord); + return tile == this + && tile != null + && !tile.isInvalid() + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.markDirty(); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + } + + public int[] getAccessibleSlotsFromSide(int side) { + switch(side) { + case 1: + return IntStream.range(0, 9).toArray(); + default: + return side != (super.Rotation ^ 1) ? IntStream.range(10, 28).toArray() : new int[0]; + } + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return side != (super.Rotation ^ 1) && slotID >= 0 && slotID < 28 && slotID != 9; + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return side == 0 && slotID >= 10 && slotID < 28; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return slotID != 9 || stack.getItem() == RedPowerBase.itemPlanBlank || stack.getItem() == RedPowerBase.itemPlanFull; + } +} diff --git a/src/main/java/com/eloraam/redpower/base/TileAlloyFurnace.java b/src/main/java/com/eloraam/redpower/base/TileAlloyFurnace.java new file mode 100644 index 0000000..7e88b91 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/TileAlloyFurnace.java @@ -0,0 +1,285 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CraftLib; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.world.EnumSkyBlock; + +public class TileAlloyFurnace extends TileAppliance implements IInventory, ISidedInventory { + private ItemStack[] contents = new ItemStack[11]; + int totalburn = 0; + int burntime = 0; + int cooktime = 0; + + private void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void updateEntity() { + super.updateEntity(); + boolean btu = false; + if (this.burntime > 0) { + --this.burntime; + if (this.burntime == 0) { + btu = true; + super.Active = false; + } + } + + if (!super.worldObj.isRemote) { + boolean cs = this.canSmelt(); + if (this.burntime == 0 && cs && this.contents[9] != null) { + this.burntime = this.totalburn = CoreLib.getBurnTime(this.contents[9]); + if (this.burntime > 0) { + super.Active = true; + if (this.contents[9].getItem().getContainerItem() != null) { + this.contents[9] = new ItemStack(this.contents[9].getItem().getContainerItem()); + } else { + --this.contents[9].stackSize; + } + + if (this.contents[9].stackSize == 0) { + this.contents[9] = null; + } + + if (!btu) { + this.updateBlock(); + this.updateLight(); + } + } + } + + if (this.burntime > 0 && cs) { + ++this.cooktime; + if (this.cooktime == 200) { + this.cooktime = 0; + this.smeltItem(); + this.markDirty(); + } + } else { + this.cooktime = 0; + } + + if (btu) { + this.updateBlock(); + this.updateLight(); + } + } + + } + + private boolean canSmelt() { + ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, false); + if (ist == null) { + return false; + } else if (this.contents[10] == null) { + return true; + } else if (!this.contents[10].isItemEqual(ist)) { + return false; + } else { + int st = this.contents[10].stackSize + ist.stackSize; + return st <= this.getInventoryStackLimit() && st <= ist.getMaxStackSize(); + } + } + + private void smeltItem() { + if (this.canSmelt()) { + ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, true); + if (this.contents[10] == null) { + this.contents[10] = ist.copy(); + } else { + this.contents[10].stackSize += ist.stackSize; + } + } + + } + + int getCookScaled(int i) { + return this.cooktime * i / 200; + } + + int getBurnScaled(int i) { + return this.totalburn == 0 ? 0 : this.burntime * i / this.totalburn; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerBase.instance, 1, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 11; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + public int getSizeInventory() { + return 11; + } + + public ItemStack getStackInSlot(int slotId) { + return this.contents[slotId]; + } + + public ItemStack decrStackSize(int slotId, int amount) { + if (this.contents[slotId] == null) { + return null; + } else if (this.contents[slotId].stackSize <= amount) { + ItemStack tr = this.contents[slotId]; + this.contents[slotId] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[slotId].splitStack(amount); + if (this.contents[slotId].stackSize == 0) { + this.contents[slotId] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int slotId) { + if (this.contents[slotId] == null) { + return null; + } else { + ItemStack ist = this.contents[slotId]; + this.contents[slotId] = null; + return ist; + } + } + + public void setInventorySlotContents(int slotId, ItemStack ist) { + this.contents[slotId] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpafurnace.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.totalburn = data.getShort("TotalBurn"); + this.burntime = data.getShort("BurnTime"); + this.cooktime = data.getShort("CookTime"); + super.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setShort("TotalBurn", (short)this.totalburn); + data.setShort("BurnTime", (short)this.burntime); + data.setShort("CookTime", (short)this.cooktime); + super.writeToNBT(data); + } + + public int[] getAccessibleSlotsFromSide(int side) { + switch(side) { + case 0: + return new int[]{10}; + case 1: + return IntStream.range(0, 9).toArray(); + default: + return side != (super.Rotation ^ 1) ? new int[]{9} : new int[0]; + } + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + switch(side) { + case 1: + return slotID >= 0 && slotID < 9; + default: + return side != (super.Rotation ^ 1) ? TileEntityFurnace.isItemFuel(stack) : false; + } + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return slotID == 10 && side == 0; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return TileEntityFurnace.isItemFuel(stack) && slotID == 9 || slotID >= 0 && slotID < 9; + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.readFromPacket(tag); + this.updateLight(); + } +} diff --git a/src/main/java/com/eloraam/redpower/base/TileAppliance.java b/src/main/java/com/eloraam/redpower/base/TileAppliance.java new file mode 100644 index 0000000..e7d43e9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/base/TileAppliance.java @@ -0,0 +1,83 @@ +package com.eloraam.redpower.base; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.TileExtended; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileAppliance extends TileExtended implements IFrameSupport { + public int Rotation = 0; + public boolean Active = false; + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + public Block getBlockType() { + return RedPowerBase.blockAppliance; + } + + public int getLightValue() { + return this.Active ? 13 : 0; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("ps", (byte)(this.Active ? 1 : 0)); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.Active = tag.getByte("ps") > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + this.Active = data.getByte("ps") > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("ps", (byte)(this.Active ? 1 : 0)); + data.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.Active = tag.getByte("ps") > 0; + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("ps", (byte)(this.Active ? 1 : 0)); + } +} diff --git a/src/main/java/com/eloraam/redpower/compat/BlockMachineCompat.java b/src/main/java/com/eloraam/redpower/compat/BlockMachineCompat.java new file mode 100644 index 0000000..0e39fc9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/compat/BlockMachineCompat.java @@ -0,0 +1,32 @@ +package com.eloraam.redpower.compat; + +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CreativeExtraTabs; +import net.minecraft.block.material.Material; + +public class BlockMachineCompat extends BlockMultipart { + public BlockMachineCompat() { + super(Material.rock); + this.setHardness(2.0F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + public boolean isNormalCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int damageDropped(int meta) { + return meta; + } +} diff --git a/src/main/java/com/eloraam/redpower/compat/ItemMachineCompat.java b/src/main/java/com/eloraam/redpower/compat/ItemMachineCompat.java new file mode 100644 index 0000000..c6a7301 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/compat/ItemMachineCompat.java @@ -0,0 +1,72 @@ +package com.eloraam.redpower.compat; + +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.ItemExtended; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemMachineCompat extends ItemExtended { + public ItemMachineCompat(Block block) { + super(block); + } + + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + Block bid = world.getBlock(x, y, z); + Block bl = Block.getBlockFromItem(this); + if (bid == Blocks.snow) { + side = 1; + } else if (bid != Blocks.vine && bid != Blocks.tallgrass && bid != Blocks.deadbush) { + switch(side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + default: + ++x; + } + } + + if (stack.stackSize == 0) { + return false; + } else if (!player.canPlayerEdit(x, y, z, side, stack)) { + return false; + } else if (y >= world.getHeight() - 1) { + return false; + } else if (!world.canPlaceEntityOnSide(bl, x, y, z, false, side, player, stack)) { + return false; + } else { + if (world.setBlock(x, y, z, bl, this.getMetadata(stack.getItemDamage()), 3)) { + if (world.getBlock(x, y, z) == bl) { + BlockExtended bex = (BlockExtended)bl; + bex.onBlockPlacedBy(world, x, y, z, side, player, stack); + } + + world.playSoundEffect( + (double)((float)x + 0.5F), + (double)((float)y + 0.5F), + (double)((float)z + 0.5F), + bl.stepSound.func_150496_b(), + (bl.stepSound.getVolume() + 1.0F) / 2.0F, + bl.stepSound.getPitch() * 0.8F + ); + --stack.stackSize; + } + + return true; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/compat/RenderBlueEngine.java b/src/main/java/com/eloraam/redpower/compat/RenderBlueEngine.java new file mode 100644 index 0000000..c16bd2d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/compat/RenderBlueEngine.java @@ -0,0 +1,92 @@ +package com.eloraam.redpower.compat; + +import com.eloraam.redpower.core.Matrix3; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; + +public class RenderBlueEngine extends RenderCustomBlock { + private static ResourceLocation res = new ResourceLocation("rpcompat", "models/compat1.png"); + protected RenderModel modelBase = RenderModel.loadModel("rpcompat:models/btengine1.obj").scale(0.0625); + protected RenderModel modelSlide = RenderModel.loadModel("rpcompat:models/btengine2.obj").scale(0.0625); + protected RenderModel modelGear = RenderModel.loadModel("rpcompat:models/btengine3.obj").scale(0.0625); + protected RenderContext context = new RenderContext(); + + public RenderBlueEngine(Block bl) { + super(bl); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBlueEngine tb = (TileBlueEngine)tile; + if (tb != null) { + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(tb.Rotation, 0); + this.context.readGlobalLights(tb.getWorldObj(), tb.xCoord, tb.yCoord, tb.zCoord); + this.context.setBrightness(super.getMixedBrightness(tb)); + this.context.bindTexture(res); + this.context.bindModelOffset(this.modelBase, 0.5, 0.5, 0.5); + tess.startDrawingQuads(); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, tb.Charged ? (tb.Active ? 3 : 2) : 1); + tess.draw(); + int lv = tb.getWorldObj().getLightBrightnessForSkyBlocks(tb.xCoord, tb.yCoord, tb.zCoord, 0); + tess.startDrawingQuads(); + tess.setBrightness(lv); + if (tb.Active) { + partialTicks += (float)tb.PumpTick; + if (tb.PumpSpeed > 0) { + partialTicks /= (float)tb.PumpSpeed; + } + } else { + partialTicks = 0.0F; + } + + this.context.useNormal = true; + this.context.setPos(x, y, z); + this.context.setOrientation(tb.Rotation, 0); + this.context.setRelPos(0.0, 0.1875 * (0.5 - 0.5 * Math.cos(Math.PI * (double)partialTicks)), 0.0); + this.context.bindModelOffset(this.modelSlide, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.basis = Matrix3.getRotY(Math.PI / 2 * (double)partialTicks).multiply(this.context.basis); + this.context.setRelPos(0.5, 0.34375, 0.5); + this.context.bindModelOffset(this.modelGear, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + tess.draw(); + } + + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.bindTexture(res); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.bindModelOffset(this.modelBase, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, 1); + this.context.bindModelOffset(this.modelSlide, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.setPos(0.0, -0.15625, 0.0); + this.context.bindModel(this.modelGear); + this.context.renderModelGroup(0, 0); + this.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/compat/TileBlueEngine.java b/src/main/java/com/eloraam/redpower/compat/TileBlueEngine.java new file mode 100644 index 0000000..306c617 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/compat/TileBlueEngine.java @@ -0,0 +1,193 @@ +package com.eloraam.redpower.compat; + +import cofh.api.energy.IEnergyConnection; +import cofh.api.energy.IEnergyReceiver; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileBlueEngine extends TileMachineCompat implements IBluePowerConnectable, IEnergyConnection { + private BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileBlueEngine.this; + } + }; + public int ConMask = -1; + public byte PumpTick = 0; + public byte PumpSpeed = 16; + private int Flywheel = 0; + + @Override + public int getConnectableMask() { + int wm = RedPowerLib.getConDirMask(super.Rotation ^ 1) | 15 << ((super.Rotation ^ 1) << 2); + return 16777215 & ~wm | 16777216 << super.Rotation; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public void onBlockNeighborChange(Block bl) { + this.ConMask = -1; + int cm = this.getConnectableMask(); + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cm, cm >> 24)) { + if (!super.Powered) { + super.Powered = true; + this.updateBlock(); + } + } else { + super.Powered = false; + this.updateBlock(); + } + + } + + protected void deliverPower() { + WorldCoord pos = new WorldCoord(this); + pos.step(super.Rotation ^ 1); + IEnergyReceiver ipr = CoreLib.getTileEntity(super.worldObj, pos, IEnergyReceiver.class); + ForgeDirection oppSide = ForgeDirection.getOrientation(super.Rotation); + if (ipr != null && ipr.canConnectEnergy(oppSide)) { + this.Flywheel -= ipr.receiveEnergy(oppSide, this.Flywheel * 10, false) / 10; + } + + } + + @Override + public void onTileTick() { + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + boolean act = super.Active; + if (super.Active) { + ++this.PumpTick; + int sp = this.PumpTick; + if (sp == this.PumpSpeed) { + this.deliverPower(); + } + + if (sp >= this.PumpSpeed * 2) { + this.PumpTick = 0; + if (this.PumpSpeed > 4) { + --this.PumpSpeed; + } + + super.Active = false; + } + + if (super.Powered && this.Flywheel < 512) { + double draw = Math.min((double)Math.min(512 - this.Flywheel, 32), 0.002 * this.cond.getEnergy(60.0)); + this.cond.drawPower(1000.0 * draw); + this.Flywheel = (int)((double)this.Flywheel + draw); + } + + this.cond.drawPower(50.0); + } + + if (this.cond.getVoltage() < 60.0) { + if (super.Charged && this.cond.Flow == 0) { + super.Charged = false; + this.updateBlock(); + } + } else { + if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + + if (super.Charged && super.Powered) { + super.Active = true; + } + + if (super.Active != act) { + if (super.Active) { + this.PumpSpeed = 16; + } + + this.updateBlock(); + } + } + } else if (super.Active) { + ++this.PumpTick; + if (this.PumpTick >= this.PumpSpeed * 2) { + this.PumpTick = 0; + if (this.PumpSpeed > 4) { + --this.PumpSpeed; + } + } + } else { + this.PumpTick = 0; + } + + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + this.cond.readFromNBT(tag); + this.PumpTick = tag.getByte("ptk"); + this.PumpSpeed = tag.getByte("spd"); + this.Flywheel = tag.getInteger("flyw"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + this.cond.writeToNBT(tag); + tag.setByte("ptk", this.PumpTick); + tag.setByte("spd", this.PumpSpeed); + tag.setInteger("flyw", this.Flywheel); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.readFromPacket(tag); + this.PumpSpeed = tag.getByte("spd"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + super.writeToPacket(tag); + tag.setByte("spd", this.PumpSpeed); + } + + @Override + public boolean canConnectEnergy(ForgeDirection side) { + return side.getOpposite() == ForgeDirection.getOrientation(super.Rotation); + } +} diff --git a/src/main/java/com/eloraam/redpower/compat/TileMachineCompat.java b/src/main/java/com/eloraam/redpower/compat/TileMachineCompat.java new file mode 100644 index 0000000..781de96 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/compat/TileMachineCompat.java @@ -0,0 +1,177 @@ +package com.eloraam.redpower.compat; + +import com.eloraam.redpower.RedPowerCompat; +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRotatable; +import com.eloraam.redpower.core.TileMultipart; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileMachineCompat extends TileMultipart implements IRotatable, IFrameSupport { + public int Rotation = 0; + public boolean Active = false; + public boolean Powered = false; + public boolean Delay = false; + public boolean Charged = false; + + public int getFacing(EntityLivingBase ent) { + int yawrx = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (Math.abs(ent.posX - (double)super.xCoord) < 2.0 && Math.abs(ent.posZ - (double)super.zCoord) < 2.0) { + double p = ent.posY + 1.82 - (double)ent.yOffset - (double)super.yCoord; + if (p > 2.0) { + return 0; + } + + if (p < 0.0) { + return 1; + } + } + + switch(yawrx) { + case 0: + return 3; + case 1: + return 4; + case 2: + return 2; + default: + return 5; + } + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = this.getFacing(ent); + } + + public Block getBlockType() { + return RedPowerCompat.blockMachineCompat; + } + + @Override + public void addHarvestContents(List items) { + items.add(new ItemStack(this.getBlockType(), 1, this.getExtendedID())); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + this.breakBlock(willHarvest); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockExtended bl = RedPowerCompat.blockMachineCompat; + return player.getBreakSpeed(bl, false, super.blockMetadata, super.xCoord, super.yCoord, super.zCoord) / (bl.getHardness() * 30.0F); + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void setPartBounds(BlockMultipart bl, int part) { + bl.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + @Override + public int getSolidPartsMask() { + return 1; + } + + @Override + public int getPartsMask() { + return 1; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 5; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : this.Rotation; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec) { + this.Rotation = rot; + this.updateBlockChange(); + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + int ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + int ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + int ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/BlockPeripheral.java b/src/main/java/com/eloraam/redpower/control/BlockPeripheral.java new file mode 100644 index 0000000..c20cb86 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/BlockPeripheral.java @@ -0,0 +1,42 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.CreativeExtraTabs; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockPeripheral extends BlockExtended { + public BlockPeripheral() { + super(Material.rock); + this.setHardness(2.0F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + @Override + public boolean isOpaqueCube() { + return true; + } + + public boolean isNormalCube() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return true; + } + + public boolean isBlockNormalCube() { + return false; + } + + public boolean isSideSolid(IBlockAccess world, int i, int j, int k, ForgeDirection side) { + return true; + } + + @Override + public int damageDropped(int i) { + return i; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/ContainerCPU.java b/src/main/java/com/eloraam/redpower/control/ContainerCPU.java new file mode 100644 index 0000000..eaffe0c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/ContainerCPU.java @@ -0,0 +1,106 @@ +package com.eloraam.redpower.control; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ContainerCPU extends Container implements IHandleGuiEvent { + private TileCPU tileCPU; + private int byte0 = 0; + private int byte1 = 0; + private int rbaddr = 0; + private boolean isrun = false; + + public ContainerCPU(IInventory inv, TileCPU cpu) { + this.tileCPU = cpu; + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileCPU.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + return null; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.tileCPU.diskAddr != this.byte0) { + ic.sendProgressBarUpdate(this, 0, this.tileCPU.diskAddr); + } + + if (this.tileCPU.displayAddr != this.byte1) { + ic.sendProgressBarUpdate(this, 1, this.tileCPU.displayAddr); + } + + if (this.tileCPU.rbaddr != this.rbaddr) { + ic.sendProgressBarUpdate(this, 2, this.tileCPU.rbaddr); + } + + if (this.tileCPU.isRunning() != this.isrun) { + ic.sendProgressBarUpdate(this, 3, this.tileCPU.isRunning() ? 1 : 0); + } + } + + this.byte0 = this.tileCPU.diskAddr; + this.byte1 = this.tileCPU.displayAddr; + this.rbaddr = this.tileCPU.rbaddr; + this.isrun = this.tileCPU.isRunning(); + } + + public void updateProgressBar(int id, int value) { + switch(id) { + case 0: + this.tileCPU.diskAddr = value; + break; + case 1: + this.tileCPU.displayAddr = value; + break; + case 2: + this.tileCPU.rbaddr = value; + break; + case 3: + this.tileCPU.sliceCycles = value > 0 ? 0 : -1; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileCPU.diskAddr = message.parameters[0]; + break; + case 2: + this.tileCPU.displayAddr = message.parameters[0]; + break; + case 3: + this.tileCPU.rbaddr = message.parameters[0]; + break; + case 4: + this.tileCPU.warmBootCPU(); + break; + case 5: + this.tileCPU.haltCPU(); + break; + case 6: + this.tileCPU.coldBootCPU(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/control/ContainerDisplay.java b/src/main/java/com/eloraam/redpower/control/ContainerDisplay.java new file mode 100644 index 0000000..dba5dd1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/ContainerDisplay.java @@ -0,0 +1,246 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import java.io.ByteArrayOutputStream; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ContainerDisplay extends Container implements IHandleGuiEvent { + private TileDisplay tileDisplay; + private byte[] screen = new byte[4000]; + private int cursx = 0; + private int cursy = 0; + private int cursmode = 0; + + private void decompress(byte[] compress, byte[] out) { + int opos = 0; + int i = 0; + + while(i < compress.length) { + if (opos >= out.length) { + return; + } + + int cmd = compress[i++] & 255; + if ((cmd & 128) == 0) { + opos += cmd & 127; + } else if (cmd != 255) { + int ln = Math.min(Math.min(cmd & 127, out.length - opos), compress.length - i); + System.arraycopy(compress, i, out, opos, ln); + opos += ln; + i += ln; + } else { + if (i + 2 > compress.length) { + return; + } + + int ln = Math.min(compress[i] & 255, out.length - opos); + + for(int j = 0; j < ln; ++j) { + out[opos + j] = compress[i + 1]; + } + + opos += ln; + i += 2; + } + } + + } + + public ContainerDisplay(IInventory inv, TileDisplay td) { + this.tileDisplay = td; + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileDisplay.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + return null; + } + + private byte[] getDisplayRLE() { + ContainerDisplay.RLECompressor rle = new ContainerDisplay.RLECompressor(); + + for(int i = 0; i < 4000; ++i) { + rle.addByte(this.tileDisplay.screen[i], this.screen[i] != this.tileDisplay.screen[i]); + this.screen[i] = this.tileDisplay.screen[i]; + } + + rle.flush(); + return rle.getByteArray(); + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + byte[] drl = this.getDisplayRLE(); + + for(ICrafting ic : (List)super.crafters) { + if (this.tileDisplay.cursX != this.cursx) { + ic.sendProgressBarUpdate(this, 0, this.tileDisplay.cursX); + } + + if (this.tileDisplay.cursY != this.cursy) { + ic.sendProgressBarUpdate(this, 1, this.tileDisplay.cursY); + } + + if (this.tileDisplay.cursMode != this.cursmode) { + ic.sendProgressBarUpdate(this, 2, this.tileDisplay.cursMode); + } + + if (drl != null) { + RedPowerCore.sendPacketToCrafting(ic, new PacketGuiEvent.GuiMessageEvent(2, super.windowId, drl)); + } + } + + this.cursx = this.tileDisplay.cursX; + this.cursy = this.tileDisplay.cursY; + this.cursmode = this.tileDisplay.cursMode; + } + + public void updateProgressBar(int id, int value) { + switch(id) { + case 0: + this.tileDisplay.cursX = value; + return; + case 1: + this.tileDisplay.cursY = value; + return; + case 2: + this.tileDisplay.cursMode = value; + } + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileDisplay.pushKey(message.parameters[0]); + this.tileDisplay.updateBlock(); + break; + case 2: + this.decompress(message.parameters, this.tileDisplay.screen); + } + } catch (Throwable var3) { + } + + } + + public class RLECompressor { + ByteArrayOutputStream bas = new ByteArrayOutputStream(); + byte[] datbuf = new byte[256]; + byte srledat = 0; + int rleoffs = 0; + int srleoffs = 0; + int datpos = 0; + boolean changed = false; + + public void writeRLE() { + this.bas.write((byte)this.rleoffs); + this.datpos = 0; + this.rleoffs = 0; + this.srleoffs = 0; + } + + public void writeSRLE() { + this.bas.write(-1); + this.bas.write((byte)this.srleoffs); + this.bas.write(this.srledat); + this.datpos = 0; + this.rleoffs = 0; + this.srleoffs = 0; + } + + public void writeDat(int bytes) { + if (bytes != 0) { + this.bas.write((byte)(128 | bytes)); + this.bas.write(this.datbuf, 0, bytes); + this.datpos -= bytes; + } + + } + + public void addByte(byte b, boolean diff) { + if (diff) { + this.changed = true; + if (this.rleoffs > 5 && this.rleoffs >= this.srleoffs) { + this.writeDat(this.datpos - this.rleoffs); + this.writeRLE(); + } + + this.rleoffs = 0; + } else { + ++this.rleoffs; + if (this.rleoffs >= 127) { + ++this.datpos; + this.writeDat(this.datpos - this.rleoffs); + this.writeRLE(); + return; + } + } + + if (this.srleoffs == 0) { + this.srledat = b; + this.srleoffs = 1; + } else if (b == this.srledat) { + ++this.srleoffs; + if (this.srleoffs >= 127) { + ++this.datpos; + this.writeDat(this.datpos - this.srleoffs); + this.writeSRLE(); + return; + } + } else { + if (this.srleoffs > 5 && this.srleoffs >= this.rleoffs) { + this.writeDat(this.datpos - this.srleoffs); + this.writeSRLE(); + } + + this.srledat = b; + this.srleoffs = 1; + } + + this.datbuf[this.datpos] = b; + ++this.datpos; + int rem = Math.max(this.srleoffs, this.rleoffs); + if (rem <= 5 && this.datpos >= 126) { + this.writeDat(this.datpos); + this.srleoffs = 0; + this.rleoffs = 0; + } else if (this.datpos - rem >= 126) { + this.writeDat(this.datpos - rem); + } + + } + + public void flush() { + this.datpos -= this.rleoffs; + this.srleoffs = Math.max(0, this.srleoffs - this.rleoffs); + if (this.datpos != 0) { + if (this.srleoffs > 5) { + this.writeDat(this.datpos - this.srleoffs); + this.writeSRLE(); + } else { + this.writeDat(this.datpos); + } + } + + } + + byte[] getByteArray() { + return !this.changed ? null : this.bas.toByteArray(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/control/GuiCPU.java b/src/main/java/com/eloraam/redpower/control/GuiCPU.java new file mode 100644 index 0000000..18d6938 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/GuiCPU.java @@ -0,0 +1,151 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiCPU extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpcontrol", "textures/gui/cpugui.png"); + private TileCPU tileCPU; + + public GuiCPU(InventoryPlayer pli, TileCPU cpu) { + super(new ContainerCPU(pli, cpu)); + this.tileCPU = cpu; + super.ySize = 145; + super.xSize = 227; + } + + public GuiCPU(Container cn) { + super(cn); + super.ySize = 145; + super.xSize = 227; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int bits = this.tileCPU.diskAddr; + + for(int n = 0; n < 8; ++n) { + if ((bits & 1 << n) != 0) { + this.drawTexturedModalRect(j + 14 + n * 12, k + 57, 227 + (n >> 2) * 12, 0, 12, 32); + } + } + + bits = this.tileCPU.displayAddr; + + for(int n = 0; n < 8; ++n) { + if ((bits & 1 << n) != 0) { + this.drawTexturedModalRect(j + 118 + n * 12, k + 57, 227 + (n >> 2) * 12, 0, 12, 32); + } + } + + bits = this.tileCPU.rbaddr; + + for(int n = 0; n < 8; ++n) { + if ((bits & 1 << n) != 0) { + this.drawTexturedModalRect(j + 118 + n * 12, k + 101, 227 + (n >> 2) * 12, 0, 12, 32); + } + } + + if (this.tileCPU.isRunning()) { + this.drawTexturedModalRect(j + 102, k + 99, 227, 32, 8, 8); + } else { + this.drawTexturedModalRect(j + 102, k + 112, 227, 32, 8, 8); + } + + super.fontRendererObj.drawString(I18n.format("gui.cpu.diskid", new Object[]{this.tileCPU.diskAddr & 0xFF}), j + 14, k + 47, -1); + super.fontRendererObj.drawString(I18n.format("gui.cpu.consoleid", new Object[]{this.tileCPU.displayAddr & 0xFF}), j + 118, k + 47, -1); + super.fontRendererObj.drawString(I18n.format("gui.cpu.selfid", new Object[]{this.tileCPU.rbaddr & 0xFF}), j + 118, k + 91, -1); + super.fontRendererObj.drawString(I18n.format("gui.cpu.start", new Object[0]), j + 50, k + 99, -1); + super.fontRendererObj.drawString(I18n.format("gui.cpu.halt", new Object[0]), j + 50, k + 112, -1); + super.fontRendererObj.drawString(I18n.format("gui.cpu.reset", new Object[0]), j + 50, k + 125, -1); + } + + private void sendSimple(int n, byte m) { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(n, super.inventorySlots.windowId, m)); + } + + } + + private boolean sendEvent(int n) { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(n, super.inventorySlots.windowId, (byte)0)); + return false; + } else { + return true; + } + } + + protected void mouseClicked(int mouseX, int mouseY, int button) { + int x = mouseX - (super.width - super.xSize) / 2; + int y = mouseY - (super.height - super.ySize) / 2; + if (y >= 57 && y <= 89) { + for(int n = 0; n < 8; ++n) { + if (x >= 14 + n * 12 && x <= 26 + n * 12) { + this.tileCPU.diskAddr ^= 1 << n; + this.sendSimple(1, (byte)this.tileCPU.diskAddr); + return; + } + } + + for(int n = 0; n < 8; ++n) { + if (x >= 118 + n * 12 && x <= 130 + n * 12) { + this.tileCPU.displayAddr ^= 1 << n; + this.sendSimple(2, (byte)this.tileCPU.displayAddr); + return; + } + } + } + + if (y >= 101 && y <= 133) { + for(int n = 0; n < 8; ++n) { + if (x >= 118 + n * 12 && x <= 130 + n * 12) { + this.tileCPU.rbaddr ^= 1 << n; + this.sendSimple(3, (byte)this.tileCPU.rbaddr); + return; + } + } + } + + if (x >= 87 && x <= 96) { + if (y >= 98 && y <= 107) { + if (this.sendEvent(4)) { + this.tileCPU.warmBootCPU(); + } + + return; + } + + if (y >= 111 && y <= 120) { + if (this.sendEvent(5)) { + this.tileCPU.haltCPU(); + } + + return; + } + + if (y >= 124 && y <= 133) { + if (this.sendEvent(6)) { + this.tileCPU.coldBootCPU(); + } + + return; + } + } + + super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/GuiDisplay.java b/src/main/java/com/eloraam/redpower/control/GuiDisplay.java new file mode 100644 index 0000000..6b23e0b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/GuiDisplay.java @@ -0,0 +1,124 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiDisplay extends GuiContainer { + private static ResourceLocation screenTextures = new ResourceLocation("rpcontrol", "textures/gui/displaygui.png"); + private TileDisplay disp; + + public GuiDisplay(IInventory inv, TileDisplay td) { + super(new ContainerDisplay(inv, td)); + super.xSize = 350; + super.ySize = 230; + this.disp = td; + } + + private void sendKey(int id) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, (byte)id)); + } + + protected void keyTyped(char symbol, int key) { + if (key == 1) { + super.mc.thePlayer.closeScreen(); + } else { + if (symbol == '\n') { + symbol = '\r'; + } + + byte id = 0; + if (isShiftKeyDown()) { + id = (byte)(id | 64); + } + + if (isCtrlKeyDown()) { + id = (byte)(id | 32); + } + + switch(key) { + case 199: + this.sendKey(132 | id); + break; + case 200: + this.sendKey(128 | id); + break; + case 201: + case 202: + case 204: + case 206: + case 209: + default: + if (symbol > 0 && symbol <= 127) { + this.sendKey(symbol); + } + break; + case 203: + this.sendKey(130 | id); + break; + case 205: + this.sendKey(131 | id); + break; + case 207: + this.sendKey(133 | id); + break; + case 208: + this.sendKey(129 | id); + break; + case 210: + this.sendKey(134 | id); + } + } + + } + + public void drawGuiContainerBackgroundLayer(float f, int i, int j) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(screenTextures); + int l = (super.width - super.xSize) / 2; + int m = (super.height - super.ySize) / 2; + this.drawDoubledRect(l, m, super.xSize, super.ySize, 0, 0, super.xSize, super.ySize); + GL11.glColor4f(0.0F, 1.0F, 0.0F, 1.0F); + + for(int y = 0; y < 50; ++y) { + for(int x = 0; x < 80; ++x) { + int b = this.disp.screen[y * 80 + x] & 255; + if (x == this.disp.cursX && y == this.disp.cursY) { + if (this.disp.cursMode == 1) { + b ^= 128; + } + + if (this.disp.cursMode == 2) { + long tm = super.mc.theWorld.getWorldTime(); + if ((tm >> 2 & 1L) > 0L) { + b ^= 128; + } + } + } + + if (b != 32) { + this.drawDoubledRect(l + 15 + x * 4, m + 15 + y * 4, 4, 4, 350 + (b & 15) * 8, (b >> 4) * 8, 8, 8); + } + } + } + + } + + public void drawDoubledRect(int xPos, int yPos, int width, int heigth, int uStart, int vStart, int uEnd, int vEnd) { + float xm = 0.001953125F; + float ym = 0.00390625F; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.addVertexWithUV((double)xPos, (double)(yPos + heigth), (double)super.zLevel, (double)((float)uStart * xm), (double)((float)(vStart + vEnd) * ym)); + tess.addVertexWithUV( + (double)(xPos + width), (double)(yPos + heigth), (double)super.zLevel, (double)((float)(uStart + uEnd) * xm), (double)((float)(vStart + vEnd) * ym) + ); + tess.addVertexWithUV((double)(xPos + width), (double)yPos, (double)super.zLevel, (double)((float)(uStart + uEnd) * xm), (double)((float)vStart * ym)); + tess.addVertexWithUV((double)xPos, (double)yPos, (double)super.zLevel, (double)((float)uStart * xm), (double)((float)vStart * ym)); + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/ItemBackplane.java b/src/main/java/com/eloraam/redpower/control/ItemBackplane.java new file mode 100644 index 0000000..9d7874f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/ItemBackplane.java @@ -0,0 +1,108 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ItemExtended; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemBackplane extends ItemExtended { + public ItemBackplane(Block block) { + super(block); + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int y, int x, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + protected boolean itemUseShared(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side) { + Block bid = world.getBlock(x, y, z); + int md = world.getBlockMetadata(x, y, z); + int dmg = ist.getItemDamage(); + if (bid == Block.getBlockFromItem(ist.getItem()) && md == 0 && dmg != 0) { + TileBackplane bp = CoreLib.getTileEntity(world, x, y, z, TileBackplane.class); + if (bp == null) { + return false; + } else { + int rx = bp.Rotation; + if (!world.setBlock(x, y, z, bid, dmg, 3)) { + return false; + } else { + bp = CoreLib.getTileEntity(world, x, y, z, TileBackplane.class); + if (bp != null) { + bp.Rotation = rx; + } + + world.markBlockForUpdate(x, y, z); + CoreLib.placeNoise(world, x, y, z, Block.getBlockFromItem(ist.getItem())); + if (!player.capabilities.isCreativeMode) { + --ist.stackSize; + } + + RedPowerLib.updateIndirectNeighbors(world, x, y, z, Block.getBlockFromItem(ist.getItem())); + return true; + } + } + } else if (dmg != 0) { + return false; + } else { + WorldCoord wc = new WorldCoord(x, y, z); + wc.step(side); + if (!world.canPlaceEntityOnSide(Block.getBlockFromItem(ist.getItem()), wc.x, wc.y, wc.z, false, 1, player, ist)) { + return false; + } else if (!RedPowerLib.isSideNormal(world, wc.x, wc.y, wc.z, 0)) { + return false; + } else { + int rx = -1; + + label84: + for(int i = 0; i < 4; ++i) { + WorldCoord wc2 = wc.copy(); + int dir = CoreLib.rotToSide(i) ^ 1; + wc2.step(dir); + TileCPU cpu = CoreLib.getTileEntity(world, wc2, TileCPU.class); + if (cpu != null && cpu.Rotation == i) { + rx = i; + break; + } + + TileBackplane backplane = CoreLib.getTileEntity(world, wc2, TileBackplane.class); + if (backplane != null && backplane.Rotation == i) { + for(int pb = 0; pb < 6; ++pb) { + wc2.step(dir); + if (world.getBlock(wc2.x, wc2.y, wc2.z) == RedPowerControl.blockPeripheral && world.getBlockMetadata(wc2.x, wc2.y, wc2.z) == 1) { + rx = i; + break label84; + } + } + } + } + + if (rx < 0) { + return false; + } else if (!world.setBlock(wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem()), dmg, 3)) { + return true; + } else { + TileBackplane bp = CoreLib.getTileEntity(world, wc, TileBackplane.class); + bp.Rotation = rx; + CoreLib.placeNoise(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + if (!player.capabilities.isCreativeMode) { + --ist.stackSize; + } + + world.markBlockForUpdate(wc.x, wc.y, wc.z); + RedPowerLib.updateIndirectNeighbors(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + return true; + } + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/control/ItemDisk.java b/src/main/java/com/eloraam/redpower/control/ItemDisk.java new file mode 100644 index 0000000..be7a620 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/ItemDisk.java @@ -0,0 +1,92 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.core.CoreLib; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemDisk extends Item { + private IIcon emptyIcon; + private IIcon forthIcon; + private IIcon forthExtIcon; + + public ItemDisk() { + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setMaxStackSize(1); + } + + public void registerIcons(IIconRegister reg) { + this.emptyIcon = reg.registerIcon("rpcontrol:disk"); + this.forthIcon = reg.registerIcon("rpcontrol:diskForth"); + this.forthExtIcon = reg.registerIcon("rpcontrol:diskForthExtended"); + } + + public String getUnlocalizedName(ItemStack stack) { + switch(stack.getItemDamage()) { + case 0: + return "item.disk"; + case 1: + return "item.disk.forth"; + case 2: + return "item.disk.forthxp"; + default: + return null; + } + } + + @SideOnly(Side.CLIENT) + public String getItemStackDisplayName(ItemStack ist) { + return ist.stackTagCompound == null + ? super.getItemStackDisplayName(ist) + : (!ist.stackTagCompound.hasKey("label") ? super.getItemStackDisplayName(ist) : ist.stackTagCompound.getString("label")); + } + + @SideOnly(Side.CLIENT) + public EnumRarity getRarity(ItemStack ist) { + return ist.getItemDamage() >= 1 ? EnumRarity.uncommon : EnumRarity.common; + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xOffset, float yOffset, float zOffset) { + if (!world.isRemote) { + TileDiskDrive tdd = CoreLib.getTileEntity(world, x, y, z, TileDiskDrive.class); + if (tdd != null && tdd.setDisk(ist.copy())) { + ist.stackSize = 0; + tdd.updateBlock(); + return true; + } + } + + return false; + } + + public boolean getShareTag() { + return true; + } + + public IIcon getIconFromDamage(int dmg) { + switch(dmg) { + case 1: + return this.forthIcon; + case 2: + return this.forthExtIcon; + default: + return this.emptyIcon; + } + } + + public void getSubItems(Item item, CreativeTabs tab, List items) { + for(int i = 0; i <= 2; ++i) { + items.add(new ItemStack(this, 1, i)); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/control/MicroPlacementRibbon.java b/src/main/java/com/eloraam/redpower/control/MicroPlacementRibbon.java new file mode 100644 index 0000000..99d84ef --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/MicroPlacementRibbon.java @@ -0,0 +1,26 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.wiring.MicroPlacementWire; +import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; + +public class MicroPlacementRibbon extends MicroPlacementWire { + @Override + public String getMicroName(int hb, int lb) { + return hb != 12 && lb != 0 ? null : "tile.ribbon"; + } + + @Override + public void addCreativeItems(int hb, CreativeTabs tab, List items) { + if (tab == CreativeExtraTabs.tabWires || tab == CreativeTabs.tabAllSearch) { + switch(hb) { + case 12: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 3072)); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderBackplane.java b/src/main/java/com/eloraam/redpower/control/RenderBackplane.java new file mode 100644 index 0000000..59fceba --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderBackplane.java @@ -0,0 +1,109 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBackplane extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + + public RenderBackplane(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBackplane backplane = (TileBackplane)tile; + World world = backplane.getWorldObj(); + int metadata = backplane.getBlockMetadata(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.bindBlockTexture(); + this.context.setBrightness(this.getMixedBrightness(backplane)); + this.context.setOrientation(0, backplane.Rotation); + this.context.setPos(x, y, z); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + tess.startDrawingQuads(); + if (metadata == 0) { + this.context + .setIcon( + RedPowerCore.missing, + RedPowerControl.backplaneTop, + RedPowerControl.backplaneFace, + RedPowerControl.backplaneFace, + RedPowerControl.backplaneSide, + RedPowerControl.backplaneSide + ); + this.context.renderBox(62, 0.0, 0.0, 0.0, 1.0, 0.125, 1.0); + } else if (metadata == 1) { + this.context + .setIcon( + RedPowerCore.missing, + RedPowerControl.ram8kTop, + RedPowerControl.ram8kFace, + RedPowerControl.ram8kFace, + RedPowerControl.ram8kSide, + RedPowerControl.ram8kSide + ); + this.context.renderBox(62, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + } + + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + this.context.useNormal = true; + this.context.setOrientation(0, 3); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + tess.startDrawingQuads(); + if (meta == 0) { + this.context + .setIcon( + RedPowerCore.missing, + RedPowerControl.backplaneTop, + RedPowerControl.backplaneFace, + RedPowerControl.backplaneFace, + RedPowerControl.backplaneSide, + RedPowerControl.backplaneSide + ); + this.context.renderBox(62, 0.0, 0.0, 0.0, 1.0, 0.125, 1.0); + } else if (meta == 1) { + this.context + .setIcon( + RedPowerCore.missing, + RedPowerControl.ram8kTop, + RedPowerControl.ram8kFace, + RedPowerControl.ram8kFace, + RedPowerControl.ram8kSide, + RedPowerControl.ram8kSide + ); + this.context.renderBox(62, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + } + + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderCPU.java b/src/main/java/com/eloraam/redpower/control/RenderCPU.java new file mode 100644 index 0000000..324c347 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderCPU.java @@ -0,0 +1,81 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderCPU extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + + public RenderCPU(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileCPU cpu = (TileCPU)tile; + World world = cpu.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, cpu.xCoord, cpu.yCoord, cpu.zCoord); + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.peripheralTop, + RedPowerControl.peripheralSide, + RedPowerControl.peripheralSide, + RedPowerControl.cpuFront, + RedPowerControl.peripheralBack + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(cpu.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + this.context.useNormal = true; + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.setOrientation(0, 3); + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.peripheralTop, + RedPowerControl.peripheralSide, + RedPowerControl.peripheralSide, + RedPowerControl.cpuFront, + RedPowerControl.peripheralBack + ); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + tess.startDrawingQuads(); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderDiskDrive.java b/src/main/java/com/eloraam/redpower/control/RenderDiskDrive.java new file mode 100644 index 0000000..7d73812 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderDiskDrive.java @@ -0,0 +1,93 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderDiskDrive extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + + public RenderDiskDrive(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileDiskDrive diskDrive = (TileDiskDrive)tile; + World world = diskDrive.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, diskDrive.xCoord, diskDrive.yCoord, diskDrive.zCoord); + IIcon front = RedPowerControl.diskDriveFront; + if (diskDrive.hasDisk) { + front = RedPowerControl.diskDriveFrontFull; + } + + if (diskDrive.Active) { + front = RedPowerControl.diskDriveFrontOn; + } + + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.diskDriveTop, + RedPowerControl.diskDriveSide, + RedPowerControl.diskDriveSide, + front, + RedPowerControl.peripheralBack + ); + this.context.setTexFlags(512); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(diskDrive.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + this.context.useNormal = true; + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.setOrientation(0, 3); + this.context.setTexFlags(512); + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.diskDriveTop, + RedPowerControl.diskDriveSide, + RedPowerControl.diskDriveSide, + RedPowerControl.diskDriveFront, + RedPowerControl.peripheralBack + ); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + tess.startDrawingQuads(); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderDisplay.java b/src/main/java/com/eloraam/redpower/control/RenderDisplay.java new file mode 100644 index 0000000..22b11ad --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderDisplay.java @@ -0,0 +1,81 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderDisplay extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + + public RenderDisplay(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileDisplay display = (TileDisplay)tile; + World world = display.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, display.xCoord, display.yCoord, display.zCoord); + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.peripheralTop, + RedPowerControl.peripheralSide, + RedPowerControl.peripheralSide, + RedPowerControl.displayFront, + RedPowerControl.peripheralBack + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(display.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + this.context.useNormal = true; + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.setOrientation(0, 3); + this.context + .setIcon( + RedPowerControl.peripheralBottom, + RedPowerControl.peripheralTop, + RedPowerControl.peripheralSide, + RedPowerControl.peripheralSide, + RedPowerControl.displayFront, + RedPowerControl.peripheralBack + ); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + tess.startDrawingQuads(); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderIOExpander.java b/src/main/java/com/eloraam/redpower/control/RenderIOExpander.java new file mode 100644 index 0000000..c31fed0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderIOExpander.java @@ -0,0 +1,74 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderIOExpander extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + private RenderModel modelModem = RenderModel.loadModel("rpcontrol:models/modem.obj"); + private ResourceLocation modelRes = new ResourceLocation("rpcontrol", "models/modem.png"); + + public RenderIOExpander(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileIOExpander iox = (TileIOExpander)tile; + World world = iox.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(0, iox.Rotation); + this.context.readGlobalLights(world, iox.xCoord, iox.yCoord, iox.zCoord); + this.context.setBrightness(this.getMixedBrightness(iox)); + this.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + this.context.bindModelOffset(this.modelModem, 0.5, 0.5, 0.5); + this.context.renderModelGroup(1, 1 + (CoreLib.rotToSide(iox.Rotation) & 1)); + this.context.renderModelGroup(2, 1 + (iox.WBuf & 15)); + this.context.renderModelGroup(3, 1 + (iox.WBuf >> 4 & 15)); + this.context.renderModelGroup(4, 1 + (iox.WBuf >> 8 & 15)); + this.context.renderModelGroup(5, 1 + (iox.WBuf >> 12 & 15)); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.bindTexture(this.modelRes); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.setOrientation(0, 3); + this.context.bindModelOffset(this.modelModem, 0.5, 0.5, 0.5); + this.context.renderModelGroup(1, 1); + this.context.renderModelGroup(2, 1); + this.context.renderModelGroup(3, 1); + this.context.renderModelGroup(4, 1); + this.context.renderModelGroup(5, 1); + this.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/RenderRibbon.java b/src/main/java/com/eloraam/redpower/control/RenderRibbon.java new file mode 100644 index 0000000..2f9bdcd --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/RenderRibbon.java @@ -0,0 +1,70 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.wiring.RenderWiring; +import com.eloraam.redpower.wiring.TileWiring; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderRibbon extends RenderWiring { + public RenderRibbon(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileCovered covered = (TileCovered)tile; + World world = covered.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.bindBlockTexture(); + super.context.setBrightness(this.getMixedBrightness(covered)); + super.context.setPos(x, y, z); + if (covered.CoverSides > 0) { + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.readGlobalLights(world, covered.xCoord, covered.xCoord, covered.zCoord); + this.renderCovers(covered.CoverSides, covered.Covers); + } + + TileWiring tw = (TileWiring)covered; + int indcon = tw.getExtConnectionMask(); + int cons = tw.getConnectionMask() | indcon; + int indconex = tw.EConEMask; + super.context.setTint(1.0F, 1.0F, 1.0F); + this.setSideIcon(RedPowerControl.ribbonTop, RedPowerControl.ribbonFace, RedPowerControl.ribbonTop); + this.setWireSize(0.5F, 0.0625F); + this.renderWireBlock(tw.ConSides, cons, indcon, indconex); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + super.context.setTexFlags(55); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.2F, -0.5); + } else { + super.context.setPos(0.0, 0.29999999701976776, 0.0); + } + + this.setSideIcon(RedPowerControl.ribbonTop, RedPowerControl.ribbonFace, RedPowerControl.ribbonTop); + this.setWireSize(0.5F, 0.0625F); + super.context.useNormal = true; + tess.startDrawingQuads(); + this.renderSideWires(127, 0, 0); + tess.draw(); + super.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileBackplane.java b/src/main/java/com/eloraam/redpower/control/TileBackplane.java new file mode 100644 index 0000000..02c8311 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileBackplane.java @@ -0,0 +1,132 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.TileMultipart; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileBackplane extends TileMultipart implements IFrameSupport { + public int Rotation = 0; + + public int readBackplane(int addr) { + return 255; + } + + public void writeBackplane(int addr, int val) { + } + + public Block getBlockType() { + return RedPowerControl.blockBackplane; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!super.worldObj + .getBlock(super.xCoord, super.yCoord - 1, super.zCoord) + .isSideSolid(super.worldObj, super.xCoord, super.yCoord - 1, super.zCoord, ForgeDirection.UP)) { + this.breakBlock(); + } else { + WorldCoord wc = new WorldCoord(this); + wc.step(CoreLib.rotToSide(this.Rotation) ^ 1); + Block bid = super.worldObj.getBlock(wc.x, wc.y, wc.z); + int md = super.worldObj.getBlockMetadata(wc.x, wc.y, wc.z); + if (bid != RedPowerControl.blockBackplane && (bid != RedPowerControl.blockPeripheral || md != 1)) { + this.breakBlock(); + } + } + + } + + @Override + public void addHarvestContents(List ist) { + ist.add(new ItemStack(RedPowerControl.blockBackplane, 1, 0)); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + this.breakBlock(willHarvest); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + return 0.1F; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); + } + + @Override + public int getSolidPartsMask() { + return 1; + } + + @Override + public int getPartsMask() { + return 1; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileCPU.java b/src/main/java/com/eloraam/redpower/control/TileCPU.java new file mode 100644 index 0000000..6f39d71 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileCPU.java @@ -0,0 +1,2028 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.RedbusLib; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.WorldCoord; +import java.io.IOException; +import java.io.InputStream; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileCPU extends TileExtended implements IRedbusConnectable, IFrameSupport { + public int Rotation = 0; + public byte[] memory = new byte[8192]; + private int addrPOR; + private int addrBRK; + private int regSP; + private int regPC; + private int regA; + private int regB; + private int regX; + private int regY; + private int regR; + private int regI; + private int regD; + private boolean flagC; + private boolean flagZ; + private boolean flagID; + private boolean flagD; + private boolean flagBRK; + private boolean flagO; + private boolean flagN; + private boolean flagE; + private boolean flagM; + private boolean flagX; + private int mmuRBB = 0; + private int mmuRBA = 0; + private int mmuRBW = 0; + private boolean mmuEnRB = false; + private boolean mmuEnRBW = false; + private boolean rbTimeout = false; + private boolean waiTimeout = false; + private IRedbusConnectable rbCache = null; + private TileBackplane[] backplane = new TileBackplane[7]; + private int rtcTicks = 0; + int sliceCycles = -1; + int diskAddr = 2; + int displayAddr = 1; + int rbaddr = 0; + + public TileCPU() { + this.coldBootCPU(); + } + + public void coldBootCPU() { + this.addrPOR = 8192; + this.addrBRK = 8192; + this.regSP = 512; + this.regPC = 1024; + this.regR = 768; + this.regA = 0; + this.regX = 0; + this.regY = 0; + this.regD = 0; + this.flagC = false; + this.flagZ = false; + this.flagID = false; + this.flagD = false; + this.flagBRK = false; + this.flagO = false; + this.flagN = false; + this.flagE = true; + this.flagM = true; + this.flagX = true; + this.memory[0] = (byte)this.diskAddr; + this.memory[1] = (byte)this.displayAddr; + + try { + InputStream is = RedPowerControl.class.getResourceAsStream("/assets/rpcontrol/forth/rpcboot.bin"); + Throwable var2 = null; + + try { + is.read(this.memory, 1024, 256); + } catch (Throwable var12) { + var2 = var12; + throw var12; + } finally { + if (is != null) { + if (var2 != null) { + try { + is.close(); + } catch (Throwable var11) { + var2.addSuppressed(var11); + } + } else { + is.close(); + } + } + + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + this.sliceCycles = -1; + } + + public void warmBootCPU() { + if (this.sliceCycles >= 0) { + this.regSP = 512; + this.regR = 768; + this.regPC = this.addrPOR; + } + + this.sliceCycles = 0; + } + + public void haltCPU() { + this.sliceCycles = -1; + } + + public boolean isRunning() { + return this.sliceCycles >= 0; + } + + @Override + public int rbGetAddr() { + return this.rbaddr; + } + + @Override + public void rbSetAddr(int addr) { + } + + @Override + public int rbRead(int reg) { + return !this.mmuEnRBW ? 0 : this.readOnlyMem(this.mmuRBW + reg); + } + + @Override + public void rbWrite(int reg, int dat) { + if (this.mmuEnRBW) { + this.writeOnlyMem(this.mmuRBW + reg, dat); + } + + } + + @Override + public int getConnectableMask() { + return 16777215; + } + + @Override + public int getConnectClass(int side) { + return 66; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) + 1 & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerControl.instance, 2, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + public Block getBlockType() { + return RedPowerControl.blockPeripheral; + } + + @Override + public int getExtendedID() { + return 1; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + protected void refreshBackplane() { + boolean bpok = true; + WorldCoord wc = new WorldCoord(this); + + for(int i = 0; i < 7; ++i) { + if (!bpok) { + this.backplane[i] = null; + } else { + wc.step(CoreLib.rotToSide(this.Rotation)); + TileBackplane tbp = CoreLib.getTileEntity(super.worldObj, wc, TileBackplane.class); + this.backplane[i] = tbp; + if (tbp == null) { + bpok = false; + } + } + } + + } + + @Override + public void updateEntity() { + ++this.rtcTicks; + if (this.sliceCycles >= 0) { + this.rbTimeout = false; + this.rbCache = null; + this.waiTimeout = false; + this.sliceCycles += 1000; + if (this.sliceCycles > 100000) { + this.sliceCycles = 100000; + } + + this.refreshBackplane(); + + while(this.sliceCycles > 0 && !this.waiTimeout && !this.rbTimeout) { + --this.sliceCycles; + this.executeInsn(); + } + } + + } + + protected int readOnlyMem(int addr) { + addr &= 65535; + if (addr < 8192) { + return this.memory[addr] & 0xFF; + } else { + int atop = (addr >> 13) - 1; + return this.backplane[atop] == null ? 255 : this.backplane[atop].readBackplane(addr & 8191); + } + } + + public int readMem(int addr) { + if (this.mmuEnRB && addr >= this.mmuRBB && addr < this.mmuRBB + 256) { + if (this.rbCache == null) { + this.rbCache = RedbusLib.getAddr(super.worldObj, new WorldCoord(this), this.mmuRBA); + } + + if (this.rbCache == null) { + this.rbTimeout = true; + return 0; + } else { + return this.rbCache.rbRead(addr - this.mmuRBB); + } + } else { + return this.readOnlyMem(addr); + } + } + + protected void writeOnlyMem(int addr, int val) { + addr &= 65535; + if (addr < 8192) { + this.memory[addr] = (byte)val; + } else { + int atop = (addr >> 13) - 1; + if (this.backplane[atop] != null) { + this.backplane[atop].writeBackplane(addr & 8191, val); + } + } + + } + + public void writeMem(int addr, int val) { + if (this.mmuEnRB && addr >= this.mmuRBB && addr < this.mmuRBB + 256) { + if (this.rbCache == null) { + this.rbCache = RedbusLib.getAddr(super.worldObj, new WorldCoord(this), this.mmuRBA); + } + + if (this.rbCache == null) { + this.rbTimeout = true; + } else { + this.rbCache.rbWrite(addr - this.mmuRBB, val & 0xFF); + } + } else { + this.writeOnlyMem(addr, val); + } + + } + + private void incPC() { + ++this.regPC; + } + + private int maskM() { + return this.flagM ? 255 : 65535; + } + + private int maskX() { + return this.flagX ? 255 : 65535; + } + + private int negM() { + return this.flagM ? 128 : 32768; + } + + private int negX() { + return this.flagX ? 128 : 32768; + } + + private int readB() { + int i = this.readMem(this.regPC); + this.incPC(); + return i; + } + + private int readM() { + int i = this.readMem(this.regPC); + this.incPC(); + if (!this.flagM) { + i |= this.readMem(this.regPC) << 8; + this.incPC(); + } + + return i; + } + + private int readX() { + int i = this.readMem(this.regPC); + this.incPC(); + if (!this.flagX) { + i |= this.readMem(this.regPC) << 8; + this.incPC(); + } + + return i; + } + + private int readM(int addr) { + int i = this.readMem(addr); + if (!this.flagM) { + i |= this.readMem(addr + 1) << 8; + } + + return i; + } + + private int readX(int addr) { + int i = this.readMem(addr); + if (!this.flagX) { + i |= this.readMem(addr + 1) << 8; + } + + return i; + } + + private void writeM(int addr, int reg) { + this.writeMem(addr, reg); + if (!this.flagM) { + this.writeMem(addr + 1, reg >> 8); + } + + } + + private void writeX(int addr, int reg) { + this.writeMem(addr, reg); + if (!this.flagX) { + this.writeMem(addr + 1, reg >> 8); + } + + } + + private int readBX() { + int i = this.readMem(this.regPC) + this.regX; + if (this.flagX) { + i &= 255; + } + + this.incPC(); + return i; + } + + private int readBY() { + int i = this.readMem(this.regPC) + this.regY; + if (this.flagX) { + i &= 255; + } + + this.incPC(); + return i; + } + + private int readBS() { + int i = this.readMem(this.regPC) + this.regSP; + this.incPC(); + return i; + } + + private int readBR() { + int i = this.readMem(this.regPC) + this.regR; + this.incPC(); + return i; + } + + private int readBSWY() { + int i = this.readMem(this.regPC) + this.regSP; + this.incPC(); + return this.readW(i) + this.regY; + } + + private int readBRWY() { + int i = this.readMem(this.regPC) + this.regR; + this.incPC(); + return this.readW(i) + this.regY; + } + + private int readW() { + int i = this.readMem(this.regPC); + this.incPC(); + i |= this.readMem(this.regPC) << 8; + this.incPC(); + return i; + } + + private int readW(int addr) { + int i = this.readMem(addr); + return i | this.readMem(addr + 1) << 8; + } + + private int readWX() { + int i = this.readMem(this.regPC); + this.incPC(); + i |= this.readMem(this.regPC) << 8; + this.incPC(); + return i + this.regX; + } + + private int readWY() { + int i = this.readMem(this.regPC); + this.incPC(); + i |= this.readMem(this.regPC) << 8; + this.incPC(); + return i + this.regY; + } + + private int readWXW() { + int i = this.readMem(this.regPC); + this.incPC(); + i |= this.readMem(this.regPC) << 8; + this.incPC(); + i += this.regX; + int j = this.readMem(i); + return j | this.readMem(i + 1) << 8; + } + + private int readBW() { + int i = this.readMem(this.regPC); + this.incPC(); + int j = this.readMem(i); + return j | this.readMem(i + 1) << 8; + } + + private int readWW() { + int i = this.readMem(this.regPC); + this.incPC(); + i |= this.readMem(this.regPC) << 8; + this.incPC(); + int j = this.readMem(i); + return j | this.readMem(i + 1) << 8; + } + + private int readBXW() { + int i = this.readMem(this.regPC) + this.regX & 0xFF; + this.incPC(); + int j = this.readMem(i); + return j | this.readMem(i + 1) << 8; + } + + private int readBWY() { + int i = this.readMem(this.regPC); + this.incPC(); + int j = this.readMem(i); + j |= this.readMem(i + 1) << 8; + return j + this.regY; + } + + private void upNZ() { + this.flagN = (this.regA & this.negM()) > 0; + this.flagZ = this.regA == 0; + } + + private void upNZ(int i) { + this.flagN = (i & this.negM()) > 0; + this.flagZ = i == 0; + } + + private void upNZX(int i) { + this.flagN = (i & this.negX()) > 0; + this.flagZ = i == 0; + } + + private void push1(int b) { + if (this.flagE) { + this.regSP = this.regSP - 1 & 0xFF | this.regSP & 0xFF00; + } else { + --this.regSP; + } + + this.writeMem(this.regSP, b); + } + + private void push1r(int b) { + --this.regR; + this.writeMem(this.regR, b); + } + + private void push2(int w) { + this.push1(w >> 8); + this.push1(w & 0xFF); + } + + private void push2r(int w) { + this.push1r(w >> 8); + this.push1r(w & 0xFF); + } + + private void pushM(int b) { + if (this.flagM) { + this.push1(b); + } else { + this.push2(b); + } + + } + + private void pushX(int b) { + if (this.flagX) { + this.push1(b); + } else { + this.push2(b); + } + + } + + private void pushMr(int b) { + if (this.flagM) { + this.push1r(b); + } else { + this.push2r(b); + } + + } + + private void pushXr(int b) { + if (this.flagX) { + this.push1r(b); + } else { + this.push2r(b); + } + + } + + private int pop1() { + int tr = this.readMem(this.regSP); + if (this.flagE) { + this.regSP = this.regSP + 1 & 0xFF | this.regSP & 0xFF00; + } else { + ++this.regSP; + } + + return tr; + } + + private int pop1r() { + int tr = this.readMem(this.regR); + ++this.regR; + return tr; + } + + private int pop2() { + int tr = this.pop1(); + return tr | this.pop1() << 8; + } + + private int pop2r() { + int tr = this.pop1r(); + return tr | this.pop1r() << 8; + } + + private int popM() { + return this.flagM ? this.pop1() : this.pop2(); + } + + private int popMr() { + return this.flagM ? this.pop1r() : this.pop2r(); + } + + private int popX() { + return this.flagX ? this.pop1() : this.pop2(); + } + + private int popXr() { + return this.flagX ? this.pop1r() : this.pop2r(); + } + + private int getFlags() { + return (this.flagC ? 1 : 0) + | (this.flagZ ? 2 : 0) + | (this.flagID ? 4 : 0) + | (this.flagD ? 8 : 0) + | (this.flagX ? 16 : 0) + | (this.flagM ? 32 : 0) + | (this.flagO ? 64 : 0) + | (this.flagN ? 128 : 0); + } + + private void setFlags(int flags) { + this.flagC = (flags & 1) > 0; + this.flagZ = (flags & 2) > 0; + this.flagID = (flags & 4) > 0; + this.flagD = (flags & 8) > 0; + boolean m2 = (flags & 32) > 0; + this.flagO = (flags & 64) > 0; + this.flagN = (flags & 128) > 0; + if (this.flagE) { + this.flagX = false; + this.flagM = false; + } else { + this.flagX = (flags & 16) > 0; + if (this.flagX) { + this.regX &= 255; + this.regY &= 255; + } + + if (m2 != this.flagM) { + if (m2) { + this.regB = this.regA >> 8; + this.regA &= 255; + } else { + this.regA |= this.regB << 8; + } + + this.flagM = m2; + } + } + + } + + private void i_adc(int val) { + if (this.flagM) { + if (this.flagD) { + int v = (this.regA & 15) + (val & 15) + (this.flagC ? 1 : 0); + if (v > 9) { + v = (v + 6 & 15) + 16; + } + + int v2 = (this.regA & 240) + (val & 240) + v; + if (v2 > 160) { + v2 += 96; + } + + this.flagC = v2 > 100; + this.regA = v2 & 0xFF; + this.flagO = false; + } else { + int v = this.regA + val + (this.flagC ? 1 : 0); + this.flagC = v > 255; + this.flagO = ((v ^ this.regA) & (v ^ val) & 128) > 0; + this.regA = v & 0xFF; + } + } else { + int v = this.regA + val + (this.flagC ? 1 : 0); + this.flagC = v > 65535; + this.flagO = ((v ^ this.regA) & (v ^ val) & 32768) > 0; + this.regA = v; + } + + this.upNZ(); + } + + private void i_sbc(int val) { + if (this.flagM) { + if (this.flagD) { + int v = (this.regA & 15) - (val & 15) + (this.flagC ? 1 : 0) - 1; + if (v < 0) { + v = (v - 6 & 15) - 16; + } + + int v2 = (this.regA & 240) - (val & 240) + v; + if (v2 < 0) { + v2 -= 96; + } + + this.flagC = v2 < 100; + this.regA = v2 & 0xFF; + this.flagO = false; + } else { + int v = this.regA - val + (this.flagC ? 1 : 0) - 1; + this.flagC = (v & 256) == 0; + this.flagO = ((v ^ this.regA) & (v ^ -val) & 128) > 0; + this.regA = v & 0xFF; + } + } else { + int v = this.regA - val + (this.flagC ? 1 : 0) - 1; + this.flagC = (v & 65536) == 0; + this.flagO = ((v ^ this.regA) & (v ^ -val) & 32768) > 0; + this.regA = v; + } + + this.upNZ(); + } + + private void i_mul(int val) { + if (this.flagM) { + int v; + if (this.flagC) { + v = (byte)val * (byte)this.regA; + } else { + v = val * this.regA; + } + + this.regA = v & 0xFF; + this.regD = v >> 8 & 0xFF; + this.flagN = v < 0; + this.flagZ = v == 0; + this.flagO = this.regD != 0 && this.regD != 255; + } else { + long v1; + if (this.flagC) { + v1 = (long)((short)val * (short)this.regA); + } else { + v1 = (long)(val * this.regA); + } + + this.regA = (int)(v1 & 65535L); + this.regD = (int)(v1 >> 16 & 65535L); + this.flagN = v1 < 0L; + this.flagZ = v1 == 0L; + this.flagO = this.regD != 0 && this.regD != 65535; + } + + } + + private void i_div(int val) { + if (val == 0) { + this.regA = 0; + this.regD = 0; + this.flagO = true; + this.flagZ = false; + this.flagN = false; + } else if (this.flagM) { + int q; + if (this.flagC) { + q = (byte)this.regD << 8 | this.regA; + val = (byte)val; + } else { + q = this.regD << 8 | this.regA; + } + + this.regD = q % val & 0xFF; + q /= val; + this.regA = q & 0xFF; + if (!this.flagC) { + this.flagO = q > 255; + } else { + this.flagO = q > 127 || q < -128; + } + + this.flagZ = this.regA == 0; + this.flagN = q < 0; + } else if (this.flagC) { + int q = (short)this.regD << 16 | this.regA; + short val1 = (short)val; + this.regD = q % val1; + q /= val1; + this.regA = q; + this.flagO = q > 32767 || q < -32768; + this.flagZ = this.regA == 0; + this.flagN = q < 0; + } else { + long q1 = (long)(this.regD << 16 | this.regA); + this.regD = (int)(q1 % (long)val & 65535L); + q1 /= (long)val; + this.regA = (int)(q1 & 65535L); + this.flagO = q1 > 65535L; + this.flagZ = this.regA == 0; + this.flagN = q1 < 0L; + } + + } + + private void i_and(int val) { + this.regA &= val; + this.upNZ(); + } + + private void i_asl(int addr) { + int i = this.readM(addr); + this.flagC = (i & this.negM()) > 0; + i = i << 1 & this.maskM(); + this.upNZ(i); + this.writeM(addr, i); + } + + private void i_lsr(int addr) { + int i = this.readM(addr); + this.flagC = (i & 1) > 0; + i >>>= 1; + this.upNZ(i); + this.writeM(addr, i); + } + + private void i_rol(int addr) { + int i = this.readM(addr); + int n = (i << 1 | (this.flagC ? 1 : 0)) & this.maskM(); + this.flagC = (i & this.negM()) > 0; + this.upNZ(n); + this.writeM(addr, n); + } + + private void i_ror(int addr) { + int i = this.readM(addr); + int n = i >>> 1 | (this.flagC ? this.negM() : 0); + this.flagC = (i & 1) > 0; + this.upNZ(n); + this.writeM(addr, n); + } + + private void i_brc(boolean cond) { + int n = this.readB(); + if (cond) { + this.regPC += (byte)n; + } + + } + + private void i_bit(int val) { + if (this.flagM) { + this.flagO = (val & 64) > 0; + this.flagN = (val & 128) > 0; + } else { + this.flagO = (val & 16384) > 0; + this.flagN = (val & 32768) > 0; + } + + this.flagZ = (val & this.regA) > 0; + } + + private void i_trb(int val) { + this.flagZ = (val & this.regA) > 0; + this.regA &= ~val; + } + + private void i_tsb(int val) { + this.flagZ = (val & this.regA) > 0; + this.regA |= val; + } + + private void i_cmp(int reg, int val) { + reg -= val; + this.flagC = reg >= 0; + this.flagZ = reg == 0; + this.flagN = (reg & this.negM()) > 0; + } + + private void i_cmpx(int reg, int val) { + reg -= val; + this.flagC = reg >= 0; + this.flagZ = reg == 0; + this.flagN = (reg & this.negX()) > 0; + } + + private void i_dec(int addr) { + int i = this.readM(addr); + i = i - 1 & this.maskM(); + this.writeM(addr, i); + this.upNZ(i); + } + + private void i_inc(int addr) { + int i = this.readM(addr); + i = i + 1 & this.maskM(); + this.writeM(addr, i); + this.upNZ(i); + } + + private void i_eor(int val) { + this.regA ^= val; + this.upNZ(); + } + + private void i_or(int val) { + this.regA |= val; + this.upNZ(); + } + + private void i_mmu(int mmu) { + switch(mmu) { + case 0: + int t = this.regA & 0xFF; + if (this.mmuRBA != t) { + if (this.rbCache != null) { + this.rbTimeout = true; + } + + this.mmuRBA = t; + } + break; + case 1: + this.mmuRBB = this.regA; + break; + case 2: + this.mmuEnRB = true; + break; + case 3: + this.mmuRBW = this.regA; + break; + case 4: + this.mmuEnRBW = true; + break; + case 5: + this.addrBRK = this.regA; + break; + case 6: + this.addrPOR = this.regA; + break; + case 128: + this.regA = this.mmuRBA; + break; + case 129: + this.regA = this.mmuRBB; + if (this.flagM) { + this.regB = this.regA >> 8; + this.regA &= 255; + } + break; + case 130: + this.mmuEnRB = false; + break; + case 131: + this.regA = this.mmuRBW; + if (this.flagM) { + this.regB = this.regA >> 8; + this.regA &= 255; + } + break; + case 132: + this.mmuEnRBW = false; + break; + case 133: + this.regA = this.addrBRK; + if (this.flagM) { + this.regB = this.regA >> 8; + this.regA &= 255; + } + break; + case 134: + this.regA = this.addrPOR; + if (this.flagM) { + this.regB = this.regA >> 8; + this.regA &= 255; + } + break; + case 135: + this.regA = this.rtcTicks; + this.regD = this.rtcTicks >> 16; + } + + } + + public void executeInsn() { + int insn = this.readMem(this.regPC); + this.incPC(); + switch(insn) { + case 0: + this.push2(this.regPC); + this.push1(this.getFlags()); + this.flagBRK = true; + this.regPC = this.addrBRK; + break; + case 1: + this.i_or(this.readM(this.readBXW())); + break; + case 2: + this.regPC = this.readW(this.regI); + this.regI += 2; + break; + case 3: + this.i_or(this.readM(this.readBS())); + break; + case 4: + this.i_tsb(this.readM(this.readB())); + break; + case 5: + this.i_or(this.readM(this.readB())); + break; + case 6: + this.i_asl(this.readB()); + break; + case 7: + this.i_or(this.readM(this.readBR())); + break; + case 8: + this.push1(this.getFlags()); + break; + case 9: + this.i_or(this.readM()); + break; + case 10: + this.flagC = (this.regA & this.negM()) > 0; + this.regA = this.regA << 1 & this.maskM(); + this.upNZ(); + break; + case 11: + this.push2r(this.regI); + break; + case 12: + this.i_tsb(this.readM(this.readW())); + break; + case 13: + this.i_or(this.readM(this.readW())); + break; + case 14: + this.i_asl(this.readW()); + break; + case 15: + this.i_mul(this.readM(this.readB())); + break; + case 16: + this.i_brc(!this.flagN); + break; + case 17: + this.i_or(this.readM(this.readBWY())); + break; + case 18: + this.i_or(this.readM(this.readBW())); + break; + case 19: + this.i_or(this.readM(this.readBSWY())); + break; + case 20: + this.i_trb(this.readM(this.readB())); + break; + case 21: + this.i_or(this.readM(this.readBX())); + break; + case 22: + this.i_asl(this.readBX()); + break; + case 23: + this.i_or(this.readM(this.readBRWY())); + break; + case 24: + this.flagC = false; + break; + case 25: + this.i_or(this.readM(this.readWY())); + break; + case 26: + this.regA = this.regA + 1 & this.maskM(); + this.upNZ(this.regA); + break; + case 27: + this.pushXr(this.regX); + break; + case 28: + this.i_trb(this.readM(this.readW())); + break; + case 29: + this.i_or(this.readM(this.readWX())); + break; + case 30: + this.i_asl(this.readWX()); + break; + case 31: + this.i_mul(this.readM(this.readBX())); + break; + case 32: + this.push2(this.regPC + 1); + this.regPC = this.readW(); + break; + case 33: + this.i_and(this.readM(this.readBXW())); + break; + case 34: + this.push2r(this.regI); + this.regI = this.regPC + 2; + this.regPC = this.readW(this.regPC); + break; + case 35: + this.i_and(this.readM(this.readBS())); + break; + case 36: + this.i_bit(this.readM(this.readB())); + break; + case 37: + this.i_and(this.readM(this.readB())); + break; + case 38: + this.i_rol(this.readB()); + break; + case 39: + this.i_and(this.readM(this.readBR())); + break; + case 40: + this.setFlags(this.pop1()); + break; + case 41: + this.i_and(this.readM()); + break; + case 42: { + int n = (this.regA << 1 | (this.flagC ? 1 : 0)) & this.maskM(); + this.flagC = (this.regA & this.negM()) > 0; + this.regA = n; + this.upNZ(); + break; + } + case 43: + this.regI = this.pop2r(); + this.upNZX(this.regI); + break; + case 44: + this.i_bit(this.readM(this.readW())); + break; + case 45: + this.i_and(this.readM(this.readW())); + break; + case 46: + this.i_rol(this.readW()); + break; + case 47: + this.i_mul(this.readM(this.readW())); + break; + case 48: + this.i_brc(this.flagN); + break; + case 49: + this.i_and(this.readM(this.readBWY())); + break; + case 50: + this.i_and(this.readM(this.readBW())); + break; + case 51: + this.i_and(this.readM(this.readBSWY())); + break; + case 52: + this.i_bit(this.readM(this.readBX())); + break; + case 53: + this.i_and(this.readM(this.readBX())); + break; + case 54: + this.i_rol(this.readBX()); + break; + case 55: + this.i_and(this.readM(this.readBRWY())); + break; + case 56: + this.flagC = true; + break; + case 57: + this.i_and(this.readM(this.readWY())); + break; + case 58: + this.regA = this.regA - 1 & this.maskM(); + this.upNZ(this.regA); + break; + case 59: + this.regX = this.popXr(); + this.upNZX(this.regX); + break; + case 60: + this.i_bit(this.readM(this.readWX())); + break; + case 61: + this.i_and(this.readM(this.readWX())); + break; + case 62: + this.i_rol(this.readWX()); + break; + case 63: + this.i_mul(this.readM(this.readWX())); + break; + case 64: + this.setFlags(this.pop1()); + this.regPC = this.pop2(); + break; + case 65: + this.i_eor(this.readM(this.readBXW())); + break; + case 66: + if (this.flagM) { + this.regA = this.readMem(this.regI); + ++this.regI; + } else { + this.regA = this.readW(this.regI); + this.regI += 2; + } + break; + case 67: + this.i_eor(this.readM(this.readBS())); + break; + case 68: + this.push2r(this.readW()); + break; + case 69: + this.i_eor(this.readM(this.readB())); + break; + case 70: + this.i_lsr(this.readB()); + break; + case 71: + this.i_eor(this.readM(this.readBR())); + break; + case 72: + this.pushM(this.regA); + break; + case 73: + this.i_eor(this.readM()); + break; + case 74: + this.flagC = (this.regA & 1) > 0; + this.regA >>>= 1; + this.upNZ(); + break; + case 75: + this.pushMr(this.regA); + break; + case 76: + this.regPC = this.readW(); + break; + case 77: + this.i_eor(this.readM(this.readW())); + break; + case 78: + this.i_lsr(this.readW()); + break; + case 79: + this.i_div(this.readM(this.readB())); + break; + case 80: + this.i_brc(!this.flagO); + break; + case 81: + this.i_eor(this.readM(this.readBWY())); + break; + case 82: + this.i_eor(this.readM(this.readBW())); + break; + case 83: + this.i_eor(this.readM(this.readBSWY())); + break; + case 84: + this.push2r(this.readBW()); + break; + case 85: + this.i_eor(this.readM(this.readBX())); + break; + case 86: + this.i_lsr(this.readBX()); + break; + case 87: + this.i_eor(this.readM(this.readBRWY())); + break; + case 88: + this.flagID = false; + break; + case 89: + this.i_eor(this.readM(this.readWY())); + break; + case 90: + this.pushX(this.regY); + break; + case 91: + this.pushXr(this.regY); + break; + case 92: + this.regI = this.regX; + this.upNZX(this.regX); + break; + case 93: + this.i_eor(this.readM(this.readWX())); + break; + case 94: + this.i_lsr(this.readWX()); + break; + case 95: + this.i_div(this.readM(this.readBX())); + break; + case 96: + this.regPC = this.pop2() + 1; + break; + case 97: + this.i_adc(this.readM(this.readBXW())); + break; + case 98: { + int n = this.readB(); + this.push2(this.regPC + n); + break; + } + case 99: + this.i_adc(this.readM(this.readBS())); + break; + case 100: + this.writeM(this.readB(), 0); + break; + case 101: + this.i_adc(this.readM(this.readB())); + break; + case 102: + this.i_ror(this.readB()); + break; + case 103: + this.i_adc(this.readM(this.readBR())); + break; + case 104: + this.regA = this.popM(); + this.upNZ(); + break; + case 105: + this.i_adc(this.readM()); + break; + case 106: { + int n = this.regA >>> 1 | (this.flagC ? this.negM() : 0); + this.flagC = (this.regA & 1) > 0; + this.regA = n; + this.upNZ(); + break; + } + case 107: + this.regA = this.popMr(); + this.upNZ(this.regA); + break; + case 108: + this.regPC = this.readWW(); + break; + case 109: + this.i_adc(this.readM(this.readW())); + break; + case 110: + this.i_ror(this.readW()); + break; + case 111: + this.i_div(this.readM(this.readW())); + break; + case 112: + this.i_brc(this.flagO); + break; + case 113: + this.i_adc(this.readM(this.readBWY())); + break; + case 114: + this.i_adc(this.readM(this.readBW())); + break; + case 115: + this.i_adc(this.readM(this.readBSWY())); + break; + case 116: + this.writeM(this.readBX(), 0); + break; + case 117: + this.i_adc(this.readM(this.readBX())); + break; + case 118: + this.i_ror(this.readBX()); + break; + case 119: + this.i_adc(this.readM(this.readBRWY())); + break; + case 120: + this.flagID = true; + break; + case 121: + this.i_adc(this.readM(this.readWY())); + break; + case 122: + this.regY = this.popX(); + this.upNZX(this.regY); + break; + case 123: + this.regY = this.popXr(); + this.upNZX(this.regY); + break; + case 124: + this.regPC = this.readWXW(); + break; + case 125: + this.i_adc(this.readM(this.readWX())); + break; + case 126: + this.i_ror(this.readWX()); + break; + case 127: + this.i_div(this.readM(this.readWX())); + break; + case 128: + this.i_brc(true); + break; + case 129: + this.writeM(this.readBXW(), this.regA); + break; + case 130: { + int n = this.readB(); + this.push2r(this.regPC + n); + break; + } + case 131: + this.writeM(this.readBS(), this.regA); + break; + case 132: + this.writeX(this.readB(), this.regY); + break; + case 133: + this.writeM(this.readB(), this.regA); + break; + case 134: + this.writeX(this.readB(), this.regX); + break; + case 135: + this.writeM(this.readBR(), this.regA); + break; + case 136: + this.regY = this.regY - 1 & this.maskX(); + this.upNZ(this.regY); + break; + case 137: + this.flagZ = (this.readM() & this.regA) == 0; + break; + case 138: + this.regA = this.regX; + if (this.flagM) { + this.regA &= 255; + } + + this.upNZ(); + break; + case 139: + if (this.flagX) { + this.regSP = this.regR & 0xFF00 | this.regX & 0xFF; + } else { + this.regR = this.regX; + } + + this.upNZX(this.regR); + break; + case 140: + this.writeX(this.readW(), this.regY); + break; + case 141: + this.writeM(this.readW(), this.regA); + break; + case 142: + this.writeX(this.readW(), this.regX); + break; + case 143: + this.regD = 0; + this.regB = 0; + break; + case 144: + this.i_brc(!this.flagC); + break; + case 145: + this.writeM(this.readBWY(), this.regA); + break; + case 146: + this.writeM(this.readBW(), this.regA); + break; + case 147: + this.writeM(this.readBSWY(), this.regA); + break; + case 148: + this.writeX(this.readBX(), this.regY); + break; + case 149: + this.writeM(this.readBX(), this.regA); + break; + case 150: + this.writeX(this.readBY(), this.regX); + break; + case 151: + this.writeM(this.readBRWY(), this.regA); + break; + case 152: + this.regA = this.regY; + if (this.flagM) { + this.regA &= 255; + } + + this.upNZX(this.regY); + break; + case 153: + this.writeM(this.readWY(), this.regA); + break; + case 154: + if (this.flagX) { + this.regSP = this.regSP & 0xFF00 | this.regX & 0xFF; + } else { + this.regSP = this.regX; + } + + this.upNZX(this.regX); + break; + case 155: + this.regY = this.regX; + this.upNZX(this.regY); + break; + case 156: + this.writeM(this.readW(), 0); + break; + case 157: + this.writeM(this.readWX(), this.regA); + break; + case 158: + this.writeM(this.readWX(), 0); + break; + case 159: + this.regD = (this.regA & this.negM()) > 0 ? '\uffff' : 0; + this.regB = this.regD & 0xFF; + break; + case 160: + this.regY = this.readX(); + this.upNZ(this.regY); + break; + case 161: + this.regA = this.readM(this.readBXW()); + this.upNZ(); + break; + case 162: + this.regX = this.readX(); + this.upNZ(this.regX); + break; + case 163: + this.regA = this.readM(this.readBS()); + this.upNZ(); + break; + case 164: + this.regY = this.readX(this.readB()); + this.upNZ(this.regY); + break; + case 165: + this.regA = this.readM(this.readB()); + this.upNZ(); + break; + case 166: + this.regX = this.readX(this.readB()); + this.upNZ(this.regX); + break; + case 167: + this.regA = this.readM(this.readBR()); + this.upNZ(); + break; + case 168: + this.regY = this.regA; + if (this.flagX) { + this.regY &= 255; + } + + this.upNZX(this.regY); + break; + case 169: + this.regA = this.readM(); + this.upNZ(); + break; + case 170: + this.regX = this.regA; + if (this.flagX) { + this.regX &= 255; + } + + this.upNZX(this.regX); + break; + case 171: + this.regX = this.regR; + if (this.flagX) { + this.regX &= 255; + } + + this.upNZX(this.regX); + break; + case 172: + this.regY = this.readX(this.readW()); + this.upNZ(this.regY); + break; + case 173: + this.regA = this.readM(this.readW()); + this.upNZ(); + break; + case 174: + this.regX = this.readX(this.readW()); + this.upNZ(this.regX); + break; + case 175: + this.regA = this.regD; + if (this.flagM) { + this.regA &= 255; + } + + this.upNZ(this.regA); + break; + case 176: + this.i_brc(this.flagC); + break; + case 177: + this.regA = this.readM(this.readBWY()); + this.upNZ(); + break; + case 178: + this.regA = this.readM(this.readBW()); + this.upNZ(); + break; + case 179: + this.regA = this.readM(this.readBSWY()); + this.upNZ(); + break; + case 180: + this.regY = this.readX(this.readBX()); + this.upNZ(this.regY); + break; + case 181: + this.regA = this.readM(this.readBX()); + this.upNZ(); + break; + case 182: + this.regX = this.readX(this.readBY()); + this.upNZ(this.regX); + break; + case 183: + this.regA = this.readM(this.readBRWY()); + this.upNZ(); + break; + case 184: + this.flagO = false; + break; + case 185: + this.regA = this.readM(this.readWY()); + this.upNZ(); + break; + case 186: + this.regX = this.regSP; + if (this.flagX) { + this.regX &= 255; + } + + this.upNZX(this.regX); + break; + case 187: + this.regX = this.regY; + this.upNZX(this.regX); + break; + case 188: + this.regY = this.readX(this.readWX()); + this.upNZ(this.regY); + break; + case 189: + this.regA = this.readM(this.readWX()); + this.upNZ(); + break; + case 190: + this.regX = this.readX(this.readWY()); + this.upNZ(this.regX); + break; + case 191: + if (this.flagM) { + this.regD = this.regA | this.regB << 8; + } else { + this.regD = this.regA; + } + + this.upNZ(this.regA); + break; + case 192: + this.i_cmpx(this.regY, this.readX()); + break; + case 193: + this.i_cmp(this.regA, this.readM(this.readBXW())); + break; + case 194: + this.setFlags(this.getFlags() & ~this.readB()); + break; + case 195: + this.i_cmp(this.regA, this.readM(this.readBS())); + break; + case 196: + this.i_cmpx(this.regY, this.readX(this.readB())); + break; + case 197: + this.i_cmp(this.regA, this.readM(this.readB())); + break; + case 198: + this.i_dec(this.readB()); + break; + case 199: + this.i_cmp(this.regA, this.readM(this.readBR())); + break; + case 200: + this.regY = this.regY + 1 & this.maskX(); + this.upNZ(this.regY); + break; + case 201: + this.i_cmp(this.regA, this.readM()); + break; + case 202: + this.regX = this.regX - 1 & this.maskX(); + this.upNZ(this.regX); + break; + case 203: + this.waiTimeout = true; + break; + case 204: + this.i_cmpx(this.regY, this.readX(this.readW())); + break; + case 205: + this.i_cmp(this.regA, this.readM(this.readW())); + break; + case 206: + this.i_dec(this.readW()); + break; + case 207: + this.regD = this.popM(); + break; + case 208: + this.i_brc(!this.flagZ); + break; + case 209: + this.i_cmp(this.regA, this.readM(this.readBWY())); + break; + case 210: + this.i_cmp(this.regA, this.readM(this.readBW())); + break; + case 211: + this.i_cmp(this.regA, this.readM(this.readBSWY())); + break; + case 212: + this.push2(this.readBW()); + break; + case 213: + this.i_cmp(this.regA, this.readM(this.readBX())); + break; + case 214: + this.i_dec(this.readBX()); + break; + case 215: + this.i_cmp(this.regA, this.readM(this.readBRWY())); + break; + case 216: + this.flagD = false; + break; + case 217: + this.i_cmp(this.regA, this.readM(this.readWY())); + break; + case 218: + this.pushX(this.regX); + break; + case 219: + this.sliceCycles = -1; + if (super.worldObj.isAirBlock(super.xCoord, super.yCoord + 1, super.zCoord)) { + super.worldObj + .playSoundEffect( + (double)super.xCoord + 0.5, + (double)super.yCoord + 0.5, + (double)super.zCoord + 0.5, + "fire.ignite", + 1.0F, + super.worldObj.rand.nextFloat() * 0.4F + 0.8F + ); + super.worldObj.setBlock(super.xCoord, super.yCoord + 1, super.zCoord, Blocks.fire, 0, 3); + } + break; + case 220: + this.regX = this.regI; + if (this.flagX) { + this.regX &= 255; + } + + this.upNZX(this.regX); + break; + case 221: + this.i_cmp(this.regA, this.readM(this.readWX())); + break; + case 222: + this.i_dec(this.readWX()); + break; + case 223: + this.pushM(this.regD); + break; + case 224: + this.i_cmpx(this.regX, this.readX()); + break; + case 225: + this.i_sbc(this.readM(this.readBXW())); + break; + case 226: + this.setFlags(this.getFlags() | this.readB()); + break; + case 227: + this.i_sbc(this.readM(this.readBS())); + break; + case 228: + this.i_cmpx(this.regX, this.readX(this.readB())); + break; + case 229: + this.i_sbc(this.readM(this.readB())); + break; + case 230: + this.i_inc(this.readB()); + break; + case 231: + this.i_sbc(this.readM(this.readBR())); + break; + case 232: + this.regX = this.regX + 1 & this.maskX(); + this.upNZ(this.regX); + break; + case 233: + this.i_sbc(this.readM()); + case 234: + default: + break; + case 235: + if (this.flagM) { + int nx = this.regA; + this.regA = this.regB; + this.regB = nx; + } else { + this.regA = this.regA >> 8 & 0xFF | this.regA << 8 & 0xFF00; + } + break; + case 236: + this.i_cmpx(this.regX, this.readX(this.readW())); + break; + case 237: + this.i_sbc(this.readM(this.readW())); + break; + case 238: + this.i_inc(this.readW()); + break; + case 239: + this.i_mmu(this.readB()); + break; + case 240: + this.i_brc(this.flagZ); + break; + case 241: + this.i_sbc(this.readM(this.readBWY())); + break; + case 242: + this.i_sbc(this.readM(this.readBW())); + break; + case 243: + this.i_sbc(this.readM(this.readBSWY())); + break; + case 244: + this.push2(this.readW()); + break; + case 245: + this.i_sbc(this.readM(this.readBX())); + break; + case 246: + this.i_inc(this.readBX()); + break; + case 247: + this.i_sbc(this.readM(this.readBRWY())); + break; + case 248: + this.flagD = true; + break; + case 249: + this.i_sbc(this.readM(this.readWY())); + break; + case 250: + this.regX = this.popX(); + this.upNZX(this.regX); + break; + case 251: + if (this.flagE != this.flagC) { + if (this.flagE) { + this.flagE = false; + this.flagC = true; + } else { + this.flagE = true; + this.flagC = false; + if (!this.flagM) { + this.regB = this.regA >> 8; + } + + this.flagM = true; + this.flagX = true; + this.regA &= 255; + this.regX &= 255; + this.regY &= 255; + } + } + break; + case 252: + this.push2(this.regPC + 1); + this.regPC = this.readWXW(); + break; + case 253: + this.i_sbc(this.readM(this.readWX())); + break; + case 254: + this.i_inc(this.readWX()); + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + this.writeToPacket(tag); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.readFromPacket(tag); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.memory = data.getByteArray("ram"); + if (this.memory.length != 8192) { + this.memory = new byte[8192]; + } + + this.Rotation = data.getByte("rot"); + this.addrPOR = data.getShort("por"); + this.addrBRK = data.getShort("brk"); + byte efl = data.getByte("efl"); + this.flagE = (efl & 1) > 0; + this.mmuEnRB = (efl & 2) > 0; + this.mmuEnRBW = (efl & 4) > 0; + this.setFlags(data.getByte("fl")); + this.regSP = data.getShort("rsp"); + this.regPC = data.getShort("rpc"); + this.regA = data.getShort("ra"); + if (this.flagM) { + this.regB = this.regA >> 8; + this.regA &= 255; + } + + this.regX = data.getShort("rx"); + this.regY = data.getShort("ry"); + this.regD = data.getShort("rd"); + this.regR = data.getShort("rr"); + this.regI = data.getShort("ri"); + this.mmuRBB = data.getShort("mmrb"); + this.mmuRBW = data.getShort("mmrbw"); + this.mmuRBA = data.getByte("mmra") & 255; + this.sliceCycles = data.getInteger("cyc"); + this.rtcTicks = data.getInteger("rtct"); + this.diskAddr = data.getByte("diskaddr") & 255; + this.displayAddr = data.getByte("displayaddr") & 255; + this.rbaddr = data.getByte("rbaddr") & 255; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + data.setByteArray("ram", this.memory); + data.setShort("por", (short)this.addrPOR); + data.setShort("brk", (short)this.addrBRK); + int efl = (this.flagE ? 1 : 0) | (this.mmuEnRB ? 2 : 0) | (this.mmuEnRBW ? 4 : 0); + data.setByte("efl", (byte)efl); + data.setByte("fl", (byte)this.getFlags()); + data.setShort("rsp", (short)this.regSP); + data.setShort("rpc", (short)this.regPC); + if (this.flagM) { + this.regA = this.regA & 0xFF | this.regB << 8; + } + + data.setShort("ra", (short)this.regA); + if (this.flagM) { + this.regA &= 255; + } + + data.setShort("rx", (short)this.regX); + data.setShort("ry", (short)this.regY); + data.setShort("rd", (short)this.regD); + data.setShort("rr", (short)this.regR); + data.setShort("ri", (short)this.regI); + data.setShort("mmrb", (short)this.mmuRBB); + data.setShort("mmrbw", (short)this.mmuRBW); + data.setByte("mmra", (byte)this.mmuRBA); + data.setInteger("cyc", this.sliceCycles); + data.setInteger("rtct", this.rtcTicks); + data.setByte("diskaddr", (byte)this.diskAddr); + data.setByte("displayaddr", (byte)this.displayAddr); + data.setByte("rbaddr", (byte)this.rbaddr); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getInteger("rot"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("rot", this.Rotation); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileDiskDrive.java b/src/main/java/com/eloraam/redpower/control/TileDiskDrive.java new file mode 100644 index 0000000..7403e98 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileDiskDrive.java @@ -0,0 +1,609 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.DiskLib; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.WorldCoord; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.IBlockAccess; + +public class TileDiskDrive extends TileExtended implements IRedbusConnectable, IInventory, IFrameSupport { + public int Rotation = 0; + public boolean hasDisk = false; + public boolean Active = false; + private ItemStack[] contents = new ItemStack[1]; + private int accessTime = 0; + private byte[] databuf = new byte[128]; + private int sector = 0; + private int cmdreg = 0; + private int rbaddr = 2; + + @Override + public int rbGetAddr() { + return this.rbaddr; + } + + @Override + public void rbSetAddr(int addr) { + this.rbaddr = addr; + } + + @Override + public int rbRead(int reg) { + if (reg < 128) { + return this.databuf[reg] & 0xFF; + } else { + switch(reg) { + case 128: + return this.sector & 0xFF; + case 129: + return this.sector >> 8; + case 130: + return this.cmdreg & 0xFF; + default: + return 0; + } + } + } + + @Override + public void rbWrite(int reg, int dat) { + this.markDirty(); + if (reg < 128) { + this.databuf[reg] = (byte)dat; + } else { + switch(reg) { + case 128: + this.sector = this.sector & 0xFF00 | dat; + break; + case 129: + this.sector = this.sector & 0xFF | dat << 8; + break; + case 130: + this.cmdreg = dat; + } + } + + } + + @Override + public int getConnectableMask() { + return 16777215; + } + + @Override + public int getConnectClass(int side) { + return 66; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) + 1 & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (!super.worldObj.isRemote) { + if (this.hasDisk && this.contents[0] != null && !this.Active) { + this.ejectDisk(); + return true; + } else { + return false; + } + } else { + return true; + } + } + + public Block getBlockType() { + return RedPowerControl.blockPeripheral; + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 1; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + boolean setDisk(ItemStack ist) { + if (this.contents[0] != null) { + return false; + } else { + this.setInventorySlotContents(0, ist); + return true; + } + } + + private NBTTagCompound getDiskTags() { + NBTTagCompound tags = this.contents[0].stackTagCompound; + if (tags == null) { + this.contents[0].setTagCompound(new NBTTagCompound()); + tags = this.contents[0].stackTagCompound; + } + + return tags; + } + + private File startDisk() { + if (this.contents[0].getItemDamage() > 0) { + return null; + } else { + NBTTagCompound tags = this.getDiskTags(); + File savedir = DiskLib.getSaveDir(super.worldObj); + if (tags.hasKey("serno")) { + return DiskLib.getDiskFile(savedir, tags.getString("serno")); + } else { + String serno = null; + + while(true) { + serno = DiskLib.generateSerialNumber(super.worldObj); + File diskFile = DiskLib.getDiskFile(savedir, serno); + + try { + if (diskFile.createNewFile()) { + tags.setString("serno", serno); + return diskFile; + } + } catch (IOException var6) { + var6.printStackTrace(); + return null; + } + } + } + } + } + + private void runCmd1() { + Arrays.fill(this.databuf, (byte)0); + String nm = ""; + if (this.contents[0].getItemDamage() > 0) { + nm = "System Disk"; + } else { + NBTTagCompound e = this.contents[0].stackTagCompound; + if (e == null) { + return; + } + + nm = e.getString("label"); + } + + try { + byte[] e1 = nm.getBytes("US-ASCII"); + System.arraycopy(e1, 0, this.databuf, 0, Math.min(e1.length, 128)); + } catch (UnsupportedEncodingException var3) { + } + + } + + private void runCmd2() { + if (this.contents[0].getItemDamage() > 0) { + this.cmdreg = -1; + } else { + NBTTagCompound tags = this.getDiskTags(); + int len = 0; + + while(this.databuf[len] != 0 && len < 64) { + ++len; + } + + this.cmdreg = 0; + + try { + String e = new String(this.databuf, 0, len, "US-ASCII"); + tags.setString("label", e); + } catch (UnsupportedEncodingException var4) { + } + } + + } + + private void runCmd3() { + Arrays.fill(this.databuf, (byte)0); + String nm = ""; + if (this.contents[0].getItemDamage() > 0) { + nm = String.format("%016d", this.contents[0].getItemDamage()); + } else { + NBTTagCompound e = this.getDiskTags(); + this.startDisk(); + if (e == null) { + return; + } + + nm = e.getString("serno"); + } + + try { + byte[] e1 = nm.getBytes("US-ASCII"); + System.arraycopy(e1, 0, this.databuf, 0, Math.min(e1.length, 128)); + } catch (UnsupportedEncodingException var3) { + } + + } + + private void runCmd4() { + if (this.sector > 2048) { + this.cmdreg = -1; + } else { + long l = (long)(this.sector * 128); + if (this.contents[0].getItemDamage() > 0) { + InputStream file = null; + switch(this.contents[0].getItemDamage()) { + case 1: + file = RedPowerControl.class.getResourceAsStream("/assets/rpcontrol/forth/redforth.img"); + break; + case 2: + file = RedPowerControl.class.getResourceAsStream("/assets/rpcontrol/forth/redforthxp.img"); + } + + try { + if (file.skip(l) == l) { + if (file.read(this.databuf) == 128) { + this.cmdreg = 0; + return; + } + + this.cmdreg = -1; + return; + } + + this.cmdreg = -1; + } catch (IOException var36) { + var36.printStackTrace(); + this.cmdreg = -1; + return; + } finally { + try { + if (file != null) { + file.close(); + } + } catch (IOException var33) { + } + + } + + return; + } else { + File file1 = this.startDisk(); + if (file1 == null) { + this.cmdreg = -1; + } else { + RandomAccessFile raf = null; + + try { + raf = new RandomAccessFile(file1, "r"); + raf.seek(l); + if (raf.read(this.databuf) == 128) { + this.cmdreg = 0; + return; + } + + this.cmdreg = -1; + } catch (IOException var34) { + var34.printStackTrace(); + this.cmdreg = -1; + } finally { + try { + if (raf != null) { + raf.close(); + } + } catch (IOException var32) { + } + + } + } + } + } + + } + + private void runCmd5() { + if (this.contents[0].getItemDamage() > 0) { + this.cmdreg = -1; + } else if (this.sector > 2048) { + this.cmdreg = -1; + } else { + long l = (long)(this.sector * 128); + File file = this.startDisk(); + if (file == null) { + this.cmdreg = -1; + } else { + RandomAccessFile raf = null; + + try { + raf = new RandomAccessFile(file, "rw"); + raf.seek(l); + raf.write(this.databuf); + raf.close(); + raf = null; + this.cmdreg = 0; + } catch (IOException var14) { + this.cmdreg = -1; + } finally { + try { + if (raf != null) { + raf.close(); + } + } catch (IOException var13) { + } + + } + } + } + + } + + private void runDiskCmd() { + this.markDirty(); + if (this.contents[0] == null) { + this.cmdreg = -1; + } else if (!(this.contents[0].getItem() instanceof ItemDisk)) { + this.cmdreg = -1; + } else { + switch(this.cmdreg) { + case 1: + this.runCmd1(); + this.cmdreg = 0; + break; + case 2: + this.runCmd2(); + break; + case 3: + this.runCmd3(); + this.cmdreg = 0; + break; + case 4: + this.runCmd4(); + break; + case 5: + this.runCmd5(); + break; + default: + this.cmdreg = -1; + } + + this.accessTime = 5; + if (!this.Active) { + this.Active = true; + this.updateBlock(); + } + } + + } + + private void ejectDisk() { + if (this.contents[0] != null) { + MachineLib.ejectItem(super.worldObj, new WorldCoord(this), this.contents[0], CoreLib.rotToSide(this.Rotation) ^ 1); + this.contents[0] = null; + this.hasDisk = false; + this.updateBlock(); + } + + } + + public void markDirty() { + super.markDirty(); + if (this.contents[0] != null && !(this.contents[0].getItem() instanceof ItemDisk)) { + this.ejectDisk(); + } + + } + + @Override + public void updateEntity() { + if (this.cmdreg != 0 && this.cmdreg != -1) { + this.runDiskCmd(); + } + + if (this.accessTime > 0 && --this.accessTime == 0) { + this.Active = false; + this.updateBlock(); + } + + } + + public int getSizeInventory() { + return 1; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + this.hasDisk = this.contents[i] != null; + this.updateBlock(); + } + + public String getInventoryName() { + return "tile.rpdiskdrive.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("fl", (byte)((this.hasDisk ? 1 : 0) | (this.Active ? 2 : 0))); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + int fl = tag.getByte("fl"); + this.hasDisk = (fl & 1) > 0; + this.Active = (fl & 2) > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + this.accessTime = data.getByte("actime"); + this.sector = data.getShort("sect"); + this.cmdreg = data.getByte("cmd") & 255; + this.rbaddr = data.getByte("rbaddr") & 255; + byte fl = data.getByte("fl"); + this.hasDisk = (fl & 1) > 0; + this.Active = (fl & 2) > 0; + this.databuf = data.getByteArray("dbuf"); + if (this.databuf.length != 128) { + this.databuf = new byte[128]; + } + + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.hasDisk = this.contents[0] != null; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + int fl = (this.hasDisk ? 1 : 0) | (this.Active ? 2 : 0); + data.setByte("fl", (byte)fl); + data.setByte("actime", (byte)this.accessTime); + data.setByteArray("dbuf", this.databuf); + data.setShort("sect", (short)this.sector); + data.setByte("cmd", (byte)this.cmdreg); + data.setByte("rbaddr", (byte)this.rbaddr); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + int fl = tag.getByte("fl"); + this.hasDisk = (fl & 1) > 0; + this.Active = (fl & 2) > 0; + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("fl", (byte)((this.hasDisk ? 1 : 0) | (this.Active ? 2 : 0))); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return slotID == 0 && stack.getItem() instanceof ItemDisk; + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileDisplay.java b/src/main/java/com/eloraam/redpower/control/TileDisplay.java new file mode 100644 index 0000000..5dde734 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileDisplay.java @@ -0,0 +1,346 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.TileExtended; +import java.util.Arrays; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileDisplay extends TileExtended implements IRedbusConnectable, IFrameSupport { + public byte[] screen = new byte[4000]; + public int Rotation = 0; + public int memRow = 0; + public int cursX = 0; + public int cursY = 0; + public int cursMode = 2; + public int kbstart = 0; + public int kbpos = 0; + public int blitXS = 0; + public int blitYS = 0; + public int blitXD = 0; + public int blitYD = 0; + public int blitW = 0; + public int blitH = 0; + public int blitMode = 0; + public byte[] kbbuf = new byte[16]; + private int rbaddr = 1; + + public TileDisplay() { + Arrays.fill(this.screen, (byte)32); + } + + @Override + public int rbGetAddr() { + return this.rbaddr; + } + + @Override + public void rbSetAddr(int addr) { + this.rbaddr = addr; + } + + @Override + public int rbRead(int reg) { + if (reg >= 16 && reg < 96) { + return this.screen[this.memRow * 80 + reg - 16]; + } else { + switch(reg) { + case 0: + return this.memRow; + case 1: + return this.cursX; + case 2: + return this.cursY; + case 3: + return this.cursMode; + case 4: + return this.kbstart; + case 5: + return this.kbpos; + case 6: + return this.kbbuf[this.kbstart] & 0xFF; + case 7: + return this.blitMode; + case 8: + return this.blitXS; + case 9: + return this.blitYS; + case 10: + return this.blitXD; + case 11: + return this.blitYD; + case 12: + return this.blitW; + case 13: + return this.blitH; + default: + return 0; + } + } + } + + @Override + public void rbWrite(int reg, int dat) { + this.markDirty(); + if (reg >= 16 && reg < 96) { + this.screen[this.memRow * 80 + reg - 16] = (byte)dat; + } else { + switch(reg) { + case 0: + this.memRow = dat; + if (this.memRow > 49) { + this.memRow = 49; + } + + return; + case 1: + this.cursX = dat; + return; + case 2: + this.cursY = dat; + return; + case 3: + this.cursMode = dat; + return; + case 4: + this.kbstart = dat & 15; + return; + case 5: + this.kbpos = dat & 15; + return; + case 6: + this.kbbuf[this.kbstart] = (byte)dat; + return; + case 7: + this.blitMode = dat; + return; + case 8: + this.blitXS = dat; + return; + case 9: + this.blitYS = dat; + return; + case 10: + this.blitXD = dat; + return; + case 11: + this.blitYD = dat; + return; + case 12: + this.blitW = dat; + return; + case 13: + this.blitH = dat; + return; + } + } + + } + + @Override + public int getConnectableMask() { + return 16777215; + } + + @Override + public int getConnectClass(int side) { + return 66; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) + 1 & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerControl.instance, 1, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + + public Block getBlockType() { + return RedPowerControl.blockPeripheral; + } + + @Override + public int getExtendedID() { + return 0; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void pushKey(byte b) { + int np = this.kbpos + 1 & 15; + if (np != this.kbstart) { + this.kbbuf[this.kbpos] = b; + this.kbpos = np; + } + + } + + @Override + public void updateEntity() { + this.runblitter(); + } + + private void runblitter() { + if (this.blitMode != 0) { + this.markDirty(); + int w = this.blitW; + int h = this.blitH; + w = Math.min(w, 80 - this.blitXD); + h = Math.min(h, 50 - this.blitYD); + if (w >= 0 && h >= 0) { + int doffs = this.blitYD * 80 + this.blitXD; + switch(this.blitMode) { + case 1: + for(int soffs = 0; soffs < h; ++soffs) { + for(int j = 0; j < w; ++j) { + this.screen[doffs + 80 * soffs + j] = (byte)this.blitXS; + } + } + + this.blitMode = 0; + return; + case 2: + for(int soffs = 0; soffs < h; ++soffs) { + for(int j = 0; j < w; ++j) { + this.screen[doffs + 80 * soffs + j] = (byte)(this.screen[doffs + 80 * soffs + j] ^ 128); + } + } + + this.blitMode = 0; + return; + } + + w = Math.min(w, 80 - this.blitXS); + h = Math.min(h, 50 - this.blitYS); + if (w >= 0 && h >= 0) { + int soffs = this.blitYS * 80 + this.blitXS; + switch(this.blitMode) { + case 3: + for(int j = 0; j < h; ++j) { + for(int i = 0; i < w; ++i) { + this.screen[doffs + 80 * j + i] = this.screen[soffs + 80 * j + i]; + } + } + + this.blitMode = 0; + return; + } + } else { + this.blitMode = 0; + } + } else { + this.blitMode = 0; + } + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setInteger("rot", this.Rotation); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getInteger("rot"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + this.screen = data.getByteArray("fb"); + if (this.screen.length != 4000) { + this.screen = new byte[4000]; + } + + this.memRow = data.getByte("row") & 255; + this.cursX = data.getByte("cx") & 255; + this.cursY = data.getByte("cy") & 255; + this.cursMode = data.getByte("cm") & 255; + this.kbstart = data.getByte("kbs"); + this.kbpos = data.getByte("kbp"); + this.kbbuf = data.getByteArray("kbb"); + if (this.kbbuf.length != 16) { + this.kbbuf = new byte[16]; + } + + this.blitXS = data.getByte("blxs") & 255; + this.blitYS = data.getByte("blys") & 255; + this.blitXD = data.getByte("blxd") & 255; + this.blitYD = data.getByte("blyd") & 255; + this.blitW = data.getByte("blw") & 255; + this.blitH = data.getByte("blh") & 255; + this.blitMode = data.getByte("blmd"); + this.rbaddr = data.getByte("rbaddr") & 255; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + data.setByteArray("fb", this.screen); + data.setByte("row", (byte)this.memRow); + data.setByte("cx", (byte)this.cursX); + data.setByte("cy", (byte)this.cursY); + data.setByte("cm", (byte)this.cursMode); + data.setByte("kbs", (byte)this.kbstart); + data.setByte("kbp", (byte)this.kbpos); + data.setByteArray("kbb", this.kbbuf); + data.setByte("blxs", (byte)this.blitXS); + data.setByte("blys", (byte)this.blitYS); + data.setByte("blxd", (byte)this.blitXD); + data.setByte("blyd", (byte)this.blitYD); + data.setByte("blw", (byte)this.blitW); + data.setByte("blh", (byte)this.blitH); + data.setByte("blmd", (byte)this.blitMode); + data.setByte("rbaddr", (byte)this.rbaddr); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getInteger("rot"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("rot", this.Rotation); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileIOExpander.java b/src/main/java/com/eloraam/redpower/control/TileIOExpander.java new file mode 100644 index 0000000..95d8844 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileIOExpander.java @@ -0,0 +1,231 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRedPowerConnectable; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileMultipart; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileIOExpander extends TileMultipart implements IRedbusConnectable, IRedPowerConnectable, IFrameSupport { + public int Rotation = 0; + public int WBuf = 0; + public int WBufNew = 0; + public int RBuf = 0; + private int rbaddr = 3; + + @Override + public int rbGetAddr() { + return this.rbaddr; + } + + @Override + public void rbSetAddr(int addr) { + this.rbaddr = addr; + } + + @Override + public int rbRead(int reg) { + switch(reg) { + case 0: + return this.RBuf & 0xFF; + case 1: + return this.RBuf >> 8; + case 2: + return this.WBufNew & 0xFF; + case 3: + return this.WBufNew >> 8; + default: + return 0; + } + } + + @Override + public void rbWrite(int reg, int dat) { + this.markDirty(); + switch(reg) { + case 0: + case 2: + this.WBufNew = this.WBufNew & 0xFF00 | dat; + this.scheduleTick(2); + break; + case 1: + case 3: + this.WBufNew = this.WBufNew & 0xFF | dat << 8; + this.scheduleTick(2); + } + + } + + @Override + public int getConnectableMask() { + return 15; + } + + @Override + public int getConnectClass(int side) { + return side == CoreLib.rotToSide(this.Rotation) ? 18 : 66; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public int getPoweringMask(int ch) { + return ch == 0 ? 0 : ((this.WBuf & 1 << ch - 1) > 0 ? RedPowerLib.mapRotToCon(8, this.Rotation) : 0); + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) + 1 & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onTileTick() { + if (this.WBuf != this.WBufNew) { + this.WBuf = this.WBufNew; + this.onBlockNeighborChange(Blocks.air); + this.updateBlockChange(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + boolean ch = false; + + for(int n = 0; n < 16; ++n) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 8, this.Rotation, n + 1); + if (ps == 0) { + if ((this.RBuf & 1 << n) > 0) { + this.RBuf &= ~(1 << n); + ch = true; + } + } else if ((this.RBuf & 1 << n) == 0) { + this.RBuf |= 1 << n; + ch = true; + } + } + + if (ch) { + this.updateBlock(); + } + + } + + public Block getBlockType() { + return RedPowerControl.blockFlatPeripheral; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void addHarvestContents(List ist) { + ist.add(new ItemStack(this.getBlockType(), 1, 0)); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + this.breakBlock(willHarvest); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + return 0.1F; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + @Override + public int getSolidPartsMask() { + return 1; + } + + @Override + public int getPartsMask() { + return 1; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setShort("wb", (short)this.WBuf); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.WBuf = tag.getShort("wb"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + this.WBuf = data.getShort("wb"); + this.WBufNew = data.getShort("wbn"); + this.RBuf = data.getShort("rb"); + this.rbaddr = data.getByte("rbaddr") & 255; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + data.setShort("wb", (short)this.WBuf); + data.setShort("wbn", (short)this.WBufNew); + data.setShort("rb", (short)this.RBuf); + data.setByte("rbaddr", (byte)this.rbaddr); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.WBuf = tag.getShort("wb"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setShort("wb", (short)this.WBuf); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileRAM.java b/src/main/java/com/eloraam/redpower/control/TileRAM.java new file mode 100644 index 0000000..1c1f9c5 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileRAM.java @@ -0,0 +1,91 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.RedPowerControl; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class TileRAM extends TileBackplane { + public byte[] memory = new byte[8192]; + + @Override + public int readBackplane(int addr) { + return this.memory[addr] & 0xFF; + } + + @Override + public void writeBackplane(int addr, int val) { + this.memory[addr] = (byte)val; + } + + @Override + public Block getBlockType() { + return RedPowerControl.blockBackplane; + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public void addHarvestContents(List ist) { + ist.add(new ItemStack(RedPowerControl.blockBackplane, 1, 0)); + ist.add(new ItemStack(RedPowerControl.blockBackplane, 1, 1)); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerControl.blockBackplane, 1, 1)); + } + + super.worldObj.setBlock(super.xCoord, super.yCoord, super.zCoord, RedPowerControl.blockBackplane); + TileBackplane tb = CoreLib.getTileEntity(super.worldObj, super.xCoord, super.yCoord, super.zCoord, TileBackplane.class); + if (tb != null) { + tb.Rotation = super.Rotation; + } + + this.updateBlockChange(); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 0) { + super.setPartBounds(block, part); + } else { + block.setBlockBounds(0.0F, 0.125F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + } + + @Override + public int getSolidPartsMask() { + return 3; + } + + @Override + public int getPartsMask() { + return 3; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.memory = data.getByteArray("ram"); + if (this.memory.length != 8192) { + this.memory = new byte[8192]; + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByteArray("ram", this.memory); + } +} diff --git a/src/main/java/com/eloraam/redpower/control/TileRibbon.java b/src/main/java/com/eloraam/redpower/control/TileRibbon.java new file mode 100644 index 0000000..4966c32 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/control/TileRibbon.java @@ -0,0 +1,23 @@ +package com.eloraam.redpower.control; + +import com.eloraam.redpower.wiring.TileWiring; +import net.minecraft.block.Block; + +public class TileRibbon extends TileWiring { + @Override + public int getExtendedID() { + return 12; + } + + @Override + public int getConnectClass(int side) { + return 66; + } + + @Override + public void onBlockNeighborChange(Block block) { + super.onBlockNeighborChange(block); + this.getConnectionMask(); + this.getExtConnectionMask(); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/AchieveLib.java b/src/main/java/com/eloraam/redpower/core/AchieveLib.java new file mode 100644 index 0000000..db9c876 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/AchieveLib.java @@ -0,0 +1,94 @@ +package com.eloraam.redpower.core; + +import java.util.HashMap; +import java.util.TreeMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; +import net.minecraftforge.common.AchievementPage; + +public class AchieveLib { + private static HashMap achievelist = new HashMap(); + public static AchievementPage achievepage = new AchievementPage("RedPower", new Achievement[0]); + private static TreeMap achievebycraft = new TreeMap<>(CoreLib::compareItemStack); + private static TreeMap achievebyfurnace = new TreeMap<>(CoreLib::compareItemStack); + private static TreeMap achievebyalloy = new TreeMap<>(CoreLib::compareItemStack); + + public static void registerAchievement(String name, int x, int y, ItemStack icon, Object require, boolean special) { + Achievement acreq = null; + if (require instanceof Achievement) { + acreq = (Achievement)require; + } else if (require instanceof String) { + acreq = (Achievement)achievelist.get(require); + } + + Achievement ac = new Achievement(name, name, x, y, icon, acreq); + ac.registerStat(); + if (special) { + ac.setSpecial(); + } + + achievelist.put(name, ac); + achievepage.getAchievements().add(ac); + } + + public static void registerAchievement(String name, int x, int y, ItemStack icon, Object require) { + registerAchievement(name, x, y, icon, require, false); + } + + public static void addCraftingAchievement(ItemStack target, String id) { + Achievement ac = (Achievement)achievelist.get(id); + if (ac != null) { + achievebycraft.put(target, ac); + } + + } + + public static void addAlloyAchievement(ItemStack target, String id) { + Achievement ac = (Achievement)achievelist.get(id); + if (ac != null) { + achievebyalloy.put(target, ac); + } + + } + + public static void addFurnaceAchievement(ItemStack target, String id) { + Achievement ac = (Achievement)achievelist.get(id); + if (ac != null) { + achievebyfurnace.put(target, ac); + } + + } + + public static void triggerAchievement(EntityPlayer player, String id) { + Achievement ac = (Achievement)achievelist.get(id); + if (ac != null) { + player.triggerAchievement(ac); + } + + } + + public static void onCrafting(EntityPlayer player, ItemStack ist) { + Achievement ac = (Achievement)achievebycraft.get(ist); + if (ac != null) { + player.triggerAchievement(ac); + } + + } + + public static void onFurnace(EntityPlayer player, ItemStack ist) { + Achievement ac = (Achievement)achievebyfurnace.get(ist); + if (ac != null) { + player.triggerAchievement(ac); + } + + } + + public static void onAlloy(EntityPlayer player, ItemStack ist) { + Achievement ac = (Achievement)achievebyalloy.get(ist); + if (ac != null) { + player.triggerAchievement(ac); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BlockCoverable.java b/src/main/java/com/eloraam/redpower/core/BlockCoverable.java new file mode 100644 index 0000000..eb601ec --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BlockCoverable.java @@ -0,0 +1,50 @@ +package com.eloraam.redpower.core; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class BlockCoverable extends BlockMultipart { + public BlockCoverable(Material material) { + super(material); + } + + public boolean isSideSolid(IBlockAccess world, int i, int j, int k, ForgeDirection side) { + TileCoverable tc = CoreLib.getTileEntity(world, i, j, k, TileCoverable.class); + return tc != null && tc.isSideNormal(side.ordinal()); + } + + public float getExplosionResistance(Entity exploder, World world, int x, int y, int z, double srcX, double srcY, double srcZ) { + Vec3 org = Vec3.createVectorHelper(srcX, srcY, srcZ); + Vec3 end = Vec3.createVectorHelper((double)x + 0.5, (double)y + 0.5, (double)z + 0.5); + Block bl = world.getBlock(x, y, z); + if (bl == null) { + return 0.0F; + } else { + MovingObjectPosition mop = bl.collisionRayTrace(world, x, y, z, org, end); + if (mop == null) { + return bl.getExplosionResistance(exploder); + } else { + TileCoverable tl = CoreLib.getTileEntity(world, x, y, z, TileCoverable.class); + if (tl == null) { + return bl.getExplosionResistance(exploder); + } else { + float er = tl.getExplosionResistance(mop.subHit, mop.sideHit, exploder); + return er < 0.0F ? bl.getExplosionResistance(exploder) : er; + } + } + } + } + + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + TileCoverable tile = CoreLib.getTileEntity(world, x, y, z, TileCoverable.class); + return tile != null ? tile.getPickBlock(target, player) : null; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BlockExtended.java b/src/main/java/com/eloraam/redpower/core/BlockExtended.java new file mode 100644 index 0000000..8f8822e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BlockExtended.java @@ -0,0 +1,212 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerCore; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.Random; +import java.util.function.Supplier; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockExtended extends BlockContainer { + private Supplier[] tileEntityMap = new Supplier[16]; + + public BlockExtended(Material m) { + super(m); + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isFullCube() { + return false; + } + + public int damageDropped(int i) { + return i; + } + + public float getHardness() { + return super.blockHardness; + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + } + + public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { + ArrayList ist = new ArrayList(); + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl == null) { + return ist; + } else { + tl.addHarvestContents(ist); + return ist; + } + } + + public Item getItemDropped(int i, Random random, int j) { + return Item.getItemFromBlock(Blocks.air); + } + + public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int side) { + } + + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { + if (!world.isRemote) { + Block bl = world.getBlock(x, y, z); + int md = world.getBlockMetadata(x, y, z); + if (bl == null) { + return false; + } else { + if (bl.canHarvestBlock(player, md) && willHarvest) { + for(ItemStack it : this.getDrops(world, x, y, z, md, EnchantmentHelper.getFortuneModifier(player))) { + CoreLib.dropItem(world, x, y, z, it); + } + } + + world.setBlockToAir(x, y, z); + return true; + } + } else { + return true; + } + } + + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl == null) { + world.setBlockToAir(x, y, z); + } else { + tl.onBlockNeighborChange(block); + } + + } + + public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { + return super.onBlockPlaced(world, x, y, z, side, hitX, hitY, hitZ, meta); + } + + public void onBlockPlacedBy(World world, int x, int y, int z, int side, EntityLivingBase ent, ItemStack ist) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl != null) { + tl.onBlockPlaced(ist, side, ent); + } + + } + + public void breakBlock(World world, int x, int y, int z, Block block, int md) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl != null) { + tl.onBlockRemoval(); + super.breakBlock(world, x, y, z, block, md); + } + + } + + public int isProvidingStrongPower(IBlockAccess iba, int x, int y, int z, int side) { + TileExtended tl = CoreLib.getTileEntity(iba, x, y, z, TileExtended.class); + return tl != null && tl.isBlockStrongPoweringTo(side) ? 15 : 0; + } + + public int isProvidingWeakPower(IBlockAccess iba, int x, int y, int z, int side) { + TileExtended tl = CoreLib.getTileEntity(iba, x, y, z, TileExtended.class); + return tl != null && tl.isBlockWeakPoweringTo(side) ? 1 : 0; + } + + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xp, float yp, float zp) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + return tl != null && tl.onBlockActivated(player); + } + + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl != null) { + tl.onEntityCollidedWithBlock(entity); + } + + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + TileExtended tl = CoreLib.getTileEntity(world, x, y, z, TileExtended.class); + if (tl != null) { + AxisAlignedBB bb = tl.getCollisionBoundingBox(); + if (bb != null) { + return bb; + } + } + + this.setBlockBoundsBasedOnState(world, x, y, z); + return super.getCollisionBoundingBoxFromPool(world, x, y, z); + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + this.setBlockBoundsBasedOnState(world, x, y, z); + return super.getSelectedBoundingBoxFromPool(world, x, y, z); + } + + public int getRenderType() { + return RedPowerCore.customBlockModel; + } + + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + int md = world.getBlockMetadata(x, y, z); + RenderCustomBlock rend = RenderLib.getRenderer(this, md); + if (rend != null) { + rend.randomDisplayTick(world, x, y, z, random); + } + + } + + public void addTileEntityMapping(int md, Supplier cl) { + this.tileEntityMap[md] = cl; + } + + public void setBlockName(int md, String name) { + Item item = Item.getItemFromBlock(this); + ((ItemExtended)item).setMetaName(md, "tile." + name); + } + + public TileEntity createNewTileEntity(World world, int md) { + return this.tileEntityMap[md] != null ? (TileEntity)this.tileEntityMap[md].get() : null; + } + + @SideOnly(Side.CLIENT) + public boolean addHitEffects(World world, MovingObjectPosition target, EffectRenderer effectRenderer) { + int x = target.blockX; + int y = target.blockY; + int z = target.blockZ; + int meta = world.getBlockMetadata(x, y, z); + int side = target.sideHit; + RenderCustomBlock renderer = RenderLib.getRenderer(this, meta); + return renderer != null && renderer.renderHit(effectRenderer, world, target, x, y, z, side, meta); + } + + @SideOnly(Side.CLIENT) + public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { + RenderCustomBlock renderer = RenderLib.getRenderer(this, meta); + return renderer != null && renderer.renderDestroy(effectRenderer, world, x, y, z, meta); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BlockMultiblock.java b/src/main/java/com/eloraam/redpower/core/BlockMultiblock.java new file mode 100644 index 0000000..c9f8129 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BlockMultiblock.java @@ -0,0 +1,106 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerCore; +import java.util.ArrayList; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockMultiblock extends BlockContainer { + public BlockMultiblock() { + super(CoreLib.materialRedpower); + } + + public void registerBlockIcons(IIconRegister reg) { + } + + public int getRenderType() { + return RedPowerCore.nullBlockModel; + } + + public boolean isOpaqueCube() { + return false; + } + + public boolean renderAsNormalBlock() { + return false; + } + + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + return new ArrayList(); + } + + public TileEntity createNewTileEntity(World worldObj, int metadata) { + return null; + } + + public TileEntity createTileEntity(World worldObj, int metadata) { + switch(metadata) { + case 0: + return new TileMultiblock(); + default: + return null; + } + } + + public void breakBlock(World world, int x, int y, int z, Block block, int md) { + TileMultiblock tmb = CoreLib.getTileEntity(world, x, y, z, TileMultiblock.class); + if (tmb != null) { + IMultiblock imb = CoreLib.getTileEntity(world, tmb.relayX, tmb.relayY, tmb.relayZ, IMultiblock.class); + if (imb != null) { + imb.onMultiRemoval(tmb.relayNum); + } + } + + } + + public void setBlockBoundsBasedOnState(IBlockAccess iba, int x, int y, int z) { + TileMultiblock tmb = CoreLib.getTileEntity(iba, x, y, z, TileMultiblock.class); + if (tmb == null) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else { + IMultiblock imb = CoreLib.getTileEntity(iba, tmb.relayX, tmb.relayY, tmb.relayZ, IMultiblock.class); + if (imb != null) { + AxisAlignedBB aabb = imb.getMultiBounds(tmb.relayNum); + int xa = tmb.relayX - x; + int ya = tmb.relayY - y; + int za = tmb.relayZ - z; + this.setBlockBounds( + (float)aabb.minX + (float)xa, + (float)aabb.minY + (float)ya, + (float)aabb.minZ + (float)za, + (float)aabb.maxX + (float)xa, + (float)aabb.maxY + (float)ya, + (float)aabb.maxZ + (float)za + ); + } + } + + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + this.setBlockBoundsBasedOnState(world, x, y, z); + return super.getCollisionBoundingBoxFromPool(world, x, y, z); + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + this.setBlockBoundsBasedOnState(world, x, y, z); + return super.getSelectedBoundingBoxFromPool(world, x, y, z); + } + + public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) { + TileMultiblock tmb = CoreLib.getTileEntity(world, x, y, z, TileMultiblock.class); + if (tmb == null) { + return 0.0F; + } else { + IMultiblock imb = CoreLib.getTileEntity(world, tmb.relayX, tmb.relayY, tmb.relayZ, IMultiblock.class); + return imb == null ? 0.0F : imb.getMultiBlockStrength(tmb.relayNum, player); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BlockMultipart.java b/src/main/java/com/eloraam/redpower/core/BlockMultipart.java new file mode 100644 index 0000000..95eb919 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BlockMultipart.java @@ -0,0 +1,163 @@ +package com.eloraam.redpower.core; + +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; + +public class BlockMultipart extends BlockExtended { + public BlockMultipart(Material material) { + super(material); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (tl == null) { + world.setBlockToAir(x, y, z); + } else { + tl.onBlockNeighborChange(block); + } + + } + + @Override + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { + if (!world.isRemote) { + MovingObjectPosition mop = CoreLib.retraceBlock(world, player, x, y, z); + if (mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (tl != null) { + tl.onHarvestPart(player, mop.subHit, willHarvest); + } + } + } + + return false; + } + + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) { + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xp, float yp, float zp) { + MovingObjectPosition pos = CoreLib.retraceBlock(world, player, x, y, z); + if (pos == null) { + return false; + } else if (pos.typeOfHit != MovingObjectType.BLOCK) { + return false; + } else { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + return tl != null && tl.onPartActivateSide(player, pos.subHit, pos.sideHit); + } + } + + public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) { + MovingObjectPosition pos = CoreLib.retraceBlock(world, player, x, y, z); + if (pos == null) { + return 0.0F; + } else if (pos.typeOfHit != MovingObjectType.BLOCK) { + return 0.0F; + } else { + TileMultipart tl = CoreLib.getTileEntity(player.worldObj, x, y, z, TileMultipart.class); + return tl == null ? 0.0F : tl.getPartStrength(player, pos.subHit); + } + } + + public void onBlockDestroyedByExplosion(World world, int x, int y, int z, Explosion explosion) { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (tl != null) { + tl.breakBlock(); + } + + } + + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB box, List list, Entity ent) { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (tl != null) { + int pm = tl.getSolidPartsMask(); + + while(pm > 0) { + int pt = Integer.numberOfTrailingZeros(pm); + pm &= ~(1 << pt); + tl.setPartBounds(this, pt); + super.addCollisionBoxesToList(world, x, y, z, box, list, ent); + } + } + + } + + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + return super.getSelectedBoundingBoxFromPool(world, x, y, z); + } + + public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end) { + TileMultipart multipart = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (multipart == null) { + return null; + } else { + int pm = multipart.getPartsMask(); + MovingObjectPosition result = null; + int cpt = -1; + double distance = 0.0; + + while(pm > 0) { + int pt = Integer.numberOfTrailingZeros(pm); + pm &= ~(1 << pt); + multipart.setPartBounds(this, pt); + MovingObjectPosition mop = super.collisionRayTrace(world, x, y, z, start, end); + if (mop != null) { + double max = mop.hitVec.squareDistanceTo(start); + if (result == null || max < distance) { + distance = max; + result = mop; + cpt = pt; + } + } + } + + if (result == null) { + return null; + } else { + multipart.setPartBounds(this, cpt); + result.subHit = cpt; + return result; + } + } + } + + protected MovingObjectPosition traceCurrentBlock(World world, int x, int y, int z, Vec3 src, Vec3 dest) { + return super.collisionRayTrace(world, x, y, z, src, dest); + } + + public void setPartBounds(World world, int x, int y, int z, int part) { + TileMultipart tl = CoreLib.getTileEntity(world, x, y, z, TileMultipart.class); + if (tl == null) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else { + tl.setPartBounds(this, part); + } + + } + + public void computeCollidingBoxes(World world, int x, int y, int z, AxisAlignedBB box, List list, TileMultipart tl) { + int pm = tl.getSolidPartsMask(); + + while(pm > 0) { + int pt = Integer.numberOfTrailingZeros(pm); + pm &= ~(1 << pt); + tl.setPartBounds(this, pt); + super.addCollisionBoxesToList(world, x, y, z, box, list, null); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BlockReplaceHelper.java b/src/main/java/com/eloraam/redpower/core/BlockReplaceHelper.java new file mode 100644 index 0000000..5b11f34 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BlockReplaceHelper.java @@ -0,0 +1,72 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.common.registry.FMLControlledNamespacedRegistry; +import cpw.mods.fml.common.registry.GameData; +import java.lang.reflect.Field; +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.util.ObjectIntIdentityMap; +import net.minecraft.util.RegistryNamespaced; +import net.minecraft.util.RegistrySimple; + +public class BlockReplaceHelper { + public static void replaceBlock(Block toReplace, Class blockClass, Class itemBlockClass) { + Class[] classTest = new Class[4]; + Exception exception = null; + + try { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + + for(Field blockField : Blocks.class.getDeclaredFields()) { + if (Block.class.isAssignableFrom(blockField.getType())) { + Block block = (Block)blockField.get(null); + if (block == toReplace) { + String registryName = Block.blockRegistry.getNameForObject(block); + int id = Block.getIdFromBlock(block); + Block newBlock = (Block)blockClass.newInstance(); + FMLControlledNamespacedRegistry registryBlocks = GameData.getBlockRegistry(); + Field map1 = RegistrySimple.class.getDeclaredFields()[1]; + map1.setAccessible(true); + ((Map)map1.get(registryBlocks)).put(registryName, newBlock); + Field map2 = RegistryNamespaced.class.getDeclaredFields()[0]; + map2.setAccessible(true); + ((ObjectIntIdentityMap)map2.get(registryBlocks)).func_148746_a(newBlock, id); + blockField.setAccessible(true); + modifiersField.setInt(blockField, blockField.getModifiers() & -17); + blockField.set(null, newBlock); + ItemBlock itemBlock = (ItemBlock)itemBlockClass.getConstructor(Block.class).newInstance(newBlock); + FMLControlledNamespacedRegistry registryItems = GameData.getItemRegistry(); + ((Map)map1.get(registryItems)).put(registryName, itemBlock); + ((ObjectIntIdentityMap)map2.get(registryItems)).func_148746_a(itemBlock, id); + classTest[0] = blockField.get(null).getClass(); + classTest[1] = Block.blockRegistry.getObjectById(id).getClass(); + classTest[2] = ((ItemBlock)Item.getItemFromBlock(newBlock)).field_150939_a.getClass(); + classTest[3] = Item.getItemFromBlock(newBlock).getClass(); + } + } + } + } catch (Exception var19) { + exception = var19; + } + + if (classTest[0] != classTest[1] || classTest[0] != classTest[2] || classTest[0] == null || classTest[3] != itemBlockClass) { + throw new RuntimeException( + "RedPower was unable to replace block " + + toReplace.getUnlocalizedName() + + "! Debug info to report: " + + classTest[0] + + "," + + classTest[1] + + "," + + classTest[2] + + "," + + classTest[3], + exception + ); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BluePowerConductor.java b/src/main/java/com/eloraam/redpower/core/BluePowerConductor.java new file mode 100644 index 0000000..0a17be1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BluePowerConductor.java @@ -0,0 +1,201 @@ +package com.eloraam.redpower.core; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public abstract class BluePowerConductor { + private static int[] dirmap = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 11, 14, 18, 23}; + int imask = 0; + double[] currents; + public double Vcap = 0.0; + public double Icap = 0.0; + public double Veff = 0.0; + int lastTick = 0; + public double It1 = 0.0; + public double Itot = 0.0; + + public abstract TileEntity getParent(); + + public abstract double getInvCap(); + + public int getChargeScaled(int i) { + return 0; + } + + public int getFlowScaled(int i) { + return 0; + } + + public double getResistance() { + return 0.01; + } + + public double getIndScale() { + return 0.07; + } + + public double getCondParallel() { + return 0.5; + } + + public void recache(int conm, int econm) { + int imo = 0; + + for(int c2 = 0; c2 < 3; ++c2) { + if ((conm & RedPowerLib.getConDirMask(c2 * 2)) > 0) { + imo |= 1 << c2; + } + } + + for(int var12 = 0; var12 < 12; ++var12) { + if ((econm & 1 << dirmap[var12]) > 0) { + imo |= 8 << var12; + } + } + + if (this.imask != imo) { + double[] var11 = new double[Integer.bitCount(imo)]; + int s = 0; + int d = 0; + + for(int a = 0; a < 15; ++a) { + int m = 1 << a; + double v = 0.0; + if ((this.imask & m) > 0) { + v = this.currents[s++]; + } + + if ((imo & m) > 0) { + var11[d++] = v; + } + } + + this.currents = var11; + this.imask = imo; + } + + } + + protected void computeVoltage() { + this.Itot = 0.5 * this.It1; + this.It1 = 0.0; + this.Vcap += 0.05 * this.Icap * this.getInvCap(); + this.Icap = 0.0; + } + + public double getVoltage() { + long lt = this.getParent().getWorldObj().getWorldTime(); + if ((lt & 65535L) == (long)this.lastTick) { + return this.Vcap; + } else { + this.lastTick = (int)(lt & 65535L); + this.computeVoltage(); + return this.Vcap; + } + } + + public void applyCurrent(double Iin) { + this.getVoltage(); + this.Icap += Iin; + this.It1 += Math.abs(Iin); + } + + public void drawPower(double P) { + double p1 = this.Vcap * this.Vcap - 0.1 * P * this.getInvCap(); + double t = p1 < 0.0 ? 0.0 : Math.sqrt(p1) - this.Vcap; + this.applyDirect(20.0 * t / this.getInvCap()); + } + + public double getEnergy(double vthresh) { + double d = this.getVoltage(); + double tr = 0.5 * (d * d - vthresh * vthresh) / this.getInvCap(); + return tr < 0.0 ? 0.0 : tr; + } + + public void applyPower(double P) { + double t = Math.sqrt(this.Vcap * this.Vcap + 0.1 * P * this.getInvCap()) - this.Vcap; + this.applyDirect(20.0 * t / this.getInvCap()); + } + + public void applyDirect(double Iin) { + this.applyCurrent(Iin); + } + + public void iterate() { + TileEntity parent = this.getParent(); + World world = parent.getWorldObj(); + this.getVoltage(); + int dm = this.imask; + + for(int s = 0; dm > 0; ++s) { + int d = Integer.numberOfTrailingZeros(dm); + dm &= ~(1 << d); + WorldCoord wc = new WorldCoord(parent); + int facing; + if (d < 3) { + facing = d * 2; + wc.step(facing); + } else { + int ibc = dirmap[d - 3]; + wc.step(ibc >> 2); + facing = WorldCoord.getIndStepDir(ibc >> 2, ibc & 3); + wc.step(facing); + } + + IBluePowerConnectable powerConnectable = CoreLib.getTileEntity(world, wc, IBluePowerConnectable.class); + if (powerConnectable != null) { + BluePowerConductor bpc = powerConnectable.getBlueConductor(facing ^ 1); + double r = this.getResistance() + bpc.getResistance(); + double I = this.currents[s]; + double V = this.Vcap - bpc.getVoltage(); + this.currents[s] += (V - I * r) * this.getIndScale(); + I += V * this.getCondParallel(); + this.applyCurrent(-I); + bpc.applyCurrent(I); + } + } + + } + + public void readFromNBT(NBTTagCompound tag) { + this.imask = tag.getInteger("bpim"); + int l = Integer.bitCount(this.imask); + this.currents = new double[l]; + NBTTagList clist = tag.getTagList("bpil", 6); + if (clist.tagCount() == l) { + for(int i = 0; i < l; ++i) { + this.currents[i] = clist.func_150309_d(i); + } + + this.Vcap = tag.getDouble("vcap"); + this.Icap = tag.getDouble("icap"); + this.Veff = tag.getDouble("veff"); + this.It1 = tag.getDouble("it1"); + this.Itot = tag.getDouble("itot"); + this.lastTick = tag.getInteger("ltk"); + } + + } + + public void writeToNBT(NBTTagCompound tag) { + tag.setInteger("bpim", this.imask); + int l = Integer.bitCount(this.imask); + NBTTagList clist = new NBTTagList(); + + for(int i = 0; i < l; ++i) { + NBTTagDouble val = new NBTTagDouble(this.currents[i]); + clist.appendTag(val); + } + + tag.setTag("bpil", clist); + tag.setDouble("vcap", this.Vcap); + tag.setDouble("icap", this.Icap); + tag.setDouble("veff", this.Veff); + tag.setDouble("it1", this.It1); + tag.setDouble("itot", this.Itot); + tag.setInteger("ltk", this.lastTick); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BluePowerEndpoint.java b/src/main/java/com/eloraam/redpower/core/BluePowerEndpoint.java new file mode 100644 index 0000000..ffabd5b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BluePowerEndpoint.java @@ -0,0 +1,44 @@ +package com.eloraam.redpower.core; + +import net.minecraft.nbt.NBTTagCompound; + +public abstract class BluePowerEndpoint extends BluePowerConductor { + public int Charge = 0; + public int Flow = 0; + + @Override + public double getInvCap() { + return 0.25; + } + + @Override + public int getChargeScaled(int i) { + return Math.min(i, i * this.Charge / 1000); + } + + @Override + public int getFlowScaled(int i) { + return Integer.bitCount(this.Flow) * i / 32; + } + + @Override + public void iterate() { + super.iterate(); + this.Charge = (int)(this.getVoltage() * 10.0); + this.Flow = this.Flow << 1 | (this.Charge >= 600 ? 1 : 0); + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + this.Charge = tag.getShort("chg"); + this.Flow = tag.getInteger("flw"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + tag.setShort("chg", (short)this.Charge); + tag.setInteger("flw", this.Flow); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/BluePowerLib.java b/src/main/java/com/eloraam/redpower/core/BluePowerLib.java new file mode 100644 index 0000000..92461a7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/BluePowerLib.java @@ -0,0 +1,4 @@ +package com.eloraam.redpower.core; + +public class BluePowerLib { +} diff --git a/src/main/java/com/eloraam/redpower/core/Config.java b/src/main/java/com/eloraam/redpower/core/Config.java new file mode 100644 index 0000000..0524637 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/Config.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerCore; +import cpw.mods.fml.common.Loader; +import java.io.File; +import java.io.InputStream; + +public class Config { + private static File configDir; + private static File configFile; + private static TagFile config; + + public static void loadConfig() { + config = new TagFile(); + InputStream is = RedPowerCore.class.getResourceAsStream("/assets/rpcore/default.cfg"); + config.readStream(is); + if (configDir == null) { + File file = Loader.instance().getConfigDir(); + configDir = file; + configFile = new File(file, "redpower.cfg"); + } + + if (configFile.exists()) { + config.readFile(configFile); + } + + config.commentFile("RedPower 2 Configuration"); + } + + public static void saveConfig() { + config.saveFile(configFile); + } + + public static int getInt(String name) { + return config.getInt(name); + } + + public static int getInt(String name, int _default) { + return config.getInt(name, _default); + } + + public static String getString(String name) { + return config.getString(name); + } + + public static String getString(String name, String _default) { + return config.getString(name, _default); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CoreEvents.java b/src/main/java/com/eloraam/redpower/core/CoreEvents.java new file mode 100644 index 0000000..59a1189 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CoreEvents.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent; + +public class CoreEvents { + @SubscribeEvent + public void toolDestroyed(PlayerDestroyItemEvent ev) { + EntityPlayer player = ev.entityPlayer; + ItemStack orig = ev.original; + int ci = player.inventory.currentItem; + Item oid = orig.getItem(); + int odmg = orig.getItemDamage(); + ItemStack in2 = player.inventory.getStackInSlot(ci + 27); + ItemStack ist = player.inventory.getStackInSlot(ci); + if (ist != null && ist.stackSize <= 0 && in2 != null && in2.getItem() == oid && (!in2.getHasSubtypes() || in2.getItemDamage() == odmg)) { + player.inventory.setInventorySlotContents(ci, in2); + player.inventory.setInventorySlotContents(ci + 27, (ItemStack)null); + + for(int i = 2; i > 0; --i) { + ist = player.inventory.getStackInSlot(ci + 9 * i); + if (ist == null) { + return; + } + + if (ist.getItem() != oid) { + return; + } + + if (ist.getHasSubtypes() && ist.getItemDamage() != odmg) { + return; + } + + player.inventory.setInventorySlotContents(ci + 9 * i + 9, ist); + player.inventory.setInventorySlotContents(ci + 9 * i, (ItemStack)null); + } + } + + } + + @SubscribeEvent + public void oreRegister(OreRegisterEvent ev) { + CoreLib.registerOre(ev.Name, ev.Ore); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CoreLib.java b/src/main/java/com/eloraam/redpower/core/CoreLib.java new file mode 100644 index 0000000..63b1a60 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CoreLib.java @@ -0,0 +1,337 @@ +package com.eloraam.redpower.core; + +import com.mojang.authlib.GameProfile; +import cpw.mods.fml.relauncher.ReflectionHelper.UnableToAccessFieldException; +import cpw.mods.fml.relauncher.ReflectionHelper.UnableToFindFieldException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; +import java.util.TreeMap; +import java.util.UUID; +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import net.minecraftforge.oredict.OreDictionary; + +public class CoreLib { + private static TreeMap oreMap = new TreeMap<>(CoreLib::compareItemStack); + public static String[] rawColorNames = new String[]{ + "white", "orange", "magenta", "lightBlue", "yellow", "lime", "pink", "gray", "silver", "cyan", "purple", "blue", "brown", "green", "red", "black" + }; + public static String[] enColorNames = new String[]{ + "White", "Orange", "Magenta", "Light Blue", "Yellow", "Lime", "Pink", "Gray", "Light Gray", "Cyan", "Purple", "Blue", "Brown", "Green", "Red", "Black" + }; + public static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + public static final Material materialRedpower = new Material(MapColor.woodColor); + public static final GameProfile REDPOWER_PROFILE = new GameProfile(UUID.fromString("d90e51a0-41af-4a37-9fd0-f2fdc15a181b"), "[RedPower]"); + + public static FakePlayer getRedpowerPlayer(World world, int x, int y, int z, int rotation, GameProfile profile) { + MinecraftServer server = ((WorldServer)world).func_73046_m(); + FakePlayer player = FakePlayerFactory.get((WorldServer)world, profile); + double dx = (double)x + 0.5; + double dy = (double)y - 1.1; + double dz = (double)z + 0.5; + float pitch; + float yaw; + switch(rotation ^ 1) { + case 0: + pitch = 90.0F; + yaw = 0.0F; + dy -= 0.51; + break; + case 1: + pitch = -90.0F; + yaw = 0.0F; + dy += 0.51; + break; + case 2: + pitch = 0.0F; + yaw = 180.0F; + dz -= 0.51; + break; + case 3: + pitch = 0.0F; + yaw = 0.0F; + dz += 0.51; + break; + case 4: + pitch = 0.0F; + yaw = 90.0F; + dx -= 0.51; + break; + default: + pitch = 0.0F; + yaw = 270.0F; + dx += 0.51; + } + + player.setLocationAndAngles(dx, dy, dz, yaw, pitch); + return player; + } + + public static boolean hasBreakPermission(EntityPlayerMP player, int x, int y, int z) { + return hasEditPermission(player, x, y, z) + && !ForgeHooks.onBlockBreakEvent(player.worldObj, player.theItemInWorldManager.getGameType(), player, x, y, z).isCanceled(); + } + + public static boolean hasEditPermission(EntityPlayerMP player, int x, int y, int z) { + return player.canPlayerEdit(x, y, z, player.worldObj.getBlockMetadata(x, y, z), null) + && !MinecraftServer.getServer().isBlockProtected(player.worldObj, x, y, z, player); + } + + public static void updateAllLightTypes(World world, int x, int y, int z) { + world.updateLightByType(EnumSkyBlock.Block, x, y, z); + world.updateLightByType(EnumSkyBlock.Sky, x, y, z); + } + + @Deprecated + void initModule(String name) { + Class cl; + try { + cl = Class.forName(name); + } catch (ClassNotFoundException var7) { + return; + } + + Method mth; + try { + mth = cl.getDeclaredMethod("initialize"); + } catch (NoSuchMethodException var6) { + return; + } + + try { + mth.invoke(null); + } catch (InvocationTargetException | IllegalAccessException var5) { + } + + } + + public static T getTileEntity(IBlockAccess iba, int x, int y, int z, Class type) { + TileEntity tile = iba.getTileEntity(x, y, z); + return (T)(tile != null && type.isAssignableFrom(tile.getClass()) ? tile : null); + } + + public static T getTileEntity(IBlockAccess iba, WorldCoord wc, Class type) { + TileEntity tile = iba.getTileEntity(wc.x, wc.y, wc.z); + return (T)(tile != null && type.isAssignableFrom(tile.getClass()) ? tile : null); + } + + public static T getGuiTileEntity(World world, int x, int y, int z, Class cl) { + if (!world.isRemote) { + TileEntity tr = world.getTileEntity(x, y, z); + return (T)(!cl.isInstance(tr) ? null : tr); + } else { + try { + T t = (T)cl.newInstance(); + t.setWorldObj(world); + return t; + } catch (IllegalAccessException | InstantiationException var6) { + return null; + } + } + } + + public static void markBlockDirty(World world, int i, int j, int k) { + if (world.blockExists(i, j, k)) { + world.getChunkFromBlockCoords(i, k).setChunkModified(); + } + + } + + public static int compareItemStack(ItemStack a, ItemStack b) { + return Item.getIdFromItem(a.getItem()) != Item.getIdFromItem(b.getItem()) + ? Item.getIdFromItem(a.getItem()) - Item.getIdFromItem(b.getItem()) + : (a.getItemDamage() == b.getItemDamage() ? 0 : (a.getItem().getHasSubtypes() ? a.getItemDamage() - b.getItemDamage() : 0)); + } + + static void registerOre(String name, ItemStack ore) { + oreMap.put(ore, name); + } + + public static void readOres() { + for(String st : OreDictionary.getOreNames()) { + for(ItemStack ist : OreDictionary.getOres(st)) { + registerOre(st, ist); + } + } + + } + + public static String getOreClass(ItemStack ist) { + String st = (String)oreMap.get(ist); + if (st != null) { + return st; + } else { + ist = new ItemStack(ist.getItem(), 1, -1); + return (String)oreMap.get(ist); + } + } + + public static boolean matchItemStackOre(ItemStack a, ItemStack b) { + String s1 = getOreClass(a); + String s2 = getOreClass(b); + return (ItemStack.areItemStacksEqual(a, b) || s1 != null && s2 != null && s1.equals(s2)) && ItemStack.areItemStackTagsEqual(a, b); + } + + public static void dropItem(World world, int i, int j, int k, ItemStack ist) { + if (!world.isRemote) { + double d = 0.7; + double x = (double)world.rand.nextFloat() * d + (1.0 - d) * 0.5; + double y = (double)world.rand.nextFloat() * d + (1.0 - d) * 0.5; + double z = (double)world.rand.nextFloat() * d + (1.0 - d) * 0.5; + EntityItem item = new EntityItem(world, (double)i + x, (double)j + y, (double)k + z, ist); + item.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(item); + } + + } + + public static ItemStack copyStack(ItemStack ist, int n) { + return new ItemStack(ist.getItem(), n, ist.getItemDamage()); + } + + public static int rotToSide(int r) { + switch(r) { + case 0: + return 5; + case 1: + return 3; + case 2: + return 4; + default: + return 2; + } + } + + public static int getFacing(int side) { + switch(side) { + case 0: + return 2; + case 1: + return 5; + case 2: + return 3; + case 3: + return 4; + case 4: + return 1; + case 5: + return 0; + default: + return 0; + } + } + + public static MovingObjectPosition retraceBlock(World world, EntityLivingBase ent, int x, int y, int z) { + Vec3 org = Vec3.createVectorHelper(ent.posX, ent.posY + 1.62 - (double)ent.yOffset, ent.posZ); + Vec3 vec = ent.getLook(1.0F); + Vec3 end = org.addVector(vec.xCoord * 5.0, vec.yCoord * 5.0, vec.zCoord * 5.0); + Block bl = world.getBlock(x, y, z); + return bl == null ? null : bl.collisionRayTrace(world, x, y, z, org, end); + } + + public static MovingObjectPosition traceBlock(EntityPlayer player) { + Vec3 org = Vec3.createVectorHelper(player.posX, player.posY + 1.62 - (double)player.yOffset, player.posZ); + Vec3 vec = player.getLook(1.0F); + Vec3 end = org.addVector(vec.xCoord * 5.0, vec.yCoord * 5.0, vec.zCoord * 5.0); + return player.worldObj.rayTraceBlocks(org, end); + } + + public static void placeNoise(World world, int i, int j, int k, Block block) { + world.playSoundEffect( + (double)((float)i + 0.5F), + (double)((float)j + 0.5F), + (double)((float)k + 0.5F), + block.stepSound.func_150496_b(), + (block.stepSound.getVolume() + 1.0F) / 2.0F, + block.stepSound.getPitch() * 0.8F + ); + } + + public static int getBurnTime(ItemStack ist) { + return TileEntityFurnace.getItemBurnTime(ist); + } + + public static double getAverageEdgeLength(AxisAlignedBB aabb) { + double d = aabb.maxX - aabb.minX; + double d1 = aabb.maxY - aabb.minY; + double d2 = aabb.maxZ - aabb.minZ; + return (d + d1 + d2) / 3.0; + } + + public static void writeChat(EntityPlayer pl, String str) { + if (pl instanceof EntityPlayerMP) { + EntityPlayerMP emp = (EntityPlayerMP)pl; + emp.addChatComponentMessage(new ChatComponentText(str)); + } + + } + + public static void updateBlock(World world, int x, int y, int z) { + if (!(world.getTileEntity(x, y, z) instanceof TileExtended)) { + world.func_147479_m(x, y, z); + } + + } + + public static int[] toIntArray(List integerList) { + int[] intArray = new int[integerList.size()]; + + for(int i = 0; i < integerList.size(); ++i) { + intArray[i] = integerList.get(i); + } + + return intArray; + } + + public static void setFinalValue(Class classToAccess, T instance, E value, String... fieldNames) { + try { + findField(classToAccess, fieldNames).set(instance, value); + } catch (Exception var5) { + throw new UnableToAccessFieldException(fieldNames, var5); + } + } + + public static Field findField(Class clazz, String... fieldNames) { + Exception failed = null; + + for(String fieldName : fieldNames) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & -17); + return field; + } catch (Exception var9) { + failed = var9; + } + } + + throw new UnableToFindFieldException(fieldNames, failed); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CoverLib.java b/src/main/java/com/eloraam/redpower/core/CoverLib.java new file mode 100644 index 0000000..e0ec21b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CoverLib.java @@ -0,0 +1,1374 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.common.FMLCommonHandler; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class CoverLib { + public static final float selectBoxWidth = 0.25F; + public static Block blockCoverPlate = null; + public static ItemStack[] materials = new ItemStack[256]; + private static String[] names = new String[256]; + private static int[] hardness = new int[256]; + private static List materialHandlers = new ArrayList(); + private static boolean[] transparency = new boolean[256]; + private static float[] miningHardness = new float[256]; + private static Map> coverIndex = new LinkedHashMap(); + + public static void addMaterialHandler(CoverLib.IMaterialHandler handler) { + for(int i = 0; i < 256; ++i) { + if (materials[i] != null) { + handler.addMaterial(i); + } + } + + materialHandlers.add(handler); + } + + public static Integer getMaterial(ItemStack ist) { + List cvr = (List)coverIndex.get(ist.getItem()); + int meta = ist.getItemDamage(); + if (cvr == null) { + return null; + } else { + return meta >= cvr.size() ? null : (Integer)cvr.get(meta); + } + } + + public static void addMaterial(int n, int hard, Block bl, String name) { + addMaterial(n, hard, false, bl, 0, name); + } + + public static void addMaterial(int n, int hard, Block bl, int md, String name) { + addMaterial(n, hard, false, bl, md, name); + } + + public static void addMaterial(int n, int hard, boolean tpar, Block bl, String name) { + addMaterial(n, hard, tpar, bl, 0, name); + } + + public static void addMaterial(int n, int hard, boolean tpar, Block bl, int md, String name) { + ItemStack ist = new ItemStack(bl, 1, md); + if (FMLCommonHandler.instance().getSide().isClient()) { + CoverRenderer.coverIcons[n] = new IIcon[6]; + + for(int i = 0; i < 6; ++i) { + CoverRenderer.coverIcons[n][i] = bl.getIcon(i, md); + } + } + + if (bl instanceof IBlockHardness) { + miningHardness[n] = ((IBlockHardness)bl).getPrototypicalHardness(md); + } else { + miningHardness[n] = bl.getBlockHardness(null, 0, 0, 0); + } + + materials[n] = ist; + names[n] = name; + hardness[n] = hard; + transparency[n] = tpar; + ((List)coverIndex.computeIfAbsent(ist.getItem(), ix -> new ArrayList())).add(md, n); + + for(CoverLib.IMaterialHandler imh : materialHandlers) { + imh.addMaterial(n); + } + + } + + public static int damageToCoverData(int dmg) { + int hd = dmg >> 8; + int cn = dmg & 0xFF; + switch(hd) { + case 0: + cn |= 65536; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + default: + break; + case 16: + cn |= 131328; + break; + case 17: + cn |= 262656; + break; + case 18: + cn |= 33619968; + break; + case 19: + cn |= 33685760; + break; + case 20: + cn |= 33817088; + break; + case 21: + cn |= 16842752; + break; + case 22: + cn |= 16908544; + break; + case 23: + cn |= 17039872; + break; + case 24: + cn |= 1114880; + break; + case 25: + cn |= 1180672; + break; + case 26: + cn |= 1312000; + break; + case 27: + cn |= 198144; + break; + case 28: + cn |= 329472; + break; + case 29: + cn |= 395264; + break; + case 30: + cn |= 461056; + break; + case 31: + cn |= 1247744; + break; + case 32: + cn |= 1379072; + break; + case 33: + cn |= 1444864; + break; + case 34: + cn |= 1510656; + break; + case 35: + cn |= 33751808; + break; + case 36: + cn |= 33883136; + break; + case 37: + cn |= 33948928; + break; + case 38: + cn |= 34014720; + break; + case 39: + cn |= 16974592; + break; + case 40: + cn |= 17105920; + break; + case 41: + cn |= 17171712; + break; + case 42: + cn |= 17237504; + break; + case 43: + cn |= 50462720; + break; + case 44: + cn |= 50594048; + break; + case 45: + cn |= 50725376; + } + + return cn; + } + + public static int damageToCoverValue(int dmg) { + return damageToCoverData(dmg) & 65535; + } + + public static int coverValueToDamage(int side, int cov) { + int hd = cov >> 8; + int cn = cov & 0xFF; + if (side < 6) { + switch(hd) { + case 1: + cn |= 4096; + break; + case 2: + cn |= 4352; + break; + case 3: + cn |= 6144; + break; + case 4: + cn |= 6400; + break; + case 5: + cn |= 6656; + break; + case 6: + cn |= 6912; + break; + case 7: + cn |= 7168; + break; + case 8: + cn |= 7424; + break; + case 9: + cn |= 7680; + break; + case 10: + cn |= 7936; + break; + case 11: + cn |= 8192; + break; + case 12: + cn |= 8448; + break; + case 13: + cn |= 8704; + } + } else if (side < 14) { + switch(hd) { + case 0: + cn |= 4608; + break; + case 1: + cn |= 4864; + break; + case 2: + cn |= 5120; + break; + case 3: + cn |= 8960; + break; + case 4: + cn |= 9216; + break; + case 5: + cn |= 9472; + break; + case 6: + cn |= 9728; + } + } else if (side < 26) { + switch(hd) { + case 0: + cn |= 5376; + break; + case 1: + cn |= 5632; + break; + case 2: + cn |= 5888; + break; + case 3: + cn |= 9984; + break; + case 4: + cn |= 10240; + break; + case 5: + cn |= 10496; + break; + case 6: + cn |= 10752; + } + } else if (side < 29) { + switch(hd) { + case 0: + cn |= 11008; + break; + case 1: + cn |= 11264; + break; + case 2: + cn |= 11520; + } + } + + return cn; + } + + public static ItemStack convertCoverPlate(int side, int cov) { + return blockCoverPlate == null ? null : new ItemStack(blockCoverPlate, 1, coverValueToDamage(side, cov)); + } + + public static int cornerToCoverMask(int cn) { + switch(cn) { + case 0: + return 21; + case 1: + return 25; + case 2: + return 37; + case 3: + return 41; + case 4: + return 22; + case 5: + return 26; + case 6: + return 38; + default: + return 42; + } + } + + public static int coverToCornerMask(int cn) { + switch(cn) { + case 0: + return 15; + case 1: + return 240; + case 2: + return 85; + case 3: + return 170; + case 4: + return 51; + default: + return 204; + } + } + + public static int coverToStripMask(int cn) { + switch(cn) { + case 0: + return 15; + case 1: + return 3840; + case 2: + return 337; + case 3: + return 674; + case 4: + return 1076; + default: + return 2248; + } + } + + public static int stripToCornerMask(int sn) { + switch(sn) { + case 0: + return 5; + case 1: + return 10; + case 2: + return 3; + case 3: + return 12; + case 4: + return 17; + case 5: + return 34; + case 6: + return 68; + case 7: + return 136; + case 8: + return 80; + case 9: + return 160; + case 10: + return 48; + default: + return 192; + } + } + + public static int stripToCoverMask(int sn) { + switch(sn) { + case 0: + return 5; + case 1: + return 9; + case 2: + return 17; + case 3: + return 33; + case 4: + return 20; + case 5: + return 24; + case 6: + return 36; + case 7: + return 40; + case 8: + return 6; + case 9: + return 10; + case 10: + return 18; + default: + return 34; + } + } + + public static float getThickness(int side, int cov) { + if (side < 6) { + switch(cov >> 8) { + case 0: + return 0.125F; + case 1: + return 0.25F; + case 2: + return 0.5F; + case 3: + return 0.125F; + case 4: + return 0.25F; + case 5: + return 0.5F; + case 6: + return 0.375F; + case 7: + return 0.625F; + case 8: + return 0.75F; + case 9: + return 0.875F; + case 10: + return 0.375F; + case 11: + return 0.625F; + case 12: + return 0.75F; + case 13: + return 0.875F; + default: + return 1.0F; + } + } else { + if (side >= 26 && side < 29) { + switch(cov >> 8) { + case 0: + return 0.125F; + case 1: + return 0.25F; + case 2: + return 0.375F; + } + } + + switch(cov >> 8) { + case 0: + return 0.125F; + case 1: + return 0.25F; + case 2: + return 0.5F; + case 3: + return 0.375F; + case 4: + return 0.625F; + case 5: + return 0.75F; + case 6: + return 0.875F; + default: + return 1.0F; + } + } + } + + public static int getThicknessQuanta(int side, int cov) { + if (side < 6) { + switch(cov >> 8) { + case 0: + return 1; + case 1: + return 2; + case 2: + return 4; + case 3: + return 1; + case 4: + return 2; + case 5: + return 4; + case 6: + return 3; + case 7: + return 5; + case 8: + return 6; + case 9: + return 7; + case 10: + return 3; + case 11: + return 5; + case 12: + return 6; + case 13: + return 7; + default: + return 0; + } + } else { + if (side >= 26 && side < 29) { + switch(cov >> 8) { + case 0: + return 1; + case 1: + return 2; + case 2: + return 3; + } + } + + switch(cov >> 8) { + case 0: + return 1; + case 1: + return 2; + case 2: + return 4; + case 3: + return 3; + case 4: + return 5; + case 5: + return 6; + case 6: + return 7; + default: + return 0; + } + } + } + + public static boolean checkPlacement(int covm, short[] covs, int cons, boolean jacket) { + CoverLib.PlacementValidator pv = new CoverLib.PlacementValidator(covm, covs); + return pv.checkPlacement(cons, jacket); + } + + private static boolean canAddCover(World world, MovingObjectPosition mop, int item) { + if (world.canPlaceEntityOnSide(blockCoverPlate, mop.blockX, mop.blockY, mop.blockZ, false, mop.sideHit, null, null)) { + return true; + } else { + ICoverable icv = CoreLib.getTileEntity(world, mop.blockX, mop.blockY, mop.blockZ, ICoverable.class); + return icv != null && icv.canAddCover(mop.subHit, item); + } + } + + public static int extractCoverSide(MovingObjectPosition src) { + byte tr = 0; + double rpx = src.hitVec.xCoord - (double)src.blockX - 0.5; + double rpy = src.hitVec.yCoord - (double)src.blockY - 0.5; + double rpz = src.hitVec.zCoord - (double)src.blockZ - 0.5; + float sbw = 0.25F; + switch(src.sideHit) { + case 0: + case 1: + if (rpz > (double)(-sbw) && rpz < (double)sbw && rpx > (double)(-sbw) && rpx < (double)sbw) { + return src.sideHit; + } else if (rpz > rpx) { + if (rpz > -rpx) { + return 3; + } + + return 4; + } else { + if (rpz > -rpx) { + return 5; + } + + return 2; + } + case 2: + case 3: + if (rpy > (double)(-sbw) && rpy < (double)sbw && rpx > (double)(-sbw) && rpx < (double)sbw) { + return src.sideHit; + } else if (rpy > rpx) { + if (rpy > -rpx) { + return 1; + } + + return 4; + } else { + if (rpy > -rpx) { + return 5; + } + + return 0; + } + case 4: + case 5: + if (rpy > (double)(-sbw) && rpy < (double)sbw && rpz > (double)(-sbw) && rpz < (double)sbw) { + return src.sideHit; + } else if (rpy > rpz) { + if (rpy > -rpz) { + return 1; + } + + return 2; + } else { + if (rpy > -rpz) { + return 3; + } + + return 0; + } + default: + return tr; + } + } + + public static int extractCoverAxis(MovingObjectPosition src) { + switch(src.sideHit) { + case 0: + return 0; + case 1: + return src.hitVec.yCoord - (double)src.blockY > 0.5 ? 1 : 0; + case 2: + return 0; + case 3: + return src.hitVec.zCoord - (double)src.blockZ > 0.5 ? 1 : 0; + default: + return src.hitVec.xCoord - (double)src.blockX > 0.5 ? 1 : 0; + } + } + + private static void stepDir(MovingObjectPosition mop) { + switch(mop.sideHit) { + case 0: + --mop.blockY; + break; + case 1: + ++mop.blockY; + break; + case 2: + --mop.blockZ; + break; + case 3: + ++mop.blockZ; + break; + case 4: + --mop.blockX; + break; + default: + ++mop.blockX; + } + + } + + private static boolean isClickOutside(MovingObjectPosition mop) { + if (mop.subHit < 0) { + return true; + } else if (mop.subHit < 6) { + return mop.sideHit != (mop.subHit ^ 1); + } else if (mop.subHit < 14) { + int fc = mop.subHit - 6; + fc = fc >> 2 | (fc & 3) << 1; + return ((mop.sideHit ^ fc >> (mop.sideHit >> 1)) & 1) == 0; + } else if (mop.subHit < 26) { + int fc = mop.subHit - 14; + fc = stripToCoverMask(fc); + return (fc & 1 << (mop.sideHit ^ 1)) <= 0; + } else { + return mop.subHit < 29 || mop.subHit == 29; + } + } + + public static MovingObjectPosition getPlacement(World world, MovingObjectPosition src, int item) { + MovingObjectPosition tr = new MovingObjectPosition(src.blockX, src.blockY, src.blockZ, src.sideHit, src.hitVec); + int cval = damageToCoverValue(item); + int dir; + switch(item >> 8) { + case 0: + case 16: + case 17: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + case 34: + dir = extractCoverSide(src); + if (dir != tr.sideHit) { + tr.subHit = dir; + if (!isClickOutside(src) && canAddCover(world, tr, cval)) { + return tr; + } else { + stepDir(tr); + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } + } else { + if (!isClickOutside(src)) { + tr.subHit = dir ^ 1; + if (canAddCover(world, tr, cval)) { + return tr; + } + } + + tr.subHit = dir; + if (canAddCover(world, tr, cval)) { + return tr; + } else if (!isClickOutside(src)) { + return null; + } else { + stepDir(tr); + tr.subHit = dir ^ 1; + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } + } + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + default: + return null; + case 18: + case 19: + case 20: + case 35: + case 36: + case 37: + case 38: + double rpx = src.hitVec.xCoord - (double)src.blockX; + double rpy = src.hitVec.yCoord - (double)src.blockY; + double rpz = src.hitVec.zCoord - (double)src.blockZ; + dir = 0; + if (rpz > 0.5) { + ++dir; + } + + if (rpx > 0.5) { + dir += 2; + } + + if (rpy > 0.5) { + dir += 4; + } + + switch(src.sideHit) { + case 0: + dir &= 3; + break; + case 1: + dir |= 4; + break; + case 2: + dir &= 6; + break; + case 3: + dir |= 1; + break; + case 4: + dir &= 5; + break; + default: + dir |= 2; + } + + int dir2; + switch(src.sideHit) { + case 0: + case 1: + dir2 = dir ^ 4; + break; + case 2: + case 3: + dir2 = dir ^ 1; + break; + default: + dir2 = dir ^ 2; + } + + if (isClickOutside(src)) { + tr.subHit = dir2 + 6; + stepDir(tr); + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } else { + tr.subHit = dir2 + 6; + if (canAddCover(world, tr, cval)) { + return tr; + } else { + tr.subHit = dir + 6; + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } + } + case 21: + case 22: + case 23: + case 39: + case 40: + case 41: + case 42: + dir = extractCoverSide(src); + if (dir == tr.sideHit) { + return null; + } else { + int csm = coverToStripMask(dir); + if (!isClickOutside(src)) { + int csm2 = csm & coverToStripMask(tr.sideHit ^ 1); + tr.subHit = 14 + Integer.numberOfTrailingZeros(csm2); + if (canAddCover(world, tr, cval)) { + return tr; + } else { + csm2 = csm & coverToStripMask(tr.sideHit); + tr.subHit = 14 + Integer.numberOfTrailingZeros(csm2); + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } + } else { + stepDir(tr); + int csm2 = csm & coverToStripMask(tr.sideHit ^ 1); + tr.subHit = 14 + Integer.numberOfTrailingZeros(csm2); + if (canAddCover(world, tr, cval)) { + return tr; + } + + return null; + } + } + case 43: + case 44: + case 45: + dir = extractCoverSide(src); + if (dir != tr.sideHit && dir != (tr.sideHit ^ 1)) { + return null; + } else { + if (isClickOutside(src)) { + stepDir(tr); + } + + tr.subHit = (dir >> 1) + 26; + return canAddCover(world, tr, cval) ? tr : null; + } + } + } + + public static void replaceWithCovers(World world, int x, int y, int z, int sides, short[] covers) { + if (blockCoverPlate != null && sides != 0) { + world.setBlock(x, y, z, blockCoverPlate, 0, 3); + TileCovered tc = CoreLib.getTileEntity(world, x, y, z, TileCovered.class); + if (tc != null) { + tc.CoverSides = sides; + tc.Covers = covers; + RedPowerLib.updateIndirectNeighbors(world, x, y, z, blockCoverPlate); + tc.updateBlock(); + } + } + + } + + public static boolean tryMakeCompatible(World world, WorldCoord wc, Block bid, int dmg) { + TileCovered tc = CoreLib.getTileEntity(world, wc, TileCovered.class); + if (tc == null) { + return false; + } else { + int hb = dmg >> 8; + int lb = dmg & 0xFF; + int xid = tc.getExtendedID(); + if (xid == hb) { + return tc.getExtendedMetadata() == lb; + } else if (xid != 0) { + return false; + } else { + short[] covs = tc.Covers; + int cs = tc.CoverSides; + if (!world.setBlock(wc.x, wc.y, wc.z, bid, hb, 3)) { + return false; + } else { + tc = CoreLib.getTileEntity(world, wc, TileCovered.class); + if (tc == null) { + return true; + } else { + tc.Covers = covs; + tc.CoverSides = cs; + tc.setExtendedMetadata(lb); + return true; + } + } + } + } + } + + public static ItemStack getItemStack(int n) { + return materials[n]; + } + + public static Block getBlock(int n) { + ItemStack ist = materials[n]; + return Block.getBlockFromItem(ist.getItem()); + } + + public static int getMeta(int n) { + ItemStack ist = materials[n]; + return ist.getItemDamage(); + } + + public static String getName(int n) { + return names[n]; + } + + public static int getHardness(int n) { + return hardness[n]; + } + + public static float getMiningHardness(int n) { + return miningHardness[n]; + } + + public static boolean isTransparent(int n) { + return transparency[n]; + } + + public interface IMaterialHandler { + void addMaterial(int var1); + } + + private static class PlacementValidator { + public int sidemask = 0; + public int cornermask = 0; + public int fillcornermask = 0; + public int hollowcornermask = 0; + public int thickfaces = 0; + public int covm; + public short[] covs; + public int[] quanta = new int[29]; + + public PlacementValidator(int cm, short[] cs) { + this.covm = cm; + this.covs = cs; + } + + public boolean checkThickFace(int type) { + for(int i = 0; i < 6; ++i) { + if ((this.covm & 1 << i) != 0 && this.covs[i] >> 8 == type) { + int t = CoverLib.coverToCornerMask(i); + if ((this.fillcornermask & t) > 0) { + return false; + } + + this.fillcornermask |= t; + this.sidemask |= CoverLib.coverToStripMask(i); + } + } + + return true; + } + + public boolean checkThickSide(int type) { + for(int i = 0; i < 12; ++i) { + if ((this.covm & 1 << i + 14) != 0 && this.covs[i + 14] >> 8 == type) { + int t = CoverLib.stripToCornerMask(i); + if ((this.fillcornermask & t) > 0) { + return false; + } + + this.fillcornermask |= t; + this.sidemask |= 1 << i; + } + } + + return true; + } + + public boolean checkThickCorner(int type) { + for(int i = 0; i < 8; ++i) { + if ((this.covm & 1 << i + 6) != 0 && this.covs[i + 6] >> 8 == type) { + int t = 1 << i; + if ((this.fillcornermask & t) == t) { + return false; + } + + this.fillcornermask |= t; + } + } + + return true; + } + + public boolean checkFace(int type) { + for(int i = 0; i < 6; ++i) { + if ((this.covm & 1 << i) != 0 && this.covs[i] >> 8 == type) { + int t = CoverLib.coverToCornerMask(i); + if ((this.fillcornermask & t) == t) { + return false; + } + + this.cornermask |= t; + this.sidemask |= CoverLib.coverToStripMask(i); + } + } + + return true; + } + + public boolean checkSide(int type) { + for(int i = 0; i < 12; ++i) { + if ((this.covm & 1 << i + 14) != 0 && this.covs[i + 14] >> 8 == type) { + int t = CoverLib.stripToCornerMask(i); + if ((this.fillcornermask & t) == t) { + return false; + } + + if ((this.sidemask & 1 << i) > 0) { + return false; + } + + this.cornermask |= t; + this.sidemask |= 1 << i; + } + } + + return true; + } + + public boolean checkCorner(int type) { + for(int i = 0; i < 8; ++i) { + if ((this.covm & 1 << i + 6) != 0 && this.covs[i + 6] >> 8 == type) { + int t = 1 << i; + if ((this.cornermask & t) == t) { + return false; + } + + this.cornermask |= t; + } + } + + return true; + } + + public boolean checkHollow(int type) { + for(int i = 0; i < 6; ++i) { + if ((this.covm & 1 << i) != 0 && this.covs[i] >> 8 == type) { + int t = CoverLib.coverToCornerMask(i); + if ((this.cornermask & t) > 0) { + return false; + } + + this.cornermask |= t; + this.hollowcornermask |= t; + t = CoverLib.coverToStripMask(i); + if ((this.sidemask & t) > 0) { + return false; + } + + this.sidemask |= t; + } + } + + return true; + } + + public boolean checkHollowCover(int type) { + int ocm = 0; + int osm = 0; + + for(int i = 0; i < 6; ++i) { + if ((this.covm & 1 << i) != 0 && this.covs[i] >> 8 == type) { + int t = CoverLib.coverToCornerMask(i); + if ((this.cornermask & t) > 0) { + return false; + } + + ocm |= t; + t = CoverLib.coverToStripMask(i); + if ((this.sidemask & t) > 0) { + return false; + } + + osm |= t; + } + } + + this.cornermask |= ocm; + this.sidemask |= osm; + return true; + } + + public void calcQuanta() { + for(int i = 0; i < 29; ++i) { + if ((this.covm & 1 << i) == 0) { + this.quanta[i] = 0; + } else { + this.quanta[i] = CoverLib.getThicknessQuanta(i, this.covs[i]); + } + } + + } + + private boolean checkOverlap(int a, int b, int c, int d) { + a = this.quanta[a]; + b = this.quanta[b]; + c = this.quanta[c]; + d = this.quanta[d]; + return a + b > 8 || a + c > 8 || a + d > 8 || b + c > 8 || b + d > 8 || c + d > 8; + } + + public boolean checkImpingement() { + for(int i = 0; i < 6; i += 2) { + if (this.quanta[i] + this.quanta[i + 1] > 8) { + return false; + } + } + + if (this.checkOverlap(14, 15, 22, 23)) { + return false; + } else if (this.checkOverlap(16, 17, 24, 25)) { + return false; + } else if (this.checkOverlap(18, 19, 20, 22)) { + return false; + } else if (this.checkOverlap(6, 7, 8, 9)) { + return false; + } else if (this.checkOverlap(10, 11, 12, 13)) { + return false; + } else if (this.checkOverlap(6, 8, 10, 12)) { + return false; + } else if (this.checkOverlap(7, 9, 11, 13)) { + return false; + } else if (this.checkOverlap(6, 7, 10, 11)) { + return false; + } else if (this.checkOverlap(8, 9, 12, 13)) { + return false; + } else { + for(int var8 = 0; var8 < 6; ++var8) { + int q1 = this.quanta[var8]; + if (q1 != 0) { + int j = CoverLib.coverToCornerMask(var8); + int q2 = CoverLib.coverToStripMask(var8); + int q21 = CoverLib.coverToStripMask(var8 ^ 1); + + for(int j1 = 0; j1 < 8; ++j1) { + int q22 = this.quanta[6 + j1]; + if ((j & 1 << j1) == 0) { + if (q1 + q22 > 8) { + return false; + } + } else if (q22 > 0 && q22 < q1) { + return false; + } + } + + for(int var21 = 0; var21 < 12; ++var21) { + int q22 = this.quanta[14 + var21]; + if ((q21 & 1 << var21) > 0) { + if (q1 + q22 > 8) { + return false; + } + } else if ((q2 & 1 << var21) > 0 && q22 > 0 && q22 < q1) { + return false; + } + } + } + } + + for(int var9 = 0; var9 < 12; ++var9) { + int q1 = this.quanta[14 + var9]; + if (q1 != 0) { + int j = CoverLib.stripToCornerMask(var9); + + for(int q2 = 0; q2 < 8; ++q2) { + int q21 = this.quanta[6 + q2]; + if ((j & 1 << q2) == 0) { + if (q1 + q21 > 8) { + return false; + } + } else if (q21 > 0 && q21 < q1) { + return false; + } + } + } + } + + for(int var10 = 0; var10 < 3; ++var10) { + int q1 = this.quanta[26 + var10]; + if (q1 != 0) { + for(int j = 0; j < 8; ++j) { + int q2 = this.quanta[6 + j]; + if (q1 + q2 > 4) { + return false; + } + } + + for(int var15 = 0; var15 < 12; ++var15) { + int q2 = this.quanta[14 + var15]; + if (q1 + q2 > 4) { + return false; + } + } + + for(int var16 = 0; var16 < 6; ++var16) { + if (var16 >> 1 != var10 && this.quanta[var16] + q1 > 4) { + return false; + } + } + } + } + + return true; + } + } + + public boolean checkPlacement(int cons, boolean jacket) { + this.calcQuanta(); + if (!this.checkImpingement()) { + return false; + } else if (!this.checkThickFace(9)) { + return false; + } else if (!this.checkThickSide(6)) { + return false; + } else if (!this.checkThickCorner(6)) { + return false; + } else if (!this.checkThickFace(8)) { + return false; + } else if (!this.checkThickSide(5)) { + return false; + } else if (!this.checkThickCorner(5)) { + return false; + } else if (!this.checkThickFace(7)) { + return false; + } else if (!this.checkThickSide(4)) { + return false; + } else if (!this.checkThickCorner(4)) { + return false; + } else if (this.cornermask > 0 && cons > 0) { + return false; + } else if (!this.checkThickFace(2)) { + return false; + } else if (!this.checkThickSide(2)) { + return false; + } else if (!this.checkThickCorner(2)) { + return false; + } else { + this.cornermask = this.fillcornermask; + if (!this.checkFace(6)) { + return false; + } else if (!this.checkSide(3)) { + return false; + } else if (!this.checkCorner(3)) { + return false; + } else { + if ((this.covm & 469762048) > 0) { + if (jacket) { + return false; + } + + if (cons > 0) { + return false; + } + } + + for(int i = 0; i < 6; ++i) { + if ((cons & 1 << i) != 0 && (this.cornermask & CoverLib.coverToCornerMask(i)) > 0) { + return false; + } + } + + if (!this.checkFace(1)) { + return false; + } else if (!this.checkSide(1)) { + return false; + } else if (!this.checkCorner(1)) { + return false; + } else if (!jacket || this.cornermask <= 0 && this.sidemask <= 0) { + if (!this.checkHollow(13)) { + return false; + } else if (!this.checkHollow(12)) { + return false; + } else if (!this.checkHollow(11)) { + return false; + } else if (!this.checkHollow(10)) { + return false; + } else if (!this.checkHollow(5)) { + return false; + } else { + for(int var5 = 0; var5 < 6; ++var5) { + if ((cons & 1 << var5) != 0 && (this.hollowcornermask & CoverLib.coverToCornerMask(var5)) > 0) { + return false; + } + } + + if (!this.checkHollow(4)) { + return false; + } else if (!this.checkHollowCover(3)) { + return false; + } else if (!this.checkFace(0)) { + return false; + } else if (!this.checkSide(0)) { + return false; + } else if (!this.checkCorner(0)) { + return false; + } else { + for(int var6 = 0; var6 < 12; ++var6) { + if ((this.covm & 1 << var6 + 14) != 0) { + int t = CoverLib.stripToCoverMask(var6); + if ((cons & t) == t) { + return false; + } + } + } + + return true; + } + } + } else { + return false; + } + } + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CoverRecipe.java b/src/main/java/com/eloraam/redpower/core/CoverRecipe.java new file mode 100644 index 0000000..83a3172 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CoverRecipe.java @@ -0,0 +1,346 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.base.ItemHandsaw; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; + +public class CoverRecipe implements IRecipe { + private static ItemStack newCover(int num, int type, int mat) { + return new ItemStack(CoverLib.blockCoverPlate, num, type << 8 | mat); + } + + private ItemStack getSawRecipe(InventoryCrafting inv, ItemStack saw, int sawpos, ItemStack mat, int matpos) { + int sp1 = sawpos & 15; + int sp2 = sawpos >> 4; + int mp1 = matpos & 15; + int mp2 = matpos >> 4; + int dmg = -1; + int mn1; + if (mat.getItem() == Item.getItemFromBlock(CoverLib.blockCoverPlate)) { + dmg = mat.getItemDamage(); + mn1 = dmg & 0xFF; + dmg >>= 8; + } else { + Integer ihs = CoverLib.getMaterial(mat); + if (ihs == null) { + return null; + } + + mn1 = ihs; + } + + ItemHandsaw ihs1 = (ItemHandsaw)saw.getItem(); + if (ihs1.getSharpness() < CoverLib.getHardness(mn1)) { + return null; + } else if (sp1 != mp1 || sp2 != mp2 + 1 && sp2 != mp2 - 1) { + if (sp2 == mp2 && (sp1 == mp1 + 1 || sp1 == mp1 - 1)) { + switch(dmg) { + case 0: + return newCover(2, 21, mn1); + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 18: + case 19: + case 20: + case 24: + case 25: + case 26: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + case 38: + default: + return null; + case 16: + return newCover(2, 22, mn1); + case 17: + return newCover(2, 23, mn1); + case 21: + return newCover(2, 18, mn1); + case 22: + return newCover(2, 19, mn1); + case 23: + return newCover(2, 20, mn1); + case 27: + return newCover(2, 39, mn1); + case 28: + return newCover(2, 40, mn1); + case 29: + return newCover(2, 41, mn1); + case 30: + return newCover(2, 42, mn1); + case 39: + return newCover(2, 35, mn1); + case 40: + return newCover(2, 36, mn1); + case 41: + return newCover(2, 37, mn1); + case 42: + return newCover(2, 38, mn1); + } + } else { + return null; + } + } else { + switch(dmg) { + case -1: + return newCover(2, 17, mn1); + case 16: + return newCover(2, 0, mn1); + case 17: + return newCover(2, 16, mn1); + case 25: + return newCover(2, 24, mn1); + case 26: + return newCover(2, 25, mn1); + case 29: + return newCover(2, 27, mn1); + case 33: + return newCover(2, 31, mn1); + default: + return null; + } + } + } + + private ItemStack getColumnRecipe(ItemStack mat) { + if (mat.getItem() != Item.getItemFromBlock(CoverLib.blockCoverPlate)) { + return null; + } else { + int dmg = mat.getItemDamage(); + int mn = dmg & 0xFF; + dmg >>= 8; + switch(dmg) { + case 22: + return newCover(1, 43, mn); + case 23: + return newCover(1, 44, mn); + case 41: + return newCover(1, 45, mn); + case 43: + return newCover(1, 22, mn); + case 44: + return newCover(1, 23, mn); + case 45: + return newCover(1, 41, mn); + default: + return null; + } + } + } + + private ItemStack getMergeRecipe(int mn, int tth, int ic) { + int mc = mn >> 20; + mn &= 255; + switch(mc) { + case 0: + switch(tth) { + case 2: + return newCover(1, 16, mn); + case 3: + return newCover(1, 27, mn); + case 4: + return newCover(1, 17, mn); + case 5: + return newCover(1, 28, mn); + case 6: + return newCover(1, 29, mn); + case 7: + return newCover(1, 30, mn); + case 8: + return CoverLib.getItemStack(mn); + default: + return null; + } + case 1: + switch(tth) { + case 2: + return newCover(1, 25, mn); + case 3: + return newCover(1, 31, mn); + case 4: + return newCover(1, 26, mn); + case 5: + return newCover(1, 32, mn); + case 6: + return newCover(1, 33, mn); + case 7: + return newCover(1, 34, mn); + case 8: + return CoverLib.getItemStack(mn); + default: + return null; + } + case 16: + switch(tth) { + case 2: + return newCover(1, 0, mn); + case 4: + return newCover(1, 16, mn); + case 8: + return newCover(1, 17, mn); + case 16: + return CoverLib.getItemStack(mn); + default: + return null; + } + case 32: + if (ic == 2) { + switch(tth) { + case 2: + return newCover(1, 21, mn); + case 4: + return newCover(1, 22, mn); + case 8: + return newCover(1, 23, mn); + } + } else { + switch(tth) { + case 4: + return newCover(1, 0, mn); + case 8: + return newCover(1, 16, mn); + case 16: + return newCover(1, 17, mn); + case 32: + return CoverLib.getItemStack(mn); + } + } + default: + return null; + } + } + + private ItemStack getHollowRecipe(int mn) { + int mc = mn >> 8 & 0xFF; + mn &= 255; + switch(mc) { + case 0: + return newCover(8, 24, mn); + case 16: + return newCover(8, 25, mn); + case 17: + return newCover(8, 26, mn); + case 27: + return newCover(8, 31, mn); + case 28: + return newCover(8, 32, mn); + case 29: + return newCover(8, 33, mn); + case 30: + return newCover(8, 34, mn); + default: + return null; + } + } + + private int getMicroClass(ItemStack ist) { + if (ist.getItem() != Item.getItemFromBlock(CoverLib.blockCoverPlate)) { + return -1; + } else { + int dmg = ist.getItemDamage(); + return CoverLib.damageToCoverData(dmg); + } + } + + private ItemStack findResult(InventoryCrafting inv) { + ItemStack saw = null; + ItemStack mat = null; + boolean bad = false; + boolean allmicro = true; + boolean strict = true; + int sp = 0; + int mp = 0; + int mn = -1; + int tth = 0; + int ic = 0; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + ItemStack ist = inv.getStackInRowAndColumn(i, j); + if (ist != null) { + if (ist.getItem() instanceof ItemHandsaw) { + if (saw != null) { + bad = true; + } else { + saw = ist; + sp = i + j * 16; + } + } else if (mat == null) { + mat = ist; + mp = i + j * 16; + mn = this.getMicroClass(ist); + if (mn >= 0) { + tth += mn >> 16 & 15; + } else { + allmicro = false; + } + + ic = 1; + } else { + bad = true; + if (allmicro) { + int t = this.getMicroClass(ist); + if (((t ^ mn) & -1048321) != 0) { + allmicro = false; + } else { + if (t != mn) { + strict = false; + } + + tth += t >> 16 & 15; + ++ic; + } + } + } + } + } + } + + if (saw != null && mat != null && !bad) { + return this.getSawRecipe(inv, saw, sp, mat, mp); + } else if (saw == null && mat != null && !bad) { + return this.getColumnRecipe(mat); + } else if (!allmicro || !bad || saw != null) { + return null; + } else { + return ic == 8 && strict && inv.getStackInRowAndColumn(1, 1) == null && mn >> 20 == 0 ? this.getHollowRecipe(mn) : this.getMergeRecipe(mn, tth, ic); + } + } + + public boolean matches(InventoryCrafting inv, World world) { + return this.findResult(inv) != null; + } + + public int getRecipeSize() { + return 9; + } + + public ItemStack getCraftingResult(InventoryCrafting inv) { + return this.findResult(inv).copy(); + } + + public ItemStack getRecipeOutput() { + return new ItemStack(CoverLib.blockCoverPlate, 1, 0); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CoverRenderer.java b/src/main/java/com/eloraam/redpower/core/CoverRenderer.java new file mode 100644 index 0000000..919f92e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CoverRenderer.java @@ -0,0 +1,546 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +@SideOnly(Side.CLIENT) +public class CoverRenderer { + private float cx1; + private float cx2; + private float cy1; + private float cy2; + private float cz1; + private float cz2; + private float[] x1 = new float[4]; + private float[] x2 = new float[4]; + private float[] y1 = new float[4]; + private float[] y2 = new float[4]; + private float[] z1 = new float[4]; + private float[] z2 = new float[4]; + private short[] covs; + private int covmask; + private int covmaskt; + private int covmaskh; + private int covmasko; + public static IIcon[][] coverIcons = new IIcon[256][]; + protected RenderContext context; + + public CoverRenderer(RenderContext ctx) { + this.context = ctx; + } + + public void start() { + this.cx1 = 0.0F; + this.cx2 = 1.0F; + this.cy1 = 0.0F; + this.cy2 = 1.0F; + this.cz1 = 0.0F; + this.cz2 = 1.0F; + } + + public void startShrink(float sh) { + this.cx1 = sh; + this.cx2 = 1.0F - sh; + this.cy1 = sh; + this.cy2 = 1.0F - sh; + this.cz1 = sh; + this.cz2 = 1.0F - sh; + } + + public void sizeHollow(int part, int s) { + switch(part) { + case 0: + case 1: + if (s == 0) { + this.context.boxSize2.x = 0.25; + } + + if (s == 1) { + this.context.boxSize1.x = 0.75; + } + + if (s > 1) { + this.context.boxSize1.x = 0.25; + this.context.boxSize2.x = 0.75; + } + + if (s == 2) { + this.context.boxSize2.z = 0.25; + } + + if (s == 3) { + this.context.boxSize1.z = 0.75; + } + break; + case 2: + case 3: + if (s == 0) { + this.context.boxSize2.x = 0.25; + } + + if (s == 1) { + this.context.boxSize1.x = 0.75; + } + + if (s > 1) { + this.context.boxSize1.x = 0.25; + this.context.boxSize2.x = 0.75; + } + + if (s == 2) { + this.context.boxSize2.y = 0.25; + } + + if (s == 3) { + this.context.boxSize1.y = 0.75; + } + break; + default: + if (s == 0) { + this.context.boxSize2.z = 0.25; + } + + if (s == 1) { + this.context.boxSize1.z = 0.75; + } + + if (s > 1) { + this.context.boxSize1.z = 0.25; + this.context.boxSize2.z = 0.75; + } + + if (s == 2) { + this.context.boxSize2.y = 0.25; + } + + if (s == 3) { + this.context.boxSize1.y = 0.75; + } + } + + } + + public int innerFace(int part, int s) { + int m; + switch(part) { + case 0: + case 1: + m = 67637280; + break; + case 2: + case 3: + m = 16912416; + break; + default: + m = 16909320; + } + + return m >> s * 8; + } + + public boolean sizeColumnSpoke(int part, boolean n1, float f) { + part = part - 26 + (n1 ? 3 : 0); + switch(part) { + case 0: + this.context.boxSize2.y = 0.5 - (double)f; + return 0.5 - (double)f > (double)this.cy1; + case 1: + this.context.boxSize2.z = 0.5 - (double)f; + return 0.5 - (double)f > (double)this.cz1; + case 2: + this.context.boxSize2.x = 0.5 - (double)f; + return 0.5 - (double)f > (double)this.cx1; + case 3: + this.context.boxSize2.y = (double)this.cy2; + this.context.boxSize1.y = 0.5 + (double)f; + return 0.5 + (double)f < (double)this.cy2; + case 4: + this.context.boxSize2.z = (double)this.cz2; + this.context.boxSize1.z = 0.5 + (double)f; + return 0.5 + (double)f < (double)this.cz2; + case 5: + this.context.boxSize2.x = (double)this.cx2; + this.context.boxSize1.x = 0.5 + (double)f; + return 0.5 + (double)f < (double)this.cx2; + default: + return false; + } + } + + public void setSize(int part, float th) { + switch(part) { + case 0: + this.context.setSize((double)this.cx1, 0.0, (double)this.cz1, (double)this.cx2, (double)th, (double)this.cz2); + this.cy1 = th; + break; + case 1: + this.context.setSize((double)this.cx1, (double)(1.0F - th), (double)this.cz1, (double)this.cx2, 1.0, (double)this.cz2); + this.cy2 = 1.0F - th; + break; + case 2: + this.context.setSize((double)this.cx1, (double)this.cy1, 0.0, (double)this.cx2, (double)this.cy2, (double)th); + this.cz1 = th; + break; + case 3: + this.context.setSize((double)this.cx1, (double)this.cy1, (double)(1.0F - th), (double)this.cx2, (double)this.cy2, 1.0); + this.cz2 = 1.0F - th; + break; + case 4: + this.context.setSize(0.0, (double)this.cy1, (double)this.cz1, (double)th, (double)this.cy2, (double)this.cz2); + this.cx1 = th; + break; + case 5: + this.context.setSize((double)(1.0F - th), (double)this.cy1, (double)this.cz1, 1.0, (double)this.cy2, (double)this.cz2); + this.cx2 = 1.0F - th; + break; + case 6: + this.context.setSize((double)this.cx1, (double)this.cy1, (double)this.cz1, (double)th, (double)th, (double)th); + this.x1[0] = th; + this.y1[0] = th; + this.z1[0] = th; + break; + case 7: + this.context.setSize((double)this.cx1, (double)this.cy1, (double)(1.0F - th), (double)th, (double)th, (double)this.cz2); + this.x1[1] = th; + this.y1[1] = th; + this.z2[0] = 1.0F - th; + break; + case 8: + this.context.setSize((double)(1.0F - th), (double)this.cy1, (double)this.cz1, (double)this.cx2, (double)th, (double)th); + this.x2[0] = 1.0F - th; + this.y1[2] = th; + this.z1[1] = th; + break; + case 9: + this.context.setSize((double)(1.0F - th), (double)this.cy1, (double)(1.0F - th), (double)this.cx2, (double)th, (double)this.cz2); + this.x2[1] = 1.0F - th; + this.y1[3] = th; + this.z2[1] = 1.0F - th; + break; + case 10: + this.context.setSize((double)this.cx1, (double)(1.0F - th), (double)this.cz1, (double)th, (double)this.cy2, (double)th); + this.x1[2] = th; + this.y2[0] = 1.0F - th; + this.z1[2] = th; + break; + case 11: + this.context.setSize((double)this.cx1, (double)(1.0F - th), (double)(1.0F - th), (double)th, (double)this.cy2, (double)this.cz2); + this.x1[3] = th; + this.y2[1] = 1.0F - th; + this.z2[2] = 1.0F - th; + break; + case 12: + this.context.setSize((double)(1.0F - th), (double)(1.0F - th), (double)this.cz1, (double)this.cx2, (double)this.cy2, (double)th); + this.x2[2] = 1.0F - th; + this.y2[2] = 1.0F - th; + this.z1[3] = th; + break; + case 13: + this.context.setSize((double)(1.0F - th), (double)(1.0F - th), (double)(1.0F - th), (double)this.cx2, (double)this.cy2, (double)this.cz2); + this.x2[3] = 1.0F - th; + this.y2[3] = 1.0F - th; + this.z2[3] = 1.0F - th; + break; + case 14: + this.context.setSize((double)this.x1[0], (double)this.cy1, (double)this.cz1, (double)this.x2[0], (double)th, (double)th); + this.z1[0] = Math.max(this.z1[0], th); + this.z1[1] = Math.max(this.z1[1], th); + this.y1[0] = Math.max(this.y1[0], th); + this.y1[2] = Math.max(this.y1[2], th); + break; + case 15: + this.context.setSize((double)this.x1[1], (double)this.cy1, (double)(1.0F - th), (double)this.x2[1], (double)th, (double)this.cz2); + this.z2[0] = Math.min(this.z2[0], 1.0F - th); + this.z2[1] = Math.min(this.z2[1], 1.0F - th); + this.y1[1] = Math.max(this.y1[1], th); + this.y1[3] = Math.max(this.y1[3], th); + break; + case 16: + this.context.setSize((double)this.cx1, (double)this.cy1, (double)this.z1[0], (double)th, (double)th, (double)this.z2[0]); + this.x1[0] = Math.max(this.x1[0], th); + this.x1[1] = Math.max(this.x1[1], th); + this.y1[0] = Math.max(this.y1[0], th); + this.y1[1] = Math.max(this.y1[1], th); + break; + case 17: + this.context.setSize((double)(1.0F - th), (double)this.cy1, (double)this.z1[1], (double)this.cx2, (double)th, (double)this.z2[1]); + this.x2[0] = Math.min(this.x2[0], 1.0F - th); + this.x2[1] = Math.min(this.x2[1], 1.0F - th); + this.y1[2] = Math.max(this.y1[2], th); + this.y1[3] = Math.max(this.y1[3], th); + break; + case 18: + this.context.setSize((double)this.cx1, (double)this.y1[0], (double)this.cz1, (double)th, (double)this.y2[0], (double)th); + this.x1[0] = Math.max(this.x1[0], th); + this.x1[2] = Math.max(this.x1[2], th); + this.z1[0] = Math.max(this.z1[0], th); + this.z1[2] = Math.max(this.z1[2], th); + break; + case 19: + this.context.setSize((double)this.cx1, (double)this.y1[1], (double)(1.0F - th), (double)th, (double)this.y2[1], (double)this.cz2); + this.x1[1] = Math.max(this.x1[1], th); + this.x1[3] = Math.max(this.x1[3], th); + this.z2[0] = Math.min(this.z2[0], 1.0F - th); + this.z2[2] = Math.min(this.z2[2], 1.0F - th); + break; + case 20: + this.context.setSize((double)(1.0F - th), (double)this.y1[2], (double)this.cz1, (double)this.cx2, (double)this.y2[2], (double)th); + this.x2[0] = Math.min(this.x2[0], 1.0F - th); + this.x2[2] = Math.min(this.x2[2], 1.0F - th); + this.z1[1] = Math.max(this.z1[1], th); + this.z1[3] = Math.max(this.z1[3], th); + break; + case 21: + this.context.setSize((double)(1.0F - th), (double)this.y1[3], (double)(1.0F - th), (double)this.cx2, (double)this.y2[3], (double)this.cz2); + this.x2[1] = Math.min(this.x2[1], 1.0F - th); + this.x2[3] = Math.min(this.x2[3], 1.0F - th); + this.z2[1] = Math.min(this.z2[1], 1.0F - th); + this.z2[3] = Math.min(this.z2[3], 1.0F - th); + break; + case 22: + this.context.setSize((double)this.x1[2], (double)(1.0F - th), (double)this.cz1, (double)this.x2[2], (double)this.cy2, (double)th); + this.z1[2] = Math.max(this.z1[2], th); + this.z1[3] = Math.max(this.z1[3], th); + this.y2[0] = Math.min(this.y2[0], 1.0F - th); + this.y2[2] = Math.min(this.y2[2], 1.0F - th); + break; + case 23: + this.context.setSize((double)this.x1[3], (double)(1.0F - th), (double)(1.0F - th), (double)this.x2[3], (double)this.cy2, (double)this.cz2); + this.z2[2] = Math.max(this.z2[2], 1.0F - th); + this.z2[3] = Math.max(this.z2[3], 1.0F - th); + this.y2[1] = Math.min(this.y2[1], 1.0F - th); + this.y2[3] = Math.min(this.y2[3], 1.0F - th); + break; + case 24: + this.context.setSize((double)this.cx1, (double)(1.0F - th), (double)this.z1[2], (double)th, (double)this.cy2, (double)this.z2[2]); + this.x1[2] = Math.max(this.x1[2], th); + this.x1[3] = Math.max(this.x1[3], th); + this.y2[0] = Math.min(this.y2[0], 1.0F - th); + this.y2[1] = Math.min(this.y2[1], 1.0F - th); + break; + case 25: + this.context.setSize((double)(1.0F - th), (double)(1.0F - th), (double)this.z1[3], (double)this.cx2, (double)this.cy2, (double)this.z2[3]); + this.x2[2] = Math.min(this.x2[2], 1.0F - th); + this.x2[3] = Math.min(this.x2[3], 1.0F - th); + this.y2[2] = Math.min(this.y2[2], 1.0F - th); + this.y2[3] = Math.min(this.y2[3], 1.0F - th); + break; + case 26: + this.context.setSize(0.5 - (double)th, (double)this.cy1, 0.5 - (double)th, 0.5 + (double)th, (double)this.cy2, 0.5 + (double)th); + break; + case 27: + this.context.setSize(0.5 - (double)th, 0.5 - (double)th, (double)this.cz1, 0.5 + (double)th, 0.5 + (double)th, (double)this.cz2); + break; + case 28: + this.context.setSize((double)this.cx1, 0.5 - (double)th, 0.5 - (double)th, (double)this.cx2, 0.5 + (double)th, 0.5 + (double)th); + } + + } + + void setupCorners() { + for(int i = 0; i < 4; ++i) { + this.x1[i] = this.cx1; + this.y1[i] = this.cy1; + this.z1[i] = this.cz1; + this.x2[i] = this.cx2; + this.y2[i] = this.cy2; + this.z2[i] = this.cz2; + } + + } + + public void initMasks(int uc, short[] cv) { + this.covmask = uc; + this.covs = cv; + this.covmaskt = 0; + this.covmaskh = 0; + this.covmasko = 0; + + for(int i = 0; i < 6; ++i) { + if ((uc & 1 << i) != 0) { + if (CoverLib.isTransparent(this.covs[i] & 255)) { + this.covmaskt |= 1 << i; + } + + if (this.covs[i] >> 8 > 2) { + this.covmaskh |= 1 << i; + } + } + } + + this.covmasko = this.covmask & ~this.covmaskt & ~this.covmaskh; + } + + public void render(int uc, short[] cv) { + this.initMasks(uc, cv); + this.start(); + this.renderShell(); + if ((uc & -64) != 0) { + this.renderOthers(); + } + + } + + public void renderShrink(int uc, short[] cv, float sh) { + this.initMasks(uc, cv); + this.startShrink(sh); + this.renderShell(); + if ((uc & -64) != 0) { + this.renderOthers(); + } + + } + + public void setIcon(int cn) { + this.context.setIcon(coverIcons[cn]); + } + + public void setIcon(int c1, int c2, int c3, int c4, int c5, int c6) { + this.context.setIcon(coverIcons[c1][0], coverIcons[c2][1], coverIcons[c3][2], coverIcons[c4][3], coverIcons[c5][4], coverIcons[c6][5]); + } + + public void renderShell() { + this.context.setOrientation(0, 0); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + if (this.covmasko > 0) { + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.setIcon(this.covs[0] & 255, this.covs[1] & 255, this.covs[2] & 255, this.covs[3] & 255, this.covs[4] & 255, this.covs[5] & 255); + this.context.setTexFlags(55); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(this.covmasko); + } + + int rsf = (this.covmasko | this.covmaskh) & ~this.covmaskt; + if (rsf > 0) { + for(int i = 0; i < 6; ++i) { + if ((rsf & 1 << i) != 0) { + this.setIcon(this.covs[i] & 255); + int cn = this.covs[i] >> 8; + int vf = 1 << (i ^ 1) | 63 ^ this.covmasko; + if (cn >= 3 && cn <= 5 || cn >= 10 && cn <= 13) { + for(int j = 0; j < 4; ++j) { + this.setSize(i, CoverLib.getThickness(i, this.covs[i])); + this.sizeHollow(i, j); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(vf | this.innerFace(i, j)); + } + } else { + this.setSize(i, CoverLib.getThickness(i, this.covs[i])); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(vf); + } + } + } + } + + if (this.covmaskt > 0) { + for(int i = 0; i < 6; ++i) { + if ((this.covmaskt & 1 << i) != 0) { + this.setIcon(this.covs[i] & 255); + int cn = this.covs[i] >> 8; + int vf = 1 << (i ^ 1) | 63 ^ this.covmasko; + if (cn >= 3 && cn <= 5 || cn >= 10 && cn <= 13) { + for(int j = 0; j < 4; ++j) { + this.setSize(i, CoverLib.getThickness(i, this.covs[i])); + this.sizeHollow(i, j); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(vf | this.innerFace(i, j)); + } + } else { + this.setSize(i, CoverLib.getThickness(i, this.covs[i])); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(vf); + } + } + } + } + + } + + public void renderOthers() { + float cth = 0.0F; + int colc = 0; + int coln = 0; + + for(int j = 26; j < 29; ++j) { + if ((this.covmasko & 1 << j) != 0) { + ++colc; + float i = CoverLib.getThickness(j, this.covs[j]); + if (i > cth) { + coln = j; + cth = i; + } + } + } + + if (colc > 1) { + this.setIcon(this.covs[coln] & 255); + this.context.setSize(0.5 - (double)cth, 0.5 - (double)cth, 0.5 - (double)cth, 0.5 + (double)cth, 0.5 + (double)cth, 0.5 + (double)cth); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(63); + + for(int var61 = 26; var61 < 29; ++var61) { + if ((this.covmasko & 1 << var61) != 0) { + this.setIcon(this.covs[var61] & 255); + this.setSize(var61, CoverLib.getThickness(var61, this.covs[var61])); + if (this.sizeColumnSpoke(var61, false, cth)) { + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(63); + } + + if (this.sizeColumnSpoke(var61, true, cth)) { + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(63); + } + } + } + } else if (colc == 1) { + this.setIcon(this.covs[coln] & 255); + this.setSize(coln, CoverLib.getThickness(coln, this.covs[coln])); + this.context.calcBoundsGlobal(); + this.context.renderGlobFaces(63 ^ 3 << coln - 25 & this.covmasko); + } + + this.setupCorners(); + + for(int var7 = 6; var7 < 14; ++var7) { + if ((this.covmasko & 1 << var7) != 0) { + this.setSize(var7, CoverLib.getThickness(var7, this.covs[var7])); + this.context.calcBoundsGlobal(); + this.setIcon(this.covs[var7] & 255); + this.context.renderGlobFaces(63); + } + } + + for(int var8 = 6; var8 >= 0; --var8) { + for(int var6 = 14; var6 < 26; ++var6) { + if ((this.covmasko & 1 << var6) != 0 && this.covs[var6] >> 8 == var8) { + this.setSize(var6, CoverLib.getThickness(var6, this.covs[var6])); + this.context.calcBoundsGlobal(); + this.setIcon(this.covs[var6] & 255); + this.context.renderGlobFaces(63); + } + } + } + + } + + @SideOnly(Side.CLIENT) + public static void reInitIcons() { + for(int i = 0; i < CoverLib.materials.length; ++i) { + ItemStack is = CoverLib.materials[i]; + if (is != null) { + Block b = Block.getBlockFromItem(is.getItem()); + if (b != null) { + for(int side = 0; side < 6; ++side) { + coverIcons[i][side] = b.getIcon(side, is.getItemDamage()); + } + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CraftLib.java b/src/main/java/com/eloraam/redpower/core/CraftLib.java new file mode 100644 index 0000000..c9dd652 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CraftLib.java @@ -0,0 +1,138 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +public class CraftLib { + public static List> alloyRecipes = new ArrayList(); + public static HashSet damageOnCraft = new HashSet(); + public static HashMap damageContainer = new HashMap(); + + public static void addAlloyResult(ItemStack output, Object... input) { + alloyRecipes.add(Arrays.asList(input, output)); + } + + public static void addOreRecipe(ItemStack output, Object... input) { + CraftingManager.getInstance().getRecipeList().add(new ShapedOreRecipe(output, new Object[]{Boolean.TRUE, input})); + } + + public static void addShapelessOreRecipe(ItemStack output, Object... input) { + CraftingManager.getInstance().getRecipeList().add(new ShapelessOreRecipe(output, input)); + } + + public static boolean isOreClass(ItemStack ist, String ore) { + for(ItemStack stack : OreDictionary.getOres(ore)) { + if (stack.isItemEqual(ist)) { + return true; + } + } + + return false; + } + + public static ItemStack getAlloyResult(ItemStack[] input, int start, int end, boolean take) { + label134: + for(List l : alloyRecipes) { + Object[] ob = l.toArray(); + Object[] ipt = (Object[]) ob[0]; + + for(Object ingredient : ipt) { + if (ingredient instanceof ItemStack) { + ItemStack inputStack = (ItemStack)ingredient; + int rc = inputStack.stackSize; + + for(int i = start; i < end; ++i) { + if (input[i] != null) { + if (input[i].isItemEqual(inputStack)) { + rc -= input[i].stackSize; + } + + if (rc <= 0) { + break; + } + } + } + + if (rc > 0) { + continue label134; + } + } else if (ingredient instanceof OreStack) { + OreStack inputStack = (OreStack)ingredient; + int rc = inputStack.quantity; + + for(int i = start; i < end; ++i) { + if (input[i] != null) { + if (isOreClass(input[i], inputStack.material)) { + rc -= input[i].stackSize; + } + + if (rc <= 0) { + break; + } + } + } + + if (rc > 0) { + continue label134; + } + } + } + + if (take) { + for(Object ingredient : ipt) { + if (ingredient instanceof ItemStack) { + ItemStack inputStack = (ItemStack)ingredient; + int rc = inputStack.stackSize; + + for(int i = start; i < end; ++i) { + if (input[i] != null && input[i].isItemEqual(inputStack)) { + rc -= input[i].stackSize; + if (rc < 0) { + input[i].stackSize = -rc; + } else if (input[i].getItem().hasContainerItem()) { + input[i] = new ItemStack(input[i].getItem().getContainerItem()); + } else { + input[i] = null; + } + + if (rc <= 0) { + break; + } + } + } + } else if (ingredient instanceof OreStack) { + OreStack inputStack = (OreStack)ingredient; + int rc = inputStack.quantity; + + for(int i = start; i < end; ++i) { + if (input[i] != null && isOreClass(input[i], inputStack.material)) { + rc -= input[i].stackSize; + if (rc < 0) { + input[i].stackSize = -rc; + } else { + input[i] = null; + } + + if (rc <= 0) { + break; + } + } + } + } + } + } + + return (ItemStack)ob[1]; + } + + return null; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/CreativeExtraTabs.java b/src/main/java/com/eloraam/redpower/core/CreativeExtraTabs.java new file mode 100644 index 0000000..f54bad7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/CreativeExtraTabs.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerBase; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class CreativeExtraTabs { + public static CreativeTabs tabWires = new CreativeTabs(CreativeTabs.getNextID(), "RPWires") { + public ItemStack getIconItemStack() { + return new ItemStack(RedPowerBase.blockMicro, 1, 768); + } + + public Item getTabIconItem() { + return null; + } + }; + public static CreativeTabs tabMicros = new CreativeTabs(CreativeTabs.getNextID(), "RPMicroblocks") { + public ItemStack getIconItemStack() { + return new ItemStack(RedPowerBase.blockMicro, 1, 23); + } + + public Item getTabIconItem() { + return null; + } + }; + public static CreativeTabs tabMachine = new CreativeTabs(CreativeTabs.getNextID(), "RPMachines") { + public ItemStack getIconItemStack() { + return new ItemStack(RedPowerBase.blockAppliance, 1, 3); + } + + public Item getTabIconItem() { + return null; + } + }; +} diff --git a/src/main/java/com/eloraam/redpower/core/DiskLib.java b/src/main/java/com/eloraam/redpower/core/DiskLib.java new file mode 100644 index 0000000..71e5975 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/DiskLib.java @@ -0,0 +1,27 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerCore; +import java.io.File; +import net.minecraft.world.World; + +public class DiskLib { + public static File getSaveDir(World world) { + File tr = new File(RedPowerCore.getSaveDir(world), "redpower"); + tr.mkdirs(); + return tr; + } + + public static String generateSerialNumber(World world) { + StringBuilder tr = new StringBuilder(); + + for(int i = 0; i < 16; ++i) { + tr.append(String.format("%01x", world.rand.nextInt(16))); + } + + return tr.toString(); + } + + public static File getDiskFile(File dir, String serno) { + return new File(dir, String.format("disk_%s.img", serno)); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/EntityCustomDiggingFX.java b/src/main/java/com/eloraam/redpower/core/EntityCustomDiggingFX.java new file mode 100644 index 0000000..6f40eae --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/EntityCustomDiggingFX.java @@ -0,0 +1,73 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +@SideOnly(Side.CLIENT) +public class EntityCustomDiggingFX extends EntityFX { + public EntityCustomDiggingFX(World world, double x, double y, double z, double mx, double my, double mz, IIcon icon, int color) { + super(world, x, y, z, mx, my, mz); + this.setParticleIcon(icon); + super.particleGravity = 1.0F; + super.particleRed = super.particleGreen = super.particleBlue = 0.6F; + super.particleScale /= 2.0F; + super.particleRed *= (float)(color >> 16 & 0xFF) / 255.0F; + super.particleGreen *= (float)(color >> 8 & 0xFF) / 255.0F; + super.particleBlue *= (float)(color & 0xFF) / 255.0F; + } + + public int getFXLayer() { + return 1; + } + + public void renderParticle(Tessellator tess, float p_70539_2_, float p_70539_3_, float p_70539_4_, float p_70539_5_, float p_70539_6_, float p_70539_7_) { + float f6 = ((float)super.particleTextureIndexX + super.particleTextureJitterX / 4.0F) / 16.0F; + float f7 = f6 + 0.015609375F; + float f8 = ((float)super.particleTextureIndexY + super.particleTextureJitterY / 4.0F) / 16.0F; + float f9 = f8 + 0.015609375F; + float f10 = 0.1F * super.particleScale; + if (super.particleIcon != null) { + f6 = super.particleIcon.getInterpolatedU((double)(super.particleTextureJitterX / 4.0F * 16.0F)); + f7 = super.particleIcon.getInterpolatedU((double)((super.particleTextureJitterX + 1.0F) / 4.0F * 16.0F)); + f8 = super.particleIcon.getInterpolatedV((double)(super.particleTextureJitterY / 4.0F * 16.0F)); + f9 = super.particleIcon.getInterpolatedV((double)((super.particleTextureJitterY + 1.0F) / 4.0F * 16.0F)); + } + + float f11 = (float)(super.prevPosX + (super.posX - super.prevPosX) * (double)p_70539_2_ - EntityFX.interpPosX); + float f12 = (float)(super.prevPosY + (super.posY - super.prevPosY) * (double)p_70539_2_ - EntityFX.interpPosY); + float f13 = (float)(super.prevPosZ + (super.posZ - super.prevPosZ) * (double)p_70539_2_ - EntityFX.interpPosZ); + tess.setColorOpaque_F(super.particleRed, super.particleGreen, super.particleBlue); + tess.addVertexWithUV( + (double)(f11 - p_70539_3_ * f10 - p_70539_6_ * f10), + (double)(f12 - p_70539_4_ * f10), + (double)(f13 - p_70539_5_ * f10 - p_70539_7_ * f10), + (double)f6, + (double)f9 + ); + tess.addVertexWithUV( + (double)(f11 - p_70539_3_ * f10 + p_70539_6_ * f10), + (double)(f12 + p_70539_4_ * f10), + (double)(f13 - p_70539_5_ * f10 + p_70539_7_ * f10), + (double)f6, + (double)f8 + ); + tess.addVertexWithUV( + (double)(f11 + p_70539_3_ * f10 + p_70539_6_ * f10), + (double)(f12 + p_70539_4_ * f10), + (double)(f13 + p_70539_5_ * f10 + p_70539_7_ * f10), + (double)f7, + (double)f8 + ); + tess.addVertexWithUV( + (double)(f11 + p_70539_3_ * f10 - p_70539_6_ * f10), + (double)(f12 - p_70539_4_ * f10), + (double)(f13 + p_70539_5_ * f10 - p_70539_7_ * f10), + (double)f7, + (double)f9 + ); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/EnvironLib.java b/src/main/java/com/eloraam/redpower/core/EnvironLib.java new file mode 100644 index 0000000..f603b04 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/EnvironLib.java @@ -0,0 +1,32 @@ +package com.eloraam.redpower.core; + +import net.minecraft.world.World; +import net.minecraft.world.WorldType; +import net.minecraft.world.biome.BiomeGenBase; + +public class EnvironLib { + public static double getWindSpeed(World world, WorldCoord wc) { + if (world.provider.isHellWorld) { + return 0.5; + } else { + double nv = FractalLib.noise1D(2576710L, (double)world.getWorldTime() * 1.0E-4, 0.6F, 5); + nv = Math.max(0.0, 1.6 * (nv - 0.5) + 0.5); + if (world.getWorldInfo().getTerrainType() != WorldType.FLAT) { + nv *= Math.sqrt((double)wc.y) / 16.0; + } + + BiomeGenBase bgb = world.getBiomeGenForCoords(wc.x, wc.z); + if (bgb.canSpawnLightningBolt()) { + if (world.isThundering()) { + return 4.0 * nv; + } + + if (world.isRaining()) { + return 0.5 + 0.5 * nv; + } + } + + return nv; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/FakePlayerNetHandler.java b/src/main/java/com/eloraam/redpower/core/FakePlayerNetHandler.java new file mode 100644 index 0000000..b97e97e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/FakePlayerNetHandler.java @@ -0,0 +1,12 @@ +package com.eloraam.redpower.core; + +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.NetworkManager; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.common.util.FakePlayer; + +public class FakePlayerNetHandler extends NetHandlerPlayServer { + public FakePlayerNetHandler(MinecraftServer server, FakePlayer player) { + super(server, new NetworkManager(false), player); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/FluidBuffer.java b/src/main/java/com/eloraam/redpower/core/FluidBuffer.java new file mode 100644 index 0000000..fb60705 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/FluidBuffer.java @@ -0,0 +1,78 @@ +package com.eloraam.redpower.core; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; + +public abstract class FluidBuffer { + public Fluid Type; + public int Level; + public int Delta; + private int lastTick; + + public abstract TileEntity getParent(); + + public abstract void onChange(); + + public int getMaxLevel() { + return 1000; + } + + public int getLevel() { + long lt = this.getParent().getWorldObj().getWorldTime(); + if ((lt & 65535L) == (long)this.lastTick) { + return this.Level; + } else { + this.lastTick = (int)(lt & 65535L); + this.Level += this.Delta; + this.Delta = 0; + if (this.Level == 0) { + this.Type = null; + } + + return this.Level; + } + } + + public void addLevel(Fluid type, int lvl) { + if (type != null) { + this.Type = type; + this.Delta += lvl; + this.onChange(); + } + + } + + public Fluid getFluidClass() { + return this.Type; + } + + public void readFromNBT(NBTTagCompound tag, String name) { + NBTTagCompound t2 = tag.getCompoundTag(name); + this.Type = FluidRegistry.getFluid(t2.getString("type")); + this.Level = t2.getShort("lvl"); + this.Delta = t2.getShort("del"); + this.lastTick = t2.getShort("ltk"); + } + + public void writeToNBT(NBTTagCompound tag, String name) { + NBTTagCompound t2 = new NBTTagCompound(); + String n = FluidRegistry.getFluidName(this.Type); + t2.setString("type", n != null && !n.isEmpty() ? n : "null"); + t2.setShort("lvl", (short)this.Level); + t2.setShort("del", (short)this.Delta); + t2.setShort("ltk", (short)this.lastTick); + tag.setTag(name, t2); + } + + public void writeToPacket(NBTTagCompound tag) { + tag.setInteger("type", this.Type == null ? -1 : FluidRegistry.getFluidID(this.Type)); + tag.setInteger("lvl", this.Level); + } + + public void readFromPacket(NBTTagCompound buffer) { + this.Type = FluidRegistry.getFluid(buffer.getInteger("type")); + this.Level = buffer.getInteger("lvl"); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/FractalLib.java b/src/main/java/com/eloraam/redpower/core/FractalLib.java new file mode 100644 index 0000000..33f7907 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/FractalLib.java @@ -0,0 +1,220 @@ +package com.eloraam.redpower.core; + +public class FractalLib { + public static long hash64shift(long key) { + key = ~key + (key << 21); + key ^= key >>> 24; + key = key + (key << 3) + (key << 8); + key ^= key >>> 14; + key = key + (key << 2) + (key << 4); + key ^= key >>> 28; + return key + (key << 31); + } + + public static double hashFloat(long key) { + long f = hash64shift(key); + return Double.longBitsToDouble(4607182418800017408L | f & 4503599627370495L) - 1.0; + } + + public static double noise1D(long seed, double pos, float lac, int octave) { + double tr = 0.5; + double scale = (double)(1 << octave); + + for(int i = 0; i < octave; ++i) { + double p = pos * scale; + long pint = (long)Math.floor(p); + double m1 = hashFloat(seed + pint); + double m2 = hashFloat(seed + pint + 1L); + p -= Math.floor(p); + double v = 0.5 + 0.5 * Math.cos(Math.PI * p); + v = v * m1 + (1.0 - v) * m2; + tr = (double)(1.0F - lac) * tr + (double)lac * v; + scale *= 0.5; + } + + return tr; + } + + public static double perturbOld(long seed, float pos, float lac, int octave) { + double tr = 0.0; + double mscale = 1.0; + double scale = 1.0; + + for(int i = 0; i < octave; ++i) { + long v = (long)Math.floor((double)pos * scale); + long p = hash64shift(seed + v); + double mag = Double.longBitsToDouble(4607182418800017408L | p & 4503599627370495L) - 1.0; + tr += mscale * mag * Math.sin(Math.PI * 2 * (double)pos * scale); + scale *= 2.0; + mscale *= (double)lac; + } + + return tr; + } + + public static void fillVector(Vector3 v, Vector3 org, Vector3 dest, float pos, long seed) { + double window = 4.0 * Math.sin(Math.PI * (double)pos); + v.x = org.x + (double)(pos * pos) * dest.x + window * perturbOld(seed, pos, 0.7F, 5); + v.y = org.y + (double)pos * dest.y + window * perturbOld(seed + 1L, pos, 0.7F, 5); + v.z = org.z + (double)(pos * pos) * dest.z + window * perturbOld(seed + 2L, pos, 0.7F, 5); + } + + public static int mdist(Vector3 a, Vector3 b) { + return (int)(Math.abs(Math.floor(a.x) - Math.floor(b.x)) + Math.abs(Math.floor(a.y) - Math.floor(b.y)) + Math.abs(Math.floor(a.z) - Math.floor(b.z))); + } + + public static class BlockRay { + private Vector3 p1; + private Vector3 p2; + private Vector3 dv; + public Vector3 enter; + public Vector3 exit; + public int xp; + public int yp; + public int zp; + public int dir; + public int face; + + public BlockRay(Vector3 s, Vector3 d) { + this.p1 = new Vector3(s); + this.p2 = new Vector3(d); + this.dv = new Vector3(d); + this.dv.subtract(s); + this.exit = new Vector3(s); + this.enter = new Vector3(); + this.xp = (int)Math.floor(s.x); + this.yp = (int)Math.floor(s.y); + this.zp = (int)Math.floor(s.z); + this.dir = 0; + this.dir |= d.x > s.x ? 4 : 0; + this.dir |= d.y > s.y ? 1 : 0; + this.dir |= d.z > s.z ? 2 : 0; + } + + public void set(Vector3 s, Vector3 d) { + this.p1.set(s); + this.p2.set(d); + this.dv.set(d); + this.dv.subtract(s); + this.exit.set(s); + this.xp = (int)Math.floor(s.x); + this.yp = (int)Math.floor(s.y); + this.zp = (int)Math.floor(s.z); + this.dir = 0; + this.dir |= d.x > s.x ? 4 : 0; + this.dir |= d.y > s.y ? 1 : 0; + this.dir |= d.z > s.z ? 2 : 0; + } + + boolean step() { + double bp = 1.0; + int sd = -1; + if (this.dv.x != 0.0) { + int x = this.xp; + if ((this.dir & 4) > 0) { + ++x; + } + + double d = ((double)x - this.p1.x) / this.dv.x; + if (d >= 0.0 && d <= bp) { + bp = d; + sd = (this.dir & 4) > 0 ? 4 : 5; + } + } + + if (this.dv.y != 0.0) { + int y = this.yp; + if ((this.dir & 1) > 0) { + ++y; + } + + double d = ((double)y - this.p1.y) / this.dv.y; + if (d >= 0.0 && d <= bp) { + bp = d; + sd = (this.dir & 1) > 0 ? 0 : 1; + } + } + + if (this.dv.z != 0.0) { + int z = this.zp; + if ((this.dir & 2) > 0) { + ++z; + } + + double d = ((double)z - this.p1.z) / this.dv.z; + if (d >= 0.0 && d <= bp) { + bp = d; + sd = (this.dir & 2) > 0 ? 2 : 3; + } + } + + this.face = sd; + switch(sd) { + case 0: + ++this.yp; + break; + case 1: + --this.yp; + break; + case 2: + ++this.zp; + break; + case 3: + --this.zp; + break; + case 4: + ++this.xp; + break; + case 5: + --this.xp; + } + + this.enter.set(this.exit); + this.exit.set(this.dv); + this.exit.multiply(bp); + this.exit.add(this.p1); + return bp >= 1.0; + } + } + + public static class BlockSnake { + int fep = -1; + FractalLib.BlockRay ray; + Vector3 org; + Vector3 dest; + Vector3 fracs; + Vector3 frace; + long seed; + + public BlockSnake(Vector3 o, Vector3 d, long s) { + this.org = new Vector3(o); + this.dest = new Vector3(d); + this.fracs = new Vector3(o); + this.frace = new Vector3(); + this.seed = s; + FractalLib.fillVector(this.frace, this.org, this.dest, 0.125F, this.seed); + this.ray = new FractalLib.BlockRay(this.fracs, this.frace); + } + + public boolean iterate() { + if (this.fep == -1) { + ++this.fep; + return true; + } else if (!this.ray.step()) { + return true; + } else if (this.fep == 8) { + return false; + } else { + this.fracs.set(this.frace); + FractalLib.fillVector(this.frace, this.org, this.dest, (float)this.fep / 8.0F, this.seed); + this.ray.set(this.fracs, this.frace); + ++this.fep; + return true; + } + } + + public Vector3 get() { + return new Vector3((double)this.ray.xp, (double)this.ray.yp, (double)this.ray.zp); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/FrameLib.java b/src/main/java/com/eloraam/redpower/core/FrameLib.java new file mode 100644 index 0000000..cd64b72 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/FrameLib.java @@ -0,0 +1,144 @@ +package com.eloraam.redpower.core; + +import java.util.HashSet; +import java.util.LinkedList; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +public class FrameLib { + public static class FrameSolver { + private HashSet scanmap = new HashSet(); + private LinkedList scanpos = new LinkedList(); + private HashSet framemap = new HashSet(); + private LinkedList frameset = new LinkedList(); + private LinkedList clearset = new LinkedList(); + private int movedir; + private WorldCoord motorpos; + private boolean valid = true; + private World world; + + public FrameSolver(World world, WorldCoord wc, WorldCoord motorp, int movdir) { + this.movedir = movdir; + this.motorpos = motorp; + this.world = world; + this.scanmap.add(motorp); + this.scanmap.add(wc); + this.scanpos.addLast(wc); + } + + private boolean step() { + WorldCoord wc = (WorldCoord)this.scanpos.removeFirst(); + if (wc.y >= 0 && wc.y < this.world.getHeight() - 1) { + Block block = this.world.getBlock(wc.x, wc.y, wc.z); + if (this.movedir >= 0 && !this.world.blockExists(wc.x, wc.y, wc.z)) { + this.valid = false; + return false; + } else if (this.world.isAirBlock(wc.x, wc.y, wc.z)) { + return false; + } else if (this.movedir >= 0 && block.getBlockHardness(this.world, wc.x, wc.y, wc.z) < 0.0F) { + this.valid = false; + return false; + } else { + this.framemap.add(wc); + this.frameset.addLast(wc); + IFrameLink ifl = CoreLib.getTileEntity(this.world, wc, IFrameLink.class); + if (ifl == null) { + return true; + } else if (ifl.isFrameMoving() && this.movedir >= 0) { + this.valid = false; + return true; + } else { + for(int i = 0; i < 6; ++i) { + if (ifl.canFrameConnectOut(i)) { + WorldCoord sp = wc.coordStep(i); + if (!this.scanmap.contains(sp)) { + IFrameLink if2 = CoreLib.getTileEntity(this.world, sp, IFrameLink.class); + if (if2 != null) { + if (!if2.canFrameConnectIn((i ^ 1) & 0xFF)) { + continue; + } + + if (this.movedir < 0) { + WorldCoord wcls = if2.getFrameLinkset(); + if (wcls == null || !wcls.equals(this.motorpos)) { + continue; + } + } + } + + this.scanmap.add(sp); + this.scanpos.addLast(sp); + } + } + } + + return true; + } + } + } else { + return false; + } + } + + public boolean solve() { + while(this.valid && this.scanpos.size() > 0) { + this.step(); + } + + return this.valid; + } + + public boolean solveLimit(int limit) { + while(this.valid && this.scanpos.size() > 0) { + if (this.step()) { + --limit; + } + + if (limit == 0) { + return false; + } + } + + return this.valid; + } + + public boolean addMoved() { + for(WorldCoord wc : (LinkedList)this.frameset.clone()) { + WorldCoord sp = wc.coordStep(this.movedir); + if (!this.world.blockExists(sp.x, sp.y, sp.z)) { + this.valid = false; + return false; + } + + if (!this.framemap.contains(sp)) { + if (!this.world.isAirBlock(wc.x, wc.y, wc.z)) { + if (!this.world.canPlaceEntityOnSide(Blocks.stone, sp.x, sp.y, sp.z, true, 0, null, null)) { + this.valid = false; + return false; + } + + this.clearset.add(sp); + } + + this.framemap.add(sp); + this.frameset.addLast(sp); + } + } + + return this.valid; + } + + public void sort(int dir) { + this.frameset.sort(WorldCoord.getCompareDir(dir)); + } + + public LinkedList getFrameSet() { + return this.frameset; + } + + public LinkedList getClearSet() { + return this.clearset; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/GuiExtended.java b/src/main/java/com/eloraam/redpower/core/GuiExtended.java new file mode 100644 index 0000000..6537e37 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/GuiExtended.java @@ -0,0 +1,13 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Container; + +public abstract class GuiExtended extends GuiContainer { + ArrayList widgetList = new ArrayList(); + + public GuiExtended(Container cn) { + super(cn); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/GuiWidget.java b/src/main/java/com/eloraam/redpower/core/GuiWidget.java new file mode 100644 index 0000000..1b75af1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/GuiWidget.java @@ -0,0 +1,21 @@ +package com.eloraam.redpower.core; + +import net.minecraft.client.gui.Gui; + +public class GuiWidget extends Gui { + public int width; + public int height; + public int top; + public int left; + + public GuiWidget(int x, int y, int w, int h) { + this.left = x; + this.top = y; + this.width = w; + this.height = h; + } + + protected void drawRelRect(int x, int y, int w, int h, int c) { + drawRect(x, y, x + w, y + h, c | 61440); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/IBlockHardness.java b/src/main/java/com/eloraam/redpower/core/IBlockHardness.java new file mode 100644 index 0000000..998f58f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IBlockHardness.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface IBlockHardness { + float getPrototypicalHardness(int var1); +} diff --git a/src/main/java/com/eloraam/redpower/core/IBluePowerConnectable.java b/src/main/java/com/eloraam/redpower/core/IBluePowerConnectable.java new file mode 100644 index 0000000..cec4fab --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IBluePowerConnectable.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface IBluePowerConnectable extends IConnectable { + BluePowerConductor getBlueConductor(int var1); +} diff --git a/src/main/java/com/eloraam/redpower/core/IChargeable.java b/src/main/java/com/eloraam/redpower/core/IChargeable.java new file mode 100644 index 0000000..7e9829e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IChargeable.java @@ -0,0 +1,4 @@ +package com.eloraam.redpower.core; + +public interface IChargeable { +} diff --git a/src/main/java/com/eloraam/redpower/core/IConnectable.java b/src/main/java/com/eloraam/redpower/core/IConnectable.java new file mode 100644 index 0000000..5af0398 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IConnectable.java @@ -0,0 +1,9 @@ +package com.eloraam.redpower.core; + +public interface IConnectable { + int getConnectableMask(); + + int getConnectClass(int var1); + + int getCornerPowerMode(); +} diff --git a/src/main/java/com/eloraam/redpower/core/ICoverable.java b/src/main/java/com/eloraam/redpower/core/ICoverable.java new file mode 100644 index 0000000..a1fc1bd --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ICoverable.java @@ -0,0 +1,13 @@ +package com.eloraam.redpower.core; + +public interface ICoverable { + boolean canAddCover(int var1, int var2); + + boolean tryAddCover(int var1, int var2); + + int tryRemoveCover(int var1); + + int getCover(int var1); + + int getCoverMask(); +} diff --git a/src/main/java/com/eloraam/redpower/core/IFrameLink.java b/src/main/java/com/eloraam/redpower/core/IFrameLink.java new file mode 100644 index 0000000..2284255 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IFrameLink.java @@ -0,0 +1,11 @@ +package com.eloraam.redpower.core; + +public interface IFrameLink { + boolean isFrameMoving(); + + boolean canFrameConnectIn(int var1); + + boolean canFrameConnectOut(int var1); + + WorldCoord getFrameLinkset(); +} diff --git a/src/main/java/com/eloraam/redpower/core/IFrameSupport.java b/src/main/java/com/eloraam/redpower/core/IFrameSupport.java new file mode 100644 index 0000000..b956bea --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IFrameSupport.java @@ -0,0 +1,16 @@ +package com.eloraam.redpower.core; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public interface IFrameSupport { + void writeFramePacket(NBTTagCompound var1); + + void readFramePacket(NBTTagCompound var1); + + void onFrameRefresh(IBlockAccess var1); + + void onFramePickup(IBlockAccess var1); + + void onFrameDrop(); +} diff --git a/src/main/java/com/eloraam/redpower/core/IHandleGuiEvent.java b/src/main/java/com/eloraam/redpower/core/IHandleGuiEvent.java new file mode 100644 index 0000000..fcdebd6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IHandleGuiEvent.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface IHandleGuiEvent { + void handleGuiEvent(PacketGuiEvent.GuiMessageEvent var1); +} diff --git a/src/main/java/com/eloraam/redpower/core/IMicroPlacement.java b/src/main/java/com/eloraam/redpower/core/IMicroPlacement.java new file mode 100644 index 0000000..c6fdcca --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IMicroPlacement.java @@ -0,0 +1,15 @@ +package com.eloraam.redpower.core; + +import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IMicroPlacement { + boolean onPlaceMicro(ItemStack var1, EntityPlayer var2, World var3, WorldCoord var4, int var5); + + String getMicroName(int var1, int var2); + + void addCreativeItems(int var1, CreativeTabs var2, List var3); +} diff --git a/src/main/java/com/eloraam/redpower/core/IMultiblock.java b/src/main/java/com/eloraam/redpower/core/IMultiblock.java new file mode 100644 index 0000000..3cb2401 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IMultiblock.java @@ -0,0 +1,12 @@ +package com.eloraam.redpower.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; + +public interface IMultiblock { + void onMultiRemoval(int var1); + + AxisAlignedBB getMultiBounds(int var1); + + float getMultiBlockStrength(int var1, EntityPlayer var2); +} diff --git a/src/main/java/com/eloraam/redpower/core/IMultipart.java b/src/main/java/com/eloraam/redpower/core/IMultipart.java new file mode 100644 index 0000000..cdff1ba --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IMultipart.java @@ -0,0 +1,12 @@ +package com.eloraam.redpower.core; + +import java.util.List; +import net.minecraft.item.ItemStack; + +public interface IMultipart { + boolean isSideSolid(int var1); + + boolean isSideNormal(int var1); + + List harvestMultipart(); +} diff --git a/src/main/java/com/eloraam/redpower/core/IPaintable.java b/src/main/java/com/eloraam/redpower/core/IPaintable.java new file mode 100644 index 0000000..e79b74a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IPaintable.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface IPaintable { + boolean tryPaint(int var1, int var2, int var3); +} diff --git a/src/main/java/com/eloraam/redpower/core/IPipeConnectable.java b/src/main/java/com/eloraam/redpower/core/IPipeConnectable.java new file mode 100644 index 0000000..c92f805 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IPipeConnectable.java @@ -0,0 +1,11 @@ +package com.eloraam.redpower.core; + +public interface IPipeConnectable { + int getPipeConnectableSides(); + + int getPipeFlangeSides(); + + int getPipePressure(int var1); + + FluidBuffer getPipeBuffer(int var1); +} diff --git a/src/main/java/com/eloraam/redpower/core/IRedPowerConnectable.java b/src/main/java/com/eloraam/redpower/core/IRedPowerConnectable.java new file mode 100644 index 0000000..a0c7e8f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IRedPowerConnectable.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface IRedPowerConnectable extends IConnectable { + int getPoweringMask(int var1); +} diff --git a/src/main/java/com/eloraam/redpower/core/IRedPowerWiring.java b/src/main/java/com/eloraam/redpower/core/IRedPowerWiring.java new file mode 100644 index 0000000..934466b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IRedPowerWiring.java @@ -0,0 +1,9 @@ +package com.eloraam.redpower.core; + +public interface IRedPowerWiring extends IRedPowerConnectable, IWiring { + int scanPoweringStrength(int var1, int var2); + + int getCurrentStrength(int var1, int var2); + + void updateCurrentStrength(); +} diff --git a/src/main/java/com/eloraam/redpower/core/IRedbusConnectable.java b/src/main/java/com/eloraam/redpower/core/IRedbusConnectable.java new file mode 100644 index 0000000..eaf31d1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IRedbusConnectable.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.core; + +public interface IRedbusConnectable extends IConnectable { + int rbGetAddr(); + + void rbSetAddr(int var1); + + int rbRead(int var1); + + void rbWrite(int var1, int var2); + + public static class Dummy implements IRedbusConnectable { + private int address; + + @Override + public int getConnectableMask() { + return 0; + } + + @Override + public int getConnectClass(int side) { + return 0; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public int rbGetAddr() { + return this.address; + } + + @Override + public void rbSetAddr(int addr) { + this.address = addr; + } + + @Override + public int rbRead(int reg) { + return 0; + } + + @Override + public void rbWrite(int reg, int dat) { + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/IRotatable.java b/src/main/java/com/eloraam/redpower/core/IRotatable.java new file mode 100644 index 0000000..2444780 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IRotatable.java @@ -0,0 +1,9 @@ +package com.eloraam.redpower.core; + +public interface IRotatable { + int getPartMaxRotation(int var1, boolean var2); + + int getPartRotation(int var1, boolean var2); + + void setPartRotation(int var1, boolean var2, int var3); +} diff --git a/src/main/java/com/eloraam/redpower/core/ITubeConnectable.java b/src/main/java/com/eloraam/redpower/core/ITubeConnectable.java new file mode 100644 index 0000000..3485519 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ITubeConnectable.java @@ -0,0 +1,15 @@ +package com.eloraam.redpower.core; + +public interface ITubeConnectable { + int getTubeConnectableSides(); + + int getTubeConClass(); + + boolean canRouteItems(); + + boolean tubeItemEnter(int var1, int var2, TubeItem var3); + + boolean tubeItemCanEnter(int var1, int var2, TubeItem var3); + + int tubeWeight(int var1, int var2); +} diff --git a/src/main/java/com/eloraam/redpower/core/ITubeFlow.java b/src/main/java/com/eloraam/redpower/core/ITubeFlow.java new file mode 100644 index 0000000..34683b1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ITubeFlow.java @@ -0,0 +1,7 @@ +package com.eloraam.redpower.core; + +public interface ITubeFlow extends ITubeConnectable { + void addTubeItem(TubeItem var1); + + TubeFlow getTubeFlow(); +} diff --git a/src/main/java/com/eloraam/redpower/core/ITubeRequest.java b/src/main/java/com/eloraam/redpower/core/ITubeRequest.java new file mode 100644 index 0000000..c1c6a38 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ITubeRequest.java @@ -0,0 +1,5 @@ +package com.eloraam.redpower.core; + +public interface ITubeRequest { + boolean requestTubeItem(TubeItem var1, boolean var2); +} diff --git a/src/main/java/com/eloraam/redpower/core/IWiring.java b/src/main/java/com/eloraam/redpower/core/IWiring.java new file mode 100644 index 0000000..6d9ef94 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/IWiring.java @@ -0,0 +1,7 @@ +package com.eloraam.redpower.core; + +public interface IWiring extends IConnectable { + int getConnectionMask(); + + int getExtConnectionMask(); +} diff --git a/src/main/java/com/eloraam/redpower/core/ItemExtended.java b/src/main/java/com/eloraam/redpower/core/ItemExtended.java new file mode 100644 index 0000000..f612ef8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ItemExtended.java @@ -0,0 +1,67 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemExtended extends ItemBlock { + private Map names = new HashMap(); + private List valid = new ArrayList(); + + public ItemExtended(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getMetadata(int meta) { + return meta; + } + + public void setMetaName(int meta, String name) { + this.names.put(meta, name); + this.valid.add(meta); + } + + public String getUnlocalizedName(ItemStack ist) { + String tr = (String)this.names.get(ist.getItemDamage()); + return tr != null ? tr : "unnamed"; + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i : this.valid) { + list.add(new ItemStack(this, 1, i)); + } + + } + + public void placeNoise(World world, int x, int y, int z, Block block) { + } + + 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 (!world.setBlock(x, y, z, Block.getBlockFromItem(this), metadata, 3)) { + return false; + } else { + if (world.getBlock(x, y, z) == Block.getBlockFromItem(this)) { + BlockExtended bex = (BlockExtended)Block.getBlockFromItem(this); + bex.onBlockPlacedBy(world, x, y, z, side, player, stack); + this.placeNoise(world, x, y, z, Block.getBlockFromItem(this)); + } + + return true; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/ItemPartialCraft.java b/src/main/java/com/eloraam/redpower/core/ItemPartialCraft.java new file mode 100644 index 0000000..69d8296 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ItemPartialCraft.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.core; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemPartialCraft extends Item { + private ItemStack emptyItem = null; + + public ItemPartialCraft() { + this.setMaxStackSize(1); + this.setNoRepair(); + } + + public void setEmptyItem(ItemStack ei) { + this.emptyItem = ei; + } + + public ItemStack getContainerItem(ItemStack ist) { + int dmg = ist.getItemDamage(); + if (dmg == ist.getMaxDamage() && this.emptyItem != null) { + return CoreLib.copyStack(this.emptyItem, 1); + } else { + ItemStack tr = CoreLib.copyStack(ist, 1); + tr.setItemDamage(dmg + 1); + return tr; + } + } + + public boolean hasContainerItem(ItemStack stack) { + return true; + } + + public boolean doesContainerItemLeaveCraftingGrid(ItemStack ist) { + return false; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/ItemParts.java b/src/main/java/com/eloraam/redpower/core/ItemParts.java new file mode 100644 index 0000000..888337a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ItemParts.java @@ -0,0 +1,70 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemParts extends Item { + private Map names = new HashMap(); + private Map icons = new HashMap(); + private Map iconNames = new HashMap(); + private List valid = new ArrayList(); + + public ItemParts() { + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public void addItem(int meta, String icon, String name) { + this.iconNames.put(meta, icon); + this.names.put(meta, name); + this.valid.add(meta); + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + for(int i = 0; i < this.iconNames.size(); ++i) { + if (this.iconNames.get(i) != null && !((String)this.iconNames.get(i)).trim().isEmpty()) { + this.icons.put(i, reg.registerIcon((String)this.iconNames.get(i))); + } else { + this.icons.put(i, null); + } + } + + } + + public String getUnlocalizedName(ItemStack stack) { + String tr = (String)this.names.get(stack.getItemDamage()); + if (tr == null) { + throw new IndexOutOfBoundsException(); + } else { + return tr; + } + } + + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + IIcon tr = (IIcon)this.icons.get(meta); + if (tr == null) { + throw new IndexOutOfBoundsException(); + } else { + return tr; + } + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List items) { + for(int i = 0; i < this.valid.size(); ++i) { + items.add(new ItemStack(this, 1, i)); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/ItemTextured.java b/src/main/java/com/eloraam/redpower/core/ItemTextured.java new file mode 100644 index 0000000..6cf6c66 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ItemTextured.java @@ -0,0 +1,9 @@ +package com.eloraam.redpower.core; + +import net.minecraft.item.Item; + +public class ItemTextured extends Item { + public ItemTextured(String texture) { + this.setTextureName(texture); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/MachineLib.java b/src/main/java/com/eloraam/redpower/core/MachineLib.java new file mode 100644 index 0000000..65a94c3 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/MachineLib.java @@ -0,0 +1,588 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; +import java.util.stream.IntStream; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryLargeChest; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import org.apache.commons.lang3.ArrayUtils; + +public class MachineLib { + public static IInventory getInventory(World world, WorldCoord wc) { + IInventory inv = CoreLib.getTileEntity(world, wc, IInventory.class); + if (!(inv instanceof TileEntityChest)) { + return inv; + } else { + TileEntityChest tec = CoreLib.getTileEntity(world, wc.x - 1, wc.y, wc.z, TileEntityChest.class); + if (tec != null) { + return new InventoryLargeChest("Large chest", tec, inv); + } else { + tec = CoreLib.getTileEntity(world, wc.x + 1, wc.y, wc.z, TileEntityChest.class); + if (tec != null) { + return new InventoryLargeChest("Large chest", inv, tec); + } else { + tec = CoreLib.getTileEntity(world, wc.x, wc.y, wc.z - 1, TileEntityChest.class); + if (tec != null) { + return new InventoryLargeChest("Large chest", tec, inv); + } else { + tec = CoreLib.getTileEntity(world, wc.x, wc.y, wc.z + 1, TileEntityChest.class); + return (IInventory)(tec != null ? new InventoryLargeChest("Large chest", inv, tec) : inv); + } + } + } + } + } + + public static IInventory getSideInventory(World world, WorldCoord wc, int side, boolean push) { + IInventory inv = getInventory(world, wc); + if (inv == null) { + return null; + } else if (inv instanceof ISidedInventory) { + ISidedInventory isi = (ISidedInventory)inv; + int[] slots = isi.getAccessibleSlotsFromSide(side); + return new MachineLib.SubInventory(inv, slots); + } else { + return inv; + } + } + + public static boolean addToInventoryCore(World world, ItemStack ist, WorldCoord wc, int side, boolean act) { + IInventory inv = getInventory(world, wc); + if (inv == null) { + return false; + } else { + int[] slots; + if (inv instanceof ISidedInventory) { + ISidedInventory isi = (ISidedInventory)inv; + slots = isi.getAccessibleSlotsFromSide(side); + if (slots == null || slots.length == 0) { + return false; + } + + int[] var8 = slots; + int var9 = slots.length; + int var10 = 0; + + while(true) { + if (var10 >= var9) { + return false; + } + + int n = var8[var10]; + if (isi.canInsertItem(n, ist, side)) { + break; + } + + ++var10; + } + } else { + slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + } + + return addToInventoryCore(inv, ist, slots, act); + } + } + + public static boolean addToInventoryCore(IInventory inv, ItemStack ist, int[] slots, boolean act) { + for(int n : slots) { + ItemStack invst = inv.getStackInSlot(n); + if (invst != null) { + if (ist.isItemEqual(invst) && ItemStack.areItemStackTagsEqual(ist, invst)) { + int dfs = Math.min(invst.getMaxStackSize(), inv.getInventoryStackLimit()); + dfs -= invst.stackSize; + if (dfs > 0) { + int si = Math.min(dfs, ist.stackSize); + if (!act) { + return true; + } + + invst.stackSize += si; + inv.setInventorySlotContents(n, invst); + ist.stackSize -= si; + if (ist.stackSize == 0) { + return true; + } + } + } + } else if (!act) { + return true; + } + } + + if (!act) { + return false; + } else { + for(int n : slots) { + ItemStack invst = inv.getStackInSlot(n); + if (invst == null) { + if (inv.getInventoryStackLimit() >= ist.stackSize) { + inv.setInventorySlotContents(n, ist); + return true; + } + + inv.setInventorySlotContents(n, ist.splitStack(inv.getInventoryStackLimit())); + } + } + + return false; + } + } + + public static boolean addToInventory(World world, ItemStack ist, WorldCoord wc, int side) { + return addToInventoryCore(world, ist, wc, side, true); + } + + public static boolean canAddToInventory(World world, ItemStack ist, WorldCoord wc, int side) { + return addToInventoryCore(world, ist, wc, side, false); + } + + public static void ejectItem(World world, WorldCoord wc, ItemStack ist, int dir) { + wc = wc.copy(); + wc.step(dir); + EntityItem item = new EntityItem(world, (double)wc.x + 0.5, (double)wc.y + 0.5, (double)wc.z + 0.5, ist); + item.motionX = 0.0; + item.motionY = 0.0; + item.motionZ = 0.0; + switch(dir) { + case 0: + item.motionY = -0.3; + break; + case 1: + item.motionY = 0.3; + break; + case 2: + item.motionZ = -0.3; + break; + case 3: + item.motionZ = 0.3; + break; + case 4: + item.motionX = -0.3; + break; + default: + item.motionX = 0.3; + } + + item.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(item); + } + + public static boolean handleItem(World world, ItemStack ist, WorldCoord wc, int side) { + WorldCoord dest = wc.copy(); + dest.step(side); + if (ist.stackSize == 0) { + return true; + } else if (TubeLib.addToTubeRoute(world, ist, wc, dest, side ^ 1)) { + return true; + } else if (addToInventory(world, ist, dest, (side ^ 1) & 63)) { + return true; + } else { + TileEntity te = CoreLib.getTileEntity(world, dest, TileEntity.class); + if (!(te instanceof IInventory) && !(te instanceof ITubeConnectable)) { + if (world.getBlock(dest.x, dest.y, dest.z).isSideSolid(world, dest.x, dest.y, dest.z, ForgeDirection.getOrientation(side ^ 1))) { + return false; + } else { + ejectItem(world, wc, ist, side); + return true; + } + } else { + return false; + } + } + } + + public static boolean handleItem(World world, TubeItem ti, WorldCoord wc, int side) { + WorldCoord dest = wc.copy(); + dest.step(side); + if (ti.item.stackSize == 0) { + return true; + } else if (TubeLib.addToTubeRoute(world, ti, wc, dest, side ^ 1)) { + return true; + } else if (addToInventory(world, ti.item, dest, (side ^ 1) & 63)) { + return true; + } else { + TileEntity te = CoreLib.getTileEntity(world, dest, TileEntity.class); + if (!(te instanceof IInventory) && !(te instanceof ITubeConnectable)) { + if (world.getBlock(dest.x, dest.y, dest.z).isSideSolid(world, dest.x, dest.y, dest.z, ForgeDirection.getOrientation(side ^ 1))) { + return false; + } else { + ejectItem(world, wc, ti.item, side); + return true; + } + } else { + return false; + } + } + } + + public static int compareItem(ItemStack a, ItemStack b) { + if (Item.getIdFromItem(a.getItem()) != Item.getIdFromItem(b.getItem())) { + return Item.getIdFromItem(a.getItem()) - Item.getIdFromItem(b.getItem()); + } else if (a.getItemDamage() == b.getItemDamage()) { + return 0; + } else if (a.getItem().getHasSubtypes()) { + return a.getItemDamage() - b.getItemDamage(); + } else { + int d1 = a.getItemDamage() <= 1 ? -1 : (a.getItemDamage() == a.getMaxDamage() - 1 ? 1 : 0); + int d2 = b.getItemDamage() <= 1 ? -1 : (b.getItemDamage() == b.getMaxDamage() - 1 ? 1 : 0); + return d1 - d2; + } + } + + public static MachineLib.FilterMap makeFilterMap(ItemStack[] ist) { + return new MachineLib.FilterMap(ist); + } + + public static MachineLib.FilterMap makeFilterMap(ItemStack[] ist, int st, int ln) { + ItemStack[] it = new ItemStack[ln]; + System.arraycopy(ist, st, it, 0, ln); + return new MachineLib.FilterMap(it); + } + + public static int[] genMatchCounts(MachineLib.FilterMap map) { + int[] tr = new int[map.filter.length]; + + for(int n = 0; n < map.filter.length; ++n) { + ItemStack ist = map.filter[n]; + if (ist != null && ist.stackSize != 0) { + List arl = (List)map.map.get(ist); + if (arl != null && arl.get(0) == n) { + for(int m : arl) { + tr[n] += map.filter[m].stackSize; + } + } + } + } + + return tr; + } + + public static int decMatchCount(MachineLib.FilterMap map, int[] mc, ItemStack ist) { + List arl = (List)map.map.get(ist); + if (arl == null) { + return 0; + } else { + int n = arl.get(0); + int tr = Math.min(mc[n], ist.stackSize); + mc[n] -= tr; + return tr; + } + } + + public static int getMatchCount(MachineLib.FilterMap map, int[] mc, ItemStack ist) { + List arl = (List)map.map.get(ist); + if (arl == null) { + return 0; + } else { + int n = arl.get(0); + return Math.min(mc[n], ist.stackSize); + } + } + + public static boolean isMatchEmpty(int[] mc) { + for(int i : mc) { + if (i > 0) { + return false; + } + } + + return true; + } + + public static void decMatchCounts(MachineLib.FilterMap map, int[] mc, IInventory inv, int[] slots) { + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + decMatchCount(map, mc, ist); + } + } + + } + + public static boolean matchOneStack(MachineLib.FilterMap map, IInventory inv, int[] slots, int pos) { + ItemStack match = map.filter[pos]; + int fc = match == null ? 1 : match.stackSize; + + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + if (match == null) { + return true; + } + + if (compareItem(match, ist) == 0) { + int m = Math.min(ist.stackSize, fc); + fc -= m; + if (fc <= 0) { + return true; + } + } + } + } + + return false; + } + + public static int matchAnyStack(MachineLib.FilterMap map, IInventory inv, int[] slots) { + int[] mc = new int[map.filter.length]; + + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + List arl = (List)map.map.get(ist); + if (arl != null) { + for(int m : arl) { + mc[m] += ist.stackSize; + if (mc[m] >= map.filter[m].stackSize) { + return m; + } + } + } + } + } + + return -1; + } + + public static int matchAnyStackCol(MachineLib.FilterMap map, IInventory inv, int[] slots, int col) { + int[] mc = new int[5]; + + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + List arl = (List)map.map.get(ist); + if (arl != null) { + for(Integer m : arl) { + if ((m & 7) == col) { + int s = m >> 3; + mc[s] += ist.stackSize; + if (mc[s] >= map.filter[m].stackSize) { + return m; + } + } + } + } + } + } + + return -1; + } + + public static boolean matchAllCol(MachineLib.FilterMap map, IInventory inv, int[] slots, int col) { + int[] mc = new int[5]; + + for(int any : slots) { + ItemStack n = inv.getStackInSlot(any); + if (n != null && n.stackSize != 0) { + ArrayList ct = (ArrayList)map.map.get(n); + if (ct != null) { + int ss = n.stackSize; + + for(Integer m : ct) { + if ((m & 7) == col) { + int c = m >> 3; + int s1 = Math.min(ss, map.filter[m].stackSize - mc[c]); + mc[c] += s1; + ss -= s1; + if (ss == 0) { + break; + } + } + } + } + } + } + + boolean match = false; + + for(int i = 0; i < 5; ++i) { + ItemStack stack = map.filter[i * 8 + col]; + if (stack != null && stack.stackSize != 0) { + match = true; + if (stack.stackSize > mc[i]) { + return false; + } + } + } + + return match; + } + + public static boolean emptyInventory(IInventory inv, int[] slots) { + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + return false; + } + } + + return true; + } + + public static ItemStack collectOneStack(IInventory inv, int[] slots, ItemStack match) { + ItemStack tr = null; + int fc = match == null ? 1 : match.stackSize; + + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + if (match == null) { + inv.setInventorySlotContents(n, null); + return ist; + } + + if (compareItem(match, ist) == 0) { + int m = Math.min(ist.stackSize, fc); + if (tr == null) { + tr = inv.decrStackSize(n, m); + } else { + inv.decrStackSize(n, m); + tr.stackSize += m; + } + + fc -= m; + if (fc <= 0) { + break; + } + } + } + } + + return tr; + } + + public static ItemStack collectOneStackFuzzy(IInventory inv, int[] slots, ItemStack match) { + ItemStack tr = null; + int fc = match == null ? 1 : match.getMaxStackSize(); + + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + if (match == null) { + inv.setInventorySlotContents(n, null); + return ist; + } + + if (compareItem(match, ist) == 0) { + int m = Math.min(ist.stackSize, fc); + if (tr == null) { + tr = inv.decrStackSize(n, m); + } else { + inv.decrStackSize(n, m); + tr.stackSize += m; + } + + fc -= m; + if (fc <= 0) { + break; + } + } + } + } + + return tr; + } + + public static class FilterMap { + protected TreeMap> map; + protected ItemStack[] filter; + + public FilterMap(ItemStack[] filt) { + this.filter = filt; + this.map = new TreeMap<>(MachineLib::compareItem); + + for(int i = 0; i < filt.length; ++i) { + if (filt[i] != null && filt[i].stackSize != 0) { + ((ArrayList)this.map.computeIfAbsent(filt[i], k -> new ArrayList())).add(i); + } + } + + } + + public int size() { + return this.map.size(); + } + + public boolean containsKey(ItemStack ist) { + return this.map.containsKey(ist); + } + + public int firstMatch(ItemStack ist) { + ArrayList arl = (ArrayList)this.map.get(ist); + return arl == null ? -1 : arl.get(0); + } + } + + public static class SubInventory implements IInventory { + IInventory parent; + int[] slots; + + SubInventory(IInventory par, int[] sl) { + this.parent = par; + this.slots = sl; + } + + public int getSizeInventory() { + return this.slots.length; + } + + public ItemStack getStackInSlot(int idx) { + return ArrayUtils.contains(this.slots, idx) ? this.parent.getStackInSlot(idx) : null; + } + + public ItemStack decrStackSize(int idx, int num) { + return ArrayUtils.contains(this.slots, idx) ? this.parent.decrStackSize(idx, num) : null; + } + + public ItemStack getStackInSlotOnClosing(int idx) { + return ArrayUtils.contains(this.slots, idx) ? this.parent.getStackInSlotOnClosing(idx) : null; + } + + public void setInventorySlotContents(int idx, ItemStack ist) { + if (ArrayUtils.contains(this.slots, idx)) { + this.parent.setInventorySlotContents(idx, ist); + } + + } + + public String getInventoryName() { + return this.parent.getInventoryName(); + } + + public int getInventoryStackLimit() { + return this.parent.getInventoryStackLimit(); + } + + public void markDirty() { + this.parent.markDirty(); + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return this.parent.isUseableByPlayer(player); + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean hasCustomInventoryName() { + return this.parent.hasCustomInventoryName(); + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return this.parent.isItemValidForSlot(slotID, stack); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/MathLib.java b/src/main/java/com/eloraam/redpower/core/MathLib.java new file mode 100644 index 0000000..8c93c25 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/MathLib.java @@ -0,0 +1,43 @@ +package com.eloraam.redpower.core; + +public class MathLib { + private static Matrix3[] orientMatrixList = new Matrix3[24]; + private static Quat[] orientQuatList = new Quat[24]; + + public static void orientMatrix(Matrix3 m, int down, int rot) { + m.set(orientMatrixList[down * 4 + rot]); + } + + public static Quat orientQuat(int down, int rot) { + return new Quat(orientQuatList[down * 4 + rot]); + } + + static { + Quat q2 = Quat.aroundAxis(1.0, 0.0, 0.0, Math.PI); + + for(int j = 0; j < 4; ++j) { + Quat q1 = Quat.aroundAxis(0.0, 1.0, 0.0, -Math.PI / 2 * (double)j); + orientQuatList[j] = q1; + q1 = new Quat(q1); + q1.multiply(q2); + orientQuatList[j + 4] = q1; + } + + for(int i = 0; i < 4; ++i) { + int k = (i >> 1 | i << 1) & 3; + q2 = Quat.aroundAxis(0.0, 0.0, 1.0, Math.PI / 2); + q2.multiply(Quat.aroundAxis(0.0, 1.0, 0.0, Math.PI / 2 * (double)(k + 1))); + + for(int var6 = 0; var6 < 4; ++var6) { + Quat q1 = new Quat(orientQuatList[var6]); + q1.multiply(q2); + orientQuatList[8 + 4 * i + var6] = q1; + } + } + + for(int var9 = 0; var9 < 24; ++var9) { + orientMatrixList[var9] = new Matrix3(orientQuatList[var9]); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/Matrix3.java b/src/main/java/com/eloraam/redpower/core/Matrix3.java new file mode 100644 index 0000000..e5afa00 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/Matrix3.java @@ -0,0 +1,106 @@ +package com.eloraam.redpower.core; + +import java.util.Formatter; +import java.util.Locale; + +public class Matrix3 { + public double xx; + public double xy; + public double xz; + public double yx; + public double yy; + public double yz; + public double zx; + public double zy; + public double zz; + + public Matrix3() { + } + + public Matrix3(Quat q) { + this.set(q); + } + + public void set(Quat q) { + this.xx = q.s * q.s + q.x * q.x - q.z * q.z - q.y * q.y; + this.xy = 2.0 * (q.s * q.z + q.x * q.y); + this.xz = 2.0 * (q.x * q.z - q.s * q.y); + this.yx = 2.0 * (q.x * q.y - q.s * q.z); + this.yy = q.s * q.s + q.y * q.y - q.z * q.z - q.x * q.x; + this.yz = 2.0 * (q.s * q.x + q.y * q.z); + this.zx = 2.0 * (q.s * q.y + q.x * q.z); + this.zy = 2.0 * (q.y * q.z - q.s * q.x); + this.zz = q.s * q.s + q.z * q.z - q.y * q.y - q.x * q.x; + } + + public void set(Matrix3 m) { + this.xx = m.xx; + this.xy = m.xy; + this.xz = m.xz; + this.yx = m.yx; + this.yy = m.yy; + this.yz = m.yz; + this.zx = m.zx; + this.zy = m.zy; + this.zz = m.zz; + } + + public Matrix3 multiply(Matrix3 m) { + Matrix3 tr = new Matrix3(); + tr.xx = this.xx * m.xx + this.xy * m.yx + this.xz * m.zx; + tr.xy = this.xx * m.xy + this.xy * m.yy + this.xz * m.zy; + tr.xz = this.xx * m.xz + this.xy * m.yz + this.xz * m.zz; + tr.yx = this.yx * m.xx + this.yy * m.yx + this.yz * m.zx; + tr.yy = this.yx * m.xy + this.yy * m.yy + this.yz * m.zy; + tr.yz = this.yx * m.xz + this.yy * m.yz + this.yz * m.zz; + tr.zx = this.zx * m.xx + this.zy * m.yx + this.zz * m.zx; + tr.zy = this.zx * m.xy + this.zy * m.yy + this.zz * m.zy; + tr.zz = this.zx * m.xz + this.zy * m.yz + this.zz * m.zz; + return tr; + } + + public static Matrix3 getRotY(double angle) { + double c = Math.cos(angle); + double s = Math.sin(angle); + Matrix3 tr = new Matrix3(); + tr.xx = c; + tr.xy = 0.0; + tr.xz = s; + tr.yx = 0.0; + tr.yy = 1.0; + tr.yz = 0.0; + tr.zx = -s; + tr.zy = 0.0; + tr.zz = c; + return tr; + } + + public Vector3 getBasisVector(int n) { + return n == 0 ? new Vector3(this.xx, this.xy, this.xz) : (n == 1 ? new Vector3(this.yx, this.yy, this.yz) : new Vector3(this.zx, this.zy, this.zz)); + } + + public double det() { + return this.xx * (this.yy * this.zz - this.yz * this.zy) + - this.xy * (this.yx * this.zz - this.yz * this.zx) + + this.xz * (this.yx * this.zy - this.yy * this.zx); + } + + public void rotate(Vector3 v) { + double tx = this.xx * v.x + this.yx * v.y + this.zx * v.z; + double ty = this.xy * v.x + this.yy * v.y + this.zy * v.z; + double tz = this.xz * v.x + this.yz * v.y + this.zz * v.z; + v.x = tx; + v.y = ty; + v.z = tz; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Formatter fmt = new Formatter(sb, Locale.US); + fmt.format("Matrix:\n"); + fmt.format(" < %f %f %f >\n", this.xx, this.xy, this.xz); + fmt.format(" < %f %f %f >\n", this.yx, this.yy, this.yz); + fmt.format(" < %f %f %f >\n", this.zx, this.zy, this.zz); + return sb.toString(); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/MultiLib.java b/src/main/java/com/eloraam/redpower/core/MultiLib.java new file mode 100644 index 0000000..03e361c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/MultiLib.java @@ -0,0 +1,50 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerBase; +import java.util.List; +import net.minecraft.world.World; + +public class MultiLib { + public static boolean isClear(World world, WorldCoord parent, List coords) { + for(WorldCoord wc : coords) { + if (!RedPowerBase.blockMultiblock.canPlaceBlockAt(world, wc.x, wc.y, wc.z)) { + TileMultiblock tmb = CoreLib.getTileEntity(world, wc, TileMultiblock.class); + if (tmb == null) { + return false; + } + + if (tmb.relayX != parent.x || tmb.relayY != parent.y || tmb.relayZ != parent.z) { + return false; + } + } + } + + return true; + } + + public static void addRelays(World world, WorldCoord parent, int md, List coords) { + int num = 0; + + for(WorldCoord wc : coords) { + world.setBlock(wc.x, wc.y, wc.z, RedPowerBase.blockMultiblock, md, 3); + TileMultiblock tmb = CoreLib.getTileEntity(world, wc, TileMultiblock.class); + if (tmb != null) { + tmb.relayX = parent.x; + tmb.relayY = parent.y; + tmb.relayZ = parent.z; + tmb.relayNum = num++; + } + } + + } + + public static void removeRelays(World world, WorldCoord parent, List coords) { + for(WorldCoord wc : coords) { + TileMultiblock tmb = CoreLib.getTileEntity(world, wc, TileMultiblock.class); + if (tmb != null && tmb.relayX == parent.x && tmb.relayY == parent.y && tmb.relayZ == parent.z) { + world.setBlockToAir(wc.x, wc.y, wc.z); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/OreStack.java b/src/main/java/com/eloraam/redpower/core/OreStack.java new file mode 100644 index 0000000..8abc438 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/OreStack.java @@ -0,0 +1,16 @@ +package com.eloraam.redpower.core; + +public class OreStack { + public String material; + public int quantity; + + public OreStack(String mat, int qty) { + this.material = mat; + this.quantity = qty; + } + + public OreStack(String mat) { + this.material = mat; + this.quantity = 1; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/PacketGuiEvent.java b/src/main/java/com/eloraam/redpower/core/PacketGuiEvent.java new file mode 100644 index 0000000..4c05a34 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/PacketGuiEvent.java @@ -0,0 +1,59 @@ +package com.eloraam.redpower.core; + +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 io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.NetHandlerPlayServer; + +public class PacketGuiEvent implements IMessageHandler { + public IMessage onMessage(PacketGuiEvent.GuiMessageEvent message, MessageContext context) { + if (context.netHandler instanceof NetHandlerPlayServer) { + EntityPlayerMP player = ((NetHandlerPlayServer)context.netHandler).playerEntity; + if (player.openContainer != null && player.openContainer.windowId == message.windowId && player.openContainer instanceof IHandleGuiEvent) { + IHandleGuiEvent ihge = (IHandleGuiEvent)player.openContainer; + ihge.handleGuiEvent(message); + } + } else if (context.netHandler instanceof NetHandlerPlayClient) { + EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer; + if (player.openContainer != null && player.openContainer.windowId == message.windowId && player.openContainer instanceof IHandleGuiEvent) { + IHandleGuiEvent ihge = (IHandleGuiEvent)player.openContainer; + ihge.handleGuiEvent(message); + } + } + + return null; + } + + public static class GuiMessageEvent implements IMessage { + public int eventId = -1; + public int windowId = -1; + public byte[] parameters; + + public GuiMessageEvent() { + } + + public GuiMessageEvent(int eventId, int windowId, byte... params) { + this.eventId = eventId; + this.windowId = windowId; + this.parameters = params; + } + + public void fromBytes(ByteBuf dataStream) { + this.eventId = dataStream.readInt(); + this.windowId = dataStream.readInt(); + this.parameters = new byte[dataStream.readableBytes()]; + dataStream.readBytes(this.parameters); + } + + public void toBytes(ByteBuf dataStream) { + dataStream.writeInt(this.eventId); + dataStream.writeInt(this.windowId); + dataStream.writeBytes(this.parameters); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/PacketHandler.java b/src/main/java/com/eloraam/redpower/core/PacketHandler.java new file mode 100644 index 0000000..4b93dab --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/PacketHandler.java @@ -0,0 +1,33 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.entity.player.EntityPlayerMP; + +public class PacketHandler { + public SimpleNetworkWrapper netHandler = NetworkRegistry.INSTANCE.newSimpleChannel("Redpower2"); + + public void init() { + this.netHandler.registerMessage(PacketGuiEvent.class, PacketGuiEvent.GuiMessageEvent.class, 1, Side.CLIENT); + this.netHandler.registerMessage(PacketGuiEvent.class, PacketGuiEvent.GuiMessageEvent.class, 1, Side.SERVER); + } + + public void sendTo(IMessage message, EntityPlayerMP player) { + this.netHandler.sendTo(message, player); + } + + public void sendToAllAround(IMessage message, TargetPoint point) { + this.netHandler.sendToAllAround(message, point); + } + + public void sendToDimension(IMessage message, int dimensionId) { + this.netHandler.sendToDimension(message, dimensionId); + } + + public void sendToServer(IMessage message) { + this.netHandler.sendToServer(message); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/PipeLib.java b/src/main/java/com/eloraam/redpower/core/PipeLib.java new file mode 100644 index 0000000..77e3760 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/PipeLib.java @@ -0,0 +1,256 @@ +package com.eloraam.redpower.core; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.IFluidHandler; + +public class PipeLib { + private static boolean isConSide(IBlockAccess iba, int x, int y, int z, int side) { + TileEntity te = iba.getTileEntity(x, y, z); + if (te instanceof IPipeConnectable) { + IPipeConnectable itc1 = (IPipeConnectable)te; + int ilt1 = itc1.getPipeConnectableSides(); + return (ilt1 & 1 << side) > 0; + } else { + if (te instanceof IFluidHandler) { + IFluidHandler itc = (IFluidHandler)te; + FluidTankInfo[] info = itc.getTankInfo(ForgeDirection.getOrientation(side)); + if (info != null) { + for(FluidTankInfo i : info) { + if (i != null && i.capacity > 0) { + return true; + } + } + } + } + + return false; + } + } + + public static int getConnections(IBlockAccess iba, int x, int y, int z) { + IPipeConnectable itc = CoreLib.getTileEntity(iba, x, y, z, IPipeConnectable.class); + if (itc == null) { + return 0; + } else { + int trs = 0; + int sides = itc.getPipeConnectableSides(); + if ((sides & 1) > 0 && isConSide(iba, x, y - 1, z, 1)) { + trs |= 1; + } + + if ((sides & 2) > 0 && isConSide(iba, x, y + 1, z, 0)) { + trs |= 2; + } + + if ((sides & 4) > 0 && isConSide(iba, x, y, z - 1, 3)) { + trs |= 4; + } + + if ((sides & 8) > 0 && isConSide(iba, x, y, z + 1, 2)) { + trs |= 8; + } + + if ((sides & 16) > 0 && isConSide(iba, x - 1, y, z, 5)) { + trs |= 16; + } + + if ((sides & 32) > 0 && isConSide(iba, x + 1, y, z, 4)) { + trs |= 32; + } + + return trs; + } + } + + public static int getFlanges(IBlockAccess iba, WorldCoord wci, int sides) { + int tr = 0; + + for(int i = 0; i < 6; ++i) { + if ((sides & 1 << i) != 0) { + WorldCoord wc = wci.copy(); + wc.step(i); + TileEntity te = iba.getTileEntity(wc.x, wc.y, wc.z); + if (te != null) { + if (te instanceof IPipeConnectable) { + IPipeConnectable itc = (IPipeConnectable)te; + if ((itc.getPipeFlangeSides() & 1 << (i ^ 1)) > 0) { + tr |= 1 << i; + } + } else if (te instanceof IFluidHandler) { + IFluidHandler itc = (IFluidHandler)te; + FluidTankInfo[] info = itc.getTankInfo(ForgeDirection.getOrientation(i ^ 1)); + if (info != null) { + for(FluidTankInfo inf : info) { + if (inf != null && inf.capacity > 0) { + tr |= 1 << i; + break; + } + } + } + } + } + } + } + + return tr; + } + + public static Integer getPressure(World world, WorldCoord wc, int side) { + TileEntity te = world.getTileEntity(wc.x, wc.y, wc.z); + if (te != null) { + if (te instanceof IPipeConnectable) { + IPipeConnectable itc = (IPipeConnectable)te; + return itc.getPipePressure(side); + } + + if (te instanceof IFluidHandler) { + IFluidHandler ifh = (IFluidHandler)te; + FluidTankInfo[] info = ifh.getTankInfo(ForgeDirection.getOrientation(side)); + if (info != null) { + for(FluidTankInfo i : info) { + if (i.fluid != null) { + return (int)((double)i.fluid.amount / (double)i.capacity * 100.0); + } + } + + for(FluidTankInfo i : info) { + if (i.capacity > 0) { + return -100; + } + } + } + } + } + + return null; + } + + public static Fluid getFluid(World world, WorldCoord wc) { + Block bl = world.getBlock(wc.x, wc.y, wc.z); + if (bl instanceof IFluidBlock) { + IFluidBlock fcl = (IFluidBlock)bl; + return fcl.getFluid(); + } else { + if (bl instanceof BlockLiquid) { + BlockLiquid blq = (BlockLiquid)bl; + if (blq.getMaterial() == Material.water) { + return FluidRegistry.WATER; + } + + if (blq.getMaterial() == Material.lava) { + return FluidRegistry.LAVA; + } + } + + return null; + } + } + + public static int getFluidAmount(World world, WorldCoord wc) { + Block bl = world.getBlock(wc.x, wc.y, wc.z); + if (bl instanceof IFluidBlock) { + IFluidBlock fcl = (IFluidBlock)bl; + float fp = fcl.getFilledPercentage(world, wc.x, wc.y, wc.z); + return (int)((float)fcl.getFluid().getDensity() * fp); + } else { + if (bl instanceof BlockLiquid) { + BlockLiquid blq = (BlockLiquid)bl; + if (blq.getMaterial() == Material.water || blq.getMaterial() == Material.lava) { + return 1000; + } + } + + return 0; + } + } + + public static void movePipeLiquid(World world, IPipeConnectable src, WorldCoord wsrc, int sides) { + for(int side = 0; side < 6; ++side) { + if ((sides & 1 << side) != 0) { + WorldCoord wc = wsrc.coordStep(side); + TileEntity te = world.getTileEntity(wc.x, wc.y, wc.z); + if (te != null) { + if (te instanceof IPipeConnectable) { + IPipeConnectable itc = (IPipeConnectable)te; + int srcPressure = src.getPipePressure(side); + int dstPressure = itc.getPipePressure(side ^ 1); + if (srcPressure >= dstPressure) { + FluidBuffer srcBuffer = src.getPipeBuffer(side); + if (srcBuffer != null) { + Fluid srcType = srcBuffer.Type; + int srcLevel = srcBuffer.getLevel() + srcBuffer.Delta; + if (srcType != null && srcLevel > 0) { + FluidBuffer dstBuffer = itc.getPipeBuffer(side ^ 1); + if (dstBuffer != null) { + Fluid dstType = dstBuffer.Type; + int dstLevel = dstBuffer.getLevel(); + if (dstType == null || dstType == srcType) { + int ls = Math.max(srcPressure > dstPressure ? 25 : 0, (srcLevel - dstLevel) / 2); + ls = Math.min(Math.min(ls, dstBuffer.getMaxLevel() - dstLevel), srcLevel); + if (ls > 0) { + srcBuffer.addLevel(srcType, -ls); + dstBuffer.addLevel(srcType, ls); + } + } + } + } + } + } + } else if (te instanceof IFluidHandler) { + IFluidHandler ifh = (IFluidHandler)te; + FluidBuffer srcBuffer = src.getPipeBuffer(side); + if (srcBuffer != null) { + FluidTankInfo[] info = ifh.getTankInfo(ForgeDirection.getOrientation(side ^ 1)); + if (info != null) { + for(FluidTankInfo i : info) { + Fluid bType = srcBuffer.Type; + int srcLevel = srcBuffer.getLevel() + srcBuffer.Delta; + int srcPressure = src.getPipePressure(side); + if (i.capacity > 0) { + if (i.fluid != null) { + if (i.fluid.getFluid() != bType && bType != null) { + continue; + } + } else if (bType == null) { + continue; + } + + int dstLevel = i.fluid == null ? 0 : i.fluid.amount; + int dstPressure = dstLevel <= 0 ? -100 : (int)((double)dstLevel / (double)i.capacity * 100.0); + if (srcPressure < dstPressure && dstLevel > 0) { + int qty = Math.min(Math.min(Math.max(25, (dstLevel - srcLevel) / 2), srcBuffer.getMaxLevel() - srcLevel), dstLevel); + if (qty > 0) { + FluidStack drStack = ifh.drain(ForgeDirection.getOrientation(side ^ 1), qty, true); + if (drStack != null) { + srcBuffer.addLevel(drStack.getFluid(), drStack.amount); + } + } + } else if (srcPressure > dstPressure && srcLevel > 0) { + int qty = Math.min(Math.min(Math.max(25, (srcLevel - dstLevel) / 2), i.capacity - dstLevel), srcLevel); + if (qty > 0) { + qty = ifh.fill(ForgeDirection.getOrientation(side ^ 1), new FluidStack(bType, qty), true); + srcBuffer.addLevel(bType, -qty); + } + } + } + } + } + } + } + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/core/PowerLib.java b/src/main/java/com/eloraam/redpower/core/PowerLib.java new file mode 100644 index 0000000..8d6f063 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/PowerLib.java @@ -0,0 +1,18 @@ +package com.eloraam.redpower.core; + +public class PowerLib { + public static int cutBits(int bits, int cut) { + int i = 1; + + while(i <= cut) { + if ((cut & i) == 0) { + i <<= 1; + } else { + bits = bits & i - 1 | bits >> 1 & ~(i - 1); + cut >>= 1; + } + } + + return bits; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/Quat.java b/src/main/java/com/eloraam/redpower/core/Quat.java new file mode 100644 index 0000000..2dbc8fb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/Quat.java @@ -0,0 +1,103 @@ +package com.eloraam.redpower.core; + +import java.util.Formatter; +import java.util.Locale; + +public class Quat { + public double x; + public double y; + public double z; + public double s; + public static final double SQRT2 = Math.sqrt(2.0); + + public Quat() { + this.s = 1.0; + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + } + + public Quat(Quat q) { + this.x = q.x; + this.y = q.y; + this.z = q.z; + this.s = q.s; + } + + public Quat(double si, double xi, double yi, double zi) { + this.x = xi; + this.y = yi; + this.z = zi; + this.s = si; + } + + public void set(Quat q) { + this.x = q.x; + this.y = q.y; + this.z = q.z; + this.s = q.s; + } + + public static Quat aroundAxis(double xi, double yi, double zi, double a) { + a *= 0.5; + double sn = Math.sin(a); + return new Quat(Math.cos(a), xi * sn, yi * sn, zi * sn); + } + + public void multiply(Quat q) { + double ts = this.s * q.s - this.x * q.x - this.y * q.y - this.z * q.z; + double tx = this.s * q.x + this.x * q.s - this.y * q.z + this.z * q.y; + double ty = this.s * q.y + this.x * q.z + this.y * q.s - this.z * q.x; + double tz = this.s * q.z - this.x * q.y + this.y * q.x + this.z * q.s; + this.s = ts; + this.x = tx; + this.y = ty; + this.z = tz; + } + + public void rightMultiply(Quat q) { + double ts = this.s * q.s - this.x * q.x - this.y * q.y - this.z * q.z; + double tx = this.s * q.x + this.x * q.s + this.y * q.z - this.z * q.y; + double ty = this.s * q.y - this.x * q.z + this.y * q.s + this.z * q.x; + double tz = this.s * q.z + this.x * q.y - this.y * q.x + this.z * q.s; + this.s = ts; + this.x = tx; + this.y = ty; + this.z = tz; + } + + public double mag() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.s * this.s); + } + + public void normalize() { + double d = this.mag(); + if (d != 0.0) { + d = 1.0 / d; + this.x *= d; + this.y *= d; + this.z *= d; + this.s *= d; + } + + } + + public void rotate(Vector3 v) { + double ts = -this.x * v.x - this.y * v.y - this.z * v.z; + double tx = this.s * v.x + this.y * v.z - this.z * v.y; + double ty = this.s * v.y - this.x * v.z + this.z * v.x; + double tz = this.s * v.z + this.x * v.y - this.y * v.x; + v.x = tx * this.s - ts * this.x - ty * this.z + tz * this.y; + v.y = ty * this.s - ts * this.y + tx * this.z - tz * this.x; + v.z = tz * this.s - ts * this.z - tx * this.y + ty * this.x; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Formatter fmt = new Formatter(sb, Locale.US); + fmt.format("Quaternion:\n"); + fmt.format(" < %f %f %f %f >\n", this.s, this.x, this.y, this.z); + fmt.close(); + return sb.toString(); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RedPowerLib.java b/src/main/java/com/eloraam/redpower/core/RedPowerLib.java new file mode 100644 index 0000000..a2a2f75 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RedPowerLib.java @@ -0,0 +1,903 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import net.minecraft.block.Block; +import net.minecraft.block.BlockButton; +import net.minecraft.block.BlockRedstoneWire; +import net.minecraft.init.Blocks; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityPiston; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class RedPowerLib { + private static Set powerClassMapping = new HashSet(); + private static Set blockUpdates = new HashSet(); + private static Deque powerSearch = new LinkedList(); + private static Set powerSearchTest = new HashSet(); + private static boolean searching = false; + + public static void notifyBlock(World world, int x, int y, int z, Block block) { + if (block != null) { + world.getBlock(x, y, z).onNeighborBlockChange(world, x, y, z, block); + } + + } + + public static void updateIndirectNeighbors(World w, int x, int y, int z, Block block) { + if (!w.isRemote) { + for(int a = -3; a <= 3; ++a) { + for(int b = -3; b <= 3; ++b) { + for(int c = -3; c <= 3; ++c) { + int md = a < 0 ? -a : a; + md += b < 0 ? -b : b; + md += c < 0 ? -c : c; + if (md <= 3) { + notifyBlock(w, x + a, y + b, z + c, block); + } + } + } + } + } + + } + + public static boolean isBlockRedstone(IBlockAccess iba, int x, int y, int z, int side) { + switch(side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + } + + return iba.getBlock(x, y, z) instanceof BlockRedstoneWire; + } + + public static boolean isSideNormal(IBlockAccess iba, int x, int y, int z, int side) { + switch(side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + } + + side ^= 1; + if (iba.getBlock(x, y, z).isNormalCube()) { + return true; + } else { + iba.getBlock(x, y, z); + IMultipart im = CoreLib.getTileEntity(iba, x, y, z, IMultipart.class); + return im != null && im.isSideNormal(side); + } + } + + public static boolean canSupportWire(IBlockAccess iba, int i, int j, int k, int side) { + switch(side) { + case 0: + --j; + break; + case 1: + ++j; + break; + case 2: + --k; + break; + case 3: + ++k; + break; + case 4: + --i; + break; + case 5: + ++i; + } + + side ^= 1; + if (iba instanceof World) { + World bid = (World)iba; + if (!bid.blockExists(i, j, k)) { + return true; + } + + if (bid.getBlock(i, j, k).isSideSolid(bid, i, j, k, ForgeDirection.getOrientation(side))) { + return true; + } + } + + if (iba.getBlock(i, j, k).isNormalCube()) { + return true; + } else { + Block block = iba.getBlock(i, j, k); + if (block == Blocks.piston_extension) { + return true; + } else if (block != Blocks.sticky_piston && block != Blocks.piston) { + IMultipart mpart = CoreLib.getTileEntity(iba, i, j, k, IMultipart.class); + return mpart != null && mpart.isSideNormal(side); + } else { + int im = iba.getBlockMetadata(i, j, k) & 7; + return i != im && im != 7; + } + } + } + + public static boolean isStrongPoweringTo(IBlockAccess iba, int x, int y, int z, int side) { + Block block = iba.getBlock(x, y, z); + if (iba.isAirBlock(x, y, z)) { + return false; + } else if (searching && block == Blocks.redstone_wire) { + return false; + } else if (!(iba instanceof World)) { + return false; + } else { + World world = (World)iba; + return block.isProvidingStrongPower(world, x, y, z, side) > 0; + } + } + + public static boolean isStrongPowered(IBlockAccess iba, int x, int y, int z, int side) { + return side != 1 && isStrongPoweringTo(iba, x, y - 1, z, 0) + || side != 0 && isStrongPoweringTo(iba, x, y + 1, z, 1) + || side != 3 && isStrongPoweringTo(iba, x, y, z - 1, 2) + || side != 2 && isStrongPoweringTo(iba, x, y, z + 1, 3) + || side != 5 && isStrongPoweringTo(iba, x - 1, y, z, 4) + || side != 4 && isStrongPoweringTo(iba, x + 1, y, z, 5); + } + + public static boolean isWeakPoweringTo(IBlockAccess iba, int x, int y, int z, int side) { + Block block = iba.getBlock(x, y, z); + return block != Blocks.air + && (!searching || block != Blocks.redstone_wire) + && (block.isProvidingWeakPower(iba, x, y, z, side) > 0 || side > 1 && block == Blocks.redstone_wire && block.isProvidingWeakPower(iba, x, y, z, 1) > 0); + } + + public static boolean isPoweringTo(IBlockAccess iba, int x, int y, int z, int side) { + Block block = iba.getBlock(x, y, z); + if (block == Blocks.air) { + return false; + } else if (block.isProvidingWeakPower(iba, x, y, z, side) > 0) { + return true; + } else if (block.isNormalCube() && isStrongPowered(iba, x, y, z, side)) { + return true; + } else { + return side > 1 && block == Blocks.redstone_wire && !searching && block.isProvidingWeakPower(iba, x, y, z, 1) > 0; + } + } + + public static boolean isPowered(IBlockAccess iba, int x, int y, int z, int cons, int inside) { + return (cons & 17895680) > 0 && isWeakPoweringTo(iba, x, y - 1, z, 0) + || (cons & 35791360) > 0 && isWeakPoweringTo(iba, x, y + 1, z, 1) + || (cons & 71565329) > 0 && isWeakPoweringTo(iba, x, y, z - 1, 2) + || (cons & 143130658) > 0 && isWeakPoweringTo(iba, x, y, z + 1, 3) + || (cons & 268452932) > 0 && isWeakPoweringTo(iba, x - 1, y, z, 4) + || (cons & 536905864) > 0 && isWeakPoweringTo(iba, x + 1, y, z, 5) + || (inside & 1) > 0 && isPoweringTo(iba, x, y - 1, z, 0) + || (inside & 2) > 0 && isPoweringTo(iba, x, y + 1, z, 1) + || (inside & 4) > 0 && isPoweringTo(iba, x, y, z - 1, 2) + || (inside & 8) > 0 && isPoweringTo(iba, x, y, z + 1, 3) + || (inside & 16) > 0 && isPoweringTo(iba, x - 1, y, z, 4) + || (inside & 32) > 0 && isPoweringTo(iba, x + 1, y, z, 5); + } + + private static int getSidePowerMask(IBlockAccess iba, int x, int y, int z, int ch, int side) { + IRedPowerConnectable irp = CoreLib.getTileEntity(iba, x, y, z, IRedPowerConnectable.class); + int mask = getConDirMask(side); + if (irp != null) { + int m = irp.getPoweringMask(ch); + m = (m & 1431655765) << 1 | (m & 715827882) >> 1; + return m & mask; + } else if (ch != 0) { + return 0; + } else { + return isWeakPoweringTo(iba, x, y, z, side) ? mask & 16777215 : (isPoweringTo(iba, x, y, z, side) ? mask : 0); + } + } + + public static int getPowerState(IBlockAccess iba, int i, int j, int k, int cons, int ch) { + int trs = 0; + if ((cons & 17895680) > 0) { + trs |= getSidePowerMask(iba, i, j - 1, k, ch, 0); + } + + if ((cons & 35791360) > 0) { + trs |= getSidePowerMask(iba, i, j + 1, k, ch, 1); + } + + if ((cons & 71565329) > 0) { + trs |= getSidePowerMask(iba, i, j, k - 1, ch, 2); + } + + if ((cons & 143130658) > 0) { + trs |= getSidePowerMask(iba, i, j, k + 1, ch, 3); + } + + if ((cons & 268452932) > 0) { + trs |= getSidePowerMask(iba, i - 1, j, k, ch, 4); + } + + if ((cons & 536905864) > 0) { + trs |= getSidePowerMask(iba, i + 1, j, k, ch, 5); + } + + return trs & cons; + } + + public static int getRotPowerState(IBlockAccess iba, int i, int j, int k, int rcon, int rot, int ch) { + int c1 = mapRotToCon(rcon, rot); + int ps = getPowerState(iba, i, j, k, c1, ch); + return mapConToRot(ps, rot); + } + + public static int getConDirMask(int dir) { + switch(dir) { + case 0: + return 17895680; + case 1: + return 35791360; + case 2: + return 71565329; + case 3: + return 143130658; + case 4: + return 268452932; + default: + return 536905864; + } + } + + public static int mapConToLocal(int cons, int face) { + cons >>= face * 4; + cons &= 15; + switch(face) { + case 0: + return cons; + case 1: + return cons ^ ((cons ^ cons >> 1) & 1) * 3; + case 2: + default: + return cons ^ ((cons ^ cons >> 2) & 3) * 5; + case 3: + case 4: + cons ^= ((cons ^ cons >> 2) & 3) * 5; + return cons ^ ((cons ^ cons >> 1) & 1) * 3; + } + } + + public static int mapLocalToCon(int loc, int face) { + switch(face) { + case 0: + break; + case 1: + loc ^= ((loc ^ loc >> 1) & 1) * 3; + break; + case 2: + default: + loc ^= ((loc ^ loc >> 2) & 3) * 5; + break; + case 3: + case 4: + loc ^= ((loc ^ loc >> 1) & 1) * 3; + loc ^= ((loc ^ loc >> 2) & 3) * 5; + } + + return loc << face * 4; + } + + public static int mapRotToLocal(int rm, int rot) { + rm = rm << rot | rm >> 4 - rot; + rm &= 15; + return rm & 8 | (rm & 3) << 1 | rm >> 2 & 1; + } + + public static int mapLocalToRot(int rm, int rot) { + rm = rm & 8 | (rm & 6) >> 1 | rm << 2 & 4; + rm = rm << 4 - rot | rm >> rot; + return rm & 15; + } + + public static int mapConToRot(int con, int rot) { + return mapLocalToRot(mapConToLocal(con, rot >> 2), rot & 3); + } + + public static int mapRotToCon(int con, int rot) { + return mapLocalToCon(mapRotToLocal(con, rot & 3), rot >> 2); + } + + public static int getDirToRedstone(int rsd) { + switch(rsd) { + case 2: + return 0; + case 3: + return 2; + case 4: + return 3; + case 5: + return 1; + default: + return 0; + } + } + + public static int getConSides(IBlockAccess iba, int i, int j, int k, int side, int pcl) { + Block block = iba.getBlock(i, j, k); + if (iba.isAirBlock(i, j, k)) { + return 0; + } else { + IConnectable rpa = CoreLib.getTileEntity(iba, i, j, k, IConnectable.class); + if (rpa != null) { + int md = rpa.getConnectClass(side); + return isCompatible(md, pcl) ? rpa.getConnectableMask() : 0; + } else if (!isCompatible(0, pcl)) { + return 0; + } else if (block == Blocks.piston || block == Blocks.sticky_piston) { + int md = iba.getBlockMetadata(i, j, k) & 7; + return md == 7 ? 0 : 1073741823 ^ getConDirMask(md); + } else if (block == Blocks.piston_extension) { + TileEntity md2 = iba.getTileEntity(i, j, k); + if (!(md2 instanceof TileEntityPiston)) { + return 0; + } else { + TileEntityPiston tep = (TileEntityPiston)md2; + Block sid = tep.getStoredBlockID(); + if (sid != Blocks.piston && sid != Blocks.sticky_piston) { + return 0; + } else { + int md1 = tep.getBlockMetadata() & 7; + return md1 == 7 ? 0 : 1073741823 ^ getConDirMask(md1); + } + } + } else if (block == Blocks.dispenser || block instanceof BlockButton || block == Blocks.lever) { + return 1073741823; + } else if (block == Blocks.redstone_torch || block == Blocks.unlit_redstone_torch) { + return 1073741823; + } else if (block != Blocks.unpowered_repeater && block != Blocks.powered_repeater) { + return block.canConnectRedstone(iba, i, j, k, getDirToRedstone(side)) ? getConDirMask(side) : 0; + } else { + int md = iba.getBlockMetadata(i, j, k) & 1; + return md > 0 ? 12 : 3; + } + } + } + + private static int getES1(IBlockAccess iba, int i, int j, int k, int side, int pcl, int cc) { + if (iba.isAirBlock(i, j, k)) { + return 0; + } else { + IConnectable rpa = CoreLib.getTileEntity(iba, i, j, k, IConnectable.class); + if (rpa != null) { + int cc2 = rpa.getCornerPowerMode(); + if (cc == 0 || cc2 == 0) { + return 0; + } else if (cc == 2 && cc2 == 2) { + return 0; + } else if (cc == 3 && cc2 == 1) { + return 0; + } else { + int pc = rpa.getConnectClass(side); + return isCompatible(pc, pcl) ? rpa.getConnectableMask() : 0; + } + } else { + return 0; + } + } + } + + public static int getExtConSides(IBlockAccess iba, IConnectable irp, int i, int j, int k, int dir, int cc) { + int cons = irp.getConnectableMask(); + cons &= getConDirMask(dir) & 16777215; + if (cons == 0) { + return 0; + } else { + Block block = iba.getBlock(i, j, k); + if (CoverLib.blockCoverPlate != null && block == CoverLib.blockCoverPlate) { + if (iba.getBlockMetadata(i, j, k) != 0) { + return 0; + } + + ICoverable pcl = CoreLib.getTileEntity(iba, i, j, k, ICoverable.class); + if (pcl == null) { + return 0; + } + + int isv = pcl.getCoverMask(); + if ((isv & 1 << (dir ^ 1)) > 0) { + return 0; + } + + isv |= isv << 12; + isv |= isv << 6; + isv &= 197379; + isv |= isv << 3; + isv &= 1118481; + isv |= isv << 2; + isv |= isv << 1; + cons &= ~isv; + } else if (!iba.isAirBlock(i, j, k) && block != Blocks.flowing_water && block != Blocks.water) { + return 0; + } + + int pcl1 = irp.getConnectClass(dir); + int isv = 0; + if ((cons & 15) > 0) { + isv |= getES1(iba, i, j - 1, k, 1, pcl1, cc) & 2236928; + } + + if ((cons & 240) > 0) { + isv |= getES1(iba, i, j + 1, k, 0, pcl1, cc) & 1118464; + } + + if ((cons & 3840) > 0) { + isv |= getES1(iba, i, j, k - 1, 3, pcl1, cc) & 8912930; + } + + if ((cons & 61440) > 0) { + isv |= getES1(iba, i, j, k + 1, 2, pcl1, cc) & 4456465; + } + + if ((cons & 983040) > 0) { + isv |= getES1(iba, i - 1, j, k, 5, pcl1, cc) & 34952; + } + + if ((cons & 15728640) > 0) { + isv |= getES1(iba, i + 1, j, k, 4, pcl1, cc) & 17476; + } + + isv >>= (dir ^ 1) << 2; + isv = (isv & 10) >> 1 | (isv & 5) << 1; + isv |= isv << 6; + isv |= isv << 3; + isv &= 4369; + isv <<= dir & 1; + switch(dir) { + case 0: + case 1: + return isv << 8; + case 2: + case 3: + return isv << 10 & 0xFF0000 | isv & 0xFF; + default: + return isv << 2; + } + } + } + + public static int getConnections(IBlockAccess iba, IConnectable irp, int x, int y, int z) { + int cons = irp.getConnectableMask(); + int cs = 0; + if ((cons & 17895680) > 0) { + int pcl = irp.getConnectClass(0); + cs |= getConSides(iba, x, y - 1, z, 1, pcl) & 35791360; + } + + if ((cons & 35791360) > 0) { + int pcl = irp.getConnectClass(1); + cs |= getConSides(iba, x, y + 1, z, 0, pcl) & 17895680; + } + + if ((cons & 71565329) > 0) { + int pcl = irp.getConnectClass(2); + cs |= getConSides(iba, x, y, z - 1, 3, pcl) & 143130658; + } + + if ((cons & 143130658) > 0) { + int pcl = irp.getConnectClass(3); + cs |= getConSides(iba, x, y, z + 1, 2, pcl) & 71565329; + } + + if ((cons & 268452932) > 0) { + int pcl = irp.getConnectClass(4); + cs |= getConSides(iba, x - 1, y, z, 5, pcl) & 536905864; + } + + if ((cons & 536905864) > 0) { + int pcl = irp.getConnectClass(5); + cs |= getConSides(iba, x + 1, y, z, 4, pcl) & 268452932; + } + + cs = cs << 1 & 715827882 | cs >> 1 & 357913941; + return cs & cons; + } + + public static int getExtConnections(IBlockAccess iba, IConnectable irp, int i, int j, int k) { + byte cs = 0; + int cc = irp.getCornerPowerMode(); + int cs1 = cs | getExtConSides(iba, irp, i, j - 1, k, 0, cc); + cs1 |= getExtConSides(iba, irp, i, j + 1, k, 1, cc); + cs1 |= getExtConSides(iba, irp, i, j, k - 1, 2, cc); + cs1 |= getExtConSides(iba, irp, i, j, k + 1, 3, cc); + cs1 |= getExtConSides(iba, irp, i - 1, j, k, 4, cc); + return cs1 | getExtConSides(iba, irp, i + 1, j, k, 5, cc); + } + + public static int getExtConnectionExtras(IBlockAccess iba, IConnectable irp, int i, int j, int k) { + byte cs = 0; + int cs1 = cs | getExtConSides(iba, irp, i, j - 1, k, 0, 3); + cs1 |= getExtConSides(iba, irp, i, j + 1, k, 1, 3); + cs1 |= getExtConSides(iba, irp, i, j, k - 1, 2, 3); + cs1 |= getExtConSides(iba, irp, i, j, k + 1, 3, 3); + cs1 |= getExtConSides(iba, irp, i - 1, j, k, 4, 3); + return cs1 | getExtConSides(iba, irp, i + 1, j, k, 5, 3); + } + + public static int getTileCurrentStrength(World world, int i, int j, int k, int cons, int ch) { + IRedPowerConnectable irp = CoreLib.getTileEntity(world, i, j, k, IRedPowerConnectable.class); + if (irp == null) { + return -1; + } else if (irp instanceof IRedPowerWiring) { + IRedPowerWiring irw = (IRedPowerWiring)irp; + return irw.getCurrentStrength(cons, ch); + } else { + return (irp.getPoweringMask(ch) & cons) > 0 ? 255 : -1; + } + } + + public static int getTileOrRedstoneCurrentStrength(World world, int i, int j, int k, int cons, int ch) { + Block block = world.getBlock(i, j, k); + if (world.isAirBlock(i, j, k)) { + return -1; + } else if (block == Blocks.redstone_wire) { + int irp1 = world.getBlockMetadata(i, j, k); + return irp1 > 0 ? irp1 : -1; + } else { + IRedPowerConnectable irp = CoreLib.getTileEntity(world, i, j, k, IRedPowerConnectable.class); + if (irp == null) { + return -1; + } else if (irp instanceof IRedPowerWiring) { + IRedPowerWiring irw = (IRedPowerWiring)irp; + return irw.getCurrentStrength(cons, ch); + } else { + return (irp.getPoweringMask(ch) & cons) > 0 ? 255 : -1; + } + } + } + + private static int getIndCur(World world, int i, int j, int k, int d1, int d2, int ch) { + int d3; + switch(d1) { + case 0: + --j; + d3 = d2 + 2; + break; + case 1: + ++j; + d3 = d2 + 2; + break; + case 2: + --k; + d3 = d2 + (d2 & 2); + break; + case 3: + ++k; + d3 = d2 + (d2 & 2); + break; + case 4: + --i; + d3 = d2; + break; + default: + ++i; + d3 = d2; + } + + int d4; + switch(d3) { + case 0: + --j; + d4 = d1 - 2; + break; + case 1: + ++j; + d4 = d1 - 2; + break; + case 2: + --k; + d4 = d1 & 1 | (d1 & 4) >> 1; + break; + case 3: + ++k; + d4 = d1 & 1 | (d1 & 4) >> 1; + break; + case 4: + --i; + d4 = d1; + break; + default: + ++i; + d4 = d1; + } + + return getTileCurrentStrength(world, i, j, k, 1 << (d4 ^ 1) << ((d3 ^ 1) << 2), ch); + } + + public static int getMaxCurrentStrength(World world, int i, int j, int k, int cons, int indcon, int ch) { + int mcs = -1; + int ocon = cons << 1 & 715827882 | cons >> 1 & 357913941; + if ((cons & 17895680) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i, j - 1, k, ocon & 35791360, ch)); + } + + if ((cons & 35791360) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i, j + 1, k, ocon & 17895680, ch)); + } + + if ((cons & 71565329) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i, j, k - 1, ocon & 143130658, ch)); + } + + if ((cons & 143130658) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i, j, k + 1, ocon & 71565329, ch)); + } + + if ((cons & 268452932) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i - 1, j, k, ocon & 536905864, ch)); + } + + if ((cons & 536905864) > 0) { + mcs = Math.max(mcs, getTileOrRedstoneCurrentStrength(world, i + 1, j, k, ocon & 268452932, ch)); + } + + for(int a = 0; a < 6; ++a) { + for(int b = 0; b < 4; ++b) { + if ((indcon & 1 << a * 4 + b) > 0) { + mcs = Math.max(mcs, getIndCur(world, i, j, k, a, b, ch)); + } + } + } + + return mcs; + } + + public static void addUpdateBlock(int i, int j, int k) { + for(int a = -3; a <= 3; ++a) { + for(int b = -3; b <= 3; ++b) { + for(int c = -3; c <= 3; ++c) { + int md = a < 0 ? -a : a; + md += b < 0 ? -b : b; + md += c < 0 ? -c : c; + if (md <= 3) { + blockUpdates.add(new ChunkCoordinates(i + a, j + b, k + c)); + } + } + } + } + + } + + public static void addStartSearchBlock(int x, int y, int z) { + ChunkCoordinates sb = new ChunkCoordinates(x, y, z); + if (!powerSearchTest.contains(sb)) { + powerSearch.addLast(sb); + powerSearchTest.add(sb); + } + + } + + public static void addSearchBlock(int x, int y, int z) { + addStartSearchBlock(x, y, z); + blockUpdates.add(new ChunkCoordinates(x, y, z)); + } + + private static void addIndBl(int x, int y, int z, int d1, int d2) { + int d3; + switch(d1) { + case 0: + --y; + d3 = d2 + 2; + break; + case 1: + ++y; + d3 = d2 + 2; + break; + case 2: + --z; + d3 = d2 + (d2 & 2); + break; + case 3: + ++z; + d3 = d2 + (d2 & 2); + break; + case 4: + --x; + d3 = d2; + break; + default: + ++x; + d3 = d2; + } + + switch(d3) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + } + + addSearchBlock(x, y, z); + } + + public static void addSearchBlocks(int i, int j, int k, int cons, int indcon) { + int ocon = cons << 1 & 11184810 | cons >> 1 & 5592405; + if ((cons & 17895680) > 0) { + addSearchBlock(i, j - 1, k); + } + + if ((cons & 35791360) > 0) { + addSearchBlock(i, j + 1, k); + } + + if ((cons & 71565329) > 0) { + addSearchBlock(i, j, k - 1); + } + + if ((cons & 143130658) > 0) { + addSearchBlock(i, j, k + 1); + } + + if ((cons & 268452932) > 0) { + addSearchBlock(i - 1, j, k); + } + + if ((cons & 536905864) > 0) { + addSearchBlock(i + 1, j, k); + } + + for(int a = 0; a < 6; ++a) { + for(int b = 0; b < 4; ++b) { + if ((indcon & 1 << a * 4 + b) > 0) { + addIndBl(i, j, k, a, b); + } + } + } + + } + + public static void updateCurrent(World world, int x, int y, int z) { + addStartSearchBlock(x, y, z); + if (!searching) { + searching = true; + + while(powerSearch.size() > 0) { + ChunkCoordinates c = (ChunkCoordinates)powerSearch.removeFirst(); + powerSearchTest.remove(c); + IRedPowerWiring sp = CoreLib.getTileEntity(world, c.posX, c.posY, c.posZ, IRedPowerWiring.class); + if (sp != null) { + sp.updateCurrentStrength(); + } + } + + searching = false; + List coords = new ArrayList(blockUpdates); + blockUpdates.clear(); + + for(ChunkCoordinates c : coords) { + notifyBlock(world, c.posX, c.posY, c.posZ, Blocks.redstone_wire); + world.markBlockForUpdate(c.posX, c.posY, c.posZ); + } + } + + } + + public static int updateBlockCurrentStrength(World world, IRedPowerWiring irp, int x, int y, int z, int conm, int chm) { + int cons = irp.getConnectionMask() & conm; + int indcon = irp.getExtConnectionMask() & conm; + int mx = -1; + int ps = 0; + int cs = 0; + + int ch; + for(int chm2 = chm; chm2 > 0; ps = Math.max(ps, irp.scanPoweringStrength(cons | indcon, ch))) { + ch = Integer.numberOfTrailingZeros(chm2); + chm2 &= ~(1 << ch); + cs = Math.max(cs, irp.getCurrentStrength(conm, ch)); + mx = Math.max(mx, getMaxCurrentStrength(world, x, y, z, cons, indcon, ch)); + } + + if (ps > cs || mx != cs + 1 && (cs != 0 || mx != 0)) { + if (ps == cs && mx <= cs) { + return cs; + } else { + cs = Math.max(ps, cs); + if (cs >= mx) { + if (cs > ps) { + cs = 0; + } + } else { + cs = Math.max(0, mx - 1); + } + + if ((chm & 1) > 0) { + addUpdateBlock(x, y, z); + } + + addSearchBlocks(x, y, z, cons, indcon); + return cs; + } + } else { + return cs; + } + } + + public static boolean isSearching() { + return searching; + } + + public static void addCompatibleMapping(int a, int b) { + powerClassMapping.add(new RedPowerLib.PowerClassCompat(a, b)); + powerClassMapping.add(new RedPowerLib.PowerClassCompat(b, a)); + } + + public static boolean isCompatible(int a, int b) { + return a == b || powerClassMapping.contains(new RedPowerLib.PowerClassCompat(a, b)); + } + + public static class PowerClassCompat { + private final int a; + private final int b; + + public PowerClassCompat(int a, int b) { + this.a = a; + this.b = b; + } + + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (o != null && this.getClass() == o.getClass()) { + RedPowerLib.PowerClassCompat that = (RedPowerLib.PowerClassCompat)o; + return this.a == that.a && this.b == that.b; + } else { + return false; + } + } + + public int hashCode() { + int result = this.a; + return 31 * result + this.b; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RedbusLib.java b/src/main/java/com/eloraam/redpower/core/RedbusLib.java new file mode 100644 index 0000000..54bdd92 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RedbusLib.java @@ -0,0 +1,44 @@ +package com.eloraam.redpower.core; + +import net.minecraft.world.IBlockAccess; + +public class RedbusLib { + public static IRedbusConnectable getAddr(IBlockAccess iba, WorldCoord pos, int addr) { + RedbusLib.RedbusPathfinder pf = new RedbusLib.RedbusPathfinder(iba, addr); + pf.addSearchBlocks(pos, 16777215, 0); + + while(pf.iterate()) { + } + + return pf.result; + } + + private static class RedbusPathfinder extends WirePathfinder { + public IRedbusConnectable result = null; + IBlockAccess iba; + int addr; + + public RedbusPathfinder(IBlockAccess ib, int ad) { + this.iba = ib; + this.addr = ad; + this.init(); + } + + @Override + public boolean step(WorldCoord wc) { + IRedbusConnectable irb = CoreLib.getTileEntity(this.iba, wc, IRedbusConnectable.class); + if (irb != null && irb.rbGetAddr() == this.addr) { + this.result = irb; + return false; + } else { + IWiring iw = CoreLib.getTileEntity(this.iba, wc, IWiring.class); + if (iw == null) { + return true; + } else { + this.addSearchBlocks(wc, iw.getConnectionMask(), iw.getExtConnectionMask()); + return true; + } + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/ReflectLib.java b/src/main/java/com/eloraam/redpower/core/ReflectLib.java new file mode 100644 index 0000000..b2f3fe3 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/ReflectLib.java @@ -0,0 +1,74 @@ +package com.eloraam.redpower.core; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflectLib { + public static void callClassMethod(String className, String method, Class[] def, Object... params) { + Class cl; + try { + cl = Class.forName(className); + } catch (ClassNotFoundException var9) { + return; + } + + Method mth; + try { + mth = cl.getDeclaredMethod(method, def); + } catch (NoSuchMethodException var8) { + return; + } + + try { + mth.invoke(null, params); + } catch (InvocationTargetException | IllegalAccessException var7) { + } + + } + + public static T getStaticField(String classname, String var, Class varcl) { + Class cl; + try { + cl = Class.forName(classname); + } catch (ClassNotFoundException var9) { + return null; + } + + Field fld; + try { + fld = cl.getDeclaredField(var); + } catch (NoSuchFieldException var8) { + return null; + } + + Object ob; + try { + ob = fld.get(null); + } catch (NullPointerException | IllegalAccessException var7) { + return null; + } + + return (T)(!varcl.isInstance(ob) ? null : ob); + } + + public static T getField(Object ob, String var, Class varcl) { + Class cl = ob.getClass(); + + Field fld; + try { + fld = cl.getDeclaredField(var); + } catch (NoSuchFieldException var8) { + return null; + } + + Object ob2; + try { + ob2 = fld.get(ob); + } catch (NullPointerException | IllegalAccessException var7) { + return null; + } + + return (T)(!varcl.isInstance(ob2) ? null : ob2); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderContext.java b/src/main/java/com/eloraam/redpower/core/RenderContext.java new file mode 100644 index 0000000..879d10e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderContext.java @@ -0,0 +1,1228 @@ +package com.eloraam.redpower.core; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; + +public class RenderContext { + public static final int[][] texRotTable = new int[][]{ + {0, 1, 2, 3, 4, 5, 0, 112347, 0}, + {0, 1, 4, 5, 3, 2, 45, 112320, 27}, + {0, 1, 3, 2, 5, 4, 27, 112347, 0}, + {0, 1, 5, 4, 2, 3, 54, 112320, 27}, + {1, 0, 2, 3, 5, 4, 112347, 112347, 0}, + {1, 0, 4, 5, 2, 3, 112374, 112320, 27}, + {1, 0, 3, 2, 4, 5, 112320, 112347, 0}, + {1, 0, 5, 4, 3, 2, 112365, 112320, 27}, + {4, 5, 0, 1, 2, 3, 217134, 1728, 110619}, + {3, 2, 0, 1, 4, 5, 220014, 0, 112347}, + {5, 4, 0, 1, 3, 2, 218862, 1728, 110619}, + {2, 3, 0, 1, 5, 4, 220590, 0, 112347}, + {4, 5, 1, 0, 3, 2, 188469, 1728, 110619}, + {3, 2, 1, 0, 5, 4, 191349, 0, 112347}, + {5, 4, 1, 0, 2, 3, 190197, 1728, 110619}, + {2, 3, 1, 0, 4, 5, 191925, 0, 112347}, + {4, 5, 3, 2, 0, 1, 2944, 110619, 1728}, + {3, 2, 5, 4, 0, 1, 187264, 27, 112320}, + {5, 4, 2, 3, 0, 1, 113536, 110619, 1728}, + {2, 3, 4, 5, 0, 1, 224128, 27, 112320}, + {4, 5, 2, 3, 1, 0, 3419, 110619, 1728}, + {3, 2, 4, 5, 1, 0, 187739, 27, 112320}, + {5, 4, 3, 2, 1, 0, 114011, 110619, 1728}, + {2, 3, 5, 4, 1, 0, 224603, 27, 112320} + }; + public Matrix3 basis = new Matrix3(); + public Vector3 localOffset = new Vector3(); + public Vector3 globalOrigin = new Vector3(); + public Vector3 boxSize1 = new Vector3(); + public Vector3 boxSize2 = new Vector3(); + public RenderModel boundModel = null; + public Vector3[] vertices; + private Vector3[] verticesBox = new Vector3[8]; + public TexVertex[][] corners; + private TexVertex[][] cornersBox = new TexVertex[6][4]; + private IIcon[] texIndex; + private IIcon[] texIndexBox = new IIcon[6]; + private IIcon[][] texIndexList; + public boolean lockTexture = false; + public boolean exactTextureCoordinates = false; + private int texFlags = 0; + public boolean useNormal = false; + public boolean forceFlat = false; + private float tintR = 1.0F; + private float tintG = 1.0F; + private float tintB = 1.0F; + private float tintA = 1.0F; + public float[] lightLocal; + private float[] lightLocalBox = new float[6]; + public int[] brightLocal; + private int[] brightLocalBox = new int[6]; + private int[][][] lightGlobal = new int[3][3][3]; + private float[][][] aoGlobal = new float[3][3][3]; + private float[] lightFlat = new float[6]; + private int globTrans; + + public void setDefaults() { + this.localOffset.set(0.0, 0.0, 0.0); + this.setOrientation(0, 0); + this.texFlags = 0; + this.tintR = 1.0F; + this.tintG = 1.0F; + this.tintB = 1.0F; + this.tintA = 1.0F; + this.setLocalLights(1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F); + this.setBrightness(15728880); + } + + public void bindTexture(ResourceLocation texture) { + Minecraft.getMinecraft().renderEngine.bindTexture(texture); + } + + public void bindBlockTexture() { + this.bindTexture(TextureMap.locationBlocksTexture); + } + + public void setPos(double x, double y, double z) { + this.globalOrigin.set(x, y, z); + } + + public void setPos(Vector3 v) { + this.globalOrigin.set(v); + } + + public void setRelPos(double x, double y, double z) { + this.localOffset.set(x, y, z); + } + + public void setRelPos(Vector3 v) { + this.localOffset.set(v); + } + + public void setOrientation(int down, int rot) { + MathLib.orientMatrix(this.basis, down, rot); + } + + public void setSize(double tx, double ty, double tz, double bx, double by, double bz) { + this.boxSize1.set(tx, ty, tz); + this.boxSize2.set(bx, by, bz); + } + + public void setTexFlags(int fl) { + this.texFlags = fl; + } + + public void setTexRotation(RenderBlocks renderer, int rotation, boolean sides) { + switch(rotation) { + case 0: + if (sides) { + renderer.uvRotateEast = 3; + renderer.uvRotateWest = 3; + renderer.uvRotateSouth = 3; + renderer.uvRotateNorth = 3; + } + case 1: + default: + break; + case 2: + if (sides) { + renderer.uvRotateSouth = 1; + renderer.uvRotateNorth = 2; + } + break; + case 3: + if (sides) { + renderer.uvRotateSouth = 2; + renderer.uvRotateNorth = 1; + } + + renderer.uvRotateTop = 3; + renderer.uvRotateBottom = 3; + break; + case 4: + if (sides) { + renderer.uvRotateEast = 1; + renderer.uvRotateWest = 2; + } + + renderer.uvRotateTop = 2; + renderer.uvRotateBottom = 1; + break; + case 5: + if (sides) { + renderer.uvRotateEast = 2; + renderer.uvRotateWest = 1; + } + + renderer.uvRotateTop = 1; + renderer.uvRotateBottom = 2; + } + + } + + public void resetTexRotation(RenderBlocks renderer) { + renderer.uvRotateEast = 0; + renderer.uvRotateWest = 0; + renderer.uvRotateSouth = 0; + renderer.uvRotateNorth = 0; + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; + } + + public void setIcon(IIcon bottom, IIcon top, IIcon north, IIcon south, IIcon west, IIcon east) { + if (!this.lockTexture) { + this.texIndex = this.texIndexBox; + this.texIndex[0] = bottom; + this.texIndex[1] = top; + this.texIndex[2] = north; + this.texIndex[3] = south; + this.texIndex[4] = west; + this.texIndex[5] = east; + } + + } + + public void setIcon(IIcon universal) { + if (!this.lockTexture) { + this.texIndex = this.texIndexBox; + this.texIndex[0] = universal; + this.texIndex[1] = universal; + this.texIndex[2] = universal; + this.texIndex[3] = universal; + this.texIndex[4] = universal; + this.texIndex[5] = universal; + } + + } + + public void setIcon(IIcon[] a) { + if (!this.lockTexture) { + this.texIndex = a; + } + + } + + public void setIcon(IIcon[][] a) { + if (!this.lockTexture) { + this.texIndexList = a; + this.texIndex = a[0]; + } + + } + + public void setIconIndex(int n) { + if (this.texIndexList != null) { + this.texIndex = this.texIndexList[n]; + } + + } + + public void setIconNum(int num, IIcon tex) { + this.texIndex[num] = tex; + } + + public void setTint(float r, float g, float b) { + this.tintR = r; + this.tintG = g; + this.tintB = b; + } + + public void setTintHex(int tc) { + this.tintR = (float)(tc >> 16) / 255.0F; + this.tintG = (float)(tc >> 8 & 0xFF) / 255.0F; + this.tintB = (float)(tc & 0xFF) / 255.0F; + } + + public void setAlpha(float a) { + this.tintA = a; + } + + public void setLocalLights(float a, float b, float c, float d, float e, float f) { + this.lightLocal = this.lightLocalBox; + this.lightLocal[0] = a; + this.lightLocal[1] = b; + this.lightLocal[2] = c; + this.lightLocal[3] = d; + this.lightLocal[4] = e; + this.lightLocal[5] = f; + } + + public void setLocalLights(float a) { + this.lightLocal = this.lightLocalBox; + + for(int i = 0; i < 6; ++i) { + this.lightLocal[i] = a; + } + + } + + public void setBrightness(int a) { + this.brightLocal = this.brightLocalBox; + + for(int i = 0; i < 6; ++i) { + this.brightLocal[i] = a; + } + + } + + public void startWorldRender(RenderBlocks rbl) { + } + + public boolean endWorldRender() { + return false; + } + + public void setupBox() { + this.vertices = this.verticesBox; + this.vertices[0].set(this.boxSize2.x, this.boxSize2.y, this.boxSize1.z); + this.vertices[1].set(this.boxSize1.x, this.boxSize2.y, this.boxSize1.z); + this.vertices[2].set(this.boxSize1.x, this.boxSize2.y, this.boxSize2.z); + this.vertices[3].set(this.boxSize2.x, this.boxSize2.y, this.boxSize2.z); + this.vertices[4].set(this.boxSize2.x, this.boxSize1.y, this.boxSize1.z); + this.vertices[5].set(this.boxSize1.x, this.boxSize1.y, this.boxSize1.z); + this.vertices[6].set(this.boxSize1.x, this.boxSize1.y, this.boxSize2.z); + this.vertices[7].set(this.boxSize2.x, this.boxSize1.y, this.boxSize2.z); + } + + public void transformRotate() { + for(Vector3 vec : this.vertices) { + vec.add(this.localOffset.x - 0.5, this.localOffset.y - 0.5, this.localOffset.z - 0.5); + this.basis.rotate(vec); + vec.add(this.globalOrigin.x + 0.5, this.globalOrigin.y + 0.5, this.globalOrigin.z + 0.5); + } + + } + + public void transform() { + for(Vector3 vec : this.vertices) { + vec.add(this.localOffset); + vec.add(this.globalOrigin); + } + + } + + public void setSideUV(int side, double uMin, double uMax, double vMin, double vMax) { + if (!this.exactTextureCoordinates) { + uMin += 0.001; + vMin += 0.001; + uMax -= 0.001; + vMax -= 0.001; + } + + int txl = this.texFlags >> side * 3; + if ((txl & 1) > 0) { + uMin = 1.0 - uMin; + uMax = 1.0 - uMax; + } + + if ((txl & 2) > 0) { + vMin = 1.0 - vMin; + vMax = 1.0 - vMax; + } + + IIcon icon = this.texIndex[side]; + if (icon != null) { + if ((txl & 4) > 0) { + double uStart = (double)icon.getInterpolatedV(uMin * 16.0); + double uEnd = (double)icon.getInterpolatedV(uMax * 16.0); + double vStart = (double)icon.getInterpolatedU(vMin * 16.0); + double vEnd = (double)icon.getInterpolatedU(vMax * 16.0); + this.corners[side][0].setUV(vStart, uStart); + this.corners[side][1].setUV(vEnd, uStart); + this.corners[side][2].setUV(vEnd, uEnd); + this.corners[side][3].setUV(vStart, uEnd); + } else { + double uStart = (double)icon.getInterpolatedU(uMin * 16.0); + double uEnd = (double)icon.getInterpolatedU(uMax * 16.0); + double vStart = (double)icon.getInterpolatedV(vMin * 16.0); + double vEnd = (double)icon.getInterpolatedV(vMax * 16.0); + this.corners[side][0].setUV(uStart, vStart); + this.corners[side][1].setUV(uStart, vEnd); + this.corners[side][2].setUV(uEnd, vEnd); + this.corners[side][3].setUV(uEnd, vStart); + } + } + + } + + public void doMappingBox(int sides) { + this.corners = this.cornersBox; + if ((sides & 3) > 0) { + double vMin = 1.0 - this.boxSize2.x; + double vMax = 1.0 - this.boxSize1.x; + if ((sides & 1) > 0) { + double uMin = 1.0 - this.boxSize2.z; + double uMax = 1.0 - this.boxSize1.z; + this.setSideUV(0, uMin, uMax, vMin, vMax); + } + + if ((sides & 2) > 0) { + double uMin = this.boxSize1.z; + double uMax = this.boxSize2.z; + this.setSideUV(1, uMin, uMax, vMin, vMax); + } + } + + if ((sides & 60) != 0) { + double vMin = 1.0 - this.boxSize2.y; + double vMax = 1.0 - this.boxSize1.y; + if ((sides & 4) > 0) { + double uMin = 1.0 - this.boxSize2.x; + double uMax = 1.0 - this.boxSize1.x; + this.setSideUV(2, uMin, uMax, vMin, vMax); + } + + if ((sides & 8) > 0) { + double uMin = this.boxSize1.x; + double uMax = this.boxSize2.x; + this.setSideUV(3, uMin, uMax, vMin, vMax); + } + + if ((sides & 16) > 0) { + double uMin = this.boxSize1.z; + double uMax = this.boxSize2.z; + this.setSideUV(4, uMin, uMax, vMin, vMax); + } + + if ((sides & 32) > 0) { + double uMin = 1.0 - this.boxSize2.z; + double uMax = 1.0 - this.boxSize1.z; + this.setSideUV(5, uMin, uMax, vMin, vMax); + } + } + + } + + public void calcBoundsGlobal() { + this.setupBox(); + this.transform(); + } + + public void calcBounds() { + this.setupBox(); + this.transformRotate(); + } + + private void swapTex(int a, int b) { + IIcon tex = this.texIndexBox[a]; + this.texIndexBox[a] = this.texIndexBox[b]; + this.texIndexBox[b] = tex; + } + + public void orientTextures(int down) { + switch(down) { + case 0: + default: + break; + case 1: + this.swapTex(0, 1); + this.swapTex(4, 5); + this.texFlags = 112347; + break; + case 2: + this.swapTex(0, 2); + this.swapTex(1, 3); + this.swapTex(0, 4); + this.swapTex(1, 5); + this.texFlags = 217134; + break; + case 3: + this.swapTex(0, 3); + this.swapTex(1, 2); + this.swapTex(0, 4); + this.swapTex(1, 5); + this.texFlags = 188469; + break; + case 4: + this.swapTex(0, 4); + this.swapTex(1, 5); + this.swapTex(2, 3); + this.texFlags = 2944; + break; + case 5: + this.swapTex(0, 5); + this.swapTex(1, 4); + this.swapTex(0, 1); + this.texFlags = 3419; + } + + } + + public void orientTextureRot(int down, int rot) { + int r = rot > 1 ? (rot == 2 ? 3 : 6) : (rot == 0 ? 0 : 5); + r |= r << 3; + switch(down) { + case 0: + this.texFlags = r; + break; + case 1: + this.swapTex(0, 1); + this.swapTex(4, 5); + this.texFlags = 112347 ^ r; + break; + case 2: + this.swapTex(0, 2); + this.swapTex(1, 3); + this.swapTex(0, 4); + this.swapTex(1, 5); + this.texFlags = 217134 ^ r << 6; + break; + case 3: + this.swapTex(0, 3); + this.swapTex(1, 2); + this.swapTex(0, 4); + this.swapTex(1, 5); + this.texFlags = 188469 ^ r << 6; + break; + case 4: + this.swapTex(0, 4); + this.swapTex(1, 5); + this.swapTex(2, 3); + this.texFlags = 2944 ^ r << 12; + break; + case 5: + this.swapTex(0, 5); + this.swapTex(1, 4); + this.swapTex(0, 1); + this.texFlags = 3419 ^ r << 12; + } + + } + + private void swapTexFl(int a, int b) { + IIcon t = this.texIndexBox[a]; + this.texIndexBox[a] = this.texIndexBox[b]; + this.texIndexBox[b] = t; + a *= 3; + b *= 3; + int f1 = this.texFlags >> a & 7; + int f2 = this.texFlags >> b & 7; + this.texFlags &= ~(7 << a | 7 << b); + this.texFlags |= f1 << b | f2 << a; + } + + public void rotateTextures(int rot) { + int r = rot > 1 ? (rot == 2 ? 3 : 6) : (rot == 0 ? 0 : 5); + r |= r << 3; + this.texFlags ^= r; + switch(rot) { + case 1: + this.swapTexFl(2, 4); + this.swapTexFl(3, 4); + this.swapTexFl(3, 5); + break; + case 2: + this.swapTexFl(2, 3); + this.swapTexFl(4, 5); + break; + case 3: + this.swapTexFl(2, 5); + this.swapTexFl(3, 5); + this.swapTexFl(3, 4); + } + + } + + public void orientTextureFl(int down) { + switch(down) { + case 0: + default: + break; + case 1: + this.swapTexFl(0, 1); + this.swapTexFl(4, 5); + this.texFlags ^= 112347; + break; + case 2: + this.swapTexFl(0, 2); + this.swapTexFl(1, 3); + this.swapTexFl(0, 4); + this.swapTexFl(1, 5); + this.texFlags ^= 217134; + break; + case 3: + this.swapTexFl(0, 3); + this.swapTexFl(1, 2); + this.swapTexFl(0, 4); + this.swapTexFl(1, 5); + this.texFlags ^= 188469; + break; + case 4: + this.swapTexFl(0, 4); + this.swapTexFl(1, 5); + this.swapTexFl(2, 3); + this.texFlags ^= 2944; + break; + case 5: + this.swapTexFl(0, 5); + this.swapTexFl(1, 4); + this.swapTexFl(0, 1); + this.texFlags ^= 3419; + } + + } + + public void orientTextureNew(int rv) { + IIcon[] texSrc = new IIcon[6]; + System.arraycopy(this.texIndexBox, 0, texSrc, 0, 6); + int[] rot = texRotTable[rv]; + int tfo = 0; + + for(int i = 0; i < 6; ++i) { + this.texIndexBox[i] = texSrc[rot[i]]; + tfo |= (this.texFlags >> rot[i] * 3 & 7) << i * 3; + } + + int t2 = (tfo & 37449) << 1 | (tfo & 74898) >> 1; + this.texFlags = rot[6] ^ tfo & rot[7] ^ t2 & rot[8]; + } + + public void flipTextures() { + this.swapTex(0, 1); + this.swapTex(2, 3); + this.swapTex(4, 5); + } + + public void renderBox(int sides, double x1, double y1, double z1, double x2, double y2, double z2) { + this.setSize(x1, y1, z1, x2, y2, z2); + this.setupBox(); + this.transformRotate(); + this.renderFaces(sides); + } + + public void doubleBox(int sides, double x1, double y1, double z1, double x2, double y2, double z2, double ino) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + this.renderBox(sides, x1, y1, z1, x2, y2, z2); + this.flipTextures(); + this.renderBox(s2, x2 - ino, y2 - ino, z2 - ino, x1 + ino, y1 + ino, z1 + ino); + } + + public void doLightLocal(int sides) { + for(int i = 0; i < this.corners.length; ++i) { + if ((sides & 1 << i) != 0) { + TexVertex c = this.corners[i][0]; + c.r = this.lightLocal[i] * this.tintR; + c.g = this.lightLocal[i] * this.tintG; + c.b = this.lightLocal[i] * this.tintB; + c.brtex = this.brightLocal[i]; + } + } + + } + + public void readGlobalLights(IBlockAccess iba, int i, int j, int k) { + Block block = iba.getBlock(i, j, k); + if (Minecraft.isAmbientOcclusionEnabled() && !this.forceFlat) { + for(int a = 0; a < 3; ++a) { + for(int b = 0; b < 3; ++b) { + for(int c = 0; c < 3; ++c) { + this.aoGlobal[a][b][c] = iba.getBlock(i + a - 1, j + b - 1, k + c - 1).getAmbientOcclusionLightValue(); + this.lightGlobal[a][b][c] = block.getMixedBrightnessForBlock(iba, i + a - 1, j + b - 1, k + c - 1); + } + } + } + + int t = 0; + if (iba.getBlock(i, j - 1, k - 1).getCanBlockGrass()) { + t |= 1; + } + + if (iba.getBlock(i, j - 1, k + 1).getCanBlockGrass()) { + t |= 2; + } + + if (iba.getBlock(i - 1, j - 1, k).getCanBlockGrass()) { + t |= 4; + } + + if (iba.getBlock(i + 1, j - 1, k).getCanBlockGrass()) { + t |= 8; + } + + if (iba.getBlock(i - 1, j, k - 1).getCanBlockGrass()) { + t |= 16; + } + + if (iba.getBlock(i - 1, j, k + 1).getCanBlockGrass()) { + t |= 32; + } + + if (iba.getBlock(i + 1, j, k - 1).getCanBlockGrass()) { + t |= 64; + } + + if (iba.getBlock(i + 1, j, k + 1).getCanBlockGrass()) { + t |= 128; + } + + if (iba.getBlock(i, j + 1, k - 1).getCanBlockGrass()) { + t |= 256; + } + + if (iba.getBlock(i, j + 1, k + 1).getCanBlockGrass()) { + t |= 512; + } + + if (iba.getBlock(i - 1, j + 1, k).getCanBlockGrass()) { + t |= 1024; + } + + if (iba.getBlock(i + 1, j + 1, k).getCanBlockGrass()) { + t |= 2048; + } + + this.globTrans = t; + } else { + this.lightFlat[0] = (float)block.getMixedBrightnessForBlock(iba, i, j - 1, k); + this.lightFlat[1] = (float)block.getMixedBrightnessForBlock(iba, i, j + 1, k); + this.lightFlat[2] = (float)block.getMixedBrightnessForBlock(iba, i, j, k - 1); + this.lightFlat[3] = (float)block.getMixedBrightnessForBlock(iba, i, j, k + 1); + this.lightFlat[4] = (float)block.getMixedBrightnessForBlock(iba, i - 1, j, k); + this.lightFlat[5] = (float)block.getMixedBrightnessForBlock(iba, i + 1, j, k); + } + + } + + public static int blendLight(int i, int j, int k, int l) { + if (j == 0) { + j = i; + } + + if (k == 0) { + k = i; + } + + if (l == 0) { + l = i; + } + + return i + j + k + l >> 2 & 16711935; + } + + private void lightSmoothFace(int fn) { + int ff = 0; + if (this.boxSize1.y > 0.0) { + ff |= 1; + } + + if (this.boxSize2.y < 1.0) { + ff |= 2; + } + + if (this.boxSize1.z > 0.0) { + ff |= 4; + } + + if (this.boxSize2.z < 1.0) { + ff |= 8; + } + + if (this.boxSize1.x > 0.0) { + ff |= 16; + } + + if (this.boxSize2.x < 1.0) { + ff |= 32; + } + + float gf2; + float gf3; + float gf4; + float gf1 = gf2 = gf3 = gf4 = this.aoGlobal[1][1][1]; + int gl2; + int gl3; + int gl4; + int gl1 = gl2 = gl3 = gl4 = this.lightGlobal[1][1][1]; + switch(fn) { + case 0: + if ((ff & 61) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[0][0][1]; + float ao4; + float ao3 = ao4 = this.aoGlobal[2][0][1]; + int lv2; + int lv1 = lv2 = this.lightGlobal[0][0][1]; + int lv4; + int lv3 = lv4 = this.lightGlobal[2][0][1]; + if ((this.globTrans & 5) > 0) { + ao1 = this.aoGlobal[0][0][0]; + lv1 = this.lightGlobal[0][0][0]; + } + + if ((this.globTrans & 6) > 0) { + ao2 = this.aoGlobal[0][0][2]; + lv2 = this.lightGlobal[0][0][2]; + } + + if ((this.globTrans & 9) > 0) { + ao3 = this.aoGlobal[2][0][0]; + lv3 = this.lightGlobal[2][0][0]; + } + + if ((this.globTrans & 10) > 0) { + ao4 = this.aoGlobal[2][0][2]; + lv4 = this.lightGlobal[2][0][2]; + } + + gf3 = 0.25F * (this.aoGlobal[1][0][1] + this.aoGlobal[1][0][0] + this.aoGlobal[0][0][1] + ao1); + gf4 = 0.25F * (this.aoGlobal[1][0][1] + this.aoGlobal[1][0][0] + this.aoGlobal[2][0][1] + ao3); + gf2 = 0.25F * (this.aoGlobal[1][0][1] + this.aoGlobal[1][0][2] + this.aoGlobal[0][0][1] + ao2); + gf1 = 0.25F * (this.aoGlobal[1][0][1] + this.aoGlobal[1][0][2] + this.aoGlobal[2][0][1] + ao4); + gl3 = blendLight(this.lightGlobal[1][0][1], this.lightGlobal[1][0][0], this.lightGlobal[0][0][1], lv1); + gl4 = blendLight(this.lightGlobal[1][0][1], this.lightGlobal[1][0][0], this.lightGlobal[2][0][1], lv3); + gl2 = blendLight(this.lightGlobal[1][0][1], this.lightGlobal[1][0][2], this.lightGlobal[0][0][1], lv2); + gl1 = blendLight(this.lightGlobal[1][0][1], this.lightGlobal[1][0][2], this.lightGlobal[2][0][1], lv4); + } + break; + case 1: + if ((ff & 62) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[0][2][1]; + float ao4; + float ao3 = ao4 = this.aoGlobal[2][2][1]; + int lv2; + int lv1 = lv2 = this.lightGlobal[0][2][1]; + int lv4; + int lv3 = lv4 = this.lightGlobal[2][2][1]; + if ((this.globTrans & 1280) > 0) { + ao1 = this.aoGlobal[0][2][0]; + lv1 = this.lightGlobal[0][2][0]; + } + + if ((this.globTrans & 1536) > 0) { + ao2 = this.aoGlobal[0][2][2]; + lv2 = this.lightGlobal[0][2][2]; + } + + if ((this.globTrans & 2304) > 0) { + ao3 = this.aoGlobal[2][2][0]; + lv3 = this.lightGlobal[2][2][0]; + } + + if ((this.globTrans & 2560) > 0) { + ao4 = this.aoGlobal[2][2][2]; + lv4 = this.lightGlobal[2][2][2]; + } + + gf2 = 0.25F * (this.aoGlobal[1][2][1] + this.aoGlobal[1][2][0] + this.aoGlobal[0][2][1] + ao1); + gf1 = 0.25F * (this.aoGlobal[1][2][1] + this.aoGlobal[1][2][0] + this.aoGlobal[2][2][1] + ao3); + gf3 = 0.25F * (this.aoGlobal[1][2][1] + this.aoGlobal[1][2][2] + this.aoGlobal[0][2][1] + ao2); + gf4 = 0.25F * (this.aoGlobal[1][2][1] + this.aoGlobal[1][2][2] + this.aoGlobal[2][2][1] + ao4); + gl2 = blendLight(this.lightGlobal[1][2][1], this.lightGlobal[1][2][0], this.lightGlobal[0][2][1], lv1); + gl1 = blendLight(this.lightGlobal[1][2][1], this.lightGlobal[1][2][0], this.lightGlobal[2][2][1], lv3); + gl3 = blendLight(this.lightGlobal[1][2][1], this.lightGlobal[1][2][2], this.lightGlobal[0][2][1], lv2); + gl4 = blendLight(this.lightGlobal[1][2][1], this.lightGlobal[1][2][2], this.lightGlobal[2][2][1], lv4); + } + break; + case 2: + if ((ff & 55) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[0][1][0]; + float ao4; + float ao3 = ao4 = this.aoGlobal[2][1][0]; + int lv2; + int lv1 = lv2 = this.lightGlobal[0][1][0]; + int lv4; + int lv3 = lv4 = this.lightGlobal[2][1][0]; + if ((this.globTrans & 17) > 0) { + ao1 = this.aoGlobal[0][0][0]; + lv1 = this.lightGlobal[0][0][0]; + } + + if ((this.globTrans & 272) > 0) { + ao2 = this.aoGlobal[0][2][0]; + lv2 = this.lightGlobal[0][2][0]; + } + + if ((this.globTrans & 65) > 0) { + ao3 = this.aoGlobal[2][0][0]; + lv3 = this.lightGlobal[2][0][0]; + } + + if ((this.globTrans & 320) > 0) { + ao4 = this.aoGlobal[2][2][0]; + lv4 = this.lightGlobal[2][2][0]; + } + + gf3 = 0.25F * (this.aoGlobal[1][1][0] + this.aoGlobal[1][0][0] + this.aoGlobal[0][1][0] + ao1); + gf4 = 0.25F * (this.aoGlobal[1][1][0] + this.aoGlobal[1][2][0] + this.aoGlobal[0][1][0] + ao2); + gf2 = 0.25F * (this.aoGlobal[1][1][0] + this.aoGlobal[1][0][0] + this.aoGlobal[2][1][0] + ao3); + gf1 = 0.25F * (this.aoGlobal[1][1][0] + this.aoGlobal[1][2][0] + this.aoGlobal[2][1][0] + ao4); + gl3 = blendLight(this.lightGlobal[1][1][0], this.lightGlobal[1][0][0], this.lightGlobal[0][1][0], lv1); + gl4 = blendLight(this.lightGlobal[1][1][0], this.lightGlobal[1][2][0], this.lightGlobal[0][1][0], lv2); + gl2 = blendLight(this.lightGlobal[1][1][0], this.lightGlobal[1][0][0], this.lightGlobal[2][1][0], lv3); + gl1 = blendLight(this.lightGlobal[1][1][0], this.lightGlobal[1][2][0], this.lightGlobal[2][1][0], lv4); + } + break; + case 3: + if ((ff & 59) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[0][1][2]; + float ao4; + float ao3 = ao4 = this.aoGlobal[2][1][2]; + int lv2; + int lv1 = lv2 = this.lightGlobal[0][1][2]; + int lv4; + int lv3 = lv4 = this.lightGlobal[2][1][2]; + if ((this.globTrans & 34) > 0) { + ao1 = this.aoGlobal[0][0][2]; + lv1 = this.lightGlobal[0][0][2]; + } + + if ((this.globTrans & 544) > 0) { + ao2 = this.aoGlobal[0][2][2]; + lv2 = this.lightGlobal[0][2][2]; + } + + if ((this.globTrans & 130) > 0) { + ao3 = this.aoGlobal[2][0][2]; + lv3 = this.lightGlobal[2][0][2]; + } + + if ((this.globTrans & 640) > 0) { + ao4 = this.aoGlobal[2][2][2]; + lv4 = this.lightGlobal[2][2][2]; + } + + gf2 = 0.25F * (this.aoGlobal[1][1][2] + this.aoGlobal[1][0][2] + this.aoGlobal[0][1][2] + ao1); + gf1 = 0.25F * (this.aoGlobal[1][1][2] + this.aoGlobal[1][2][2] + this.aoGlobal[0][1][2] + ao3); + gf3 = 0.25F * (this.aoGlobal[1][1][2] + this.aoGlobal[1][0][2] + this.aoGlobal[2][1][2] + ao2); + gf4 = 0.25F * (this.aoGlobal[1][1][2] + this.aoGlobal[1][2][2] + this.aoGlobal[2][1][2] + ao4); + gl2 = blendLight(this.lightGlobal[1][1][2], this.lightGlobal[1][0][2], this.lightGlobal[0][1][2], lv1); + gl1 = blendLight(this.lightGlobal[1][1][2], this.lightGlobal[1][2][2], this.lightGlobal[0][1][2], lv2); + gl3 = blendLight(this.lightGlobal[1][1][2], this.lightGlobal[1][0][2], this.lightGlobal[2][1][2], lv3); + gl4 = blendLight(this.lightGlobal[1][1][2], this.lightGlobal[1][2][2], this.lightGlobal[2][1][2], lv4); + } + break; + case 4: + if ((ff & 31) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[0][1][0]; + float ao4; + float ao3 = ao4 = this.aoGlobal[0][1][2]; + int lv2; + int lv1 = lv2 = this.lightGlobal[0][1][0]; + int lv4; + int lv3 = lv4 = this.lightGlobal[0][1][2]; + if ((this.globTrans & 20) > 0) { + ao1 = this.aoGlobal[0][0][0]; + lv1 = this.lightGlobal[0][0][0]; + } + + if ((this.globTrans & 1040) > 0) { + ao2 = this.aoGlobal[0][2][0]; + lv2 = this.lightGlobal[0][2][0]; + } + + if ((this.globTrans & 36) > 0) { + ao3 = this.aoGlobal[0][0][2]; + lv3 = this.lightGlobal[0][0][2]; + } + + if ((this.globTrans & 1056) > 0) { + ao4 = this.aoGlobal[0][2][2]; + lv4 = this.lightGlobal[0][2][2]; + } + + gf2 = 0.25F * (this.aoGlobal[0][1][1] + this.aoGlobal[0][0][1] + this.aoGlobal[0][1][0] + ao1); + gf1 = 0.25F * (this.aoGlobal[0][1][1] + this.aoGlobal[0][2][1] + this.aoGlobal[0][1][0] + ao2); + gf3 = 0.25F * (this.aoGlobal[0][1][1] + this.aoGlobal[0][0][1] + this.aoGlobal[0][1][2] + ao3); + gf4 = 0.25F * (this.aoGlobal[0][1][1] + this.aoGlobal[0][2][1] + this.aoGlobal[0][1][2] + ao4); + gl2 = blendLight(this.lightGlobal[0][1][1], this.lightGlobal[0][0][1], this.lightGlobal[0][1][0], lv1); + gl1 = blendLight(this.lightGlobal[0][1][1], this.lightGlobal[0][2][1], this.lightGlobal[0][1][0], lv2); + gl3 = blendLight(this.lightGlobal[0][1][1], this.lightGlobal[0][0][1], this.lightGlobal[0][1][2], lv3); + gl4 = blendLight(this.lightGlobal[0][1][1], this.lightGlobal[0][2][1], this.lightGlobal[0][1][2], lv4); + } + break; + default: + if ((ff & 47) <= 0) { + float ao2; + float ao1 = ao2 = this.aoGlobal[2][1][0]; + float ao4; + float ao3 = ao4 = this.aoGlobal[2][1][2]; + int lv2; + int lv1 = lv2 = this.lightGlobal[2][1][0]; + int lv4; + int lv3 = lv4 = this.lightGlobal[2][1][2]; + if ((this.globTrans & 72) > 0) { + ao1 = this.aoGlobal[2][0][0]; + lv1 = this.lightGlobal[2][0][0]; + } + + if ((this.globTrans & 2112) > 0) { + ao2 = this.aoGlobal[2][2][0]; + lv2 = this.lightGlobal[2][2][0]; + } + + if ((this.globTrans & 136) > 0) { + ao3 = this.aoGlobal[2][0][2]; + lv3 = this.lightGlobal[2][0][2]; + } + + if ((this.globTrans & 2176) > 0) { + ao4 = this.aoGlobal[2][2][2]; + lv4 = this.lightGlobal[2][2][2]; + } + + gf3 = 0.25F * (this.aoGlobal[2][1][1] + this.aoGlobal[2][0][1] + this.aoGlobal[2][1][0] + ao1); + gf4 = 0.25F * (this.aoGlobal[2][1][1] + this.aoGlobal[2][2][1] + this.aoGlobal[2][1][0] + ao2); + gf2 = 0.25F * (this.aoGlobal[2][1][1] + this.aoGlobal[2][0][1] + this.aoGlobal[2][1][2] + ao3); + gf1 = 0.25F * (this.aoGlobal[2][1][1] + this.aoGlobal[2][2][1] + this.aoGlobal[2][1][2] + ao4); + gl3 = blendLight(this.lightGlobal[2][1][1], this.lightGlobal[2][0][1], this.lightGlobal[2][1][0], lv1); + gl4 = blendLight(this.lightGlobal[2][1][1], this.lightGlobal[2][2][1], this.lightGlobal[2][1][0], lv2); + gl2 = blendLight(this.lightGlobal[2][1][1], this.lightGlobal[2][0][1], this.lightGlobal[2][1][2], lv3); + gl1 = blendLight(this.lightGlobal[2][1][1], this.lightGlobal[2][2][1], this.lightGlobal[2][1][2], lv4); + } + } + + TexVertex c = this.corners[fn][0]; + float fc = this.lightLocal[fn] * gf1; + c.r = fc * this.tintR; + c.g = fc * this.tintG; + c.b = fc * this.tintB; + c.brtex = gl1; + c = this.corners[fn][1]; + fc = this.lightLocal[fn] * gf2; + c.r = fc * this.tintR; + c.g = fc * this.tintG; + c.b = fc * this.tintB; + c.brtex = gl2; + c = this.corners[fn][2]; + fc = this.lightLocal[fn] * gf3; + c.r = fc * this.tintR; + c.g = fc * this.tintG; + c.b = fc * this.tintB; + c.brtex = gl3; + c = this.corners[fn][3]; + fc = this.lightLocal[fn] * gf4; + c.r = fc * this.tintR; + c.g = fc * this.tintG; + c.b = fc * this.tintB; + c.brtex = gl4; + } + + public void doLightSmooth(int sides) { + for(int i = 0; i < 6; ++i) { + if ((sides & 1 << i) != 0) { + this.lightSmoothFace(i); + } + } + + } + + private void doLightFlat(int sides) { + for(int i = 0; i < this.corners.length; ++i) { + if ((sides & 1 << i) != 0) { + TexVertex c = this.corners[i][0]; + c.r = this.lightFlat[i] * this.lightLocal[i] * this.tintR; + c.g = this.lightFlat[i] * this.lightLocal[i] * this.tintG; + c.b = this.lightFlat[i] * this.lightLocal[i] * this.tintB; + c.brtex = this.brightLocal[i]; + } + } + + } + + public void renderFlat(int sides) { + Tessellator tess = Tessellator.instance; + + for(int i = 0; i < this.corners.length; ++i) { + if ((sides & 1 << i) != 0) { + TexVertex c = this.corners[i][0]; + tess.setColorOpaque_F(c.r, c.g, c.b); + if (this.useNormal) { + Vector3 v = this.vertices[c.vtx]; + c = this.corners[i][1]; + Vector3 v1 = new Vector3(this.vertices[c.vtx]); + c = this.corners[i][2]; + Vector3 v2 = new Vector3(this.vertices[c.vtx]); + v1.subtract(v); + v2.subtract(v); + v1.crossProduct(v2); + v1.normalize(); + tess.setNormal((float)v1.x, (float)v1.y, (float)v1.z); + } else { + tess.setBrightness(c.brtex); + } + + for(int j = 0; j < 4; ++j) { + c = this.corners[i][j]; + Vector3 v = this.vertices[c.vtx]; + tess.addVertexWithUV(v.x, v.y, v.z, c.u, c.v); + } + } + } + + } + + public void renderRangeFlat(int st, int ed) { + Tessellator tess = Tessellator.instance; + + for(int i = st; i < ed; ++i) { + TexVertex c = this.corners[i][0]; + tess.setColorRGBA_F(c.r * this.tintR, c.g * this.tintG, c.b * this.tintB, this.tintA); + if (this.useNormal) { + Vector3 v = this.vertices[c.vtx]; + c = this.corners[i][1]; + Vector3 var8 = new Vector3(this.vertices[c.vtx]); + c = this.corners[i][2]; + Vector3 var9 = new Vector3(this.vertices[c.vtx]); + var8.subtract(v); + var9.subtract(v); + var8.crossProduct(var9); + var8.normalize(); + tess.setNormal((float)var8.x, (float)var8.y, (float)var8.z); + } else { + tess.setBrightness(c.brtex); + } + + for(int j = 0; j < 4; ++j) { + c = this.corners[i][j]; + Vector3 v = this.vertices[c.vtx]; + tess.addVertexWithUV(v.x, v.y, v.z, c.u, c.v); + } + } + + } + + public void renderAlpha(int sides, float alpha) { + Tessellator tess = Tessellator.instance; + + for(int i = 0; i < this.corners.length; ++i) { + if ((sides & 1 << i) != 0) { + TexVertex c = this.corners[i][0]; + tess.setColorRGBA_F(c.r, c.g, c.b, alpha); + if (!this.useNormal) { + tess.setBrightness(c.brtex); + } + + for(int j = 0; j < 4; ++j) { + c = this.corners[i][j]; + Vector3 v = this.vertices[c.vtx]; + tess.addVertexWithUV(v.x, v.y, v.z, c.u, c.v); + } + } + } + + } + + public void renderSmooth(int sides) { + Tessellator tess = Tessellator.instance; + + for(int i = 0; i < this.corners.length; ++i) { + if ((sides & 1 << i) != 0) { + for(int j = 0; j < 4; ++j) { + TexVertex c = this.corners[i][j]; + tess.setColorOpaque_F(c.r, c.g, c.b); + if (!this.useNormal) { + tess.setBrightness(c.brtex); + } + + Vector3 v = this.vertices[c.vtx]; + tess.addVertexWithUV(v.x, v.y, v.z, c.u, c.v); + } + } + } + + } + + public void renderFaces(int faces) { + this.doMappingBox(faces); + this.doLightLocal(faces); + this.renderFlat(faces); + } + + public void renderGlobFaces(int faces) { + this.doMappingBox(faces); + this.doLightLocal(faces); + if (Minecraft.isAmbientOcclusionEnabled() && !this.forceFlat) { + this.doLightSmooth(faces); + this.renderSmooth(faces); + } else { + this.doLightFlat(faces); + this.renderFlat(faces); + } + + } + + public void drawPoints(int... points) { + Tessellator tess = Tessellator.instance; + + for(int p : points) { + Vector3 vec = this.vertices[p]; + tess.addVertex(vec.x, vec.y, vec.z); + } + + } + + public void bindModel(RenderModel model) { + this.vertices = new Vector3[model.vertices.length]; + + for(int i = 0; i < this.vertices.length; ++i) { + Vector3 v = new Vector3(model.vertices[i]); + this.basis.rotate(v); + v.add(this.globalOrigin); + this.vertices[i] = v; + } + + this.corners = model.texs; + this.boundModel = model; + } + + public void bindModelOffset(RenderModel model, double ofx, double ofy, double ofz) { + this.vertices = new Vector3[model.vertices.length]; + + for(int i = 0; i < this.vertices.length; ++i) { + Vector3 v = new Vector3(model.vertices[i]); + v.add(this.localOffset.x - ofx, this.localOffset.y - ofy, this.localOffset.z - ofz); + this.basis.rotate(v); + v.add(ofx, ofy, ofz); + v.add(this.globalOrigin); + this.vertices[i] = v; + } + + this.corners = model.texs; + this.boundModel = model; + } + + public void renderModelGroup(int gr, int sgr) { + for(TexVertex[] corner : this.corners) { + TexVertex c = corner[0]; + c.brtex = this.brightLocal[0]; + } + + this.renderRangeFlat(this.boundModel.groups[gr][sgr][0], this.boundModel.groups[gr][sgr][1]); + } + + public void renderModel(RenderModel model) { + this.bindModel(model); + + for(int i = 0; i < this.corners.length; ++i) { + TexVertex c = this.corners[i][0]; + c.brtex = this.brightLocal[0]; + } + + this.renderRangeFlat(0, this.corners.length); + } + + public RenderContext() { + for(int i = 0; i < 8; ++i) { + this.verticesBox[i] = new Vector3(); + } + + int[][] vtxl = new int[][]{{7, 6, 5, 4}, {0, 1, 2, 3}, {0, 4, 5, 1}, {2, 6, 7, 3}, {1, 5, 6, 2}, {3, 7, 4, 0}}; + + for(int i = 0; i < 6; ++i) { + for(int j = 0; j < 4; ++j) { + this.cornersBox[i][j] = new TexVertex(); + this.cornersBox[i][j].vtx = vtxl[i][j]; + } + } + + this.setDefaults(); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderCovers.java b/src/main/java/com/eloraam/redpower/core/RenderCovers.java new file mode 100644 index 0000000..2bec824 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderCovers.java @@ -0,0 +1,20 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; + +@SideOnly(Side.CLIENT) +public abstract class RenderCovers extends RenderCustomBlock { + protected CoverRenderer coverRenderer; + protected RenderContext context = new RenderContext(); + + public RenderCovers(Block block) { + super(block); + this.coverRenderer = new CoverRenderer(this.context); + } + + public void renderCovers(int uc, short[] covs) { + this.coverRenderer.render(uc, covs); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderCustomBlock.java b/src/main/java/com/eloraam/redpower/core/RenderCustomBlock.java new file mode 100644 index 0000000..2e891b9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderCustomBlock.java @@ -0,0 +1,214 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.client.particle.EntityDiggingFX; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; + +@SideOnly(Side.CLIENT) +public abstract class RenderCustomBlock extends TileEntitySpecialRenderer implements IItemRenderer { + protected Block block; + + public RenderCustomBlock(Block block) { + this.block = block; + } + + protected int getMixedBrightness(TileEntity tile) { + return tile.getBlockType().getMixedBrightnessForBlock(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); + } + + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + } + + public boolean renderHit(EffectRenderer effectRenderer, World world, MovingObjectPosition target, int x, int y, int z, int side, int meta) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null && tile instanceof TileCoverable) { + TileCoverable coverable = (TileCoverable)tile; + Block block = coverable.getBlockType(); + int cvr = coverable.getCover(target.subHit); + if (cvr >= 0) { + Block bl = CoverLib.getBlock(cvr & 0xFF); + int m = CoverLib.getMeta(cvr & 0xFF); + if (bl != null && bl != Blocks.air) { + float f = 0.1F; + double dx = (double)x + + world.rand.nextDouble() * (block.getBlockBoundsMaxX() - block.getBlockBoundsMinX() - (double)(f * 2.0F)) + + (double)f + + block.getBlockBoundsMinX(); + double dy = (double)y + + world.rand.nextDouble() * (block.getBlockBoundsMaxY() - block.getBlockBoundsMinY() - (double)(f * 2.0F)) + + (double)f + + block.getBlockBoundsMinY(); + double dz = (double)z + + world.rand.nextDouble() * (block.getBlockBoundsMaxZ() - block.getBlockBoundsMinZ() - (double)(f * 2.0F)) + + (double)f + + block.getBlockBoundsMinZ(); + switch(side) { + case 0: + dy = (double)y + block.getBlockBoundsMinY() - (double)f; + break; + case 1: + dy = (double)y + block.getBlockBoundsMaxY() + (double)f; + break; + case 2: + dz = (double)z + block.getBlockBoundsMinZ() - (double)f; + break; + case 3: + dz = (double)z + block.getBlockBoundsMaxZ() + (double)f; + break; + case 4: + dx = (double)x + block.getBlockBoundsMinX() - (double)f; + break; + case 5: + dx = (double)x + block.getBlockBoundsMaxX() + (double)f; + } + + effectRenderer.addEffect( + new EntityDiggingFX(world, dx, dy, dz, 0.0, 0.0, 0.0, bl, m, target.sideHit).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F) + ); + } + + return true; + } + } + + if (tile != null) { + float f = 0.1F; + double dx = (double)x + + world.rand.nextDouble() * (this.block.getBlockBoundsMaxX() - this.block.getBlockBoundsMinX() - (double)(f * 2.0F)) + + (double)f + + this.block.getBlockBoundsMinX(); + double dy = (double)y + + world.rand.nextDouble() * (this.block.getBlockBoundsMaxY() - this.block.getBlockBoundsMinY() - (double)(f * 2.0F)) + + (double)f + + this.block.getBlockBoundsMinY(); + double dz = (double)z + + world.rand.nextDouble() * (this.block.getBlockBoundsMaxZ() - this.block.getBlockBoundsMinZ() - (double)(f * 2.0F)) + + (double)f + + this.block.getBlockBoundsMinZ(); + switch(side) { + case 0: + dy = (double)y + this.block.getBlockBoundsMinY() - (double)f; + break; + case 1: + dy = (double)y + this.block.getBlockBoundsMaxY() + (double)f; + break; + case 2: + dz = (double)z + this.block.getBlockBoundsMinZ() - (double)f; + break; + case 3: + dz = (double)z + this.block.getBlockBoundsMaxZ() + (double)f; + break; + case 4: + dx = (double)x + this.block.getBlockBoundsMinX() - (double)f; + break; + case 5: + dx = (double)x + this.block.getBlockBoundsMaxX() + (double)f; + } + + int color = this.getParticleColorForSide(world, x, y, z, tile, side, meta); + IIcon icon = this.getParticleIconForSide(world, x, y, z, tile, side, meta); + if (icon != null) { + effectRenderer.addEffect( + new EntityCustomDiggingFX(world, dx, dy, dz, 0.0, 0.0, 0.0, icon, color).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F) + ); + } + + return true; + } else { + return false; + } + } + + public boolean renderDestroy(EffectRenderer effectRenderer, World world, int x, int y, int z, int meta) { + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + TileEntity tile = world.getTileEntity(x, y, z); + MovingObjectPosition target = Minecraft.getMinecraft().thePlayer.rayTrace(5.0, 1.0F); + if (tile != null && tile instanceof TileCoverable && target != null && target.blockX == x && target.blockY == y && target.blockZ == z) { + TileCoverable coverable = (TileCoverable)tile; + int cvr = coverable.getCover(target.subHit); + if (cvr >= 0) { + Block bl = CoverLib.getBlock(cvr & 0xFF); + int m = CoverLib.getMeta(cvr & 0xFF); + if (bl != null && bl != Blocks.air) { + byte offset = 4; + + for(int xoff = 0; xoff < offset; ++xoff) { + for(int yoff = 0; yoff < offset; ++yoff) { + for(int zoff = 0; zoff < offset; ++zoff) { + double xc = (double)x + ((double)xoff + 0.5) / (double)offset; + double yc = (double)y + ((double)yoff + 0.5) / (double)offset; + double zc = (double)z + ((double)zoff + 0.5) / (double)offset; + effectRenderer.addEffect( + new EntityDiggingFX(world, xc, yc, zc, xc - (double)x - 0.5, yc - (double)y - 0.5, zc - (double)z - 0.5, bl, m, target.sideHit) + ); + } + } + } + } + + return true; + } + } + + if (tile == null) { + return false; + } else { + byte offset = 4; + + for(int xoff = 0; xoff < offset; ++xoff) { + for(int yoff = 0; yoff < offset; ++yoff) { + for(int zoff = 0; zoff < offset; ++zoff) { + double xc = (double)x + ((double)xoff + 0.5) / (double)offset; + double yc = (double)y + ((double)yoff + 0.5) / (double)offset; + double zc = (double)z + ((double)zoff + 0.5) / (double)offset; + int side = world.rand.nextInt(6); + int color = this.getParticleColorForSide(world, x, y, z, tile, side, meta); + IIcon icon = this.getParticleIconForSide(world, x, y, z, tile, side, meta); + if (icon != null) { + effectRenderer.addEffect( + new EntityCustomDiggingFX(world, xc, yc, zc, xc - (double)x - 0.5, yc - (double)y - 0.5, zc - (double)z - 0.5, icon, color) + ); + } + } + } + } + + return true; + } + } + + protected IIcon getParticleIconForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + return null; + } + + protected int getParticleColorForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + return 16777215; + } + + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderEvents.java b/src/main/java/com/eloraam/redpower/core/RenderEvents.java new file mode 100644 index 0000000..bf6ed38 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderEvents.java @@ -0,0 +1,4 @@ +package com.eloraam.redpower.core; + +public class RenderEvents { +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderHighlight.java b/src/main/java/com/eloraam/redpower/core/RenderHighlight.java new file mode 100644 index 0000000..89d58b2 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderHighlight.java @@ -0,0 +1,298 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.ReflectionHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.DestroyBlockProgress; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.client.event.TextureStitchEvent.Post; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderHighlight { + private RenderContext context = new RenderContext(); + private CoverRenderer coverRenderer = new CoverRenderer(this.context); + private IIcon[] destroyIcons; + + @SubscribeEvent + public void onTextureStitchEventPost(Post evt) { + if (evt.map.getTextureType() == 0) { + CoverRenderer.reInitIcons(); + } + + this.destroyIcons = (IIcon[])ReflectionHelper.getPrivateValue( + RenderGlobal.class, Minecraft.getMinecraft().renderGlobal, new String[]{"destroyBlockIcons", "field_94141_F"} + ); + } + + @SubscribeEvent + public void highlightEvent(DrawBlockHighlightEvent evt) { + this.onBlockHighlight(evt.context, evt.player, evt.target, evt.subID, evt.currentItem, evt.partialTicks); + } + + public boolean onBlockHighlight(RenderGlobal render, EntityPlayer pl, MovingObjectPosition mop, int subID, ItemStack ist, float partialTicks) { + World world = pl.worldObj; + Block bl = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + Map damagedBlocks = (Map)ReflectionHelper.getPrivateValue( + RenderGlobal.class, render, new String[]{"damagedBlocks", "field_72738_E"} + ); + if (bl instanceof BlockMultipart) { + BlockMultipart bm = (BlockMultipart)bl; + bm.setPartBounds(pl.worldObj, mop.blockX, mop.blockY, mop.blockZ, mop.subHit); + } + + if (!damagedBlocks.isEmpty()) { + for(DestroyBlockProgress dbp : damagedBlocks.values()) { + if (dbp.getPartialBlockX() == mop.blockX && dbp.getPartialBlockY() == mop.blockY && dbp.getPartialBlockZ() == mop.blockZ) { + if (bl instanceof BlockExtended) { + this.drawBreaking(pl.worldObj, render, (BlockExtended)bl, pl, mop, partialTicks, dbp.getPartialBlockDamage()); + return true; + } + break; + } + } + } + + if (ist == null || CoverLib.blockCoverPlate == null || ist.getItem() != Item.getItemFromBlock(CoverLib.blockCoverPlate)) { + return false; + } else if (mop.typeOfHit != MovingObjectType.BLOCK) { + return false; + } else { + MovingObjectPosition placement; + switch(ist.getItemDamage() >> 8) { + case 0: + case 16: + case 17: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + case 34: + case 39: + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + this.drawSideBox(world, pl, mop, partialTicks); + placement = CoverLib.getPlacement(world, mop, ist.getItemDamage()); + if (placement != null) { + this.drawPreview(pl, placement, partialTicks, ist.getItemDamage()); + } + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + default: + return false; + case 18: + case 19: + case 20: + case 35: + case 36: + case 37: + case 38: + this.drawCornerBox(world, pl, mop, partialTicks); + placement = CoverLib.getPlacement(world, mop, ist.getItemDamage()); + if (placement != null) { + this.drawPreview(pl, placement, partialTicks, ist.getItemDamage()); + } + } + + return true; + } + } + + private void setRawPos(EntityPlayer player, MovingObjectPosition mop, float partialTicks) { + double dx = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)partialTicks; + double dy = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)partialTicks; + double dz = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)partialTicks; + this.context.setPos((double)mop.blockX - dx, (double)mop.blockY - dy, (double)mop.blockZ - dz); + } + + private void setCollPos(EntityPlayer player, MovingObjectPosition mop, float partialTicks) { + this.setRawPos(player, mop, partialTicks); + switch(mop.sideHit) { + case 0: + this.context.setRelPos(0.0, mop.hitVec.yCoord - (double)mop.blockY, 0.0); + break; + case 1: + this.context.setRelPos(0.0, (double)mop.blockY - mop.hitVec.yCoord + 1.0, 0.0); + break; + case 2: + this.context.setRelPos(0.0, mop.hitVec.zCoord - (double)mop.blockZ, 0.0); + break; + case 3: + this.context.setRelPos(0.0, (double)mop.blockZ - mop.hitVec.zCoord + 1.0, 0.0); + break; + case 4: + this.context.setRelPos(0.0, mop.hitVec.xCoord - (double)mop.blockX, 0.0); + break; + default: + this.context.setRelPos(0.0, (double)mop.blockX - mop.hitVec.xCoord + 1.0, 0.0); + } + + } + + public void drawCornerBox(World world, EntityPlayer player, MovingObjectPosition mop, float partialTicks) { + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.9F); + GL11.glLineWidth(3.0F); + GL11.glDisable(3553); + GL11.glDepthMask(false); + float var5 = 0.002F; + float var6 = 0.25F; + Block bl = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + if (bl != Blocks.air) { + this.context.setSize(0.0, (double)(-var5), 0.0, 1.0, (double)(-var5), 1.0); + this.context.setupBox(); + this.context.vertices[4].set(0.0, (double)(-var5), 0.5); + this.context.vertices[5].set(1.0, (double)(-var5), 0.5); + this.context.vertices[6].set(0.5, (double)(-var5), 0.0); + this.context.vertices[7].set(0.5, (double)(-var5), 1.0); + this.context.setOrientation(mop.sideHit, 0); + this.setCollPos(player, mop, partialTicks); + this.context.transformRotate(); + Tessellator.instance.startDrawing(3); + this.context.drawPoints(0, 1, 2, 3, 0); + Tessellator.instance.draw(); + Tessellator.instance.startDrawing(1); + this.context.drawPoints(4, 5, 6, 7); + Tessellator.instance.draw(); + } + + GL11.glDepthMask(true); + GL11.glEnable(3553); + GL11.glDisable(3042); + this.context.setRelPos(0.0, 0.0, 0.0); + } + + public void drawSideBox(World world, EntityPlayer player, MovingObjectPosition mop, float partialTicks) { + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.9F); + GL11.glLineWidth(3.0F); + GL11.glDisable(3553); + GL11.glDepthMask(false); + float var5 = 0.002F; + float var6 = 0.25F; + Block bl = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); + if (bl != Blocks.air) { + this.context.setSize(0.0, (double)(-var5), 0.0, 1.0, (double)(-var5), 1.0); + this.context.setupBox(); + this.context.vertices[4].set((double)(1.0F - var6), (double)(-var5), (double)var6); + this.context.vertices[5].set((double)var6, (double)(-var5), (double)var6); + this.context.vertices[6].set((double)var6, (double)(-var5), (double)(1.0F - var6)); + this.context.vertices[7].set((double)(1.0F - var6), (double)(-var5), (double)(1.0F - var6)); + this.context.setOrientation(mop.sideHit, 0); + this.setCollPos(player, mop, partialTicks); + this.context.transformRotate(); + Tessellator.instance.startDrawing(3); + this.context.drawPoints(0, 1, 2, 3, 0); + Tessellator.instance.draw(); + Tessellator.instance.startDrawing(3); + this.context.drawPoints(4, 5, 6, 7, 4); + Tessellator.instance.draw(); + Tessellator.instance.startDrawing(1); + this.context.drawPoints(0, 4, 1, 5, 2, 6, 3, 7); + Tessellator.instance.draw(); + } + + GL11.glDepthMask(true); + GL11.glEnable(3553); + GL11.glDisable(3042); + this.context.setRelPos(0.0, 0.0, 0.0); + } + + public void drawBreaking(World world, RenderGlobal render, BlockExtended bl, EntityPlayer pl, MovingObjectPosition mop, float partialTicks, int destroyStage) { + GL11.glEnable(3042); + GL11.glBlendFunc(774, 768); + this.context.bindBlockTexture(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GL11.glPolygonOffset(-3.0F, -3.0F); + GL11.glEnable(32823); + double dx = pl.lastTickPosX + (pl.posX - pl.lastTickPosX) * (double)partialTicks; + double dy = pl.lastTickPosY + (pl.posY - pl.lastTickPosY) * (double)partialTicks; + double dz = pl.lastTickPosZ + (pl.posZ - pl.lastTickPosZ) * (double)partialTicks; + GL11.glEnable(3008); + this.context.setPos((double)mop.blockX - dx, (double)mop.blockY - dy, (double)mop.blockZ - dz); + this.context.setIcon(this.destroyIcons[destroyStage]); + Tessellator.instance.startDrawingQuads(); + this.context + .setSize( + bl.getBlockBoundsMinX(), + bl.getBlockBoundsMinY(), + bl.getBlockBoundsMinZ(), + bl.getBlockBoundsMaxX(), + bl.getBlockBoundsMaxY(), + bl.getBlockBoundsMaxZ() + ); + this.context.setupBox(); + this.context.transform(); + this.context.renderFaces(63); + Tessellator.instance.draw(); + GL11.glPolygonOffset(0.0F, 0.0F); + GL11.glDisable(32823); + } + + public void drawPreview(EntityPlayer pl, MovingObjectPosition mop, float partialTicks, int md) { + this.setRawPos(pl, mop, partialTicks); + this.context.bindBlockTexture(); + this.coverRenderer.start(); + this.coverRenderer.setupCorners(); + this.coverRenderer.setSize(mop.subHit, CoverLib.getThickness(mop.subHit, CoverLib.damageToCoverValue(md))); + this.context.setIcon(CoverRenderer.coverIcons[md & 0xFF]); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + GL11.glDepthMask(false); + GL11.glPolygonOffset(-3.0F, -3.0F); + GL11.glEnable(32823); + Tessellator.instance.startDrawingQuads(); + this.context.setupBox(); + this.context.transform(); + this.context.doMappingBox(63); + this.context.doLightLocal(63); + this.context.renderAlpha(63, 0.8F); + Tessellator.instance.draw(); + GL11.glDisable(32823); + GL11.glDepthMask(true); + GL11.glDisable(3042); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderLib.java b/src/main/java/com/eloraam/redpower/core/RenderLib.java new file mode 100644 index 0000000..5bdb438 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderLib.java @@ -0,0 +1,264 @@ +package com.eloraam.redpower.core; + +import java.util.function.Function; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; +import org.lwjgl.opengl.GL11; + +public class RenderLib { + private static RenderLib.RenderListEntry[] renderers = new RenderLib.RenderListEntry[4096]; + + public static void renderSpecialLever(Vector3 pos, Quat rot, IIcon foundation, IIcon lever) { + Vector3[] pl = new Vector3[8]; + float f8 = 0.0625F; + float f9 = 0.0625F; + float f10 = 0.375F; + pl[0] = new Vector3((double)(-f8), 0.0, (double)(-f9)); + pl[1] = new Vector3((double)f8, 0.0, (double)(-f9)); + pl[2] = new Vector3((double)f8, 0.0, (double)f9); + pl[3] = new Vector3((double)(-f8), 0.0, (double)f9); + pl[4] = new Vector3((double)(-f8), (double)f10, (double)(-f9)); + pl[5] = new Vector3((double)f8, (double)f10, (double)(-f9)); + pl[6] = new Vector3((double)f8, (double)f10, (double)f9); + pl[7] = new Vector3((double)(-f8), (double)f10, (double)f9); + + for(int i = 0; i < 8; ++i) { + rot.rotate(pl[i]); + pl[i].add(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5); + } + + float uMin = foundation.getMinU(); + float uMax = foundation.getMaxU(); + float vMin = foundation.getMinV(); + float vMax = foundation.getMaxV(); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + addVectWithUV(pl[0], (double)uMin, (double)vMax); + addVectWithUV(pl[1], (double)uMax, (double)vMax); + addVectWithUV(pl[2], (double)uMax, (double)vMin); + addVectWithUV(pl[3], (double)uMin, (double)vMin); + addVectWithUV(pl[7], (double)uMin, (double)vMax); + addVectWithUV(pl[6], (double)uMax, (double)vMax); + addVectWithUV(pl[5], (double)uMax, (double)vMin); + addVectWithUV(pl[4], (double)uMin, (double)vMin); + uMin = lever.getMinU(); + uMax = lever.getMaxU(); + vMin = lever.getMinV(); + vMax = lever.getMaxV(); + addVectWithUV(pl[1], (double)uMin, (double)vMax); + addVectWithUV(pl[0], (double)uMax, (double)vMax); + addVectWithUV(pl[4], (double)uMax, (double)vMin); + addVectWithUV(pl[5], (double)uMin, (double)vMin); + addVectWithUV(pl[2], (double)uMin, (double)vMax); + addVectWithUV(pl[1], (double)uMax, (double)vMax); + addVectWithUV(pl[5], (double)uMax, (double)vMin); + addVectWithUV(pl[6], (double)uMin, (double)vMin); + addVectWithUV(pl[3], (double)uMin, (double)vMax); + addVectWithUV(pl[2], (double)uMax, (double)vMax); + addVectWithUV(pl[6], (double)uMax, (double)vMin); + addVectWithUV(pl[7], (double)uMin, (double)vMin); + addVectWithUV(pl[0], (double)uMin, (double)vMax); + addVectWithUV(pl[3], (double)uMax, (double)vMax); + addVectWithUV(pl[7], (double)uMax, (double)vMin); + addVectWithUV(pl[4], (double)uMin, (double)vMin); + } + + public static void addVectWithUV(Vector3 vect, double u, double v) { + Tessellator tess = Tessellator.instance; + tess.addVertexWithUV(vect.x, vect.y, vect.z, u, v); + } + + public static void renderPointer(Vector3 pos, Quat rot) { + Tessellator tess = Tessellator.instance; + IIcon icon = Blocks.stone.getIcon(0, 0); + double uMin = (double)icon.getMinU(); + double vMin = (double)icon.getMinV(); + double uMax = (double)icon.getInterpolatedU(7.9) - uMin; + double vMax = (double)icon.getInterpolatedV(0.12432) - vMin; + tess.setColorOpaque_F(0.9F, 0.9F, 0.9F); + Vector3[] vecs = new Vector3[]{ + new Vector3(0.4, 0.0, 0.0), + new Vector3(0.0, 0.0, 0.2), + new Vector3(-0.2, 0.0, 0.0), + new Vector3(0.0, 0.0, -0.2), + new Vector3(0.4, 0.1, 0.0), + new Vector3(0.0, 0.1, 0.2), + new Vector3(-0.2, 0.1, 0.0), + new Vector3(0.0, 0.1, -0.2) + }; + + for(int i = 0; i < 8; ++i) { + rot.rotate(vecs[i]); + vecs[i].add(pos); + } + + addVectWithUV(vecs[0], uMin, vMin); + addVectWithUV(vecs[1], uMin + uMax, vMin); + addVectWithUV(vecs[2], uMin + uMax, vMin + uMax); + addVectWithUV(vecs[3], uMin, vMin + uMax); + addVectWithUV(vecs[4], uMin, vMin); + addVectWithUV(vecs[7], uMin, vMin + uMax); + addVectWithUV(vecs[6], uMin + uMax, vMin + uMax); + addVectWithUV(vecs[5], uMin + uMax, vMin); + tess.setColorOpaque_F(0.6F, 0.6F, 0.6F); + addVectWithUV(vecs[0], uMin + vMax, vMin); + addVectWithUV(vecs[4], uMin, vMin); + addVectWithUV(vecs[5], uMin, vMin + uMax); + addVectWithUV(vecs[1], uMin + vMax, vMin + uMax); + addVectWithUV(vecs[0], uMin, vMin + vMax); + addVectWithUV(vecs[3], uMin + uMax, vMin + vMax); + addVectWithUV(vecs[7], uMin + uMax, vMin); + addVectWithUV(vecs[4], uMin, vMin); + addVectWithUV(vecs[2], uMin + uMax, vMin + uMax - vMax); + addVectWithUV(vecs[6], uMin + uMax, vMin + uMax); + addVectWithUV(vecs[7], uMin, vMin + uMax); + addVectWithUV(vecs[3], uMin, vMin + uMax - vMax); + addVectWithUV(vecs[2], uMin + uMax, vMin + uMax - vMax); + addVectWithUV(vecs[1], uMin, vMin + uMax - vMax); + addVectWithUV(vecs[5], uMin, vMin + uMax); + addVectWithUV(vecs[6], uMin + uMax, vMin + uMax); + } + + public static RenderCustomBlock getRenderer(Block bid, int md) { + RenderLib.RenderListEntry rle = renderers[Block.getIdFromBlock(bid)]; + return rle == null ? null : rle.metaRenders[md]; + } + + public static RenderCustomBlock getInvRenderer(Block bid, int md) { + RenderLib.RenderListEntry rle = renderers[Block.getIdFromBlock(bid)]; + if (rle == null) { + return null; + } else { + int mdv = rle.mapDamageValue(md); + return mdv > 15 ? rle.defaultRender : rle.metaRenders[mdv]; + } + } + + private static RenderCustomBlock makeRenderer(B bl, Function rcl) { + return (RenderCustomBlock)rcl.apply(bl); + } + + public static void setRenderer(B bl, Function rcl) { + RenderCustomBlock rnd = makeRenderer(bl, rcl); + int bid = Block.getIdFromBlock(bl); + if (renderers[bid] == null) { + renderers[bid] = new RenderLib.RenderListEntry(); + MinecraftForgeClient.registerItemRenderer(ItemExtended.getItemFromBlock(bl), renderers[bid]); + } + + for(int i = 0; i < 16; ++i) { + renderers[bid].metaRenders[i] = rnd; + } + + } + + public static void setRenderer(B bl, int md, Function rcl) { + RenderCustomBlock rnd = makeRenderer(bl, rcl); + int bid = Block.getIdFromBlock(bl); + if (renderers[bid] == null) { + renderers[bid] = new RenderLib.RenderListEntry(); + MinecraftForgeClient.registerItemRenderer(ItemExtended.getItemFromBlock(bl), renderers[bid]); + } + + renderers[bid].metaRenders[md] = rnd; + } + + public static void setHighRenderer(B bl, int md, Function rcl) { + RenderCustomBlock rnd = makeRenderer(bl, rcl); + int bid = Block.getIdFromBlock(bl); + if (renderers[bid] == null) { + renderers[bid] = new RenderLib.RenderShiftedEntry(8); + MinecraftForgeClient.registerItemRenderer(ItemExtended.getItemFromBlock(bl), renderers[bid]); + } + + renderers[bid].metaRenders[md] = rnd; + } + + public static void setDefaultRenderer(B bl, int shift, Function rcl) { + RenderCustomBlock rnd = makeRenderer(bl, rcl); + int bid = Block.getIdFromBlock(bl); + if (renderers[bid] == null) { + renderers[bid] = new RenderLib.RenderShiftedEntry(shift); + MinecraftForgeClient.registerItemRenderer(ItemExtended.getItemFromBlock(bl), renderers[bid]); + } + + for(int i = 0; i < 16; ++i) { + if (renderers[bid].metaRenders[i] == null) { + renderers[bid].metaRenders[i] = rnd; + } + } + + renderers[Block.getIdFromBlock(bl)].defaultRender = rnd; + } + + public static void setShiftedRenderer(B bl, int md, int shift, Function rcl) { + RenderCustomBlock rnd = makeRenderer(bl, rcl); + int bid = Block.getIdFromBlock(bl); + if (renderers[bid] == null) { + renderers[bid] = new RenderLib.RenderShiftedEntry(shift); + MinecraftForgeClient.registerItemRenderer(ItemExtended.getItemFromBlock(bl), renderers[bid]); + } + + renderers[bid].metaRenders[md] = rnd; + } + + private static class RenderListEntry implements IItemRenderer { + public RenderCustomBlock[] metaRenders = new RenderCustomBlock[16]; + RenderCustomBlock defaultRender; + + private RenderListEntry() { + } + + public int mapDamageValue(int dmg) { + return dmg; + } + + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + int meta = item.getItemDamage(); + int mdv = this.mapDamageValue(meta); + RenderCustomBlock renderer = mdv > 15 ? this.defaultRender : this.metaRenders[mdv]; + return renderer != null && renderer.handleRenderType(item, type); + } + + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + int meta = item.getItemDamage(); + int mdv = this.mapDamageValue(meta); + RenderCustomBlock renderer = mdv > 15 ? this.defaultRender : this.metaRenders[mdv]; + return renderer != null && renderer.shouldUseRenderHelper(type, item, helper); + } + + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + int mdv = this.mapDamageValue(meta); + RenderCustomBlock renderer = mdv > 15 ? this.defaultRender : this.metaRenders[mdv]; + if (renderer != null) { + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + GL11.glEnable(3008); + renderer.renderItem(type, item, data); + } + + } + } + + private static class RenderShiftedEntry extends RenderLib.RenderListEntry { + public int shift; + + public RenderShiftedEntry(int sh) { + this.shift = sh; + } + + @Override + public int mapDamageValue(int dmg) { + return dmg >> this.shift; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderModel.java b/src/main/java/com/eloraam/redpower/core/RenderModel.java new file mode 100644 index 0000000..9e10a28 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderModel.java @@ -0,0 +1,257 @@ +package com.eloraam.redpower.core; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.IResource; +import net.minecraft.util.ResourceLocation; + +public class RenderModel { + public Vector3[] vertices; + public TexVertex[][] texs; + int[][][] groups; + + public static RenderModel loadModel(String location) { + try { + IResource resource = Minecraft.getMinecraft().getResourceManager().getResource(new ResourceLocation(location)); + InputStream is = resource.getInputStream(); + RenderModel.ModelReader ml = new RenderModel.ModelReader(); + ml.readModel(is); + List vtl = new ArrayList(); + int i = 0; + + while(i < ml.faceno.size()) { + TexVertex[] tr = new TexVertex[4]; + + for(int lgs = 0; lgs < 4; ++lgs) { + int lgmn = ml.faceno.get(i); + ++i; + if (lgmn < 0) { + throw new IllegalArgumentException("Non-Quad Face"); + } + + int lgsn = ml.faceno.get(i); + ++i; + TexVertex t = ((TexVertex)ml.texvert.get(lgsn - 1)).copy(); + t.vtx = lgmn - 1; + t.v = 1.0 - t.v; + tr[lgs] = t; + } + + int var15 = ml.faceno.get(i); + ++i; + if (var15 >= 0) { + throw new IllegalArgumentException("Non-Quad Face"); + } + + vtl.add(tr); + } + + RenderModel model = new RenderModel(); + model.vertices = (Vector3[])ml.vertex.toArray(new Vector3[0]); + model.texs = (TexVertex[][])vtl.toArray(new TexVertex[0][]); + model.groups = new int[ml.grcnt.size()][][]; + + for(int var13 = 0; var13 < ml.grcnt.size(); ++var13) { + int lgs = ml.grcnt.get(var13); + model.groups[var13] = new int[lgs][]; + + for(int lgmn = 0; lgmn < ml.grcnt.get(var13); ++lgmn) { + model.groups[var13][lgmn] = new int[2]; + } + } + + i = 0; + int lgs = -1; + int lgmn = -1; + + int lgsn; + for(lgsn = -1; i < ml.groups.size(); i += 3) { + if (lgs >= 0) { + model.groups[lgmn][lgsn][0] = lgs; + model.groups[lgmn][lgsn][1] = ml.groups.get(i + 2); + } + + lgmn = ml.groups.get(i); + lgsn = ml.groups.get(i + 1); + lgs = ml.groups.get(i + 2); + } + + if (lgs >= 0) { + model.groups[lgmn][lgsn][0] = lgs; + model.groups[lgmn][lgsn][1] = ml.fno; + } + + return model; + } catch (IOException var11) { + var11.printStackTrace(); + return null; + } + } + + public RenderModel scale(double factor) { + for(Vector3 vertex : this.vertices) { + vertex.multiply(factor); + } + + return this; + } + + public static class ModelReader { + public List vertex = new ArrayList(); + public List faceno = new ArrayList(); + public List texvert = new ArrayList(); + public List groups = new ArrayList(); + public List grcnt = new ArrayList(); + int fno = 0; + + private void eatLine(StreamTokenizer tok) throws IOException { + while(tok.nextToken() != -1) { + if (tok.ttype == 10) { + return; + } + } + + } + + private void endLine(StreamTokenizer tok) throws IOException { + if (tok.nextToken() != 10) { + throw new IllegalArgumentException("Parse error"); + } + } + + private double getFloat(StreamTokenizer tok) throws IOException { + if (tok.nextToken() != -2) { + throw new IllegalArgumentException("Parse error"); + } else { + return tok.nval; + } + } + + private int getInt(StreamTokenizer tok) throws IOException { + if (tok.nextToken() != -2) { + throw new IllegalArgumentException("Parse error"); + } else { + return (int)tok.nval; + } + } + + private void parseFace(StreamTokenizer tok) throws IOException { + while(true) { + tok.nextToken(); + if (tok.ttype == -1 || tok.ttype == 10) { + this.faceno.add(-1); + ++this.fno; + return; + } + + if (tok.ttype != -2) { + throw new IllegalArgumentException("Parse error"); + } + + int n1 = (int)tok.nval; + if (tok.nextToken() != 47) { + throw new IllegalArgumentException("Parse error"); + } + + int n2 = this.getInt(tok); + this.faceno.add(n1); + this.faceno.add(n2); + } + } + + private void setGroup(int gr, int sub) { + this.groups.add(gr); + this.groups.add(sub); + this.groups.add(this.fno); + if (this.grcnt.size() < gr) { + throw new IllegalArgumentException("Parse error"); + } else { + if (this.grcnt.size() == gr) { + this.grcnt.add(0); + } + + this.grcnt.set(gr, Math.max(this.grcnt.get(gr), sub + 1)); + } + } + + private void parseGroup(StreamTokenizer tok) throws IOException { + int n1 = this.getInt(tok); + int n2 = 0; + tok.nextToken(); + if (tok.ttype == 95) { + n2 = this.getInt(tok); + tok.nextToken(); + } + + this.setGroup(n1, n2); + if (tok.ttype != 10) { + throw new IllegalArgumentException("Parse error"); + } + } + + public void readModel(InputStream fis) throws IOException { + BufferedReader r = new BufferedReader(new InputStreamReader(fis)); + StreamTokenizer tok = new StreamTokenizer(r); + tok.commentChar(35); + tok.eolIsSignificant(true); + tok.lowerCaseMode(false); + tok.parseNumbers(); + tok.quoteChar(34); + tok.ordinaryChar(47); + + while(tok.nextToken() != -1) { + if (tok.ttype != 10) { + if (tok.ttype != -3) { + throw new IllegalArgumentException("Parse error"); + } + + String var4 = tok.sval; + switch(var4) { + case "v": + Vector3 f1 = new Vector3(); + f1.x = this.getFloat(tok); + f1.y = this.getFloat(tok); + f1.z = this.getFloat(tok); + this.vertex.add(f1); + this.endLine(tok); + break; + case "vt": { + double f11 = this.getFloat(tok); + double f2 = this.getFloat(tok); + this.texvert.add(new TexVertex(0, f11, f2)); + this.endLine(tok); + break; + } + case "vtc": { + double f11 = this.getFloat(tok); + double f2 = this.getFloat(tok); + TexVertex tv = new TexVertex(0, f11, f2); + tv.r = (float)this.getFloat(tok); + tv.g = (float)this.getFloat(tok); + tv.b = (float)this.getFloat(tok); + this.texvert.add(tv); + this.endLine(tok); + break; + } + case "f": + this.parseFace(tok); + break; + case "g": + this.parseGroup(tok); + break; + default: + this.eatLine(tok); + } + } + } + + fis.close(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/RenderSimpleCovered.java b/src/main/java/com/eloraam/redpower/core/RenderSimpleCovered.java new file mode 100644 index 0000000..97b6591 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/RenderSimpleCovered.java @@ -0,0 +1,43 @@ +package com.eloraam.redpower.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderSimpleCovered extends RenderCovers { + public RenderSimpleCovered() { + super(null); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileCovered covered = (TileCovered)tile; + World world = covered.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + super.context.bindBlockTexture(); + super.context.setBrightness(this.getMixedBrightness(covered)); + super.context.setTexFlags(55); + super.context.setPos(x, y, z); + tess.startDrawingQuads(); + if (covered.CoverSides > 0) { + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.readGlobalLights(world, covered.xCoord, covered.yCoord, covered.zCoord); + this.renderCovers(covered.CoverSides, covered.Covers); + super.context.forceFlat = false; + super.context.lockTexture = false; + } + + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + } +} diff --git a/src/main/java/com/eloraam/redpower/core/SlotLocked.java b/src/main/java/com/eloraam/redpower/core/SlotLocked.java new file mode 100644 index 0000000..e328902 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/SlotLocked.java @@ -0,0 +1,27 @@ +package com.eloraam.redpower.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotLocked extends Slot { + public SlotLocked(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + public boolean isItemValid(ItemStack stack) { + return false; + } + + public boolean canTakeStack(EntityPlayer player) { + return false; + } + + public ItemStack decrStackSize(int amount) { + return null; + } + + public void putStack(ItemStack stack) { + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TagFile.java b/src/main/java/com/eloraam/redpower/core/TagFile.java new file mode 100644 index 0000000..aeb67a7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TagFile.java @@ -0,0 +1,456 @@ +package com.eloraam.redpower.core; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.TreeMap; + +public class TagFile { + private TreeMap contents = new TreeMap(); + private TreeMap comments = new TreeMap(); + private String filecomment = ""; + + public void addTag(String name, Object tag) { + int idx = 0; + TreeMap sub = this.contents; + + while(true) { + int nid = name.indexOf(46, idx); + if (nid < 0) { + String p = name.substring(idx); + if (p.equals("")) { + throw new IllegalArgumentException("Empty key name"); + } else { + sub.put(p, tag); + return; + } + } + + String p = name.substring(idx, nid); + idx = nid + 1; + if (p.equals("")) { + throw new IllegalArgumentException("Empty key name"); + } + + Object ob = sub.get(p); + if (ob == null) { + TreeMap tmp = new TreeMap(); + sub.put(p, tmp); + sub = tmp; + } else { + if (!(ob instanceof TreeMap)) { + throw new IllegalArgumentException("Key not a dictionary"); + } + + sub = (TreeMap)ob; + } + } + } + + public Object getTag(String name) { + int idx = 0; + TreeMap sub = this.contents; + + while(true) { + int nid = name.indexOf(46, idx); + if (nid < 0) { + String p = name.substring(idx); + return sub.get(p); + } + + String p = name.substring(idx, nid); + idx = nid + 1; + Object ob = sub.get(p); + if (!(ob instanceof TreeMap)) { + return null; + } + + sub = (TreeMap)ob; + } + } + + public Object removeTag(String name) { + int idx = 0; + TreeMap sub = this.contents; + + while(true) { + int nid = name.indexOf(46, idx); + if (nid < 0) { + String p = name.substring(idx); + return sub.remove(p); + } + + String p = name.substring(idx, nid); + idx = nid + 1; + Object ob = sub.get(p); + if (!(ob instanceof TreeMap)) { + return null; + } + + sub = (TreeMap)ob; + } + } + + public void commentTag(String k, String v) { + this.comments.put(k, v); + } + + public void commentFile(String cmt) { + this.filecomment = cmt; + } + + public void addString(String name, String value) { + this.addTag(name, value); + } + + public void addInt(String name, int value) { + this.addTag(name, value); + } + + public String getString(String name) { + Object ob = this.getTag(name); + return !(ob instanceof String) ? null : (String)ob; + } + + public String getString(String name, String _default) { + Object ob = this.getTag(name); + if (ob == null) { + this.addTag(name, _default); + return _default; + } else { + return !(ob instanceof String) ? _default : (String)ob; + } + } + + public int getInt(String name) { + return this.getInt(name, 0); + } + + public int getInt(String name, int _default) { + Object ob = this.getTag(name); + if (ob == null) { + this.addTag(name, _default); + return _default; + } else { + return !(ob instanceof Integer) ? 0 : (Integer)ob; + } + } + + private void writeComment(PrintStream ps, String indent, String cmt) { + if (cmt != null) { + for(String s : cmt.split("\n")) { + ps.printf("%s# %s\n", indent, s); + } + } + + } + + private String collapsedTag(TreeMap tag, String key, String ft) { + String cn = key; + + String k; + for(Object ob = tag.get(key); this.comments.get(ft) == null; ft = ft + "." + k) { + if (ob instanceof String) { + return cn + "=\"" + ((String)ob).replace("\"", "\\\"") + "\""; + } + + if (ob instanceof Integer) { + return cn + "=" + ob; + } + + tag = (TreeMap)ob; + if (tag.size() != 1) { + return null; + } + + k = (String)tag.firstKey(); + cn = cn + "." + k; + ob = tag.get(k); + } + + return null; + } + + private void saveTag(PrintStream ps, TreeMap tag, String name, String indent) throws IOException { + for(String k : tag.keySet()) { + String ft = name != null ? name + "." + k : k; + this.writeComment(ps, indent, (String)this.comments.get(ft)); + Object ob = tag.get(k); + if (ob instanceof String) { + ps.printf("%s%s=\"%s\"\n", indent, k, ((String)ob).replace("\"", "\\\"")); + } else if (ob instanceof Integer) { + ps.printf("%s%s=%d\n", indent, k, ob); + } else if (ob instanceof TreeMap) { + String ct = this.collapsedTag(tag, k, ft); + if (ct != null) { + ps.printf("%s%s\n", indent, ct); + } else { + ps.printf("%s%s {\n", indent, k); + this.saveTag(ps, (TreeMap)ob, ft, indent + " "); + ps.printf("%s}\n\n", indent); + } + } + } + + } + + public void saveFile(File file) { + try { + FileOutputStream os = new FileOutputStream(file); + PrintStream ps = new PrintStream(os); + this.writeComment(ps, "", this.filecomment); + this.saveTag(ps, this.contents, null, ""); + ps.close(); + } catch (IOException var4) { + var4.printStackTrace(); + } + + } + + private static void readTag(TreeMap tag, StreamTokenizer tok) throws IOException { + label61: + while(tok.nextToken() != -1 && tok.ttype != 125) { + if (tok.ttype != 10) { + if (tok.ttype != -3) { + throw new IllegalArgumentException("Parse error"); + } + + String key = tok.sval; + TreeMap ltag = tag; + + while(true) { + Object obtag; + switch(tok.nextToken()) { + case 46: + obtag = ltag.get(key); + if (!(obtag instanceof TreeMap)) { + TreeMap ttag = new TreeMap(); + ltag.put(key, ttag); + ltag = ttag; + } else { + ltag = (TreeMap)obtag; + } + + tok.nextToken(); + if (tok.ttype != -3) { + throw new IllegalArgumentException("Parse error"); + } + + key = tok.sval; + break; + case 61: + tok.nextToken(); + if (tok.ttype == -2) { + ltag.put(key, (int)tok.nval); + } else { + if (tok.ttype != 34) { + throw new IllegalArgumentException("Parse error"); + } + + ltag.put(key, tok.sval); + } + + tok.nextToken(); + if (tok.ttype == 10) { + continue label61; + } + + throw new IllegalArgumentException("Parse error"); + case 123: + obtag = ltag.get(key); + if (!(obtag instanceof TreeMap)) { + TreeMap ttag = new TreeMap(); + ltag.put(key, ttag); + ltag = ttag; + } else { + ltag = (TreeMap)obtag; + } + + readTag(ltag, tok); + tok.nextToken(); + if (tok.ttype == 10) { + continue label61; + } + + throw new IllegalArgumentException("Parse error"); + default: + throw new IllegalArgumentException("Parse error"); + } + } + } + } + + } + + public static TagFile loadFile(File file) { + TagFile tagFile = new TagFile(); + + try { + FileInputStream stream = new FileInputStream(file); + tagFile.readStream(stream); + } catch (IOException var3) { + var3.printStackTrace(); + } + + return tagFile; + } + + public void readFile(File file) { + try { + FileInputStream stream = new FileInputStream(file); + this.readStream(stream); + } catch (IOException var3) { + var3.printStackTrace(); + } + + } + + public void readStream(InputStream stream) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + StreamTokenizer tokenizer = new StreamTokenizer(reader); + tokenizer.commentChar(35); + tokenizer.eolIsSignificant(true); + tokenizer.lowerCaseMode(false); + tokenizer.parseNumbers(); + tokenizer.quoteChar(34); + tokenizer.ordinaryChar(61); + tokenizer.ordinaryChar(123); + tokenizer.ordinaryChar(125); + tokenizer.ordinaryChar(46); + readTag(this.contents, tokenizer); + stream.close(); + } catch (IOException var4) { + var4.printStackTrace(); + } + + } + + TagFile.Query query(String pattern) { + return new TagFile.Query(pattern); + } + + public class Query implements Iterable { + String[] pattern; + + private Query(String pat) { + this.pattern = pat.split("\\."); + } + + public Iterator iterator() { + return new TagFile.Query.QueryIterator(); + } + + public class QueryIterator implements Iterator { + ArrayList path = new ArrayList(); + String lastentry; + + private QueryIterator() { + if (!this.step0(0, TagFile.this.contents, "")) { + this.step(); + } + + } + + private void step() { + while(this.path != null) { + if (this.step1()) { + return; + } + } + + } + + private boolean step1() { + TagFile.QueryEntry qe = (TagFile.QueryEntry)this.path.get(this.path.size() - 1); + if (!qe.iter.hasNext()) { + this.path.remove(this.path.size() - 1); + if (this.path.size() == 0) { + this.path = null; + } + + return false; + } else { + String str = (String)qe.iter.next(); + String sp = qe.path.equals("") ? str : qe.path + "." + str; + if (qe.lvl == Query.this.pattern.length - 1) { + this.lastentry = sp; + return true; + } else { + Object ob = qe.tag.get(str); + return ob instanceof TreeMap && this.step0(qe.lvl + 1, (TreeMap)ob, sp); + } + } + } + + private boolean step0(int lvl0, TreeMap p, String sp) { + for(int lvl = lvl0; lvl < Query.this.pattern.length; ++lvl) { + if (Query.this.pattern[lvl].equals("%")) { + TagFile.QueryEntry var6 = new TagFile.QueryEntry(); + var6.path = sp; + var6.tag = p; + var6.lvl = lvl; + var6.iter = p.keySet().iterator(); + this.path.add(var6); + return false; + } + + Object ob = p.get(Query.this.pattern[lvl]); + if (sp.equals("")) { + sp = Query.this.pattern[lvl]; + } else { + sp = sp + "." + Query.this.pattern[lvl]; + } + + if (!(ob instanceof TreeMap)) { + if (lvl == Query.this.pattern.length - 1) { + this.lastentry = sp; + return true; + } + break; + } + + p = (TreeMap)ob; + } + + this.path.remove(this.path.size() - 1); + if (this.path.size() == 0) { + this.path = null; + } + + return false; + } + + public boolean hasNext() { + return this.path != null; + } + + public String next() { + String tr = this.lastentry; + this.step(); + return tr; + } + + public void remove() { + } + } + } + + private static class QueryEntry { + public TreeMap tag; + public Iterator iter; + public String path; + int lvl; + + private QueryEntry() { + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TexVertex.java b/src/main/java/com/eloraam/redpower/core/TexVertex.java new file mode 100644 index 0000000..a08f670 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TexVertex.java @@ -0,0 +1,46 @@ +package com.eloraam.redpower.core; + +public class TexVertex { + public int vtx; + public double u; + public double v; + public float r; + public float g; + public float b; + public int brtex; + + public TexVertex() { + } + + public TexVertex(int vti, int tn, double ui, double vi) { + this.vtx = vti; + this.u = (double)(tn & 15) * 0.0625 + ui * 0.0625; + this.v = (double)(tn >> 4) * 0.0625 + vi * 0.0625; + this.r = 1.0F; + this.g = 1.0F; + this.b = 1.0F; + } + + public TexVertex(int vti, double ui, double vi) { + this.vtx = vti; + this.u = ui; + this.v = vi; + this.r = 1.0F; + this.g = 1.0F; + this.b = 1.0F; + } + + public void setUV(double ui, double vi) { + this.u = ui; + this.v = vi; + } + + public TexVertex copy() { + TexVertex tr = new TexVertex(this.vtx, this.u, this.v); + tr.r = this.r; + tr.g = this.g; + tr.b = this.b; + tr.brtex = this.brtex; + return tr; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TileCoverable.java b/src/main/java/com/eloraam/redpower/core/TileCoverable.java new file mode 100644 index 0000000..a290cbc --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TileCoverable.java @@ -0,0 +1,241 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.ForgeHooks; + +public abstract class TileCoverable extends TileMultipart implements ICoverable, IMultipart { + @Override + public abstract boolean canAddCover(int var1, int var2); + + @Override + public abstract boolean tryAddCover(int var1, int var2); + + @Override + public abstract int tryRemoveCover(int var1); + + @Override + public abstract int getCover(int var1); + + @Override + public abstract int getCoverMask(); + + @Override + public boolean isSideSolid(int side) { + int cm = this.getCoverMask(); + return (cm & 1 << side) > 0; + } + + @Override + public boolean isSideNormal(int side) { + int cm = this.getCoverMask(); + if ((cm & 1 << side) == 0) { + return false; + } else { + int c = this.getCover(side); + int n = c >> 8; + return !CoverLib.isTransparent(c & 0xFF) && (n < 3 || n >= 6 && n <= 9); + } + } + + public void addCoverableHarvestContents(List drops) { + if (CoverLib.blockCoverPlate != null) { + for(int i = 0; i < 29; ++i) { + int j = this.getCover(i); + if (j >= 0) { + drops.add(CoverLib.convertCoverPlate(i, j)); + } + } + } + + } + + @Override + public void addHarvestContents(List ist) { + this.addCoverableHarvestContents(ist); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + int i = this.tryRemoveCover(part); + if (i >= 0) { + if (willHarvest) { + this.dropCover(part, i); + } + + if (this.blockEmpty()) { + this.deleteBlock(); + } + } + + this.updateBlock(); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + int i = this.getCover(part); + if (i < 0) { + return 0.0F; + } else { + i &= 255; + float hv = CoverLib.getMiningHardness(i); + if (hv < 0.0F) { + return 0.0F; + } else { + ItemStack ist = CoverLib.getItemStack(i); + Block bl = Block.getBlockFromItem(ist.getItem()); + int md = ist.getItemDamage(); + return !ForgeHooks.canHarvestBlock(bl, player, md) ? 1.0F / hv / 100.0F : player.getBreakSpeed(bl, false, md) / hv / 30.0F; + } + } + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + int i = this.getCover(part); + float th = CoverLib.getThickness(part, i); + switch(part) { + case 0: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, th, 1.0F); + break; + case 1: + block.setBlockBounds(0.0F, 1.0F - th, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, th); + break; + case 3: + block.setBlockBounds(0.0F, 0.0F, 1.0F - th, 1.0F, 1.0F, 1.0F); + break; + case 4: + block.setBlockBounds(0.0F, 0.0F, 0.0F, th, 1.0F, 1.0F); + break; + case 5: + block.setBlockBounds(1.0F - th, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 6: + block.setBlockBounds(0.0F, 0.0F, 0.0F, th, th, th); + break; + case 7: + block.setBlockBounds(0.0F, 0.0F, 1.0F - th, th, th, 1.0F); + break; + case 8: + block.setBlockBounds(1.0F - th, 0.0F, 0.0F, 1.0F, th, th); + break; + case 9: + block.setBlockBounds(1.0F - th, 0.0F, 1.0F - th, 1.0F, th, 1.0F); + break; + case 10: + block.setBlockBounds(0.0F, 1.0F - th, 0.0F, th, 1.0F, th); + break; + case 11: + block.setBlockBounds(0.0F, 1.0F - th, 1.0F - th, th, 1.0F, 1.0F); + break; + case 12: + block.setBlockBounds(1.0F - th, 1.0F - th, 0.0F, 1.0F, 1.0F, th); + break; + case 13: + block.setBlockBounds(1.0F - th, 1.0F - th, 1.0F - th, 1.0F, 1.0F, 1.0F); + break; + case 14: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, th, th); + break; + case 15: + block.setBlockBounds(0.0F, 0.0F, 1.0F - th, 1.0F, th, 1.0F); + break; + case 16: + block.setBlockBounds(0.0F, 0.0F, 0.0F, th, th, 1.0F); + break; + case 17: + block.setBlockBounds(1.0F - th, 0.0F, 0.0F, 1.0F, th, 1.0F); + break; + case 18: + block.setBlockBounds(0.0F, 0.0F, 0.0F, th, 1.0F, th); + break; + case 19: + block.setBlockBounds(0.0F, 0.0F, 1.0F - th, th, 1.0F, 1.0F); + break; + case 20: + block.setBlockBounds(1.0F - th, 0.0F, 0.0F, 1.0F, 1.0F, th); + break; + case 21: + block.setBlockBounds(1.0F - th, 0.0F, 1.0F - th, 1.0F, 1.0F, 1.0F); + break; + case 22: + block.setBlockBounds(0.0F, 1.0F - th, 0.0F, 1.0F, 1.0F, th); + break; + case 23: + block.setBlockBounds(0.0F, 1.0F - th, 1.0F - th, 1.0F, 1.0F, 1.0F); + break; + case 24: + block.setBlockBounds(0.0F, 1.0F - th, 0.0F, th, 1.0F, 1.0F); + break; + case 25: + block.setBlockBounds(1.0F - th, 1.0F - th, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 26: + block.setBlockBounds(0.5F - th, 0.0F, 0.5F - th, 0.5F + th, 1.0F, 0.5F + th); + break; + case 27: + block.setBlockBounds(0.5F - th, 0.5F - th, 0.0F, 0.5F + th, 0.5F + th, 1.0F); + break; + case 28: + block.setBlockBounds(0.0F, 0.5F - th, 0.5F - th, 1.0F, 0.5F + th, 0.5F + th); + } + + } + + @Override + public int getSolidPartsMask() { + return this.getCoverMask(); + } + + @Override + public int getPartsMask() { + return this.getCoverMask(); + } + + public void dropCover(int side, int cov) { + ItemStack ist = CoverLib.convertCoverPlate(side, cov); + if (ist != null) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + + } + + public ItemStack getCover(int part, int side) { + int i = this.getCover(part); + if (i >= 0) { + return CoverLib.convertCoverPlate(side, i); + } else { + List ist = new ArrayList(); + this.addHarvestContents(ist); + return ist.size() >= 1 ? (ItemStack)ist.get(0) : null; + } + } + + public ItemStack getPickBlock(MovingObjectPosition target, EntityPlayer player) { + int i = this.getCover(target.subHit); + return i > 0 ? CoverLib.convertCoverPlate(target.sideHit, i) : this.getBasePickStack(); + } + + protected ItemStack getBasePickStack() { + return null; + } + + public float getExplosionResistance(int part, int side, Entity exploder) { + int i = this.getCover(part); + if (i < 0) { + return -1.0F; + } else { + i &= 255; + ItemStack ist = CoverLib.getItemStack(i); + return Block.getBlockFromItem(ist.getItem()).getExplosionResistance(exploder); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TileCovered.java b/src/main/java/com/eloraam/redpower/core/TileCovered.java new file mode 100644 index 0000000..35cb164 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TileCovered.java @@ -0,0 +1,214 @@ +package com.eloraam.redpower.core; + +import com.mojang.authlib.GameProfile; +import java.util.Arrays; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileCovered extends TileCoverable implements IFrameSupport { + public int CoverSides = 0; + public short[] Covers = new short[29]; + + public void replaceWithCovers() { + GameProfile owner = super.Owner; + CoverLib.replaceWithCovers(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.CoverSides, this.Covers); + TileExtended te = CoreLib.getTileEntity(super.worldObj, super.xCoord, super.yCoord, super.zCoord, TileExtended.class); + if (te != null) { + te.Owner = owner; + } + + } + + public boolean canUpdate() { + return true; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + if (this.CoverSides == 0) { + this.deleteBlock(); + } + + this.markDirty(); + } + + public Block getBlockType() { + return CoverLib.blockCoverPlate; + } + + @Override + public boolean canAddCover(int side, int cover) { + if ((this.CoverSides & 1 << side) > 0) { + return false; + } else { + short[] test = Arrays.copyOf(this.Covers, 29); + test[side] = (short)cover; + return CoverLib.checkPlacement(this.CoverSides | 1 << side, test, 0, false); + } + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!this.canAddCover(side, cover)) { + return false; + } else { + this.CoverSides |= 1 << side; + this.Covers[side] = (short)cover; + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + if ((this.CoverSides & 1 << side) == 0) { + return -1; + } else { + this.CoverSides &= ~(1 << side); + short tr = this.Covers[side]; + this.Covers[side] = 0; + this.updateBlockChange(); + return tr; + } + } + + @Override + public int getCover(int side) { + return (this.CoverSides & 1 << side) == 0 ? -1 : this.Covers[side]; + } + + @Override + public int getCoverMask() { + return this.CoverSides; + } + + @Override + public boolean blockEmpty() { + return this.CoverSides == 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + int mask = data.getInteger("cvm") & 536870911; + this.CoverSides |= mask; + byte[] cov = data.getByteArray("cvs"); + if (cov != null && mask > 0) { + int sp = 0; + + for(int i = 0; i < 29; ++i) { + if ((mask & 1 << i) != 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 29; ++i) { + if ((this.CoverSides & 1 << i) != 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + data.setByteArray("cvs", cov); + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 29; ++i) { + if ((this.CoverSides & 1 << i) != 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + tag.setByteArray("cvs", cov); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + int mask = tag.getInteger("cvm"); + this.CoverSides |= mask; + byte[] cov = tag.getByteArray("cvs"); + if (cov != null && mask > 0) { + int sp = 0; + + for(int i = 0; i < 29; ++i) { + if ((mask & 1 << i) != 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + int mask = data.getInteger("cvm") & 536870911; + this.CoverSides = mask; + byte[] cov = data.getByteArray("cvs"); + if (cov != null && mask > 0) { + int sp = 0; + + for(int i = 0; i < 29; ++i) { + if ((mask & 1 << i) > 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 29; ++i) { + if ((this.CoverSides & 1 << i) > 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + data.setByteArray("cvs", cov); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TileExtended.java b/src/main/java/com/eloraam/redpower/core/TileExtended.java new file mode 100644 index 0000000..d6eae2e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TileExtended.java @@ -0,0 +1,177 @@ +package com.eloraam.redpower.core; + +import com.mojang.authlib.GameProfile; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +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; + +public abstract class TileExtended extends TileEntity { + protected long timeSched = -1L; + public GameProfile Owner = CoreLib.REDPOWER_PROFILE; + + public void onBlockNeighborChange(Block block) { + } + + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.updateBlock(); + } + + public void onBlockRemoval() { + } + + public boolean isBlockStrongPoweringTo(int side) { + return false; + } + + public boolean isBlockWeakPoweringTo(int side) { + return this.isBlockStrongPoweringTo(side); + } + + public boolean onBlockActivated(EntityPlayer player) { + return false; + } + + public void onEntityCollidedWithBlock(Entity ent) { + } + + public AxisAlignedBB getCollisionBoundingBox() { + return null; + } + + public void onTileTick() { + } + + public int getExtendedID() { + return 0; + } + + public int getExtendedMetadata() { + return 0; + } + + public void setExtendedMetadata(int md) { + } + + public void addHarvestContents(List ist) { + ist.add(new ItemStack(this.getBlockType(), 1, this.getExtendedID())); + } + + public void scheduleTick(int time) { + long tn = super.worldObj.getWorldTime() + (long)time; + if (this.timeSched <= 0L || this.timeSched >= tn) { + this.timeSched = tn; + this.updateBlock(); + } + + } + + public boolean isTickRunnable() { + return this.timeSched >= 0L && this.timeSched <= super.worldObj.getWorldTime(); + } + + public boolean isTickScheduled() { + return this.timeSched >= 0L; + } + + public void updateBlockChange() { + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.getBlockType()); + this.updateBlock(); + } + + public void updateBlock() { + this.markDirty(); + this.markForUpdate(); + } + + public void markForUpdate() { + super.worldObj.markBlockForUpdate(super.xCoord, super.yCoord, super.zCoord); + } + + public void breakBlock() { + this.breakBlock(true); + } + + public void breakBlock(boolean shouldDrop) { + if (shouldDrop) { + List il = new ArrayList(); + this.addHarvestContents(il); + + for(ItemStack it : il) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, it); + } + } + + super.worldObj.setBlockToAir(super.xCoord, super.yCoord, super.zCoord); + } + + public void updateEntity() { + if (!super.worldObj.isRemote && this.timeSched >= 0L) { + long wtime = super.worldObj.getWorldTime(); + if (this.timeSched > wtime + 1200L) { + this.timeSched = wtime + 1200L; + } else if (this.timeSched <= wtime) { + this.timeSched = -1L; + this.onTileTick(); + this.markDirty(); + } + } + + } + + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.timeSched = data.getLong("sched"); + if (data.hasKey("Owner")) { + this.Owner = NBTUtil.func_152459_a(data.getCompoundTag("Owner")); + } else { + this.Owner = CoreLib.REDPOWER_PROFILE; + } + + } + + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setLong("sched", this.timeSched); + NBTTagCompound owner = new NBTTagCompound(); + NBTUtil.func_152460_a(owner, this.Owner); + data.setTag("Owner", owner); + } + + public Packet getDescriptionPacket() { + NBTTagCompound syncData = new NBTTagCompound(); + this.writeToPacket(syncData); + return new S35PacketUpdateTileEntity(super.xCoord, super.yCoord, super.zCoord, 1, syncData); + } + + public AxisAlignedBB getRenderBoundingBox() { + return AxisAlignedBB.getBoundingBox( + (double)super.xCoord, (double)super.yCoord, (double)super.zCoord, (double)super.xCoord + 1.0, (double)super.yCoord + 1.0, (double)super.zCoord + 1.0 + ); + } + + public void onDataPacket(NetworkManager netManager, S35PacketUpdateTileEntity packet) { + this.readFromPacket(packet.func_148857_g()); + this.updateBlock(); + } + + protected void writeToPacket(NBTTagCompound tag) { + } + + protected void readFromPacket(NBTTagCompound tag) { + } + + public double getMaxRenderDistanceSquared() { + return 65535.0; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TileMultiblock.java b/src/main/java/com/eloraam/redpower/core/TileMultiblock.java new file mode 100644 index 0000000..69f6ea0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TileMultiblock.java @@ -0,0 +1,68 @@ +package com.eloraam.redpower.core; + +import com.eloraam.redpower.RedPowerBase; +import net.minecraft.block.Block; +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; + +public class TileMultiblock extends TileEntity { + public int relayX; + public int relayY; + public int relayZ; + public int relayNum; + + public boolean canUpdate() { + return true; + } + + public Block getBlockType() { + return RedPowerBase.blockMultiblock; + } + + public void markDirty() { + super.markDirty(); + } + + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + this.relayX = tag.getInteger("rlx"); + this.relayY = tag.getInteger("rly"); + this.relayZ = tag.getInteger("rlz"); + this.relayNum = tag.getInteger("rln"); + } + + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + tag.setInteger("rlx", this.relayX); + tag.setInteger("rly", this.relayY); + tag.setInteger("rlz", this.relayZ); + tag.setInteger("rln", this.relayNum); + } + + protected void readFromPacket(NBTTagCompound tag) { + this.relayX = tag.getInteger("rlx"); + this.relayY = tag.getInteger("rly"); + this.relayZ = tag.getInteger("rlz"); + this.relayNum = tag.getInteger("rln"); + } + + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("rlx", this.relayX); + tag.setInteger("rly", this.relayY); + tag.setInteger("rlz", this.relayZ); + tag.setInteger("rln", this.relayNum); + } + + public Packet getDescriptionPacket() { + NBTTagCompound syncData = new NBTTagCompound(); + this.writeToPacket(syncData); + return new S35PacketUpdateTileEntity(super.xCoord, super.yCoord, super.zCoord, 1, syncData); + } + + public void onDataPacket(NetworkManager netManager, S35PacketUpdateTileEntity packet) { + this.readFromPacket(packet.func_148857_g()); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TileMultipart.java b/src/main/java/com/eloraam/redpower/core/TileMultipart.java new file mode 100644 index 0000000..5546696 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TileMultipart.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public abstract class TileMultipart extends TileExtended implements IMultipart { + @Override + public boolean isSideSolid(int side) { + return false; + } + + @Override + public boolean isSideNormal(int side) { + return false; + } + + @Override + public List harvestMultipart() { + List ist = new ArrayList(); + this.addHarvestContents(ist); + this.deleteBlock(); + return ist; + } + + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + } + + public boolean onPartActivateSide(EntityPlayer player, int part, int side) { + return false; + } + + public float getPartStrength(EntityPlayer player, int part) { + return 0.0F; + } + + public abstract boolean blockEmpty(); + + public abstract void setPartBounds(BlockMultipart var1, int var2); + + public abstract int getSolidPartsMask(); + + public abstract int getPartsMask(); + + public void deleteBlock() { + super.worldObj.setBlockToAir(super.xCoord, super.yCoord, super.zCoord); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TubeBuffer.java b/src/main/java/com/eloraam/redpower/core/TubeBuffer.java new file mode 100644 index 0000000..539e9b9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TubeBuffer.java @@ -0,0 +1,119 @@ +package com.eloraam.redpower.core; + +import java.util.Collection; +import java.util.LinkedList; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +public class TubeBuffer { + LinkedList buffer = null; + public boolean plugged = false; + + public boolean isEmpty() { + return this.buffer == null || this.buffer.size() == 0; + } + + public TubeItem getLast() { + return this.buffer == null ? null : (TubeItem)this.buffer.getLast(); + } + + public void add(TubeItem ti) { + if (this.buffer == null) { + this.buffer = new LinkedList(); + } + + this.buffer.addFirst(ti); + } + + public void addNew(ItemStack ist) { + if (this.buffer == null) { + this.buffer = new LinkedList(); + } + + this.buffer.addFirst(new TubeItem(0, ist)); + } + + public void addNewColor(ItemStack ist, int col) { + if (this.buffer == null) { + this.buffer = new LinkedList(); + } + + TubeItem ti = new TubeItem(0, ist); + ti.color = (byte)col; + this.buffer.addFirst(ti); + } + + public void addAll(Collection col) { + if (this.buffer == null) { + this.buffer = new LinkedList(); + } + + for(ItemStack ist : col) { + this.buffer.add(new TubeItem(0, ist)); + } + + } + + public void addBounce(TubeItem ti) { + if (this.buffer == null) { + this.buffer = new LinkedList(); + } + + this.buffer.addLast(ti); + this.plugged = true; + } + + public void pop() { + this.buffer.removeLast(); + if (this.buffer.size() == 0) { + this.plugged = false; + } + + } + + public int size() { + return this.buffer == null ? 0 : this.buffer.size(); + } + + public void onRemove(TileEntity te) { + if (this.buffer != null) { + for(TubeItem ti : this.buffer) { + if (ti != null && ti.item.stackSize > 0) { + CoreLib.dropItem(te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord, ti.item); + } + } + } + + } + + public void readFromNBT(NBTTagCompound data) { + NBTTagList items = data.getTagList("Buffer", 10); + if (items.tagCount() > 0) { + this.buffer = new LinkedList(); + + for(int b = 0; b < items.tagCount(); ++b) { + NBTTagCompound item = items.getCompoundTagAt(b); + this.buffer.add(TubeItem.newFromNBT(item)); + } + } + + byte var5 = data.getByte("Plug"); + this.plugged = var5 > 0; + } + + public void writeToNBT(NBTTagCompound data) { + NBTTagList items = new NBTTagList(); + if (this.buffer != null) { + for(TubeItem ti : this.buffer) { + NBTTagCompound item = new NBTTagCompound(); + ti.writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Buffer", items); + data.setByte("Plug", (byte)(this.plugged ? 1 : 0)); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TubeFlow.java b/src/main/java/com/eloraam/redpower/core/TubeFlow.java new file mode 100644 index 0000000..1a9b4c4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TubeFlow.java @@ -0,0 +1,142 @@ +package com.eloraam.redpower.core; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public abstract class TubeFlow { + public LinkedList contents = new LinkedList(); + + public abstract boolean schedule(TubeItem var1, TubeFlow.TubeScheduleContext var2); + + public boolean handleItem(TubeItem item, TubeFlow.TubeScheduleContext context) { + return false; + } + + public abstract TileEntity getParent(); + + public boolean update() { + boolean hasChanged = false; + if (this.contents.size() == 0) { + return false; + } else { + TubeFlow.TubeScheduleContext tsc = new TubeFlow.TubeScheduleContext(this.getParent()); + tsc.tii = this.contents.iterator(); + + while(tsc.tii.hasNext()) { + TubeItem tubeItem = (TubeItem)tsc.tii.next(); + tubeItem.progress = (short)(tubeItem.progress + tubeItem.power + 16); + if (tubeItem.progress >= 128) { + if (tubeItem.power > 0) { + --tubeItem.power; + } + + hasChanged = true; + if (!tubeItem.scheduled) { + if (!this.schedule(tubeItem, tsc)) { + tsc.tii.remove(); + } + } else { + tsc.tii.remove(); + if (!tsc.world.isRemote) { + tsc.tir.add(tubeItem); + } + } + } + } + + if (tsc.world.isRemote) { + } + + for(TubeItem ti : tsc.tir) { + if (ti.side >= 0 && (tsc.cons & 1 << ti.side) != 0) { + tsc.dest = tsc.wc.copy(); + tsc.dest.step(ti.side); + ITubeConnectable itc = CoreLib.getTileEntity(tsc.world, tsc.dest, ITubeConnectable.class); + if (itc instanceof ITubeFlow) { + ITubeFlow itf = (ITubeFlow)itc; + itf.addTubeItem(ti); + } else if ((itc == null || !itc.tubeItemEnter((ti.side ^ 1) & 63, ti.mode, ti)) && !this.handleItem(ti, tsc)) { + ti.progress = 0; + ti.scheduled = false; + ti.mode = 2; + this.contents.add(ti); + } + } else if (tsc.cons == 0) { + MachineLib.ejectItem(tsc.world, tsc.wc, ti.item, 1); + } else { + ti.side = (byte)Integer.numberOfTrailingZeros(tsc.cons); + ti.progress = 128; + ti.scheduled = false; + this.contents.add(ti); + hasChanged = true; + } + } + + return hasChanged; + } + } + + public void add(TubeItem ti) { + ti.progress = 0; + ti.scheduled = false; + this.contents.add(ti); + } + + public void onRemove() { + TileEntity te = this.getParent(); + + for(TubeItem ti : this.contents) { + if (ti != null && ti.item.stackSize > 0) { + CoreLib.dropItem(te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord, ti.item); + } + } + + } + + public void readFromNBT(NBTTagCompound tag) { + NBTTagList items = tag.getTagList("Items", 10); + if (items.tagCount() > 0) { + this.contents = new LinkedList(); + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + this.contents.add(TubeItem.newFromNBT(item)); + } + } + + } + + public void writeToNBT(NBTTagCompound tag) { + NBTTagList items = new NBTTagList(); + if (this.contents != null) { + for(TubeItem ti : this.contents) { + NBTTagCompound item = new NBTTagCompound(); + ti.writeToNBT(item); + items.appendTag(item); + } + } + + tag.setTag("Items", items); + } + + public static class TubeScheduleContext { + public World world; + public WorldCoord wc; + public int cons; + public List tir = new ArrayList(); + public Iterator tii; + public WorldCoord dest = null; + + public TubeScheduleContext(TileEntity te) { + this.world = te.getWorldObj(); + this.wc = new WorldCoord(te); + this.cons = TubeLib.getConnections(this.world, this.wc.x, this.wc.y, this.wc.z); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TubeItem.java b/src/main/java/com/eloraam/redpower/core/TubeItem.java new file mode 100644 index 0000000..f28c861 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TubeItem.java @@ -0,0 +1,83 @@ +package com.eloraam.redpower.core; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class TubeItem { + public short progress = 0; + public byte mode = 1; + public byte side; + public byte color = 0; + public short power = 0; + public boolean scheduled = false; + public short priority = 0; + public ItemStack item; + + public TubeItem() { + } + + public TubeItem(int s, ItemStack stk) { + this.item = stk; + this.side = (byte)s; + } + + public void readFromNBT(NBTTagCompound nbt) { + this.item = ItemStack.loadItemStackFromNBT(nbt); + this.side = nbt.getByte("side"); + this.progress = nbt.getShort("pos"); + this.mode = nbt.getByte("mode"); + this.color = nbt.getByte("col"); + this.priority = nbt.getShort("prio"); + if (this.progress < 0) { + this.scheduled = true; + this.progress = (short)(-this.progress - 1); + } + + this.power = (short)(nbt.getByte("pow") & 255); + } + + public void writeToNBT(NBTTagCompound nbt) { + this.item.writeToNBT(nbt); + nbt.setByte("side", this.side); + nbt.setShort("pos", (short)(this.scheduled ? -this.progress - 1 : this.progress)); + nbt.setByte("mode", this.mode); + nbt.setByte("col", this.color); + nbt.setByte("pow", (byte)this.power); + nbt.setShort("prio", this.priority); + } + + public static TubeItem newFromNBT(NBTTagCompound nbt) { + TubeItem ti = new TubeItem(); + ti.readFromNBT(nbt); + return ti; + } + + public void readFromPacket(NBTTagCompound tag) { + this.side = tag.getByte("side"); + this.progress = (short)tag.getByte("pos"); + if (this.progress < 0) { + this.scheduled = true; + this.progress = (short)(-this.progress - 1); + } + + this.color = tag.getByte("col"); + this.power = (short)tag.getByte("pow"); + this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)tag.getTag("itm")); + } + + public void writeToPacket(NBTTagCompound tag) { + tag.setByte("side", this.side); + tag.setByte("pos", (byte)((int)(this.scheduled ? (long)(-this.progress - 1) : (long)this.progress))); + tag.setByte("col", this.color); + tag.setByte("pow", (byte)this.power); + NBTTagCompound itag = new NBTTagCompound(); + this.item.writeToNBT(itag); + tag.setTag("itm", itag); + } + + public static TubeItem newFromPacket(NBTTagCompound tag) { + TubeItem ti = new TubeItem(); + ti.readFromPacket(tag); + return ti; + } +} diff --git a/src/main/java/com/eloraam/redpower/core/TubeLib.java b/src/main/java/com/eloraam/redpower/core/TubeLib.java new file mode 100644 index 0000000..a7c7869 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/TubeLib.java @@ -0,0 +1,329 @@ +package com.eloraam.redpower.core; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Set; +import java.util.stream.IntStream; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class TubeLib { + private static Set> tubeClassMapping = new HashSet(); + + public static void addCompatibleMapping(int a, int b) { + tubeClassMapping.add(Arrays.asList(a, b)); + tubeClassMapping.add(Arrays.asList(b, a)); + } + + public static boolean isCompatible(int a, int b) { + return a == b || tubeClassMapping.contains(Arrays.asList(a, b)); + } + + private static boolean isConSide(IBlockAccess iba, int x, int y, int z, int col, int side) { + TileEntity te = iba.getTileEntity(x, y, z); + if (te instanceof ITubeConnectable) { + ITubeConnectable itc = (ITubeConnectable)te; + if (!isCompatible(col, itc.getTubeConClass())) { + return false; + } else { + int sides = itc.getTubeConnectableSides(); + return (sides & 1 << side) > 0; + } + } else { + if (isCompatible(col, 0) && te instanceof IInventory) { + if (!(te instanceof ISidedInventory)) { + return true; + } + + ISidedInventory isi = (ISidedInventory)te; + if (isi.getSizeInventory() > 0) { + int[] slots = isi.getAccessibleSlotsFromSide(side); + return slots != null && slots.length > 0; + } + } + + return false; + } + } + + public static int getConnections(IBlockAccess iba, int x, int y, int z) { + ITubeConnectable itc = CoreLib.getTileEntity(iba, x, y, z, ITubeConnectable.class); + if (itc == null) { + return 0; + } else { + int trs = 0; + int col = itc.getTubeConClass(); + int sides = itc.getTubeConnectableSides(); + if ((sides & 1) > 0 && isConSide(iba, x, y - 1, z, col, 1)) { + trs |= 1; + } + + if ((sides & 2) > 0 && isConSide(iba, x, y + 1, z, col, 0)) { + trs |= 2; + } + + if ((sides & 4) > 0 && isConSide(iba, x, y, z - 1, col, 3)) { + trs |= 4; + } + + if ((sides & 8) > 0 && isConSide(iba, x, y, z + 1, col, 2)) { + trs |= 8; + } + + if ((sides & 16) > 0 && isConSide(iba, x - 1, y, z, col, 5)) { + trs |= 16; + } + + if ((sides & 32) > 0 && isConSide(iba, x + 1, y, z, col, 4)) { + trs |= 32; + } + + return trs; + } + } + + public static int findRoute(World world, WorldCoord wc, TubeItem te, int sides, int state) { + TubeLib.OutRouteFinder rf = new TubeLib.OutRouteFinder(world, te, state); + return rf.find(wc, sides); + } + + public static int findRoute(World world, WorldCoord wc, TubeItem te, int sides, int state, int start) { + TubeLib.OutRouteFinder rf = new TubeLib.OutRouteFinder(world, te, state); + rf.startDir = start; + return rf.find(wc, sides); + } + + public static boolean addToTubeRoute(World world, ItemStack ist, WorldCoord src, WorldCoord wc, int side) { + return addToTubeRoute(world, new TubeItem(0, ist), src, wc, side); + } + + public static boolean addToTubeRoute(World world, TubeItem ti, WorldCoord src, WorldCoord wc, int side) { + ITubeConnectable ite = CoreLib.getTileEntity(world, wc, ITubeConnectable.class); + if (ite == null) { + return false; + } else { + ti.mode = 1; + int s = findRoute(world, src, ti, 1 << (side ^ 1), 1); + return s >= 0 && ite.tubeItemEnter(side, 0, ti); + } + } + + static { + addCompatibleMapping(0, 17); + addCompatibleMapping(17, 18); + + for(int i = 0; i < 16; ++i) { + addCompatibleMapping(0, 1 + i); + addCompatibleMapping(17, 1 + i); + addCompatibleMapping(17, 19 + i); + addCompatibleMapping(18, 19 + i); + } + + } + + public static class InRouteFinder extends TubeLib.RouteFinder { + MachineLib.FilterMap filterMap; + int subFilt = -1; + + public InRouteFinder(World world, MachineLib.FilterMap map) { + super(world); + this.filterMap = map; + } + + @Override + public void addPoint(WorldCoord wc, int st, int side, int weight) { + IInventory inv = MachineLib.getInventory(super.worldObj, wc); + if (inv == null) { + super.addPoint(wc, st, side, weight); + } else { + int opside = (side ^ 1) & 63; + int[] slots; + if (inv instanceof ISidedInventory) { + ISidedInventory sm = (ISidedInventory)inv; + slots = sm.getAccessibleSlotsFromSide(opside); + } else { + slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + } + + if (this.filterMap.size() == 0) { + if (!MachineLib.emptyInventory(inv, slots)) { + TubeLib.WorldRoute sm2 = new TubeLib.WorldRoute(wc, 0, opside, weight); + sm2.solved = true; + super.scanpos.add(sm2); + } else { + super.addPoint(wc, st, side, weight); + } + } else { + int sm1 = -1; + if (this.subFilt < 0) { + sm1 = MachineLib.matchAnyStack(this.filterMap, inv, slots); + } else if (MachineLib.matchOneStack(this.filterMap, inv, slots, this.subFilt)) { + sm1 = this.subFilt; + } + + if (sm1 < 0) { + super.addPoint(wc, st, side, weight); + } else { + TubeLib.WorldRoute nr = new TubeLib.WorldRoute(wc, sm1, opside, weight); + nr.solved = true; + super.scanpos.add(nr); + } + } + } + + } + + public void setSubFilt(int sf) { + this.subFilt = sf; + } + + public int getResultSide() { + return super.result.side; + } + } + + private static class OutRouteFinder extends TubeLib.RouteFinder { + int state; + TubeItem tubeItem; + + public OutRouteFinder(World world, TubeItem ti, int st) { + super(world); + this.state = st; + this.tubeItem = ti; + } + + @Override + public void addPoint(WorldCoord wc, int start, int side, int weight) { + int opside = (side ^ 1) & 0xFF; + if (this.state != 3 && this.tubeItem.priority == 0 && MachineLib.canAddToInventory(super.worldObj, this.tubeItem.item, wc, opside)) { + TubeLib.WorldRoute route = new TubeLib.WorldRoute(wc, start, side, weight); + route.solved = true; + super.scanpos.add(route); + } else { + ITubeConnectable itc = CoreLib.getTileEntity(super.worldObj, wc, ITubeConnectable.class); + if (itc != null) { + if (itc.tubeItemCanEnter(opside, this.state, this.tubeItem)) { + TubeLib.WorldRoute route = new TubeLib.WorldRoute(wc, start, opside, weight + itc.tubeWeight(opside, this.state)); + route.solved = true; + super.scanpos.add(route); + } else if (itc.tubeItemCanEnter(opside, 0, this.tubeItem) && itc.canRouteItems() && !super.scanmap.contains(wc)) { + super.scanmap.add(wc); + super.scanpos.add(new TubeLib.WorldRoute(wc, start, opside, weight + itc.tubeWeight(opside, this.state))); + } + } + } + + } + } + + public static class RequestRouteFinder extends TubeLib.RouteFinder { + TubeItem tubeItem; + + public RequestRouteFinder(World world, TubeItem item) { + super(world); + this.tubeItem = item; + } + + @Override + public void addPoint(WorldCoord wc, int st, int side, int weight) { + ITubeRequest itr = CoreLib.getTileEntity(super.worldObj, wc, ITubeRequest.class); + if (itr != null) { + if (itr.requestTubeItem(this.tubeItem, false)) { + TubeLib.WorldRoute itc1 = new TubeLib.WorldRoute(wc, 0, side, weight); + itc1.solved = true; + super.scanpos.add(itc1); + } + } else { + ITubeConnectable itc = CoreLib.getTileEntity(super.worldObj, wc, ITubeConnectable.class); + if (itc != null) { + int side1 = (side ^ 1) & 0xFF; + if (itc.tubeItemCanEnter(side1, 0, this.tubeItem) && itc.canRouteItems() && !super.scanmap.contains(wc)) { + super.scanmap.add(wc); + super.scanpos.add(new TubeLib.WorldRoute(wc, st, side1, weight + itc.tubeWeight(side1, 0))); + } + } + } + + } + } + + private static class RouteFinder { + int startDir = 0; + TubeLib.WorldRoute result; + World worldObj; + Set scanmap = new HashSet(); + PriorityQueue scanpos = new PriorityQueue(); + + public RouteFinder(World world) { + this.worldObj = world; + } + + public void addPoint(WorldCoord wc, int start, int side, int weight) { + ITubeConnectable itc = CoreLib.getTileEntity(this.worldObj, wc, ITubeConnectable.class); + if (itc != null && itc.canRouteItems() && !this.scanmap.contains(wc)) { + this.scanmap.add(wc); + this.scanpos.add(new TubeLib.WorldRoute(wc, start, side ^ 1, weight)); + } + + } + + public int find(WorldCoord wc, int sides) { + for(int wr = 0; wr < 6; ++wr) { + if ((sides & 1 << wr) != 0) { + WorldCoord cons = wc.copy(); + cons.step(wr); + this.addPoint(cons, wr, wr, wr == this.startDir ? 0 : 1); + } + } + + while(this.scanpos.size() > 0) { + TubeLib.WorldRoute route = (TubeLib.WorldRoute)this.scanpos.poll(); + if (route.solved) { + this.result = route; + return route.start; + } + + int cons = TubeLib.getConnections(this.worldObj, route.wc.x, route.wc.y, route.wc.z); + + for(int side = 0; side < 6; ++side) { + if (side != route.side && (cons & 1 << side) != 0) { + WorldCoord wcp = route.wc.copy(); + wcp.step(side); + this.addPoint(wcp, route.start, side, route.weight + 2); + } + } + } + + return -1; + } + + public WorldCoord getResultPoint() { + return this.result.wc; + } + } + + private static class WorldRoute implements Comparable { + public WorldCoord wc; + public int start; + public int side; + public int weight; + public boolean solved = false; + + public WorldRoute(WorldCoord w, int st, int s, int wt) { + this.wc = w; + this.start = st; + this.side = s; + this.weight = wt; + } + + public int compareTo(TubeLib.WorldRoute wr) { + return this.weight - wr.weight; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/Vector3.java b/src/main/java/com/eloraam/redpower/core/Vector3.java new file mode 100644 index 0000000..9d5a501 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/Vector3.java @@ -0,0 +1,106 @@ +package com.eloraam.redpower.core; + +import java.util.Formatter; +import java.util.Locale; + +public class Vector3 { + public double x; + public double y; + public double z; + + public Vector3() { + } + + public Vector3(double xi, double yi, double zi) { + this.x = xi; + this.y = yi; + this.z = zi; + } + + public Vector3(Vector3 v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + } + + public Object clone() { + return new Vector3(this); + } + + public void set(double xi, double yi, double zi) { + this.x = xi; + this.y = yi; + this.z = zi; + } + + public void set(Vector3 v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + } + + public double dotProduct(Vector3 v) { + return v.x * this.x + v.y * this.y + v.z * this.z; + } + + public double dotProduct(double xi, double yi, double zi) { + return xi * this.x + yi * this.y + zi * this.z; + } + + public void crossProduct(Vector3 v) { + double tx = this.y * v.z - this.z * v.y; + double ty = this.z * v.x - this.x * v.z; + double tz = this.x * v.y - this.y * v.x; + this.x = tx; + this.y = ty; + this.z = tz; + } + + public void add(double xi, double yi, double zi) { + this.x += xi; + this.y += yi; + this.z += zi; + } + + public void add(Vector3 v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + } + + public void subtract(Vector3 v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + } + + public void multiply(double d) { + this.x *= d; + this.y *= d; + this.z *= d; + } + + public double mag() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + } + + public double magSquared() { + return this.x * this.x + this.y * this.y + this.z * this.z; + } + + public void normalize() { + double d = this.mag(); + if (d != 0.0) { + this.multiply(1.0 / d); + } + + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Formatter fmt = new Formatter(sb, Locale.US); + fmt.format("Vector:\n"); + fmt.format(" < %f %f %f >\n", this.x, this.y, this.z); + return sb.toString(); + } +} diff --git a/src/main/java/com/eloraam/redpower/core/WirePathfinder.java b/src/main/java/com/eloraam/redpower/core/WirePathfinder.java new file mode 100644 index 0000000..2db0e90 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/WirePathfinder.java @@ -0,0 +1,80 @@ +package com.eloraam.redpower.core; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; + +public abstract class WirePathfinder { + Set scanmap; + LinkedList scanpos; + + public void init() { + this.scanmap = new HashSet(); + this.scanpos = new LinkedList(); + } + + public void addSearchBlock(WorldCoord wc) { + if (!this.scanmap.contains(wc)) { + this.scanmap.add(wc); + this.scanpos.addLast(wc); + } + + } + + private void addIndBl(WorldCoord wc, int d1, int d2) { + wc = wc.coordStep(d1); + int d3; + switch(d1) { + case 0: + d3 = d2 + 2; + break; + case 1: + d3 = d2 + 2; + break; + case 2: + d3 = d2 + (d2 & 2); + break; + case 3: + d3 = d2 + (d2 & 2); + break; + case 4: + d3 = d2; + break; + default: + d3 = d2; + } + + wc.step(d3); + this.addSearchBlock(wc); + } + + public void addSearchBlocks(WorldCoord wc, int cons, int indcon) { + for(int side = 0; side < 6; ++side) { + if ((cons & RedPowerLib.getConDirMask(side)) > 0) { + this.addSearchBlock(wc.coordStep(side)); + } + } + + for(int side = 0; side < 6; ++side) { + for(int b = 0; b < 4; ++b) { + if ((indcon & 1 << side * 4 + b) > 0) { + this.addIndBl(wc, side, b); + } + } + } + + } + + public boolean step(WorldCoord coord) { + return false; + } + + public boolean iterate() { + if (this.scanpos.size() == 0) { + return false; + } else { + WorldCoord wc = (WorldCoord)this.scanpos.removeFirst(); + return this.step(wc); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/core/WorldCoord.java b/src/main/java/com/eloraam/redpower/core/WorldCoord.java new file mode 100644 index 0000000..ca4f8c0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/core/WorldCoord.java @@ -0,0 +1,188 @@ +package com.eloraam.redpower.core; + +import java.util.Comparator; +import net.minecraft.tileentity.TileEntity; + +public class WorldCoord implements Comparable { + public int x; + public int y; + public int z; + + public WorldCoord(int xi, int yi, int zi) { + this.x = xi; + this.y = yi; + this.z = zi; + } + + public WorldCoord(TileEntity te) { + this.x = te.xCoord; + this.y = te.yCoord; + this.z = te.zCoord; + } + + public WorldCoord copy() { + return new WorldCoord(this.x, this.y, this.z); + } + + public WorldCoord coordStep(int dir) { + switch(dir) { + case 0: + return new WorldCoord(this.x, this.y - 1, this.z); + case 1: + return new WorldCoord(this.x, this.y + 1, this.z); + case 2: + return new WorldCoord(this.x, this.y, this.z - 1); + case 3: + return new WorldCoord(this.x, this.y, this.z + 1); + case 4: + return new WorldCoord(this.x - 1, this.y, this.z); + default: + return new WorldCoord(this.x + 1, this.y, this.z); + } + } + + public void set(WorldCoord wc) { + this.x = wc.x; + this.y = wc.y; + this.z = wc.z; + } + + public int squareDist(int xi, int yi, int zi) { + return (xi - this.x) * (xi - this.x) + (yi - this.y) * (yi - this.y) + (zi - this.z) * (zi - this.z); + } + + public void step(int dir) { + switch(dir) { + case 0: + --this.y; + break; + case 1: + ++this.y; + break; + case 2: + --this.z; + break; + case 3: + ++this.z; + break; + case 4: + --this.x; + break; + default: + ++this.x; + } + + } + + public void step(int dir, int dist) { + switch(dir) { + case 0: + this.y -= dist; + break; + case 1: + this.y += dist; + break; + case 2: + this.z -= dist; + break; + case 3: + this.z += dist; + break; + case 4: + this.x -= dist; + break; + default: + this.x += dist; + } + + } + + public static int getRightDir(int dir) { + if (dir < 2) { + return dir; + } else { + switch(dir) { + case 0: + return 0; + case 1: + return 1; + case 2: + return 4; + case 3: + return 5; + case 4: + return 3; + default: + return 2; + } + } + } + + public static int getIndStepDir(int d1, int d2) { + switch(d1) { + case 0: + return d2 + 2; + case 1: + return d2 + 2; + case 2: + return d2 + (d2 & 2); + case 3: + return d2 + (d2 & 2); + case 4: + return d2; + default: + return d2; + } + } + + public void indStep(int d1, int d2) { + this.step(d1); + this.step(getIndStepDir(d1, d2)); + } + + public int hashCode() { + return this.x + 31 * (this.y + 31 * this.z); + } + + public int compareTo(WorldCoord wc) { + return this.x == wc.x ? (this.y == wc.y ? this.z - wc.z : this.y - wc.y) : this.x - wc.x; + } + + public boolean equals(Object obj) { + if (!(obj instanceof WorldCoord)) { + return false; + } else { + WorldCoord wc = (WorldCoord)obj; + return this.x == wc.x && this.y == wc.y && this.z == wc.z; + } + } + + public static Comparator getCompareDir(int dir) { + return new WorldCoord.WCComparator(dir); + } + + public static class WCComparator implements Comparator { + int dir; + + private WCComparator(int d) { + this.dir = d; + } + + public int compare(WorldCoord wa, WorldCoord wb) { + switch(this.dir) { + case 0: + return wa.y - wb.y; + case 1: + return wb.y - wa.y; + case 2: + return wa.z - wb.z; + case 3: + return wb.z - wa.z; + case 4: + return wa.x - wb.x; + default: + return wb.x - wa.x; + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/BlockLamp.java b/src/main/java/com/eloraam/redpower/lighting/BlockLamp.java new file mode 100644 index 0000000..637f43f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/BlockLamp.java @@ -0,0 +1,56 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.RedPowerLighting; +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.CoreLib; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockLamp extends BlockExtended { + public BlockLamp() { + super(CoreLib.materialRedpower); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + this.setHardness(0.5F); + this.setCreativeTab(RedPowerLighting.tabLamp); + } + + public boolean canRenderInPass(int pass) { + return true; + } + + @Override + public boolean isOpaqueCube() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return true; + } + + public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + public int getRenderBlockPass() { + return 1; + } + + public int getLightValue(IBlockAccess iba, int x, int y, int z) { + TileLamp lamp = CoreLib.getTileEntity(iba, x, y, z, TileLamp.class); + return lamp == null ? 0 : lamp.getLightValue(); + } + + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + TileLamp lamp = CoreLib.getTileEntity(world, x, y, z, TileLamp.class); + return lamp != null ? new ItemStack(this, 1, (lamp.Inverted ? 16 : 0) + lamp.Color) : null; + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/BlockShapedLamp.java b/src/main/java/com/eloraam/redpower/lighting/BlockShapedLamp.java new file mode 100644 index 0000000..3502e8a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/BlockShapedLamp.java @@ -0,0 +1,93 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.RedPowerLighting; +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.CoreLib; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockShapedLamp extends BlockExtended { + public BlockShapedLamp() { + super(CoreLib.materialRedpower); + this.setHardness(1.0F); + this.setCreativeTab(RedPowerLighting.tabLamp); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + public boolean isNormalCube() { + return false; + } + + public boolean canProvidePower() { + return true; + } + + public boolean canRenderInPass(int pass) { + return true; + } + + public int getRenderBlockPass() { + return 1; + } + + public int getLightValue(IBlockAccess iba, int x, int y, int z) { + TileShapedLamp lamp = CoreLib.getTileEntity(iba, x, y, z, TileShapedLamp.class); + return lamp == null ? 0 : lamp.getLightValue(); + } + + public void setBlockBoundsBasedOnState(IBlockAccess iba, int x, int y, int z) { + TileShapedLamp lamp = CoreLib.getTileEntity(iba, x, y, z, TileShapedLamp.class); + if (lamp != null) { + AxisAlignedBB bb; + switch(lamp.Style) { + case 0: + bb = this.getRotatedBB(0.125F, 0.0F, 0.125F, 0.875F, 0.5F, 0.875F, lamp.Rotation); + break; + case 1: + bb = this.getRotatedBB(0.1875F, 0.0F, 0.1875F, 0.8125F, 0.75F, 0.8125F, lamp.Rotation); + break; + default: + bb = this.getRotatedBB(0.125F, 0.0F, 0.125F, 0.875F, 0.5F, 0.875F, lamp.Rotation); + } + + this.setBlockBounds((float)bb.minX, (float)bb.minY, (float)bb.minZ, (float)bb.maxX, (float)bb.maxY, (float)bb.maxZ); + } + + super.setBlockBoundsBasedOnState(iba, x, y, z); + } + + private AxisAlignedBB getRotatedBB(float x1, float y1, float z1, float x2, float y2, float z2, int rot) { + switch(rot) { + case 0: + return AxisAlignedBB.getBoundingBox((double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + case 1: + return AxisAlignedBB.getBoundingBox((double)x1, (double)(1.0F - y2), (double)z1, (double)x2, (double)(1.0F - y1), (double)z2); + case 2: + return AxisAlignedBB.getBoundingBox((double)x1, (double)z1, (double)y1, (double)x2, (double)z2, (double)y2); + case 3: + return AxisAlignedBB.getBoundingBox((double)x1, (double)(1.0F - z2), (double)(1.0F - y2), (double)x2, (double)(1.0F - z1), (double)(1.0F - y1)); + case 4: + return AxisAlignedBB.getBoundingBox((double)y1, (double)x1, (double)z1, (double)y2, (double)x2, (double)z2); + default: + return AxisAlignedBB.getBoundingBox((double)(1.0F - y2), (double)(1.0F - x2), (double)z1, (double)(1.0F - y1), (double)(1.0F - x1), (double)z2); + } + } + + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + TileShapedLamp lamp = CoreLib.getTileEntity(world, x, y, z, TileShapedLamp.class); + return lamp != null ? new ItemStack(this, 1, (lamp.getExtendedID() << 10) + (lamp.Style << 5) + (lamp.Inverted ? 16 : 0) + lamp.Color) : null; + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/ItemLamp.java b/src/main/java/com/eloraam/redpower/lighting/ItemLamp.java new file mode 100644 index 0000000..442f46c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/ItemLamp.java @@ -0,0 +1,15 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.core.ItemExtended; +import net.minecraft.block.Block; + +public class ItemLamp extends ItemExtended { + public ItemLamp(Block block) { + super(block); + } + + @Override + public int getMetadata(int meta) { + return meta << 10; + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/RenderLamp.java b/src/main/java/com/eloraam/redpower/lighting/RenderLamp.java new file mode 100644 index 0000000..286e18b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/RenderLamp.java @@ -0,0 +1,140 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.RedPowerLighting; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderLamp extends RenderCustomBlock { + static int[] lightColors = new int[]{ + 16777215, 12608256, 11868853, 7308529, 12566272, 7074048, 15812213, 5460819, 9671571, 34695, 6160576, 1250240, 5187328, 558848, 10620678, 2039583 + }; + static int[] lightColorsOff = new int[16]; + private RenderContext context = new RenderContext(); + + public RenderLamp(BlockLamp block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileLamp lamp = (TileLamp)tile; + World world = tile.getWorldObj(); + GL11.glDisable(2896); + boolean lit = lamp.Powered != lamp.Inverted; + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, tile.xCoord, tile.yCoord, tile.zCoord); + if (MinecraftForgeClient.getRenderPass() == 0) { + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.setIcon(lit ? RedPowerLighting.lampOn[lamp.Color] : RedPowerLighting.lampOff[lamp.Color]); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + } + + if (MinecraftForgeClient.getRenderPass() == 1 && lit) { + GL11.glDisable(3553); + GL11.glEnable(3008); + GL11.glAlphaFunc(516, 0.1F); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + GL11.glDisable(2884); + this.context.setPos(x, y, z); + this.context.setTintHex(lightColors[lamp.Color]); + this.context.setLocalLights(1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F); + this.context.setSize(-0.05, -0.05, -0.05, 1.05, 1.05, 1.05); + this.context.setupBox(); + this.context.transform(); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.doMappingBox(0); + this.context.doLightLocal(63); + tess.startDrawingQuads(); + this.context.renderAlpha(63, 0.5F); + tess.draw(); + GL11.glEnable(2884); + GL11.glDisable(3042); + GL11.glEnable(3553); + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + boolean lit = (meta & 16) > 0; + Tessellator tess = Tessellator.instance; + this.context.setIcon(lit ? RedPowerLighting.lampOn[meta & 15] : RedPowerLighting.lampOff[meta & 15]); + tess.startDrawingQuads(); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + if (lit) { + GL11.glBlendFunc(770, 1); + GL11.glDisable(3553); + GL11.glDisable(2896); + this.context.setTintHex(lightColors[meta & 15]); + this.context.setLocalLights(1.0F, 1.0F, 1.0F, 1.0F, 1.0F, 1.0F); + this.context.setSize(-0.05, -0.05, -0.05, 1.05, 1.05, 1.05); + this.context.setupBox(); + this.context.transform(); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.doMappingBox(0); + this.context.doLightLocal(63); + tess.startDrawingQuads(); + this.context.renderAlpha(63, 0.5F); + tess.draw(); + GL11.glEnable(3553); + GL11.glEnable(2896); + GL11.glBlendFunc(770, 771); + } + + } + + @Override + public IIcon getParticleIconForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + if (tile instanceof TileLamp) { + TileLamp lamp = (TileLamp)tile; + return lamp.Powered != lamp.Inverted ? RedPowerLighting.lampOn[lamp.Color] : RedPowerLighting.lampOff[lamp.Color]; + } else { + return super.getParticleIconForSide(world, x, y, z, tile, side, meta); + } + } + + static { + for(int i = 0; i < 16; ++i) { + int r = lightColors[i] & 0xFF; + int g = lightColors[i] >> 8 & 0xFF; + int b = lightColors[i] >> 16 & 0xFF; + int v = (r + g + b) / 3; + r = (r + 2 * v) / 5; + g = (g + 2 * v) / 5; + b = (b + 2 * v) / 5; + lightColorsOff[i] = r | g << 8 | b << 16; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/RenderShapedLamp.java b/src/main/java/com/eloraam/redpower/lighting/RenderShapedLamp.java new file mode 100644 index 0000000..bc1d59d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/RenderShapedLamp.java @@ -0,0 +1,153 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.RedPowerLighting; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderShapedLamp extends RenderCustomBlock { + private RenderContext context = new RenderContext(); + private RenderModel modelLamp1 = RenderModel.loadModel("rplighting:models/shlamp1.obj"); + private RenderModel modelLamp2 = RenderModel.loadModel("rplighting:models/shlamp2.obj"); + private ResourceLocation lampRes = new ResourceLocation("rplighting", "models/shlamp.png"); + + public RenderShapedLamp(BlockShapedLamp lamp) { + super(lamp); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileShapedLamp shapedLamp = (TileShapedLamp)tile; + World world = shapedLamp.getWorldObj(); + GL11.glDisable(2896); + GL11.glEnable(3008); + GL11.glAlphaFunc(516, 0.1F); + Tessellator tess = Tessellator.instance; + boolean lit = shapedLamp.Powered != shapedLamp.Inverted; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(shapedLamp.Rotation, 0); + this.context.readGlobalLights(world, tile.xCoord, tile.yCoord, tile.zCoord); + switch(shapedLamp.Style) { + case 0: + this.context.bindModelOffset(this.modelLamp1, 0.5, 0.5, 0.5); + break; + case 1: + this.context.bindModelOffset(this.modelLamp2, 0.5, 0.5, 0.5); + } + + this.context.bindTexture(this.lampRes); + this.context.setBrightness(this.getMixedBrightness(tile)); + if (MinecraftForgeClient.getRenderPass() == 0) { + tess.startDrawingQuads(); + this.context.renderModelGroup(0, 0); + if (lit) { + this.context.setTintHex(RenderLamp.lightColors[shapedLamp.Color & 15]); + this.context.setBrightness(15728880); + } else { + this.context.setTintHex(RenderLamp.lightColorsOff[shapedLamp.Color & 15]); + } + + this.context.renderModelGroup(1, 0); + tess.draw(); + } + + if (MinecraftForgeClient.getRenderPass() == 1 && lit) { + GL11.glDisable(3553); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + GL11.glDisable(2884); + this.context.setTintHex(RenderLamp.lightColors[shapedLamp.Color & 15]); + this.context.setAlpha(0.3F); + tess.startDrawingQuads(); + this.context.renderModelGroup(2, 0); + tess.draw(); + GL11.glEnable(2884); + GL11.glDisable(3042); + GL11.glEnable(3553); + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.bindTexture(this.lampRes); + tess.startDrawingQuads(); + this.context.useNormal = true; + switch(meta >> 5) { + case 0: + this.context.bindModelOffset(this.modelLamp1, 0.5, 0.5, 0.5); + break; + case 1: + this.context.bindModelOffset(this.modelLamp2, 0.5, 0.5, 0.5); + } + + this.context.renderModelGroup(0, 0); + if ((meta & 16) > 0) { + this.context.setTintHex(RenderLamp.lightColors[meta & 15]); + } else { + this.context.setTintHex(RenderLamp.lightColorsOff[meta & 15]); + } + + this.context.renderModelGroup(1, 0); + this.context.useNormal = false; + tess.draw(); + if ((meta & 16) > 0) { + GL11.glBlendFunc(770, 1); + GL11.glDisable(3553); + GL11.glDisable(2896); + this.context.setTintHex(RenderLamp.lightColors[meta & 15]); + this.context.setAlpha(0.3F); + tess.startDrawingQuads(); + this.context.renderModelGroup(2, 0); + tess.draw(); + GL11.glDisable(3008); + GL11.glEnable(2896); + GL11.glEnable(3553); + GL11.glBlendFunc(770, 771); + } + + } + + @Override + public IIcon getParticleIconForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + if (tile instanceof TileShapedLamp) { + TileShapedLamp lamp = (TileShapedLamp)tile; + return lamp.Powered != lamp.Inverted ? RedPowerLighting.lampOn[lamp.Color] : RedPowerLighting.lampOff[lamp.Color]; + } else { + return super.getParticleIconForSide(world, x, y, z, tile, side, meta); + } + } + + @Override + public int getParticleColorForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + if (tile instanceof TileShapedLamp) { + TileShapedLamp lamp = (TileShapedLamp)tile; + return (lamp.Powered != lamp.Inverted ? RenderLamp.lightColors : RenderLamp.lightColorsOff)[lamp.Color]; + } else { + return super.getParticleColorForSide(world, x, y, z, tile, side, meta); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/TileLamp.java b/src/main/java/com/eloraam/redpower/lighting/TileLamp.java new file mode 100644 index 0000000..587eae7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/TileLamp.java @@ -0,0 +1,132 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileExtended; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.IBlockAccess; + +public class TileLamp extends TileExtended implements IFrameSupport { + public boolean Powered = false; + public boolean Inverted = false; + public int Color = 0; + + private void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.onBlockNeighborChange(Blocks.air); + this.Inverted = (ist.getItemDamage() & 16) > 0; + this.Color = ist.getItemDamage() & 15; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (this.Powered) { + return; + } + + this.Powered = true; + this.updateLight(); + this.updateBlock(); + } else { + if (!this.Powered) { + return; + } + + this.Powered = false; + this.updateLight(); + this.updateBlock(); + } + + } + + public int getLightValue() { + return this.Powered != this.Inverted ? 15 : 0; + } + + @Override + public void addHarvestContents(List ist) { + ItemStack is = new ItemStack(this.getBlockType(), 1, (this.Inverted ? 16 : 0) + this.Color); + ist.add(is); + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("color", (byte)this.Color); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + byte ps = tag.getByte("ps"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = tag.getByte("color"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + byte ps = data.getByte("ps"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = data.getByte("color"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + data.setByte("ps", (byte)ps); + data.setByte("color", (byte)this.Color); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + byte ps = tag.getByte("ps"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = tag.getByte("color"); + this.updateBlock(); + this.updateLight(); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("color", (byte)this.Color); + } + + public boolean shouldRenderInPass(int pass) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/lighting/TileShapedLamp.java b/src/main/java/com/eloraam/redpower/lighting/TileShapedLamp.java new file mode 100644 index 0000000..d572ef7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/lighting/TileShapedLamp.java @@ -0,0 +1,175 @@ +package com.eloraam.redpower.lighting; + +import com.eloraam.redpower.RedPowerLighting; +import com.eloraam.redpower.core.IConnectable; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileExtended; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.IBlockAccess; + +public class TileShapedLamp extends TileExtended implements IFrameSupport, IConnectable { + public int Rotation = 0; + public boolean Powered = false; + public boolean Inverted = false; + public int Style = 0; + public int Color = 0; + + private void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getConnectableMask() { + return 16777216 << this.Rotation | 15 << (this.Rotation << 2); + } + + @Override + public int getConnectClass(int side) { + return 1; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = side ^ 1; + this.onBlockNeighborChange(Blocks.air); + this.Inverted = (ist.getItemDamage() & 16) > 0; + this.Color = ist.getItemDamage() & 15; + this.Style = (ist.getItemDamage() & 1023) >> 5; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + public Block getBlockType() { + return RedPowerLighting.blockShapedLamp; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + int mask = this.getConnectableMask(); + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, mask & 16777215, mask >> 24)) { + if (this.Powered) { + return; + } + + this.Powered = true; + this.updateLight(); + this.updateBlock(); + } else { + if (!this.Powered) { + return; + } + + this.Powered = false; + this.updateLight(); + this.updateBlock(); + } + + } + + public int getLightValue() { + return this.Powered != this.Inverted ? 15 : 0; + } + + @Override + public void addHarvestContents(List ist) { + ItemStack is = new ItemStack(this.getBlockType(), 1, (this.Style << 5) + (this.Inverted ? 16 : 0) + this.Color); + ist.add(is); + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("color", (byte)this.Color); + tag.setByte("style", (byte)this.Style); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + byte ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = tag.getByte("color"); + this.Style = tag.getByte("style"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + byte ps = data.getByte("ps"); + this.Rotation = data.getByte("rot"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = data.getByte("color"); + this.Style = data.getByte("style"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + data.setByte("ps", (byte)ps); + data.setByte("rot", (byte)this.Rotation); + data.setByte("color", (byte)this.Color); + data.setByte("style", (byte)this.Style); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + byte ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Powered = (ps & 1) > 0; + this.Inverted = (ps & 2) > 0; + this.Color = tag.getByte("color"); + this.Style = tag.getByte("style"); + this.updateBlock(); + this.updateLight(); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + int ps = (this.Powered ? 1 : 0) | (this.Inverted ? 2 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("color", (byte)this.Color); + tag.setByte("style", (byte)this.Style); + } + + public boolean shouldRenderInPass(int pass) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/BlockLogic.java b/src/main/java/com/eloraam/redpower/logic/BlockLogic.java new file mode 100644 index 0000000..2bb6daa --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/BlockLogic.java @@ -0,0 +1,41 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.BlockCoverable; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.IRedPowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.world.IBlockAccess; + +public class BlockLogic extends BlockCoverable { + public BlockLogic() { + super(CoreLib.materialRedpower); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); + this.setHardness(0.1F); + this.setLightLevel(0.625F); + this.setCreativeTab(CreativeExtraTabs.tabWires); + } + + public boolean canConnectRedstone(IBlockAccess iba, int x, int y, int z, int side) { + if (side < 0) { + return false; + } else { + IRedPowerConnectable irp = CoreLib.getTileEntity(iba, x, y, z, IRedPowerConnectable.class); + if (irp == null) { + return false; + } else { + int s = RedPowerLib.mapLocalToRot(irp.getConnectableMask(), 2); + return (s & 1 << side) > 0; + } + } + } + + public int getLightValue(IBlockAccess iba, int x, int y, int z) { + TileLogic tl = CoreLib.getTileEntity(iba, x, y, z, TileLogic.class); + return tl == null ? super.getLightValue(iba, x, y, z) : tl.getLightValue(); + } + + public boolean canProvidePower() { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/ContainerCounter.java b/src/main/java/com/eloraam/redpower/logic/ContainerCounter.java new file mode 100644 index 0000000..893db37 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/ContainerCounter.java @@ -0,0 +1,112 @@ +package com.eloraam.redpower.logic; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import com.google.common.primitives.Ints; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ContainerCounter extends Container implements IHandleGuiEvent { + private int Count = 0; + private int CountMax = 0; + private int Inc = 0; + private int Dec = 0; + private TileLogicStorage tileLogic; + + public ContainerCounter(IInventory inv, TileLogicStorage tf) { + this.tileLogic = tf; + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileLogic.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + return null; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + + for(ICrafting ic : (List)super.crafters) { + if (this.Count != lsc.Count) { + ic.sendProgressBarUpdate(this, 0, lsc.Count); + } + + if (this.CountMax != lsc.CountMax) { + ic.sendProgressBarUpdate(this, 1, lsc.CountMax); + } + + if (this.Inc != lsc.Inc) { + ic.sendProgressBarUpdate(this, 2, lsc.Inc); + } + + if (this.Dec != lsc.Dec) { + ic.sendProgressBarUpdate(this, 3, lsc.Dec); + } + } + + this.Count = lsc.Count; + this.CountMax = lsc.CountMax; + this.Inc = lsc.Inc; + this.Dec = lsc.Dec; + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public void updateProgressBar(int i, int j) { + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + switch(i) { + case 0: + lsc.Count = j; + break; + case 1: + lsc.CountMax = j; + break; + case 2: + lsc.Inc = j; + break; + case 3: + lsc.Dec = j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + + try { + switch(message.eventId) { + case 0: + lsc.Count = Ints.fromByteArray(message.parameters); + this.tileLogic.updateBlock(); + break; + case 1: + lsc.CountMax = Ints.fromByteArray(message.parameters); + this.tileLogic.updateBlock(); + break; + case 2: + lsc.Inc = Ints.fromByteArray(message.parameters); + this.tileLogic.markDirty(); + break; + case 3: + lsc.Dec = Ints.fromByteArray(message.parameters); + this.tileLogic.markDirty(); + } + } catch (Throwable var4) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/ContainerTimer.java b/src/main/java/com/eloraam/redpower/logic/ContainerTimer.java new file mode 100644 index 0000000..660fab8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/ContainerTimer.java @@ -0,0 +1,77 @@ +package com.eloraam.redpower.logic; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import com.google.common.primitives.Longs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ContainerTimer extends Container implements IHandleGuiEvent { + private long interval = 0L; + private TileLogicPointer tileLogic; + private short[] tmp = new short[4]; + private int tmpcounter; + + public ContainerTimer(IInventory inv, TileLogicPointer tf) { + this.tileLogic = tf; + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileLogic.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + return null; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + long iv = this.tileLogic.getInterval(); + + for(ICrafting ic : (List)super.crafters) { + if (iv != this.interval) { + ic.sendProgressBarUpdate(this, 0, (short)((int)(iv >> 48 & 32767L))); + ic.sendProgressBarUpdate(this, 1, (short)((int)(iv >> 32 & 32767L))); + ic.sendProgressBarUpdate(this, 2, (short)((int)(iv >> 16 & 32767L))); + ic.sendProgressBarUpdate(this, 3, (short)((int)(iv & 32767L))); + } + } + + this.interval = iv; + } + + public void updateProgressBar(int id, int value) { + this.tmp[id] = (short)value; + if (this.tmpcounter++ >= 3) { + this.tileLogic.setInterval((long)this.tmp[0] << 48 | (long)this.tmp[1] << 32 | (long)this.tmp[2] << 16 | (long)this.tmp[3]); + this.tmp[0] = this.tmp[1] = this.tmp[2] = this.tmp[3] = 0; + this.tmpcounter = 0; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + long i = Longs.fromByteArray(message.parameters); + this.tileLogic.setInterval(i); + if (this.tileLogic.getWorldObj() != null) { + this.tileLogic.updateBlock(); + } + } + } catch (Throwable var4) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/GuiCounter.java b/src/main/java/com/eloraam/redpower/logic/GuiCounter.java new file mode 100644 index 0000000..512edd0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/GuiCounter.java @@ -0,0 +1,188 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import com.google.common.primitives.Ints; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +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; + +public class GuiCounter extends GuiContainer { + private TileLogicStorage tileLogic; + private GuiButton[] buttons = new GuiButton[18]; + private ResourceLocation guiRes = new ResourceLocation("rplogic", "textures/gui/countergui.png"); + + public GuiCounter(InventoryPlayer pli, TileLogicStorage te) { + super(new ContainerCounter(pli, te)); + super.xSize = 228; + super.ySize = 117; + this.tileLogic = te; + } + + public GuiCounter(Container cn) { + super(cn); + super.xSize = 228; + super.ySize = 117; + } + + public void initGui() { + super.initGui(); + int bw = super.xSize - 20; + int l = (super.width - super.xSize) / 2; + int m = (super.height - super.ySize) / 2; + super.buttonList.add(this.buttons[0] = new GuiButton(1, l + 10, m + 20, bw / 6, 20, "-25")); + super.buttonList.add(this.buttons[1] = new GuiButton(2, l + 10 + bw / 6, m + 20, bw / 6, 20, "-5")); + super.buttonList.add(this.buttons[2] = new GuiButton(3, l + 10 + bw * 2 / 6, m + 20, bw / 6, 20, "-1")); + super.buttonList.add(this.buttons[3] = new GuiButton(4, l + 10 + bw * 3 / 6, m + 20, bw / 6, 20, "+1")); + super.buttonList.add(this.buttons[4] = new GuiButton(5, l + 10 + bw * 4 / 6, m + 20, bw / 6, 20, "+5")); + super.buttonList.add(this.buttons[5] = new GuiButton(6, l + 10 + bw * 5 / 6, m + 20, bw / 6, 20, "+25")); + super.buttonList.add(this.buttons[6] = new GuiButton(7, l + 10, m + 55, bw / 6, 20, "-25")); + super.buttonList.add(this.buttons[7] = new GuiButton(8, l + 10 + bw / 6, m + 55, bw / 6, 20, "-5")); + super.buttonList.add(this.buttons[8] = new GuiButton(9, l + 10 + bw * 2 / 6, m + 55, bw / 6, 20, "-1")); + super.buttonList.add(this.buttons[9] = new GuiButton(10, l + 10 + bw * 3 / 6, m + 55, bw / 6, 20, "+1")); + super.buttonList.add(this.buttons[10] = new GuiButton(11, l + 10 + bw * 4 / 6, m + 55, bw / 6, 20, "+5")); + super.buttonList.add(this.buttons[11] = new GuiButton(12, l + 10 + bw * 5 / 6, m + 55, bw / 6, 20, "+25")); + super.buttonList.add(this.buttons[12] = new GuiButton(13, l + 10, m + 90, bw / 6, 20, "-25")); + super.buttonList.add(this.buttons[13] = new GuiButton(14, l + 10 + bw / 6, m + 90, bw / 6, 20, "-5")); + super.buttonList.add(this.buttons[14] = new GuiButton(15, l + 10 + bw * 2 / 6, m + 90, bw / 6, 20, "-1")); + super.buttonList.add(this.buttons[15] = new GuiButton(16, l + 10 + bw * 3 / 6, m + 90, bw / 6, 20, "+1")); + super.buttonList.add(this.buttons[16] = new GuiButton(17, l + 10 + bw * 4 / 6, m + 90, bw / 6, 20, "+5")); + super.buttonList.add(this.buttons[17] = new GuiButton(18, l + 10 + bw * 5 / 6, m + 90, bw / 6, 20, "+25")); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + FontRenderer fontrenderer = super.mc.fontRenderer; + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(this.guiRes); + int l = (super.width - super.xSize) / 2; + int m = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(l, m, 0, 0, super.xSize, super.ySize); + String str = String.format("Maximum Count: %d", lsc.CountMax); + this.drawCenteredString(fontrenderer, str, super.width / 2, m + 10, -1); + str = String.format("Increment: %d", lsc.Inc); + this.drawCenteredString(fontrenderer, str, super.width / 2, m + 45, -1); + str = String.format("Decrement: %d", lsc.Dec); + this.drawCenteredString(fontrenderer, str, super.width / 2, m + 80, -1); + } + + public void changeCountMax(int cc) { + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + lsc.CountMax += cc; + if (lsc.CountMax < 1) { + lsc.CountMax = 1; + } + + if (!super.mc.theWorld.isRemote) { + this.tileLogic.updateBlock(); + } else { + byte[] i = Ints.toByteArray(lsc.CountMax); + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, i)); + } + + } + + public void changeInc(int cc) { + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + lsc.Inc += cc; + if (lsc.Inc < 1) { + lsc.Inc = 1; + } + + if (!super.mc.theWorld.isRemote) { + this.tileLogic.updateBlock(); + } else { + byte[] i = Ints.toByteArray(lsc.Inc); + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, i)); + } + + } + + public void changeDec(int cc) { + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)this.tileLogic + .getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + lsc.Dec += cc; + if (lsc.Dec < 1) { + lsc.Dec = 1; + } + + if (!super.mc.theWorld.isRemote) { + this.tileLogic.updateBlock(); + } else { + byte[] i = Ints.toByteArray(lsc.Dec); + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(3, super.inventorySlots.windowId, i)); + } + + } + + protected void actionPerformed(GuiButton guibutton) { + if (guibutton.enabled) { + switch(guibutton.id) { + case 1: + this.changeCountMax(-25); + break; + case 2: + this.changeCountMax(-5); + break; + case 3: + this.changeCountMax(-1); + break; + case 4: + this.changeCountMax(1); + break; + case 5: + this.changeCountMax(5); + break; + case 6: + this.changeCountMax(25); + break; + case 7: + this.changeInc(-25); + break; + case 8: + this.changeInc(-5); + break; + case 9: + this.changeInc(-1); + break; + case 10: + this.changeInc(1); + break; + case 11: + this.changeInc(5); + break; + case 12: + this.changeInc(25); + break; + case 13: + this.changeDec(-25); + break; + case 14: + this.changeDec(-5); + break; + case 15: + this.changeDec(-1); + break; + case 16: + this.changeDec(1); + break; + case 17: + this.changeDec(5); + break; + case 18: + this.changeDec(25); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/GuiTimer.java b/src/main/java/com/eloraam/redpower/logic/GuiTimer.java new file mode 100644 index 0000000..b7d321e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/GuiTimer.java @@ -0,0 +1,97 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import com.google.common.primitives.Longs; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +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; + +public class GuiTimer extends GuiContainer { + private TileLogicPointer tileLogic; + private GuiButton[] buttons = new GuiButton[6]; + private ResourceLocation guiRes = new ResourceLocation("rplogic", "textures/gui/timersgui.png"); + + public GuiTimer(InventoryPlayer pli, TileLogicPointer te) { + this(new ContainerTimer(pli, te)); + this.tileLogic = te; + } + + public GuiTimer(Container cn) { + super(cn); + super.xSize = 228; + super.ySize = 82; + } + + public void initGui() { + super.initGui(); + int bw = super.xSize - 20; + int l = (super.width - super.xSize) / 2; + int m = (super.height - super.ySize) / 2; + super.buttonList.add(this.buttons[0] = new GuiButton(1, l + 10, m + 50, bw / 6, 20, "-10s")); + super.buttonList.add(this.buttons[1] = new GuiButton(2, l + 10 + bw / 6, m + 50, bw / 6, 20, "-1s")); + super.buttonList.add(this.buttons[2] = new GuiButton(3, l + 10 + bw * 2 / 6, m + 50, bw / 6, 20, "-50ms")); + super.buttonList.add(this.buttons[3] = new GuiButton(4, l + 10 + bw * 3 / 6, m + 50, bw / 6, 20, "+50ms")); + super.buttonList.add(this.buttons[4] = new GuiButton(5, l + 10 + bw * 4 / 6, m + 50, bw / 6, 20, "+1s")); + super.buttonList.add(this.buttons[5] = new GuiButton(6, l + 10 + bw * 5 / 6, m + 50, bw / 6, 20, "+10s")); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + FontRenderer fontrenderer = super.mc.fontRenderer; + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(this.guiRes); + int l = (super.width - super.xSize) / 2; + int m = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(l, m, 0, 0, super.xSize, super.ySize); + String str = String.format("Timer Interval: %.3fs", (double)this.tileLogic.getInterval() / 20.0); + this.drawCenteredString(fontrenderer, str, super.width / 2, m + 10, -1); + } + + public void changeInterval(int cc) { + long iv = this.tileLogic.getInterval() + (long)cc; + if (iv < 4L) { + iv = 4L; + } + + this.tileLogic.setInterval(iv); + if (!super.mc.theWorld.isRemote) { + this.tileLogic.updateBlock(); + } else { + byte[] i = Longs.toByteArray(iv); + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, i)); + } + + } + + protected void actionPerformed(GuiButton button) { + if (button.enabled) { + switch(button.id) { + case 1: + this.changeInterval(-200); + break; + case 2: + this.changeInterval(-20); + break; + case 3: + this.changeInterval(-1); + break; + case 4: + this.changeInterval(1); + break; + case 5: + this.changeInterval(20); + break; + case 6: + this.changeInterval(200); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/IPointerTile.java b/src/main/java/com/eloraam/redpower/logic/IPointerTile.java new file mode 100644 index 0000000..83d80e8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/IPointerTile.java @@ -0,0 +1,9 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.Quat; + +public interface IPointerTile { + float getPointerDirection(float var1); + + Quat getOrientationBasis(); +} diff --git a/src/main/java/com/eloraam/redpower/logic/ItemLogic.java b/src/main/java/com/eloraam/redpower/logic/ItemLogic.java new file mode 100644 index 0000000..3644200 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/ItemLogic.java @@ -0,0 +1,119 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ItemExtended; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemLogic extends ItemExtended { + public ItemLogic(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public void placeNoise(World world, int x, int y, int z, Block block) { + world.playSoundEffect( + (double)((float)x + 0.5F), + (double)((float)y + 0.5F), + (double)((float)z + 0.5F), + "step.stone", + (block.stepSound.getVolume() + 1.0F) / 2.0F, + block.stepSound.getPitch() * 0.8F + ); + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + protected boolean tryPlace(ItemStack ist, EntityPlayer player, World world, int i, int j, int k, int l, int down, int rot) { + int md = ist.getItemDamage(); + Block bid = Block.getBlockFromItem(ist.getItem()); + if (!world.setBlock(i, j, k, bid, md >> 8, 3)) { + return false; + } else { + TileLogic tl = CoreLib.getTileEntity(world, i, j, k, TileLogic.class); + if (tl == null) { + return false; + } else { + tl.Rotation = down << 2 | rot; + tl.initSubType(md & 0xFF); + return true; + } + } + } + + protected boolean itemUseShared(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side) { + switch(side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + } + + Block bid = Block.getBlockFromItem(ist.getItem()); + if (!world.canPlaceEntityOnSide(world.getBlock(x, y, z), x, y, z, false, side, player, ist)) { + return false; + } else if (!RedPowerLib.isSideNormal(world, x, y, z, side ^ 1)) { + return false; + } else { + int yaw = (int)Math.floor((double)(player.rotationYaw / 90.0F + 0.5F)) + 1 & 3; + int pitch = (int)Math.floor((double)(player.rotationPitch / 90.0F + 0.5F)); + int down = side ^ 1; + int rot; + switch(down) { + case 0: + rot = yaw; + break; + case 1: + rot = yaw ^ (yaw & 1) << 1; + break; + case 2: + rot = (yaw & 1) > 0 ? (pitch > 0 ? 2 : 0) : 1 - yaw & 3; + break; + case 3: + rot = (yaw & 1) > 0 ? (pitch > 0 ? 2 : 0) : yaw - 1 & 3; + break; + case 4: + rot = (yaw & 1) == 0 ? (pitch > 0 ? 2 : 0) : yaw - 2 & 3; + break; + case 5: + rot = (yaw & 1) == 0 ? (pitch > 0 ? 2 : 0) : 2 - yaw & 3; + break; + default: + rot = 0; + } + + if (!this.tryPlace(ist, player, world, x, y, z, side, down, rot)) { + return true; + } else { + this.placeNoise(world, x, y, z, bid); + --ist.stackSize; + world.markBlockForUpdate(x, y, z); + return true; + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogic.java b/src/main/java/com/eloraam/redpower/logic/RenderLogic.java new file mode 100644 index 0000000..3844893 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogic.java @@ -0,0 +1,269 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerLogic; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RenderCovers; +import com.eloraam.redpower.core.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.init.Blocks; +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 net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public abstract class RenderLogic extends RenderCovers { + public RenderLogic(Block block) { + super(block); + } + + public void renderCovers(IBlockAccess iba, TileLogic tileLogic) { + if (tileLogic.Cover != 255) { + super.context.readGlobalLights(iba, tileLogic.xCoord, tileLogic.yCoord, tileLogic.zCoord); + this.renderCover(tileLogic.Rotation, tileLogic.Cover); + } + + } + + public TileLogic getTileEntity(IBlockAccess iba, int i, int j, int k) { + TileEntity te = iba.getTileEntity(i, j, k); + return !(te instanceof TileLogic) ? null : (TileLogic)te; + } + + public void setMatrixDisplayTick(int i, int j, int k, int rot, Random random) { + float x = (float)i + 0.5F + (random.nextFloat() - 0.5F) * 0.2F; + float y = (float)j + 0.7F + (random.nextFloat() - 0.5F) * 0.2F; + float z = (float)k + 0.5F + (random.nextFloat() - 0.5F) * 0.2F; + super.context.setOrientation(0, rot); + super.context.setPos((double)x, (double)y, (double)z); + } + + public void setMatrixInv(ItemRenderType type) { + super.context.setOrientation(0, 3); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + } + + public void renderWafer(int tx) { + IIcon[] icons; + switch(tx >> 8) { + case 1: + icons = RedPowerLogic.logicTwo; + break; + case 2: + icons = RedPowerLogic.logicSensor; + break; + default: + icons = RedPowerLogic.logicOne; + } + + super.context.setRelPos(0.0, 0.0, 0.0); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setTexFlags(0); + super.context.setSize(0.0, 0.0, 0.0, 1.0, 0.125, 1.0); + super.context.setIcon(icons[0], icons[tx & 0xFF], icons[0], icons[0], icons[0], icons[0]); + super.context.calcBounds(); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.renderFaces(62); + } + + public void renderInvWafer(int tx) { + super.context.useNormal = true; + IIcon[] icons; + switch(tx >> 8) { + case 1: + icons = RedPowerLogic.logicTwo; + break; + case 2: + icons = RedPowerLogic.logicSensor; + break; + default: + icons = RedPowerLogic.logicOne; + } + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setTexFlags(0); + super.context.setSize(0.0, 0.0, 0.0, 1.0, 0.125, 1.0); + super.context.setIcon(icons[0], icons[tx & 0xFF], icons[0], icons[0], icons[0], icons[0]); + super.context.calcBounds(); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.renderFaces(63); + tess.draw(); + super.context.useNormal = false; + } + + public void renderCover(int rot, int cov) { + if (cov != 255) { + rot >>= 2; + rot ^= 1; + short[] rs = new short[]{0, 0, 0, 0, 0, 0}; + rs[rot] = (short)cov; + super.context.setTint(1.0F, 1.0F, 1.0F); + this.renderCovers(1 << rot, rs); + } + + } + + public void renderRedstoneTorch(double x, double y, double z, double h, boolean state) { + super.context.setTexFlags(0); + super.context.setRelPos(x, y, z); + super.context.setIcon(state ? RedPowerLogic.torchOn : RedPowerLogic.torch); + super.context.setLocalLights(1.0F); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setSize(0.4375, 1.0 - h, 0.0, 0.5625, 1.0, 1.0); + super.context.calcBounds(); + super.context.renderFaces(48); + super.context.setSize(0.0, 1.0 - h, 0.4375, 1.0, 1.0, 0.5625); + super.context.calcBounds(); + super.context.renderFaces(12); + super.context.setSize(0.375, 0.0, 0.4375, 0.5, 1.0, 0.5625); + super.context.setRelPos(x + 0.0625, y - 0.375, z); + super.context.calcBounds(); + super.context.setTexFlags(24); + super.context.renderFaces(2); + super.context.setRelPos(0.0, 0.0, 0.0); + } + + public void renderTorchPuff(World world, String name, double x, double y, double z) { + Vector3 v = new Vector3(x, y, z); + super.context.basis.rotate(v); + v.add(super.context.globalOrigin); + world.spawnParticle(name, v.x, v.y, v.z, 0.0, 0.0, 0.0); + } + + public void renderChip(double x, double y, double z, int tex) { + super.context.setTexFlags(0); + super.context.setRelPos(x, y, z); + super.context.setIcon(RedPowerLogic.logicOne[tex]); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.renderBox(62, 0.375, 0.0625, 0.375, 0.625, 0.1875, 0.625); + } + + protected int getTorchState(TileLogic tileLogic) { + return 0; + } + + protected int getInvTorchState(int metadata) { + return 0; + } + + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + return null; + } + + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + return null; + } + + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + } + + protected void renderInvPart(int metadata) { + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random random) { + TileLogic logic = CoreLib.getTileEntity(world, x, y, z, TileLogic.class); + if (logic != null) { + int ts = this.getTorchState(logic); + if (ts != 0) { + this.setMatrixDisplayTick(x, y, z, logic.Rotation, random); + RenderLogic.TorchPos[] tpv = this.getTorchVectors(logic); + if (tpv != null) { + int rv = random.nextInt(tpv.length); + if ((ts & 1 << rv) != 0) { + this.renderTorchPuff(world, "reddust", tpv[rv].x, tpv[rv].y, tpv[rv].z); + } + } + } + } + + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileLogic logic = (TileLogic)tile; + World world = logic.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + super.context.bindBlockTexture(); + super.context.setDefaults(); + super.context.setPos(x, y, z); + tess.startDrawingQuads(); + this.renderCovers(world, logic); + tess.draw(); + super.context.setBrightness(this.getMixedBrightness(logic)); + super.context.setOrientation(logic.Rotation >> 2, logic.Rotation & 3); + super.context.setPos(x, y, z); + tess.startDrawingQuads(); + this.renderWorldPart(world, logic, x, y, z, partialTicks); + tess.draw(); + super.context.bindBlockTexture(); + int ts = this.getTorchState(logic); + RenderLogic.TorchPos[] tpv = this.getTorchVectors(logic); + if (tpv != null) { + tess.startDrawingQuads(); + + for(int n = 0; n < tpv.length; ++n) { + this.renderRedstoneTorch(tpv[n].x, tpv[n].y, tpv[n].z, tpv[n].h, (ts & 1 << n) > 0); + } + + tess.draw(); + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + this.setMatrixInv(type); + this.renderInvPart(meta); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + int ts = this.getInvTorchState(meta); + RenderLogic.TorchPos[] tpv = this.getInvTorchVectors(meta); + if (tpv != null) { + for(int n = 0; n < tpv.length; ++n) { + this.renderRedstoneTorch(tpv[n].x, tpv[n].y, tpv[n].z, tpv[n].h, (ts & 1 << n) > 0); + } + } + + tess.draw(); + GL11.glEnable(2896); + } + + @Override + protected IIcon getParticleIconForSide(World world, int x, int y, int z, TileEntity tile, int side, int meta) { + return Blocks.stone_slab.getIcon(0, 0); + } + + public static class TorchPos { + double x; + double y; + double z; + double h; + + public TorchPos(double x, double y, double z, double h) { + this.x = x; + this.y = y; + this.z = z; + this.h = h; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogicAdv.java b/src/main/java/com/eloraam/redpower/logic/RenderLogicAdv.java new file mode 100644 index 0000000..f28f18e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogicAdv.java @@ -0,0 +1,94 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.RenderModel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; + +@SideOnly(Side.CLIENT) +public class RenderLogicAdv extends RenderLogic { + private RenderModel modelXcvr = RenderModel.loadModel("rplogic:models/busxcvr.obj"); + private ResourceLocation modelRes = new ResourceLocation("rplogic", "models/arraytex.png"); + + public RenderLogicAdv(Block block) { + super(block); + } + + @Override + protected int getTorchState(TileLogic tileLogic) { + return 0; + } + + @Override + protected int getInvTorchState(int metadata) { + return 0; + } + + @Override + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + return null; + } + + @Override + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + return null; + } + + @Override + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + int md = tileLogic.getExtendedMetadata(); + TileLogicAdv tls = (TileLogicAdv)tileLogic; + Tessellator tess = Tessellator.instance; + tess.draw(); + switch(md) { + case 0: + TileLogicAdv.LogicAdvXcvr lsc = tls.getLogicStorage(TileLogicAdv.LogicAdvXcvr.class); + tess.startDrawingQuads(); + super.context.bindTexture(this.modelRes); + super.context.bindModelOffset(this.modelXcvr, 0.5, 0.5, 0.5); + super.context.setTint(1.0F, 1.0F, 1.0F); + boolean b = (3552867 >> tileLogic.Rotation & 1) == 0; + super.context.renderModelGroup(1, 1 + (b ? 1 : 0) + (tileLogic.Deadmap == 0 ? 2 : 0)); + super.context.renderModelGroup(2, 1 + ((tileLogic.PowerState & 1) > 0 ? 1 : 0) + ((tileLogic.PowerState & 4) > 0 ? 2 : 0)); + + for(int i = 0; i < 4; ++i) { + if (tileLogic.Deadmap == 0) { + super.context.renderModelGroup(3 + i, 1 + (lsc.State2 >> 4 * i & 15)); + super.context.renderModelGroup(7 + i, 1 + (lsc.State1 >> 4 * i & 15)); + } else { + super.context.renderModelGroup(3 + i, 1 + (lsc.State1 >> 4 * i & 15)); + super.context.renderModelGroup(7 + i, 1 + (lsc.State2 >> 4 * i & 15)); + } + } + + tess.draw(); + default: + tess.startDrawingQuads(); + } + } + + @Override + protected void renderInvPart(int metadata) { + switch(metadata) { + case 1024: + super.context.bindTexture(this.modelRes); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.bindModelOffset(this.modelXcvr, 0.5, 0.5, 0.5); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.renderModelGroup(1, 1); + super.context.renderModelGroup(2, 1); + + for(int i = 0; i < 8; ++i) { + super.context.renderModelGroup(3 + i, 1); + } + + super.context.useNormal = false; + tess.draw(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogicArray.java b/src/main/java/com/eloraam/redpower/logic/RenderLogicArray.java new file mode 100644 index 0000000..f243ceb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogicArray.java @@ -0,0 +1,191 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.RenderModel; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockAccess; + +@SideOnly(Side.CLIENT) +public class RenderLogicArray extends RenderLogic { + private RenderModel model = RenderModel.loadModel("rplogic:models/arraycells.obj"); + private ResourceLocation modelRes = new ResourceLocation("rplogic", "models/arraytex.png"); + private static RenderLogic.TorchPos[] torchMapInvert = new RenderLogic.TorchPos[]{new RenderLogic.TorchPos(0.0, -0.25, 0.0, 0.7)}; + private static RenderLogic.TorchPos[] torchMapNonInv = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, -0.25, 0.0, 0.7), new RenderLogic.TorchPos(-0.188, -0.25, 0.219, 0.7) + }; + + public RenderLogicArray(Block block) { + super(block); + } + + @Override + protected int getTorchState(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 1: + return tileLogic.Powered ? 1 : 0; + case 2: + return tileLogic.Powered ? 1 : 2; + default: + return 0; + } + } + + @Override + protected int getInvTorchState(int metadata) { + return metadata == 514 ? 2 : 0; + } + + @Override + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 1: + return torchMapInvert; + case 2: + return torchMapNonInv; + default: + return null; + } + } + + @Override + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + switch(metadata) { + case 513: + return torchMapInvert; + case 514: + return torchMapNonInv; + default: + return null; + } + } + + public static int getFacingDir(int rot, int rel) { + short n; + switch(rot >> 2) { + case 0: + n = 13604; + break; + case 1: + n = 13349; + break; + case 2: + n = 20800; + break; + case 3: + n = 16720; + break; + case 4: + n = 8496; + break; + default: + n = 12576; + } + + int n1 = n >> ((rot + rel & 3) << 2); + return n1 & 7; + } + + private boolean isArrayTopwire(IBlockAccess iba, WorldCoord wc, int mask, int dir) { + wc = wc.coordStep(dir); + TileLogicArray logicArray = CoreLib.getTileEntity(iba, wc, TileLogicArray.class); + if (logicArray == null) { + return false; + } else { + int m = logicArray.getTopwireMask(); + m &= RedPowerLib.getConDirMask(dir); + m = (m & 1431655765) << 1 | (m & 715827882) >> 1; + m &= mask; + return m > 0; + } + } + + @Override + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + TileLogicArray logicArray = (TileLogicArray)tileLogic; + Tessellator tess = Tessellator.instance; + int md = tileLogic.getExtendedMetadata(); + super.context.bindTexture(this.modelRes); + tess.draw(); + tess.startDrawingQuads(); + super.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.renderModelGroup(0, 0); + switch(md) { + case 0: + super.context.renderModelGroup(1, 1); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal1 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(2, 1); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal2 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(3, 1); + break; + case 1: + super.context.renderModelGroup(1, 2 + (logicArray.PowerVal1 > 0 ? 1 : 0)); + super.context.renderModelGroup(5, 0); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal1 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(2, 2); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal2 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(3, 2); + break; + case 2: + super.context.renderModelGroup(1, 4 + (logicArray.PowerVal1 > 0 ? 1 : 0) + (logicArray.Powered ? 0 : 2)); + super.context.renderModelGroup(5, 0); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal1 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(2, 2); + super.context.setTint(0.3F + 0.7F * ((float)logicArray.PowerVal2 / 255.0F), 0.0F, 0.0F); + super.context.renderModelGroup(3, 2); + } + + int fd = getFacingDir(logicArray.Rotation, 1); + int fm = logicArray.getTopwireMask(); + WorldCoord wc = new WorldCoord(tileLogic); + super.context.renderModelGroup(4, (this.isArrayTopwire(iba, wc, fm, fd) ? 0 : 1) + (this.isArrayTopwire(iba, wc, fm, fd ^ 1) ? 0 : 2)); + tess.draw(); + tess.startDrawingQuads(); + } + + @Override + protected void renderInvPart(int metadata) { + Tessellator tess = Tessellator.instance; + super.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.renderModelGroup(0, 0); + switch(metadata) { + case 512: + super.context.renderModelGroup(1, 1); + super.context.setTint(0.3F, 0.0F, 0.0F); + super.context.renderModelGroup(2, 1); + super.context.renderModelGroup(3, 1); + super.context.renderModelGroup(4, 3); + break; + case 513: + super.context.renderModelGroup(1, 2); + super.context.renderModelGroup(5, 0); + super.context.setTint(0.3F, 0.0F, 0.0F); + super.context.renderModelGroup(2, 2); + super.context.renderModelGroup(3, 2); + super.context.renderModelGroup(4, 3); + break; + case 514: + super.context.renderModelGroup(1, 6); + super.context.renderModelGroup(5, 0); + super.context.setTint(0.3F, 0.0F, 0.0F); + super.context.renderModelGroup(2, 2); + super.context.renderModelGroup(3, 2); + super.context.renderModelGroup(4, 3); + } + + super.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogicPointer.java b/src/main/java/com/eloraam/redpower/logic/RenderLogicPointer.java new file mode 100644 index 0000000..e99c8d6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogicPointer.java @@ -0,0 +1,177 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.MathLib; +import com.eloraam.redpower.core.Quat; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.core.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +@SideOnly(Side.CLIENT) +public class RenderLogicPointer extends RenderLogic { + private static RenderLogic.TorchPos[] torchMapSequencer = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, 0.125, 0.0, 1.0), + new RenderLogic.TorchPos(0.0, -0.3, 0.3, 0.6), + new RenderLogic.TorchPos(-0.3, -0.3, 0.0, 0.6), + new RenderLogic.TorchPos(0.0, -0.3, -0.3, 0.6), + new RenderLogic.TorchPos(0.3, -0.3, 0.0, 0.6) + }; + private static RenderLogic.TorchPos[] torchMapTimer = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, 0.125, 0.0, 1.0), new RenderLogic.TorchPos(0.3, -0.3, 0.0, 0.6) + }; + private static RenderLogic.TorchPos[] torchMapStateCell = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, 0.125, 0.25, 1.0), new RenderLogic.TorchPos(0.281, -0.3, 0.156, 0.6) + }; + private static RenderLogic.TorchPos[] torchMapStateCell2 = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, 0.125, -0.25, 1.0), new RenderLogic.TorchPos(0.281, -0.3, -0.156, 0.6) + }; + + public RenderLogicPointer(Block block) { + super(block); + } + + @Override + protected int getTorchState(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + return (tileLogic.Disabled ? 0 : 1) | (tileLogic.Powered && !tileLogic.Disabled ? 2 : 0); + case 1: + return 1 | 2 << tileLogic.PowerState & 31; + case 2: + return (tileLogic.Active && !tileLogic.Powered && !tileLogic.Disabled ? 1 : 0) | (tileLogic.Active && tileLogic.Powered ? 2 : 0); + default: + return 0; + } + } + + @Override + protected int getInvTorchState(int metadata) { + switch(metadata) { + case 0: + return 1; + case 1: + return 5; + case 2: + return 0; + default: + return 0; + } + } + + @Override + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + return torchMapTimer; + case 1: + return torchMapSequencer; + case 2: + if (tileLogic.Deadmap > 0) { + return torchMapStateCell2; + } + + return torchMapStateCell; + default: + return null; + } + } + + @Override + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + switch(metadata) { + case 0: + return torchMapTimer; + case 1: + return torchMapSequencer; + case 2: + return torchMapStateCell; + default: + return null; + } + } + + @Override + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + TileLogicPointer logicPointer = (TileLogicPointer)tileLogic; + int md = tileLogic.getExtendedMetadata(); + int tx; + switch(md) { + case 0: + tx = 16 + (tileLogic.PowerState | (tileLogic.Powered ? 5 : 0)); + break; + case 1: + if (tileLogic.Deadmap == 1) { + tx = 4; + } else { + tx = 3; + } + break; + case 2: + tx = 32 + + ( + (tileLogic.Deadmap > 0 ? 32 : 0) + | tileLogic.PowerState + | (tileLogic.Active && tileLogic.Powered ? 8 : 0) + | (tileLogic.Active && !tileLogic.Powered && !tileLogic.Disabled ? 0 : 16) + | (tileLogic.Active && !tileLogic.Powered ? (tileLogic.Deadmap > 0 ? 1 : 4) : 0) + ); + break; + default: + return; + } + + this.renderWafer(tx); + if (md == 2) { + if (tileLogic.Deadmap > 0) { + this.renderChip(-0.125, 0.0, 0.125, tileLogic.Active ? 2 : 1); + } else { + this.renderChip(-0.125, 0.0, -0.125, tileLogic.Active ? 2 : 1); + } + } + + float ptrdir = logicPointer.getPointerDirection(partialTicks) + 0.25F; + Quat q = MathLib.orientQuat(logicPointer.Rotation >> 2, logicPointer.Rotation & 3); + Vector3 v = logicPointer.getPointerOrigin(); + q.rotate(v); + v.add(x + 0.5, y + 0.5, z + 0.5); + q.rightMultiply(Quat.aroundAxis(0.0, 1.0, 0.0, -Math.PI * 2 * (double)ptrdir)); + RenderLib.renderPointer(v, q); + } + + @Override + protected void renderInvPart(int metadata) { + switch(metadata) { + case 0: + super.context.setOrientation(0, 1); + this.renderInvWafer(16); + break; + case 1: + this.renderInvWafer(3); + break; + case 2: + super.context.setOrientation(0, 1); + this.renderInvWafer(48); + } + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.setNormal(0.0F, 0.0F, 1.0F); + switch(metadata) { + case 2: + RenderLib.renderPointer(new Vector3(-0.25, -0.1, 0.0), Quat.aroundAxis(0.0, 1.0, 0.0, 0.0)); + super.context.useNormal = true; + this.renderChip(-0.125, 0.0, -0.125, 1); + super.context.useNormal = false; + break; + default: + RenderLib.renderPointer(new Vector3(0.0, -0.1, 0.0), Quat.aroundAxis(0.0, 1.0, 0.0, -Math.PI / 2)); + } + + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogicSimple.java b/src/main/java/com/eloraam/redpower/logic/RenderLogicSimple.java new file mode 100644 index 0000000..dce7005 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogicSimple.java @@ -0,0 +1,601 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerLogic; +import com.eloraam.redpower.core.MathLib; +import com.eloraam.redpower.core.PowerLib; +import com.eloraam.redpower.core.Quat; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.core.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +@SideOnly(Side.CLIENT) +public class RenderLogicSimple extends RenderLogic { + private static RenderLogic.TorchPos[] torchMapLatch = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.3, -0.15, 0.0, 0.8), new RenderLogic.TorchPos(0.3, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapLatch2 = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.281, -0.15, -0.0938, 0.8), new RenderLogic.TorchPos(0.281, -0.15, 0.0938, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapLatch2b = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.281, -0.15, 0.0938, 0.8), new RenderLogic.TorchPos(0.281, -0.15, -0.0938, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapNor = new RenderLogic.TorchPos[]{new RenderLogic.TorchPos(-0.094, -0.25, 0.031, 0.7)}; + private static RenderLogic.TorchPos[] torchMapOr = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.094, -0.25, 0.031, 0.7), new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapNand = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, 0.0, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7) + }; + private static RenderLogic.TorchPos[] torchMapAnd = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, 0.0, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7), + new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapXnor = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7), + new RenderLogic.TorchPos(-0.28, -0.25, 0.0, 0.7), + new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapXor = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7), new RenderLogic.TorchPos(-0.28, -0.25, 0.0, 0.7) + }; + private static RenderLogic.TorchPos[] torchMapPulse = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.09, -0.25, -0.22, 0.7), new RenderLogic.TorchPos(-0.09, -0.25, 0.22, 0.7), new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapToggle = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.28, -0.25, -0.22, 0.7), new RenderLogic.TorchPos(-0.28, -0.25, -0.22, 0.7) + }; + private static RenderLogic.TorchPos[] torchMapNot = new RenderLogic.TorchPos[]{new RenderLogic.TorchPos(-0.031, -0.25, 0.031, 0.7)}; + private static RenderLogic.TorchPos[] torchMapBuffer = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.281, -0.15, 0.031, 0.8), new RenderLogic.TorchPos(-0.094, -0.25, 0.031, 0.7) + }; + private static RenderLogic.TorchPos[] torchMapMux = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7), + new RenderLogic.TorchPos(-0.156, -0.25, 0.031, 0.7), + new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapMux2 = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.031, -0.25, 0.22, 0.7), + new RenderLogic.TorchPos(-0.031, -0.25, -0.22, 0.7), + new RenderLogic.TorchPos(-0.156, -0.25, -0.031, 0.7), + new RenderLogic.TorchPos(0.28, -0.15, 0.0, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapRepS = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.313, -0.25, -0.125, 0.7), new RenderLogic.TorchPos(-0.25, -0.25, 0.25, 0.7) + }; + private static RenderLogic.TorchPos[] torchMapSync = new RenderLogic.TorchPos[]{new RenderLogic.TorchPos(0.28, -0.25, 0.0, 0.7)}; + private static RenderLogic.TorchPos[] torchMapDLatch = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.28, -0.25, -0.219, 0.7), + new RenderLogic.TorchPos(0.031, -0.25, -0.219, 0.7), + new RenderLogic.TorchPos(0.031, -0.25, -0.031, 0.7), + new RenderLogic.TorchPos(0.031, -0.15, 0.281, 0.8), + new RenderLogic.TorchPos(0.281, -0.15, -0.094, 0.8) + }; + private static RenderLogic.TorchPos[] torchMapDLatch2 = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(-0.28, -0.25, 0.219, 0.7), + new RenderLogic.TorchPos(0.031, -0.25, 0.219, 0.7), + new RenderLogic.TorchPos(0.031, -0.25, 0.031, 0.7), + new RenderLogic.TorchPos(0.031, -0.15, -0.281, 0.8), + new RenderLogic.TorchPos(0.281, -0.15, 0.094, 0.8) + }; + private static final int[] texIdxNor = new int[]{272, 288, 296, 312, 304, 316, 320}; + private static final int[] texIdxOr = new int[]{376, 384, 388, 416, 392, 418, 420}; + private static final int[] texIdxNand = new int[]{336, 352, 360, 324, 368, 328, 332}; + private static final int[] texIdxAnd = new int[]{400, 408, 412, 422, 396, 424, 426}; + private static final int[] texIdxNot = new int[]{432, 448, 456, 472, 464, 476, 428}; + private static final int[] texIdxBuf = new int[]{496, 504, 508, 257}; + private static Quat[] leverPositions = new Quat[2]; + + public RenderLogicSimple(Block block) { + super(block); + } + + @Override + protected int getTorchState(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + if (tileLogic.Deadmap > 1) { + return ((tileLogic.PowerState & 2) > 0 ? 1 : 0) | ((tileLogic.PowerState & 8) > 0 ? 2 : 0); + } else { + if (!tileLogic.Disabled && !tileLogic.Active) { + if (tileLogic.Deadmap == 1) { + return tileLogic.Powered ? 1 : 2; + } + + return tileLogic.Powered ? 2 : 1; + } + + return 0; + } + case 1: + return tileLogic.Powered ? 1 : 0; + case 2: { + int eps1 = tileLogic.PowerState & ~tileLogic.Deadmap; + return (eps1 == 0 ? 1 : 0) | (tileLogic.Powered ? 2 : 0); + } + case 3: { + int eps1 = tileLogic.PowerState | tileLogic.Deadmap; + return eps1 & 7 ^ 7; + } + case 4: { + int eps1 = tileLogic.PowerState | tileLogic.Deadmap; + return eps1 & 7 ^ 7 | (tileLogic.Powered ? 8 : 0); + } + case 5: + case 6: + byte eps; + switch(tileLogic.PowerState & 5) { + case 0: + eps = 4; + break; + case 1: + eps = 2; + break; + case 2: + case 3: + default: + eps = 0; + break; + case 4: + eps = 1; + } + + if (md == 6) { + return eps; + } + + return eps | (tileLogic.Powered ? 8 : 0); + case 7: + return (!tileLogic.Powered && !tileLogic.Active ? 1 : 0) + | (!tileLogic.Powered && !tileLogic.Active ? 0 : 2) + | (tileLogic.Powered && !tileLogic.Active ? 4 : 0); + case 8: + return !tileLogic.Powered ? 1 : 2; + case 9: + return tileLogic.Powered ? 1 : 0; + case 10: + return (tileLogic.Powered ? 1 : 0) | tileLogic.PowerState & 2; + case 11: + if (tileLogic.Deadmap == 0) { + return (tileLogic.Powered ? 8 : 0) + | ((tileLogic.PowerState & 3) == 0 ? 1 : 0) + | ((tileLogic.PowerState & 6) == 2 ? 2 : 0) + | ((tileLogic.PowerState & 2) == 0 ? 4 : 0); + } + + return (tileLogic.Powered ? 8 : 0) + | ((tileLogic.PowerState & 3) == 2 ? 1 : 0) + | ((tileLogic.PowerState & 6) == 0 ? 2 : 0) + | ((tileLogic.PowerState & 2) == 0 ? 4 : 0); + case 12: + return (tileLogic.Powered ? 1 : 0) | (tileLogic.PowerState == 0 ? 2 : 0); + case 13: + return tileLogic.Powered ? 1 : 0; + case 14: + return 0; + case 15: + if (tileLogic.Deadmap == 0) { + switch(tileLogic.PowerState & 6) { + case 0: + return tileLogic.Powered ? 25 : 5; + case 1: + case 3: + default: + return tileLogic.Powered ? 24 : 0; + case 2: + return tileLogic.Powered ? 26 : 2; + case 4: + return tileLogic.Powered ? 25 : 5; + } + } else { + switch(tileLogic.PowerState & 3) { + case 0: + return tileLogic.Powered ? 25 : 5; + case 1: + return tileLogic.Powered ? 25 : 5; + case 2: + return tileLogic.Powered ? 26 : 2; + default: + return tileLogic.Powered ? 24 : 0; + } + } + default: + return 0; + } + } + + @Override + protected int getInvTorchState(int metadata) { + switch(metadata) { + case 256: + case 257: + case 258: + return 1; + case 259: + case 260: + return 7; + case 261: + return 12; + case 262: + return 4; + case 263: + case 264: + case 265: + return 1; + case 266: + return 2; + case 267: + return 12; + case 268: + return 1; + case 269: + return 0; + case 270: + return 0; + case 271: + return 5; + default: + return 0; + } + } + + @Override + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + if (tileLogic.Deadmap == 2) { + return torchMapLatch2; + } else { + if (tileLogic.Deadmap == 3) { + return torchMapLatch2b; + } + + return torchMapLatch; + } + case 1: + return torchMapNor; + case 2: + return torchMapOr; + case 3: + return torchMapNand; + case 4: + return torchMapAnd; + case 5: + return torchMapXnor; + case 6: + return torchMapXor; + case 7: + return torchMapPulse; + case 8: + return torchMapToggle; + case 9: + return torchMapNot; + case 10: + return torchMapBuffer; + case 11: + if (tileLogic.Deadmap == 0) { + return torchMapMux; + } + + return torchMapMux2; + case 12: + return new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.313, -0.25, -0.125, 0.7), new RenderLogic.TorchPos(-0.25 + (double)tileLogic.Deadmap * 0.063, -0.25, 0.25, 0.7) + }; + case 13: + return torchMapSync; + case 14: + return null; + case 15: + if (tileLogic.Deadmap == 0) { + return torchMapDLatch; + } + + return torchMapDLatch2; + default: + return null; + } + } + + @Override + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + switch(metadata) { + case 256: + return torchMapLatch; + case 257: + return torchMapNor; + case 258: + return torchMapOr; + case 259: + return torchMapNand; + case 260: + return torchMapAnd; + case 261: + return torchMapXnor; + case 262: + return torchMapXor; + case 263: + return torchMapPulse; + case 264: + return torchMapToggle; + case 265: + return torchMapNot; + case 266: + return torchMapBuffer; + case 267: + return torchMapMux; + case 268: + return torchMapRepS; + case 269: + return torchMapSync; + case 270: + return null; + case 271: + return torchMapDLatch; + default: + return null; + } + } + + @Override + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + int md = tileLogic.getExtendedMetadata(); + int tx; + switch(md) { + case 0: + if (tileLogic.Deadmap < 2) { + tx = ((tileLogic.PowerState & 1) > 0 ? 1 : 0) | ((tileLogic.PowerState & 4) > 0 ? 2 : 0); + if (!tileLogic.Disabled || tileLogic.Active) { + tx |= tileLogic.Powered ? 2 : 1; + } + + tx += 24 + (tileLogic.Deadmap == 1 ? 4 : 0); + } else { + tx = 96 + (tileLogic.Deadmap == 3 ? 16 : 0) + tileLogic.PowerState; + } + break; + case 1: + tx = texIdxNor[tileLogic.Deadmap] + PowerLib.cutBits(tileLogic.PowerState | (tileLogic.Powered ? 8 : 0), tileLogic.Deadmap); + break; + case 2: + tx = texIdxOr[tileLogic.Deadmap] + PowerLib.cutBits(tileLogic.PowerState, tileLogic.Deadmap); + break; + case 3: + tx = texIdxNand[tileLogic.Deadmap] + PowerLib.cutBits(tileLogic.PowerState | (tileLogic.Powered ? 8 : 0), tileLogic.Deadmap); + break; + case 4: + tx = texIdxAnd[tileLogic.Deadmap] + PowerLib.cutBits(tileLogic.PowerState, tileLogic.Deadmap); + break; + case 5: + tx = 128 + (tileLogic.PowerState & 1) + ((tileLogic.PowerState & 4) >> 1); + break; + case 6: + tx = 132 + ((tileLogic.Powered ? 4 : 0) | (tileLogic.PowerState & 12) >> 1 | tileLogic.PowerState & 1); + break; + case 7: + tx = 5; + if (tileLogic.Powered && !tileLogic.Active) { + tx = 6; + } else if (!tileLogic.Powered && tileLogic.Active) { + tx = 7; + } + break; + case 8: + tx = 140 + (tileLogic.PowerState & 1) + (tileLogic.PowerState >> 1 & 2); + break; + case 9: + if (tileLogic.Deadmap == 0) { + tx = 432 + (tileLogic.PowerState | (tileLogic.Powered ? 13 : 0)); + } else { + int tmp = PowerLib.cutBits(tileLogic.Deadmap, 2); + if (tileLogic.Powered) { + tx = 480 + (tmp - 1 << 1) + ((tileLogic.PowerState & 2) >> 1); + } else { + tx = texIdxNot[tmp] + PowerLib.cutBits(tileLogic.PowerState, tileLogic.Deadmap); + } + } + break; + case 10: + if (tileLogic.Deadmap == 0) { + tx = 496 + (tileLogic.PowerState | (tileLogic.Powered ? 5 : 0)); + } else { + int tmp = PowerLib.cutBits(tileLogic.Deadmap, 2); + if (tileLogic.Powered) { + tx = 256 + (tmp << 1) + ((tileLogic.PowerState & 2) >> 1); + } else { + tx = texIdxBuf[tmp] + PowerLib.cutBits(tileLogic.PowerState, tileLogic.Deadmap); + } + } + break; + case 11: + tx = 144 + (tileLogic.Deadmap > 0 ? 8 : 0) + tileLogic.PowerState; + break; + case 12: + tx = 492 + (tileLogic.PowerState >> 1) + (tileLogic.Powered ? 0 : 2); + break; + case 13: + tx = 160 + tileLogic.PowerState + (tileLogic.Active ? 8 : 0) + (tileLogic.Disabled ? 16 : 0); + break; + case 14: + tx = 192 + (tileLogic.PowerState | (tileLogic.Active ? 1 : 0) | (tileLogic.Powered ? 4 : 0) | (tileLogic.Disabled ? 8 : 0)); + break; + case 15: + if (tileLogic.Deadmap > 0) { + tx = 216 + tileLogic.PowerState + (tileLogic.Powered ? 4 : 0); + } else { + tx = 208 + (tileLogic.PowerState >> 1) + (tileLogic.Powered ? 4 : 0); + } + break; + case 16: + tx = 513 + (!tileLogic.Powered && tileLogic.PowerState <= 0 ? 0 : 1); + break; + default: + return; + } + + this.renderWafer(tx); + switch(md) { + case 8: + super.context.setTexFlags(44); + super.context.setSize(0.25, 0.0, 0.555F, 0.75, 0.3F, 0.805F); + super.context.setIcon(RedPowerLogic.cobblestone); + super.context.calcBounds(); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.renderFaces(62); + Vector3 pos = new Vector3(0.0, -0.3, 0.18); + Quat q = MathLib.orientQuat(tileLogic.Rotation >> 2, tileLogic.Rotation & 3); + q.rotate(pos); + pos.add(super.context.globalOrigin); + q.rightMultiply(leverPositions[tileLogic.Powered ? 1 : 0]); + RenderLib.renderSpecialLever(pos, q, RedPowerLogic.cobblestone, RedPowerLogic.lever); + case 9: + case 10: + case 11: + case 12: + case 15: + default: + break; + case 13: + this.renderChip(-0.125, 0.0, -0.1875, tileLogic.Disabled ? 2 : 1); + this.renderChip(-0.125, 0.0, 0.1875, tileLogic.Active ? 2 : 1); + break; + case 14: + this.renderChip(-0.25, 0.0, -0.25, tileLogic.Disabled ? 9 : 8); + this.renderChip(-0.25, 0.0, 0.25, tileLogic.Active ? 9 : 8); + this.renderChip(0.125, 0.0, 0.0, tileLogic.Powered ? 9 : 8); + break; + case 16: + super.context.setTexFlags(64); + IIcon icon = RedPowerLogic.logicSensor[16 + tileLogic.Deadmap]; + super.context.setIcon(icon, icon, icon, icon, icon, icon); + super.context.renderBox(62, 0.125, 0.0, 0.188F, 0.625, 0.188F, 0.813F); + } + + } + + @Override + protected void renderInvPart(int metadata) { + switch(metadata) { + case 256: + this.renderInvWafer(25); + break; + case 257: + this.renderInvWafer(280); + break; + case 258: + this.renderInvWafer(384); + break; + case 259: + this.renderInvWafer(344); + break; + case 260: + this.renderInvWafer(400); + break; + case 261: + this.renderInvWafer(128); + break; + case 262: + this.renderInvWafer(132); + break; + case 263: + this.renderInvWafer(5); + break; + case 264: + this.renderInvWafer(140); + break; + case 265: + this.renderInvWafer(440); + break; + case 266: + this.renderInvWafer(496); + break; + case 267: + this.renderInvWafer(144); + break; + case 268: + this.renderInvWafer(493); + break; + case 269: + this.renderInvWafer(160); + break; + case 270: + this.renderInvWafer(192); + break; + case 271: + this.renderInvWafer(208); + break; + case 272: + this.renderInvWafer(51); + } + + if (metadata == 264) { + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.setTexFlags(44); + super.context.setSize(0.25, 0.0, 0.555F, 0.75, 0.3F, 0.805F); + super.context.setIcon(RedPowerLogic.cobblestone); + super.context.calcBounds(); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.renderFaces(62); + super.context.useNormal = false; + tess.draw(); + tess.startDrawingQuads(); + tess.setNormal(0.0F, 0.0F, 1.0F); + Vector3 pos = new Vector3(0.0, -0.3, 0.18); + Quat q = MathLib.orientQuat(0, 3); + q.rotate(pos); + pos.add(super.context.globalOrigin); + q.rightMultiply(leverPositions[0]); + RenderLib.renderSpecialLever(pos, q, RedPowerLogic.cobblestone, RedPowerLogic.lever); + tess.draw(); + } else if (metadata == 269) { + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + this.renderChip(-0.125, 0.0, -0.1875, 2); + this.renderChip(-0.125, 0.0, 0.1875, 2); + super.context.useNormal = false; + tess.draw(); + } else if (metadata == 270) { + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + this.renderChip(-0.25, 0.0, -0.25, 8); + this.renderChip(-0.25, 0.0, 0.25, 8); + this.renderChip(0.125, 0.0, 0.0, 8); + super.context.useNormal = false; + tess.draw(); + } else if (metadata == 272) { + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + IIcon icon = RedPowerLogic.logicSensor[16]; + super.context.setIcon(icon, icon, icon, icon, icon, icon); + super.context.setTexFlags(64); + super.context.renderBox(62, 0.125, 0.0, 0.188F, 0.625, 0.188F, 0.813F); + super.context.useNormal = false; + tess.draw(); + } + + } + + static { + leverPositions[0] = Quat.aroundAxis(1.0, 0.0, 0.0, 0.8639379797371932); + leverPositions[1] = Quat.aroundAxis(1.0, 0.0, 0.0, -0.8639379797371932); + leverPositions[0].multiply(MathLib.orientQuat(0, 3)); + leverPositions[1].multiply(MathLib.orientQuat(0, 3)); + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/RenderLogicStorage.java b/src/main/java/com/eloraam/redpower/logic/RenderLogicStorage.java new file mode 100644 index 0000000..a7c2356 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/RenderLogicStorage.java @@ -0,0 +1,107 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.MathLib; +import com.eloraam.redpower.core.Quat; +import com.eloraam.redpower.core.RenderLib; +import com.eloraam.redpower.core.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.IBlockAccess; + +@SideOnly(Side.CLIENT) +public class RenderLogicStorage extends RenderLogic { + private static RenderLogic.TorchPos[] torchMapCounter = new RenderLogic.TorchPos[]{ + new RenderLogic.TorchPos(0.0, 0.125, 0.188, 1.0), new RenderLogic.TorchPos(0.3, -0.3, 0.0, 0.6F), new RenderLogic.TorchPos(-0.3, -0.3, 0.0, 0.6F) + }; + + public RenderLogicStorage(Block block) { + super(block); + } + + @Override + protected int getTorchState(TileLogic tileLogic) { + TileLogicStorage tls = (TileLogicStorage)tileLogic; + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)tls.getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + return 1 | (lsc.Count == lsc.CountMax ? 2 : 0) | (lsc.Count == 0 ? 4 : 0); + default: + return 0; + } + } + + @Override + protected int getInvTorchState(int metadata) { + switch(metadata) { + case 768: + return 5; + default: + return 0; + } + } + + @Override + protected RenderLogic.TorchPos[] getTorchVectors(TileLogic tileLogic) { + int md = tileLogic.getExtendedMetadata(); + switch(md) { + case 0: + return torchMapCounter; + default: + return null; + } + } + + @Override + protected RenderLogic.TorchPos[] getInvTorchVectors(int metadata) { + switch(metadata) { + case 768: + return torchMapCounter; + default: + return null; + } + } + + @Override + protected void renderWorldPart(IBlockAccess iba, TileLogic tileLogic, double x, double y, double z, float partialTicks) { + int md = tileLogic.getExtendedMetadata(); + TileLogicStorage tls = (TileLogicStorage)tileLogic; + switch(md) { + case 0: + int tx = 224 + (tileLogic.Deadmap > 0 ? 4 : 0) + (tileLogic.PowerState & 1) + ((tileLogic.PowerState & 4) >> 1); + this.renderWafer(tx); + TileLogicStorage.LogicStorageCounter lsc = (TileLogicStorage.LogicStorageCounter)tls.getLogicStorage(TileLogicStorage.LogicStorageCounter.class); + if (lsc.CountMax == 0) { + lsc.CountMax = 1; + } + + float dir = 0.58F + 0.34F * ((float)lsc.Count / (float)lsc.CountMax); + Vector3 pos = new Vector3(0.0, -0.1, 0.188); + super.context.basis.rotate(pos); + pos.add(super.context.globalOrigin); + pos.add(0.5, 0.5, 0.5); + Quat q = Quat.aroundAxis(0.0, 1.0, 0.0, (double)(-dir) * Math.PI * 2.0); + q.multiply(MathLib.orientQuat(tileLogic.Rotation >> 2, tileLogic.Rotation & 3)); + RenderLib.renderPointer(pos, q); + } + } + + @Override + protected void renderInvPart(int metadata) { + switch(metadata) { + case 768: + this.renderInvWafer(224); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + tess.setNormal(0.0F, 0.0F, 1.0F); + Vector3 v = new Vector3(0.0, -0.1, 0.188); + Quat q = Quat.aroundAxis(0.0, 1.0, 0.0, 3.64424747816416); + super.context.basis.rotate(v); + q.multiply(MathLib.orientQuat(0, 1)); + RenderLib.renderPointer(v, q); + tess.draw(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogic.java b/src/main/java/com/eloraam/redpower/logic/TileLogic.java new file mode 100644 index 0000000..91c27d9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogic.java @@ -0,0 +1,359 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerLogic; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRedPowerConnectable; +import com.eloraam.redpower.core.IRotatable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileCoverable; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileLogic extends TileCoverable implements IRedPowerConnectable, IRotatable, IFrameSupport { + public int SubId = 0; + public int Rotation = 0; + public boolean Powered = false; + public boolean Disabled = false; + public boolean Active = false; + public int PowerState = 0; + public int Deadmap = 0; + public int Cover = 255; + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : (part != this.Rotation >> 2 ? 0 : 3); + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : (part != this.Rotation >> 2 ? 0 : this.Rotation & 3); + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec && part == this.Rotation >> 2) { + this.Rotation = rot & 3 | this.Rotation & -4; + this.updateBlockChange(); + } + + } + + @Override + public int getConnectableMask() { + return 15 << (this.Rotation & -4); + } + + @Override + public int getConnectClass(int side) { + return 0; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public int getPoweringMask(int ch) { + return ch != 0 ? 0 : (this.Powered ? RedPowerLib.mapRotToCon(8, this.Rotation) : 0); + } + + @Override + public boolean canAddCover(int side, int cover) { + return this.Cover == 255 && (side ^ 1) == this.Rotation >> 2 && cover <= 254; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!this.canAddCover(side, cover)) { + return false; + } else { + this.Cover = cover; + this.updateBlock(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + if (this.Cover == 255) { + return -1; + } else if ((side ^ 1) != this.Rotation >> 2) { + return -1; + } else { + int tr = this.Cover; + this.Cover = 255; + this.updateBlock(); + return tr; + } + } + + @Override + public int getCover(int side) { + return this.Cover == 255 ? -1 : ((side ^ 1) != this.Rotation >> 2 ? -1 : this.Cover); + } + + @Override + public int getCoverMask() { + return this.Cover == 255 ? 0 : 1 << (this.Rotation >> 2 ^ 1); + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void addHarvestContents(List drops) { + super.addHarvestContents(drops); + drops.add(new ItemStack(this.getBlockType(), 1, this.getExtendedID() * 256 + this.SubId)); + } + + private void replaceWithCovers(boolean shouldDrop) { + if (this.Cover != 255) { + short[] covers = new short[26]; + covers[this.Rotation >> 2 ^ 1] = (short)this.Cover; + CoverLib.replaceWithCovers(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 1 << (this.Rotation >> 2 ^ 1), covers); + if (shouldDrop) { + CoreLib.dropItem( + super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(this.getBlockType(), 1, this.getExtendedID() * 256 + this.SubId) + ); + } + + this.markForUpdate(); + } else { + this.breakBlock(shouldDrop); + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.getBlockType()); + } + + } + + public boolean tryDropBlock() { + if (RedPowerLib.canSupportWire(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.Rotation >> 2)) { + return false; + } else { + this.replaceWithCovers(true); + return true; + } + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == this.Rotation >> 2) { + this.replaceWithCovers(willHarvest); + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockLogic bl = RedPowerLogic.blockLogic; + return part == this.Rotation >> 2 ? player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F) : super.getPartStrength(player, part); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part != this.Rotation >> 2) { + super.setPartBounds(block, part); + } else { + switch(part) { + case 0: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); + break; + case 1: + block.setBlockBounds(0.0F, 0.875F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F); + break; + case 3: + block.setBlockBounds(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F); + break; + case 4: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F); + break; + case 5: + block.setBlockBounds(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + + } + + @Override + public int getPartsMask() { + int pm = 1 << (this.Rotation >> 2); + if (this.Cover != 255) { + pm |= 1 << (this.Rotation >> 2 ^ 1); + } + + return pm; + } + + @Override + public int getSolidPartsMask() { + return this.getPartsMask(); + } + + @Override + public boolean isBlockStrongPoweringTo(int l) { + return (this.getPoweringMask(0) & RedPowerLib.getConDirMask(l ^ 1)) > 0; + } + + @Override + public boolean isBlockWeakPoweringTo(int l) { + return (this.getPoweringMask(0) & RedPowerLib.getConDirMask(l ^ 1)) > 0; + } + + public Block getBlockType() { + return RedPowerLogic.blockLogic; + } + + @Override + public int getExtendedMetadata() { + return this.SubId; + } + + @Override + public void setExtendedMetadata(int md) { + this.SubId = md; + } + + public void playSound(String name, float f, float f2, boolean always) { + if (always || RedPowerLogic.soundsEnabled) { + super.worldObj + .playSoundEffect((double)((float)super.xCoord + 0.5F), (double)((float)super.yCoord + 0.5F), (double)((float)super.zCoord + 0.5F), name, f, f2); + } + + } + + public void initSubType(int st) { + this.SubId = st; + if (!super.worldObj.isRemote && this.getLightValue() != 9) { + CoreLib.updateAllLightTypes(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + } + + public int getLightValue() { + return 9; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("sid", (byte)this.SubId); + tag.setByte("rot", (byte)this.Rotation); + int ps = this.PowerState | (this.Powered ? 16 : 0) | (this.Disabled ? 32 : 0) | (this.Active ? 64 : 0) | (this.Deadmap > 0 ? 128 : 0); + tag.setByte("ps", (byte)ps); + if (this.Deadmap > 0) { + tag.setByte("dm", (byte)this.Deadmap); + } + + tag.setShort("cov", (short)this.Cover); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.SubId = tag.getByte("sid"); + this.Rotation = tag.getByte("rot"); + int ps = tag.getByte("ps"); + if (super.worldObj.isRemote) { + this.PowerState = ps & 15; + this.Powered = (ps & 16) > 0; + this.Disabled = (ps & 32) > 0; + this.Active = (ps & 64) > 0; + } + + if ((ps & 128) > 0) { + this.Deadmap = tag.getByte("dm"); + } else { + this.Deadmap = 0; + } + + this.Cover = tag.getShort("cov"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.SubId = data.getByte("sid") & 255; + this.Rotation = data.getByte("rot") & 255; + int ps = data.getByte("ps") & 255; + this.Deadmap = data.getByte("dm") & 255; + this.Cover = data.getByte("cov") & 255; + this.PowerState = ps & 15; + this.Powered = (ps & 16) > 0; + this.Disabled = (ps & 32) > 0; + this.Active = (ps & 64) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("sid", (byte)this.SubId); + data.setByte("rot", (byte)this.Rotation); + int ps = this.PowerState | (this.Powered ? 16 : 0) | (this.Disabled ? 32 : 0) | (this.Active ? 64 : 0); + data.setByte("ps", (byte)ps); + data.setByte("dm", (byte)this.Deadmap); + data.setByte("cov", (byte)this.Cover); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.SubId = tag.getByte("sid"); + this.Rotation = tag.getByte("rot"); + int ps = tag.getByte("ps"); + if (super.worldObj.isRemote) { + this.PowerState = ps & 15; + this.Powered = (ps & 16) > 0; + this.Disabled = (ps & 32) > 0; + this.Active = (ps & 64) > 0; + } + + if ((ps & 128) > 0) { + this.Deadmap = tag.getByte("dm"); + } else { + this.Deadmap = 0; + } + + this.Cover = tag.getShort("cov"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("sid", (byte)this.SubId); + tag.setByte("rot", (byte)this.Rotation); + int ps = this.PowerState | (this.Powered ? 16 : 0) | (this.Disabled ? 32 : 0) | (this.Active ? 64 : 0) | (this.Deadmap > 0 ? 128 : 0); + tag.setByte("ps", (byte)ps); + if (this.Deadmap > 0) { + tag.setByte("dm", (byte)this.Deadmap); + } + + tag.setShort("cov", (short)this.Cover); + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(this.getBlockType(), 1, this.getExtendedID() * 256 + this.SubId); + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogicAdv.java b/src/main/java/com/eloraam/redpower/logic/TileLogicAdv.java new file mode 100644 index 0000000..d9b56e1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogicAdv.java @@ -0,0 +1,336 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +public class TileLogicAdv extends TileLogic implements IRedPowerWiring { + TileLogicAdv.LogicAdvModule storage; + + @Override + public void updateCurrentStrength() { + this.initStorage(); + this.storage.updateCurrentStrength(); + } + + @Override + public int getCurrentStrength(int cons, int ch) { + this.initStorage(); + return (this.storage.getPoweringMask(ch) & cons) > 0 ? 255 : -1; + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return 0; + } + + @Override + public int getConnectionMask() { + return RedPowerLib.mapRotToCon(15, super.Rotation); + } + + @Override + public int getExtConnectionMask() { + return 0; + } + + @Override + public int getConnectClass(int side) { + int s = RedPowerLib.mapRotToCon(10, super.Rotation); + return (s & RedPowerLib.getConDirMask(side)) > 0 ? 18 : 0; + } + + @Override + public int getExtendedID() { + return 4; + } + + @Override + public void initSubType(int st) { + super.SubId = st; + this.initStorage(); + } + + public T getLogicStorage(Class cl) { + if (!cl.isInstance(this.storage)) { + this.initStorage(); + } + + return (T) this.storage; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double) super.xCoord + 0.5, (double) super.yCoord + 0.5, + (double) super.zCoord + 0.5) <= 64.0; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + if (sec) { + switch (super.SubId) { + case 0: + return 1; + } + } + + return super.getPartMaxRotation(part, sec); + } + + @Override + public int getPartRotation(int part, boolean sec) { + if (sec) { + switch (super.SubId) { + case 0: + return super.Deadmap; + } + } + + return super.getPartRotation(part, sec); + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (sec) { + switch (super.SubId) { + case 0: + super.Deadmap = rot; + this.updateBlockChange(); + return; + } + } + + super.setPartRotation(part, sec, rot); + } + + void initStorage() { + if (this.storage == null || this.storage.getSubType() != super.SubId) { + switch (super.SubId) { + case 0: + this.storage = new TileLogicAdv.LogicAdvXcvr(); + break; + default: + this.storage = null; + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!this.tryDropBlock()) { + this.initStorage(); + switch (super.SubId) { + case 0: + if (this.isTickRunnable()) { + return; + } + + this.storage.updatePowerState(); + } + } + + } + + @Override + public void onTileTick() { + this.initStorage(); + this.storage.tileTick(); + } + + @Override + public int getPoweringMask(int ch) { + this.initStorage(); + return this.storage.getPoweringMask(ch); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.initStorage(); + this.storage.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.storage.writeToNBT(data); + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + this.storage.writeToNBT(tag); + super.writeFramePacket(tag); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.storage.readFromNBT(tag); + super.readFramePacket(tag); + } + + public abstract class LogicAdvModule { + public abstract void updatePowerState(); + + public abstract void tileTick(); + + public abstract int getSubType(); + + public abstract int getPoweringMask(int var1); + + public void updateCurrentStrength() { + } + + public abstract void readFromNBT(NBTTagCompound var1); + + public abstract void writeToNBT(NBTTagCompound var1); + + public void readFromPacket(NBTTagCompound tag) { + } + + public void writeToPacket(NBTTagCompound tag) { + } + } + + public class LogicAdvXcvr extends TileLogicAdv.LogicAdvModule { + public int State1 = 0; + public int State2 = 0; + public int State1N = 0; + public int State2N = 0; + + @Override + public void updatePowerState() { + int ps = RedPowerLib.getRotPowerState( + TileLogicAdv.this.worldObj, + TileLogicAdv.this.xCoord, + TileLogicAdv.this.yCoord, + TileLogicAdv.this.zCoord, + 5, + TileLogicAdv.super.Rotation, + 0); + if (ps != TileLogicAdv.this.PowerState) { + TileLogicAdv.this.PowerState = ps; + TileLogicAdv.this.updateBlock(); + TileLogicAdv.this.scheduleTick(2); + } + + } + + @Override + public void tileTick() { + TileLogicAdv.this.Powered = ((TileLogicAdv.this.PowerState & 0x1) > 0); + TileLogicAdv.this.Active = ((TileLogicAdv.this.PowerState & 0x4) > 0); + int sd1 = this.State1N; + int sd2 = this.State2N; + if (TileLogicAdv.this.Deadmap == 0) { + if (!TileLogicAdv.this.Powered) { + sd1 = 0; + } + if (!TileLogicAdv.this.Active) { + sd2 = 0; + } + } else { + if (!TileLogicAdv.this.Powered) { + sd2 = 0; + } + if (!TileLogicAdv.this.Active) { + sd1 = 0; + } + } + final boolean ch = this.State1 != sd1 || this.State2 != sd2; + this.State1 = sd1; + this.State2 = sd2; + if (ch) { + TileLogicAdv.this.updateBlock(); + RedPowerLib.updateCurrent(TileLogicAdv.this.worldObj, TileLogicAdv.this.xCoord, TileLogicAdv.this.yCoord, + TileLogicAdv.this.zCoord); + } + this.updatePowerState(); + this.updateCurrentStrength(); + } + + @Override + public int getSubType() { + return 0; + } + + @Override + public int getPoweringMask(int ch) { + int ps = 0; + if (ch >= 1 && ch <= 16) { + --ch; + if ((this.State1 >> ch & 1) > 0) { + ps |= 8; + } + + if ((this.State2 >> ch & 1) > 0) { + ps |= 2; + } + + return RedPowerLib.mapRotToCon(ps, TileLogicAdv.super.Rotation); + } else { + return 0; + } + } + + @Override + public void updateCurrentStrength() { + if (!TileLogicAdv.this.isTickRunnable()) { + this.State1N = this.State2; + this.State2N = this.State1; + + for (int ch = 0; ch < 16; ++ch) { + short p1 = (short) RedPowerLib.updateBlockCurrentStrength(TileLogicAdv.this.worldObj, TileLogicAdv.this, + TileLogicAdv.this.xCoord, TileLogicAdv.this.yCoord, TileLogicAdv.this.zCoord, + RedPowerLib.mapRotToCon(2, TileLogicAdv.this.Rotation), 2 << ch); + short p2 = (short) RedPowerLib.updateBlockCurrentStrength(TileLogicAdv.this.worldObj, TileLogicAdv.this, + TileLogicAdv.this.xCoord, TileLogicAdv.this.yCoord, TileLogicAdv.this.zCoord, + RedPowerLib.mapRotToCon(8, TileLogicAdv.this.Rotation), 2 << ch); + if (p1 > 0) { + this.State1N |= 1 << ch; + } + if (p2 > 0) { + this.State2N |= 1 << ch; + } + } + + TileLogicAdv.this.markDirty(); + if (this.State1N != this.State1 || this.State2N != this.State2) { + TileLogicAdv.this.scheduleTick(2); + } + } + + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + this.State1 = tag.getInteger("s1"); + this.State2 = tag.getInteger("s2"); + this.State1N = tag.getInteger("s1n"); + this.State2N = tag.getInteger("s2n"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + tag.setInteger("s1", this.State1); + tag.setInteger("s2", this.State2); + tag.setInteger("s1n", this.State1N); + tag.setInteger("s2n", this.State2N); + } + + @Override + public void readFromPacket(NBTTagCompound tag) { + this.State1 = tag.getInteger("s1"); + this.State2 = tag.getInteger("s2"); + } + + @Override + public void writeToPacket(NBTTagCompound tag) { + tag.setInteger("s1", this.State1); + tag.setInteger("s2", this.State2); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogicArray.java b/src/main/java/com/eloraam/redpower/logic/TileLogicArray.java new file mode 100644 index 0000000..04cb929 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogicArray.java @@ -0,0 +1,183 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; + +public class TileLogicArray extends TileLogic implements IRedPowerWiring { + public short PowerVal1 = 0; + public short PowerVal2 = 0; + + @Override + public int getPoweringMask(int ch) { + if (ch != 0) { + return 0; + } else { + int tr = 0; + if (this.PowerVal1 > 0) { + tr |= RedPowerLib.mapRotToCon(10, super.Rotation); + } + + if (this.PowerVal2 > 0) { + tr |= RedPowerLib.mapRotToCon(5, super.Rotation); + } + + return tr; + } + } + + @Override + public void updateCurrentStrength() { + this.PowerVal2 = (short)RedPowerLib.updateBlockCurrentStrength( + super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, RedPowerLib.mapRotToCon(5, super.Rotation), 1 + ); + this.PowerVal1 = (short)RedPowerLib.updateBlockCurrentStrength( + super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, RedPowerLib.mapRotToCon(10, super.Rotation), 1 + ); + this.updateBlock(); + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return ch != 0 + ? -1 + : ( + (RedPowerLib.mapRotToCon(5, super.Rotation) & cons) > 0 + ? this.PowerVal2 + : ((RedPowerLib.mapRotToCon(10, super.Rotation) & cons) > 0 ? this.PowerVal1 : -1) + ); + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + if (ch != 0) { + return 0; + } else { + int r1 = RedPowerLib.mapRotToCon(5, super.Rotation); + int r2 = RedPowerLib.mapRotToCon(10, super.Rotation); + return (r1 & cons) > 0 + ? (super.Powered ? 255 : (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, r1 & cons, 0) ? 255 : 0)) + : ((r2 & cons) > 0 ? (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, r2 & cons, 0) ? 255 : 0) : 0); + } + } + + @Override + public int getConnectionMask() { + return RedPowerLib.mapRotToCon(15, super.Rotation); + } + + @Override + public int getExtConnectionMask() { + return 0; + } + + public int getTopwireMask() { + return RedPowerLib.mapRotToCon(5, super.Rotation); + } + + private boolean cellWantsPower() { + return super.SubId == 1 ? super.PowerState == 0 : super.PowerState != 0; + } + + private void updatePowerState() { + super.PowerState = this.PowerVal1 > 0 ? 1 : 0; + if (this.cellWantsPower() != super.Powered) { + this.scheduleTick(2); + } + + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!this.tryDropBlock()) { + RedPowerLib.updateCurrent(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + if (super.SubId != 0 && !this.isTickRunnable()) { + this.updatePowerState(); + } + } + + } + + @Override + public boolean isBlockStrongPoweringTo(int l) { + return !RedPowerLib.isSearching() && (this.getPoweringMask(0) & RedPowerLib.getConDirMask(l ^ 1)) > 0; + } + + @Override + public boolean isBlockWeakPoweringTo(int l) { + return !RedPowerLib.isSearching() && (this.getPoweringMask(0) & RedPowerLib.getConDirMask(l ^ 1)) > 0; + } + + @Override + public void onTileTick() { + if (super.Powered != this.cellWantsPower()) { + super.Powered = !super.Powered; + this.updateBlockChange(); + this.updatePowerState(); + } + + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part != super.Rotation >> 2) { + super.setPartBounds(block, part); + } else { + switch(part) { + case 0: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); + break; + case 1: + block.setBlockBounds(0.0F, 0.15F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F); + break; + case 3: + block.setBlockBounds(0.0F, 0.0F, 0.15F, 1.0F, 1.0F, 1.0F); + break; + case 4: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F); + break; + case 5: + block.setBlockBounds(0.15F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.PowerVal1 = (short)(data.getByte("pv1") & 255); + this.PowerVal2 = (short)(data.getByte("pv2") & 255); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("pv1", (byte)this.PowerVal1); + data.setByte("pv2", (byte)this.PowerVal2); + } + + @Override + protected void readFromPacket(NBTTagCompound buffer) { + this.PowerVal1 = buffer.getShort("pv1"); + this.PowerVal2 = buffer.getShort("pv2"); + super.readFromPacket(buffer); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setShort("pv1", this.PowerVal1); + data.setShort("pv2", this.PowerVal2); + super.writeToPacket(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogicPointer.java b/src/main/java/com/eloraam/redpower/logic/TileLogicPointer.java new file mode 100644 index 0000000..efe48f9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogicPointer.java @@ -0,0 +1,436 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerLogic; +import com.eloraam.redpower.core.MathLib; +import com.eloraam.redpower.core.Quat; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.Vector3; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +public class TileLogicPointer extends TileLogic implements IPointerTile { + private long timestart = 0L; + public long interval = 40L; + + @Override + public void initSubType(int st) { + super.initSubType(st); + switch(st) { + case 0: + this.interval = 38L; + break; + case 2: + super.Disabled = true; + } + + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return !sec || super.SubId != 1 && super.SubId != 2 ? super.getPartMaxRotation(part, sec) : 1; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return !sec || super.SubId != 1 && super.SubId != 2 ? super.getPartRotation(part, sec) : super.Deadmap; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec || super.SubId != 1 && super.SubId != 2) { + super.setPartRotation(part, sec, rot); + } else { + super.Deadmap = rot; + this.updateBlockChange(); + } + + } + + private void timerChange() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 7, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + if (super.Powered) { + if (!super.Disabled) { + return; + } + + if (ps > 0) { + return; + } + + super.Powered = false; + super.Disabled = false; + this.timestart = super.worldObj.getWorldTime(); + this.updateBlock(); + } else if (super.Disabled) { + if (ps > 0) { + return; + } + + this.timestart = super.worldObj.getWorldTime(); + super.Disabled = false; + this.updateBlock(); + } else { + if (ps == 0) { + return; + } + + super.Disabled = true; + this.updateBlock(); + } + + } + + private void timerTick() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 7, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + if (super.Powered) { + if (super.Disabled) { + if (ps > 0) { + super.Powered = false; + this.updateBlock(); + return; + } + + super.Disabled = false; + super.Powered = false; + this.timestart = super.worldObj.getWorldTime(); + this.updateBlock(); + return; + } + + if (ps == 0) { + super.Powered = false; + } else { + super.Disabled = true; + this.scheduleTick(2); + } + + this.timestart = super.worldObj.getWorldTime(); + this.updateBlockChange(); + } else if (super.Disabled) { + if (ps > 0) { + return; + } + + this.timestart = super.worldObj.getWorldTime(); + super.Disabled = false; + this.updateBlock(); + } else { + if (ps == 0) { + return; + } + + super.Disabled = true; + this.updateBlock(); + } + + } + + private void timerUpdate() { + if (!super.worldObj.isRemote && !super.Powered && !super.Disabled) { + long wt = super.worldObj.getWorldTime(); + if (this.interval < 2L) { + this.interval = 2L; + } + + if (this.timestart > wt) { + this.timestart = wt; + } + + if (this.timestart + this.interval <= wt) { + this.playSound("random.click", 0.3F, 0.5F, false); + super.Powered = true; + this.scheduleTick(2); + this.updateBlockChange(); + } + } + + } + + private void sequencerUpdate() { + long wt = super.worldObj.getWorldTime() + 6000L; + float f = (float)wt / (float)(this.interval * 4L); + int i = (int)Math.floor((double)(f * 4.0F)); + if (super.Deadmap == 1) { + i = 3 - i & 3; + } else { + i = i + 3 & 3; + } + + if (super.PowerState != i && !super.worldObj.isRemote) { + this.playSound("random.click", 0.3F, 0.5F, false); + super.PowerState = i; + this.updateBlockChange(); + } + + } + + private void stateCellChange() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 7, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + boolean ps3 = super.Deadmap == 0 ? (ps & 3) > 0 : (ps & 6) > 0; + if (super.Disabled && !ps3) { + super.Disabled = false; + this.timestart = super.worldObj.getWorldTime(); + this.updateBlock(); + } else if (!super.Disabled && ps3) { + super.Disabled = true; + this.updateBlock(); + } + + if (!super.Active && !super.Powered && (ps & 2) > 0) { + super.Powered = true; + this.updateBlock(); + this.scheduleTick(2); + } + + } + + private void stateCellTick() { + if (!super.Active && super.Powered) { + super.Powered = false; + super.Active = true; + this.timestart = super.worldObj.getWorldTime(); + this.updateBlockChange(); + } else if (super.Active && super.Powered) { + super.Powered = false; + super.Active = false; + this.updateBlockChange(); + } + + } + + private void stateCellUpdate() { + if (!super.worldObj.isRemote && super.Active && !super.Powered && !super.Disabled) { + long wt = super.worldObj.getWorldTime(); + if (this.interval < 2L) { + this.interval = 2L; + } + + if (this.timestart > wt) { + this.timestart = wt; + } + + if (this.timestart + this.interval <= wt) { + this.playSound("random.click", 0.3F, 0.5F, false); + super.Powered = true; + this.scheduleTick(2); + this.updateBlockChange(); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!this.tryDropBlock()) { + switch(super.SubId) { + case 0: + this.timerChange(); + break; + case 2: + this.stateCellChange(); + } + } + + } + + @Override + public void onTileTick() { + switch(super.SubId) { + case 0: + this.timerTick(); + break; + case 2: + this.stateCellTick(); + } + + } + + @Override + public int getPoweringMask(int ch) { + if (ch != 0) { + return 0; + } else { + switch(super.SubId) { + case 0: + if (!super.Disabled && super.Powered) { + return RedPowerLib.mapRotToCon(13, super.Rotation); + } + + return 0; + case 1: + return RedPowerLib.mapRotToCon(1 << super.PowerState, super.Rotation); + case 2: + int ps = (super.Active && super.Powered ? 8 : 0) | (super.Active && !super.Powered ? (super.Deadmap == 0 ? 4 : 1) : 0); + return RedPowerLib.mapRotToCon(ps, super.Rotation); + default: + return 0; + } + } + } + + @Override + public boolean onPartActivateSide(EntityPlayer player, int part, int side) { + if (part == super.Rotation >> 2 && !player.isSneaking() && !super.worldObj.isRemote) { + player.openGui(RedPowerLogic.instance, 2, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + return true; + } else { + return false; + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + switch(super.SubId) { + case 0: + this.timerUpdate(); + break; + case 1: + this.sequencerUpdate(); + break; + case 2: + this.stateCellUpdate(); + } + + } + + @Override + public float getPointerDirection(float partialTicks) { + if (super.SubId == 0) { + if (!super.Powered && !super.Disabled) { + long wt = super.worldObj.getWorldTime(); + float ivt = ((float)wt + partialTicks - (float)this.timestart) / (float)this.interval; + if (ivt > 1.0F) { + ivt = 1.0F; + } + + return ivt + 0.75F; + } else { + return 0.75F; + } + } else if (super.SubId == 1) { + long wt = super.worldObj.getWorldTime() + 6000L; + float ivt = ((float)wt + partialTicks) / (float)(this.interval * 4L); + if (super.Deadmap == 1) { + ivt = 0.75F - ivt; + } else { + ivt += 0.75F; + } + + return ivt; + } else if (super.SubId != 2) { + return 0.0F; + } else { + if (super.Deadmap > 0) { + if (!super.Active || super.Disabled) { + return 1.0F; + } + + if (super.Active && super.Powered) { + return 0.8F; + } + } else { + if (!super.Active || super.Disabled) { + return 0.5F; + } + + if (super.Active && super.Powered) { + return 0.7F; + } + } + + long wt = super.worldObj.getWorldTime(); + float ivt = ((float)wt + partialTicks - (float)this.timestart) / (float)this.interval; + return super.Deadmap > 0 ? 1.0F - 0.2F * ivt : 0.5F + 0.2F * ivt; + } + } + + @Override + public Quat getOrientationBasis() { + return MathLib.orientQuat(super.Rotation >> 2, super.Rotation & 3); + } + + public Vector3 getPointerOrigin() { + return super.SubId == 2 ? (super.Deadmap > 0 ? new Vector3(0.0, -0.1, -0.25) : new Vector3(0.0, -0.1, 0.25)) : new Vector3(0.0, -0.1, 0.0); + } + + public void setInterval(long iv) { + if (super.SubId == 0) { + this.interval = iv - 2L; + } else { + this.interval = iv; + } + + } + + public long getInterval() { + return super.SubId == 0 ? this.interval + 2L : this.interval; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.interval = data.getLong("iv"); + if (super.SubId == 0 || super.SubId == 2) { + this.timestart = data.getLong("ts"); + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setLong("iv", this.interval); + if (super.SubId == 0 || super.SubId == 2) { + data.setLong("ts", this.timestart); + } + + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.interval = tag.getLong("iv"); + super.readFromPacket(tag); + if (super.SubId == 0 || super.SubId == 2) { + this.timestart = tag.getLong("ts"); + } + + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setLong("iv", this.interval); + super.writeToPacket(tag); + if (super.SubId == 0 || super.SubId == 2) { + tag.setLong("ts", this.timestart); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogicSimple.java b/src/main/java/com/eloraam/redpower/logic/TileLogicSimple.java new file mode 100644 index 0000000..e9291bb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogicSimple.java @@ -0,0 +1,805 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; + +public class TileLogicSimple extends TileLogic { + private static final int[] toDead = new int[]{0, 1, 2, 4, 6, 5, 3}; + private static final int[] fromDead = new int[]{0, 1, 2, 6, 3, 5, 4}; + private static final int[] toDeadNot = new int[]{0, 1, 8, 4, 12, 5, 9}; + private static final int[] fromDeadNot = new int[]{0, 1, 0, 0, 3, 5, 0, 0, 2, 6, 0, 0, 4}; + private static final int[] toDeadBuf = new int[]{0, 1, 4, 5}; + private static final int[] fromDeadBuf = new int[]{0, 1, 0, 0, 2, 3}; + private static int[] tickSchedule = new int[]{2, 4, 6, 8, 16, 32, 64, 128, 256}; + + @Override + public void initSubType(int st) { + super.initSubType(st); + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + if (sec) { + switch(super.SubId) { + case 0: + return 3; + case 1: + case 2: + case 3: + case 4: + case 9: + return 6; + case 5: + case 6: + case 7: + case 8: + case 12: + case 13: + case 14: + default: + break; + case 10: + return 3; + case 11: + case 15: + return 1; + case 16: + return 3; + } + } + + return super.getPartMaxRotation(part, sec); + } + + @Override + public int getPartRotation(int part, boolean sec) { + if (sec) { + switch(super.SubId) { + case 0: + return super.Deadmap; + case 1: + case 2: + case 3: + case 4: + return fromDead[super.Deadmap]; + case 5: + case 6: + case 7: + case 8: + case 12: + case 13: + case 14: + default: + break; + case 9: + return fromDeadNot[super.Deadmap]; + case 10: + return fromDeadBuf[super.Deadmap]; + case 11: + case 15: + case 16: + return super.Deadmap; + } + } + + return super.getPartRotation(part, sec); + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (sec) { + switch(super.SubId) { + case 0: + super.Deadmap = rot; + super.PowerState = 0; + super.Active = false; + super.Powered = false; + this.updateBlockChange(); + return; + case 1: + case 2: + case 3: + case 4: + super.Deadmap = toDead[rot]; + this.updateBlockChange(); + return; + case 5: + case 6: + case 7: + case 8: + case 12: + case 13: + case 14: + default: + break; + case 9: + super.Deadmap = toDeadNot[rot]; + this.updateBlockChange(); + return; + case 10: + super.Deadmap = toDeadBuf[rot]; + this.updateBlockChange(); + return; + case 11: + case 15: + case 16: + super.Deadmap = rot; + this.updateBlockChange(); + return; + } + } + + super.setPartRotation(part, sec, rot); + } + + private void latchUpdatePowerState() { + if (!super.Disabled || super.Active) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 5, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + if (!this.isTickRunnable()) { + if (super.Active) { + if (ps == 5) { + super.Disabled = true; + } else { + super.Disabled = false; + } + } else if ((ps != 1 || !super.Powered) && (ps != 4 || super.Powered)) { + if (ps == 5) { + super.Active = true; + super.Disabled = true; + super.Powered = !super.Powered; + this.scheduleTick(2); + this.updateBlockChange(); + } + } else { + super.Powered = !super.Powered; + super.Active = true; + this.playSound("random.click", 0.3F, 0.5F, false); + this.scheduleTick(2); + this.updateBlockChange(); + } + } + } + + } + + private void latchTick() { + if (super.Active) { + super.Active = false; + if (super.Disabled) { + this.updateBlockChange(); + this.scheduleTick(2); + } else { + this.updateBlockChange(); + } + } else if (super.Disabled) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 5, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + switch(ps) { + case 0: + super.Disabled = false; + super.Powered = super.worldObj.rand.nextInt(2) == 0; + this.updateBlockChange(); + break; + case 1: + super.Disabled = false; + super.Powered = false; + this.updateBlockChange(); + this.playSound("random.click", 0.3F, 0.5F, false); + case 2: + case 3: + default: + break; + case 4: + super.Disabled = false; + super.Powered = true; + this.updateBlockChange(); + this.playSound("random.click", 0.3F, 0.5F, false); + break; + case 5: + this.scheduleTick(4); + } + } + + } + + private int latch2NextState() { + if ((super.PowerState & 5) == 0) { + return super.PowerState; + } else { + int ps = super.PowerState & 5 | 10; + if (super.Deadmap == 2) { + if ((ps & 1) > 0) { + ps &= -9; + } + + if ((ps & 4) > 0) { + ps &= -3; + } + } else { + if ((ps & 1) > 0) { + ps &= -3; + } + + if ((ps & 4) > 0) { + ps &= -9; + } + } + + return ps; + } + } + + private void latch2UpdatePowerState() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 5, super.Rotation, 0); + boolean upd = false; + if (ps != (super.PowerState & 5)) { + super.PowerState = super.PowerState & 10 | ps; + upd = true; + } + + int p2 = this.latch2NextState(); + if (p2 != super.PowerState || (super.PowerState & 5) == 0) { + this.scheduleTick(2); + upd = true; + } + + if (upd) { + this.updateBlock(); + } + + } + + private void latchChange() { + if (super.Deadmap < 2) { + this.latchUpdatePowerState(); + } else { + if (this.isTickRunnable()) { + return; + } + + this.latch2UpdatePowerState(); + } + + } + + private void latch2Tick() { + boolean upd = false; + if (super.PowerState == 0) { + super.PowerState |= super.worldObj.rand.nextInt(2) == 0 ? 1 : 4; + upd = true; + } + + int ps = this.latch2NextState(); + if (ps != super.PowerState) { + super.PowerState = ps; + upd = true; + } + + if (upd) { + this.updateBlockChange(); + } + + this.latch2UpdatePowerState(); + } + + private void pulseChange() { + if (super.Active) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 2, super.Rotation, 0); + if (ps == 0) { + super.Active = false; + this.updateBlock(); + } + } else if (!super.Powered) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 2, super.Rotation, 0); + if (ps > 0) { + super.Powered = true; + this.updateBlockChange(); + this.scheduleTick(2); + } + } + + } + + private void pulseTick() { + if (super.Powered) { + super.Powered = false; + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 2, super.Rotation, 0); + if (ps > 0) { + super.Active = true; + } + + this.updateBlockChange(); + } + + } + + private void toggleUpdatePowerState() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 5, super.Rotation, 0); + if (ps != super.PowerState) { + int t = 5 & ps & ~super.PowerState; + if (t == 1 || t == 4) { + super.Active = true; + } + + super.PowerState = ps; + this.updateBlock(); + if (super.Active) { + this.scheduleTick(2); + } + } + + } + + private void toggleTick() { + if (super.Active) { + this.playSound("random.click", 0.3F, 0.5F, false); + super.Powered = !super.Powered; + super.Active = false; + this.updateBlockChange(); + } + + this.toggleUpdatePowerState(); + } + + private void repUpdatePowerState() { + if (!super.Active) { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 2, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + boolean pwr = super.PowerState > 0; + if (pwr != super.Powered) { + super.Active = true; + this.scheduleTick(tickSchedule[super.Deadmap]); + } + } + + } + + private void repTick() { + if (super.Active) { + super.Powered = !super.Powered; + super.Active = false; + this.updateBlockChange(); + this.repUpdatePowerState(); + } + + } + + private void syncChange() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 7, super.Rotation, 0); + int psc = ps & ~super.PowerState; + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + boolean upd = false; + if ((ps & 2) == 2) { + if (!super.Powered && (super.Active || super.Disabled)) { + super.Active = false; + super.Disabled = false; + upd = true; + } + } else { + if ((psc & 1) > 0 && !super.Active) { + super.Active = true; + upd = true; + } + + if ((psc & 4) > 0 && !super.Disabled) { + super.Disabled = true; + upd = true; + } + } + + if (upd) { + this.updateBlock(); + this.scheduleTick(2); + } + + } + + private void syncTick() { + if (super.Active && super.Disabled && !super.Powered) { + super.Powered = true; + super.Active = false; + super.Disabled = false; + this.scheduleTick(2); + this.updateBlockChange(); + } else if (super.Powered) { + super.Powered = false; + this.updateBlockChange(); + } + + } + + private void randUpdatePowerState() { + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 15, super.Rotation, 0); + int psc = ps & ~super.PowerState; + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + if ((psc & 2) > 0) { + this.scheduleTick(2); + } + + } + + private void randTick() { + if ((super.PowerState & 2) != 0) { + int rv = super.worldObj.rand.nextInt(8); + super.Disabled = (rv & 1) > 0; + super.Active = (rv & 2) > 0; + super.Powered = (rv & 4) > 0; + this.updateBlockChange(); + this.randUpdatePowerState(); + if ((super.PowerState & 2) > 0) { + this.scheduleTick(4); + } + } + + } + + private void lightTick() { + int lb = super.worldObj.getBlockLightValue(super.xCoord, super.yCoord, super.zCoord); + super.Active = lb > super.Deadmap * 4; + if (super.Cover != 7 && super.Cover != 255) { + super.Active = false; + } + + if (super.Active != super.Powered) { + this.scheduleTick(2); + } + + this.simpleTick(); + } + + private boolean simpleWantsPower() { + switch(super.SubId) { + case 1: + return (super.PowerState & 7 & ~super.Deadmap) == 0; + case 2: + return (super.PowerState & ~super.Deadmap) > 0; + case 3: + return (super.PowerState & 7 | super.Deadmap) < 7; + case 4: + return (super.PowerState | super.Deadmap) == 7; + case 5: + return super.PowerState == 5 || super.PowerState == 0; + case 6: + int t = super.PowerState & 5; + return t == 4 || t == 1; + case 7: + case 8: + case 12: + case 13: + case 14: + default: + return false; + case 9: + return (super.PowerState & 2) == 0; + case 10: + return (super.PowerState & 2) > 0; + case 11: + if (super.Deadmap == 0) { + return (super.PowerState & 3) == 1 || (super.PowerState & 6) == 6; + } + + return (super.PowerState & 3) == 3 || (super.PowerState & 6) == 4; + case 15: + if ((super.PowerState & 2) == 0) { + return super.Powered; + } else { + if (super.Deadmap == 0) { + return (super.PowerState & 4) == 4; + } + + return (super.PowerState & 1) == 1; + } + case 16: + return super.Active; + } + } + + private void simpleUpdatePowerState() { + int sides = 15; + switch(super.SubId) { + case 2: + sides = 7; + case 3: + case 7: + case 8: + case 9: + case 13: + case 14: + default: + break; + case 4: + sides = 7; + break; + case 5: + sides = 5; + break; + case 6: + sides = 13; + break; + case 10: + sides = 7; + break; + case 11: + sides = 7; + break; + case 12: + sides = 2; + break; + case 15: + sides = super.Deadmap == 0 ? 6 : 3; + break; + case 16: + sides = 8; + } + + int ps = RedPowerLib.getRotPowerState(super.worldObj, super.xCoord, super.yCoord, super.zCoord, sides, super.Rotation, 0); + if (ps != super.PowerState) { + this.updateBlock(); + } + + super.PowerState = ps; + boolean pwr = this.simpleWantsPower(); + if (pwr != super.Powered) { + this.scheduleTick(2); + } + + } + + private void simpleTick() { + boolean pwr = this.simpleWantsPower(); + if (super.Powered && !pwr) { + super.Powered = false; + this.updateBlockChange(); + } else if (!super.Powered && pwr) { + super.Powered = true; + this.updateBlockChange(); + } + + this.simpleUpdatePowerState(); + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!this.tryDropBlock()) { + switch(super.SubId) { + case 0: + this.latchChange(); + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 9: + case 10: + case 11: + case 15: + case 16: + if (!this.isTickRunnable()) { + this.simpleUpdatePowerState(); + } + break; + case 7: + this.pulseChange(); + break; + case 8: + if (!this.isTickRunnable()) { + this.toggleUpdatePowerState(); + } + break; + case 12: + if (!this.isTickRunnable()) { + this.repUpdatePowerState(); + } + break; + case 13: + this.syncChange(); + break; + case 14: + if (!this.isTickRunnable()) { + this.randUpdatePowerState(); + } + } + } + + } + + @Override + public void onTileTick() { + switch(super.SubId) { + case 0: + if (super.Deadmap < 2) { + this.latchTick(); + } else { + this.latch2Tick(); + } + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 9: + case 10: + case 11: + case 15: + this.simpleTick(); + break; + case 7: + this.pulseTick(); + break; + case 8: + this.toggleTick(); + break; + case 12: + this.repTick(); + break; + case 13: + this.syncTick(); + break; + case 14: + this.randTick(); + break; + case 16: + this.lightTick(); + } + + } + + @Override + public int getPoweringMask(int ch) { + if (ch != 0) { + return 0; + } else { + switch(super.SubId) { + case 0: + int ps; + if (super.Deadmap > 1) { + ps = super.PowerState & 10; + } else if (super.Disabled && !super.Active) { + ps = 0; + } else if (super.Active) { + ps = super.Powered ? 4 : 1; + } else if (super.Deadmap == 1) { + ps = super.Powered ? 6 : 9; + } else { + ps = super.Powered ? 12 : 3; + } + + return RedPowerLib.mapRotToCon(ps, super.Rotation); + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 11: + case 12: + case 13: + default: + return super.getPoweringMask(ch); + case 8: + if (super.Powered) { + return RedPowerLib.mapRotToCon(2, super.Rotation); + } + + return RedPowerLib.mapRotToCon(8, super.Rotation); + case 9: + case 10: + if (super.Powered) { + return RedPowerLib.mapRotToCon(13 & ~super.Deadmap, super.Rotation); + } + + return 0; + case 14: + return RedPowerLib.mapRotToCon((super.Active ? 1 : 0) | (super.Disabled ? 4 : 0) | (super.Powered ? 8 : 0), super.Rotation); + case 15: + return RedPowerLib.mapRotToCon(super.Deadmap == 0 ? (super.Powered ? 9 : 0) : (super.Powered ? 12 : 0), super.Rotation); + } + } + } + + @Override + public boolean onPartActivateSide(EntityPlayer player, int part, int side) { + switch(super.SubId) { + case 8: + if (part != super.Rotation >> 2) { + return false; + } + + this.playSound("random.click", 0.3F, 0.5F, false); + if (super.Powered) { + super.Powered = false; + } else { + super.Powered = true; + } + + this.updateBlockChange(); + return true; + case 12: + if (part != super.Rotation >> 2) { + return false; + } + + ++super.Deadmap; + if (super.Deadmap > 8) { + super.Deadmap = 0; + } + + this.updateBlockChange(); + return true; + default: + return false; + } + } + + @Override + public int getConnectableMask() { + switch(super.SubId) { + case 1: + case 2: + case 3: + case 4: + return RedPowerLib.mapRotToCon(8 | 7 & ~super.Deadmap, super.Rotation); + case 5: + case 6: + return RedPowerLib.mapRotToCon(13, super.Rotation); + case 7: + return RedPowerLib.mapRotToCon(10, super.Rotation); + case 8: + case 11: + default: + return super.getConnectableMask(); + case 9: + return RedPowerLib.mapRotToCon(2 | 13 & ~super.Deadmap, super.Rotation); + case 10: + return RedPowerLib.mapRotToCon(10 | 5 & ~super.Deadmap, super.Rotation); + case 12: + return RedPowerLib.mapRotToCon(10, super.Rotation); + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (super.SubId == 16 && !this.isTickScheduled()) { + this.scheduleTick(8); + } + + } + + @Override + public int getLightValue() { + return super.SubId == 16 ? 0 : super.getLightValue(); + } + + @Override + public int getExtendedID() { + return 1; + } +} diff --git a/src/main/java/com/eloraam/redpower/logic/TileLogicStorage.java b/src/main/java/com/eloraam/redpower/logic/TileLogicStorage.java new file mode 100644 index 0000000..fdf75da --- /dev/null +++ b/src/main/java/com/eloraam/redpower/logic/TileLogicStorage.java @@ -0,0 +1,304 @@ +package com.eloraam.redpower.logic; + +import com.eloraam.redpower.RedPowerLogic; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; + +public class TileLogicStorage extends TileLogic { + TileLogicStorage.LogicStorageModule storage = null; + + @Override + public int getExtendedID() { + return 3; + } + + @Override + public void initSubType(int st) { + super.initSubType(st); + this.initStorage(); + } + + public TileLogicStorage.LogicStorageModule getLogicStorage(Class cl) { + if (!cl.isInstance(this.storage)) { + this.initStorage(); + } + + return this.storage; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return (this.isInvalid() || super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this) + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + if (sec) { + switch(super.SubId) { + case 0: + return 1; + } + } + + return super.getPartMaxRotation(part, sec); + } + + @Override + public int getPartRotation(int part, boolean sec) { + if (sec) { + switch(super.SubId) { + case 0: + return super.Deadmap; + } + } + + return super.getPartRotation(part, sec); + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (sec) { + switch(super.SubId) { + case 0: + super.Deadmap = rot; + this.updateBlockChange(); + return; + } + } + + super.setPartRotation(part, sec, rot); + } + + void initStorage() { + if (this.storage == null || this.storage.getSubType() != super.SubId) { + switch(super.SubId) { + case 0: + this.storage = new TileLogicStorage.LogicStorageCounter(); + break; + default: + this.storage = null; + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!this.tryDropBlock()) { + this.initStorage(); + switch(super.SubId) { + case 0: + if (this.isTickRunnable()) { + return; + } + + this.storage.updatePowerState(); + } + } + + } + + @Override + public void onTileTick() { + this.initStorage(); + this.storage.tileTick(); + } + + @Override + public int getPoweringMask(int ch) { + this.initStorage(); + return this.storage.getPoweringMask(ch); + } + + @Override + public boolean onPartActivateSide(EntityPlayer player, int part, int side) { + if (part == super.Rotation >> 2 && !player.isSneaking()) { + if (!super.worldObj.isRemote) { + switch(super.SubId) { + case 0: + player.openGui(RedPowerLogic.instance, 1, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + } + + return true; + } else { + return false; + } + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.initStorage(); + this.storage.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.storage.writeToNBT(data); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.initStorage(); + this.storage.readFromPacket(tag); + super.readFromPacket(tag); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + this.storage.writeToPacket(tag); + super.writeToPacket(tag); + } + + public class LogicStorageCounter extends TileLogicStorage.LogicStorageModule { + public int Count = 0; + public int CountMax = 10; + public int Inc = 1; + public int Dec = 1; + + @Override + public void updatePowerState() { + int ps = RedPowerLib.getRotPowerState( + TileLogicStorage.this.worldObj, + TileLogicStorage.this.xCoord, + TileLogicStorage.this.yCoord, + TileLogicStorage.this.zCoord, + 5, + TileLogicStorage.super.Rotation, + 0 + ); + if (ps != TileLogicStorage.this.PowerState) { + if ((ps & ~TileLogicStorage.this.PowerState & 1) > 0) { + TileLogicStorage.this.Active = true; + } + + if ((ps & ~TileLogicStorage.this.PowerState & 4) > 0) { + TileLogicStorage.this.Disabled = true; + } + + TileLogicStorage.this.PowerState = ps; + TileLogicStorage.this.updateBlock(); + if (TileLogicStorage.this.Active || TileLogicStorage.this.Disabled) { + TileLogicStorage.this.scheduleTick(2); + } + } + + } + + @Override + public void tileTick() { + int co = this.Count; + if (TileLogicStorage.this.Deadmap > 0) { + if (TileLogicStorage.this.Active) { + this.Count -= this.Dec; + TileLogicStorage.this.Active = false; + } + + if (TileLogicStorage.this.Disabled) { + this.Count += this.Inc; + TileLogicStorage.this.Disabled = false; + } + } else { + if (TileLogicStorage.this.Active) { + this.Count += this.Inc; + TileLogicStorage.this.Active = false; + } + + if (TileLogicStorage.this.Disabled) { + this.Count -= this.Dec; + TileLogicStorage.this.Disabled = false; + } + } + + if (this.Count < 0) { + this.Count = 0; + } + + if (this.Count > this.CountMax) { + this.Count = this.CountMax; + } + + if (co != this.Count) { + TileLogicStorage.this.updateBlockChange(); + TileLogicStorage.this.playSound("random.click", 0.3F, 0.5F, false); + } + + this.updatePowerState(); + } + + @Override + public int getSubType() { + return 0; + } + + @Override + public int getPoweringMask(int ch) { + int ps = 0; + if (ch != 0) { + return 0; + } else { + if (this.Count == 0) { + ps |= 2; + } + + if (this.Count == this.CountMax) { + ps |= 8; + } + + return RedPowerLib.mapRotToCon(ps, TileLogicStorage.super.Rotation); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + this.Count = tag.getInteger("cnt"); + this.CountMax = tag.getInteger("max"); + this.Inc = tag.getInteger("inc"); + this.Dec = tag.getInteger("dec"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + tag.setInteger("cnt", this.Count); + tag.setInteger("max", this.CountMax); + tag.setInteger("inc", this.Inc); + tag.setInteger("dec", this.Dec); + } + + @Override + public void readFromPacket(NBTTagCompound tag) { + this.Count = tag.getInteger("cnt"); + this.CountMax = tag.getInteger("max"); + } + + @Override + public void writeToPacket(NBTTagCompound tag) { + tag.setInteger("cnt", this.Count); + tag.setInteger("max", this.CountMax); + } + } + + public abstract class LogicStorageModule { + public abstract void updatePowerState(); + + public abstract void tileTick(); + + public abstract int getSubType(); + + public abstract int getPoweringMask(int var1); + + public abstract void readFromNBT(NBTTagCompound var1); + + public abstract void writeToNBT(NBTTagCompound var1); + + public void readFromPacket(NBTTagCompound tag) { + } + + public void writeToPacket(NBTTagCompound tag) { + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/BlockFrame.java b/src/main/java/com/eloraam/redpower/machine/BlockFrame.java new file mode 100644 index 0000000..8248a9b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/BlockFrame.java @@ -0,0 +1,38 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockCoverable; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class BlockFrame extends BlockCoverable { + public BlockFrame() { + super(CoreLib.materialRedpower); + this.setHardness(0.5F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB box, List list, Entity ent) { + TileFrameMoving tl = CoreLib.getTileEntity(world, x, y, z, TileFrameMoving.class); + if (tl == null) { + super.addCollisionBoxesToList(world, x, y, z, box, list, ent); + } else { + this.computeCollidingBoxes(world, x, y, z, box, list, tl); + TileMotor tm = CoreLib.getTileEntity(world, tl.motorX, tl.motorY, tl.motorZ, TileMotor.class); + if (tm != null) { + WorldCoord wc = new WorldCoord(x, y, z); + wc.step(tm.MoveDir ^ 1); + tl = CoreLib.getTileEntity(world, wc, TileFrameMoving.class); + if (tl != null) { + this.computeCollidingBoxes(world, wc.x, wc.y, wc.z, box, list, tl); + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/BlockMachine.java b/src/main/java/com/eloraam/redpower/machine/BlockMachine.java new file mode 100644 index 0000000..8d2201c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/BlockMachine.java @@ -0,0 +1,64 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockMachine extends BlockExtended { + public BlockMachine() { + super(Material.rock); + this.setHardness(2.0F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + @Override + public boolean isOpaqueCube() { + return true; + } + + public boolean isNormalCube() { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return true; + } + + public boolean isBlockNormalCube() { + return false; + } + + public boolean isSideSolid(IBlockAccess iba, int i, int j, int k, ForgeDirection side) { + return true; + } + + @Override + public int damageDropped(int i) { + return i; + } + + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess iba, int x, int y, int z, int side) { + TileMachine tm = CoreLib.getTileEntity(iba, x, y, z, TileMachine.class); + return tm != null && tm.isPoweringTo(side) ? 1 : 0; + } + + public boolean isFireSource(World world, int x, int y, int z, ForgeDirection face) { + int md = world.getBlockMetadata(x, y, z); + if (md != 12) { + return false; + } else { + TileIgniter tig = CoreLib.getTileEntity(world, x, y, z, TileIgniter.class); + return tig != null && tig.isOnFire(face); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/BlockMachinePanel.java b/src/main/java/com/eloraam/redpower/machine/BlockMachinePanel.java new file mode 100644 index 0000000..659cda1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/BlockMachinePanel.java @@ -0,0 +1,39 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; + +public class BlockMachinePanel extends BlockMultipart { + public BlockMachinePanel() { + super(Material.rock); + this.setHardness(2.0F); + this.setCreativeTab(CreativeExtraTabs.tabMachine); + } + + public int getLightValue(IBlockAccess iba, int i, int j, int k) { + TileMachinePanel tmp = CoreLib.getTileEntity(iba, i, j, k, TileMachinePanel.class); + return tmp == null ? 0 : tmp.getLightValue(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + public boolean isNormalCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int damageDropped(int i) { + return i; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerAssemble.java b/src/main/java/com/eloraam/redpower/machine/ContainerAssemble.java new file mode 100644 index 0000000..ffbc1f6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerAssemble.java @@ -0,0 +1,137 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerAssemble extends Container implements IHandleGuiEvent { + private TileAssemble tileAssemble; + public int mode = 0; + public int select = 0; + public int skipSlots = 0; + + public ContainerAssemble(IInventory inv, TileAssemble tf) { + this.tileAssemble = tf; + + for(int i = 0; i < 2; ++i) { + for(int j = 0; j < 8; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 8, 8 + j * 18, 18 + i * 18)); + } + } + + for(int i = 0; i < 2; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 9 + 16, 8 + j * 18, 63 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 113 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 171)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileAssemble.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 34) { + if (!this.mergeItemStack(itemstack1, 34, 70, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 16, 34, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.mode != this.tileAssemble.mode) { + ic.sendProgressBarUpdate(this, 0, this.tileAssemble.mode); + } + + if (this.select != this.tileAssemble.select) { + ic.sendProgressBarUpdate(this, 1, this.tileAssemble.select); + } + + if (this.skipSlots != this.tileAssemble.skipSlots) { + ic.sendProgressBarUpdate(this, 2, this.tileAssemble.skipSlots); + } + } + + this.mode = this.tileAssemble.mode; + this.select = this.tileAssemble.select; + this.skipSlots = this.tileAssemble.skipSlots; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileAssemble.mode = (byte)j; + break; + case 1: + this.tileAssemble.select = (byte)j; + break; + case 2: + this.tileAssemble.skipSlots = j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileAssemble.mode = message.parameters[0]; + this.tileAssemble.updateBlockChange(); + break; + case 2: + this.tileAssemble.skipSlots = message.parameters[0]; + this.tileAssemble.markDirty(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerBatteryBox.java b/src/main/java/com/eloraam/redpower/machine/ContainerBatteryBox.java new file mode 100644 index 0000000..36fe2df --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerBatteryBox.java @@ -0,0 +1,105 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerBatteryBox extends Container { + private TileBatteryBox tileBB; + public int charge; + public int storage; + + public ContainerBatteryBox(IInventory inv, TileBatteryBox tf) { + this.tileBB = tf; + this.addSlotToContainer(new Slot(tf, 0, 120, 27)); + this.addSlotToContainer(new Slot(tf, 1, 120, 55)); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 88 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 146)); + } + + } + + public boolean canInteractWith(EntityPlayer player) { + return player.worldObj.isRemote || this.tileBB.isUseableByPlayer(player); + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 2) { + if (!this.mergeItemStack(itemstack1, 2, 38, true)) { + return null; + } + } else { + Slot sl0 = (Slot)super.inventorySlots.get(0); + ItemStack slst = sl0.getStack(); + if (slst != null && slst.stackSize != 0) { + return null; + } + + sl0.putStack(itemstack1.splitStack(1)); + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.charge != this.tileBB.Charge) { + ic.sendProgressBarUpdate(this, 0, this.tileBB.Charge); + } + + if (this.storage != this.tileBB.Storage) { + ic.sendProgressBarUpdate(this, 1, this.tileBB.Storage); + } + } + + this.charge = this.tileBB.Charge; + this.storage = this.tileBB.Storage; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileBB.Charge = j; + break; + case 1: + this.tileBB.Storage = j; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerBlueAlloyFurnace.java b/src/main/java/com/eloraam/redpower/machine/ContainerBlueAlloyFurnace.java new file mode 100644 index 0000000..5de2fc8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerBlueAlloyFurnace.java @@ -0,0 +1,119 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.base.SlotAlloyFurnace; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerBlueAlloyFurnace extends Container { + public int cooktime = 0; + private TileBlueAlloyFurnace tileFurnace; + public int charge = 0; + public int flow = 0; + + public ContainerBlueAlloyFurnace(InventoryPlayer inv, TileBlueAlloyFurnace td) { + this.tileFurnace = td; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(td, j + i * 3, 48 + j * 18, 17 + i * 18)); + } + } + + this.addSlotToContainer(new SlotAlloyFurnace(inv.player, td, 9, 141, 35)); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileFurnace.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 10) { + if (!this.mergeItemStack(itemstack1, 10, 46, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.cooktime != this.tileFurnace.cooktime) { + ic.sendProgressBarUpdate(this, 0, this.tileFurnace.cooktime); + } + + if (this.charge != this.tileFurnace.cond.Charge) { + ic.sendProgressBarUpdate(this, 1, this.tileFurnace.cond.Charge); + } + + if (this.flow != this.tileFurnace.cond.Flow) { + ic.sendProgressBarUpdate(this, 2, this.tileFurnace.cond.Flow); + ic.sendProgressBarUpdate(this, 3, this.tileFurnace.cond.Flow >> 16); + } + } + + this.cooktime = this.tileFurnace.cooktime; + this.charge = this.tileFurnace.cond.Charge; + this.flow = this.tileFurnace.cond.Flow; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileFurnace.cooktime = j; + break; + case 1: + this.tileFurnace.cond.Charge = j; + break; + case 2: + this.tileFurnace.cond.Flow = this.tileFurnace.cond.Flow & -65536 | j; + break; + case 3: + this.tileFurnace.cond.Flow |= j << 16; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerBlueFurnace.java b/src/main/java/com/eloraam/redpower/machine/ContainerBlueFurnace.java new file mode 100644 index 0000000..1f1e9b1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerBlueFurnace.java @@ -0,0 +1,113 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.inventory.SlotFurnace; +import net.minecraft.item.ItemStack; + +public class ContainerBlueFurnace extends Container { + public int cooktime = 0; + private TileBlueFurnace tileFurnace; + public int charge = 0; + public int flow = 0; + + public ContainerBlueFurnace(InventoryPlayer inv, TileBlueFurnace td) { + this.tileFurnace = td; + this.addSlotToContainer(new Slot(td, 0, 62, 35)); + this.addSlotToContainer(new SlotFurnace(inv.player, td, 1, 126, 35)); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileFurnace.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 2) { + if (!this.mergeItemStack(itemstack1, 2, 38, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.cooktime != this.tileFurnace.cooktime) { + ic.sendProgressBarUpdate(this, 0, this.tileFurnace.cooktime); + } + + if (this.charge != this.tileFurnace.cond.Charge) { + ic.sendProgressBarUpdate(this, 1, this.tileFurnace.cond.Charge); + } + + if (this.flow != this.tileFurnace.cond.Flow) { + ic.sendProgressBarUpdate(this, 2, this.tileFurnace.cond.Flow); + ic.sendProgressBarUpdate(this, 3, this.tileFurnace.cond.Flow >> 16); + } + } + + this.cooktime = this.tileFurnace.cooktime; + this.charge = this.tileFurnace.cond.Charge; + this.flow = this.tileFurnace.cond.Flow; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileFurnace.cooktime = j; + break; + case 1: + this.tileFurnace.cond.Charge = j; + break; + case 2: + this.tileFurnace.cond.Flow = this.tileFurnace.cond.Flow & -65536 | j; + break; + case 3: + this.tileFurnace.cond.Flow |= j << 16; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerBufferChest.java b/src/main/java/com/eloraam/redpower/machine/ContainerBufferChest.java new file mode 100644 index 0000000..3152a42 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerBufferChest.java @@ -0,0 +1,70 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerBufferChest extends Container { + private TileBufferChest tileBuffer; + + public ContainerBufferChest(IInventory inv, TileBufferChest td) { + this.tileBuffer = td; + + for(int i = 0; i < 5; ++i) { + for(int j = 0; j < 4; ++j) { + this.addSlotToContainer(new Slot(td, j + i * 4, 44 + i * 18, 18 + j * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 162)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileBuffer.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 20) { + if (!this.mergeItemStack(itemstack1, 20, 56, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 20, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerChargingBench.java b/src/main/java/com/eloraam/redpower/machine/ContainerChargingBench.java new file mode 100644 index 0000000..2896cda --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerChargingBench.java @@ -0,0 +1,102 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerChargingBench extends Container { + private TileChargingBench tileCB; + public int charge; + public int storage; + + public ContainerChargingBench(IInventory inv, TileChargingBench tf) { + this.tileCB = tf; + + for(int i = 0; i < 4; ++i) { + for(int j = 0; j < 4; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 4, 80 + j * 18, 18 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 162)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileCB.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 16) { + if (!this.mergeItemStack(itemstack1, 16, 52, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 16, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(int i = 0; i < super.crafters.size(); ++i) { + ICrafting ic = (ICrafting)super.crafters.get(i); + if (this.charge != this.tileCB.cond.Charge) { + ic.sendProgressBarUpdate(this, 0, this.tileCB.cond.Charge); + } + + if (this.storage != this.tileCB.Storage) { + ic.sendProgressBarUpdate(this, 1, this.tileCB.Storage); + } + } + + this.charge = this.tileCB.cond.Charge; + this.storage = this.tileCB.Storage; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileCB.cond.Charge = j; + break; + case 1: + this.tileCB.Storage = j; + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerDeploy.java b/src/main/java/com/eloraam/redpower/machine/ContainerDeploy.java new file mode 100644 index 0000000..50aa754 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerDeploy.java @@ -0,0 +1,70 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerDeploy extends Container { + private TileDeploy tileDeploy; + + public ContainerDeploy(IInventory inv, TileDeploy td) { + this.tileDeploy = td; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(td, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileDeploy.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerEject.java b/src/main/java/com/eloraam/redpower/machine/ContainerEject.java new file mode 100644 index 0000000..c769db8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerEject.java @@ -0,0 +1,70 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerEject extends Container { + private TileEjectBase tileEject; + + public ContainerEject(IInventory inv, TileEjectBase td) { + this.tileEject = td; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(td, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileEject.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerFilter.java b/src/main/java/com/eloraam/redpower/machine/ContainerFilter.java new file mode 100644 index 0000000..cfcf2f8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerFilter.java @@ -0,0 +1,108 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerFilter extends Container implements IHandleGuiEvent { + private TileFilter tileFilter; + public int color = 0; + + public ContainerFilter(IInventory inv, TileFilter tf) { + this.tileFilter = tf; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileFilter.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(int i = 0; i < super.crafters.size(); ++i) { + ICrafting ic = (ICrafting)super.crafters.get(i); + if (this.color != this.tileFilter.color) { + ic.sendProgressBarUpdate(this, 0, this.tileFilter.color); + } + } + + this.color = this.tileFilter.color; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileFilter.color = (byte)j; + } + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + if (message.eventId != 1) { + return; + } + + this.tileFilter.color = message.parameters[0]; + this.tileFilter.markDirty(); + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerItemDetect.java b/src/main/java/com/eloraam/redpower/machine/ContainerItemDetect.java new file mode 100644 index 0000000..ed2ef8c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerItemDetect.java @@ -0,0 +1,109 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerItemDetect extends Container implements IHandleGuiEvent { + private TileItemDetect tileDetect; + byte mode; + + public ContainerItemDetect(IInventory inv, TileItemDetect tid) { + this.tileDetect = tid; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(tid, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileDetect.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.mode != this.tileDetect.mode) { + ic.sendProgressBarUpdate(this, 0, this.tileDetect.mode); + } + } + + this.mode = this.tileDetect.mode; + } + + public void updateProgressBar(int i, int j) { + if (i == 0) { + this.tileDetect.mode = (byte)j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + if (message.eventId == 1) { + try { + this.tileDetect.mode = message.parameters[0]; + this.tileDetect.markDirty(); + } catch (Throwable var3) { + } + + this.detectAndSendChanges(); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerManager.java b/src/main/java/com/eloraam/redpower/machine/ContainerManager.java new file mode 100644 index 0000000..42a249b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerManager.java @@ -0,0 +1,153 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerManager extends Container implements IHandleGuiEvent { + public int charge = 0; + public int flow = 0; + public int color = 0; + public int mode = 0; + public int priority = 0; + private TileManager tileManager; + + public ContainerManager(IInventory inv, TileManager tf) { + this.tileManager = tf; + + for(int i = 0; i < 4; ++i) { + for(int j = 0; j < 6; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 6, 44 + 18 * j, 18 + 18 * i)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 104 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 162)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileManager.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 24) { + if (!this.mergeItemStack(itemstack1, 24, 60, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 24, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.charge != this.tileManager.cond.Charge) { + ic.sendProgressBarUpdate(this, 0, this.tileManager.cond.Charge); + } + + if (this.flow != this.tileManager.cond.Flow) { + ic.sendProgressBarUpdate(this, 1, this.tileManager.cond.Flow); + } + + if (this.mode != this.tileManager.mode) { + ic.sendProgressBarUpdate(this, 2, this.tileManager.mode); + } + + if (this.color != this.tileManager.color) { + ic.sendProgressBarUpdate(this, 3, this.tileManager.color); + } + + if (this.priority != this.tileManager.priority) { + ic.sendProgressBarUpdate(this, 4, this.tileManager.priority); + } + } + + this.charge = this.tileManager.cond.Charge; + this.flow = this.tileManager.cond.Flow; + this.mode = this.tileManager.mode; + this.color = this.tileManager.color; + this.priority = this.tileManager.priority; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileManager.cond.Charge = j; + break; + case 1: + this.tileManager.cond.Flow = j; + break; + case 2: + this.tileManager.mode = (byte)j; + break; + case 3: + this.tileManager.color = (byte)j; + break; + case 4: + this.tileManager.priority = j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileManager.mode = message.parameters[0]; + this.tileManager.markDirty(); + break; + case 2: + this.tileManager.color = message.parameters[0]; + this.tileManager.markDirty(); + break; + case 3: + this.tileManager.priority = message.parameters[0]; + this.tileManager.markDirty(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerRegulator.java b/src/main/java/com/eloraam/redpower/machine/ContainerRegulator.java new file mode 100644 index 0000000..31bb9d1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerRegulator.java @@ -0,0 +1,124 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerRegulator extends Container implements IHandleGuiEvent { + private TileRegulator tileRegulator; + public int color = 0; + public int mode = 0; + + public ContainerRegulator(IInventory inv, TileRegulator tf) { + this.tileRegulator = tf; + + for(int k = 0; k < 3; ++k) { + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 3 + k * 9, 8 + j * 18 + k * 72, 18 + i * 18)); + } + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 26 + j * 18, 86 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 26 + i * 18, 144)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileRegulator.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 27) { + if (!this.mergeItemStack(itemstack1, 27, 63, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 9, 18, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.color != this.tileRegulator.color) { + ic.sendProgressBarUpdate(this, 0, this.tileRegulator.color); + } + + if (this.mode != this.tileRegulator.mode) { + ic.sendProgressBarUpdate(this, 1, this.tileRegulator.mode); + } + } + + this.color = this.tileRegulator.color; + this.mode = this.tileRegulator.mode; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileRegulator.color = (byte)j; + break; + case 1: + this.tileRegulator.mode = (byte)j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileRegulator.color = message.parameters[0]; + this.tileRegulator.markDirty(); + break; + case 2: + this.tileRegulator.mode = message.parameters[0]; + this.tileRegulator.markDirty(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerRetriever.java b/src/main/java/com/eloraam/redpower/machine/ContainerRetriever.java new file mode 100644 index 0000000..515dc3b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerRetriever.java @@ -0,0 +1,149 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerRetriever extends Container implements IHandleGuiEvent { + private TileRetriever tileRetriever; + public int charge = 0; + public int flow = 0; + public int color = 0; + public int select = 0; + public int mode = 0; + + public ContainerRetriever(IInventory inv, TileRetriever tr) { + this.tileRetriever = tr; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new Slot(tr, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileRetriever.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 9) { + if (!this.mergeItemStack(itemstack1, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 9, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.charge != this.tileRetriever.cond.Charge) { + ic.sendProgressBarUpdate(this, 0, this.tileRetriever.cond.Charge); + } + + if (this.flow != this.tileRetriever.cond.Flow) { + ic.sendProgressBarUpdate(this, 1, this.tileRetriever.cond.Flow); + } + + if (this.color != this.tileRetriever.color) { + ic.sendProgressBarUpdate(this, 2, this.tileRetriever.color); + } + + if (this.select != this.tileRetriever.select) { + ic.sendProgressBarUpdate(this, 3, this.tileRetriever.select); + } + + if (this.mode != this.tileRetriever.mode) { + ic.sendProgressBarUpdate(this, 4, this.tileRetriever.mode); + } + } + + this.flow = this.tileRetriever.cond.Flow; + this.charge = this.tileRetriever.cond.Charge; + this.color = this.tileRetriever.color; + this.select = this.tileRetriever.select; + this.mode = this.tileRetriever.mode; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileRetriever.cond.Charge = j; + break; + case 1: + this.tileRetriever.cond.Flow = j; + break; + case 2: + this.tileRetriever.color = (byte)j; + break; + case 3: + this.tileRetriever.select = (byte)j; + break; + case 4: + this.tileRetriever.mode = (byte)j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileRetriever.color = message.parameters[0]; + this.tileRetriever.markDirty(); + break; + case 2: + this.tileRetriever.mode = message.parameters[0]; + this.tileRetriever.markDirty(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerSorter.java b/src/main/java/com/eloraam/redpower/machine/ContainerSorter.java new file mode 100644 index 0000000..2b8ccce --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerSorter.java @@ -0,0 +1,185 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.IHandleGuiEvent; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerSorter extends Container implements IHandleGuiEvent { + public byte[] colors = new byte[8]; + public int column; + public int charge = 0; + public int flow = 0; + public int mode = 0; + public int defcolor = 0; + public int automode = 0; + private TileSorter tileSorter; + + public ContainerSorter(IInventory inv, TileSorter tf) { + this.tileSorter = tf; + + for(int i = 0; i < 5; ++i) { + for(int j = 0; j < 8; ++j) { + this.addSlotToContainer(new Slot(tf, j + i * 8, 26 + 18 * j, 18 + 18 * i)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 140 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 198)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileSorter.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 40) { + if (!this.mergeItemStack(itemstack1, 40, 76, true)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 0, 40, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack)null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(int j = 0; j < super.crafters.size(); ++j) { + ICrafting ic = (ICrafting)super.crafters.get(j); + + for(int j1 = 0; j1 < 8; ++j1) { + if (this.colors[j1] != this.tileSorter.colors[j1]) { + ic.sendProgressBarUpdate(this, j1, this.tileSorter.colors[j1]); + } + } + + if (this.column != this.tileSorter.column) { + ic.sendProgressBarUpdate(this, 8, this.tileSorter.column); + } + + if (this.charge != this.tileSorter.cond.Charge) { + ic.sendProgressBarUpdate(this, 9, this.tileSorter.cond.Charge); + } + + if (this.flow != this.tileSorter.cond.Flow) { + ic.sendProgressBarUpdate(this, 10, this.tileSorter.cond.Flow); + } + + if (this.mode != this.tileSorter.mode) { + ic.sendProgressBarUpdate(this, 11, this.tileSorter.mode); + } + + if (this.defcolor != this.tileSorter.defcolor) { + ic.sendProgressBarUpdate(this, 12, this.tileSorter.defcolor); + } + + if (this.automode != this.tileSorter.automode) { + ic.sendProgressBarUpdate(this, 13, this.tileSorter.automode); + } + } + + for(int j = 0; j < 8; ++j) { + this.colors[j] = this.tileSorter.colors[j]; + } + + this.column = this.tileSorter.column; + this.charge = this.tileSorter.cond.Charge; + this.flow = this.tileSorter.cond.Flow; + this.mode = this.tileSorter.mode; + this.defcolor = this.tileSorter.defcolor; + this.automode = this.tileSorter.automode; + } + + public void updateProgressBar(int i, int j) { + if (i < 8) { + this.tileSorter.colors[i] = (byte)j; + } + + switch(i) { + case 8: + this.tileSorter.column = (byte)j; + break; + case 9: + this.tileSorter.cond.Charge = j; + break; + case 10: + this.tileSorter.cond.Flow = j; + break; + case 11: + this.tileSorter.mode = (byte)j; + break; + case 12: + this.tileSorter.defcolor = (byte)j; + break; + case 13: + this.tileSorter.automode = (byte)j; + } + + } + + @Override + public void handleGuiEvent(PacketGuiEvent.GuiMessageEvent message) { + try { + switch(message.eventId) { + case 1: + this.tileSorter.mode = message.parameters[0]; + this.tileSorter.markDirty(); + break; + case 2: + byte i = message.parameters[0]; + if (i >= 0 && i <= 8) { + this.tileSorter.colors[i] = message.parameters[1]; + this.tileSorter.markDirty(); + } + break; + case 3: + this.tileSorter.defcolor = message.parameters[0]; + this.tileSorter.markDirty(); + break; + case 4: + this.tileSorter.automode = message.parameters[0]; + this.tileSorter.pulses = 0; + this.tileSorter.markDirty(); + } + } catch (Throwable var3) { + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ContainerWindTurbine.java b/src/main/java/com/eloraam/redpower/machine/ContainerWindTurbine.java new file mode 100644 index 0000000..f6f9bc7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ContainerWindTurbine.java @@ -0,0 +1,94 @@ +package com.eloraam.redpower.machine; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerWindTurbine extends Container { + private int windSpeed; + private TileWindTurbine tileWT; + + public ContainerWindTurbine(IInventory inv, TileWindTurbine wt) { + this.tileWT = wt; + this.addSlotToContainer(new Slot(wt, 0, 80, 35)); + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + + } + + public ItemStack slotClick(int a, int b, int c, EntityPlayer player) { + return !this.canInteractWith(player) ? null : super.slotClick(a, b, c, player); + } + + public boolean canInteractWith(EntityPlayer player) { + return this.tileWT.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot)super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 1) { + if (!this.mergeItemStack(itemstack1, 1, 37, true)) { + return null; + } + } else { + Slot sl0 = (Slot)super.inventorySlots.get(0); + ItemStack slst = sl0.getStack(); + if (slst != null && slst.stackSize != 0) { + return null; + } + + sl0.putStack(itemstack1.splitStack(1)); + } + + if (itemstack1.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, itemstack1); + } + + return itemstack; + } + + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + for(ICrafting ic : (List)super.crafters) { + if (this.windSpeed != this.tileWT.windSpeed) { + ic.sendProgressBarUpdate(this, 0, this.tileWT.windSpeed); + } + } + + this.windSpeed = this.tileWT.windSpeed; + } + + public void updateProgressBar(int i, int j) { + switch(i) { + case 0: + this.tileWT.windSpeed = j; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiAssemble.java b/src/main/java/com/eloraam/redpower/machine/GuiAssemble.java new file mode 100644 index 0000000..44917f1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiAssemble.java @@ -0,0 +1,114 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiAssemble extends GuiContainer { + private static final ResourceLocation res1 = new ResourceLocation("rpmachine", "textures/gui/assembler.png"); + private static final ResourceLocation res2 = new ResourceLocation("rpmachine", "textures/gui/assembler2.png"); + private TileAssemble assemble; + + public GuiAssemble(InventoryPlayer pli, TileAssemble td) { + super(new ContainerAssemble(pli, td)); + this.assemble = td; + super.ySize = 195; + } + + public GuiAssemble(Container cn) { + super(cn); + super.ySize = 195; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpassemble.name", new Object[0]), 65, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(this.assemble.mode == 0 ? res1 : res2); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + this.drawTexturedModalRect(j + 152, k + 37, 196, 14 * this.assemble.mode, 14, 14); + if (this.assemble.mode == 0) { + this.drawTexturedModalRect(j + 6 + 18 * (this.assemble.select & 7), k + 16 + 18 * (this.assemble.select >> 3), 176, 0, 20, 20); + + for(int i = 1; i < 16; ++i) { + if ((this.assemble.skipSlots & 1 << i) != 0) { + this.drawTexturedModalRect(j + 8 + 18 * (i & 7), k + 18 + 18 * (i >> 3), 176, 20, 16, 16); + } + } + } + + } + + private void sendMode() { + if (!super.mc.theWorld.isRemote) { + this.assemble.updateBlockChange(); + } else { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, this.assemble.mode)); + } + + } + + private void sendSkip() { + if (!super.mc.theWorld.isRemote) { + this.assemble.updateBlockChange(); + } else { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, (byte)this.assemble.skipSlots)); + } + + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x >= 152 && y >= 37 && x <= 166 && y <= 51) { + if (k == 0) { + ++this.assemble.mode; + if (this.assemble.mode > 1) { + this.assemble.mode = 0; + } + } else { + --this.assemble.mode; + if (this.assemble.mode < 0) { + this.assemble.mode = 1; + } + } + + this.sendMode(); + } else { + if (this.assemble.mode == 0 && super.mc.thePlayer.inventory.getItemStack() == null) { + boolean send = false; + + for(int v = 1; v < 16; ++v) { + int x2 = 8 + 18 * (v & 7); + int y2 = 18 + 18 * (v >> 3); + if (x >= x2 && x < x2 + 16 && y >= y2 && y < y2 + 16) { + if (super.inventorySlots.getSlot(v).getHasStack()) { + break; + } + + this.assemble.skipSlots ^= 1 << v; + send = true; + } + } + + if (send) { + this.sendSkip(); + return; + } + } + + super.mouseClicked(i, j, k); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiBatteryBox.java b/src/main/java/com/eloraam/redpower/machine/GuiBatteryBox.java new file mode 100644 index 0000000..1bb1df9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiBatteryBox.java @@ -0,0 +1,58 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBatteryBox extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/batbox.png"); + private TileBatteryBox tileBB; + + public GuiBatteryBox(InventoryPlayer pli, TileBatteryBox bb) { + super(new ContainerBatteryBox(pli, bb)); + this.tileBB = bb; + super.ySize = 170; + } + + public GuiBatteryBox(Container cn) { + super(cn); + super.ySize = 170; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpbatbox.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int mx = this.tileBB.getMaxStorage(); + int s = this.tileBB.getChargeScaled(48); + this.drawTexturedModalRect(j + 71, k + 73 - s, 176, 48 - s, 5, s); + if (this.tileBB.Charge > 600) { + this.drawTexturedModalRect(j + 72, k + 17, 197, 16, 3, 6); + } + + if (this.tileBB.Charge > 900 && this.tileBB.Storage < mx) { + this.drawTexturedModalRect(j + 82, k + 37, 197, 0, 10, 8); + } + + if (this.tileBB.Charge < 800 && this.tileBB.Storage > 0) { + this.drawTexturedModalRect(j + 82, k + 55, 197, 8, 10, 8); + } + + s = this.tileBB.getStorageScaled(48); + this.drawTexturedModalRect(j + 98, k + 73 - s, 181, 48 - s, 16, s); + if (this.tileBB.Storage == mx) { + this.drawTexturedModalRect(j + 103, k + 17, 200, 16, 6, 6); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiBlueAlloyFurnace.java b/src/main/java/com/eloraam/redpower/machine/GuiBlueAlloyFurnace.java new file mode 100644 index 0000000..0e5a7a3 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiBlueAlloyFurnace.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBlueAlloyFurnace extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/btafurnace.png"); + private TileBlueAlloyFurnace furnace; + + public GuiBlueAlloyFurnace(InventoryPlayer pli, TileBlueAlloyFurnace td) { + super(new ContainerBlueAlloyFurnace(pli, td)); + this.furnace = td; + } + + public GuiBlueAlloyFurnace(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpbafurnace.name", new Object[0]), 38, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int s = this.furnace.getCookScaled(24); + this.drawTexturedModalRect(j + 107, k + 34, 176, 0, s + 1, 16); + s = this.furnace.cond.getChargeScaled(48); + this.drawTexturedModalRect(j + 19, k + 69 - s, 176, 65 - s, 5, s); + s = this.furnace.cond.getFlowScaled(48); + this.drawTexturedModalRect(j + 26, k + 69 - s, 176, 65 - s, 5, s); + if (this.furnace.cond.Charge > 600) { + this.drawTexturedModalRect(j + 20, k + 13, 181, 17, 3, 6); + } + + if (this.furnace.cond.Flow == -1) { + this.drawTexturedModalRect(j + 27, k + 13, 184, 17, 3, 6); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiBlueFurnace.java b/src/main/java/com/eloraam/redpower/machine/GuiBlueFurnace.java new file mode 100644 index 0000000..a445410 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiBlueFurnace.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBlueFurnace extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/btfurnace.png"); + private TileBlueFurnace furnace; + + public GuiBlueFurnace(InventoryPlayer pli, TileBlueFurnace td) { + super(new ContainerBlueFurnace(pli, td)); + this.furnace = td; + } + + public GuiBlueFurnace(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpbfurnace.name", new Object[0]), 48, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int s = this.furnace.getCookScaled(24); + this.drawTexturedModalRect(j + 89, k + 34, 176, 0, s + 1, 16); + s = this.furnace.cond.getChargeScaled(48); + this.drawTexturedModalRect(j + 25, k + 69 - s, 176, 65 - s, 5, s); + s = this.furnace.cond.getFlowScaled(48); + this.drawTexturedModalRect(j + 32, k + 69 - s, 176, 65 - s, 5, s); + if (this.furnace.cond.Charge > 600) { + this.drawTexturedModalRect(j + 26, k + 13, 181, 17, 3, 6); + } + + if (this.furnace.cond.Flow == -1) { + this.drawTexturedModalRect(j + 33, k + 13, 184, 17, 3, 6); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiBufferChest.java b/src/main/java/com/eloraam/redpower/machine/GuiBufferChest.java new file mode 100644 index 0000000..9ae5621 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiBufferChest.java @@ -0,0 +1,35 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiBufferChest extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/buffer.png"); + + public GuiBufferChest(InventoryPlayer pli, TileBufferChest td) { + super(new ContainerBufferChest(pli, td)); + super.ySize = 186; + } + + public GuiBufferChest(Container cn) { + super(cn); + super.ySize = 186; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpbuffer.name", new Object[0]), 70, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiChargingBench.java b/src/main/java/com/eloraam/redpower/machine/GuiChargingBench.java new file mode 100644 index 0000000..a9649e0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiChargingBench.java @@ -0,0 +1,54 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiChargingBench extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/charging.png"); + private TileChargingBench tileCB; + + public GuiChargingBench(InventoryPlayer pli, TileChargingBench cb) { + super(new ContainerChargingBench(pli, cb)); + this.tileCB = cb; + super.ySize = 186; + } + + public GuiChargingBench(Container cn) { + super(cn); + super.ySize = 186; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpcharge.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int mx = this.tileCB.getMaxStorage(); + int s = this.tileCB.getChargeScaled(48); + this.drawTexturedModalRect(j + 21, k + 78 - s, 176, 48 - s, 5, s); + if (this.tileCB.cond.Charge > 600) { + this.drawTexturedModalRect(j + 22, k + 22, 197, 8, 3, 6); + } + + if (this.tileCB.cond.Charge > 600 && this.tileCB.Storage < mx) { + this.drawTexturedModalRect(j + 32, k + 51, 197, 0, 10, 8); + } + + s = this.tileCB.getStorageScaled(48); + this.drawTexturedModalRect(j + 48, k + 78 - s, 181, 48 - s, 16, s); + if (this.tileCB.Storage == mx) { + this.drawTexturedModalRect(j + 53, k + 22, 200, 8, 6, 6); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiDeploy.java b/src/main/java/com/eloraam/redpower/machine/GuiDeploy.java new file mode 100644 index 0000000..0068c32 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiDeploy.java @@ -0,0 +1,34 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiDeploy extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("textures/gui/container/dispenser.png"); + private int inventoryRows = 3; + + public GuiDeploy(InventoryPlayer pli, TileDeploy td) { + super(new ContainerDeploy(pli, td)); + } + + public GuiDeploy(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpdeploy.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiEject.java b/src/main/java/com/eloraam/redpower/machine/GuiEject.java new file mode 100644 index 0000000..9b26ff6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiEject.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiEject extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("textures/gui/container/dispenser.png"); + private TileEjectBase tileEject; + private int inventoryRows = 3; + + public GuiEject(InventoryPlayer pli, TileEjectBase td) { + super(new ContainerEject(pli, td)); + this.tileEject = td; + } + + public GuiEject(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + super.fontRendererObj.drawString(I18n.format(this.tileEject.getInventoryName(), new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiFilter.java b/src/main/java/com/eloraam/redpower/machine/GuiFilter.java new file mode 100644 index 0000000..ecddd40 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiFilter.java @@ -0,0 +1,100 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiFilter extends GuiContainer { + static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/filter9.png"); + private TileFilter tileFilter; + + public GuiFilter(InventoryPlayer pli, TileFilter filter) { + super(new ContainerFilter(pli, filter)); + this.tileFilter = filter; + } + + public GuiFilter(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format(this.tileFilter.getInventoryName(), new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + if (this.tileFilter.color > 0) { + this.rect(j + 122, k + 59, 4, 4, paintColors[this.tileFilter.color - 1]); + } else { + this.drawTexturedModalRect(j + 122, k + 59, 176, 0, 4, 4); + } + + } + + private void sendColor() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, this.tileFilter.color)); + } + + } + + private void changeColor(boolean incdec) { + if (incdec) { + ++this.tileFilter.color; + if (this.tileFilter.color > 16) { + this.tileFilter.color = 0; + } + } else { + --this.tileFilter.color; + if (this.tileFilter.color < 0) { + this.tileFilter.color = 16; + } + } + + this.sendColor(); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (y >= 55 && y <= 66 && x >= 118 && x <= 129) { + this.changeColor(k == 0); + } else { + super.mouseClicked(i, j, k); + } + + } + + private void rect(int x, int y, int w, int h, int c) { + w += x; + h += y; + float r = (float)(c >> 16 & 0xFF) / 255.0F; + float g = (float)(c >> 8 & 0xFF) / 255.0F; + float b = (float)(c & 0xFF) / 255.0F; + Tessellator tess = Tessellator.instance; + GL11.glDisable(3553); + GL11.glColor4f(r, g, b, 1.0F); + tess.startDrawingQuads(); + tess.addVertex((double)x, (double)h, 0.0); + tess.addVertex((double)w, (double)h, 0.0); + tess.addVertex((double)w, (double)y, 0.0); + tess.addVertex((double)x, (double)y, 0.0); + tess.draw(); + GL11.glEnable(3553); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiItemDetect.java b/src/main/java/com/eloraam/redpower/machine/GuiItemDetect.java new file mode 100644 index 0000000..2f4ec2a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiItemDetect.java @@ -0,0 +1,66 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiItemDetect extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/itemdet.png"); + private TileItemDetect tileDetect; + + public GuiItemDetect(InventoryPlayer pli, TileItemDetect filter) { + super(new ContainerItemDetect(pli, filter)); + this.tileDetect = filter; + } + + public GuiItemDetect(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpitemdet.name", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + this.drawTexturedModalRect(j + 117, k + 54, 176, 14 * this.tileDetect.mode, 14, 14); + } + + private void sendButton(byte n) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, n)); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x >= 117 && y >= 54 && x <= 131 && y <= 68) { + if (k == 0) { + ++this.tileDetect.mode; + if (this.tileDetect.mode > 2) { + this.tileDetect.mode = 0; + } + } else { + --this.tileDetect.mode; + if (this.tileDetect.mode < 0) { + this.tileDetect.mode = 2; + } + } + + if (super.mc.theWorld.isRemote) { + this.sendButton(this.tileDetect.mode); + } + } + + super.mouseClicked(i, j, k); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiManager.java b/src/main/java/com/eloraam/redpower/machine/GuiManager.java new file mode 100644 index 0000000..fb434f9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiManager.java @@ -0,0 +1,164 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiManager extends GuiContainer { + static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/manager.png"); + private TileManager manager; + + public GuiManager(InventoryPlayer pli, TileManager td) { + super(new ContainerManager(pli, td)); + this.manager = td; + super.ySize = 186; + } + + public GuiManager(Container cn) { + super(cn); + super.ySize = 186; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpmanager.name", new Object[0]), 68, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int s = this.manager.cond.getChargeScaled(48); + this.drawTexturedModalRect(j + 17, k + 76 - s, 176, 48 - s, 5, s); + s = this.manager.cond.getFlowScaled(48); + this.drawTexturedModalRect(j + 24, k + 76 - s, 176, 48 - s, 5, s); + if (this.manager.cond.Charge > 600) { + this.drawTexturedModalRect(j + 18, k + 20, 181, 0, 3, 6); + } + + if (this.manager.cond.Flow == -1) { + this.drawTexturedModalRect(j + 25, k + 20, 184, 0, 3, 6); + } + + this.drawTexturedModalRect(j + 153, k + 37, 191, 14 * this.manager.mode, 14, 14); + if (this.manager.color > 0) { + this.rect(j + 158, k + 78, 4, 4, paintColors[this.manager.color - 1]); + } else { + this.drawTexturedModalRect(j + 158, k + 78, 187, 0, 4, 4); + } + + String nm = String.format("%d", this.manager.priority); + super.fontRendererObj.drawStringWithShadow(nm, j + 160 - super.fontRendererObj.getStringWidth(nm) / 2, k + 58, 16777215); + } + + private void sendMode() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, this.manager.mode)); + } + + } + + private void sendColor() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, this.manager.color)); + } + + } + + private void sendPriority() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(3, super.inventorySlots.windowId, (byte)this.manager.priority)); + } + + } + + protected void changeColor(boolean incdec) { + if (incdec) { + ++this.manager.color; + if (this.manager.color > 16) { + this.manager.color = 0; + } + } else { + --this.manager.color; + if (this.manager.color < 0) { + this.manager.color = 16; + } + } + + this.sendColor(); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x >= 154 && x <= 165) { + if (y >= 38 && y <= 50) { + if (k == 0) { + ++this.manager.mode; + if (this.manager.mode > 1) { + this.manager.mode = 0; + } + } else { + --this.manager.mode; + if (this.manager.mode < 0) { + this.manager.mode = 1; + } + } + + this.sendMode(); + } + + if (y >= 56 && y <= 68) { + if (k == 0) { + ++this.manager.priority; + if (this.manager.priority > 9) { + this.manager.priority = 0; + } + } else { + --this.manager.priority; + if (this.manager.priority < 0) { + this.manager.priority = 9; + } + } + + this.sendPriority(); + } + + if (y >= 74 && y <= 86) { + this.changeColor(k == 0); + } + } + + super.mouseClicked(i, j, k); + } + + private void rect(int x, int y, int w, int h, int c) { + w += x; + h += y; + float r = (float)(c >> 16 & 0xFF) / 255.0F; + float g = (float)(c >> 8 & 0xFF) / 255.0F; + float b = (float)(c & 0xFF) / 255.0F; + Tessellator tess = Tessellator.instance; + GL11.glDisable(3553); + GL11.glColor4f(r, g, b, 1.0F); + tess.startDrawingQuads(); + tess.addVertex((double)x, (double)h, 0.0); + tess.addVertex((double)w, (double)h, 0.0); + tess.addVertex((double)w, (double)y, 0.0); + tess.addVertex((double)x, (double)y, 0.0); + tess.draw(); + GL11.glEnable(3553); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiRegulator.java b/src/main/java/com/eloraam/redpower/machine/GuiRegulator.java new file mode 100644 index 0000000..240ad82 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiRegulator.java @@ -0,0 +1,130 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiRegulator extends GuiContainer { + static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/regulator.png"); + private TileRegulator tileRegulator; + + public GuiRegulator(InventoryPlayer pli, TileRegulator reg) { + super(new ContainerRegulator(pli, reg)); + this.tileRegulator = reg; + super.xSize = 211; + super.ySize = 167; + } + + public GuiRegulator(Container cn) { + super(cn); + super.xSize = 211; + super.ySize = 167; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("this.tileRegulator.getInventoryName()", new Object[0]), 79, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 25, super.ySize - 96 + 3, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + if (this.tileRegulator.color > 0) { + this.rect(j + 140, k + 60, 4, 4, paintColors[this.tileRegulator.color - 1]); + } else { + this.drawTexturedModalRect(j + 140, k + 60, 212, 0, 4, 4); + } + + this.drawTexturedModalRect(j + 135, k + 19, 216, 14 * this.tileRegulator.mode, 14, 14); + } + + private void sendColor() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, (byte)this.tileRegulator.color)); + } + + } + + private void sendMode() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, this.tileRegulator.mode)); + } + + } + + protected void changeColor(boolean incdec) { + if (incdec) { + ++this.tileRegulator.color; + if (this.tileRegulator.color > 16) { + this.tileRegulator.color = 0; + } + } else { + --this.tileRegulator.color; + if (this.tileRegulator.color < 0) { + this.tileRegulator.color = 16; + } + } + + this.sendColor(); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x >= 136 && x <= 147) { + if (y >= 56 && y <= 67) { + this.changeColor(k == 0); + return; + } + + if (y >= 19 && y <= 32) { + if (k == 0) { + ++this.tileRegulator.mode; + if (this.tileRegulator.mode > 1) { + this.tileRegulator.mode = 0; + } + } else { + --this.tileRegulator.mode; + if (this.tileRegulator.mode < 0) { + this.tileRegulator.mode = 1; + } + } + + this.sendMode(); + } + } + + super.mouseClicked(i, j, k); + } + + private void rect(int x, int y, int w, int h, int c) { + w += x; + h += y; + float r = (float)(c >> 16 & 0xFF) / 255.0F; + float g = (float)(c >> 8 & 0xFF) / 255.0F; + float b = (float)(c & 0xFF) / 255.0F; + Tessellator tess = Tessellator.instance; + GL11.glDisable(3553); + GL11.glColor4f(r, g, b, 1.0F); + tess.startDrawingQuads(); + tess.addVertex((double)x, (double)h, 0.0); + tess.addVertex((double)w, (double)h, 0.0); + tess.addVertex((double)w, (double)y, 0.0); + tess.addVertex((double)x, (double)y, 0.0); + tess.draw(); + GL11.glEnable(3553); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiRetriever.java b/src/main/java/com/eloraam/redpower/machine/GuiRetriever.java new file mode 100644 index 0000000..94e700a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiRetriever.java @@ -0,0 +1,142 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiRetriever extends GuiContainer { + static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/retriever.png"); + private TileRetriever tileRetriever; + + public GuiRetriever(InventoryPlayer pli, TileRetriever retr) { + super(new ContainerRetriever(pli, retr)); + this.tileRetriever = retr; + } + + public GuiRetriever(Container cn) { + super(cn); + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpretriever.name", new Object[0]), 65, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int s = this.tileRetriever.cond.getChargeScaled(48); + this.drawTexturedModalRect(j + 10, k + 69 - s, 176, 48 - s, 5, s); + s = this.tileRetriever.cond.getFlowScaled(48); + this.drawTexturedModalRect(j + 17, k + 69 - s, 176, 48 - s, 5, s); + if (this.tileRetriever.cond.Charge > 600) { + this.drawTexturedModalRect(j + 11, k + 13, 181, 0, 3, 6); + } + + if (this.tileRetriever.cond.Flow == -1) { + this.drawTexturedModalRect(j + 18, k + 13, 184, 0, 3, 6); + } + + if (this.tileRetriever.color > 0) { + this.rect(j + 122, k + 59, 4, 4, paintColors[this.tileRetriever.color - 1]); + } else { + this.drawTexturedModalRect(j + 122, k + 59, 187, 0, 4, 4); + } + + this.drawTexturedModalRect(j + 45, k + 54, 211, 14 * this.tileRetriever.mode, 14, 14); + if (this.tileRetriever.mode == 0) { + this.drawTexturedModalRect(j + 60 + 18 * (this.tileRetriever.select % 3), k + 15 + 18 * (this.tileRetriever.select / 3), 191, 0, 20, 20); + } + + } + + private void sendColor() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, this.tileRetriever.color)); + } + + } + + private void sendMode() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, this.tileRetriever.mode)); + } + + } + + protected void changeColor(boolean incdec) { + if (incdec) { + ++this.tileRetriever.color; + if (this.tileRetriever.color > 16) { + this.tileRetriever.color = 0; + } + } else { + --this.tileRetriever.color; + if (this.tileRetriever.color < 0) { + this.tileRetriever.color = 16; + } + } + + this.sendColor(); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (y >= 55 && y <= 66) { + if (x >= 118 && x <= 129) { + this.changeColor(k == 0); + return; + } + + if (x >= 45 && x <= 58) { + if (k == 0) { + ++this.tileRetriever.mode; + if (this.tileRetriever.mode > 1) { + this.tileRetriever.mode = 0; + } + } else { + --this.tileRetriever.mode; + if (this.tileRetriever.mode < 0) { + this.tileRetriever.mode = 1; + } + } + + this.sendMode(); + } + } + + super.mouseClicked(i, j, k); + } + + private void rect(int x, int y, int w, int h, int c) { + w += x; + h += y; + float r = (float)(c >> 16 & 0xFF) / 255.0F; + float g = (float)(c >> 8 & 0xFF) / 255.0F; + float b = (float)(c & 0xFF) / 255.0F; + Tessellator tess = Tessellator.instance; + GL11.glDisable(3553); + GL11.glColor4f(r, g, b, 1.0F); + tess.startDrawingQuads(); + tess.addVertex((double)x, (double)h, 0.0); + tess.addVertex((double)w, (double)h, 0.0); + tess.addVertex((double)w, (double)y, 0.0); + tess.addVertex((double)x, (double)y, 0.0); + tess.draw(); + GL11.glEnable(3553); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiSorter.java b/src/main/java/com/eloraam/redpower/machine/GuiSorter.java new file mode 100644 index 0000000..4c4deda --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiSorter.java @@ -0,0 +1,211 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerCore; +import com.eloraam.redpower.core.PacketGuiEvent; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiSorter extends GuiContainer { + static int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/sortmachine.png"); + private TileSorter sorter; + + public GuiSorter(InventoryPlayer pli, TileSorter td) { + super(new ContainerSorter(pli, td)); + this.sorter = td; + super.ySize = 222; + } + + public GuiSorter(Container cn) { + super(cn); + super.ySize = 222; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("tile.rpsorter.name", new Object[0]), 50, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + if (this.sorter.mode < 2) { + this.drawTexturedModalRect(j + 24 + 18 * this.sorter.column, k + 16, 176, 0, 20, 92); + } + + for(int s = 0; s < 8; ++s) { + if (this.sorter.colors[s] > 0) { + this.rect(j + 32 + s * 18, k + 114, 4, 4, paintColors[this.sorter.colors[s] - 1]); + } else { + this.drawTexturedModalRect(j + 32 + s * 18, k + 114, 187, 92, 4, 4); + } + } + + int var7 = this.sorter.cond.getChargeScaled(48); + this.drawTexturedModalRect(j + 8, k + 68 - var7, 176, 140 - var7, 5, var7); + var7 = this.sorter.cond.getFlowScaled(48); + this.drawTexturedModalRect(j + 15, k + 68 - var7, 176, 140 - var7, 5, var7); + if (this.sorter.cond.Charge > 600) { + this.drawTexturedModalRect(j + 9, k + 12, 181, 92, 3, 6); + } + + if (this.sorter.cond.Flow == -1) { + this.drawTexturedModalRect(j + 16, k + 12, 184, 92, 3, 6); + } + + this.drawTexturedModalRect(j + 7, k + 73, 210, 14 * this.sorter.automode, 14, 14); + this.drawTexturedModalRect(j + 7, k + 91, 196, 14 * this.sorter.mode, 14, 14); + if (this.sorter.mode == 4 || this.sorter.mode == 6) { + this.drawTexturedModalRect(j + 7, k + 109, 27, 109, 14, 14); + if (this.sorter.defcolor > 0) { + this.rect(j + 12, k + 114, 4, 4, paintColors[this.sorter.defcolor - 1]); + } else { + this.drawTexturedModalRect(j + 12, k + 114, 187, 92, 4, 4); + } + } + + } + + private void sendMode() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(1, super.inventorySlots.windowId, this.sorter.mode)); + } + + } + + private void sendAutoMode() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(4, super.inventorySlots.windowId, this.sorter.automode)); + } + + } + + private void sendColor(int n) { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(2, super.inventorySlots.windowId, (byte)n, this.sorter.colors[n])); + } + + } + + private void sendDefColor() { + if (super.mc.theWorld.isRemote) { + RedPowerCore.sendPacketToServer(new PacketGuiEvent.GuiMessageEvent(3, super.inventorySlots.windowId, this.sorter.defcolor)); + } + + } + + protected void changeColor(int n, boolean incdec) { + if (incdec) { + ++this.sorter.colors[n]; + if (this.sorter.colors[n] > 16) { + this.sorter.colors[n] = 0; + } + } else { + --this.sorter.colors[n]; + if (this.sorter.colors[n] < 0) { + this.sorter.colors[n] = 16; + } + } + + this.sendColor(n); + } + + protected void changeDefColor(boolean incdec) { + if (incdec) { + ++this.sorter.defcolor; + if (this.sorter.defcolor > 16) { + this.sorter.defcolor = 0; + } + } else { + --this.sorter.defcolor; + if (this.sorter.defcolor < 0) { + this.sorter.defcolor = 16; + } + } + + this.sendDefColor(); + } + + protected void mouseClicked(int i, int j, int k) { + int x = i - (super.width - super.xSize) / 2; + int y = j - (super.height - super.ySize) / 2; + if (x <= 21 && x >= 7) { + if (y <= 105 && y >= 91) { + if (k == 0) { + ++this.sorter.mode; + if (this.sorter.mode > 6) { + this.sorter.mode = 0; + } + } else { + --this.sorter.mode; + if (this.sorter.mode < 0) { + this.sorter.mode = 6; + } + } + + this.sendMode(); + } + + if (y <= 87 && y >= 73) { + if (k == 0) { + ++this.sorter.automode; + if (this.sorter.automode > 2) { + this.sorter.automode = 0; + } + } else { + --this.sorter.automode; + if (this.sorter.automode < 0) { + this.sorter.automode = 2; + } + } + + this.sendAutoMode(); + } + } + + if (y >= 110 && y <= 121) { + for(int n = 0; n < 8; ++n) { + if (x >= 28 + n * 18 && x <= 39 + n * 18) { + this.changeColor(n, k == 0); + return; + } + } + + if ((this.sorter.mode == 4 || this.sorter.mode == 6) && x >= 7 && x <= 21) { + this.changeDefColor(k == 0); + return; + } + } + + super.mouseClicked(i, j, k); + } + + private void rect(int x, int y, int w, int h, int c) { + w += x; + h += y; + float r = (float)(c >> 16 & 0xFF) / 255.0F; + float g = (float)(c >> 8 & 0xFF) / 255.0F; + float b = (float)(c & 0xFF) / 255.0F; + Tessellator tess = Tessellator.instance; + GL11.glDisable(3553); + GL11.glColor4f(r, g, b, 1.0F); + tess.startDrawingQuads(); + tess.addVertex((double)x, (double)h, 0.0); + tess.addVertex((double)w, (double)h, 0.0); + tess.addVertex((double)w, (double)y, 0.0); + tess.addVertex((double)x, (double)y, 0.0); + tess.draw(); + GL11.glEnable(3553); + GL11.glColor3f(1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/GuiWindTurbine.java b/src/main/java/com/eloraam/redpower/machine/GuiWindTurbine.java new file mode 100644 index 0000000..7f5d620 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/GuiWindTurbine.java @@ -0,0 +1,38 @@ +package com.eloraam.redpower.machine; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiWindTurbine extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("rpmachine", "textures/gui/windgui.png"); + private TileWindTurbine tileWT; + + public GuiWindTurbine(InventoryPlayer pli, TileWindTurbine wt) { + super(new ContainerWindTurbine(pli, wt)); + this.tileWT = wt; + super.ySize = 167; + } + + public GuiWindTurbine(Container cn) { + super(cn); + super.ySize = 167; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("gui.windturbine", new Object[0]), 60, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 96 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + this.drawTexturedModalRect(j + 55, k + 65 - this.tileWT.getWindScaled(48), 176, 0, 5, 3); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ItemBattery.java b/src/main/java/com/eloraam/redpower/machine/ItemBattery.java new file mode 100644 index 0000000..6565e7a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ItemBattery.java @@ -0,0 +1,44 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.IChargeable; +import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemBattery extends Item { + public ItemBattery() { + this.setMaxStackSize(1); + this.setNoRepair(); + this.setMaxDamage(1500); + this.setCreativeTab(CreativeTabs.tabRedstone); + this.setTextureName("rpmachine:battery"); + this.setUnlocalizedName("btbattery"); + } + + public ItemStack onItemRightClick(ItemStack ist, World world, EntityPlayer player) { + for(int i = 0; i < 9; ++i) { + ItemStack i1 = player.inventory.getStackInSlot(i); + if (i1 != null && i1.getItem() instanceof IChargeable && i1.getItemDamage() > 1) { + int d = Math.min(i1.getItemDamage() - 1, ist.getMaxDamage() - ist.getItemDamage()); + d = Math.min(d, 25); + ist.setItemDamage(ist.getItemDamage() + d); + i1.setItemDamage(i1.getItemDamage() - d); + player.inventory.markDirty(); + if (ist.getItemDamage() == ist.getMaxDamage()) { + return new ItemStack(RedPowerMachine.itemBatteryEmpty, 1); + } + break; + } + } + + return ist; + } + + public void getSubItems(Item item, CreativeTabs tab, List itemList) { + itemList.add(new ItemStack(this, 1, 1)); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ItemMachinePanel.java b/src/main/java/com/eloraam/redpower/machine/ItemMachinePanel.java new file mode 100644 index 0000000..fb6eba8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ItemMachinePanel.java @@ -0,0 +1,74 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockExtended; +import com.eloraam.redpower.core.ItemExtended; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemMachinePanel extends ItemExtended { + public ItemMachinePanel(Block block) { + super(block); + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + Block bid = world.getBlock(x, y, z); + Block block = Block.getBlockFromItem(this); + if (bid == Blocks.snow) { + side = 1; + } else if (bid != Blocks.vine && bid != Blocks.tallgrass && bid != Blocks.deadbush) { + switch(side) { + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + default: + ++x; + } + } + + if (ist.stackSize == 0) { + return false; + } else if (!player.canPlayerEdit(x, y, z, side, ist)) { + return false; + } else if (y >= world.getHeight() - 1) { + return false; + } else if (!world.canPlaceEntityOnSide(world.getBlock(x, y, z), x, y, z, false, side, player, ist)) { + return false; + } else if (ist.getItemDamage() == 0 && !World.doesBlockHaveSolidTopSurface(world, x, y - 1, z)) { + return false; + } else { + if (world.setBlock(x, y, z, block, this.getMetadata(ist.getItemDamage()), 3)) { + if (world.getBlock(x, y, z) == block) { + BlockExtended bex = (BlockExtended)block; + bex.onBlockPlacedBy(world, x, y, z, side, player, ist); + } + + world.playSoundEffect( + (double)((float)x + 0.5F), + (double)((float)y + 0.5F), + (double)((float)z + 0.5F), + block.stepSound.getStepResourcePath(), + (block.stepSound.getVolume() + 1.0F) / 2.0F, + block.stepSound.getPitch() * 0.8F + ); + --ist.stackSize; + } + + return true; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ItemSonicDriver.java b/src/main/java/com/eloraam/redpower/machine/ItemSonicDriver.java new file mode 100644 index 0000000..513c63a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ItemSonicDriver.java @@ -0,0 +1,32 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.base.ItemScrewdriver; +import com.eloraam.redpower.core.IChargeable; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemSonicDriver extends ItemScrewdriver implements IChargeable { + public ItemSonicDriver() { + this.setMaxDamage(400); + this.setNoRepair(); + } + + @Override + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && ist.getItemDamage() != ist.getMaxDamage() && super.onItemUseFirst(ist, player, world, x, y, z, side, xp, yp, zp); + } + + @Override + public Multimap getAttributeModifiers(ItemStack stack) { + return HashMultimap.create(); + } + + @Override + public boolean hitEntity(ItemStack ist, EntityLivingBase ent, EntityLivingBase hitter) { + return false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ItemVoltmeter.java b/src/main/java/com/eloraam/redpower/machine/ItemVoltmeter.java new file mode 100644 index 0000000..a8eeb2b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ItemVoltmeter.java @@ -0,0 +1,55 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IPipeConnectable; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemVoltmeter extends Item { + public ItemVoltmeter() { + this.setMaxStackSize(1); + this.setCreativeTab(CreativeTabs.tabTools); + this.setTextureName("rpmachine:voltmeter"); + this.setUnlocalizedName("voltmeter"); + } + + private boolean measureBlue(EntityPlayer player, World world, int x, int y, int z, int side) { + IBluePowerConnectable ibc = CoreLib.getTileEntity(world, x, y, z, IBluePowerConnectable.class); + if (ibc == null) { + return false; + } else { + BluePowerConductor bpc = ibc.getBlueConductor(side); + double v = bpc.getVoltage(); + CoreLib.writeChat(player, String.format("Reading %.2fV %.2fA (%.2fW)", v, bpc.Itot, v * bpc.Itot)); + return true; + } + } + + private boolean measurePressure(EntityPlayer player, World world, int x, int y, int z, int side) { + IPipeConnectable ipc = CoreLib.getTileEntity(world, x, y, z, IPipeConnectable.class); + if (ipc == null) { + return false; + } else { + int psi = ipc.getPipePressure(side); + CoreLib.writeChat(player, String.format("Reading %d psi", psi)); + return true; + } + } + + private boolean itemUseShared(ItemStack ist, EntityPlayer player, World world, int i, int j, int k, int l) { + return this.measureBlue(player, world, i, j, k, l) || this.measurePressure(player, world, i, j, k, l); + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/ItemWindmill.java b/src/main/java/com/eloraam/redpower/machine/ItemWindmill.java new file mode 100644 index 0000000..689b189 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/ItemWindmill.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemWindmill extends Item { + public int windmillType; + + public ItemWindmill(int tp) { + this.setTextureName("rpmachine:windTurbine"); + this.setMaxStackSize(1); + this.setMaxDamage(1000); + this.setUnlocalizedName("windTurbineWood"); + this.windmillType = tp; + this.setCreativeTab(CreativeTabs.tabMisc); + } + + @SideOnly(Side.CLIENT) + public void getSubItems(int id, CreativeTabs tab, List list) { + list.add(new ItemStack(this, 1, 0)); + } + + public boolean canFaceDirection(int dir) { + switch(this.windmillType) { + case 1: + return dir == 0; + case 2: + return dir > 1; + default: + return false; + } + } + + public ItemStack getBrokenItem() { + switch(this.windmillType) { + case 1: + return new ItemStack(RedPowerBase.blockMicro, 3, 5905); + case 2: + return new ItemStack(RedPowerBase.blockMicro, 1, 5905); + default: + return null; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/MicroPlacementTube.java b/src/main/java/com/eloraam/redpower/machine/MicroPlacementTube.java new file mode 100644 index 0000000..1e11291 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/MicroPlacementTube.java @@ -0,0 +1,93 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.IMicroPlacement; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class MicroPlacementTube implements IMicroPlacement { + private void blockUsed(World world, WorldCoord wc, ItemStack ist) { + --ist.stackSize; + CoreLib.placeNoise(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + world.markBlockForUpdate(wc.x, wc.y, wc.z); + RedPowerLib.updateIndirectNeighbors(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + } + + private boolean initialPlace(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int l) { + int md = ist.getItemDamage() >> 8; + Block bid = Block.getBlockFromItem(ist.getItem()); + if (!world.canPlaceEntityOnSide(world.getBlock(wc.x, wc.y, wc.z), wc.x, wc.y, wc.z, false, l, player, ist)) { + return false; + } else if (!world.setBlock(wc.x, wc.y, wc.z, bid, md, 3)) { + return true; + } else { + this.blockUsed(world, wc, ist); + return true; + } + } + + @Override + public boolean onPlaceMicro(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int size) { + wc.step(size); + Block bid = world.getBlock(wc.x, wc.y, wc.z); + if (bid != Block.getBlockFromItem(ist.getItem())) { + return this.initialPlace(ist, player, world, wc, size); + } else { + TileCovered tc = CoreLib.getTileEntity(world, wc, TileCovered.class); + if (tc == null) { + return false; + } else { + int eid = tc.getExtendedID(); + if (eid != 7 && eid != 8 && eid != 9 && eid != 10 && eid != 11) { + if (!CoverLib.tryMakeCompatible(world, wc, Block.getBlockFromItem(ist.getItem()), ist.getItemDamage())) { + return false; + } else { + this.blockUsed(world, wc, ist); + return true; + } + } else { + return false; + } + } + } + } + + @Override + public String getMicroName(int hb, int lb) { + return hb == 7 + ? "tile.rppipe" + : (hb == 8 ? "tile.rptube" : (hb == 9 ? "tile.rprstube" : (hb == 10 ? "tile.rprtube" : (hb == 11 ? "tile.rpmtube" : null)))); + } + + @Override + public void addCreativeItems(int hb, CreativeTabs tab, List items) { + if (tab == CreativeExtraTabs.tabMachine || tab == CreativeTabs.tabAllSearch) { + switch(hb) { + case 7: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 1792)); + break; + case 8: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 2048)); + break; + case 9: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 2304)); + break; + case 10: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 2560)); + break; + case 11: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 2816)); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderAccel.java b/src/main/java/com/eloraam/redpower/machine/RenderAccel.java new file mode 100644 index 0000000..cd9b49b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderAccel.java @@ -0,0 +1,152 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderAccel extends RenderCustomBlock { + private RenderModel model = RenderModel.loadModel("rpmachine:models/accel.obj"); + private ResourceLocation modelRes = new ResourceLocation("rpmachine", "models/machine1.png"); + private RenderContext context = new RenderContext(); + private EntityItem item = new EntityItem((World)null); + private int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + + public RenderAccel(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileAccel accel = (TileAccel)tile; + World world = accel.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(accel.Rotation, 0); + this.context.readGlobalLights(world, accel.xCoord, accel.yCoord, accel.zCoord); + if (accel.Charged) { + this.context.setBrightness(15728880); + } else { + this.context.setBrightness(this.getMixedBrightness(accel)); + } + + this.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + this.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, 1 + (accel.Charged ? 1 : 0)); + if (accel.Charged) { + this.context.setBrightness(this.getMixedBrightness(accel)); + } + + accel.recache(); + if ((accel.conCache & 1) > 0) { + this.context.renderModelGroup(2, 2); + } + + if ((accel.conCache & 2) > 0) { + this.context.renderModelGroup(2, 1); + } + + if ((accel.conCache & 4) > 0) { + this.context.renderModelGroup(3, 2); + } + + if ((accel.conCache & 8) > 0) { + this.context.renderModelGroup(3, 1); + } + + tess.draw(); + this.item.worldObj = world; + this.item.setPosition((double)accel.xCoord + 0.5, (double)accel.yCoord + 0.5, (double)accel.zCoord + 0.5); + RenderItem renderitem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + this.item.age = 0; + this.item.hoverStart = 0.0F; + WorldCoord offset = new WorldCoord(0, 0, 0); + TubeFlow flow = accel.getTubeFlow(); + int lv = accel.getWorldObj().getLightBrightnessForSkyBlocks(accel.xCoord, accel.yCoord, accel.zCoord, 0); + + for(TubeItem item : flow.contents) { + this.item.setEntityItemStack(item.item); + offset.x = 0; + offset.y = 0; + offset.z = 0; + offset.step(item.side); + double d = (double)item.progress / 128.0 * 0.5; + if (!item.scheduled) { + d = 0.5 - d; + } + + double yo = 0.0; + if (Item.getIdFromItem(item.item.getItem()) >= 256) { + yo += 0.1; + } + + renderitem.doRender( + this.item, + x + 0.5 + (double)offset.x * d, + y + 0.5 - (double)this.item.yOffset - yo + (double)offset.y * d, + z + 0.5 + (double)offset.z * d, + 0.0F, + 0.0F + ); + if (item.color > 0) { + this.context.bindBlockTexture(); + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.setDefaults(); + tess.setBrightness(lv); + this.context.setPos(x + (double)offset.x * d, y + (double)offset.y * d, z + (double)offset.z * d); + this.context.setTintHex(this.paintColors[item.color - 1]); + this.context.setIcon(RedPowerMachine.tubeItemOverlay); + this.context.renderBox(63, 0.26F, 0.26F, 0.26F, 0.74F, 0.74F, 0.74F); + tess.draw(); + } + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.setOrientation(2, 0); + this.context.bindTexture(this.modelRes); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, 1); + this.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderBatteryBox.java b/src/main/java/com/eloraam/redpower/machine/RenderBatteryBox.java new file mode 100644 index 0000000..1a047c9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderBatteryBox.java @@ -0,0 +1,69 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBatteryBox extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderBatteryBox(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBatteryBox battery = (TileBatteryBox)tile; + World world = tile.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, tile.xCoord, tile.yCoord, tile.zCoord); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + IIcon side = RedPowerMachine.batterySide[battery.getStorageForRender()]; + this.context.setIcon(RedPowerMachine.electronicsBottom, RedPowerMachine.batteryTop, side, side, side, side); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + short bat = 0; + if (item.stackTagCompound != null) { + bat = item.stackTagCompound.getShort("batLevel"); + } + + IIcon side = RedPowerMachine.batterySide[bat * 8 / 6000]; + this.context.setIcon(RedPowerMachine.electronicsBottom, RedPowerMachine.batteryTop, side, side, side, side); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderBlueAlloyFurnace.java b/src/main/java/com/eloraam/redpower/machine/RenderBlueAlloyFurnace.java new file mode 100644 index 0000000..e99bdfe --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderBlueAlloyFurnace.java @@ -0,0 +1,79 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBlueAlloyFurnace extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderBlueAlloyFurnace(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBlueAlloyFurnace blueAlloyFurnace = (TileBlueAlloyFurnace)tile; + World world = blueAlloyFurnace.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, blueAlloyFurnace.xCoord, blueAlloyFurnace.yCoord, blueAlloyFurnace.zCoord); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.btAlloyFurnaceTop, + blueAlloyFurnace.Active ? RedPowerMachine.btAlloyFurnaceFrontOn : RedPowerMachine.btAlloyFurnaceFront, + RedPowerMachine.btAlloyFurnaceSide, + RedPowerMachine.btAlloyFurnaceSide, + RedPowerMachine.btAlloyFurnaceSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(blueAlloyFurnace.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.btAlloyFurnaceTop, + RedPowerMachine.btAlloyFurnaceSide, + RedPowerMachine.btAlloyFurnaceSide, + RedPowerMachine.btAlloyFurnaceSide, + RedPowerMachine.btAlloyFurnaceFront + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderBlueFurnace.java b/src/main/java/com/eloraam/redpower/machine/RenderBlueFurnace.java new file mode 100644 index 0000000..3df3991 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderBlueFurnace.java @@ -0,0 +1,79 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBlueFurnace extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderBlueFurnace(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBlueFurnace blueFurnace = (TileBlueFurnace)tile; + World world = blueFurnace.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, blueFurnace.xCoord, blueFurnace.yCoord, blueFurnace.zCoord); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.btFurnaceTop, + blueFurnace.Active ? RedPowerMachine.btFurnaceFrontOn : RedPowerMachine.btFurnaceFront, + RedPowerMachine.btFurnaceSide, + RedPowerMachine.btFurnaceSide, + RedPowerMachine.btFurnaceSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(blueFurnace.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.btFurnaceTop, + RedPowerMachine.btFurnaceSide, + RedPowerMachine.btFurnaceSide, + RedPowerMachine.btFurnaceSide, + RedPowerMachine.btFurnaceFront + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderBreaker.java b/src/main/java/com/eloraam/redpower/machine/RenderBreaker.java new file mode 100644 index 0000000..e8c116e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderBreaker.java @@ -0,0 +1,74 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBreaker extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderBreaker(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBreaker breaker = (TileBreaker)tile; + World world = breaker.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + IIcon front = breaker.Active ? RedPowerMachine.breakerFrontOn : RedPowerMachine.breakerFront; + IIcon side = breaker.Active ? RedPowerMachine.breakerSideOn : RedPowerMachine.breakerSide; + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, breaker.xCoord, breaker.yCoord, breaker.zCoord); + this.context.setIcon(RedPowerMachine.breakerBack, front, side, side, side, side); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.orientTextures(breaker.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.breakerBack, + RedPowerMachine.breakerFront, + RedPowerMachine.breakerSide, + RedPowerMachine.breakerSide, + RedPowerMachine.breakerSide, + RedPowerMachine.breakerSide + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderBufferChest.java b/src/main/java/com/eloraam/redpower/machine/RenderBufferChest.java new file mode 100644 index 0000000..17496f2 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderBufferChest.java @@ -0,0 +1,80 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderBufferChest extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderBufferChest(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileBufferChest buffer = (TileBufferChest)tile; + World world = buffer.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, buffer.xCoord, buffer.yCoord, buffer.zCoord); + this.context + .setIcon( + RedPowerMachine.bufferBack, + RedPowerMachine.bufferFront, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.orientTextures(buffer.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + this.context.bindBlockTexture(); + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.bufferBack, + RedPowerMachine.bufferFront, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide, + RedPowerMachine.bufferSide + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderChargingBench.java b/src/main/java/com/eloraam/redpower/machine/RenderChargingBench.java new file mode 100644 index 0000000..6110973 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderChargingBench.java @@ -0,0 +1,90 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderChargingBench extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderChargingBench(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileChargingBench charger = (TileChargingBench)tile; + World world = charger.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, charger.xCoord, charger.yCoord, charger.zCoord); + int s = charger.getStorageForRender(); + IIcon front = RedPowerMachine.btChargerFront[s]; + if (charger.Powered) { + front = RedPowerMachine.btChargerFrontPowered[s]; + } + + if (charger.Active) { + front = RedPowerMachine.btChargerFrontActive[s]; + } + + this.context + .setIcon( + RedPowerMachine.btChargerBottom, + RedPowerMachine.btChargerTop, + front, + RedPowerMachine.btChargerSide, + RedPowerMachine.btChargerSide, + RedPowerMachine.btChargerSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.rotateTextures(charger.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.btChargerBottom, + RedPowerMachine.btChargerTop, + RedPowerMachine.btChargerSide, + RedPowerMachine.btChargerSide, + RedPowerMachine.btChargerSide, + RedPowerMachine.btChargerFront[0] + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderFrame.java b/src/main/java/com/eloraam/redpower/machine/RenderFrame.java new file mode 100644 index 0000000..21bddc9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderFrame.java @@ -0,0 +1,102 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderCovers; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderFrame extends RenderCovers { + public RenderFrame(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileFrame frame = (TileFrame)tile; + World world = frame.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + super.context.bindBlockTexture(); + super.context.setDefaults(); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.readGlobalLights(world, frame.xCoord, frame.yCoord, frame.zCoord); + tess.startDrawingQuads(); + if (frame.CoverSides > 0) { + short[] sides = new short[6]; + + for(int ps = 0; ps < 6; ++ps) { + sides[ps] = frame.Covers[ps]; + int tx = sides[ps] >> 8; + if (tx == 1 || tx == 4) { + sides[ps] = (short)(sides[ps] - 256); + } + } + + super.coverRenderer.render(frame.CoverSides, sides); + } + + super.context.exactTextureCoordinates = true; + super.context.setIcon(RedPowerMachine.frameCovered); + + for(int ps = 0; ps < 6; ++ps) { + int pc = 1 << ps; + IIcon icon = RedPowerMachine.frameCrossed; + super.coverRenderer.start(); + if ((frame.CoverSides & pc) > 0) { + if ((frame.StickySides & pc) > 0) { + icon = RedPowerMachine.framePaneled; + } else { + icon = RedPowerMachine.frameCovered; + } + } else { + pc |= 1 << (ps ^ 1); + super.context.setIconNum(ps ^ 1, RedPowerMachine.frameCrossed); + } + + super.context.setIconNum(ps, icon); + super.coverRenderer.setSize(ps, 0.0625F); + super.context.calcBoundsGlobal(); + super.context.renderGlobFaces(pc); + } + + tess.draw(); + super.context.exactTextureCoordinates = false; + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.setIcon(RedPowerMachine.frameCrossed); + this.doubleBox(63, 0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F, 0.01F); + tess.draw(); + super.context.useNormal = false; + } + + private void doubleBox(int sides, float x1, float y1, float z1, float x2, float y2, float z2, float ino) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + super.context.renderBox(sides, (double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + super.context.renderBox(s2, (double)(x2 - ino), (double)(y2 - ino), (double)(z2 - ino), (double)(x1 + ino), (double)(y1 + ino), (double)(z1 + ino)); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderFrameMoving.java b/src/main/java/com/eloraam/redpower/machine/RenderFrameMoving.java new file mode 100644 index 0000000..db148fb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderFrameMoving.java @@ -0,0 +1,119 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderFrameMoving extends RenderCustomBlock { + private RenderBlocks rblocks; + private RenderContext context = new RenderContext(); + + public RenderFrameMoving(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileFrameMoving frame = (TileFrameMoving)tile; + World world = frame.getWorldObj(); + Tessellator tess = Tessellator.instance; + if (!tile.isInvalid()) { + Block block = frame.movingBlock; + if (block != null) { + this.context.bindBlockTexture(); + int lv = world.getLightBrightnessForSkyBlocks(tile.xCoord, tile.yCoord, tile.zCoord, 0); + tess.setBrightness(lv); + RenderHelper.disableStandardItemLighting(); + GL11.glBlendFunc(770, 771); + GL11.glEnable(3042); + GL11.glEnable(2884); + if (Minecraft.isAmbientOcclusionEnabled()) { + GL11.glShadeModel(7425); + } else { + GL11.glShadeModel(7424); + } + + IBlockAccess wba = this.rblocks.blockAccess; + this.rblocks.blockAccess = frame.getFrameBlockAccess(); + TileMotor tm = CoreLib.getTileEntity(frame.getWorldObj(), frame.motorX, frame.motorY, frame.motorZ, TileMotor.class); + GL11.glPushMatrix(); + if (tm != null) { + WorldCoord wc = new WorldCoord(0, 0, 0); + wc.step(tm.MoveDir); + float ms = tm.getMoveScaled(); + GL11.glTranslatef((float)wc.x * ms, (float)wc.y * ms, (float)wc.z * ms); + } + + tess.setTranslation(x - (double)frame.xCoord, y - (double)frame.yCoord, z - (double)frame.zCoord); + tess.setColorOpaque(1, 1, 1); + if (frame.movingCrate) { + this.context.setDefaults(); + this.context.setBrightness(lv); + this.context.setPos((double)frame.xCoord, (double)frame.yCoord, (double)frame.zCoord); + this.context.setIcon(RedPowerMachine.crate); + tess.startDrawingQuads(); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + } else { + label47: { + frame.doRefresh(frame.getFrameBlockAccess()); + if (frame.movingTileEntity != null) { + TileEntitySpecialRenderer tesr = TileEntityRendererDispatcher.instance.getSpecialRenderer(frame.movingTileEntity); + if (tesr != null) { + try { + double tileX = (double)frame.xCoord; + double tileY = (double)frame.yCoord; + double tileZ = (double)frame.zCoord; + tesr.renderTileEntityAt(frame.movingTileEntity, tileX, tileY, tileZ, partialTicks); + } catch (Exception var24) { + try { + tess.draw(); + } catch (Exception var23) { + } + } + break label47; + } + } + + tess.startDrawingQuads(); + this.rblocks.renderAllFaces = true; + this.rblocks.renderBlockByRenderType(block, frame.xCoord, frame.yCoord, frame.zCoord); + this.rblocks.renderAllFaces = false; + tess.draw(); + } + } + + tess.setTranslation(0.0, 0.0, 0.0); + GL11.glPopMatrix(); + this.rblocks.blockAccess = wba; + RenderHelper.enableStandardItemLighting(); + } + } + + } + + public void func_147496_a(World world) { + this.rblocks = new RenderBlocks(world); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderFrameRedstoneTube.java b/src/main/java/com/eloraam/redpower/machine/RenderFrameRedstoneTube.java new file mode 100644 index 0000000..c4bffc9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderFrameRedstoneTube.java @@ -0,0 +1,188 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderFrameRedstoneTube extends RenderTube { + public RenderFrameRedstoneTube(Block block) { + super(block); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileFrameRedstoneTube frameRedstoneTube = (TileFrameRedstoneTube)tile; + World world = frameRedstoneTube.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + int lv = world.getLightBrightnessForSkyBlocks(frameRedstoneTube.xCoord, frameRedstoneTube.yCoord, frameRedstoneTube.zCoord, 0); + tess.setBrightness(lv); + super.context.bindBlockTexture(); + super.context.setDefaults(); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.readGlobalLights(world, frameRedstoneTube.xCoord, frameRedstoneTube.yCoord, frameRedstoneTube.zCoord); + tess.startDrawingQuads(); + if (frameRedstoneTube.CoverSides > 0) { + short[] sides = new short[6]; + + for(int ps = 0; ps < 6; ++ps) { + sides[ps] = frameRedstoneTube.Covers[ps]; + int tx = sides[ps] >> 8; + if (tx == 1 || tx == 4) { + sides[ps] = (short)(sides[ps] - 256); + } + } + + super.coverRenderer.render(frameRedstoneTube.CoverSides, sides); + } + + int cons = TubeLib.getConnections(world, frameRedstoneTube.xCoord, frameRedstoneTube.yCoord, frameRedstoneTube.zCoord) + | frameRedstoneTube.getConnectionMask() >> 24; + super.context.exactTextureCoordinates = true; + super.context.setIcon(RedPowerMachine.frameCovered); + int side = frameRedstoneTube.CoverSides | cons; + + for(int ps = 0; ps < 6; ++ps) { + int pc = 1 << ps; + IIcon icon = RedPowerMachine.frameCrossed; + super.coverRenderer.start(); + if ((side & pc) > 0) { + if ((frameRedstoneTube.StickySides & pc) > 0) { + icon = RedPowerMachine.framePaneled; + } else { + icon = RedPowerMachine.frameCovered; + } + } else { + pc |= 1 << (ps ^ 1); + super.context.setIconNum(ps ^ 1, RedPowerMachine.frameCrossed); + } + + super.context.setIconNum(ps, icon); + super.coverRenderer.setSize(ps, 0.0625F); + super.context.calcBoundsGlobal(); + super.context.renderGlobFaces(pc); + } + + super.context.exactTextureCoordinates = false; + super.context.setBrightness(this.getMixedBrightness(frameRedstoneTube)); + int ps = (frameRedstoneTube.PowerState + 84) / 85; + this.renderCenterBlock(cons, RedPowerMachine.redstoneTubeSide[ps], RedPowerMachine.redstoneTubeFace[ps]); + if (frameRedstoneTube.paintColor > 0) { + int pc = super.paintColors[frameRedstoneTube.paintColor - 1]; + super.context.setTint((float)(pc >> 16) / 255.0F, (float)(pc >> 8 & 0xFF) / 255.0F, (float)(pc & 0xFF) / 255.0F); + this.renderBlockPaint(cons, RedPowerMachine.baseTubeFaceColor, RedPowerMachine.baseTubeSideColor, frameRedstoneTube.getBlockMetadata()); + } + + tess.draw(); + super.item.worldObj = world; + super.item.setPosition(x + 0.5, y + 0.5, z + 0.5); + RenderItem renderitem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + super.item.age = 0; + super.item.hoverStart = 0.0F; + WorldCoord offset = new WorldCoord(0, 0, 0); + TubeFlow flow = frameRedstoneTube.getTubeFlow(); + + for(TubeItem item : flow.contents) { + super.item.setEntityItemStack(item.item); + offset.x = 0; + offset.y = 0; + offset.z = 0; + offset.step(item.side); + double d = (double)item.progress / 128.0 * 0.5; + if (!item.scheduled) { + d = 0.5 - d; + } + + double yo = 0.0; + if (Item.getIdFromItem(item.item.getItem()) >= 256) { + yo += 0.1; + } + + renderitem.doRender( + super.item, + x + 0.5 + (double)offset.x * d, + y + 0.5 - (double)super.item.yOffset - yo + (double)offset.y * d, + z + 0.5 + (double)offset.z * d, + 0.0F, + 0.0F + ); + if (item.color > 0) { + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.setDefaults(); + super.context.setBrightness(lv); + super.context.setPos(x + (double)offset.x * d, y + (double)offset.y * d, z + (double)offset.z * d); + super.context.setTintHex(super.paintColors[item.color - 1]); + super.context.setIcon(RedPowerMachine.tubeItemOverlay); + super.context.renderBox(63, 0.26F, 0.26F, 0.26F, 0.74F, 0.74F, 0.74F); + tess.draw(); + } + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context + .setIcon( + RedPowerMachine.frameCovered, + RedPowerMachine.frameCovered, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed + ); + this.doubleBox(63, 0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F, 0.01F); + super.context + .setIcon( + RedPowerMachine.redstoneTubeFace[0], + RedPowerMachine.redstoneTubeFace[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0] + ); + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(63, 0.74F, 0.99F, 0.74F, 0.26F, 0.01F, 0.26F); + tess.draw(); + super.context.useNormal = false; + } + + private void doubleBox(int sides, float x1, float y1, float z1, float x2, float y2, float z2, float ino) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + super.context.renderBox(sides, (double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + super.context.renderBox(s2, (double)(x2 - ino), (double)(y2 - ino), (double)(z2 - ino), (double)(x1 + ino), (double)(y1 + ino), (double)(z1 + ino)); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderFrameTube.java b/src/main/java/com/eloraam/redpower/machine/RenderFrameTube.java new file mode 100644 index 0000000..7f2e4d1 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderFrameTube.java @@ -0,0 +1,186 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderFrameTube extends RenderTube { + public RenderFrameTube(Block block) { + super(block); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileFrameTube frameTube = (TileFrameTube)tile; + World world = frameTube.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + int lv = world.getLightBrightnessForSkyBlocks(frameTube.xCoord, frameTube.yCoord, frameTube.zCoord, 0); + tess.setBrightness(lv); + super.context.bindBlockTexture(); + super.context.setDefaults(); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.readGlobalLights(world, frameTube.xCoord, frameTube.yCoord, frameTube.zCoord); + if (frameTube.CoverSides > 0) { + short[] sides = new short[6]; + + for(int ps = 0; ps < 6; ++ps) { + sides[ps] = frameTube.Covers[ps]; + int pc = sides[ps] >> 8; + if (pc == 1 || pc == 4) { + sides[ps] = (short)(sides[ps] - 256); + } + } + + super.coverRenderer.render(frameTube.CoverSides, sides); + } + + int conn = TubeLib.getConnections(world, frameTube.xCoord, frameTube.yCoord, frameTube.zCoord); + super.context.exactTextureCoordinates = true; + tess.startDrawingQuads(); + super.context.setIcon(RedPowerMachine.frameCovered); + int sides = frameTube.CoverSides | conn; + + for(int ps = 0; ps < 6; ++ps) { + int pc = 1 << ps; + IIcon icon = RedPowerMachine.frameCrossed; + super.coverRenderer.start(); + if ((sides & pc) > 0) { + if ((frameTube.StickySides & pc) > 0) { + icon = RedPowerMachine.framePaneled; + } else { + icon = RedPowerMachine.frameCovered; + } + } else { + pc |= 1 << (ps ^ 1); + super.context.setIconNum(ps ^ 1, RedPowerMachine.frameCrossed); + } + + super.context.setIconNum(ps, icon); + super.coverRenderer.setSize(ps, 0.0625F); + super.context.calcBoundsGlobal(); + super.context.renderGlobFaces(pc); + } + + super.context.exactTextureCoordinates = false; + super.context.setBrightness(this.getMixedBrightness(frameTube)); + this.renderCenterBlock(conn, RedPowerMachine.baseTubeSide, RedPowerMachine.baseTubeFace); + if (frameTube.paintColor > 0) { + int pcolor = super.paintColors[frameTube.paintColor - 1]; + super.context.setTint((float)(pcolor >> 16) / 255.0F, (float)(pcolor >> 8 & 0xFF) / 255.0F, (float)(pcolor & 0xFF) / 255.0F); + this.renderBlockPaint(conn, RedPowerMachine.baseTubeFaceColor, RedPowerMachine.baseTubeSideColor, frameTube.getBlockMetadata()); + } + + tess.draw(); + super.item.worldObj = world; + super.item.setPosition(x + 0.5, y + 0.5, z + 0.5); + RenderItem renderitem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + super.item.age = 0; + super.item.hoverStart = 0.0F; + WorldCoord offset = new WorldCoord(0, 0, 0); + TubeFlow flow = frameTube.getTubeFlow(); + + for(TubeItem item : flow.contents) { + super.item.setEntityItemStack(item.item); + offset.x = 0; + offset.y = 0; + offset.z = 0; + offset.step(item.side); + double d = (double)item.progress / 128.0 * 0.5; + if (!item.scheduled) { + d = 0.5 - d; + } + + double yo = 0.0; + if (Item.getIdFromItem(item.item.getItem()) >= 256) { + yo += 0.1; + } + + renderitem.doRender( + super.item, + x + 0.5 + (double)offset.x * d, + y + 0.5 - (double)super.item.yOffset - yo + (double)offset.y * d, + z + 0.5 + (double)offset.z * d, + 0.0F, + 0.0F + ); + if (item.color > 0) { + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.setDefaults(); + super.context.setBrightness(lv); + super.context.setPos(x + (double)offset.x * d, y + (double)offset.y * d, z + (double)offset.z * d); + super.context.setTintHex(super.paintColors[item.color - 1]); + super.context.setIcon(RedPowerMachine.tubeItemOverlay); + super.context.renderBox(63, 0.26F, 0.26F, 0.26F, 0.74F, 0.74F, 0.74F); + tess.draw(); + } + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context + .setIcon( + RedPowerMachine.frameCovered, + RedPowerMachine.frameCovered, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed, + RedPowerMachine.frameCrossed + ); + this.doubleBox(63, 0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F, 0.01F); + super.context + .setIcon( + RedPowerMachine.baseTubeFace, + RedPowerMachine.baseTubeFace, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide + ); + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(63, 0.74F, 0.99F, 0.74F, 0.26F, 0.01F, 0.26F); + tess.draw(); + super.context.useNormal = false; + } + + private void doubleBox(int sides, float x1, float y1, float z1, float x2, float y2, float z2, float ino) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + super.context.renderBox(sides, (double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + super.context.renderBox(s2, (double)(x2 - ino), (double)(y2 - ino), (double)(z2 - ino), (double)(x1 + ino), (double)(y1 + ino), (double)(z1 + ino)); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderGrate.java b/src/main/java/com/eloraam/redpower/machine/RenderGrate.java new file mode 100644 index 0000000..679fddf --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderGrate.java @@ -0,0 +1,91 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderGrate extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderGrate(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileGrate grate = (TileGrate)tile; + World world = grate.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, grate.xCoord, grate.yCoord, grate.zCoord); + this.context + .setIcon( + RedPowerMachine.grateBack, + RedPowerMachine.grateSide, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.orientTextures(grate.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + this.context + .setIcon( + RedPowerMachine.grateEmptyBack, + RedPowerMachine.grateSide, + RedPowerMachine.grateSide, + RedPowerMachine.grateSide, + RedPowerMachine.grateSide, + RedPowerMachine.grateSide + ); + this.context.setLocalLights(0.3F); + this.context.setBrightness(this.getMixedBrightness(grate)); + this.context.renderBox(63, 0.99, 0.99, 0.99, 0.01, 0.01, 0.01); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.grateSide, + RedPowerMachine.grateBack, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide, + RedPowerMachine.grateMossySide + ); + this.context.doubleBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.01); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderMachine.java b/src/main/java/com/eloraam/redpower/machine/RenderMachine.java new file mode 100644 index 0000000..74790f9 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderMachine.java @@ -0,0 +1,347 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderMachine extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderMachine(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileMachine machine = (TileMachine)tile; + World world = machine.getWorldObj(); + int metadata = machine.getBlockMetadata(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, machine.xCoord, machine.yCoord, machine.zCoord); + this.context.setBrightness(this.getMixedBrightness(machine)); + if (machine.getBlockType() == RedPowerMachine.blockMachine) { + switch(metadata) { + case 0: + this.context + .setIcon( + RedPowerMachine.deployerBack, + machine.Active ? RedPowerMachine.deployerFrontOn : RedPowerMachine.deployerFront, + RedPowerMachine.deployerSideAlt, + RedPowerMachine.deployerSideAlt, + RedPowerMachine.deployerSide, + RedPowerMachine.deployerSide + ); + break; + case 1: + case 2: + case 3: + case 6: + case 7: + case 9: + case 11: + default: { //TODO: WTF? + IIcon side = metadata == 3 + ? (machine.Active ? RedPowerMachine.filterSideOn : RedPowerMachine.filterSide) + : (machine.Active ? RedPowerMachine.transposerSideOn : RedPowerMachine.transposerSide); + this.context.setIcon(RedPowerMachine.breakerBack, RedPowerMachine.transposerFront, side, side, side, side); + break; + } + case 4: { + IIcon alt = machine.Active ? RedPowerMachine.detectorSideAltOn : RedPowerMachine.detectorSideAlt; + IIcon side; + if (machine.Charged) { + side = machine.Active ? RedPowerMachine.detectorSideChargedOn : RedPowerMachine.detectorSideCharged; + } else { + side = machine.Active ? RedPowerMachine.detectorSideOn : RedPowerMachine.detectorSide; + } + + this.context.setIcon(RedPowerMachine.regulatorBack, RedPowerMachine.regulatorFront, alt, alt, side, side); + break; + } + case 5: { + IIcon side; + if (machine.Charged) { + side = machine.Active ? RedPowerMachine.sorterSideChargedOn : RedPowerMachine.sorterSideCharged; + } else { + side = machine.Active ? RedPowerMachine.sorterSideOn : RedPowerMachine.sorterSide; + } + + this.context + .setIcon( + machine.Charged ? (machine.Active ? RedPowerMachine.sorterBackChargedOn : RedPowerMachine.sorterBackCharged) : RedPowerMachine.sorterBack, + RedPowerMachine.sorterFront, + side, + side, + side, + side + ); + break; + } + case 8: { + IIcon side; + if (machine.Charged) { + side = machine.Active ? RedPowerMachine.retrieverSideChargedOn : RedPowerMachine.retrieverSideCharged; + } else { + side = machine.Active ? RedPowerMachine.retrieverSideOn : RedPowerMachine.retrieverSide; + } + + this.context.setIcon(RedPowerMachine.retrieverBack, RedPowerMachine.retrieverFront, side, side, side, side); + break; + } + case 10: { + IIcon alt = machine.Active ? RedPowerMachine.regulatorSideAltCharged : RedPowerMachine.regulatorSideAlt; + IIcon side; + if (machine.Powered) { + side = machine.Active ? RedPowerMachine.regulatorSideChargedOn : RedPowerMachine.regulatorSideCharged; + } else { + side = machine.Active ? RedPowerMachine.regulatorSideOn : RedPowerMachine.regulatorSide; + } + + this.context.setIcon(RedPowerMachine.regulatorBack, RedPowerMachine.regulatorFront, alt, alt, side, side); + break; + } + case 12: + this.context + .setIcon( + RedPowerMachine.breakerBack, + machine.Active ? RedPowerMachine.igniterFrontOn : RedPowerMachine.igniterFront, + RedPowerMachine.igniterSideAlt, + RedPowerMachine.igniterSideAlt, + RedPowerMachine.igniterSide, + RedPowerMachine.igniterSide + ); + break; + case 13: + this.context + .setIcon( + machine.Active ? RedPowerMachine.assemblerBackOn : RedPowerMachine.assemblerBack, + machine.Active ? RedPowerMachine.assemblerFrontOn : RedPowerMachine.assemblerFront, + RedPowerMachine.assemblerSideAlt, + RedPowerMachine.assemblerSideAlt, + RedPowerMachine.assemblerSide, + RedPowerMachine.assemblerSide + ); + break; + case 14: { + IIcon side = machine.Active ? RedPowerMachine.ejectorSideOn : RedPowerMachine.ejectorSide; + this.context + .setIcon(RedPowerMachine.breakerBack, RedPowerMachine.bufferFront, side, side, RedPowerMachine.relaySideAlt, RedPowerMachine.relaySideAlt); + break; + } + case 15: { + IIcon side = machine.Active ? RedPowerMachine.relaySideOn : RedPowerMachine.relaySide; + this.context + .setIcon(RedPowerMachine.breakerBack, RedPowerMachine.bufferFront, side, side, RedPowerMachine.relaySideAlt, RedPowerMachine.relaySideAlt); + } + } + } else if (machine.getBlockType() == RedPowerMachine.blockMachine2) { + switch(metadata) { + case 0: { + IIcon side = machine.Charged + ? (machine.Active ? RedPowerMachine.sortronSideChargedOn : RedPowerMachine.sortronSideCharged) + : (machine.Active ? RedPowerMachine.sortronSideOn : RedPowerMachine.sortronSide); + IIcon alt = machine.Charged ? RedPowerMachine.sortronSideAltCharged : RedPowerMachine.sortronSideAlt; + this.context.setIcon(RedPowerMachine.sortronBack, RedPowerMachine.sortronFront, alt, alt, side, side); + break; + } + case 1: { + IIcon side = (machine.Charged ? RedPowerMachine.managerSideCharged : RedPowerMachine.managerSide)[(machine.Active ? 1 : 0) + + (!machine.Delay && !machine.Powered ? 0 : 2)]; + this.context.setIcon(RedPowerMachine.managerBack, RedPowerMachine.managerFront, side, side, side, side); + } + } + } + + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.orientTextures(machine.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + Block block = Block.getBlockFromItem(item.getItem()); + int meta = item.getItemDamage(); + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + if (block == RedPowerMachine.blockMachine) { + switch(meta) { + case 0: + this.context + .setIcon( + RedPowerMachine.deployerBack, + RedPowerMachine.deployerFront, + RedPowerMachine.deployerSideAlt, + RedPowerMachine.deployerSideAlt, + RedPowerMachine.deployerSide, + RedPowerMachine.deployerSide + ); + break; + case 1: + case 3: + case 6: + case 7: + case 9: + case 11: + default: + this.context + .setIcon( + RedPowerMachine.breakerBack, + RedPowerMachine.transposerFront, + RedPowerMachine.filterSide, + RedPowerMachine.filterSide, + RedPowerMachine.filterSide, + RedPowerMachine.filterSide + ); + break; + case 2: + this.context + .setIcon( + RedPowerMachine.breakerBack, + RedPowerMachine.transposerFront, + RedPowerMachine.transposerSide, + RedPowerMachine.transposerSide, + RedPowerMachine.transposerSide, + RedPowerMachine.transposerSide + ); + break; + case 4: + this.context + .setIcon( + RedPowerMachine.regulatorBack, + RedPowerMachine.regulatorFront, + RedPowerMachine.regulatorSideAlt, + RedPowerMachine.regulatorSideAlt, + RedPowerMachine.regulatorSide, + RedPowerMachine.regulatorSide + ); + break; + case 5: + this.context + .setIcon( + RedPowerMachine.sorterBack, + RedPowerMachine.sorterFront, + RedPowerMachine.sorterSide, + RedPowerMachine.sorterSide, + RedPowerMachine.sorterSide, + RedPowerMachine.sorterSide + ); + break; + case 8: + this.context + .setIcon( + RedPowerMachine.retrieverBack, + RedPowerMachine.retrieverFront, + RedPowerMachine.retrieverSide, + RedPowerMachine.retrieverSide, + RedPowerMachine.retrieverSide, + RedPowerMachine.retrieverSide + ); + break; + case 10: + this.context + .setIcon( + RedPowerMachine.regulatorBack, + RedPowerMachine.regulatorFront, + RedPowerMachine.regulatorSide, + RedPowerMachine.regulatorSide, + RedPowerMachine.regulatorSideAlt, + RedPowerMachine.regulatorSideAlt + ); + break; + case 12: + this.context + .setIcon( + RedPowerMachine.deployerBack, + RedPowerMachine.igniterFront, + RedPowerMachine.igniterSideAlt, + RedPowerMachine.igniterSideAlt, + RedPowerMachine.igniterSide, + RedPowerMachine.igniterSide + ); + break; + case 13: + this.context + .setIcon( + RedPowerMachine.assemblerBack, + RedPowerMachine.assemblerFront, + RedPowerMachine.assemblerSideAlt, + RedPowerMachine.assemblerSideAlt, + RedPowerMachine.assemblerSide, + RedPowerMachine.assemblerSide + ); + break; + case 14: + this.context + .setIcon( + RedPowerMachine.breakerBack, + RedPowerMachine.bufferFront, + RedPowerMachine.ejectorSide, + RedPowerMachine.ejectorSide, + RedPowerMachine.relaySideAlt, + RedPowerMachine.relaySideAlt + ); + break; + case 15: + this.context + .setIcon( + RedPowerMachine.breakerBack, + RedPowerMachine.bufferFront, + RedPowerMachine.relaySide, + RedPowerMachine.relaySide, + RedPowerMachine.relaySideAlt, + RedPowerMachine.relaySideAlt + ); + } + } else if (block == RedPowerMachine.blockMachine2) { + switch(meta) { + case 0: + this.context + .setIcon( + RedPowerMachine.sortronBack, + RedPowerMachine.sortronFront, + RedPowerMachine.sortronSideAlt, + RedPowerMachine.sortronSideAlt, + RedPowerMachine.sortronSide, + RedPowerMachine.sortronSide + ); + break; + case 1: + IIcon side = RedPowerMachine.managerSide[0]; + this.context.setIcon(RedPowerMachine.managerBack, RedPowerMachine.managerFront, side, side, side, side); + } + } + + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderMotor.java b/src/main/java/com/eloraam/redpower/machine/RenderMotor.java new file mode 100644 index 0000000..74df84b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderMotor.java @@ -0,0 +1,87 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderMotor extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderMotor(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileMotor motor = (TileMotor)tile; + World world = motor.getWorldObj(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(2896); + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, motor.xCoord, motor.yCoord, motor.zCoord); + this.context.setTexFlags(64); + if (motor.Active) { + this.context + .setIcon( + RedPowerMachine.motorBottom, + RedPowerMachine.motorTopActive, + RedPowerMachine.motorFrontActive, + RedPowerMachine.motorFrontActive, + RedPowerMachine.motorSide, + RedPowerMachine.motorSide + ); + } else { + IIcon tx = motor.Charged ? RedPowerMachine.motorFrontCharged : RedPowerMachine.motorFront; + this.context.setIcon(RedPowerMachine.motorBottom, RedPowerMachine.motorTop, tx, tx, RedPowerMachine.motorSide, RedPowerMachine.motorSide); + } + + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + this.context.orientTextureNew(motor.Rotation); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.motorBottom, + RedPowerMachine.motorTop, + RedPowerMachine.motorFront, + RedPowerMachine.motorFront, + RedPowerMachine.motorSide, + RedPowerMachine.motorSide + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderPipe.java b/src/main/java/com/eloraam/redpower/machine/RenderPipe.java new file mode 100644 index 0000000..9722d85 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderPipe.java @@ -0,0 +1,241 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.PipeLib; +import com.eloraam.redpower.core.RenderCovers; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import net.minecraftforge.fluids.Fluid; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderPipe extends RenderCovers { + public RenderPipe(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TilePipe pipe = (TilePipe)tile; + World world = pipe.getWorldObj(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(2896); + super.context.bindBlockTexture(); + super.context.exactTextureCoordinates = true; + super.context.setTexFlags(55); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + tess.startDrawingQuads(); + if (pipe.CoverSides > 0) { + super.context.readGlobalLights(world, pipe.xCoord, pipe.yCoord, pipe.zCoord); + this.renderCovers(pipe.CoverSides, pipe.Covers); + } + + int cons1 = PipeLib.getConnections(world, pipe.xCoord, pipe.yCoord, pipe.zCoord); + super.context.setBrightness(this.getMixedBrightness(pipe)); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.setPos(x, y, z); + this.renderCenterBlock(cons1, RedPowerMachine.pipeSide, RedPowerMachine.pipeFace); + pipe.cacheFlange(); + this.renderFlanges(pipe.Flanges, RedPowerMachine.pipeFlanges); + tess.draw(); + int lvl = pipe.pipebuf.getLevel(); + Fluid fcl = pipe.pipebuf.Type; + if (fcl != null && lvl > 0) { + float lvn = Math.min(1.0F, (float)lvl / (float)pipe.pipebuf.getMaxLevel()); + pipe.cacheCon(); + int sides = pipe.ConCache; + int lv = world.getLightBrightnessForSkyBlocks(pipe.xCoord, pipe.yCoord, pipe.zCoord, 0); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + tess.startDrawingQuads(); + super.context.setBrightness(lv); + super.context.setPos(x, y, z); + super.context.setIcon(fcl.getIcon()); + if ((sides & 3) > 0) { + float y1 = 0.5F; + float y2 = 0.5F; + if ((sides & 1) > 0) { + y1 = 0.0F; + } + + if ((sides & 2) > 0) { + y2 = 1.0F; + } + + float n = 0.124F * lvn; + super.context.renderBox(60, (double)(0.5F - n), (double)y1, (double)(0.5F - n), (double)(0.5F + n), (double)y2, (double)(0.5F + n)); + } + + if ((sides & 12) > 0) { + float z1 = 0.5F; + float z2 = 0.5F; + if ((sides & 4) > 0) { + z1 = 0.0F; + } + + if ((sides & 8) > 0) { + z2 = 1.0F; + } + + float n = 0.248F * lvn; + super.context.renderBox(51, 0.376F, 0.376F, (double)z1, 0.624F, (double)(0.376F + n), (double)z2); + } + + if ((sides & 48) > 0) { + float x1 = 0.5F; + float x2 = 0.5F; + if ((sides & 16) > 0) { + x1 = 0.0F; + } + + if ((sides & 32) > 0) { + x2 = 1.0F; + } + + float n = 0.248F * lvn; + super.context.renderBox(15, (double)x1, 0.376F, 0.376F, (double)x2, (double)(0.376F + n), 0.624F); + } + + tess.draw(); + GL11.glDisable(3042); + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context + .setIcon( + RedPowerMachine.pipeFace, + RedPowerMachine.pipeFace, + RedPowerMachine.pipeSide, + RedPowerMachine.pipeSide, + RedPowerMachine.pipeSide, + RedPowerMachine.pipeSide + ); + super.context.renderBox(60, 0.375, 0.0, 0.375, 0.625, 1.0, 0.625); + super.context.renderBox(60, 0.624F, 0.999F, 0.624F, 0.376F, 0.001F, 0.376F); + this.renderFlanges(3, RedPowerMachine.pipeFlanges); + tess.draw(); + super.context.useNormal = false; + } + + private void doubleBox(int sides, float x1, float y1, float z1, float x2, float y2, float z2) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + super.context.renderBox(sides, (double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + super.context.renderBox(s2, (double)x2, (double)y2, (double)z2, (double)x1, (double)y1, (double)z1); + } + + public void renderFlanges(int cons, IIcon tex) { + super.context.setIcon(tex); + if ((cons & 1) > 0) { + super.context.setTexFlags(0); + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 0.125, 0.75); + } + + if ((cons & 2) > 0) { + super.context.setTexFlags(112320); + super.context.renderBox(63, 0.25, 0.875, 0.25, 0.75, 1.0, 0.75); + } + + if ((cons & 4) > 0) { + super.context.setTexFlags(217134); + super.context.renderBox(63, 0.25, 0.25, 0.0, 0.75, 0.75, 0.125); + } + + if ((cons & 8) > 0) { + super.context.setTexFlags(188469); + super.context.renderBox(63, 0.25, 0.25, 0.875, 0.75, 0.75, 1.0); + } + + if ((cons & 16) > 0) { + super.context.setTexFlags(2944); + super.context.renderBox(63, 0.0, 0.25, 0.25, 0.125, 0.75, 0.75); + } + + if ((cons & 32) > 0) { + super.context.setTexFlags(3419); + super.context.renderBox(63, 0.875, 0.25, 0.25, 1.0, 0.75, 0.75); + } + + } + + public void renderCenterBlock(int cons, IIcon side, IIcon end) { + if (cons == 0) { + super.context.setIcon(end); + this.doubleBox(63, 0.375F, 0.375F, 0.375F, 0.625F, 0.625F, 0.625F); + } else if (cons == 3) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.375F, 0.0F, 0.375F, 0.625F, 1.0F, 0.625F); + } else if (cons == 12) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.375F, 0.375F, 0.0F, 0.625F, 0.625F, 1.0F); + } else if (cons == 48) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.0F, 0.375F, 0.375F, 1.0F, 0.625F, 0.625F); + } else { + super.context.setIcon(end); + this.doubleBox(63 ^ cons, 0.375F, 0.375F, 0.375F, 0.625F, 0.625F, 0.625F); + if ((cons & 1) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.375F, 0.0F, 0.375F, 0.625F, 0.375F, 0.625F); + } + + if ((cons & 2) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.375F, 0.625F, 0.375F, 0.625F, 1.0F, 0.625F); + } + + if ((cons & 4) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.375F, 0.375F, 0.0F, 0.625F, 0.625F, 0.375F); + } + + if ((cons & 8) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.375F, 0.375F, 0.625F, 0.625F, 0.625F, 1.0F); + } + + if ((cons & 16) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.0F, 0.375F, 0.375F, 0.375F, 0.625F, 0.625F); + } + + if ((cons & 32) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.625F, 0.375F, 0.375F, 1.0F, 0.625F, 0.625F); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderPump.java b/src/main/java/com/eloraam/redpower/machine/RenderPump.java new file mode 100644 index 0000000..0c11905 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderPump.java @@ -0,0 +1,94 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderPump extends RenderCustomBlock { + private RenderModel modelBase = RenderModel.loadModel("rpmachine:models/pump1.obj"); + private RenderModel modelSlide = RenderModel.loadModel("rpmachine:models/pump2.obj"); + private ResourceLocation modelRes = new ResourceLocation("rpmachine", "models/machine1.png"); + private RenderContext context = new RenderContext(); + private float lastPumpTick; + + public RenderPump(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TilePump pump = (TilePump)tile; + World world = pump.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(0, pump.Rotation); + this.context.readGlobalLights(world, pump.xCoord, pump.yCoord, pump.zCoord); + this.context.setBrightness(this.getMixedBrightness(pump)); + this.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + this.context.bindModelOffset(this.modelBase, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, pump.Charged ? (pump.Active ? 3 : 2) : 1); + tess.draw(); + int lv = world.getLightBrightnessForSkyBlocks(pump.xCoord, pump.yCoord, pump.zCoord, 0); + this.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + tess.setBrightness(lv); + float pumpTick = 0.0F; + if (pump.Active) { + pumpTick += (float)pump.PumpTick; + if (pumpTick > 8.0F) { + pumpTick = 16.0F - pumpTick; + } + + pumpTick = (float)((double)pumpTick / 8.0); + } + + this.lastPumpTick = pumpTick; + this.context.useNormal = true; + this.context.setPos(x, y, z); + this.context.setOrientation(0, pump.Rotation); + float mod = this.lastPumpTick + (pumpTick - this.lastPumpTick) * partialTicks; + this.context.setRelPos(0.375 + 0.3125 * (double)mod, 0.0, 0.0); + this.context.bindModelOffset(this.modelSlide, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.bindTexture(this.modelRes); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.bindModelOffset(this.modelBase, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.renderModelGroup(1, 1); + this.context.setRelPos(0.375, 0.0, 0.0); + this.context.bindModelOffset(this.modelSlide, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderRedstoneTube.java b/src/main/java/com/eloraam/redpower/machine/RenderRedstoneTube.java new file mode 100644 index 0000000..79a403a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderRedstoneTube.java @@ -0,0 +1,136 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderRedstoneTube extends RenderTube { + public RenderRedstoneTube(Block block) { + super(block); + } + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileRedstoneTube redstoneTube = (TileRedstoneTube)tile; + World world = redstoneTube.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + int lv = world.getLightBrightnessForSkyBlocks(redstoneTube.xCoord, redstoneTube.yCoord, redstoneTube.zCoord, 0); + tess.setBrightness(lv); + tess.startDrawingQuads(); + super.context.bindBlockTexture(); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + if (redstoneTube.CoverSides > 0) { + super.context.readGlobalLights(world, redstoneTube.xCoord, redstoneTube.yCoord, redstoneTube.zCoord); + this.renderCovers(redstoneTube.CoverSides, redstoneTube.Covers); + } + + int cons1 = TubeLib.getConnections(world, redstoneTube.xCoord, redstoneTube.yCoord, redstoneTube.zCoord) | redstoneTube.getConnectionMask() >> 24; + super.context.setBrightness(this.getMixedBrightness(redstoneTube)); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.setPos(x, y, z); + int ps = (redstoneTube.PowerState + 84) / 85; + this.renderCenterBlock(cons1, RedPowerMachine.redstoneTubeSide[ps], RedPowerMachine.redstoneTubeFace[ps]); + if (redstoneTube.paintColor > 0) { + int tc = super.paintColors[redstoneTube.paintColor - 1]; + super.context.setTint((float)(tc >> 16) / 255.0F, (float)(tc >> 8 & 0xFF) / 255.0F, (float)(tc & 0xFF) / 255.0F); + this.renderBlockPaint(cons1, RedPowerMachine.baseTubeFaceColor, RedPowerMachine.baseTubeSideColor, redstoneTube.getBlockMetadata()); + } + + tess.draw(); + super.item.worldObj = world; + super.item.setPosition(x + 0.5, y + 0.5, z + 0.5); + RenderItem renderitem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + super.item.age = 0; + super.item.hoverStart = 0.0F; + WorldCoord offset = new WorldCoord(0, 0, 0); + TubeFlow flow = redstoneTube.getTubeFlow(); + + for(TubeItem item : flow.contents) { + super.item.setEntityItemStack(item.item); + offset.x = 0; + offset.y = 0; + offset.z = 0; + offset.step(item.side); + double d = (double)item.progress / 128.0 * 0.5; + if (!item.scheduled) { + d = 0.5 - d; + } + + double yo = 0.0; + if (Item.getIdFromItem(item.item.getItem()) >= 256) { + yo += 0.1; + } + + renderitem.doRender( + super.item, + x + 0.5 + (double)offset.x * d, + y + 0.5 - (double)super.item.yOffset - yo + (double)offset.y * d, + z + 0.5 + (double)offset.z * d, + 0.0F, + 0.0F + ); + if (item.color > 0) { + super.context.bindBlockTexture(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.setDefaults(); + super.context.setBrightness(lv); + super.context.setPos(x + (double)offset.x * d, y + (double)offset.y * d, z + (double)offset.z * d); + super.context.setTintHex(super.paintColors[item.color - 1]); + super.context.setIcon(RedPowerMachine.tubeItemOverlay); + super.context.renderBox(63, 0.26F, 0.26F, 0.26F, 0.74F, 0.74F, 0.74F); + tess.draw(); + } + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context + .setIcon( + RedPowerMachine.redstoneTubeFace[0], + RedPowerMachine.redstoneTubeFace[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0], + RedPowerMachine.redstoneTubeSide[0] + ); + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(63, 0.74F, 0.99F, 0.74F, 0.26F, 0.01F, 0.26F); + tess.draw(); + super.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderSolarPanel.java b/src/main/java/com/eloraam/redpower/machine/RenderSolarPanel.java new file mode 100644 index 0000000..5428118 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderSolarPanel.java @@ -0,0 +1,78 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderSolarPanel extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderSolarPanel(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileSolarPanel solarPanel = (TileSolarPanel)tile; + World world = solarPanel.getWorldObj(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(2896); + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(world, solarPanel.xCoord, solarPanel.yCoord, solarPanel.zCoord); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.solarPanelTop, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 0.25, 1.0); + this.context.setupBox(); + this.context.transform(); + tess.startDrawingQuads(); + this.context.renderGlobFaces(62); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.electronicsBottom, + RedPowerMachine.solarPanelTop, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide, + RedPowerMachine.solarPanelSide + ); + this.context.renderBox(62, 0.0, 0.0, 0.0, 1.0, 0.25, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderThermopile.java b/src/main/java/com/eloraam/redpower/machine/RenderThermopile.java new file mode 100644 index 0000000..455bd71 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderThermopile.java @@ -0,0 +1,76 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderThermopile extends RenderCustomBlock { + protected RenderContext context = new RenderContext(); + + public RenderThermopile(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileThermopile thermopile = (TileThermopile)tile; + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.bindBlockTexture(); + this.context.setDefaults(); + this.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.context.setPos(x, y, z); + this.context.readGlobalLights(thermopile.getWorldObj(), thermopile.xCoord, thermopile.yCoord, thermopile.zCoord); + this.context + .setIcon( + RedPowerMachine.thermopileTop, + RedPowerMachine.thermopileTop, + RedPowerMachine.thermopileSide, + RedPowerMachine.thermopileSide, + RedPowerMachine.thermopileFront, + RedPowerMachine.thermopileFront + ); + this.context.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.context.setupBox(); + this.context.transform(); + tess.startDrawingQuads(); + this.context.renderGlobFaces(63); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context + .setIcon( + RedPowerMachine.thermopileTop, + RedPowerMachine.thermopileTop, + RedPowerMachine.thermopileSide, + RedPowerMachine.thermopileSide, + RedPowerMachine.thermopileFront, + RedPowerMachine.thermopileFront + ); + this.context.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.context.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderTransformer.java b/src/main/java/com/eloraam/redpower/machine/RenderTransformer.java new file mode 100644 index 0000000..1731e7c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderTransformer.java @@ -0,0 +1,64 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderTransformer extends RenderCustomBlock { + protected RenderModel model = RenderModel.loadModel("rpmachine:models/transform.obj").scale(0.0625); + protected ResourceLocation modelRes = new ResourceLocation("rpmachine", "models/machine2.png"); + protected RenderContext context = new RenderContext(); + + public RenderTransformer(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileTransformer transformer = (TileTransformer)tile; + World world = transformer.getWorldObj(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + this.context.setDefaults(); + this.context.setPos(x, y, z); + this.context.setOrientation(transformer.Rotation >> 2, transformer.Rotation + 3 & 3); + this.context.readGlobalLights(world, transformer.xCoord, transformer.yCoord, transformer.zCoord); + this.context.setBrightness(this.getMixedBrightness(transformer)); + this.context.bindTexture(this.modelRes); + tess.startDrawingQuads(); + this.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.context.setPos(-0.5, -0.5, -0.5); + } else { + this.context.setPos(0.0, 0.0, 0.0); + } + + this.context.bindTexture(this.modelRes); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.context.useNormal = true; + this.context.bindModelOffset(this.model, 0.5, 0.5, 0.5); + this.context.renderModelGroup(0, 0); + this.context.useNormal = false; + tess.draw(); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderTube.java b/src/main/java/com/eloraam/redpower/machine/RenderTube.java new file mode 100644 index 0000000..62ad72d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderTube.java @@ -0,0 +1,356 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.RenderCovers; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderTube extends RenderCovers { + protected int[] paintColors = new int[]{ + 16777215, 16744448, 16711935, 7110911, 16776960, 65280, 16737408, 5460819, 9671571, 65535, 8388863, 255, 5187328, 32768, 16711680, 2039583 + }; + protected EntityItem item = new EntityItem((World)null); + + public RenderTube(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileTube tube = (TileTube)tile; + World world = tube.getWorldObj(); + int metadata = tube.getBlockMetadata(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + int lv = world.getLightBrightnessForSkyBlocks(tube.xCoord, tube.yCoord, tube.zCoord, 0); + tess.setBrightness(lv); + tess.startDrawingQuads(); + super.context.bindBlockTexture(); + super.context.exactTextureCoordinates = true; + super.context.setTexFlags(55); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setPos(x, y, z); + if (tube.CoverSides > 0) { + super.context.readGlobalLights(world, tube.xCoord, tube.yCoord, tube.zCoord); + this.renderCovers(tube.CoverSides, tube.Covers); + } + + int cons = TubeLib.getConnections(world, tube.xCoord, tube.yCoord, tube.zCoord); + super.context.setBrightness(this.getMixedBrightness(tube)); + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + super.context.setPos(x, y, z); + switch(metadata) { + case 10: + this.renderCenterBlock(cons, RedPowerMachine.restrictTubeSide, RedPowerMachine.restrictTubeFace); + break; + case 11: + if (this.renderMagFins(cons, metadata)) { + this.renderCenterBlock(cons, RedPowerMachine.magTubeSide, RedPowerMachine.magTubeFace); + } else { + this.renderCenterBlock(cons, RedPowerMachine.magTubeSideNR, RedPowerMachine.magTubeFaceNR); + } + break; + default: + this.renderCenterBlock(cons, RedPowerMachine.baseTubeSide, RedPowerMachine.baseTubeFace); + } + + if (tube.paintColor > 0) { + int tc = this.paintColors[tube.paintColor - 1]; + super.context.setTint((float)(tc >> 16) / 255.0F, (float)(tc >> 8 & 0xFF) / 255.0F, (float)(tc & 0xFF) / 255.0F); + if (metadata == 10) { + this.renderBlockPaint(cons, RedPowerMachine.restrictTubeFaceColor, RedPowerMachine.restrictTubeSideColor, metadata); + } else { + this.renderBlockPaint(cons, RedPowerMachine.baseTubeFaceColor, RedPowerMachine.baseTubeSideColor, metadata); + } + } + + tess.draw(); + this.item.worldObj = world; + this.item.setPosition((double)tube.xCoord + 0.5, (double)tube.yCoord + 0.5, (double)tube.zCoord + 0.5); + RenderItem renderitem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); + this.item.age = 0; + this.item.hoverStart = 0.0F; + WorldCoord offset = new WorldCoord(0, 0, 0); + TubeFlow flow = tube.getTubeFlow(); + + for(TubeItem item : flow.contents) { + this.item.setEntityItemStack(item.item); + offset.x = 0; + offset.y = 0; + offset.z = 0; + offset.step(item.side); + double d = (double)item.progress / 128.0 * 0.5; + if (!item.scheduled) { + d = 0.5 - d; + } + + double yo = 0.0; + if (Item.getIdFromItem(item.item.getItem()) >= 256) { + yo += 0.1; + } + + renderitem.doRender( + this.item, + x + 0.5 + (double)offset.x * d, + y + 0.5 - (double)this.item.yOffset - yo + (double)offset.y * d, + z + 0.5 + (double)offset.z * d, + 0.0F, + 0.0F + ); + if (item.color > 0) { + super.context.bindBlockTexture(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.setDefaults(); + super.context.setBrightness(lv); + super.context.setPos(x + (double)offset.x * d, y + (double)offset.y * d, z + (double)offset.z * d); + super.context.setTintHex(this.paintColors[item.color - 1]); + super.context.setIcon(RedPowerMachine.tubeItemOverlay); + super.context.renderBox(63, 0.26F, 0.26F, 0.26F, 0.74F, 0.74F, 0.74F); + tess.draw(); + } + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + super.block.setBlockBoundsForItemRender(); + super.context.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + + super.context.useNormal = true; + super.context.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + super.context.useNormal = true; + if (meta >> 8 == 10) { + super.context + .setIcon( + RedPowerMachine.baseTubeFace, + RedPowerMachine.baseTubeFace, + RedPowerMachine.restrictTubeSide, + RedPowerMachine.restrictTubeSide, + RedPowerMachine.restrictTubeSide, + RedPowerMachine.restrictTubeSide + ); + } else if (meta >> 8 == 11) { + this.renderMagFins(3, meta); + super.context + .setIcon( + RedPowerMachine.magTubeFaceNR, + RedPowerMachine.magTubeFaceNR, + RedPowerMachine.magTubeSideNR, + RedPowerMachine.magTubeSideNR, + RedPowerMachine.magTubeSideNR, + RedPowerMachine.magTubeSideNR + ); + } else { + super.context + .setIcon( + RedPowerMachine.baseTubeFace, + RedPowerMachine.baseTubeFace, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide, + RedPowerMachine.baseTubeSide + ); + } + + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(63, 0.74F, 0.99F, 0.74F, 0.26F, 0.01F, 0.26F); + tess.draw(); + super.context.useNormal = false; + } + + private void doubleBox(int sides, float x1, float y1, float z1, float x2, float y2, float z2) { + int s2 = sides << 1 & 42 | sides >> 1 & 21; + super.context.renderBox(sides, (double)x1, (double)y1, (double)z1, (double)x2, (double)y2, (double)z2); + super.context.renderBox(s2, (double)x2, (double)y2, (double)z2, (double)x1, (double)y1, (double)z1); + } + + public boolean renderMagFins(int cons, int md) { + if (cons == 3) { + super.context.setTexFlags(0); + super.context + .setIcon( + RedPowerMachine.magTubeFace, + RedPowerMachine.magTubeFace, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing + ); + super.context.renderBox(63, 0.125, 0.125, 0.125, 0.875, 0.375, 0.875); + super.context.renderBox(63, 0.125, 0.625, 0.125, 0.875, 0.875, 0.875); + return true; + } else if (cons == 12) { + super.context.setTexFlags(147492); + super.context + .setIcon( + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeFace, + RedPowerMachine.magTubeFace, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing + ); + super.context.renderBox(63, 0.125, 0.125, 0.125, 0.875, 0.875, 0.375); + super.context.renderBox(63, 0.125, 0.125, 0.625, 0.875, 0.875, 0.875); + return true; + } else if (cons == 48) { + super.context.setTexFlags(2304); + super.context + .setIcon( + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeRing, + RedPowerMachine.magTubeFace, + RedPowerMachine.magTubeFace + ); + super.context.renderBox(63, 0.125, 0.125, 0.125, 0.375, 0.875, 0.875); + super.context.renderBox(63, 0.625, 0.125, 0.125, 0.875, 0.875, 0.875); + return true; + } else { + return false; + } + } + + public void renderCenterBlock(int cons, IIcon side, IIcon end) { + if (cons == 0) { + super.context.setIcon(end); + this.doubleBox(63, 0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + } else if (cons == 3) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.25F, 0.0F, 0.25F, 0.75F, 1.0F, 0.75F); + } else if (cons == 12) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 1.0F); + } else if (cons == 48) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.0F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); + } else { + super.context.setIcon(end); + this.doubleBox(63 ^ cons, 0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + if ((cons & 1) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.25F, 0.0F, 0.25F, 0.75F, 0.25F, 0.75F); + } + + if ((cons & 2) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(end, end, side, side, side, side); + this.doubleBox(60, 0.25F, 0.75F, 0.25F, 0.75F, 1.0F, 0.75F); + } + + if ((cons & 4) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.25F); + } + + if ((cons & 8) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(side, side, end, end, side, side); + this.doubleBox(51, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F, 1.0F); + } + + if ((cons & 16) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.0F, 0.25F, 0.25F, 0.25F, 0.75F, 0.75F); + } + + if ((cons & 32) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(side, side, side, side, end, end); + this.doubleBox(15, 0.75F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); + } + } + + } + + public void renderBlockPaint(int cons, IIcon faceIcon, IIcon sideIcon, int meta) { + if (cons != 0) { + if (cons == 3) { + super.context.setTexFlags(1773); + super.context.setIcon(null, null, sideIcon, sideIcon, sideIcon, sideIcon); + this.doubleBox(60, 0.25F, 0.0F, 0.25F, 0.75F, 1.0F, 0.75F); + } else if (cons == 12) { + super.context.setTexFlags(184365); + super.context.setIcon(sideIcon, sideIcon, null, null, sideIcon, sideIcon); + this.doubleBox(51, 0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 1.0F); + } else if (cons == 48) { + super.context.setTexFlags(187200); + super.context.setIcon(sideIcon, sideIcon, sideIcon, sideIcon, null, null); + this.doubleBox(15, 0.0F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); + } else { + super.context.setIcon(faceIcon); + this.doubleBox(63 ^ cons, 0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + if ((cons & 1) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(faceIcon, faceIcon, sideIcon, sideIcon, sideIcon, sideIcon); + this.doubleBox(60, 0.25F, 0.0F, 0.25F, 0.75F, 0.25F, 0.75F); + } + + if ((cons & 2) > 0) { + super.context.setTexFlags(1773); + super.context.setIcon(faceIcon, faceIcon, sideIcon, sideIcon, sideIcon, sideIcon); + this.doubleBox(60, 0.25F, 0.75F, 0.25F, 0.75F, 1.0F, 0.75F); + } + + if ((cons & 4) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(sideIcon, sideIcon, faceIcon, faceIcon, sideIcon, sideIcon); + this.doubleBox(51, 0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.25F); + } + + if ((cons & 8) > 0) { + super.context.setTexFlags(184365); + super.context.setIcon(sideIcon, sideIcon, faceIcon, faceIcon, sideIcon, sideIcon); + this.doubleBox(51, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F, 1.0F); + } + + if ((cons & 16) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(sideIcon, sideIcon, sideIcon, sideIcon, faceIcon, faceIcon); + this.doubleBox(15, 0.0F, 0.25F, 0.25F, 0.25F, 0.75F, 0.75F); + } + + if ((cons & 32) > 0) { + super.context.setTexFlags(187200); + super.context.setIcon(sideIcon, sideIcon, sideIcon, sideIcon, faceIcon, faceIcon); + this.doubleBox(15, 0.75F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/RenderWindTurbine.java b/src/main/java/com/eloraam/redpower/machine/RenderWindTurbine.java new file mode 100644 index 0000000..16cb136 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/RenderWindTurbine.java @@ -0,0 +1,145 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.Matrix3; +import com.eloraam.redpower.core.RenderContext; +import com.eloraam.redpower.core.RenderCustomBlock; +import com.eloraam.redpower.core.RenderModel; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderWindTurbine extends RenderCustomBlock { + private RenderContext turbineContext = new RenderContext(); + private RenderContext bladesContext = new RenderContext(); + private RenderModel modelWoodTurbine = RenderModel.loadModel("rpmachine:models/vawt.obj").scale(0.0625); + private RenderModel modelWoodWindmill = RenderModel.loadModel("rpmachine:models/windmill.obj").scale(0.0625); + private ResourceLocation modelRes = new ResourceLocation("rpmachine", "models/vawt.png"); + + public RenderWindTurbine(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileWindTurbine windTurbine = (TileWindTurbine)tile; + World world = windTurbine.getWorldObj(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(2896); + this.turbineContext.bindBlockTexture(); + this.turbineContext.setDefaults(); + this.turbineContext.setLocalLights(0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F); + this.turbineContext.setPos(x, y, z); + this.turbineContext.readGlobalLights(world, windTurbine.xCoord, windTurbine.yCoord, windTurbine.zCoord); + this.turbineContext + .setIcon( + RedPowerMachine.motorBottom, + RedPowerMachine.turbineFront, + RedPowerMachine.turbineSide, + RedPowerMachine.turbineSide, + RedPowerMachine.turbineSideAlt, + RedPowerMachine.turbineSideAlt + ); + this.turbineContext.setSize(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + this.turbineContext.setupBox(); + this.turbineContext.transform(); + this.turbineContext.orientTextures(windTurbine.Rotation); + tess.startDrawingQuads(); + this.turbineContext.renderGlobFaces(63); + tess.draw(); + if (windTurbine.hasBlades) { + byte wtt = windTurbine.windmillType; + this.bladesContext.bindTexture(this.modelRes); + this.bladesContext.setDefaults(); + tess.startDrawingQuads(); + WorldCoord wc = new WorldCoord(windTurbine); + wc.step(windTurbine.Rotation ^ 1); + tess.setBrightness(world.getLightBrightnessForSkyBlocks(wc.x, wc.y, wc.z, 0)); + this.bladesContext.useNormal = true; + if (windTurbine.hasBrakes) { + partialTicks = (float)((double)partialTicks * 0.1); + } + + double tm = (double)(partialTicks * (float)windTurbine.speed + (float)windTurbine.phase); + if (wtt == 2) { + tm = -tm; + } + + this.bladesContext.setOrientation(windTurbine.Rotation, 0); + this.bladesContext.basis = Matrix3.getRotY(-4.0E-6 * tm).multiply(this.bladesContext.basis); + this.bladesContext.setPos(x, y, z); + this.bladesContext.setRelPos(0.5, 0.875, 0.5); + switch(wtt) { + case 1: + this.bladesContext.bindModelOffset(this.modelWoodTurbine, 0.5, 0.5, 0.5); + break; + case 2: + this.bladesContext.bindModelOffset(this.modelWoodWindmill, 0.5, 0.5, 0.5); + break; + default: + return; + } + + this.bladesContext.setTint(1.0F, 1.0F, 1.0F); + this.bladesContext.renderModelGroup(0, 0); + switch(wtt) { + case 1: + this.bladesContext.setTint(1.0F, 1.0F, 1.0F); + this.bladesContext.renderModelGroup(1, 1); + this.bladesContext.renderModelGroup(1, 3); + this.bladesContext.renderModelGroup(1, 5); + this.bladesContext.setTint(1.0F, 0.1F, 0.1F); + this.bladesContext.renderModelGroup(1, 2); + this.bladesContext.renderModelGroup(1, 4); + this.bladesContext.renderModelGroup(1, 6); + break; + default: + this.bladesContext.setTint(1.0F, 1.0F, 1.0F); + this.bladesContext.renderModelGroup(1, 1); + this.bladesContext.renderModelGroup(1, 3); + this.bladesContext.setTint(1.0F, 0.1F, 0.1F); + this.bladesContext.renderModelGroup(1, 2); + this.bladesContext.renderModelGroup(1, 4); + } + + tess.draw(); + } + + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + super.block.setBlockBoundsForItemRender(); + this.turbineContext.setDefaults(); + if (type == ItemRenderType.INVENTORY) { + this.turbineContext.setPos(-0.5, -0.5, -0.5); + } else { + this.turbineContext.setPos(0.0, 0.0, 0.0); + } + + this.turbineContext.useNormal = true; + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + this.turbineContext + .setIcon( + RedPowerMachine.motorBottom, + RedPowerMachine.turbineFront, + RedPowerMachine.turbineSide, + RedPowerMachine.turbineSide, + RedPowerMachine.turbineSideAlt, + RedPowerMachine.turbineSideAlt + ); + this.turbineContext.renderBox(63, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + tess.draw(); + this.turbineContext.useNormal = false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileAccel.java b/src/main/java/com/eloraam/redpower/machine/TileAccel.java new file mode 100644 index 0000000..06d72fa --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileAccel.java @@ -0,0 +1,286 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.ITubeFlow; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import java.util.Iterator; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileAccel extends TileMachinePanel implements IBluePowerConnectable, ITubeFlow { + TubeFlow flow = new TubeFlow() { + @Override + public TileEntity getParent() { + return TileAccel.this; + } + + @Override + public boolean schedule(TubeItem item, TubeFlow.TubeScheduleContext context) { + item.scheduled = true; + item.progress = 0; + item.side = (byte)(item.side ^ 1); + TileAccel.this.recache(); + item.power = 0; + if (( + item.side == TileAccel.super.Rotation && (TileAccel.this.conCache & 2) > 0 + || item.side == (TileAccel.super.Rotation ^ 1) && (TileAccel.this.conCache & 8) > 0 + ) + && TileAccel.this.cond.getVoltage() >= 60.0) { + TileAccel.this.cond.drawPower((double)(100 * item.item.stackSize)); + item.power = 255; + } + + return true; + } + }; + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileAccel.this; + } + }; + private boolean hasChanged = false; + public int ConMask = -1; + public int conCache = -1; + + @Override + public int getTubeConnectableSides() { + return 3 << (super.Rotation & 6); + } + + @Override + public int getTubeConClass() { + return 17; + } + + @Override + public boolean canRouteItems() { + return true; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (state != 0) { + return false; + } else if (side != super.Rotation && side != (super.Rotation ^ 1)) { + return false; + } else { + item.side = (byte)side; + this.flow.add(item); + this.hasChanged = true; + this.markDirty(); + return true; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return state == 0; + } + + @Override + public int tubeWeight(int side, int state) { + return 0; + } + + @Override + public void addTubeItem(TubeItem ti) { + ti.side = (byte)(ti.side ^ 1); + this.flow.add(ti); + this.hasChanged = true; + this.markDirty(); + } + + @Override + public TubeFlow getTubeFlow() { + return this.flow; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 5; + } + + @Override + public int getLightValue() { + return super.Charged ? 6 : 0; + } + + public void recache() { + if (this.conCache < 0) { + WorldCoord wc = new WorldCoord(this); + ITubeConnectable fw = CoreLib.getTileEntity(super.worldObj, wc.coordStep(super.Rotation), ITubeConnectable.class); + ITubeConnectable bw = CoreLib.getTileEntity(super.worldObj, wc.coordStep(super.Rotation ^ 1), ITubeConnectable.class); + this.conCache = 0; + if (fw != null) { + int mcl = fw.getTubeConClass(); + if (mcl < 17) { + this.conCache |= 1; + } else if (mcl >= 17) { + this.conCache |= 2; + } + } + + if (bw != null) { + int mcl = bw.getTubeConClass(); + if (mcl < 17) { + this.conCache |= 4; + } else if (mcl >= 17) { + this.conCache |= 8; + } + } + } + + } + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + this.flow.onRemove(); + this.breakBlock(willHarvest); + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.flow.update()) { + this.hasChanged = true; + } + + if (this.hasChanged) { + if (!super.worldObj.isRemote) { + this.markForUpdate(); + } + + this.markDirty(); + } + + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.Flow == 0) { + if (super.Charged) { + super.Charged = false; + this.updateBlock(); + this.updateLight(); + } + } else if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + this.updateLight(); + } + } + + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + super.Rotation = this.getFacing(ent); + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, super.blockType); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + this.conCache = -1; + this.updateBlock(); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + this.flow.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + this.flow.writeToNBT(data); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + int cs = this.flow.contents.size(); + if (cs > 6) { + cs = 6; + } + + data.setInteger("cs", cs); + Iterator tii = this.flow.contents.iterator(); + + for(int i = 0; i < cs; ++i) { + TubeItem ti = (TubeItem)tii.next(); + NBTTagCompound itag = new NBTTagCompound(); + ti.writeToPacket(itag); + data.setTag("cs" + i, itag); + } + + if (this.hasChanged) { + this.hasChanged = false; + data.setBoolean("data", true); + super.writeToPacket(data); + } + + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.flow.contents.clear(); + int cs = data.getInteger("cs"); + + for(int i = 0; i < cs; ++i) { + this.flow.contents.add(TubeItem.newFromPacket((NBTTagCompound)data.getTag("cs" + i))); + } + + if (data.hasKey("data")) { + super.readFromPacket(data); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileAssemble.java b/src/main/java/com/eloraam/redpower/machine/TileAssemble.java new file mode 100644 index 0000000..b0017b4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileAssemble.java @@ -0,0 +1,357 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.FakePlayer; + +public class TileAssemble extends TileDeployBase implements ISidedInventory, IRedPowerWiring { + private ItemStack[] contents = new ItemStack[34]; + public byte select = 0; + public byte mode = 0; + public int skipSlots = 65534; + public int ConMask = -1; + public int PowerState = 0; + + @Override + public int getExtendedID() { + return 13; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 11, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 34; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (this.mode == 0) { + super.onBlockNeighborChange(block); + } + + RedPowerLib.updateCurrent(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getConnectionMask() { + if (this.ConMask >= 0) { + return this.ConMask; + } else { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + return this.ConMask; + } + } + + @Override + public int getExtConnectionMask() { + return 0; + } + + @Override + public int getPoweringMask(int ch) { + return 0; + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return 0; + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return -1; + } + + @Override + public void updateCurrentStrength() { + if (this.mode == 1) { + for(int slot = 0; slot < 16; ++slot) { + short wc = (short)RedPowerLib.getMaxCurrentStrength(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 1073741823, 0, slot + 1); + if (wc > 0) { + this.PowerState |= 1 << slot; + } else { + this.PowerState &= ~(1 << slot); + } + } + + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + if (this.PowerState == 0) { + if (super.Active) { + this.scheduleTick(5); + } + } else if (!super.Active) { + super.Active = true; + this.updateBlock(); + int var41 = Integer.numberOfTrailingZeros(this.PowerState); + if (this.contents[var41] != null) { + WorldCoord var4 = new WorldCoord(this); + var4.step(super.Rotation ^ 1); + int ms = this.getMatchingStack(var41); + if (ms >= 0) { + this.enableTowardsActive(var4, ms); + } + } + } + } + + } + + @Override + public int getConnectClass(int side) { + return this.mode == 0 ? 0 : 18; + } + + protected void packInv(ItemStack[] bkup, int act, FakePlayer player) { + for(int i = 0; i < 36; ++i) { + bkup[i] = player.inventory.getStackInSlot(i); + player.inventory.setInventorySlotContents(i, null); + } + + for(int i = 0; i < 18; ++i) { + if (act == i) { + player.inventory.setInventorySlotContents(0, this.contents[16 + i]); + } else { + player.inventory.setInventorySlotContents(i + 9, this.contents[16 + i]); + } + } + + } + + protected void unpackInv(ItemStack[] bkup, int act, FakePlayer player) { + for(int i = 0; i < 18; ++i) { + if (act == i) { + this.contents[16 + i] = player.inventory.getStackInSlot(0); + } else { + this.contents[16 + i] = player.inventory.getStackInSlot(i + 9); + } + } + + for(int i = 0; i < 36; ++i) { + player.inventory.setInventorySlotContents(i, bkup[i]); + } + + } + + protected int getMatchingStack(int stack) { + for(int i = 0; i < 18; ++i) { + ItemStack compareStack = this.contents[16 + i]; + if (this.contents[16 + i] != null && CoreLib.compareItemStack(compareStack, this.contents[stack]) == 0) { + return i; + } + } + + return -1; + } + + @Override + public void enableTowards(WorldCoord wc) { + if (this.contents[this.select] != null) { + int i = this.getMatchingStack(this.select); + if (i >= 0) { + this.enableTowardsActive(wc, i); + } + } + + for(int i = 0; i < 16; ++i) { + this.select = (byte)(this.select + 1 & 15); + if ((this.skipSlots & 1 << this.select) == 0 || this.select == 0) { + break; + } + } + + } + + protected void enableTowardsActive(WorldCoord wc, int act) { + ItemStack[] bkup = new ItemStack[36]; + FakePlayer player = CoreLib.getRedpowerPlayer(super.worldObj, super.xCoord, super.yCoord, super.zCoord, super.Rotation, super.Owner); + this.packInv(bkup, act, player); + ItemStack ist = this.contents[16 + act]; + if (ist != null && ist.stackSize > 0 && this.tryUseItemStack(ist, wc.x, wc.y, wc.z, 0, player)) { + if (player.isUsingItem()) { + player.stopUsingItem(); + } + + this.unpackInv(bkup, act, player); + if (this.contents[16 + act].stackSize == 0) { + this.contents[16 + act] = null; + } + + this.markDirty(); + } else { + this.unpackInv(bkup, act, player); + } + + } + + public int getSizeInventory() { + return 34; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + if (ist != null && i < 16) { + this.skipSlots &= ~(1 << i); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpassemble.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.mode = data.getByte("mode"); + this.select = data.getByte("sel"); + this.skipSlots = data.getShort("ssl"); + this.PowerState = data.getInteger("psex"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setByte("mode", this.mode); + data.setByte("sel", this.select); + data.setShort("ssl", (short)this.skipSlots); + data.setInteger("psex", this.PowerState); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.readFromPacket(tag); + this.mode = tag.getByte("mode"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + super.writeToPacket(tag); + tag.setByte("mode", this.mode); + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != (super.Rotation ^ 1) ? IntStream.range(16, 24).toArray() : new int[0]; + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + return side != (super.Rotation ^ 1) && slotID >= 16 && slotID < 24; + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return side != (super.Rotation ^ 1) && slotID >= 16 && slotID < 24; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileBatteryBox.java b/src/main/java/com/eloraam/redpower/machine/TileBatteryBox.java new file mode 100644 index 0000000..2eda10f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileBatteryBox.java @@ -0,0 +1,374 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileExtended; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class TileBatteryBox extends TileExtended implements IBluePowerConnectable, ISidedInventory, IFrameSupport { + BluePowerConductor cond = new BluePowerConductor() { + @Override + public TileEntity getParent() { + return TileBatteryBox.this; + } + + @Override + public double getInvCap() { + return 0.25; + } + }; + protected ItemStack[] contents = new ItemStack[2]; + public int Charge = 0; + public int Storage = 0; + public int ConMask = -1; + public boolean Powered = false; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + public int[] getAccessibleSlotsFromSide(int side) { + switch(side) { + case 0: + return new int[]{0}; + case 1: + return new int[]{1}; + default: + return new int[0]; + } + } + + @Override + public void addHarvestContents(List ist) { + ItemStack is = new ItemStack(this.getBlockType(), 1, this.getExtendedID()); + if (this.Storage > 0) { + is.setTagCompound(new NBTTagCompound()); + is.stackTagCompound.setShort("batLevel", (short)this.Storage); + } + + ist.add(is); + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + if (ist.stackTagCompound != null) { + this.Storage = ist.stackTagCompound.getShort("batLevel"); + } + + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public int getExtendedID() { + return 6; + } + + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + public int getMaxStorage() { + return 6000; + } + + public int getStorageForRender() { + return Math.max(0, Math.min(this.Storage * 8 / this.getMaxStorage(), 8)); + } + + public int getChargeScaled(int i) { + return Math.min(i, i * this.Charge / 1000); + } + + public int getStorageScaled(int i) { + return Math.min(i, i * this.Storage / this.getMaxStorage()); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + this.Charge = (int)(this.cond.getVoltage() * 10.0); + int rs = this.getStorageForRender(); + if (this.contents[0] != null && this.Storage > 0) { + if (this.contents[0].getItem() == RedPowerMachine.itemBatteryEmpty) { + this.contents[0] = new ItemStack(RedPowerMachine.itemBatteryPowered, 1, RedPowerMachine.itemBatteryPowered.getMaxDamage()); + this.markDirty(); + } + + if (this.contents[0].getItem() == RedPowerMachine.itemBatteryPowered) { + int n = Math.min(this.contents[0].getItemDamage() - 1, this.Storage); + n = Math.min(n, 25); + this.Storage -= n; + this.contents[0].setItemDamage(this.contents[0].getItemDamage() - n); + this.markDirty(); + } + } + + if (this.contents[1] != null && this.contents[1].getItem() == RedPowerMachine.itemBatteryPowered) { + int n = Math.min(this.contents[1].getMaxDamage() - this.contents[1].getItemDamage(), this.getMaxStorage() - this.Storage); + n = Math.min(n, 25); + this.Storage += n; + this.contents[1].setItemDamage(this.contents[1].getItemDamage() + n); + if (this.contents[1].getItemDamage() == this.contents[1].getMaxDamage()) { + this.contents[1] = new ItemStack(RedPowerMachine.itemBatteryEmpty, 1); + } + + this.markDirty(); + } + + if (this.Charge > 900 && this.Storage < this.getMaxStorage()) { + int n = Math.min((this.Charge - 900) / 10, 10); + n = Math.min(n, this.getMaxStorage() - this.Storage); + this.cond.drawPower((double)(n * 1000)); + this.Storage += n; + } else if (this.Charge < 800 && this.Storage > 0 && !this.Powered) { + int n = Math.min((800 - this.Charge) / 10, 10); + n = Math.min(n, this.Storage); + this.cond.applyPower((double)(n * 1000)); + this.Storage -= n; + } + + if (rs != this.getStorageForRender()) { + this.updateBlock(); + } + } + + } + + public int getSizeInventory() { + return 2; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpbatbox.name"; + } + + public int getInventoryStackLimit() { + return 1; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (!this.Powered) { + this.Powered = true; + this.markDirty(); + } + } else if (this.Powered) { + this.Powered = false; + this.markDirty(); + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 8, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + super.onBlockRemoval(); + + for(int i = 0; i < 2; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setInteger("stor", this.Storage); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Storage = tag.getInteger("stor"); + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int k = 0; k < items.tagCount(); ++k) { + NBTTagCompound item = items.getCompoundTagAt(k); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.cond.readFromNBT(data); + this.Charge = data.getShort("chg"); + this.Storage = data.getShort("stor"); + byte var6 = data.getByte("ps"); + this.Powered = (var6 & 1) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int ps = 0; ps < this.contents.length; ++ps) { + if (this.contents[ps] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)ps); + this.contents[ps].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + this.cond.writeToNBT(data); + data.setShort("chg", (short)this.Charge); + data.setShort("stor", (short)this.Storage); + int var5 = this.Powered ? 1 : 0; + data.setByte("ps", (byte)var5); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Storage = tag.getInteger("stor"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("stor", this.Storage); + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return true; + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return true; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return stack.getItem() == RedPowerMachine.itemBatteryEmpty || stack.getItem() == RedPowerMachine.itemBatteryPowered; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileBlueAlloyFurnace.java b/src/main/java/com/eloraam/redpower/machine/TileBlueAlloyFurnace.java new file mode 100644 index 0000000..459b7b0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileBlueAlloyFurnace.java @@ -0,0 +1,297 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.base.TileAppliance; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.EnumSkyBlock; + +public class TileBlueAlloyFurnace extends TileAppliance implements IInventory, ISidedInventory, IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileBlueAlloyFurnace.this; + } + }; + private ItemStack[] contents = new ItemStack[10]; + int cooktime = 0; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 64; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + private void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getExtendedID() { + return 4; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.getVoltage() < 60.0) { + if (super.Active && this.cond.Flow == 0) { + super.Active = false; + this.updateBlock(); + this.updateLight(); + } + } else { + boolean cs = this.canSmelt(); + if (cs) { + if (!super.Active) { + super.Active = true; + this.updateBlock(); + this.updateLight(); + } + + ++this.cooktime; + this.cond.drawPower(1000.0); + if (this.cooktime >= 100) { + this.cooktime = 0; + this.smeltItem(); + this.markDirty(); + } + } else { + if (super.Active) { + super.Active = false; + this.updateBlock(); + this.updateLight(); + } + + this.cooktime = 0; + } + } + } + + } + + private boolean canSmelt() { + ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, false); + if (ist == null) { + return false; + } else if (this.contents[9] == null) { + return true; + } else if (!this.contents[9].isItemEqual(ist)) { + return false; + } else { + int st = this.contents[9].stackSize + ist.stackSize; + return st <= this.getInventoryStackLimit() && st <= ist.getMaxStackSize(); + } + } + + private void smeltItem() { + if (this.canSmelt()) { + ItemStack ist = CraftLib.getAlloyResult(this.contents, 0, 9, true); + if (this.contents[9] == null) { + this.contents[9] = ist.copy(); + } else { + this.contents[9].stackSize += ist.stackSize; + } + } + + } + + int getCookScaled(int i) { + return this.cooktime * i / 100; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 10, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 10; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + public int getSizeInventory() { + return 10; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpbafurnace.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.cooktime = data.getShort("CookTime"); + this.cond.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setShort("CookTime", (short)this.cooktime); + this.cond.writeToNBT(data); + } + + public int[] getAccessibleSlotsFromSide(int side) { + switch(side) { + case 0: + return new int[]{9}; + case 1: + return IntStream.range(0, 9).toArray(); + default: + return new int[0]; + } + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return side == 0 && slotID >= 0 && slotID < 9; + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return slotID == 9; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return slotID >= 0 && slotID < 9; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileBlueFurnace.java b/src/main/java/com/eloraam/redpower/machine/TileBlueFurnace.java new file mode 100644 index 0000000..2de7500 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileBlueFurnace.java @@ -0,0 +1,310 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.base.TileAppliance; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.EnumSkyBlock; + +public class TileBlueFurnace extends TileAppliance implements IInventory, ISidedInventory, IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileBlueFurnace.this; + } + }; + private ItemStack[] contents = new ItemStack[2]; + public int cooktime = 0; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 64; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + private void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.getVoltage() < 60.0) { + if (super.Active && this.cond.Flow == 0) { + super.Active = false; + this.updateBlock(); + this.updateLight(); + } + } else { + boolean cs = this.canSmelt(); + if (cs) { + if (!super.Active) { + super.Active = true; + this.updateBlock(); + this.updateLight(); + } + + ++this.cooktime; + this.cond.drawPower(1000.0); + if (this.cooktime >= 100) { + this.cooktime = 0; + this.smeltItem(); + this.markDirty(); + } + } else { + if (super.Active) { + super.Active = false; + this.updateBlock(); + this.updateLight(); + } + + this.cooktime = 0; + } + } + } + + } + + private boolean canSmelt() { + if (this.contents[0] == null) { + return false; + } else { + ItemStack ist = FurnaceRecipes.smelting().getSmeltingResult(this.contents[0]); + if (ist == null) { + return false; + } else if (this.contents[1] == null) { + return true; + } else if (!this.contents[1].isItemEqual(ist)) { + return false; + } else { + int st = this.contents[1].stackSize + ist.stackSize; + return st <= this.getInventoryStackLimit() && st <= ist.getMaxStackSize(); + } + } + } + + private void smeltItem() { + if (this.canSmelt()) { + ItemStack ist = FurnaceRecipes.smelting().getSmeltingResult(this.contents[0]); + if (this.contents[1] == null) { + this.contents[1] = ist.copy(); + } else if (this.contents[1].isItemEqual(ist)) { + this.contents[1].stackSize += ist.stackSize; + } + + if (this.contents[0].getItem().getContainerItem() != null) { + this.contents[0] = new ItemStack(this.contents[0].getItem().getContainerItem()); + } else { + --this.contents[0].stackSize; + } + + if (this.contents[0].stackSize <= 0) { + this.contents[0] = null; + } + } + + } + + int getCookScaled(int i) { + return this.cooktime * i / 100; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 3, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 2; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + public int getSizeInventory() { + return 2; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpbfurnace.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.cooktime = data.getShort("CookTime"); + this.cond.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setShort("CookTime", (short)this.cooktime); + this.cond.writeToNBT(data); + } + + public int[] getAccessibleSlotsFromSide(int side) { + switch(side) { + case 0: + return new int[]{1}; + case 1: + return new int[]{0}; + default: + return new int[0]; + } + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + return side == 1 && slotID == 0; + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return side == 0 && slotID == 1; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return slotID == 0; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileBreaker.java b/src/main/java/com/eloraam/redpower/machine/TileBreaker.java new file mode 100644 index 0000000..aa4dd85 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileBreaker.java @@ -0,0 +1,185 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IConnectable; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.FakePlayer; + +public class TileBreaker extends TileMachine implements ITubeConnectable, IFrameLink, IConnectable { + TubeBuffer buffer = new TubeBuffer(); + + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return dir != (super.Rotation ^ 1); + } + + @Override + public boolean canFrameConnectOut(int dir) { + return false; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public int getConnectableMask() { + return 1073741823 ^ RedPowerLib.getConDirMask(super.Rotation ^ 1); + } + + @Override + public int getConnectClass(int side) { + return 0; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public int getTubeConnectableSides() { + return 1 << super.Rotation; + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + this.buffer.addBounce(item); + super.Active = true; + this.scheduleTick(5); + return true; + } else { + return false; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2; + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + int cm = this.getConnectableMask(); + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cm, cm >> 24)) { + if (!super.Powered) { + super.Powered = true; + this.markDirty(); + if (!super.Active) { + WorldCoord wc = new WorldCoord(super.xCoord, super.yCoord, super.zCoord); + wc.step(super.Rotation ^ 1); + Block bid = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if (bid != Blocks.air + && bid.getBlockHardness(super.worldObj, wc.x, wc.y, wc.z) != -1.0F + && bid != Blocks.bedrock + && bid.getBlockHardness(super.worldObj, wc.x, wc.y, wc.z) >= 0.0F) { + super.Active = true; + this.updateBlock(); + int md = super.worldObj.getBlockMetadata(wc.x, wc.y, wc.z); + FakePlayer player = CoreLib.getRedpowerPlayer(super.worldObj, super.xCoord, super.yCoord, super.zCoord, super.Rotation, super.Owner); + this.buffer.addAll(bid.getDrops(super.worldObj, wc.x, wc.y, wc.z, md, 0)); + super.worldObj.setBlockToAir(wc.x, wc.y, wc.z); + + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(5); + } + } + } + } + } else { + if (super.Active && !this.isTickScheduled()) { + this.scheduleTick(5); + } + + if (super.Powered) { + super.Powered = false; + } + } + + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } + + } + + @Override + public void onBlockRemoval() { + this.buffer.onRemove(this); + } + + @Override + public void onTileTick() { + if (!this.buffer.isEmpty()) { + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else if (!super.Powered) { + super.Active = false; + this.updateBlock(); + } + + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.buffer.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.buffer.writeToNBT(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileBufferChest.java b/src/main/java/com/eloraam/redpower/machine/TileBufferChest.java new file mode 100644 index 0000000..cd73660 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileBufferChest.java @@ -0,0 +1,229 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.base.TileAppliance; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRotatable; +import java.util.stream.IntStream; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import org.apache.commons.lang3.ArrayUtils; + +public class TileBufferChest extends TileAppliance implements IInventory, ISidedInventory, IRotatable { + private ItemStack[] contents = new ItemStack[20]; + + @Override + public int getExtendedID() { + return 2; + } + + public boolean canUpdate() { + return true; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 4, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + public int getFacing(EntityLivingBase ent) { + int yawrx = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (Math.abs(ent.posX - (double)super.xCoord) < 2.0 && Math.abs(ent.posZ - (double)super.zCoord) < 2.0) { + double p = ent.posY + 1.82 - (double)ent.yOffset - (double)super.yCoord; + if (p > 2.0) { + return 0; + } + + if (p < 0.0) { + return 1; + } + } + + switch(yawrx) { + case 0: + return 3; + case 1: + return 4; + case 2: + return 2; + default: + return 5; + } + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + super.Rotation = this.getFacing(ent); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 20; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 5; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : super.Rotation; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec) { + super.Rotation = rot; + this.updateBlockChange(); + } + + } + + public int getSizeInventory() { + return 20; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpbuffer.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + } + + public int[] getAccessibleSlotsFromSide(int side) { + boolean isFront = side == (super.Rotation ^ 1); + int start = isFront ? 0 : 4 * ((5 + side - (super.Rotation ^ 1)) % 6); + int end = isFront ? 20 : start + 4; + return IntStream.range(start, end).toArray(); + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + int[] slots = this.getAccessibleSlotsFromSide(side); + return ArrayUtils.contains(slots, slotID); + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + int[] slots = this.getAccessibleSlotsFromSide(side); + return ArrayUtils.contains(slots, slotID); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileChargingBench.java b/src/main/java/com/eloraam/redpower/machine/TileChargingBench.java new file mode 100644 index 0000000..9cd8053 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileChargingBench.java @@ -0,0 +1,287 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.base.TileAppliance; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IChargeable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +public class TileChargingBench extends TileAppliance implements IInventory, IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileChargingBench.this; + } + }; + public boolean Powered = false; + public int Storage = 0; + private ItemStack[] contents = new ItemStack[16]; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 64; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int getLightValue() { + return 0; + } + + @Override + public int getExtendedID() { + return 5; + } + + public int getMaxStorage() { + return 3000; + } + + public int getStorageForRender() { + return this.Storage * 4 / this.getMaxStorage(); + } + + public int getChargeScaled(int i) { + return Math.min(i, i * this.cond.Charge / 1000); + } + + public int getStorageScaled(int i) { + return Math.min(i, i * this.Storage / this.getMaxStorage()); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.Flow == 0) { + if (this.Powered) { + this.Powered = false; + this.updateBlock(); + } + } else if (!this.Powered) { + this.Powered = true; + this.updateBlock(); + } + + int rs = this.getStorageForRender(); + if (this.cond.Charge > 600 && this.Storage < this.getMaxStorage()) { + int lastact = Math.min((this.cond.Charge - 600) / 40, 5); + lastact = Math.min(lastact, this.getMaxStorage() - this.Storage); + this.cond.drawPower((double)(lastact * 1000)); + this.Storage += lastact; + } + + boolean var5 = super.Active; + super.Active = false; + if (this.Storage > 0) { + for(int i = 0; i < 16; ++i) { + if (this.contents[i] != null && this.contents[i].getItem() instanceof IChargeable && this.contents[i].getItemDamage() > 1) { + int d = Math.min(this.contents[i].getItemDamage() - 1, this.Storage); + d = Math.min(d, 25); + this.contents[i].setItemDamage(this.contents[i].getItemDamage() - d); + this.Storage -= d; + this.markDirty(); + super.Active = true; + } + } + } + + if (rs != this.getStorageForRender() || var5 != super.Active) { + this.updateBlock(); + } + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 14, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 2; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + public int getSizeInventory() { + return 16; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpcharge.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int k = 0; k < items.tagCount(); ++k) { + NBTTagCompound item = items.getCompoundTagAt(k); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.cond.readFromNBT(data); + this.Storage = data.getShort("stor"); + byte var6 = data.getByte("ps"); + this.Powered = (var6 & 1) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + this.cond.writeToNBT(data); + data.setShort("stor", (short)this.Storage); + int ps = this.Powered ? 1 : 0; + data.setByte("ps2", (byte)ps); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.Rotation = tag.getByte("rot"); + int ps = tag.getByte("ps"); + super.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Storage = tag.getInteger("stor"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)super.Rotation); + tag.setByte("ps", (byte)((super.Active ? 1 : 0) | (this.Powered ? 2 : 0))); + tag.setInteger("stor", this.Storage); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return itemStack.getItem() instanceof IChargeable; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileDeploy.java b/src/main/java/com/eloraam/redpower/machine/TileDeploy.java new file mode 100644 index 0000000..c42e4c2 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileDeploy.java @@ -0,0 +1,201 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.FakePlayer; + +public class TileDeploy extends TileDeployBase implements ISidedInventory { + private ItemStack[] contents = new ItemStack[9]; + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 1, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 9; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + protected void packInv(ItemStack[] bkup, FakePlayer player) { + for(int i = 0; i < 9; ++i) { + bkup[i] = player.inventory.getStackInSlot(i); + player.inventory.setInventorySlotContents(i, this.contents[i]); + } + + } + + protected void unpackInv(ItemStack[] bkup, FakePlayer player) { + for(int i = 0; i < 9; ++i) { + this.contents[i] = player.inventory.getStackInSlot(i); + player.inventory.setInventorySlotContents(i, bkup[i]); + } + + } + + @Override + public void enableTowards(WorldCoord wc) { + ItemStack[] bkup = new ItemStack[9]; + FakePlayer player = CoreLib.getRedpowerPlayer(super.worldObj, super.xCoord, super.yCoord, super.zCoord, super.Rotation, super.Owner); + this.packInv(bkup, player); + + for(int i = 0; i < 9; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0 && this.tryUseItemStack(ist, wc.x, wc.y, wc.z, i, player)) { + if (player.isUsingItem()) { + player.stopUsingItem(); + } + + this.unpackInv(bkup, player); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return; + } + } + + this.unpackInv(bkup, player); + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpdeploy.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != (super.Rotation ^ 1) ? IntStream.range(0, 9).toArray() : new int[0]; + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + return side != (super.Rotation ^ 1); + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return side != (super.Rotation ^ 1); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileDeployBase.java b/src/main/java/com/eloraam/redpower/machine/TileDeployBase.java new file mode 100644 index 0000000..b38fc26 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileDeployBase.java @@ -0,0 +1,178 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.IConnectable; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.common.eventhandler.Event.Result; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; + +public abstract class TileDeployBase extends TileMachine implements IFrameLink, IConnectable { + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return dir != (super.Rotation ^ 1); + } + + @Override + public boolean canFrameConnectOut(int dir) { + return false; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public int getConnectableMask() { + return 1073741823 ^ RedPowerLib.getConDirMask(super.Rotation ^ 1); + } + + @Override + public int getConnectClass(int side) { + return 0; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + protected static Entity traceEntities(World world, Entity exclude, Vec3 vs, Vec3 vlook) { + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(vs.xCoord, vs.yCoord, vs.zCoord, vs.xCoord, vs.yCoord, vs.zCoord); + List elist = world.getEntitiesWithinAABBExcludingEntity( + exclude, aabb.addCoord(vlook.xCoord, vlook.yCoord, vlook.zCoord).expand(1.0, 1.0, 1.0) + ); + Vec3 v2 = vs.addVector(vlook.xCoord, vlook.yCoord, vlook.zCoord); + Entity entHit = null; + double edis = 0.0; + + for(Entity ent : elist) { + if (ent.canBeCollidedWith()) { + float cbs = ent.getCollisionBorderSize(); + AxisAlignedBB ab2 = ent.boundingBox.expand((double)cbs, (double)cbs, (double)cbs); + if (ab2.isVecInside(vs)) { + entHit = ent; + break; + } + + MovingObjectPosition mop = ab2.calculateIntercept(vs, v2); + if (mop != null) { + double d = vs.distanceTo(mop.hitVec); + if (d < edis || edis == 0.0) { + entHit = ent; + edis = d; + } + } + } + } + + return entHit; + } + + protected boolean useOnEntity(Entity ent, FakePlayer player) { + if (ent.interactFirst(player)) { + return true; + } else { + ItemStack ist = player.getCurrentEquippedItem(); + if (ist != null && ent instanceof EntityLiving) { + int iss = ist.stackSize; + ist.interactWithEntity(player, (EntityLivingBase)ent); + if (ist.stackSize != iss) { + return true; + } + } + + return false; + } + } + + protected boolean tryUseItemStack(ItemStack ist, int x, int y, int z, int slot, FakePlayer player) { + player.inventory.currentItem = slot; + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation ^ 1); + if (!ForgeEventFactory.onPlayerInteract(player, Action.RIGHT_CLICK_BLOCK, wc.x, wc.y, wc.z, super.Rotation ^ 1, super.worldObj).isCanceled()) { + if (ist.getItem() != Items.dye && ist.getItem() != Items.minecart && ist.getItem() != Items.furnace_minecart && ist.getItem() != Items.chest_minecart) { + if (ist.getItem().onItemUseFirst(ist, player, super.worldObj, x, y, z, 1, 0.5F, 0.5F, 0.5F)) { + return true; + } + + if (ist.getItem().onItemUse(ist, player, super.worldObj, x, y - 1, z, 1, 0.5F, 0.5F, 0.5F)) { + return true; + } + } else if (ist.getItem().onItemUse(ist, player, super.worldObj, x, y, z, 1, 0.5F, 0.5F, 0.5F)) { + return true; + } + + int iss = ist.stackSize; + PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(player, Action.RIGHT_CLICK_AIR, 0, 0, 0, -1, super.worldObj); + if (event.useItem != Result.DENY) { + ItemStack ost = ist.useItemRightClick(super.worldObj, player); + if (ost == ist && ost.stackSize == iss) { + Vec3 lv = player.getLook(1.0F); + lv.xCoord *= 2.5; + lv.yCoord *= 2.5; + lv.zCoord *= 2.5; + Vec3 sv = Vec3.createVectorHelper((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5); + Entity ent = traceEntities(super.worldObj, player, sv, lv); + return ent != null && this.useOnEntity(ent, player); + } + + player.inventory.setInventorySlotContents(slot, ost); + return true; + } + } + + return false; + } + + public abstract void enableTowards(WorldCoord var1); + + @Override + public void onBlockNeighborChange(Block block) { + int cm = this.getConnectableMask(); + if (!RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cm, cm >> 24)) { + if (super.Active) { + this.scheduleTick(5); + } + } else if (!super.Active) { + super.Active = true; + this.updateBlock(); + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation ^ 1); + this.enableTowards(wc); + } + + } + + @Override + public void onTileTick() { + super.Active = false; + this.updateBlock(); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileEject.java b/src/main/java/com/eloraam/redpower/machine/TileEject.java new file mode 100644 index 0000000..1bf6b3e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileEject.java @@ -0,0 +1,49 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +public class TileEject extends TileEjectBase { + @Override + public int getExtendedID() { + return 14; + } + + @Override + public void onBlockNeighborChange(Block block) { + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (!super.Powered) { + super.Powered = true; + this.markDirty(); + if (!super.Active) { + super.Active = true; + if (this.handleExtract()) { + this.updateBlock(); + } + } + } + } else { + if (super.Active && !this.isTickScheduled()) { + this.scheduleTick(5); + } + + super.Powered = false; + this.markDirty(); + } + + } + + protected boolean handleExtract() { + for(int n = 0; n < this.getSizeInventory(); ++n) { + ItemStack ist = this.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + this.addToBuffer(this.decrStackSize(n, 1)); + this.drainBuffer(); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileEjectBase.java b/src/main/java/com/eloraam/redpower/machine/TileEjectBase.java new file mode 100644 index 0000000..13a7bb3 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileEjectBase.java @@ -0,0 +1,240 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class TileEjectBase extends TileMachine implements ISidedInventory, ITubeConnectable { + TubeBuffer buffer = new TubeBuffer(); + protected ItemStack[] contents = new ItemStack[9]; + + @Override + public int getTubeConnectableSides() { + return 1 << super.Rotation; + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + this.buffer.addBounce(item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return true; + } else { + return false; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2; + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + protected void addToBuffer(ItemStack ist) { + this.buffer.addNew(ist); + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 12, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + for(int i = 0; i < 9; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + this.buffer.onRemove(this); + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } + + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (!this.buffer.isEmpty()) { + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else if (!super.Powered) { + super.Active = false; + this.updateBlock(); + } + } + + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpeject.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.buffer.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + this.buffer.writeToNBT(data); + } + + public int[] getAccessibleSlotsFromSide(int side) { + return IntStream.range(0, 9).toArray(); + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + return side != super.Rotation; + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return side != super.Rotation; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileFilter.java b/src/main/java/com/eloraam/redpower/machine/TileFilter.java new file mode 100644 index 0000000..4891b69 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileFilter.java @@ -0,0 +1,252 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TubeItem; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class TileFilter extends TileTranspose implements ISidedInventory { + protected ItemStack[] contents = new ItemStack[9]; + protected MachineLib.FilterMap filterMap = null; + public byte color = 0; + + protected void regenFilterMap() { + this.filterMap = MachineLib.makeFilterMap(this.contents); + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == (super.Rotation ^ 1) && state == 1) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + return this.filterMap.size() == 0 + ? super.tubeItemEnter(side, state, item) + : this.filterMap.containsKey(item.item) && super.tubeItemEnter(side, state, item); + } else { + return super.tubeItemEnter(side, state, item); + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + if (side == (super.Rotation ^ 1) && state == 1) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + return this.filterMap.size() == 0 + ? super.tubeItemCanEnter(side, state, item) + : this.filterMap.containsKey(item.item) && super.tubeItemCanEnter(side, state, item); + } else { + return super.tubeItemCanEnter(side, state, item); + } + } + + @Override + protected void addToBuffer(ItemStack ist) { + super.buffer.addNewColor(ist, this.color); + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 2, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public int getExtendedID() { + return 3; + } + + @Override + public void onBlockRemoval() { + super.onBlockRemoval(); + + for(int i = 0; i < 9; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + protected boolean handleExtract(IInventory inv, int[] slots) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + ItemStack sm1 = MachineLib.collectOneStack(inv, slots, null); + if (sm1 == null) { + return false; + } else { + super.buffer.addNewColor(sm1, this.color); + this.drainBuffer(); + return true; + } + } else { + int sm = MachineLib.matchAnyStack(this.filterMap, inv, slots); + if (sm < 0) { + return false; + } else { + ItemStack coll = MachineLib.collectOneStack(inv, slots, this.contents[sm]); + super.buffer.addNewColor(coll, this.color); + this.drainBuffer(); + return true; + } + } + } + + @Override + protected boolean suckFilter(ItemStack ist) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + return this.filterMap.size() == 0 || this.filterMap.containsKey(ist); + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpfilter.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void markDirty() { + this.filterMap = null; + super.markDirty(); + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.color = data.getByte("color"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setByte("color", this.color); + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != super.Rotation && side != (super.Rotation ^ 1) ? IntStream.range(0, 9).toArray() : new int[0]; + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileFrame.java b/src/main/java/com/eloraam/redpower/machine/TileFrame.java new file mode 100644 index 0000000..cd5b240 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileFrame.java @@ -0,0 +1,318 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.TileCoverable; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.WorldCoord; +import com.mojang.authlib.GameProfile; +import java.util.Arrays; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileFrame extends TileCoverable implements IFrameLink, IFrameSupport { + public int CoverSides = 0; + public int StickySides = 63; + public short[] Covers = new short[6]; + + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public boolean canFrameConnectOut(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + } + + public Block getBlockType() { + return RedPowerMachine.blockFrame; + } + + @Override + public int getPartsMask() { + return this.CoverSides | 536870912; + } + + @Override + public int getSolidPartsMask() { + return this.CoverSides | 536870912; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerMachine.blockFrame, 1)); + } + + if (this.CoverSides > 0) { + this.replaceWithCovers(); + this.updateBlockChange(); + } else { + this.deleteBlock(); + } + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public void addHarvestContents(List ist) { + super.addHarvestContents(ist); + ist.add(new ItemStack(RedPowerMachine.blockFrame, 1)); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockMachine bl = RedPowerMachine.blockMachine; + return part == 29 ? player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F) : super.getPartStrength(player, part); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public boolean canAddCover(int side, int cover) { + if (side > 5) { + return false; + } else { + int n = cover >> 8; + return (n == 0 || n == 1 || n == 3 || n == 4) && (this.CoverSides & 1 << side) <= 0; + } + } + + private void rebuildSticky() { + int ss = 0; + + for(int i = 0; i < 6; ++i) { + int m = 1 << i; + if ((this.CoverSides & m) == 0) { + ss |= m; + } else { + int n = this.Covers[i] >> 8; + if (n == 1 || n == 4) { + ss |= m; + } + } + } + + this.StickySides = ss; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!this.canAddCover(side, cover)) { + return false; + } else { + this.CoverSides |= 1 << side; + this.Covers[side] = (short)cover; + this.rebuildSticky(); + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + if ((this.CoverSides & 1 << side) == 0) { + return -1; + } else { + this.CoverSides &= ~(1 << side); + short tr = this.Covers[side]; + this.Covers[side] = 0; + this.rebuildSticky(); + this.updateBlockChange(); + return tr; + } + } + + @Override + public int getCover(int side) { + return (this.CoverSides & 1 << side) == 0 ? -1 : this.Covers[side]; + } + + @Override + public int getCoverMask() { + return this.CoverSides; + } + + public void replaceWithCovers() { + short[] covs = Arrays.copyOf(this.Covers, 29); + GameProfile owner = super.Owner; + CoverLib.replaceWithCovers(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.CoverSides, covs); + TileExtended te = CoreLib.getTileEntity(super.worldObj, super.xCoord, super.yCoord, super.zCoord, TileExtended.class); + if (te != null) { + te.Owner = owner; + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 6; ++i) { + if ((this.CoverSides & 1 << i) != 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + tag.setByteArray("cvs", cov); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + int cs2 = tag.getInteger("cvm") & 63; + this.CoverSides |= cs2; + byte[] cov = tag.getByteArray("cvs"); + if (cov != null && cs2 > 0) { + int sp = 0; + + for(int i = 0; i < 6; ++i) { + if ((cs2 & 1 << i) != 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + this.markForUpdate(); + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + int cs2 = data.getInteger("cvm") & 63; + this.CoverSides |= cs2; + byte[] cov = data.getByteArray("cvs"); + if (cov != null && cs2 > 0) { + int sp = 0; + + for(int i = 0; i < 6; ++i) { + if ((cs2 & 1 << i) != 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + this.rebuildSticky(); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 6; ++i) { + if ((this.CoverSides & 1 << i) != 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + data.setByteArray("cvs", cov); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + int cs2 = tag.getInteger("cvm") & 63; + this.CoverSides = cs2; + byte[] cov = tag.getByteArray("cvs"); + if (cov != null && cs2 > 0) { + int sp = 0; + + for(int i = 0; i < 6; ++i) { + if ((cs2 & 1 << i) != 0) { + this.Covers[i] = (short)((cov[sp] & 255) + ((cov[sp + 1] & 255) << 8)); + sp += 2; + } + } + } + + this.rebuildSticky(); + this.markForUpdate(); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("cvm", this.CoverSides); + byte[] cov = new byte[Integer.bitCount(this.CoverSides) * 2]; + int dp = 0; + + for(int i = 0; i < 6; ++i) { + if ((this.CoverSides & 1 << i) != 0) { + cov[dp] = (byte)(this.Covers[i] & 255); + cov[dp + 1] = (byte)(this.Covers[i] >> 8); + dp += 2; + } + } + + tag.setByteArray("cvs", cov); + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(RedPowerMachine.blockFrame, 1); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileFrameMoving.java b/src/main/java/com/eloraam/redpower/machine/TileFrameMoving.java new file mode 100644 index 0000000..228040c --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileFrameMoving.java @@ -0,0 +1,432 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileMultipart; +import com.eloraam.redpower.core.WorldCoord; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +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.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileFrameMoving extends TileMultipart implements IFrameLink { + private TileFrameMoving.FrameBlockAccess frameBlockAccess = new TileFrameMoving.FrameBlockAccess(); + public int motorX; + public int motorY; + public int motorZ; + public Block movingBlock = Blocks.air; + public int movingBlockMeta = 0; + public boolean movingCrate = false; + public TileEntity movingTileEntity = null; + public byte lastMovePos = 0; + + @Override + public boolean isFrameMoving() { + return true; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return true; + } + + @Override + public boolean canFrameConnectOut(int dir) { + return true; + } + + @Override + public WorldCoord getFrameLinkset() { + return new WorldCoord(this.motorX, this.motorY, this.motorZ); + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public void onBlockNeighborChange(Block block) { + } + + public Block getBlockType() { + return RedPowerMachine.blockFrame; + } + + @Override + public int getPartsMask() { + return this.movingBlock == Blocks.air ? 0 : 536870912; + } + + @Override + public int getSolidPartsMask() { + return this.movingBlock == Blocks.air ? 0 : 536870912; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + } + + @Override + public void addHarvestContents(List ist) { + super.addHarvestContents(ist); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + return 0.0F; + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + TileMotor tm = CoreLib.getTileEntity(super.worldObj, this.motorX, this.motorY, this.motorZ, TileMotor.class); + if (tm != null) { + float ofs = tm.getMoveScaled(); + switch(tm.MoveDir) { + case 0: + block.setBlockBounds(0.0F, 0.0F - ofs, 0.0F, 1.0F, 1.0F - ofs, 1.0F); + break; + case 1: + block.setBlockBounds(0.0F, 0.0F + ofs, 0.0F, 1.0F, 1.0F + ofs, 1.0F); + break; + case 2: + block.setBlockBounds(0.0F, 0.0F, 0.0F - ofs, 1.0F, 1.0F, 1.0F - ofs); + break; + case 3: + block.setBlockBounds(0.0F, 0.0F, 0.0F + ofs, 1.0F, 1.0F, 1.0F + ofs); + break; + case 4: + block.setBlockBounds(0.0F - ofs, 0.0F, 0.0F, 1.0F - ofs, 1.0F, 1.0F); + break; + case 5: + block.setBlockBounds(0.0F + ofs, 0.0F, 0.0F, 1.0F + ofs, 1.0F, 1.0F); + } + } + + } + + public IBlockAccess getFrameBlockAccess() { + return this.frameBlockAccess; + } + + public void setContents(Block bid, int md, int mx, int my, int mz, TileEntity bte) { + this.movingBlock = bid; + this.movingBlockMeta = md; + this.motorX = mx; + this.motorY = my; + this.motorZ = mz; + this.movingTileEntity = bte; + if (this.movingTileEntity != null) { + if (RedPowerMachine.FrameAlwaysCrate) { + this.movingCrate = true; + } + + if (!(this.movingTileEntity instanceof IFrameSupport)) { + this.movingCrate = true; + } + } + + } + + public void doRefresh(IBlockAccess iba) { + if (this.movingTileEntity instanceof IFrameSupport) { + IFrameSupport ifs = (IFrameSupport)this.movingTileEntity; + ifs.onFrameRefresh(iba); + } + + } + + public void dropBlock() { + super.worldObj.setBlock(super.xCoord, super.yCoord, super.zCoord, this.movingBlock, this.movingBlockMeta, 3); + if (this.movingTileEntity != null) { + this.movingTileEntity.xCoord = super.xCoord; + this.movingTileEntity.yCoord = super.yCoord; + this.movingTileEntity.zCoord = super.zCoord; + this.movingTileEntity.validate(); + super.worldObj.setTileEntity(super.xCoord, super.yCoord, super.zCoord, this.movingTileEntity); + } + + super.worldObj.markBlockForUpdate(super.xCoord, super.yCoord, super.zCoord); + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.movingBlock); + } + + private AxisAlignedBB getAABB(int dir, float dist) { + AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox( + (double)super.xCoord, (double)super.yCoord, (double)super.zCoord, (double)(super.xCoord + 1), (double)(super.yCoord + 1), (double)(super.zCoord + 1) + ); + switch(dir) { + case 0: + aabb.minY -= (double)dist; + aabb.maxY -= (double)dist; + break; + case 1: + aabb.minY += (double)dist; + aabb.maxY += (double)dist; + break; + case 2: + aabb.minZ -= (double)dist; + aabb.maxZ -= (double)dist; + break; + case 3: + aabb.minZ += (double)dist; + aabb.maxZ += (double)dist; + break; + case 4: + aabb.minX -= (double)dist; + aabb.maxX -= (double)dist; + break; + case 5: + aabb.minX += (double)dist; + aabb.maxX += (double)dist; + } + + return aabb; + } + + void pushEntities(TileMotor tm) { + float prev = (float)this.lastMovePos / 16.0F; + float cur = (float)tm.MovePos / 16.0F; + this.lastMovePos = (byte)tm.MovePos; + float xm = 0.0F; + float ym = 0.0F; + float zm = 0.0F; + switch(tm.MoveDir) { + case 0: + ym -= cur - prev; + break; + case 1: + ym += cur - prev; + break; + case 2: + zm -= cur - prev; + break; + case 3: + zm += cur - prev; + break; + case 4: + xm -= cur - prev; + break; + case 5: + xm += cur - prev; + } + + AxisAlignedBB aabb = this.getAABB(tm.MoveDir, cur); + + for(Entity ent : new ArrayList(super.worldObj.getEntitiesWithinAABBExcludingEntity(null, aabb))) { + ent.moveEntity((double)xm, (double)ym, (double)zm); + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + TileMotor tm = CoreLib.getTileEntity(super.worldObj, this.motorX, this.motorY, this.motorZ, TileMotor.class); + if (tm != null && tm.MovePos >= 0) { + this.pushEntities(tm); + } else if (!super.worldObj.isRemote) { + this.dropBlock(); + } + + } + + public void validate() { + super.validate(); + if (this.movingTileEntity != null) { + this.movingTileEntity.setWorldObj(super.worldObj); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.motorX = data.getInteger("mx"); + this.motorY = data.getInteger("my"); + this.motorZ = data.getInteger("mz"); + this.movingBlock = Block.getBlockById(data.getInteger("mbid")); + this.movingBlockMeta = data.getInteger("mbmd"); + this.lastMovePos = data.getByte("lmp"); + if (data.hasKey("mte")) { + NBTTagCompound mte = data.getCompoundTag("mte"); + this.movingTileEntity = TileEntity.createAndLoadEntity(mte); + } else { + this.movingTileEntity = null; + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setInteger("mx", this.motorX); + data.setInteger("my", this.motorY); + data.setInteger("mz", this.motorZ); + data.setInteger("mbid", Block.getIdFromBlock(this.movingBlock)); + data.setInteger("mbmd", this.movingBlockMeta); + data.setByte("lmp", this.lastMovePos); + if (this.movingTileEntity != null) { + NBTTagCompound mte = new NBTTagCompound(); + this.movingTileEntity.writeToNBT(mte); + data.setTag("mte", mte); + } + + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.motorX = tag.getInteger("mx"); + this.motorY = tag.getInteger("my"); + this.motorZ = tag.getInteger("mz"); + this.movingBlock = Block.getBlockById(tag.getInteger("mbid")); + this.movingBlockMeta = tag.getInteger("mbmd"); + if (this.movingBlock != Blocks.air) { + this.movingTileEntity = this.movingBlock.createTileEntity(super.worldObj, this.movingBlockMeta); + if (this.movingTileEntity != null) { + if (!(this.movingTileEntity instanceof IFrameSupport)) { + this.movingCrate = true; + return; + } + + this.movingTileEntity.setWorldObj(super.worldObj); + this.movingTileEntity.xCoord = super.xCoord; + this.movingTileEntity.yCoord = super.yCoord; + this.movingTileEntity.zCoord = super.zCoord; + IFrameSupport ifs = (IFrameSupport)this.movingTileEntity; + ifs.readFramePacket(tag); + } + } + + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setInteger("mx", this.motorX); + tag.setInteger("my", this.motorY); + tag.setInteger("mz", this.motorZ); + tag.setInteger("mbid", Block.getIdFromBlock(this.movingBlock)); + tag.setInteger("mbmd", this.movingBlockMeta); + if (this.movingTileEntity instanceof IFrameSupport) { + IFrameSupport ifs = (IFrameSupport)this.movingTileEntity; + ifs.writeFramePacket(tag); + } + + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + TileMotor tm = CoreLib.getTileEntity(super.worldObj, this.motorX, this.motorY, this.motorZ, TileMotor.class); + if (tm != null && tm.MovePos >= 0) { + float prev = (float)this.lastMovePos / 16.0F; + float cur = (float)tm.MovePos / 16.0F; + this.lastMovePos = (byte)tm.MovePos; + float xm = 0.0F; + float ym = 0.0F; + float zm = 0.0F; + switch(tm.MoveDir) { + case 0: + ym -= cur - prev; + break; + case 1: + ym += cur - prev; + break; + case 2: + zm -= cur - prev; + break; + case 3: + zm += cur - prev; + break; + case 4: + xm -= cur - prev; + break; + case 5: + xm += cur - prev; + } + + return super.getRenderBoundingBox().addCoord((double)xm, (double)ym, (double)zm); + } else { + return super.getRenderBoundingBox(); + } + } + + private class FrameBlockAccess implements IBlockAccess { + private FrameBlockAccess() { + } + + private TileFrameMoving getFrame(int x, int y, int z) { + TileFrameMoving tfm = CoreLib.getTileEntity(TileFrameMoving.this.worldObj, x, y, z, TileFrameMoving.class); + return tfm == null + ? null + : (tfm.motorX == TileFrameMoving.this.motorX && tfm.motorY == TileFrameMoving.this.motorY && tfm.motorZ == TileFrameMoving.this.motorZ ? tfm : null); + } + + public Block getBlock(int x, int y, int z) { + TileFrameMoving tfm = this.getFrame(x, y, z); + return tfm == null ? Blocks.air : tfm.movingBlock; + } + + public TileEntity getTileEntity(int x, int y, int z) { + TileFrameMoving tfm = this.getFrame(x, y, z); + return tfm == null ? null : tfm.movingTileEntity; + } + + public int getLightBrightnessForSkyBlocks(int x, int y, int z, int value) { + return TileFrameMoving.this.worldObj.getLightBrightnessForSkyBlocks(x, y, z, value); + } + + public int getBlockMetadata(int x, int y, int z) { + TileFrameMoving tfm = this.getFrame(x, y, z); + return tfm == null ? 0 : tfm.movingBlockMeta; + } + + public boolean isAirBlock(int i, int j, int k) { + Block bid = this.getBlock(i, j, k); + return bid == Blocks.air || bid.isAir(TileFrameMoving.this.worldObj, i, j, k); + } + + public int getHeight() { + return TileFrameMoving.this.worldObj.getHeight(); + } + + public boolean extendedLevelsInChunkCache() { + return false; + } + + public BiomeGenBase getBiomeGenForCoords(int x, int z) { + return TileFrameMoving.this.worldObj.getBiomeGenForCoords(x, z); + } + + public int isBlockProvidingPowerTo(int x, int y, int z, int side) { + return 0; + } + + public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) { + if (x >= -30000000 && z >= -30000000 && x < 30000000 && z < 30000000) { + Chunk chunk = TileFrameMoving.this.worldObj.getChunkProvider().provideChunk(x >> 4, z >> 4); + return chunk != null && !chunk.isEmpty() ? this.getBlock(x, y, z).isSideSolid(this, x, y, z, side) : _default; + } else { + return _default; + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileFrameRedstoneTube.java b/src/main/java/com/eloraam/redpower/machine/TileFrameRedstoneTube.java new file mode 100644 index 0000000..82565f0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileFrameRedstoneTube.java @@ -0,0 +1,148 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class TileFrameRedstoneTube extends TileRedstoneTube implements IFrameLink { + public int StickySides = 63; + + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public boolean canFrameConnectOut(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public int getExtendedID() { + return 3; + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockFrame; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(this.getBlockType(), 1, 3)); + } + + super.flow.onRemove(); + if (super.CoverSides > 0) { + this.replaceWithCovers(); + this.updateBlockChange(); + } else { + this.deleteBlock(); + } + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public void addHarvestContents(List ist) { + this.addCoverableHarvestContents(ist); + ist.add(new ItemStack(this.getBlockType(), 1, 3)); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public boolean canAddCover(int side, int cover) { + if (side > 5) { + return false; + } else { + int n = cover >> 8; + return (n == 0 || n == 1 || n == 3 || n == 4) && (super.CoverSides & 1 << side) <= 0; + } + } + + private void rebuildSticky() { + int ss = 0; + + for(int i = 0; i < 6; ++i) { + int m = 1 << i; + if ((super.CoverSides & m) == 0) { + ss |= m; + } else { + int n = super.Covers[i] >> 8; + if (n == 1 || n == 4) { + ss |= m; + } + } + } + + this.StickySides = ss; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!super.tryAddCover(side, cover)) { + return false; + } else { + this.rebuildSticky(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + int tr = super.tryRemoveCover(side); + if (tr < 0) { + return tr; + } else { + this.rebuildSticky(); + return tr; + } + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.rebuildSticky(); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + super.readFromPacket(data); + this.rebuildSticky(); + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(this.getBlockType(), 1, 3); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileFrameTube.java b/src/main/java/com/eloraam/redpower/machine/TileFrameTube.java new file mode 100644 index 0000000..751bfd4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileFrameTube.java @@ -0,0 +1,150 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class TileFrameTube extends TileTube implements IFrameLink { + public int StickySides = 63; + + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public boolean canFrameConnectOut(int dir) { + return (this.StickySides & 1 << dir) > 0; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockFrame; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(this.getBlockType(), 1, 2)); + } + + super.flow.onRemove(); + if (super.CoverSides > 0) { + this.replaceWithCovers(); + this.updateBlockChange(); + } else { + this.deleteBlock(); + } + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public void addHarvestContents(List ist) { + this.addCoverableHarvestContents(ist); + ist.add(new ItemStack(this.getBlockType(), 1, 2)); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public boolean canAddCover(int side, int cover) { + if (side > 5) { + return false; + } else { + int n = cover >> 8; + return (n == 0 || n == 1 || n == 3 || n == 4) && (super.CoverSides & 1 << side) <= 0; + } + } + + void rebuildSticky() { + int ss = 0; + + for(int i = 0; i < 6; ++i) { + int m = 1 << i; + if ((super.CoverSides & m) == 0) { + ss |= m; + } else { + int n = super.Covers[i] >> 8; + if (n == 1 || n == 4) { + ss |= m; + } + } + } + + this.StickySides = ss; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!super.tryAddCover(side, cover)) { + return false; + } else { + this.rebuildSticky(); + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + int tr = super.tryRemoveCover(side); + if (tr < 0) { + return tr; + } else { + this.rebuildSticky(); + this.updateBlockChange(); + return tr; + } + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.rebuildSticky(); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + super.readFromPacket(data); + this.rebuildSticky(); + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(this.getBlockType(), 1, 2); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileGrate.java b/src/main/java/com/eloraam/redpower/machine/TileGrate.java new file mode 100644 index 0000000..89fdba8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileGrate.java @@ -0,0 +1,421 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.FluidBuffer; +import com.eloraam.redpower.core.IPipeConnectable; +import com.eloraam.redpower.core.PipeLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Queue; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +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 net.minecraftforge.fluids.Fluid; + +public class TileGrate extends TileMachinePanel implements IPipeConnectable { + private FluidBuffer gratebuf = new FluidBuffer() { + @Override + public TileEntity getParent() { + return TileGrate.this; + } + + @Override + public void onChange() { + TileGrate.this.markDirty(); + } + + @Override + public int getMaxLevel() { + return 1000; + } + }; + private TileGrate.GratePathfinder searchPath; + private int searchState = 0; + private int pressure; + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 5; + } + + @Override + public int getPipeConnectableSides() { + return 1 << super.Rotation; + } + + @Override + public int getPipeFlangeSides() { + return 1 << super.Rotation; + } + + @Override + public int getPipePressure(int side) { + return this.pressure; + } + + @Override + public FluidBuffer getPipeBuffer(int side) { + return this.gratebuf; + } + + @Override + public void onFramePickup(IBlockAccess iba) { + this.restartPath(); + } + + @Override + public int getExtendedID() { + return 3; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + super.Rotation = ForgeDirection.getOrientation(this.getFacing(ent)).getOpposite().ordinal(); + this.updateBlockChange(); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (!this.isTickScheduled()) { + this.scheduleTick(5); + } + + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation); + Integer pr = PipeLib.getPressure(super.worldObj, wc, super.Rotation ^ 1); + if (pr != null) { + this.pressure = pr - Integer.signum(pr); + } + + if (this.searchState == 1) { + this.searchPath.tryMapFluid(400); + } + + PipeLib.movePipeLiquid(super.worldObj, this, new WorldCoord(this), 1 << super.Rotation); + } + + } + + public void restartPath() { + this.searchPath = null; + this.searchState = 0; + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (this.pressure == 0) { + this.restartPath(); + } else if (this.pressure < -100) { + if (this.gratebuf.getLevel() >= this.gratebuf.getMaxLevel()) { + return; + } + + if (this.searchState == 2) { + this.restartPath(); + } + + if (this.searchState == 0) { + this.searchState = 1; + this.searchPath = new TileGrate.GratePathfinder(false); + if (this.gratebuf.Type == null) { + if (!this.searchPath.startSuck(new WorldCoord(this), 63 ^ 1 << super.Rotation)) { + this.restartPath(); + return; + } + } else { + this.searchPath.start(new WorldCoord(this), this.gratebuf.Type, 63 ^ 1 << super.Rotation); + } + } + + if (this.searchState == 1) { + if (!this.searchPath.tryMapFluid(400)) { + return; + } + + Fluid ty = this.searchPath.fluidClass; + int fluid = this.searchPath.trySuckFluid(ty.getDensity()); + if (fluid == 0) { + return; + } + + this.gratebuf.addLevel(ty, fluid); + } + } else if (this.pressure > 100) { + Fluid fluid = this.gratebuf.getFluidClass(); + if (fluid == null) { + return; + } + + int fq = fluid.getDensity(); + if (fq == 0) { + return; + } + + if (this.gratebuf.getLevel() < fq) { + return; + } + + if (this.gratebuf.Type == null) { + return; + } + + if (this.searchState == 1) { + this.restartPath(); + } + + if (this.searchState == 0) { + this.searchState = 2; + this.searchPath = new TileGrate.GratePathfinder(true); + this.searchPath.start(new WorldCoord(this), this.gratebuf.Type, 63 ^ 1 << super.Rotation); + } + + if (this.searchState == 2 && RedPowerMachine.AllowGrateDump) { + int fr = this.searchPath.tryDumpFluid(fq, 2000); + if (fr != fq) { + this.gratebuf.addLevel(this.gratebuf.Type, -fq); + } + } + } + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.gratebuf.readFromNBT(data, "buf"); + this.pressure = data.getShort("pres"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.gratebuf.writeToNBT(data, "buf"); + data.setShort("pres", (short)this.pressure); + } + + public static class FluidCoord implements Comparable { + public WorldCoord wc; + public int dist; + + public FluidCoord(WorldCoord w, int d) { + this.wc = w; + this.dist = d; + } + + public int compareTo(TileGrate.FluidCoord wr) { + return this.wc.y == wr.wc.y ? this.dist - wr.dist : this.wc.y - wr.wc.y; + } + } + + public class GratePathfinder { + WorldCoord startPos; + Map backlink = new HashMap<>(); + Queue workset; + Queue allset = new PriorityQueue<>(1024, Collections.reverseOrder()); + public Fluid fluidClass; + + public GratePathfinder(boolean checkVertical) { + if (checkVertical) { + this.workset = new PriorityQueue<>(); + } else { + this.workset = new PriorityQueue<>(1024, Comparator.comparingInt(a -> a.dist)); + } + + } + + public void start(WorldCoord wc, Fluid tp, int sides) { + this.fluidClass = tp; + this.startPos = wc; + + for(int i = 0; i < 6; ++i) { + if ((sides & 1 << i) != 0) { + WorldCoord wc2 = wc.coordStep(i); + this.backlink.put(wc2, wc); + this.workset.add(new TileGrate.FluidCoord(wc2, 0)); + } + } + + } + + public boolean startSuck(WorldCoord wc, int sides) { + this.fluidClass = null; + this.startPos = wc; + + for(int i = 0; i < 6; ++i) { + if ((sides & 1 << i) != 0) { + WorldCoord wc2 = wc.coordStep(i); + this.backlink.put(wc2, wc); + this.workset.add(new TileGrate.FluidCoord(wc2, 0)); + Fluid fl = PipeLib.getFluid(TileGrate.this.worldObj, wc2); + if (fl != null) { + this.fluidClass = fl; + } + } + } + + return this.fluidClass != null; + } + + public boolean isConnected(WorldCoord wc) { + if (wc.compareTo(this.startPos) == 0) { + return true; + } else { + do { + wc = (WorldCoord)this.backlink.get(wc); + if (wc == null) { + return false; + } + + if (wc.compareTo(this.startPos) == 0) { + return true; + } + } while(PipeLib.getFluid(TileGrate.this.worldObj, wc) == this.fluidClass); + + return false; + } + } + + public void stepAdd(TileGrate.FluidCoord nc) { + for(int i = 0; i < 6; ++i) { + WorldCoord wc2 = nc.wc.coordStep(i); + if (!this.backlink.containsKey(wc2)) { + this.backlink.put(wc2, nc.wc); + this.workset.add(new TileGrate.FluidCoord(wc2, nc.dist + 1)); + } + } + + } + + public void stepMap(TileGrate.FluidCoord nc) { + for(int i = 0; i < 6; ++i) { + WorldCoord wc2 = nc.wc.coordStep(i); + if (PipeLib.getFluid(TileGrate.this.worldObj, wc2) == this.fluidClass && !this.backlink.containsKey(wc2)) { + this.backlink.put(wc2, nc.wc); + this.workset.add(new TileGrate.FluidCoord(wc2, nc.dist + 1)); + } + } + + } + + public int tryDumpFluid(int level, int tries) { + for(int i = 0; i < tries; ++i) { + TileGrate.FluidCoord nc = (TileGrate.FluidCoord)this.workset.poll(); + if (nc == null) { + TileGrate.this.restartPath(); + return level; + } + + if (!this.isConnected(nc.wc)) { + TileGrate.this.restartPath(); + return level; + } + + if (TileGrate.this.worldObj.isAirBlock(nc.wc.x, nc.wc.y, nc.wc.z)) { + if (level == this.fluidClass.getDensity() + && TileGrate.this.worldObj.setBlock(nc.wc.x, nc.wc.y, nc.wc.z, this.fluidClass.getBlock())) { + this.stepAdd(nc); + return 0; + } + } else if (PipeLib.getFluid(TileGrate.this.worldObj, nc.wc) == this.fluidClass) { + this.stepAdd(nc); + int lv1 = this.fluidClass.getDensity(TileGrate.this.worldObj, nc.wc.x, nc.wc.y, nc.wc.z); + if (lv1 < 1000) { + int lv2 = Math.min(lv1 + level, this.fluidClass.getDensity()); + if (lv2 == this.fluidClass.getDensity() + && TileGrate.this.worldObj.setBlock(nc.wc.x, nc.wc.y, nc.wc.z, this.fluidClass.getBlock())) { + level -= lv2 - lv1; + if (level == 0) { + return 0; + } + } + } + } + } + + return level; + } + + public boolean tryMapFluid(int tries) { + if (this.allset.size() > 32768) { + return true; + } else { + for(int i = 0; i < tries; ++i) { + TileGrate.FluidCoord nc = (TileGrate.FluidCoord)this.workset.poll(); + if (nc == null) { + return true; + } + + Fluid fluid = PipeLib.getFluid(TileGrate.this.worldObj, nc.wc); + if (fluid != null) { + this.stepMap(nc); + if (fluid == this.fluidClass) { + int lvl = PipeLib.getFluidAmount(TileGrate.this.worldObj, nc.wc); + if (lvl > 0) { + this.allset.add(nc); + } + } + } + } + + return false; + } + } + + public int trySuckFluid(int level) { + int tr = 0; + + while(!this.allset.isEmpty()) { + TileGrate.FluidCoord nc = (TileGrate.FluidCoord)this.allset.peek(); + if (!this.isConnected(nc.wc)) { + TileGrate.this.restartPath(); + return tr; + } + + if (PipeLib.getFluid(TileGrate.this.worldObj, nc.wc) != this.fluidClass) { + this.allset.poll(); + } else { + Fluid fluid = PipeLib.getFluid(TileGrate.this.worldObj, nc.wc); + if (fluid != null) { + int lvl = PipeLib.getFluidAmount(TileGrate.this.worldObj, nc.wc); + if (lvl <= 0) { + this.allset.poll(); + } else if (tr + lvl <= level) { + tr += lvl; + TileGrate.this.worldObj.setBlockToAir(nc.wc.x, nc.wc.y, nc.wc.z); + this.allset.poll(); + if (tr == level) { + return level; + } + } + } else { + this.allset.poll(); + } + } + } + + TileGrate.this.restartPath(); + return tr; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileIgniter.java b/src/main/java/com/eloraam/redpower/machine/TileIgniter.java new file mode 100644 index 0000000..5ecf89f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileIgniter.java @@ -0,0 +1,83 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileIgniter extends TileMachine { + @Override + public int getExtendedID() { + return 12; + } + + private void fireAction() { + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation ^ 1); + if (super.Active) { + if (super.worldObj.isAirBlock(wc.x, wc.y, wc.z)) { + super.worldObj.setBlock(wc.x, wc.y, wc.z, Blocks.fire); + } + } else { + Block block = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if (block == Blocks.fire || block == Blocks.portal) { + super.worldObj.setBlockToAir(wc.x, wc.y, wc.z); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (!RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (!super.Powered) { + return; + } + + super.Powered = false; + if (super.Delay) { + return; + } + + super.Active = false; + super.Delay = true; + this.fireAction(); + } else { + if (super.Powered) { + return; + } + + super.Powered = true; + if (super.Delay) { + return; + } + + if (super.Active) { + return; + } + + super.Active = true; + super.Delay = true; + this.fireAction(); + } + + this.scheduleTick(5); + this.updateBlock(); + } + + public boolean isOnFire(ForgeDirection face) { + return super.Rotation == face.ordinal() && super.Active; + } + + @Override + public void onTileTick() { + super.Delay = false; + if (super.Active != super.Powered) { + super.Active = super.Powered; + this.fireAction(); + this.updateBlock(); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileItemDetect.java b/src/main/java/com/eloraam/redpower/machine/TileItemDetect.java new file mode 100644 index 0000000..f1c4ebb --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileItemDetect.java @@ -0,0 +1,336 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class TileItemDetect extends TileMachine implements ITubeConnectable, IInventory, ISidedInventory { + private TubeBuffer buffer = new TubeBuffer(); + private int count = 0; + public byte mode = 0; + protected ItemStack[] contents = new ItemStack[9]; + protected MachineLib.FilterMap filterMap = null; + + private void regenFilterMap() { + this.filterMap = MachineLib.makeFilterMap(this.contents); + } + + @Override + public int getTubeConnectableSides() { + return 3 << (super.Rotation & -2); + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + this.buffer.addBounce(item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return true; + } else if (side != (super.Rotation ^ 1) || state != 1) { + return false; + } else if (!this.buffer.isEmpty()) { + return false; + } else { + this.buffer.add(item); + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0 || this.filterMap.containsKey(item.item)) { + if (this.mode == 0) { + this.count += item.item.stackSize; + } else if (this.mode == 1) { + ++this.count; + } + } + + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + this.drainBuffer(); + return true; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2 || side == (super.Rotation ^ 1) && state == 1 && this.buffer.isEmpty(); + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + if (this.mode == 2 && !super.Powered) { + super.Delay = false; + super.Powered = true; + this.count = 0; + this.updateBlockChange(); + } + + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + if (this.mode == 2 && !super.Powered) { + super.Delay = false; + super.Powered = true; + this.count = 0; + this.updateBlockChange(); + } + + return; + } + } + + if (this.mode == 2 && super.Powered) { + super.Powered = false; + this.updateBlockChange(); + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote && this.mode != 2) { + if (super.Powered) { + if (super.Delay) { + super.Delay = false; + this.markDirty(); + } else { + super.Powered = false; + if (this.count > 0) { + super.Delay = true; + } + + this.updateBlockChange(); + } + } else if (this.count != 0) { + if (super.Delay) { + super.Delay = false; + this.markDirty(); + } else { + --this.count; + super.Powered = true; + super.Delay = true; + this.updateBlockChange(); + } + } + } + + } + + @Override + public boolean isPoweringTo(int side) { + return side != (super.Rotation ^ 1) && super.Powered; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 6, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public int getExtendedID() { + return 4; + } + + @Override + public void onBlockRemoval() { + this.buffer.onRemove(this); + + for(int i = 0; i < 9; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (!this.buffer.isEmpty()) { + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else { + super.Active = false; + this.updateBlock(); + } + } + + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpitemdet.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void markDirty() { + this.filterMap = null; + super.markDirty(); + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.buffer.readFromNBT(data); + this.count = data.getInteger("cnt"); + this.mode = data.getByte("mode"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + this.buffer.writeToNBT(data); + data.setInteger("cnt", this.count); + data.setByte("mode", this.mode); + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != super.Rotation && side != (super.Rotation ^ 1) ? IntStream.range(0, 9).toArray() : new int[0]; + } + + public boolean canInsertItem(int slotID, ItemStack stack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean canExtractItem(int slotID, ItemStack stack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileMachine.java b/src/main/java/com/eloraam/redpower/machine/TileMachine.java new file mode 100644 index 0000000..3365853 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileMachine.java @@ -0,0 +1,155 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRotatable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileMachine extends TileExtended implements IRotatable, IFrameSupport { + public int Rotation = 0; + public boolean Active = false; + public boolean Powered = false; + public boolean Delay = false; + public boolean Charged = false; + + public int getFacing(EntityLivingBase ent) { + int yawrx = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (Math.abs(ent.posX - (double)super.xCoord) < 2.0 && Math.abs(ent.posZ - (double)super.zCoord) < 2.0) { + double p = ent.posY + 1.82 - (double)ent.yOffset - (double)super.yCoord; + if (p > 2.0) { + return 0; + } + + if (p < 0.0) { + return 1; + } + } + + switch(yawrx) { + case 0: + return 3; + case 1: + return 4; + case 2: + return 2; + default: + return 5; + } + } + + protected boolean handleItem(TubeItem ti) { + return MachineLib.handleItem(super.worldObj, ti, new WorldCoord(super.xCoord, super.yCoord, super.zCoord), this.Rotation); + } + + public boolean isPoweringTo(int side) { + return false; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 5; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : this.Rotation; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec) { + this.Rotation = rot; + this.updateBlockChange(); + } + + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = this.getFacing(ent); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + byte ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + byte ps = data.getByte("ps"); + this.Rotation = data.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + data.setByte("ps", (byte)ps); + data.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.readFromPacket(tag); + byte ps = tag.getByte("ps"); + this.Rotation = tag.getByte("rot"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + super.writeToPacket(tag); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("rot", (byte)this.Rotation); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileMachinePanel.java b/src/main/java/com/eloraam/redpower/machine/TileMachinePanel.java new file mode 100644 index 0000000..93f9e97 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileMachinePanel.java @@ -0,0 +1,192 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRotatable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileMultipart; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.IBlockAccess; + +public class TileMachinePanel extends TileMultipart implements IRotatable, IFrameSupport { + public int Rotation = 0; + public boolean Active = false; + public boolean Powered = false; + public boolean Delay = false; + public boolean Charged = false; + + public int getLightValue() { + return 0; + } + + void updateLight() { + super.worldObj.updateLightByType(EnumSkyBlock.Block, super.xCoord, super.yCoord, super.zCoord); + } + + public int getFacing(EntityLivingBase ent) { + int yawrx = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (Math.abs(ent.posX - (double)super.xCoord) < 2.0 && Math.abs(ent.posZ - (double)super.zCoord) < 2.0) { + double p = ent.posY + 1.82 - (double)ent.yOffset - (double)super.yCoord; + if (p > 2.0) { + return 0; + } + + if (p < 0.0) { + return 1; + } + } + + switch(yawrx) { + case 0: + return 3; + case 1: + return 4; + case 2: + return 2; + default: + return 5; + } + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, super.blockType); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + public Block getBlockType() { + return RedPowerMachine.blockMachinePanel; + } + + @Override + public void addHarvestContents(List ist) { + ist.add(new ItemStack(this.getBlockType(), 1, this.getExtendedID())); + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + this.breakBlock(willHarvest); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockMachinePanel bl = RedPowerMachine.blockMachinePanel; + return player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F); + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + + @Override + public int getSolidPartsMask() { + return 1; + } + + @Override + public int getPartsMask() { + return 1; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 3; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : this.Rotation; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec) { + this.Rotation = rot; + this.updateBlockChange(); + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + tag.setByte("ps", (byte)ps); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + int ps = tag.getByte("ps"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + byte k = data.getByte("ps"); + this.Rotation = data.getByte("rot"); + this.Active = (k & 1) > 0; + this.Powered = (k & 2) > 0; + this.Delay = (k & 4) > 0; + this.Charged = (k & 8) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + data.setByte("ps", (byte)ps); + data.setByte("rot", (byte)this.Rotation); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.Rotation = data.getByte("rot"); + int ps = data.getByte("ps"); + this.Active = (ps & 1) > 0; + this.Powered = (ps & 2) > 0; + this.Delay = (ps & 4) > 0; + this.Charged = (ps & 8) > 0; + this.updateLight(); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setByte("rot", (byte)this.Rotation); + int ps = (this.Active ? 1 : 0) | (this.Powered ? 2 : 0) | (this.Delay ? 4 : 0) | (this.Charged ? 8 : 0); + data.setByte("ps", (byte)ps); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileMagTube.java b/src/main/java/com/eloraam/redpower/machine/TileMagTube.java new file mode 100644 index 0000000..f745c43 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileMagTube.java @@ -0,0 +1,42 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockMultipart; + +public class TileMagTube extends TileTube { + @Override + public int getTubeConnectableSides() { + int tr = 63; + + for(int i = 0; i < 6; ++i) { + if ((super.CoverSides & 1 << i) > 0 && super.Covers[i] >> 8 < 3) { + tr &= ~(1 << i); + } + } + + return tr; + } + + public int getSpeed() { + return 128; + } + + @Override + public int getTubeConClass() { + return 18 + super.paintColor; + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.125F, 0.125F, 0.125F, 0.875F, 0.875F, 0.875F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public int getExtendedID() { + return 11; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileManager.java b/src/main/java/com/eloraam/redpower/machine/TileManager.java new file mode 100644 index 0000000..da3a167 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileManager.java @@ -0,0 +1,626 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.ITubeRequest; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +public class TileManager extends TileMachine implements IBluePowerConnectable, ISidedInventory, ITubeConnectable, ITubeRequest { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileManager.this; + } + }; + TubeBuffer buffer = new TubeBuffer(); + protected ItemStack[] contents = new ItemStack[24]; + public int ConMask = -1; + public byte color = 0; + public byte mode = 0; + public int priority = 0; + public byte rqnum = 0; + protected MachineLib.FilterMap filterMap = null; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != super.Rotation && side != (super.Rotation ^ 1) ? IntStream.range(0, 24).toArray() : new int[0]; + } + + protected IInventory getConnectedInventory(boolean push) { + WorldCoord pos = new WorldCoord(this); + pos.step(super.Rotation ^ 1); + return MachineLib.getSideInventory(super.worldObj, pos, super.Rotation, push); + } + + protected void regenFilterMap() { + this.filterMap = MachineLib.makeFilterMap(this.contents, 0, 24); + } + + protected int[] getAcceptCounts() { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + return null; + } else { + IInventory inv = this.getConnectedInventory(true); + if (inv == null) { + return null; + } else { + int[] tr = MachineLib.genMatchCounts(this.filterMap); + int[] slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + MachineLib.decMatchCounts(this.filterMap, tr, inv, slots); + return tr; + } + } + } + + protected int acceptCount(ItemStack ist) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + return 0; + } else if (!this.filterMap.containsKey(ist)) { + return 0; + } else { + int[] match = this.getAcceptCounts(); + return match == null ? 0 : MachineLib.getMatchCount(this.filterMap, match, ist); + } + } + + protected void doRequest(int slot, int num) { + ItemStack rq = CoreLib.copyStack(this.contents[slot], Math.min(64, num)); + TubeItem tir = new TubeItem(0, rq); + tir.priority = (short)this.priority; + tir.color = this.color; + TubeLib.RequestRouteFinder rrf = new TubeLib.RequestRouteFinder(super.worldObj, tir); + if (rrf.find(new WorldCoord(this), 63) >= 0) { + WorldCoord wc = rrf.getResultPoint(); + ITubeRequest itr = CoreLib.getTileEntity(super.worldObj, wc, ITubeRequest.class); + itr.requestTubeItem(tir, true); + this.cond.drawPower(100.0); + this.scheduleTick(20); + } + + } + + protected void scanInventory() { + IInventory inv = this.getConnectedInventory(false); + if (inv != null) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + int[] ac = MachineLib.genMatchCounts(this.filterMap); + if (ac != null) { + for(int hrs = 0; hrs < inv.getSizeInventory(); ++hrs) { + ItemStack n = inv.getStackInSlot(hrs); + if (n != null && n.stackSize != 0) { + if (this.mode == 0) { + int mc = MachineLib.decMatchCount(this.filterMap, ac, n); + if (mc < n.stackSize) { + ItemStack rem = inv.decrStackSize(hrs, n.stackSize - mc); + this.cond.drawPower((double)(25 * n.stackSize)); + this.buffer.addNewColor(rem, this.color); + super.Active = true; + this.scheduleTick(5); + this.updateBlock(); + return; + } + } else if (this.mode == 1 && !this.filterMap.containsKey(n)) { + inv.setInventorySlotContents(hrs, null); + this.cond.drawPower((double)(25 * n.stackSize)); + this.buffer.addNewColor(n, this.color); + super.Active = true; + this.scheduleTick(5); + this.updateBlock(); + return; + } + } + } + + boolean var7 = false; + if (this.mode == 0) { + ac = this.getAcceptCounts(); + if (ac != null) { + var7 = true; + ++this.rqnum; + if (this.rqnum >= 24) { + this.rqnum = 0; + } + + for(int i = this.rqnum; i < ac.length; ++i) { + if (ac[i] != 0) { + var7 = false; + this.doRequest(i, ac[i]); + break; + } + } + + for(int i = 0; i < this.rqnum; ++i) { + if (ac[i] != 0) { + var7 = false; + this.doRequest(i, ac[i]); + break; + } + } + } + } + + if (super.Powered != var7) { + super.Powered = var7; + this.updateBlockChange(); + } + } + } + + } + + @Override + public int getTubeConnectableSides() { + return 1 << super.Rotation; + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + private boolean handleTubeItem(TubeItem ti) { + if (this.cond.getVoltage() < 60.0) { + return false; + } else if (ti.priority > this.priority) { + return false; + } else if (ti.color != this.color && this.color != 0 && ti.color != 0) { + return false; + } else if (this.mode == 1) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + return false; + } else if (!this.filterMap.containsKey(ti.item)) { + return false; + } else { + IInventory mc1 = this.getConnectedInventory(true); + int[] slots = IntStream.range(0, mc1.getSizeInventory()).toArray(); + if (MachineLib.addToInventoryCore(mc1, ti.item, slots, true)) { + super.Delay = true; + this.scheduleTick(5); + this.updateBlock(); + return true; + } else { + return false; + } + } + } else { + int mc = this.acceptCount(ti.item); + if (mc == 0) { + return false; + } else { + boolean tr = true; + ItemStack ist = ti.item; + if (mc < ist.stackSize) { + tr = false; + ist = ist.splitStack(mc); + } + + IInventory dest = this.getConnectedInventory(true); + int[] slots = IntStream.range(0, dest.getSizeInventory()).toArray(); + if (MachineLib.addToInventoryCore(dest, ist, slots, true)) { + super.Delay = true; + this.scheduleTick(5); + this.updateBlock(); + return tr; + } else { + return false; + } + } + } + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side != super.Rotation) { + return false; + } else if (state == 2) { + if (this.handleTubeItem(item)) { + return true; + } else { + this.buffer.addBounce(item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return true; + } + } else { + return this.handleTubeItem(item); + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + if (side != super.Rotation) { + return false; + } else if (state == 2) { + return true; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else if (item.priority > this.priority) { + return false; + } else if (item.color != this.color && this.color != 0 && item.color != 0) { + return false; + } else { + switch(this.mode) { + case 0: + return this.acceptCount(item.item) > 0; + case 1: + if (this.filterMap == null) { + this.regenFilterMap(); + } + + return this.filterMap.size() != 0 && this.filterMap.containsKey(item.item); + default: + return false; + } + } + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + @Override + public boolean requestTubeItem(TubeItem rq, boolean act) { + if (super.Active) { + return false; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + return false; + } else if (!this.filterMap.containsKey(rq.item)) { + return false; + } else if (rq.priority <= this.priority) { + return false; + } else if (rq.color != this.color && this.color > 0) { + return false; + } else { + IInventory inv = this.getConnectedInventory(false); + if (inv == null) { + return false; + } else { + for(int i = 0; i < inv.getSizeInventory(); ++i) { + ItemStack is2 = inv.getStackInSlot(i); + if (is2 != null && is2.stackSize != 0 && CoreLib.compareItemStack(rq.item, is2) == 0) { + if (act) { + ItemStack pull = inv.decrStackSize(i, Math.min(rq.item.stackSize, is2.stackSize)); + TubeItem ti = new TubeItem(0, pull); + this.cond.drawPower((double)(25 * ti.item.stackSize)); + ti.priority = rq.priority; + ti.color = this.color; + this.buffer.add(ti); + super.Active = true; + this.scheduleTick(5); + this.updateBlock(); + } + + return true; + } + } + + return false; + } + } + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (!this.isTickScheduled()) { + this.scheduleTick(10); + } + + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.Flow == 0) { + if (super.Charged) { + super.Charged = false; + this.updateBlock(); + } + } else if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + } + + } + + @Override + public boolean isPoweringTo(int side) { + return side != (super.Rotation ^ 1) && super.Powered; + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockMachine2; + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 16, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (this.handleTubeItem(ti)) { + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } else { + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } + } + + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + boolean r = false; + if (super.Delay) { + super.Delay = false; + r = true; + } + + if (super.Active) { + if (!this.buffer.isEmpty()) { + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else { + super.Active = false; + this.updateBlock(); + } + } else if (r) { + this.updateBlock(); + } else if (this.cond.getVoltage() >= 60.0) { + this.scanInventory(); + } + } + + } + + @Override + public void onBlockRemoval() { + super.onBlockRemoval(); + + for(ItemStack ist : this.contents) { + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + public int getSizeInventory() { + return 24; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpmanager.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void markDirty() { + this.filterMap = null; + super.markDirty(); + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.color = data.getByte("color"); + this.mode = data.getByte("mode"); + this.priority = data.getInteger("prio"); + this.rqnum = data.getByte("rqnum"); + this.buffer.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + data.setByte("color", this.color); + data.setByte("mode", this.mode); + data.setInteger("prio", this.priority); + data.setByte("rqnum", this.rqnum); + this.buffer.writeToNBT(data); + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileMotor.java b/src/main/java/com/eloraam/redpower/machine/TileMotor.java new file mode 100644 index 0000000..107f8a7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileMotor.java @@ -0,0 +1,452 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.FrameLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IFrameLink; +import com.eloraam.redpower.core.IFrameSupport; +import com.eloraam.redpower.core.IRotatable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.WorldCoord; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +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.BlockSnapshot; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.ForgeEventFactory; + +public class TileMotor extends TileExtended implements IBluePowerConnectable, IRotatable, IFrameLink, IFrameSupport { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileMotor.this; + } + }; + public int Rotation = 0; + public int MoveDir = 4; + public int MovePos = -1; + public boolean Powered = false; + public boolean Active = false; + public boolean Charged = false; + public int LinkSize = -1; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823 ^ RedPowerLib.getConDirMask(this.Rotation >> 2 ^ 1); + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public WorldCoord getFrameLinkset() { + return null; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return this.MovePos >= 0 ? 0 : (sec ? 5 : 3); + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? this.Rotation >> 2 : this.Rotation & 3; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (this.MovePos < 0) { + if (sec) { + this.Rotation = this.Rotation & 3 | rot << 2; + } else { + this.Rotation = this.Rotation & -4 | rot & 3; + } + + this.updateBlockChange(); + } + + } + + @Override + public boolean isFrameMoving() { + return false; + } + + @Override + public boolean canFrameConnectIn(int dir) { + return dir != (this.Rotation >> 2 ^ 1); + } + + @Override + public boolean canFrameConnectOut(int dir) { + return dir == (this.Rotation >> 2 ^ 1); + } + + @Override + public int getExtendedID() { + return 7; + } + + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (this.MovePos >= 0 && this.MovePos < 16) { + ++this.MovePos; + this.markDirty(); + } + + if (!super.worldObj.isRemote) { + if (this.MovePos >= 0) { + this.cond.drawPower((double)(100 + 10 * this.LinkSize)); + } + + if (this.MovePos >= 16) { + this.dropFrame(true); + this.MovePos = -1; + this.Active = false; + this.updateBlock(); + } + + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.MovePos < 0) { + if (this.cond.getVoltage() < 60.0) { + if (this.Charged && this.cond.Flow == 0) { + this.Charged = false; + this.updateBlock(); + } + } else if (!this.Charged) { + this.Charged = true; + this.updateBlock(); + } + } + } + + } + + private int getDriveSide() { + short n; + switch(this.Rotation >> 2) { + case 0: + n = 13604; + break; + case 1: + n = 13349; + break; + case 2: + n = 20800; + break; + case 3: + n = 16720; + break; + case 4: + n = 8496; + break; + default: + n = 12576; + } + + int n1 = n >> ((this.Rotation & 3) << 2); + return n1 & 7; + } + + private void pickFrame() { + this.MoveDir = this.getDriveSide(); + WorldCoord wc = new WorldCoord(this); + FrameLib.FrameSolver fs = new FrameLib.FrameSolver(super.worldObj, wc.coordStep(this.Rotation >> 2 ^ 1), wc, this.MoveDir); + if (fs.solveLimit(RedPowerMachine.FrameLinkSize) && fs.addMoved()) { + this.LinkSize = fs.getFrameSet().size(); + this.MovePos = 0; + this.Active = true; + this.updateBlock(); + + for(WorldCoord sp : fs.getClearSet()) { + super.worldObj.setBlockToAir(sp.x, sp.y, sp.z); + } + + for(WorldCoord sp : fs.getFrameSet()) { + Block tfm = super.worldObj.getBlock(sp.x, sp.y, sp.z); + int ifs = super.worldObj.getBlockMetadata(sp.x, sp.y, sp.z); + TileEntity te = super.worldObj.getTileEntity(sp.x, sp.y, sp.z); + if (te != null) { + super.worldObj.removeTileEntity(sp.x, sp.y, sp.z); + } + + boolean ir = super.worldObj.isRemote; + super.worldObj.isRemote = true; + super.worldObj.setBlock(sp.x, sp.y, sp.z, RedPowerMachine.blockFrame, 1, 2); + super.worldObj.isRemote = ir; + TileFrameMoving tfm1 = CoreLib.getTileEntity(super.worldObj, sp, TileFrameMoving.class); + if (tfm1 != null) { + tfm1.setContents(tfm, ifs, super.xCoord, super.yCoord, super.zCoord, te); + } + } + + for(WorldCoord sp : fs.getFrameSet()) { + super.worldObj.markBlockForUpdate(sp.x, sp.y, sp.z); + CoreLib.markBlockDirty(super.worldObj, sp.x, sp.y, sp.z); + TileFrameMoving tfm2 = CoreLib.getTileEntity(super.worldObj, sp, TileFrameMoving.class); + if (tfm2 != null && tfm2.movingTileEntity instanceof IFrameSupport) { + IFrameSupport ifs1 = (IFrameSupport)tfm2.movingTileEntity; + ifs1.onFramePickup(tfm2.getFrameBlockAccess()); + } + } + } + + } + + private void dropFrame(boolean fw) { + WorldCoord wc = new WorldCoord(this); + FrameLib.FrameSolver fs = new FrameLib.FrameSolver(super.worldObj, wc.coordStep(this.Rotation >> 2 ^ 1), wc, -1); + if (fs.solve()) { + this.LinkSize = 0; + fs.sort(this.MoveDir); + List snapshots = new ArrayList(); + FakePlayer player = CoreLib.getRedpowerPlayer(super.worldObj, super.xCoord, super.yCoord, super.zCoord, this.Rotation >> 2, super.Owner); + + for(WorldCoord sp : fs.getFrameSet()) { + TileFrameMoving ifs = CoreLib.getTileEntity(super.worldObj, sp, TileFrameMoving.class); + if (ifs != null) { + WorldCoord s2 = sp.copy(); + if (fw) { + s2.step(this.MoveDir); + } + + if (!CoreLib.hasEditPermission(player, s2.x, s2.y, s2.z)) { + return; + } + + if (ifs.movingTileEntity != null) { + NBTTagCompound compound = new NBTTagCompound(); + ifs.movingTileEntity.writeToNBT(compound); + snapshots.add(new BlockSnapshot(super.worldObj, s2.x, s2.y, s2.z, ifs.movingBlock, ifs.movingBlockMeta, compound)); + } else { + snapshots.add(new BlockSnapshot(super.worldObj, sp.x, sp.y, sp.z, ifs.movingBlock, ifs.movingBlockMeta)); + } + } + } + + if (!snapshots.isEmpty() + && !ForgeEventFactory.onPlayerMultiBlockPlace(player, snapshots, ForgeDirection.getOrientation(this.Rotation >> 2 ^ 1)).isCanceled()) { + for(WorldCoord sp : fs.getFrameSet()) { + TileFrameMoving ifs = CoreLib.getTileEntity(super.worldObj, sp, TileFrameMoving.class); + if (ifs != null) { + ifs.pushEntities(this); + WorldCoord s2 = sp.copy(); + if (fw) { + s2.step(this.MoveDir); + } + + if (ifs.movingBlock != Blocks.air) { + boolean ir = super.worldObj.isRemote; + super.worldObj.isRemote = true; + super.worldObj.setBlock(s2.x, s2.y, s2.z, ifs.movingBlock, ifs.movingBlockMeta, 2); + super.worldObj.isRemote = ir; + if (ifs.movingTileEntity != null) { + ifs.movingTileEntity.xCoord = s2.x; + ifs.movingTileEntity.yCoord = s2.y; + ifs.movingTileEntity.zCoord = s2.z; + ifs.movingTileEntity.validate(); + super.worldObj.setTileEntity(s2.x, s2.y, s2.z, ifs.movingTileEntity); + } + } + + if (fw) { + super.worldObj.setBlockToAir(sp.x, sp.y, sp.z); + } + } + } + + for(WorldCoord sp : fs.getFrameSet()) { + IFrameSupport frameSupport = CoreLib.getTileEntity(super.worldObj, sp, IFrameSupport.class); + if (frameSupport != null) { + frameSupport.onFrameDrop(); + } + + super.worldObj.markBlockForUpdate(sp.x, sp.y, sp.z); + CoreLib.markBlockDirty(super.worldObj, sp.x, sp.y, sp.z); + RedPowerLib.updateIndirectNeighbors(super.worldObj, sp.x, sp.y, sp.z, super.worldObj.getBlock(sp.x, sp.y, sp.z)); + } + } + } + + } + + float getMoveScaled() { + return (float)this.MovePos / 16.0F; + } + + @Override + public void onBlockRemoval() { + if (this.MovePos >= 0) { + this.Active = false; + this.dropFrame(false); + } + + this.MovePos = -1; + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (this.Charged && !this.Powered && this.MovePos < 0) { + this.Powered = true; + this.updateBlockChange(); + if (this.Powered) { + this.pickFrame(); + } + } + } else if (this.Powered) { + this.Powered = false; + this.updateBlockChange(); + } + + } + + public int getFacing(EntityLivingBase ent) { + int yawrx = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 0.5) & 3; + if (Math.abs(ent.posX - (double)super.xCoord) < 2.0 && Math.abs(ent.posZ - (double)super.zCoord) < 2.0) { + double p = ent.posY + 1.82 - (double)ent.yOffset - (double)super.yCoord; + if (p > 2.0) { + return 0 | yawrx; + } + + if (p < 0.0) { + return 4 | yawrx; + } + } + + switch(yawrx) { + case 0: + return 12; + case 1: + return 16; + case 2: + return 8; + default: + return 20; + } + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + this.Rotation = this.getFacing(ent); + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("mdir", (byte)this.MoveDir); + tag.setByte("mpos", (byte)(this.MovePos + 1)); + int ps = (this.Powered ? 1 : 0) | (this.Active ? 2 : 0) | (this.Charged ? 4 : 0); + tag.setByte("ps", (byte)ps); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.MoveDir = tag.getByte("mdir"); + this.MovePos = tag.getByte("mpos") - 1; + int ps = tag.getByte("ps"); + this.Powered = (ps & 1) > 0; + this.Active = (ps & 2) > 0; + this.Charged = (ps & 4) > 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + } + + @Override + public void onFramePickup(IBlockAccess iba) { + } + + @Override + public void onFrameDrop() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Rotation = data.getByte("rot"); + this.MoveDir = data.getByte("mdir"); + this.MovePos = data.getByte("mpos"); + this.LinkSize = data.getInteger("links"); + this.cond.readFromNBT(data); + byte k = data.getByte("ps"); + this.Powered = (k & 1) > 0; + this.Active = (k & 2) > 0; + this.Charged = (k & 4) > 0; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("rot", (byte)this.Rotation); + data.setByte("mdir", (byte)this.MoveDir); + data.setByte("mpos", (byte)this.MovePos); + data.setInteger("links", this.LinkSize); + this.cond.writeToNBT(data); + int ps = (this.Powered ? 1 : 0) | (this.Active ? 2 : 0) | (this.Charged ? 4 : 0); + data.setByte("ps", (byte)ps); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + this.Rotation = tag.getByte("rot"); + this.MoveDir = tag.getByte("mdir"); + this.MovePos = tag.getByte("mpos") - 1; + int ps = tag.getByte("ps"); + this.Powered = (ps & 1) > 0; + this.Active = (ps & 2) > 0; + this.Charged = (ps & 4) > 0; + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + tag.setByte("rot", (byte)this.Rotation); + tag.setByte("mdir", (byte)this.MoveDir); + tag.setByte("mpos", (byte)(this.MovePos + 1)); + int ps = (this.Powered ? 1 : 0) | (this.Active ? 2 : 0) | (this.Charged ? 4 : 0); + tag.setByte("ps", (byte)ps); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TilePipe.java b/src/main/java/com/eloraam/redpower/machine/TilePipe.java new file mode 100644 index 0000000..27eff45 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TilePipe.java @@ -0,0 +1,295 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.FluidBuffer; +import com.eloraam.redpower.core.IPipeConnectable; +import com.eloraam.redpower.core.PipeLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public class TilePipe extends TileCovered implements IPipeConnectable { + public FluidBuffer pipebuf = new FluidBuffer() { + @Override + public TileEntity getParent() { + return TilePipe.this; + } + + @Override + public void onChange() { + TilePipe.this.markDirty(); + } + }; + public int Pressure = 0; + public int ConCache = -1; + public int Flanges = -1; + private boolean hasChanged = false; + + @Override + public int getPipeConnectableSides() { + int tr = 63; + + for(int i = 0; i < 6; ++i) { + if ((super.CoverSides & 1 << i) > 0 && super.Covers[i] >> 8 < 3) { + tr &= ~(1 << i); + } + } + + return tr; + } + + @Override + public int getPipeFlangeSides() { + this.cacheCon(); + return this.ConCache != 3 && this.ConCache != 12 && this.ConCache != 48 ? (Integer.bitCount(this.ConCache) == 1 ? 0 : this.ConCache) : 0; + } + + @Override + public int getPipePressure(int side) { + return this.Pressure; + } + + @Override + public FluidBuffer getPipeBuffer(int side) { + return this.pipebuf; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!super.tryAddCover(side, cover)) { + return false; + } else { + this.uncache(); + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + int tr = super.tryRemoveCover(side); + if (tr < 0) { + return -1; + } else { + this.uncache(); + this.updateBlockChange(); + return tr; + } + } + + @Override + public boolean canUpdate() { + return true; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + int pr = 0; + int d = 0; + int min = 0; + int max = 0; + this.cacheCon(); + + for(int i = 0; i < 6; ++i) { + if ((this.ConCache & 1 << i) != 0) { + WorldCoord wc = new WorldCoord(this); + wc.step(i); + Integer p = PipeLib.getPressure(super.worldObj, wc, i ^ 1); + if (p != null) { + min = Math.min(p, min); + max = Math.max(p, max); + pr += p; + ++d; + } + } + } + + if (d == 0) { + this.Pressure = 0; + } else { + if (min < 0) { + ++min; + } + + if (max > 0) { + --max; + } + + this.Pressure = Math.max(min, Math.min(max, pr / d + Integer.signum(pr))); + } + + PipeLib.movePipeLiquid(super.worldObj, this, new WorldCoord(this), this.ConCache); + this.markDirty(); + if ((super.worldObj.getWorldTime() & 16L) == 0L) { + this.hasChanged = true; + this.markForUpdate(); + this.markDirty(); + } + } + + } + + public void uncache() { + this.ConCache = -1; + this.Flanges = -1; + } + + public void cacheCon() { + if (this.ConCache < 0) { + this.ConCache = PipeLib.getConnections(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + } + + public void cacheFlange() { + if (this.Flanges < 0) { + this.cacheCon(); + this.Flanges = this.getPipeFlangeSides(); + this.Flanges |= PipeLib.getFlanges(super.worldObj, new WorldCoord(this), this.ConCache); + } + + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + if (this.ConCache < 0) { + this.ConCache = PipeLib.getConnections(iba, super.xCoord, super.yCoord, super.zCoord); + } + + this.Flanges = 0; + } + + @Override + public Block getBlockType() { + return RedPowerBase.blockMicro; + } + + @Override + public int getExtendedID() { + return 7; + } + + @Override + public void onBlockNeighborChange(Block block) { + int pf = this.Flanges; + int pc = this.ConCache; + this.uncache(); + this.cacheFlange(); + if (this.Flanges != pf || pc != this.ConCache) { + this.updateBlock(); + } + + } + + @Override + public int getPartsMask() { + return super.CoverSides | 536870912; + } + + @Override + public int getSolidPartsMask() { + return super.CoverSides | 536870912; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8)); + } + + if (super.CoverSides > 0) { + this.replaceWithCovers(); + } else { + this.deleteBlock(); + } + + this.uncache(); + this.updateBlockChange(); + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public void addHarvestContents(List ist) { + super.addHarvestContents(ist); + ist.add(new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8)); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockMachine bl = RedPowerMachine.blockMachine; + return part == 29 + ? player.getBreakSpeed(bl, false, 0, super.xCoord, super.yCoord, super.zCoord) / (bl.getHardness() * 30.0F) + : super.getPartStrength(player, part); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.Pressure = data.getInteger("psi"); + this.pipebuf.readFromNBT(data, "buf"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setInteger("psi", this.Pressure); + this.pipebuf.writeToNBT(data, "buf"); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.pipebuf.readFromPacket(data); + if (data.hasKey("itm")) { + this.ConCache = -1; + this.Flanges = -1; + super.readFromPacket(data); + } + + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + this.pipebuf.writeToPacket(data); + if (this.hasChanged) { + this.hasChanged = false; + data.setBoolean("itm", true); + super.writeToPacket(data); + } + + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TilePump.java b/src/main/java/com/eloraam/redpower/machine/TilePump.java new file mode 100644 index 0000000..ad33956 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TilePump.java @@ -0,0 +1,219 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.FluidBuffer; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IPipeConnectable; +import com.eloraam.redpower.core.PipeLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TilePump extends TileMachinePanel implements IPipeConnectable, IBluePowerConnectable { + private TilePump.PumpBuffer inbuf = new TilePump.PumpBuffer(); + private TilePump.PumpBuffer outbuf = new TilePump.PumpBuffer(); + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TilePump.this; + } + }; + public int ConMask = -1; + public byte PumpTick = 0; + + @Override + public int getPipeConnectableSides() { + return 12 << (((super.Rotation ^ 1) & 1) << 1); + } + + @Override + public int getPipeFlangeSides() { + return 12 << (((super.Rotation ^ 1) & 1) << 1); + } + + @Override + public int getPipePressure(int side) { + int rt = CoreLib.rotToSide(super.Rotation); + return !super.Active ? 0 : (side == rt ? 1000 : (side == ((rt ^ 1) & 0xFF) ? -1000 : 0)); + } + + @Override + public FluidBuffer getPipeBuffer(int side) { + int rt = CoreLib.rotToSide(super.Rotation); + return side == rt ? this.outbuf : (side == ((rt ^ 1) & 0xFF) ? this.inbuf : null); + } + + @Override + public int getConnectableMask() { + return 3 << ((super.Rotation & 1) << 1) | 17895680; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + super.Rotation = (int)Math.floor((double)(ent.rotationYaw * 4.0F / 360.0F) + 2.5) & 3; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (!super.Powered) { + super.Powered = true; + this.markDirty(); + } + } else { + super.Powered = false; + this.markDirty(); + } + + } + + private void pumpFluid() { + if (this.inbuf.Type != null) { + int lv = Math.min(this.inbuf.getLevel(), this.outbuf.getMaxLevel() - this.outbuf.getLevel()); + lv = Math.min(lv, this.inbuf.getLevel() + this.inbuf.Delta); + if (lv > 0 && (this.inbuf.Type == this.outbuf.Type || this.outbuf.Type == null)) { + this.outbuf.addLevel(this.inbuf.Type, lv); + this.inbuf.addLevel(this.inbuf.Type, -lv); + } + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (super.worldObj.isRemote) { + if (super.Active) { + ++this.PumpTick; + if (this.PumpTick >= 16) { + this.PumpTick = 0; + } + } + } else { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + int rt = CoreLib.rotToSide(super.Rotation); + PipeLib.movePipeLiquid(super.worldObj, this, new WorldCoord(this), 3 << (rt & -2)); + boolean act = super.Active; + if (super.Active) { + ++this.PumpTick; + if (this.PumpTick == 8) { + this.cond.drawPower(10000.0); + this.pumpFluid(); + } + + if (this.PumpTick >= 16) { + this.PumpTick = 0; + super.Active = false; + } + + this.cond.drawPower(200.0); + } + + if (this.cond.getVoltage() < 60.0) { + if (super.Charged && this.cond.Flow == 0) { + super.Charged = false; + this.updateBlock(); + } + } else { + if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + + if (super.Charged && super.Powered) { + super.Active = true; + } + + if (super.Active != act) { + this.updateBlock(); + } + } + } + + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote && !super.Powered) { + super.Active = false; + this.updateBlock(); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + this.inbuf.readFromNBT(data, "inb"); + this.outbuf.readFromNBT(data, "outb"); + this.PumpTick = data.getByte("ptk"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + this.inbuf.writeToNBT(data, "inb"); + this.outbuf.writeToNBT(data, "outb"); + data.setByte("ptk", this.PumpTick); + } + + private class PumpBuffer extends FluidBuffer { + private PumpBuffer() { + } + + @Override + public TileEntity getParent() { + return TilePump.this; + } + + @Override + public void onChange() { + TilePump.this.markDirty(); + } + + @Override + public int getMaxLevel() { + return 1000; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileRedstoneTube.java b/src/main/java/com/eloraam/redpower/machine/TileRedstoneTube.java new file mode 100644 index 0000000..8ced477 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileRedstoneTube.java @@ -0,0 +1,163 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public class TileRedstoneTube extends TileTube implements IRedPowerWiring { + public short PowerState = 0; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + int tr = 63; + + for(int i = 0; i < 6; ++i) { + if ((super.CoverSides & 1 << i) > 0 && super.Covers[i] >> 8 < 3) { + tr &= ~(1 << i); + } + } + + return tr << 24; + } + + @Override + public int getConnectionMask() { + if (this.ConMask >= 0) { + return this.ConMask; + } else { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + return this.ConMask; + } + } + + @Override + public int getExtConnectionMask() { + return 0; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(iba, this, super.xCoord, super.yCoord, super.zCoord); + } + + } + + @Override + public int getConnectClass(int side) { + return 1; + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return ch != 0 ? -1 : ((cons & this.getConnectableMask()) == 0 ? -1 : this.PowerState); + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return ch != 0 ? 0 : (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cons, this.getConnectionMask()) ? 255 : 0); + } + + @Override + public void updateCurrentStrength() { + this.PowerState = (short)RedPowerLib.updateBlockCurrentStrength(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, 1073741823, 1); + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getPoweringMask(int ch) { + return ch == 0 && this.PowerState != 0 ? this.getConnectableMask() : 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + super.onBlockNeighborChange(block); + if (this.ConMask >= 0) { + this.markForUpdate(); + } + + this.ConMask = -1; + RedPowerLib.updateCurrent(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getExtendedID() { + return 9; + } + + @Override + public boolean isBlockWeakPoweringTo(int side) { + if (!RedPowerLib.isSearching() && (this.getConnectionMask() & 16777216 << (side ^ 1)) != 0) { + if (RedPowerLib.isBlockRedstone(super.worldObj, super.xCoord, super.yCoord, super.zCoord, side ^ 1)) { + if (this.PowerState > 15) { + return true; + } + } else if (this.PowerState > 0) { + return true; + } + } + + return false; + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!this.canAddCover(side, cover)) { + return false; + } else { + super.CoverSides |= 1 << side; + super.Covers[side] = (short)cover; + this.ConMask = -1; + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + if ((super.CoverSides & 1 << side) == 0) { + return -1; + } else { + super.CoverSides &= ~(1 << side); + short tr = super.Covers[side]; + super.Covers[side] = 0; + this.ConMask = -1; + this.updateBlockChange(); + return tr; + } + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.PowerState = (short)(data.getByte("pwr") & 255); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("pwr", (byte)this.PowerState); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.PowerState = (short)(data.getByte("pwr") & 255); + this.ConMask = -1; + super.readFromPacket(data); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setByte("pwr", (byte)this.PowerState); + super.writeToPacket(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileRegulator.java b/src/main/java/com/eloraam/redpower/machine/TileRegulator.java new file mode 100644 index 0000000..5b1222a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileRegulator.java @@ -0,0 +1,440 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import java.util.stream.IntStream; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +public class TileRegulator extends TileMachine implements ITubeConnectable, ISidedInventory { + private TubeBuffer buffer = new TubeBuffer(); + public byte mode = 0; + protected ItemStack[] contents = new ItemStack[27]; + protected MachineLib.FilterMap inputMap = null; + protected MachineLib.FilterMap outputMap = null; + public int color = 0; + + private void regenFilterMap() { + this.inputMap = MachineLib.makeFilterMap(this.contents, 0, 9); + this.outputMap = MachineLib.makeFilterMap(this.contents, 18, 9); + } + + @Override + public int getTubeConnectableSides() { + return 3 << (super.Rotation & -2); + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + this.buffer.addBounce(item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return true; + } else if (side == (super.Rotation ^ 1) && state == 1) { + int ic = this.inCount(item.item); + if (ic == 0) { + return false; + } else { + boolean tr = true; + ItemStack ist = item.item; + if (ic < ist.stackSize) { + tr = false; + ist = ist.splitStack(ic); + } + + if (MachineLib.addToInventoryCore(this, ist, IntStream.range(0, 9).toArray(), true)) { + this.markDirty(); + this.scheduleTick(2); + this.markDirty(); + return tr; + } else { + this.markDirty(); + return false; + } + } + } else { + return false; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2 + || side == (super.Rotation ^ 1) + && state == 1 + && this.inCount(item.item) != 0 + && MachineLib.addToInventoryCore(this, item.item, IntStream.range(0, 9).toArray(), false); + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + public int[] getAccessibleSlotsFromSide(int side) { + return side != super.Rotation && side != (super.Rotation ^ 1) ? new int[]{9} : new int[0]; + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote && !this.isTickScheduled()) { + this.scheduleTick(10); + } + + } + + @Override + public boolean isPoweringTo(int side) { + return side != (super.Rotation ^ 1) && super.Powered; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 9, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public int getExtendedID() { + return 10; + } + + @Override + public void onBlockRemoval() { + this.buffer.onRemove(this); + + for(int i = 0; i < 27; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + private int[] scanInput() { + if (this.inputMap == null) { + this.regenFilterMap(); + } + + if (this.inputMap.size() == 0) { + return null; + } else { + int[] mc = MachineLib.genMatchCounts(this.inputMap); + MachineLib.decMatchCounts(this.inputMap, mc, this, IntStream.range(0, 9).toArray()); + return mc; + } + } + + private int inCount(ItemStack ist) { + if (this.inputMap == null) { + this.regenFilterMap(); + } + + if (this.inputMap.size() == 0) { + return 0; + } else if (!this.inputMap.containsKey(ist)) { + return 0; + } else { + int[] mc = MachineLib.genMatchCounts(this.inputMap); + MachineLib.decMatchCounts(this.inputMap, mc, this, IntStream.range(0, 9).toArray()); + return MachineLib.decMatchCount(this.inputMap, mc, ist); + } + } + + private int[] scanOutput() { + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation); + IInventory inv = MachineLib.getInventory(super.worldObj, wc); + if (inv == null) { + return null; + } else { + int[] slots; + if (inv instanceof ISidedInventory) { + ISidedInventory mc = (ISidedInventory)inv; + slots = mc.getAccessibleSlotsFromSide((super.Rotation ^ 1) & 0xFF); + } else { + slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + } + + if (this.outputMap == null) { + this.regenFilterMap(); + } + + if (this.outputMap.size() == 0) { + return null; + } else { + int[] mc1 = MachineLib.genMatchCounts(this.outputMap); + MachineLib.decMatchCounts(this.outputMap, mc1, inv, slots); + return mc1; + } + } + } + + private void handleTransfer(int[] omc) { + if (this.mode != 0 && omc != null) { + boolean var7 = false; + + for(int var8 = 0; var8 < 9; ++var8) { + while(omc[var8] > 0) { + ItemStack ist = this.contents[18 + var8].copy(); + int ss = Math.min(ist.stackSize, omc[var8]); + omc[var8] -= ss; + ist.stackSize = ss; + ItemStack is2 = MachineLib.collectOneStack(this, IntStream.range(0, 9).toArray(), ist); + if (is2 != null) { + this.buffer.addNewColor(is2, this.color); + var7 = true; + } + } + } + + if (!var7) { + return; + } + } else { + for(int ch = 0; ch < 9; ++ch) { + ItemStack i = this.contents[9 + ch]; + if (i != null && i.stackSize != 0) { + this.buffer.addNewColor(i, this.color); + this.contents[9 + ch] = null; + } + } + } + + this.markDirty(); + super.Powered = true; + super.Active = true; + this.updateBlockChange(); + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (super.Active) { + if (!this.buffer.isEmpty()) { + super.Powered = true; + this.drainBuffer(); + this.updateBlockChange(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } + + return; + } + + super.Active = false; + this.updateBlock(); + } + + if (super.Powered) { + int[] omc = this.scanOutput(); + if (omc == null) { + super.Powered = false; + this.updateBlockChange(); + } else if (!MachineLib.isMatchEmpty(omc)) { + int[] imc = this.scanInput(); + if (imc != null && MachineLib.isMatchEmpty(imc)) { + this.handleTransfer(omc); + } else { + super.Powered = false; + this.updateBlockChange(); + } + } + } else { + int[] omc = this.scanOutput(); + if (omc != null && MachineLib.isMatchEmpty(omc)) { + super.Powered = true; + this.updateBlockChange(); + } else { + int[] imc = this.scanInput(); + if (imc != null && MachineLib.isMatchEmpty(imc)) { + this.handleTransfer(omc); + } else if (omc != null && this.mode == 1) { + this.handleTransfer(omc); + } + } + } + } + + } + + public int getSizeInventory() { + return 27; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpregulate.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void markDirty() { + this.inputMap = null; + this.outputMap = null; + super.markDirty(); + } + + public void closeInventory() { + } + + public void openInventory() { + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int i = 0; i < items.tagCount(); ++i) { + NBTTagCompound item = items.getCompoundTagAt(i); + int j = item.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(item); + } + } + + this.buffer.readFromNBT(data); + this.mode = data.getByte("mode"); + this.color = data.getByte("col"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + this.buffer.writeToNBT(data); + data.setByte("mode", this.mode); + data.setByte("col", (byte)this.color); + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return side != super.Rotation && side != (super.Rotation ^ 1); + } + + public boolean hasCustomInventoryName() { + return true; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileRelay.java b/src/main/java/com/eloraam/redpower/machine/TileRelay.java new file mode 100644 index 0000000..0424207 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileRelay.java @@ -0,0 +1,75 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class TileRelay extends TileEjectBase { + @Override + public int getExtendedID() { + return 15; + } + + @Override + public void onTileTick() { + super.onTileTick(); + if (!super.worldObj.isRemote && !super.Active && this.handleExtract()) { + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!this.isTickScheduled()) { + this.scheduleTick(10); + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 13, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + protected boolean handleExtract() { + for(int n = 0; n < this.getSizeInventory(); ++n) { + ItemStack ist = this.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + this.addToBuffer(super.contents[n]); + this.setInventorySlotContents(n, null); + this.drainBuffer(); + return true; + } + } + + return false; + } + + @Override + public String getInventoryName() { + return "tile.rprelay.name"; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileRestrictTube.java b/src/main/java/com/eloraam/redpower/machine/TileRestrictTube.java new file mode 100644 index 0000000..df0917f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileRestrictTube.java @@ -0,0 +1,13 @@ +package com.eloraam.redpower.machine; + +public class TileRestrictTube extends TileTube { + @Override + public int tubeWeight(int side, int state) { + return 1000000; + } + + @Override + public int getExtendedID() { + return 10; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileRetriever.java b/src/main/java/com/eloraam/redpower/machine/TileRetriever.java new file mode 100644 index 0000000..266f0e6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileRetriever.java @@ -0,0 +1,309 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityMinecartContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +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; + +public class TileRetriever extends TileFilter implements IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileRetriever.this; + } + }; + public int ConMask = -1; + public byte select = 0; + public byte mode = 0; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == (super.Rotation ^ 1) && state == 3) { + if (!super.buffer.isEmpty()) { + return false; + } else { + if (super.filterMap == null) { + this.regenFilterMap(); + } + + if (super.filterMap.size() > 0 && !super.filterMap.containsKey(item.item)) { + return false; + } else { + super.buffer.addNewColor(item.item, super.color); + super.Delay = true; + this.updateBlock(); + this.scheduleTick(5); + this.drainBuffer(); + return true; + } + } + } else { + return side == super.Rotation && state == 2 && super.tubeItemEnter(side, state, item); + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + if (side == (super.Rotation ^ 1) && state == 3) { + if (!super.buffer.isEmpty()) { + return false; + } else { + if (super.filterMap == null) { + this.regenFilterMap(); + } + + return super.filterMap.size() == 0 || super.filterMap.containsKey(item.item); + } + } else { + return side == super.Rotation && state == 2 && super.tubeItemCanEnter(side, state, item); + } + } + + private void stepSelect() { + for(int i = 0; i < 9; ++i) { + ++this.select; + if (this.select > 8) { + this.select = 0; + } + + ItemStack ct = super.contents[this.select]; + if (ct != null && ct.stackSize > 0) { + return; + } + } + + this.select = 0; + } + + @Override + protected boolean handleExtract(WorldCoord wc) { + ITubeConnectable itc = CoreLib.getTileEntity(super.getWorldObj(), wc, ITubeConnectable.class); + if (itc != null && itc.canRouteItems()) { + if (this.cond.getVoltage() < 60.0) { + return false; + } else { + if (super.filterMap == null) { + this.regenFilterMap(); + } + + TubeLib.InRouteFinder irf = new TubeLib.InRouteFinder(super.worldObj, super.filterMap); + if (this.mode == 0) { + irf.setSubFilt(this.select); + } + + int sm = irf.find(new WorldCoord(this), 1 << (super.Rotation ^ 1)); + if (sm < 0) { + return false; + } else { + WorldCoord dest = irf.getResultPoint(); + IInventory inv = MachineLib.getInventory(super.worldObj, dest); + if (inv == null) { + return false; + } else { + int side = irf.getResultSide(); + int[] slots; + if (inv instanceof ISidedInventory) { + ISidedInventory tt = (ISidedInventory)inv; + slots = tt.getAccessibleSlotsFromSide(side); + } else { + slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + } + + dest.step(side); + TileTube tt1 = CoreLib.getTileEntity(super.worldObj, dest, TileTube.class); + if (tt1 == null) { + return false; + } else { + ItemStack ist = MachineLib.collectOneStack(inv, slots, super.contents[sm]); + if (ist == null) { + return false; + } else { + TubeItem ti = new TubeItem(side, ist); + this.cond.drawPower((double)(25 * ist.stackSize)); + ti.mode = 3; + tt1.addTubeItem(ti); + if (this.mode == 0) { + this.stepSelect(); + } + + return true; + } + } + } + } + } + } else { + return super.handleExtract(wc); + } + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.Flow == 0) { + if (super.Charged) { + super.Charged = false; + this.updateBlock(); + } + } else if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + super.onBlockNeighborChange(block); + } + + @Override + public void onTileTick() { + super.onTileTick(); + if (super.Delay) { + super.Delay = false; + this.updateBlock(); + } + + } + + @Override + protected void doSuck() { + this.suckEntities(this.getSizeBox(2.55, 5.05, -0.95)); + } + + @Override + protected boolean suckFilter(ItemStack ist) { + if (this.cond.getVoltage() < 60.0) { + return false; + } else if (!super.suckFilter(ist)) { + return false; + } else { + this.cond.drawPower((double)(25 * ist.stackSize)); + return true; + } + } + + @Override + protected int suckEntity(Entity ent) { + if (!(ent instanceof EntityMinecartContainer)) { + return super.suckEntity(ent); + } else if (this.cond.getVoltage() < 60.0) { + return 0; + } else { + if (super.filterMap == null) { + this.regenFilterMap(); + } + + EntityMinecartContainer em = (EntityMinecartContainer)ent; + int[] slots = IntStream.range(0, em.getSizeInventory()).toArray(); + if (!MachineLib.emptyInventory(em, slots)) { + return super.suckEntity(ent); + } else { + List items = new ArrayList(); + items.add(new ItemStack(Items.minecart, 1)); + if (em.func_145820_n().getMaterial() != Material.air) { + items.add(new ItemStack(em.func_145820_n(), 1, em.getDisplayTileData())); + } + + for(ItemStack ist : items) { + super.buffer.addNewColor(ist, super.color); + } + + em.setDead(); + this.cond.drawPower(200.0); + return 2; + } + } + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 7, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public int getExtendedID() { + return 8; + } + + @Override + public String getInventoryName() { + return "tile.rpretriever.name"; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + this.mode = data.getByte("mode"); + this.select = data.getByte("sel"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + data.setByte("mode", this.mode); + data.setByte("sel", this.select); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileSolarPanel.java b/src/main/java/com/eloraam/redpower/machine/TileSolarPanel.java new file mode 100644 index 0000000..8d0daba --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileSolarPanel.java @@ -0,0 +1,91 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class TileSolarPanel extends TileMachinePanel implements IBluePowerConnectable { + BluePowerConductor cond = new BluePowerConductor() { + @Override + public TileEntity getParent() { + return TileSolarPanel.this; + } + + @Override + public double getInvCap() { + return 4.0; + } + }; + public int ConMask = -1; + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (!World.doesBlockHaveSolidTopSurface(super.worldObj, super.xCoord, super.yCoord - 1, super.zCoord)) { + this.breakBlock(); + } + + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + @Override + public int getConnectableMask() { + return 16777231; + } + + @Override + public int getConnectClass(int side) { + return 64; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public void updateEntity() { + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.getVoltage() <= 100.0 + && super.worldObj.canBlockSeeTheSky(super.xCoord, super.yCoord, super.zCoord) + && super.worldObj.isDaytime() + && !super.worldObj.provider.hasNoSky) { + this.cond.applyDirect(2.0); + } + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileSorter.java b/src/main/java/com/eloraam/redpower/machine/TileSorter.java new file mode 100644 index 0000000..a472f5d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileSorter.java @@ -0,0 +1,791 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; + +public class TileSorter extends TileTranspose implements IInventory, ISidedInventory, IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileSorter.this; + } + }; + public int ConMask = -1; + private ItemStack[] contents = new ItemStack[40]; + public byte[] colors = new byte[8]; + public byte mode = 0; + public byte automode = 0; + public byte defcolor = 0; + public byte draining = -1; + public byte column = 0; + public int pulses = 0; + private MachineLib.FilterMap filterMap = null; + private TubeBuffer[] channelBuffers = new TubeBuffer[8]; + + public TileSorter() { + for(int i = 0; i < 8; ++i) { + this.channelBuffers[i] = new TubeBuffer(); + } + + } + + private void regenFilterMap() { + this.filterMap = MachineLib.makeFilterMap(this.contents); + } + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + public int[] getAccessibleSlotsFromSide(int side) { + return new int[0]; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (!super.Powered) { + super.Delay = false; + } + + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.Flow == 0) { + if (super.Charged) { + super.Charged = false; + this.updateBlock(); + } + } else if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + + if ((this.automode == 1 || this.automode == 2 && this.pulses > 0) && !this.isTickScheduled()) { + this.scheduleTick(10); + } + } + + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 5, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public int getExtendedID() { + return 5; + } + + @Override + public void onBlockRemoval() { + super.onBlockRemoval(); + + for(int i = 0; i < 8; ++i) { + this.channelBuffers[i].onRemove(this); + } + + for(int i = 0; i < 40; ++i) { + ItemStack ist = this.contents[i]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + if (this.automode == 0) { + super.onBlockNeighborChange(block); + } + + if (this.automode == 2) { + if (!RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + super.Powered = false; + this.markDirty(); + return; + } + + if (super.Powered) { + return; + } + + super.Powered = true; + this.markDirty(); + if (super.Delay) { + return; + } + + super.Delay = true; + ++this.pulses; + } + + } + + protected int getColumnMatch(ItemStack ist) { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + return -2; + } else { + int i = this.filterMap.firstMatch(ist); + return i < 0 ? i : i & 7; + } + } + + protected void fireMatch() { + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + } + + protected boolean tryDrainBuffer(TubeBuffer buf) { + if (buf.isEmpty()) { + return false; + } else { + while(!buf.isEmpty()) { + TubeItem ti = buf.getLast(); + if (this.stuffCart(ti.item)) { + buf.pop(); + } else { + if (!this.handleItem(ti)) { + buf.plugged = true; + return true; + } + + buf.pop(); + if (buf.plugged) { + return true; + } + } + } + + return true; + } + } + + protected boolean tryDrainBuffer() { + for(int i = 0; i < 9; ++i) { + ++this.draining; + TubeBuffer buf; + if (this.draining > 7) { + this.draining = -1; + buf = super.buffer; + } else { + buf = this.channelBuffers[this.draining]; + } + + if (this.tryDrainBuffer(buf)) { + return false; + } + } + + return true; + } + + protected boolean isBufferEmpty() { + if (!super.buffer.isEmpty()) { + return false; + } else { + for(int i = 0; i < 8; ++i) { + if (!this.channelBuffers[i].isEmpty()) { + return false; + } + } + + return true; + } + } + + @Override + public void drainBuffer() { + this.tryDrainBuffer(); + } + + private boolean autoTick() { + if (super.Active) { + return false; + } else if (this.automode == 2 && this.pulses == 0) { + return false; + } else { + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation ^ 1); + if (this.handleExtract(wc)) { + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + } else { + this.scheduleTick(10); + } + + return true; + } + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (this.automode == 1 && super.Powered) { + super.Powered = false; + this.updateBlock(); + } + + if ((this.automode <= 0 || !this.autoTick()) && super.Active) { + if (!this.tryDrainBuffer()) { + if (this.isBufferEmpty()) { + this.scheduleTick(5); + } else { + this.scheduleTick(10); + } + } else { + if (!super.Powered || this.automode == 2) { + super.Active = false; + this.updateBlock(); + } + + if (this.automode == 1 || this.automode == 2 && this.pulses > 0) { + this.scheduleTick(5); + } + } + } + } + + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + int cm = this.getColumnMatch(item.item); + TubeBuffer buf = super.buffer; + if (cm >= 0 && this.mode > 1) { + buf = this.channelBuffers[cm]; + } + + buf.addBounce(item); + this.fireMatch(); + return true; + } else if (side != (super.Rotation ^ 1) || state != 1) { + return false; + } else if (item.priority > 0) { + return false; + } else if (this.automode == 0 && super.Powered) { + return false; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else { + int cm = this.getColumnMatch(item.item); + TubeBuffer buf = super.buffer; + if (cm >= 0 && this.mode > 1) { + buf = this.channelBuffers[cm]; + } + + if (!buf.isEmpty()) { + return false; + } else if (cm >= 0) { + this.cond.drawPower((double)(25 * item.item.stackSize)); + buf.addNewColor(item.item, this.colors[cm]); + this.fireMatch(); + this.tryDrainBuffer(buf); + return true; + } else if (this.mode == 4 || this.mode == 6) { + this.cond.drawPower((double)(25 * item.item.stackSize)); + buf.addNewColor(item.item, this.defcolor); + this.fireMatch(); + this.tryDrainBuffer(buf); + return true; + } else if (cm == -2) { + this.cond.drawPower((double)(25 * item.item.stackSize)); + buf.addNewColor(item.item, 0); + this.fireMatch(); + this.tryDrainBuffer(buf); + return true; + } else { + return false; + } + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + return true; + } else if (side != (super.Rotation ^ 1) || state != 1) { + return false; + } else if (item.priority > 0) { + return false; + } else if (this.automode == 0 && super.Powered) { + return false; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else { + int cm = this.getColumnMatch(item.item); + TubeBuffer buf = super.buffer; + if (cm >= 0 && this.mode > 1) { + buf = this.channelBuffers[cm]; + } + + return buf.isEmpty() && (cm >= 0 || this.mode == 4 || this.mode == 6 || cm == -2); + } + } + + @Override + protected void addToBuffer(ItemStack ist) { + int cm = this.getColumnMatch(ist); + TubeBuffer buf = super.buffer; + if (cm >= 0 && this.mode > 1) { + buf = this.channelBuffers[cm]; + } + + if (cm < 0) { + if (this.mode != 4 && this.mode != 6) { + buf.addNewColor(ist, 0); + } else { + buf.addNewColor(ist, this.defcolor); + } + } else { + buf.addNewColor(ist, this.colors[cm]); + } + + } + + private void stepColumn() { + for(int i = 0; i < 8; ++i) { + ++this.column; + if (this.column > 7) { + if (this.pulses > 0) { + --this.pulses; + } + + this.column = 0; + } + + for(int a = 0; a < 5; ++a) { + ItemStack ct = this.contents[a * 8 + this.column]; + if (ct != null && ct.stackSize != 0) { + return; + } + } + } + + this.column = 0; + } + + private void checkColumn() { + for(int a = 0; a < 5; ++a) { + ItemStack ct = this.contents[a * 8 + this.column]; + if (ct != null && ct.stackSize != 0) { + return; + } + } + + this.stepColumn(); + this.markDirty(); + } + + @Override + protected boolean handleExtract(IInventory inv, int[] slots) { + if (this.cond.getVoltage() < 60.0) { + return false; + } else { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + if (this.filterMap.size() == 0) { + ItemStack var8 = MachineLib.collectOneStack(inv, slots, null); + if (var8 == null) { + return false; + } else { + if (this.mode != 4 && this.mode != 6) { + super.buffer.addNew(var8); + } else { + super.buffer.addNewColor(var8, this.defcolor); + } + + this.cond.drawPower((double)(25 * var8.stackSize)); + this.drainBuffer(); + return true; + } + } else { + int sm; + ItemStack coll; + switch(this.mode) { + case 0: + this.checkColumn(); + sm = MachineLib.matchAnyStackCol(this.filterMap, inv, slots, this.column); + if (sm < 0) { + return false; + } + + coll = MachineLib.collectOneStack(inv, slots, this.contents[sm]); + super.buffer.addNewColor(coll, this.colors[sm & 7]); + this.cond.drawPower((double)(25 * coll.stackSize)); + this.stepColumn(); + this.drainBuffer(); + return true; + case 1: + this.checkColumn(); + if (!MachineLib.matchAllCol(this.filterMap, inv, slots, this.column)) { + return false; + } + + for(int n = 0; n < 5; ++n) { + ItemStack match = this.contents[n * 8 + this.column]; + if (match != null && match.stackSize != 0) { + coll = MachineLib.collectOneStack(inv, slots, match); + super.buffer.addNewColor(coll, this.colors[this.column]); + this.cond.drawPower((double)(25 * coll.stackSize)); + } + } + + this.stepColumn(); + this.drainBuffer(); + return true; + case 2: + sm = 0; + + while(sm < 8 && !MachineLib.matchAllCol(this.filterMap, inv, slots, sm)) { + ++sm; + } + + if (sm == 8) { + return false; + } else { + for(int n = 0; n < 5; ++n) { + ItemStack match = this.contents[n * 8 + sm]; + if (match != null && match.stackSize != 0) { + coll = MachineLib.collectOneStack(inv, slots, match); + this.channelBuffers[sm].addNewColor(coll, this.colors[sm]); + this.cond.drawPower((double)(25 * coll.stackSize)); + } + } + + if (this.pulses > 0) { + --this.pulses; + } + + this.drainBuffer(); + return true; + } + case 3: + sm = MachineLib.matchAnyStack(this.filterMap, inv, slots); + if (sm < 0) { + return false; + } + + coll = MachineLib.collectOneStack(inv, slots, this.contents[sm]); + this.channelBuffers[sm & 7].addNewColor(coll, this.colors[sm & 7]); + this.cond.drawPower((double)(25 * coll.stackSize)); + if (this.pulses > 0) { + --this.pulses; + } + + this.drainBuffer(); + return true; + case 4: + sm = MachineLib.matchAnyStack(this.filterMap, inv, slots); + if (sm < 0) { + coll = MachineLib.collectOneStack(inv, slots, null); + if (coll == null) { + return false; + } + + super.buffer.addNewColor(coll, this.defcolor); + } else { + coll = MachineLib.collectOneStack(inv, slots, this.contents[sm]); + this.channelBuffers[sm & 7].addNewColor(coll, this.colors[sm & 7]); + } + + this.cond.drawPower((double)(25 * coll.stackSize)); + if (this.pulses > 0) { + --this.pulses; + } + + this.drainBuffer(); + return true; + case 5: + sm = MachineLib.matchAnyStack(this.filterMap, inv, slots); + if (sm < 0) { + return false; + } + + coll = MachineLib.collectOneStackFuzzy(inv, slots, this.contents[sm]); + this.channelBuffers[sm & 7].addNewColor(coll, this.colors[sm & 7]); + this.cond.drawPower((double)(25 * coll.stackSize)); + if (this.pulses > 0) { + --this.pulses; + } + + this.drainBuffer(); + return true; + case 6: + sm = MachineLib.matchAnyStack(this.filterMap, inv, slots); + if (sm < 0) { + coll = MachineLib.collectOneStack(inv, slots, null); + if (coll == null) { + return false; + } + + super.buffer.addNewColor(coll, this.defcolor); + } else { + coll = MachineLib.collectOneStackFuzzy(inv, slots, this.contents[sm]); + this.channelBuffers[sm & 7].addNewColor(coll, this.colors[sm & 7]); + } + + this.cond.drawPower((double)(25 * coll.stackSize)); + if (this.pulses > 0) { + --this.pulses; + } + + this.drainBuffer(); + return true; + default: + return false; + } + } + } + } + + @Override + protected boolean suckFilter(ItemStack ist) { + if (this.cond.getVoltage() < 60.0) { + return false; + } else { + if (this.filterMap == null) { + this.regenFilterMap(); + } + + int cm = this.getColumnMatch(ist); + TubeBuffer buf = super.buffer; + if (cm >= 0 && this.mode > 1) { + buf = this.channelBuffers[cm]; + } + + if (buf.plugged) { + return false; + } else if (cm < 0) { + if (this.mode != 4 && this.mode != 6 && cm != -2) { + return false; + } else { + this.cond.drawPower((double)(25 * ist.stackSize)); + return true; + } + } else { + this.cond.drawPower((double)(25 * ist.stackSize)); + return true; + } + } + } + + public int getSizeInventory() { + return 40; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "tile.rpsorter.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + public void markDirty() { + this.filterMap = null; + super.markDirty(); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int cols = 0; cols < items.tagCount(); ++cols) { + NBTTagCompound bufs = items.getCompoundTagAt(cols); + int i = bufs.getByte("Slot") & 255; + if (i >= 0 && i < this.contents.length) { + this.contents[i] = ItemStack.loadItemStackFromNBT(bufs); + } + } + + this.column = data.getByte("coln"); + byte[] cols = data.getByteArray("cols"); + if (cols.length >= 8) { + System.arraycopy(cols, 0, this.colors, 0, 8); + } + + this.mode = data.getByte("mode"); + this.automode = data.getByte("amode"); + this.draining = data.getByte("drain"); + if (this.mode == 4 || this.mode == 6) { + this.defcolor = data.getByte("defc"); + } + + this.pulses = data.getInteger("pulses"); + this.cond.readFromNBT(data); + NBTTagList buffers = data.getTagList("buffers", 10); + + for(int i = 0; i < buffers.tagCount(); ++i) { + NBTTagCompound buf = buffers.getCompoundTagAt(i); + this.channelBuffers[i].readFromNBT(buf); + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int bufs = 0; bufs < this.contents.length; ++bufs) { + if (this.contents[bufs] != null) { + NBTTagCompound i = new NBTTagCompound(); + i.setByte("Slot", (byte)bufs); + this.contents[bufs].writeToNBT(i); + items.appendTag(i); + } + } + + data.setByte("coln", this.column); + data.setTag("Items", items); + data.setByteArray("cols", this.colors); + data.setByte("mode", this.mode); + data.setByte("amode", this.automode); + data.setByte("drain", this.draining); + data.setInteger("pulses", this.pulses); + if (this.mode == 4 || this.mode == 6) { + data.setByte("defc", this.defcolor); + } + + this.cond.writeToNBT(data); + NBTTagList buffers = new NBTTagList(); + + for(int i = 0; i < 8; ++i) { + NBTTagCompound buf = new NBTTagCompound(); + this.channelBuffers[i].writeToNBT(buf); + buffers.appendTag(buf); + } + + data.setTag("buffers", buffers); + } + + public boolean canInsertItem(int slotID, ItemStack itemStack, int side) { + return false; + } + + public boolean canExtractItem(int slotID, ItemStack itemStack, int side) { + return false; + } + + public boolean hasCustomInventoryName() { + return false; + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileSortron.java b/src/main/java/com/eloraam/redpower/machine/TileSortron.java new file mode 100644 index 0000000..27dd933 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileSortron.java @@ -0,0 +1,469 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IRedbusConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeItem; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileSortron extends TileTranspose implements IBluePowerConnectable, IRedbusConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileSortron.this; + } + }; + public int ConMask = -1; + private int rbaddr = 4; + private int cmdDelay = 0; + private int command = 0; + private int itemSlot = 0; + private int itemType = 0; + private int itemDamage = 0; + private int itemDamageMax = 0; + private int itemQty = 0; + private int itemColor = 0; + private int itemInColor = 0; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 67; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int rbGetAddr() { + return this.rbaddr; + } + + @Override + public void rbSetAddr(int addr) { + this.rbaddr = addr; + } + + @Override + public int rbRead(int reg) { + switch(reg) { + case 0: + return this.command & 0xFF; + case 1: + return this.itemQty & 0xFF; + case 2: + return this.itemSlot & 0xFF; + case 3: + return this.itemSlot >> 8 & 0xFF; + case 4: + return this.itemType & 0xFF; + case 5: + return this.itemType >> 8 & 0xFF; + case 6: + return this.itemType >> 16 & 0xFF; + case 7: + return this.itemType >> 24 & 0xFF; + case 8: + return this.itemDamage & 0xFF; + case 9: + return this.itemDamage >> 8 & 0xFF; + case 10: + return this.itemDamageMax & 0xFF; + case 11: + return this.itemDamageMax >> 8 & 0xFF; + case 12: + return this.itemColor & 0xFF; + case 13: + return this.itemInColor & 0xFF; + default: + return 0; + } + } + + @Override + public void rbWrite(int reg, int dat) { + this.markDirty(); + switch(reg) { + case 0: + this.command = dat; + this.cmdDelay = 2; + break; + case 1: + this.itemQty = dat; + break; + case 2: + this.itemSlot = this.itemSlot & 0xFF00 | dat; + break; + case 3: + this.itemSlot = this.itemSlot & 0xFF | dat << 8; + break; + case 4: + this.itemType = this.itemType & -256 | dat; + break; + case 5: + this.itemType = this.itemType & -65281 | dat << 8; + break; + case 6: + this.itemType = this.itemType & -16711681 | dat << 16; + break; + case 7: + this.itemType = this.itemType & 16777215 | dat << 24; + break; + case 8: + this.itemDamage = this.itemDamage & 0xFF00 | dat; + break; + case 9: + this.itemDamage = this.itemDamage & 0xFF | dat << 8; + break; + case 10: + this.itemDamageMax = this.itemDamageMax & 0xFF00 | dat; + break; + case 11: + this.itemDamageMax = this.itemDamageMax & 0xFF | dat << 8; + break; + case 12: + this.itemColor = dat; + break; + case 13: + this.itemInColor = dat; + } + + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cmdDelay > 0 && --this.cmdDelay == 0) { + this.processCommand(); + } + + if (this.cond.Flow == 0) { + if (super.Charged) { + super.Charged = false; + this.updateBlock(); + } + } else if (!super.Charged) { + super.Charged = true; + this.updateBlock(); + } + } + + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockMachine2; + } + + @Override + public int getExtendedID() { + return 0; + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote && super.Active) { + if (!super.buffer.isEmpty()) { + this.drainBuffer(); + if (!super.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else { + super.Active = false; + this.updateBlock(); + } + } + + } + + public static int hashItem(ItemStack ist) { + String in = ist.getItem().getUnlocalizedName(); + int hc; + if (in == null) { + hc = ist.getItem().hashCode(); + } else { + hc = in.hashCode(); + } + + if (ist.getHasSubtypes()) { + hc ^= ist.getItemDamage(); + } + + return hc; + } + + private void processCommand() { + if (this.cond.getVoltage() < 60.0) { + this.cmdDelay = 20; + } else { + IInventory inv; + switch(this.command) { + case 0: + break; + case 1: + inv = this.getConnectedInventory(false); + if (inv == null) { + this.command = 255; + } else { + this.itemSlot = inv.getSizeInventory(); + this.command = 0; + } + break; + case 2: + inv = this.getConnectedInventory(false); + if (inv == null) { + this.command = 255; + } else if (this.itemSlot >= inv.getSizeInventory()) { + this.command = 255; + } else { + ItemStack ist = inv.getStackInSlot(this.itemSlot); + if (ist != null && ist.stackSize != 0) { + this.itemQty = ist.stackSize; + this.itemType = hashItem(ist); + if (ist.isItemStackDamageable()) { + this.itemDamage = ist.getItemDamage(); + this.itemDamageMax = ist.getMaxDamage(); + } else { + this.itemDamage = 0; + this.itemDamageMax = 0; + } + + this.command = 0; + } else { + this.itemQty = 0; + this.itemType = 0; + this.itemDamage = 0; + this.itemDamageMax = 0; + this.command = 0; + } + } + break; + case 3: + if (super.Active) { + this.cmdDelay = 2; + return; + } + + inv = this.getConnectedInventory(false); + if (inv == null) { + this.command = 255; + } else if (this.itemSlot >= inv.getSizeInventory()) { + this.command = 255; + } else { + ItemStack ist = inv.getStackInSlot(this.itemSlot); + if (ist != null && ist.stackSize != 0) { + int i = Math.min(this.itemQty, ist.stackSize); + this.itemQty = i; + if (this.itemColor > 16) { + this.itemColor = 0; + } + + super.buffer.addNewColor(inv.decrStackSize(this.itemSlot, i), this.itemColor); + this.cond.drawPower((double)(50 * ist.stackSize)); + this.drainBuffer(); + super.Active = true; + this.command = 0; + this.updateBlock(); + this.scheduleTick(5); + } else { + this.itemQty = 0; + this.command = 0; + } + } + break; + case 4: + if (this.itemQty == 0) { + this.command = 0; + } + break; + default: + this.command = 255; + } + } + + } + + @Override + protected boolean handleExtract(IInventory inv, int[] slots) { + return false; + } + + @Override + protected void addToBuffer(ItemStack ist) { + if (this.itemColor > 16) { + this.itemColor = 0; + } + + super.buffer.addNewColor(ist, this.itemColor); + } + + @Override + protected int suckEntity(Entity ent) { + if (ent instanceof EntityItem) { + EntityItem ei = (EntityItem)ent; + ItemStack ist = ei.getEntityItem(); + if (ist.stackSize != 0 && !ei.isDead) { + int st = ist.stackSize; + if (!this.suckFilter(ist)) { + return st == ist.stackSize ? 0 : 2; + } else { + this.addToBuffer(ist); + ei.setDead(); + return 1; + } + } else { + return 0; + } + } else { + return 0; + } + } + + @Override + protected boolean suckFilter(ItemStack ist) { + if (this.command != 4) { + return false; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else if (this.itemType != 0 && this.itemType != hashItem(ist)) { + return false; + } else { + boolean tr = true; + if (this.itemQty < ist.stackSize) { + tr = false; + ist = ist.splitStack(this.itemQty); + if (this.itemColor > 16) { + this.itemColor = 0; + } + + super.buffer.addNewColor(ist, this.itemColor); + } + + this.itemQty -= ist.stackSize; + if (this.itemQty == 0) { + this.command = 0; + } + + this.cond.drawPower((double)(50 * ist.stackSize)); + return tr; + } + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + return super.tubeItemEnter(side, state, item); + } else if (side != (super.Rotation ^ 1) || state != 1) { + return false; + } else if (this.command != 4) { + return false; + } else if (this.cond.getVoltage() < 60.0) { + return false; + } else if (this.itemType != 0 && this.itemType != hashItem(item.item)) { + return false; + } else if (this.itemInColor != 0 && this.itemInColor != item.color) { + return false; + } else { + boolean tr = true; + ItemStack ist = item.item; + if (this.itemQty < ist.stackSize) { + tr = false; + ist = ist.splitStack(this.itemQty); + } + + this.itemQty -= ist.stackSize; + if (this.itemQty == 0) { + this.command = 0; + } + + if (this.itemColor > 16) { + this.itemColor = 0; + } + + super.buffer.addNewColor(ist, this.itemColor); + this.cond.drawPower((double)(50 * ist.stackSize)); + this.drainBuffer(); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return tr; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2 + || side == (super.Rotation ^ 1) + && state == 1 + && this.command == 4 + && this.cond.getVoltage() >= 60.0 + && (this.itemType == 0 || this.itemType == hashItem(item.item)) + && (this.itemInColor == 0 || this.itemInColor == item.color); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + this.rbaddr = data.getByte("rbaddr") & 255; + this.cmdDelay = data.getByte("cmddelay") & 255; + this.command = data.getByte("cmd") & 255; + this.itemSlot = data.getShort("itemslot"); + this.itemType = data.getInteger("itemtype"); + this.itemDamage = data.getShort("itemdmg"); + this.itemDamageMax = data.getShort("itemdmgmax"); + this.itemQty = data.getByte("itemqty") & 255; + this.itemInColor = data.getByte("itemincolor") & 255; + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + data.setByte("rbaddr", (byte)this.rbaddr); + data.setByte("cmddelay", (byte)this.cmdDelay); + data.setByte("cmd", (byte)this.command); + data.setShort("itemslot", (short)this.itemSlot); + data.setInteger("itemtype", this.itemType); + data.setShort("itemdmg", (short)this.itemDamage); + data.setShort("itemdmgmax", (short)this.itemDamageMax); + data.setByte("itemqty", (byte)this.itemQty); + data.setByte("itemcolor", (byte)this.itemColor); + data.setByte("itemincolor", (byte)this.itemInColor); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileThermopile.java b/src/main/java/com/eloraam/redpower/machine/TileThermopile.java new file mode 100644 index 0000000..c0428fc --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileThermopile.java @@ -0,0 +1,177 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileExtended; +import com.eloraam.redpower.core.WorldCoord; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileThermopile extends TileExtended implements IBluePowerConnectable { + BluePowerConductor cond = new BluePowerConductor() { + @Override + public TileEntity getParent() { + return TileThermopile.this; + } + + @Override + public double getInvCap() { + return 4.0; + } + }; + public int tempHot = 0; + public int tempCold = 0; + public int ticks = 0; + public int ConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 64; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int getExtendedID() { + return 11; + } + + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + private void updateTemps() { + int hot = 0; + int cold = 0; + + for(int side = 0; side < 6; ++side) { + WorldCoord wc = new WorldCoord(this); + wc.step(side); + Block bid = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if (super.worldObj.isAirBlock(wc.x, wc.y, wc.z)) { + if (super.worldObj.provider.isHellWorld) { + ++hot; + } else { + ++cold; + } + } else if (bid == Blocks.snow) { + cold += 100; + } else if (bid == Blocks.ice) { + cold += 100; + } else if (bid == Blocks.snow_layer) { + cold += 50; + } else if (bid == Blocks.torch) { + hot += 5; + } else if (bid == Blocks.lit_pumpkin) { + hot += 3; + } else if (bid == Blocks.flowing_water || bid == Blocks.water) { + cold += 25; + } else if (bid == Blocks.flowing_lava || bid == Blocks.lava) { + hot += 100; + } else if (bid == Blocks.fire) { + hot += 25; + } + } + + if (this.tempHot >= 100 && this.tempCold >= 200) { + for(int side = 0; side < 6; ++side) { + WorldCoord wc = new WorldCoord(this); + wc.step(side); + Block bid = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if ((bid == Blocks.flowing_lava || bid == Blocks.lava) && super.worldObj.rand.nextInt(300) == 0) { + int md = super.worldObj.getBlockMetadata(wc.x, wc.y, wc.z); + super.worldObj.setBlock(wc.x, wc.y, wc.z, (Block)(md == 0 ? Blocks.obsidian : RedPowerWorld.blockStone), md > 0 ? 1 : 0, 3); + break; + } + } + } + + if (this.tempHot >= 100) { + for(int side = 0; side < 6; ++side) { + if (super.worldObj.rand.nextInt(300) == 0) { + WorldCoord wc = new WorldCoord(this); + wc.step(side); + Block bid = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if (bid == Blocks.snow_layer) { + super.worldObj.setBlockToAir(wc.x, wc.y, wc.z); + break; + } + + if (bid == Blocks.ice || bid == Blocks.snow) { + super.worldObj.setBlock(wc.x, wc.y, wc.z, (Block)(super.worldObj.provider.isHellWorld ? Blocks.air : Blocks.flowing_water), 0, 3); + break; + } + } + } + } + + this.tempHot = hot; + this.tempCold = cold; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, 0); + } + + this.cond.iterate(); + this.markDirty(); + if (this.cond.getVoltage() <= 100.0) { + ++this.ticks; + if (this.ticks > 20) { + this.ticks = 0; + this.updateTemps(); + } + + int diff = Math.min(this.tempHot, this.tempCold); + this.cond.applyDirect(0.005 * (double)diff); + } + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + this.tempHot = data.getShort("hot"); + this.tempCold = data.getShort("cold"); + this.ticks = data.getByte("ticks"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + data.setShort("hot", (short)this.tempHot); + data.setShort("cold", (short)this.tempCold); + data.setByte("ticks", (byte)this.ticks); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileTransformer.java b/src/main/java/com/eloraam/redpower/machine/TileTransformer.java new file mode 100644 index 0000000..f747177 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileTransformer.java @@ -0,0 +1,190 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.BluePowerEndpoint; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileTransformer extends TileMachinePanel implements IBluePowerConnectable { + BluePowerEndpoint cond = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileTransformer.this; + } + }; + BluePowerEndpoint cond2 = new BluePowerEndpoint() { + @Override + public TileEntity getParent() { + return TileTransformer.this; + } + + @Override + public double getResistance() { + return 1.0; + } + + @Override + public double getIndScale() { + return 7.0E-4; + } + + @Override + public double getCondParallel() { + return 0.005; + } + + @Override + public double getInvCap() { + return 25.0; + } + + @Override + protected void computeVoltage() { + super.Vcap = TileTransformer.this.cond.getVoltage() * 100.0; + super.Itot = TileTransformer.this.cond.Itot * 0.01; + super.It1 = 0.0; + super.Icap = 0.0; + } + + @Override + public void applyCurrent(double Iin) { + TileTransformer.this.cond.applyCurrent(Iin * 100.0); + } + }; + public int ConMask1 = -1; + public int ConMask2 = -1; + + @Override + public int getPartMaxRotation(int part, boolean sec) { + return sec ? 0 : 3; + } + + @Override + public int getPartRotation(int part, boolean sec) { + return sec ? 0 : super.Rotation & 3; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + if (!sec) { + super.Rotation = rot & 3 | super.Rotation & -4; + this.updateBlockChange(); + } + + } + + @Override + public int getConnectableMask() { + return RedPowerLib.mapRotToCon(5, super.Rotation); + } + + @Override + public int getConnectClass(int side) { + int s = RedPowerLib.mapRotToCon(1, super.Rotation); + return (s & RedPowerLib.getConDirMask(side)) > 0 ? 64 : 68; + } + + @Override + public int getCornerPowerMode() { + return 0; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return (RedPowerLib.mapRotToCon(1, super.Rotation) & RedPowerLib.getConDirMask(side)) > 0 ? this.cond : this.cond2; + } + + @Override + public int getExtendedID() { + return 4; + } + + @Override + public void onBlockPlaced(ItemStack ist, int side, EntityLivingBase ent) { + super.Rotation = (side ^ 1) << 2; + int yaw = (int)Math.floor((double)(ent.rotationYaw / 90.0F + 0.5F)); + int pitch = (int)Math.floor((double)(ent.rotationPitch / 90.0F + 0.5F)); + yaw &= 3; + int down = super.Rotation >> 2; + int rot; + switch(down) { + case 0: + rot = yaw; + break; + case 1: + rot = yaw ^ (yaw & 1) << 1; + break; + case 2: + rot = (yaw & 1) > 0 ? (pitch > 0 ? 2 : 0) : 1 - yaw & 3; + break; + case 3: + rot = (yaw & 1) > 0 ? (pitch > 0 ? 2 : 0) : yaw - 1 & 3; + break; + case 4: + rot = (yaw & 1) == 0 ? (pitch > 0 ? 2 : 0) : yaw - 2 & 3; + break; + case 5: + rot = (yaw & 1) == 0 ? (pitch > 0 ? 2 : 0) : 2 - yaw & 3; + break; + default: + rot = 0; + } + + super.Rotation = down << 2 | rot; + if (ent instanceof EntityPlayer) { + super.Owner = ((EntityPlayer)ent).getGameProfile(); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask1 = -1; + this.ConMask2 = -1; + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (this.ConMask1 < 0) { + int cm1 = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.ConMask1 = cm1 & RedPowerLib.mapRotToCon(1, super.Rotation); + this.ConMask2 = cm1 & RedPowerLib.mapRotToCon(4, super.Rotation); + this.cond.recache(this.ConMask1, 0); + this.cond2.recache(this.ConMask2, 0); + } + + this.cond.iterate(); + this.cond2.iterate(); + this.markDirty(); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagCompound c1 = data.getCompoundTag("c1"); + this.cond.readFromNBT(c1); + NBTTagCompound c2 = data.getCompoundTag("c2"); + this.cond2.readFromNBT(c2); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagCompound c1 = new NBTTagCompound(); + this.cond.writeToNBT(c1); + NBTTagCompound c2 = new NBTTagCompound(); + this.cond2.writeToNBT(c2); + data.setTag("c1", c1); + data.setTag("c2", c2); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileTranspose.java b/src/main/java/com/eloraam/redpower/machine/TileTranspose.java new file mode 100644 index 0000000..7fa4127 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileTranspose.java @@ -0,0 +1,346 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.core.ITubeConnectable; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TubeBuffer; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.WorldCoord; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; +import net.minecraft.block.Block; +import net.minecraft.block.BlockRail; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityMinecartContainer; +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.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileTranspose extends TileMachine implements ITubeConnectable { + TubeBuffer buffer = new TubeBuffer(); + + @Override + public int getTubeConnectableSides() { + return 3 << (super.Rotation & -2); + } + + @Override + public int getTubeConClass() { + return 0; + } + + @Override + public boolean canRouteItems() { + return false; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (side == super.Rotation && state == 2) { + this.buffer.addBounce(item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + return true; + } else if (side != (super.Rotation ^ 1) || state != 1) { + return false; + } else if (super.Powered) { + return false; + } else if (!this.buffer.isEmpty()) { + return false; + } else { + this.addToBuffer(item.item); + super.Active = true; + this.updateBlock(); + this.scheduleTick(5); + this.drainBuffer(); + return true; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return side == super.Rotation && state == 2 || side == (super.Rotation ^ 1) && state == 1 && this.buffer.isEmpty() && !super.Powered; + } + + @Override + public int tubeWeight(int side, int state) { + return side == super.Rotation && state == 2 ? this.buffer.size() : 0; + } + + protected void addToBuffer(ItemStack ist) { + this.buffer.addNew(ist); + } + + public boolean canSuck(int i, int j, int k) { + if (super.worldObj.getBlock(i, j, k).isSideSolid(super.worldObj, i, j, k, ForgeDirection.getOrientation(super.Rotation))) { + return false; + } else { + TileEntity te = super.worldObj.getTileEntity(i, j, k); + return te == null || !(te instanceof IInventory) && !(te instanceof ITubeConnectable); + } + } + + @Override + public void onBlockNeighborChange(Block block) { + if (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, 16777215, 63)) { + if (!super.Powered) { + super.Powered = true; + this.markDirty(); + if (!super.Active) { + super.Active = true; + WorldCoord wc = new WorldCoord(super.xCoord, super.yCoord, super.zCoord); + wc.step(super.Rotation ^ 1); + if (this.canSuck(wc.x, wc.y, wc.z)) { + this.doSuck(); + this.updateBlock(); + } else if (this.handleExtract(wc)) { + this.updateBlock(); + } + } + } + } else { + if (super.Active && !this.isTickScheduled()) { + this.scheduleTick(5); + } + + super.Powered = false; + this.markDirty(); + } + + } + + protected IInventory getConnectedInventory(boolean push) { + WorldCoord pos = new WorldCoord(this); + pos.step(super.Rotation ^ 1); + return MachineLib.getSideInventory(super.worldObj, pos, super.Rotation, push); + } + + protected boolean handleExtract(WorldCoord wc) { + IInventory inv = MachineLib.getInventory(super.worldObj, wc); + if (inv == null) { + return false; + } else { + int[] slots; + if (inv instanceof ISidedInventory) { + ISidedInventory isi = (ISidedInventory)inv; + slots = isi.getAccessibleSlotsFromSide(super.Rotation); + } else { + slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + } + + return this.handleExtract(inv, slots); + } + } + + protected boolean handleExtract(IInventory inv, int[] slots) { + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + this.addToBuffer(inv.decrStackSize(n, 1)); + this.drainBuffer(); + return true; + } + } + + return false; + } + + protected boolean handleExtract(IInventory inv, List slots) { + for(int n : slots) { + ItemStack ist = inv.getStackInSlot(n); + if (ist != null && ist.stackSize != 0) { + this.addToBuffer(inv.decrStackSize(n, 1)); + this.drainBuffer(); + return true; + } + } + + return false; + } + + protected AxisAlignedBB getSizeBox(double bw, double bf, double bb) { + double fx = (double)super.xCoord + 0.5; + double fy = (double)super.yCoord + 0.5; + double fz = (double)super.zCoord + 0.5; + switch(super.Rotation) { + case 0: + return AxisAlignedBB.getBoundingBox(fx - bw, (double)super.yCoord - bb, fz - bw, fx + bw, (double)super.yCoord + bf, fz + bw); + case 1: + return AxisAlignedBB.getBoundingBox(fx - bw, (double)(super.yCoord + 1) - bf, fz - bw, fx + bw, (double)(super.yCoord + 1) + bb, fz + bw); + case 2: + return AxisAlignedBB.getBoundingBox(fx - bw, fy - bw, (double)super.zCoord - bb, fx + bw, fy + bw, (double)super.zCoord + bf); + case 3: + return AxisAlignedBB.getBoundingBox(fx - bw, fy - bw, (double)(super.zCoord + 1) - bf, fx + bw, fy + bw, (double)(super.zCoord + 1) + bb); + case 4: + return AxisAlignedBB.getBoundingBox((double)super.xCoord - bb, fy - bw, fz - bw, (double)super.xCoord + bf, fy + bw, fz + bw); + default: + return AxisAlignedBB.getBoundingBox((double)(super.xCoord + 1) - bf, fy - bw, fz - bw, (double)(super.xCoord + 1) + bb, fy + bw, fz + bw); + } + } + + protected void doSuck() { + this.suckEntities(this.getSizeBox(1.55, 3.05, -0.95)); + } + + protected boolean suckFilter(ItemStack ist) { + return true; + } + + protected int suckEntity(Entity ent) { + if (ent instanceof EntityItem) { + EntityItem em1 = (EntityItem)ent; + ItemStack ist = em1.getEntityItem(); + if (ist.stackSize == 0 || em1.isDead) { + return 0; + } else if (!this.suckFilter(ist)) { + return 0; + } else { + this.addToBuffer(ist); + em1.setDead(); + return 1; + } + } else { + if (ent instanceof EntityMinecartContainer) { + if (super.Active) { + return 0; + } + + EntityMinecartContainer em = (EntityMinecartContainer)ent; + List slots = new ArrayList(em.getSizeInventory()); + + for(int i = 0; i < em.getSizeInventory(); ++i) { + slots.add(i); + } + + if (this.handleExtract(em, slots)) { + return 2; + } + } + + return 0; + } + } + + protected void suckEntities(AxisAlignedBB bb) { + boolean trig = false; + + for(Entity ent : (List)super.worldObj.getEntitiesWithinAABB(Entity.class, bb)) { + int i = this.suckEntity(ent); + if (i != 0) { + trig = true; + if (i == 2) { + break; + } + } + } + + if (trig) { + if (!super.Active) { + super.Active = true; + this.updateBlock(); + } + + this.drainBuffer(); + this.scheduleTick(5); + } + + } + + public boolean stuffCart(ItemStack ist) { + WorldCoord wc = new WorldCoord(this); + wc.step(super.Rotation); + Block bl = super.worldObj.getBlock(wc.x, wc.y, wc.z); + if (!(bl instanceof BlockRail)) { + return false; + } else { + for(EntityMinecartContainer em : (List)super.worldObj.getEntitiesWithinAABB(EntityMinecartContainer.class, this.getSizeBox(0.8, 0.05, 1.05))) { + int[] slots = IntStream.range(0, em.getSizeInventory()).toArray(); + if (MachineLib.addToInventoryCore(em, ist, slots, true)) { + return true; + } + } + + return false; + } + } + + public void drainBuffer() { + while(!this.buffer.isEmpty()) { + TubeItem ti = this.buffer.getLast(); + if (this.stuffCart(ti.item)) { + this.buffer.pop(); + } else { + if (!this.handleItem(ti)) { + this.buffer.plugged = true; + return; + } + + this.buffer.pop(); + if (this.buffer.plugged) { + return; + } + } + } + + } + + @Override + public AxisAlignedBB getCollisionBoundingBox() { + return this.getSizeBox(0.5, 0.95, 0.0); + } + + @Override + public void onEntityCollidedWithBlock(Entity ent) { + if (!super.worldObj.isRemote && !super.Powered && this.buffer.isEmpty()) { + this.suckEntities(this.getSizeBox(0.55, 1.05, -0.95)); + } + + } + + @Override + public void onBlockRemoval() { + this.buffer.onRemove(this); + } + + @Override + public void onTileTick() { + if (!super.worldObj.isRemote) { + if (!this.buffer.isEmpty()) { + this.drainBuffer(); + if (!this.buffer.isEmpty()) { + this.scheduleTick(10); + } else { + this.scheduleTick(5); + } + } else if (!super.Powered) { + super.Active = false; + this.updateBlock(); + } + } + + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.buffer.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.buffer.writeToNBT(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileTube.java b/src/main/java/com/eloraam/redpower/machine/TileTube.java new file mode 100644 index 0000000..9a3b559 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileTube.java @@ -0,0 +1,333 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IPaintable; +import com.eloraam.redpower.core.ITubeFlow; +import com.eloraam.redpower.core.MachineLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.core.TubeFlow; +import com.eloraam.redpower.core.TubeItem; +import com.eloraam.redpower.core.TubeLib; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileTube extends TileCovered implements ITubeFlow, IPaintable { + protected TubeFlow flow = new TubeFlow() { + @Override + public TileEntity getParent() { + return TileTube.this; + } + + @Override + public boolean schedule(TubeItem item, TubeFlow.TubeScheduleContext context) { + item.scheduled = true; + item.progress = 0; + int i = context.cons & ~(1 << item.side); + if (i == 0) { + return true; + } else if (Integer.bitCount(i) == 1) { + item.side = (byte)Integer.numberOfTrailingZeros(i); + return true; + } else if (!TileTube.this.worldObj.isRemote) { + if (item.mode != 3) { + item.mode = 1; + } + + item.side = (byte)TubeLib.findRoute(context.world, context.wc, item, i, item.mode, TileTube.this.lastDir); + if (item.side >= 0) { + int m = i & ~((2 << TileTube.this.lastDir) - 1); + if (m == 0) { + m = i; + } + + if (m == 0) { + TileTube.this.lastDir = 0; + } else { + TileTube.this.lastDir = (byte)Integer.numberOfTrailingZeros(m); + } + } else { + if (item.mode == 1 && item.priority > 0) { + item.priority = 0; + item.side = (byte)TubeLib.findRoute(context.world, context.wc, item, context.cons, 1); + if (item.side >= 0) { + return true; + } + } + + item.side = (byte)TubeLib.findRoute(context.world, context.wc, item, context.cons, 2); + if (item.side >= 0) { + item.mode = 2; + return true; + } + + if (item.mode == 3) { + item.side = (byte)TubeLib.findRoute(context.world, context.wc, item, context.cons, 1); + item.mode = 1; + } + + if (item.side < 0) { + item.side = TileTube.this.lastDir; + int m = i & ~((2 << TileTube.this.lastDir) - 1); + if (m == 0) { + m = i; + } + + if (m == 0) { + TileTube.this.lastDir = 0; + } else { + TileTube.this.lastDir = (byte)Integer.numberOfTrailingZeros(m); + } + } + } + + return true; + } else { + return false; + } + } + + @Override + public boolean handleItem(TubeItem item, TubeFlow.TubeScheduleContext context) { + return MachineLib.addToInventory(TileTube.this.worldObj, item.item, context.dest, (item.side ^ 1) & 63); + } + }; + public byte lastDir = 0; + public byte paintColor = 0; + private boolean hasChanged = false; + + @Override + public int getTubeConnectableSides() { + int tr = 63; + + for(int i = 0; i < 6; ++i) { + if ((super.CoverSides & 1 << i) > 0 && super.Covers[i] >> 8 < 3) { + tr &= ~(1 << i); + } + } + + return tr; + } + + @Override + public int getTubeConClass() { + return this.paintColor; + } + + @Override + public boolean canRouteItems() { + return true; + } + + @Override + public boolean tubeItemEnter(int side, int state, TubeItem item) { + if (state != 0) { + return false; + } else if (item.color != 0 && this.paintColor != 0 && item.color != this.paintColor) { + return false; + } else { + item.side = (byte)side; + this.flow.add(item); + this.hasChanged = true; + this.markDirty(); + return true; + } + } + + @Override + public boolean tubeItemCanEnter(int side, int state, TubeItem item) { + return (item.color == 0 || this.paintColor == 0 || item.color == this.paintColor) && state == 0; + } + + @Override + public int tubeWeight(int side, int state) { + return 0; + } + + @Override + public void addTubeItem(TubeItem ti) { + ti.side = (byte)(ti.side ^ 1); + this.flow.add(ti); + this.hasChanged = true; + this.markDirty(); + } + + @Override + public TubeFlow getTubeFlow() { + return this.flow; + } + + @Override + public boolean tryPaint(int part, int side, int color) { + if (part == 29) { + if (this.paintColor == color) { + return false; + } else { + this.paintColor = (byte)color; + this.updateBlockChange(); + return true; + } + } else { + return false; + } + } + + @Override + public boolean canUpdate() { + return true; + } + + @Override + public void updateEntity() { + if (this.flow.update()) { + this.hasChanged = true; + } + + if (this.hasChanged) { + if (!super.worldObj.isRemote) { + this.markForUpdate(); + } + + this.markDirty(); + } + + } + + @Override + public Block getBlockType() { + return RedPowerBase.blockMicro; + } + + @Override + public int getExtendedID() { + return 8; + } + + @Override + public void onBlockNeighborChange(Block block) { + } + + @Override + public int getPartsMask() { + return super.CoverSides | 536870912; + } + + @Override + public int getSolidPartsMask() { + return super.CoverSides | 536870912; + } + + @Override + public boolean blockEmpty() { + return false; + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29) { + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8)); + } + + this.flow.onRemove(); + if (super.CoverSides > 0) { + this.replaceWithCovers(); + } else { + this.deleteBlock(); + } + } else { + super.onHarvestPart(player, part, willHarvest); + } + + } + + @Override + public void addHarvestContents(List ist) { + super.addHarvestContents(ist); + ist.add(new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8)); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockMachine bl = RedPowerMachine.blockMachine; + return part == 29 ? player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F) : super.getPartStrength(player, part); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + block.setBlockBounds(0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + } else { + super.setPartBounds(block, part); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.flow.readFromNBT(data); + this.lastDir = data.getByte("lDir"); + this.paintColor = data.getByte("pCol"); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.flow.writeToNBT(data); + data.setByte("lDir", this.lastDir); + data.setByte("pCol", this.paintColor); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + if (data.hasKey("flw")) { + this.flow.contents.clear(); + int cs = data.getInteger("cs"); + + for(int i = 0; i < cs; ++i) { + this.flow.contents.add(TubeItem.newFromPacket((NBTTagCompound)data.getTag("cs" + i))); + } + } else { + this.paintColor = data.getByte("pCol"); + super.readFromPacket(data); + } + + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + if (this.hasChanged) { + this.hasChanged = false; + data.setBoolean("flw", true); + int cs = this.flow.contents.size(); + if (cs > 6) { + cs = 6; + } + + data.setInteger("cs", cs); + + for(int i = 0; i < cs; ++i) { + TubeItem ti = (TubeItem)this.flow.contents.get(i); + NBTTagCompound ftag = new NBTTagCompound(); + ti.writeToPacket(ftag); + data.setTag("cs" + i, ftag); + } + } else { + data.setByte("pCol", this.paintColor); + super.writeToPacket(data); + } + + } + + @Override + protected ItemStack getBasePickStack() { + return new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() << 8); + } +} diff --git a/src/main/java/com/eloraam/redpower/machine/TileWindTurbine.java b/src/main/java/com/eloraam/redpower/machine/TileWindTurbine.java new file mode 100644 index 0000000..d74b706 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/machine/TileWindTurbine.java @@ -0,0 +1,572 @@ +package com.eloraam.redpower.machine; + +import com.eloraam.redpower.RedPowerMachine; +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.EnvironLib; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.IMultiblock; +import com.eloraam.redpower.core.MultiLib; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; +import net.minecraft.block.Block; +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.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +public class TileWindTurbine extends TileMachine implements IInventory, IBluePowerConnectable, IMultiblock { + BluePowerConductor cond = new BluePowerConductor() { + @Override + public TileEntity getParent() { + return TileWindTurbine.this; + } + + @Override + public double getInvCap() { + return 0.25; + } + }; + private byte[] rayTrace = null; + private int efficiency = 0; + private int tracer = 0; + public int windSpeed = 0; + public int speed = 0; + public int phase = 0; + private int power = 0; + private int propTicks = 0; + public boolean hasBlades = false; + public boolean hasBrakes = false; + public byte windmillType = 0; + protected ItemStack[] contents = new ItemStack[1]; + public int ConMask = -1; + public int EConMask = -1; + + @Override + public int getConnectableMask() { + return 1073741823; + } + + @Override + public int getConnectClass(int side) { + return 65; + } + + @Override + public int getCornerPowerMode() { + return 2; + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public void setPartRotation(int part, boolean sec, int rot) { + this.teardownBlades(); + super.setPartRotation(part, sec, rot); + } + + @Override + public void onMultiRemoval(int num) { + ItemStack ist = this.contents[0]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord + 1, super.zCoord, ist); + } + + this.contents[0] = null; + this.markDirty(); + this.teardownBlades(); + } + + @Override + public AxisAlignedBB getMultiBounds(int num) { + switch(this.windmillType) { + case 1: + return AxisAlignedBB.getBoundingBox(-2.5, 1.3, -2.5, 3.5, 9.0, 3.5); + case 2: + WorldCoord wc = new WorldCoord(0, 0, 0); + int right = WorldCoord.getRightDir(super.Rotation); + wc.step(super.Rotation ^ 1); + WorldCoord wc2 = wc.coordStep(super.Rotation ^ 1); + wc.step(right, 8); + wc2.step(right, -8); + return AxisAlignedBB.getBoundingBox( + (double)Math.min(wc.x, wc2.x) + 0.5, + -7.5, + Math.min((double)wc.z, (double)wc2.z + 0.5), + (double)Math.max(wc.x, wc2.x) + 0.5, + 8.5, + (double)Math.max(wc.z, wc2.z) + 0.5 + ); + default: + return AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + } + } + + @Override + public float getMultiBlockStrength(int num, EntityPlayer player) { + return 0.08F; + } + + @Override + public int getExtendedID() { + return 9; + } + + @Override + public Block getBlockType() { + return RedPowerMachine.blockMachine; + } + + public List getRelayBlockList(int wmt) { + List tr = new ArrayList(); + int right = WorldCoord.getRightDir(super.Rotation); + switch(wmt) { + case 1: + for(int x = -3; x <= 3; ++x) { + for(int y = -3; y <= 3; ++y) { + for(int i = 1; i < 8; ++i) { + tr.add(new WorldCoord(x + super.xCoord, i + super.yCoord, y + super.zCoord)); + } + } + } + break; + case 2: + for(int x = -8; x <= 8; ++x) { + for(int y = -8; y <= 8; ++y) { + WorldCoord nc = new WorldCoord(this); + nc.step(super.Rotation ^ 1); + nc.step(right, x); + nc.y += y; + tr.add(nc); + } + } + } + + return tr; + } + + private void teardownBlades() { + this.hasBlades = false; + this.efficiency = 0; + this.speed = 0; + this.rayTrace = null; + this.updateBlock(); + List rbl = this.getRelayBlockList(this.windmillType); + MultiLib.removeRelays(super.worldObj, new WorldCoord(this), rbl); + } + + @Override + public void updateEntity() { + super.updateEntity(); + if (!super.worldObj.isRemote) { + if (!this.isTickScheduled()) { + this.scheduleTick(5); + } + + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.EConMask = RedPowerLib.getExtConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.cond.recache(this.ConMask, this.EConMask); + } + + this.cond.iterate(); + this.markDirty(); + if (this.hasBlades) { + if (this.contents[0] == null || !(this.contents[0].getItem() instanceof ItemWindmill)) { + this.teardownBlades(); + return; + } + + ItemWindmill iwm = (ItemWindmill)this.contents[0].getItem(); + if (iwm.windmillType != this.windmillType) { + this.teardownBlades(); + return; + } + + if (this.propTicks <= 0) { + this.contents[0].setItemDamage(this.contents[0].getItemDamage() + 1); + if (this.contents[0].getItemDamage() > this.contents[0].getMaxDamage()) { + this.contents[0] = null; + this.markDirty(); + this.teardownBlades(); + this.contents[0] = iwm.getBrokenItem(); + this.markDirty(); + return; + } + + this.markDirty(); + this.propTicks += 6600; + } + + if (this.hasBrakes) { + return; + } + + --this.propTicks; + if (this.cond.getVoltage() > 130.0) { + return; + } + + this.cond.applyPower((double)(this.power / 5)); + } + } else if (this.hasBrakes) { + this.phase = (int)((double)this.phase + (double)this.speed * 0.1); + } else { + this.phase += this.speed; + } + + } + + private void traceAir0() { + int yh = super.yCoord + 1 + this.tracer / 28; + int xp = this.tracer % 7; + WorldCoord tp; + byte var6; + switch(this.tracer / 7 % 4) { + case 0: + var6 = 2; + tp = new WorldCoord(super.xCoord - 3 + xp, yh, super.zCoord - 4); + break; + case 1: + var6 = 4; + tp = new WorldCoord(super.xCoord - 4, yh, super.zCoord - 3 + xp); + break; + case 2: + var6 = 3; + tp = new WorldCoord(super.xCoord - 3 + xp, yh, super.zCoord + 4); + break; + default: + var6 = 5; + tp = new WorldCoord(super.xCoord + 4, yh, super.zCoord - 3 + xp); + } + + int i; + for(i = 0; i < 10 && super.worldObj.getBlock(tp.x, tp.y, tp.z) == Blocks.air; ++i) { + tp.step(var6); + } + + if (this.rayTrace == null) { + this.rayTrace = new byte[224]; + } + + this.efficiency = this.efficiency - this.rayTrace[this.tracer] + i; + this.rayTrace[this.tracer] = (byte)i; + ++this.tracer; + if (this.tracer >= 224) { + this.tracer = 0; + } + + } + + private void traceAir1() { + int yh = this.tracer / 17; + int xp = this.tracer % 17; + int dir2 = WorldCoord.getRightDir(super.Rotation); + WorldCoord tp = new WorldCoord(this); + tp.step(super.Rotation ^ 1, 2); + tp.step(dir2, xp - 8); + tp.y += yh; + + int i; + for(i = 0; i < 20 && super.worldObj.getBlock(tp.x, tp.y, tp.z) == Blocks.air; ++i) { + tp.step(super.Rotation ^ 1); + } + + if (this.rayTrace == null) { + this.rayTrace = new byte[289]; + } + + this.efficiency = this.efficiency - this.rayTrace[this.tracer] + i; + this.rayTrace[this.tracer] = (byte)i; + ++this.tracer; + if (this.tracer >= 289) { + this.tracer = 0; + } + + } + + public int getWindScaled(int i) { + return Math.min(i, i * this.windSpeed / 13333); + } + + private void tryDeployBlades() { + ItemWindmill iwm = (ItemWindmill)this.contents[0].getItem(); + if (iwm.canFaceDirection(super.Rotation)) { + List rbl = this.getRelayBlockList(iwm.windmillType); + if (MultiLib.isClear(super.worldObj, new WorldCoord(this), rbl)) { + this.windmillType = (byte)iwm.windmillType; + this.hasBlades = true; + MultiLib.addRelays(super.worldObj, new WorldCoord(this), 0, rbl); + this.updateBlock(); + } + } + + } + + @Override + public void onTileTick() { + if (!this.hasBlades && this.contents[0] != null && this.contents[0].getItem() instanceof ItemWindmill) { + this.tryDeployBlades(); + } + + if (!this.hasBrakes && this.cond.getVoltage() > 110.0) { + this.hasBrakes = true; + } else if (this.hasBrakes && this.cond.getVoltage() < 100.0) { + this.hasBrakes = false; + } + + this.windSpeed = (int)(10000.0 * EnvironLib.getWindSpeed(super.worldObj, new WorldCoord(this))); + if (this.hasBlades) { + switch(this.windmillType) { + case 1: + this.power = 2 * this.windSpeed * this.efficiency / 2240; + this.speed = this.power * this.power / 20000; + this.traceAir0(); + break; + case 2: + this.power = this.windSpeed * this.efficiency / 5780; + this.speed = this.power * this.power / 5000; + this.traceAir1(); + } + + this.updateBlock(); + } + + this.scheduleTick(20); + } + + public int getSizeInventory() { + return 1; + } + + public ItemStack getStackInSlot(int i) { + return this.contents[i]; + } + + public ItemStack decrStackSize(int i, int j) { + if (this.contents[i] == null) { + return null; + } else if (this.contents[i].stackSize <= j) { + ItemStack tr = this.contents[i]; + this.contents[i] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.contents[i].splitStack(j); + if (this.contents[i].stackSize == 0) { + this.contents[i] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int i) { + if (this.contents[i] == null) { + return null; + } else { + ItemStack ist = this.contents[i]; + this.contents[i] = null; + return ist; + } + } + + public void setInventorySlotContents(int i, ItemStack ist) { + this.contents[i] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + + public String getInventoryName() { + return "gui.windturbine"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public boolean isUseableByPlayer(EntityPlayer player) { + return !this.isInvalid() + && super.worldObj.getTileEntity(super.xCoord, super.yCoord, super.zCoord) == this + && player.getDistanceSq((double)super.xCoord + 0.5, (double)super.yCoord + 0.5, (double)super.zCoord + 0.5) <= 64.0; + } + + @Override + public void onBlockNeighborChange(Block block) { + this.ConMask = -1; + this.EConMask = -1; + } + + @Override + public boolean onBlockActivated(EntityPlayer player) { + if (player.isSneaking()) { + return false; + } else { + if (!super.worldObj.isRemote) { + player.openGui(RedPowerMachine.instance, 15, super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + return true; + } + } + + @Override + public void onBlockRemoval() { + super.onBlockRemoval(); + if (this.hasBlades) { + this.teardownBlades(); + } + + ItemStack ist = this.contents[0]; + if (ist != null && ist.stackSize > 0) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, ist); + } + + } + + @SideOnly(Side.CLIENT) + @Override + public double getMaxRenderDistanceSquared() { + return 1048576.0; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + NBTTagList items = data.getTagList("Items", 10); + this.contents = new ItemStack[this.getSizeInventory()]; + + for(int rt = 0; rt < items.tagCount(); ++rt) { + NBTTagCompound i = items.getCompoundTagAt(rt); + int j = i.getByte("Slot") & 255; + if (j >= 0 && j < this.contents.length) { + this.contents[j] = ItemStack.loadItemStackFromNBT(i); + } + } + + this.windmillType = data.getByte("wmt"); + this.hasBlades = this.windmillType > 0; + this.efficiency = 0; + byte[] rays = data.getByteArray("rays"); + if (rays != null) { + switch(this.windmillType) { + case 1: + if (rays.length != 224) { + rays = null; + } + break; + case 2: + if (rays.length != 289) { + rays = null; + } + break; + default: + rays = null; + } + } + + this.rayTrace = rays; + if (rays != null) { + for(byte b : rays) { + this.efficiency += b; + } + } + + this.tracer = data.getInteger("tracer"); + this.speed = data.getInteger("speed"); + this.power = data.getInteger("spdpwr"); + this.propTicks = data.getInteger("proptick"); + this.cond.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + NBTTagList items = new NBTTagList(); + + for(int i = 0; i < this.contents.length; ++i) { + if (this.contents[i] != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte)i); + this.contents[i].writeToNBT(item); + items.appendTag(item); + } + } + + data.setTag("Items", items); + if (!this.hasBlades) { + this.windmillType = 0; + } + + data.setByte("wmt", this.windmillType); + if (this.rayTrace != null) { + data.setByteArray("rays", this.rayTrace); + } + + data.setInteger("tracer", this.tracer); + data.setInteger("speed", this.speed); + data.setInteger("spdpwr", this.power); + data.setInteger("proptick", this.propTicks); + this.cond.writeToNBT(data); + } + + @Override + protected void readFromPacket(NBTTagCompound tag) { + super.readFromPacket(tag); + int ps = tag.getByte("ps"); + this.hasBlades = (ps & 1) > 0; + this.hasBrakes = (ps & 2) > 0; + this.windmillType = tag.getByte("wmt"); + this.speed = tag.getInteger("speed"); + } + + @Override + protected void writeToPacket(NBTTagCompound tag) { + super.writeToPacket(tag); + int ps = (this.hasBlades ? 1 : 0) | (this.hasBrakes ? 2 : 0); + tag.setByte("ps", (byte)ps); + tag.setByte("wmt", this.windmillType); + tag.setInteger("speed", this.speed); + } + + public boolean hasCustomInventoryName() { + return false; + } + + public void openInventory() { + } + + public void closeInventory() { + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return AxisAlignedBB.getBoundingBox( + Double.NEGATIVE_INFINITY, + Double.NEGATIVE_INFINITY, + Double.NEGATIVE_INFINITY, + Double.POSITIVE_INFINITY, + Double.POSITIVE_INFINITY, + Double.POSITIVE_INFINITY + ); + } + + public boolean isItemValidForSlot(int slotID, ItemStack stack) { + return stack.getItem() == RedPowerMachine.itemWoodWindmill || stack.getItem() == RedPowerMachine.itemWoodTurbine; + } +} diff --git a/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceOverlayHandler.java b/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceOverlayHandler.java new file mode 100644 index 0000000..09301f4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceOverlayHandler.java @@ -0,0 +1,24 @@ +package com.eloraam.redpower.nei; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.DefaultOverlayHandler; +import java.util.List; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Slot; + +public class AlloyFurnaceOverlayHandler extends DefaultOverlayHandler { + public Slot[][] mapIngredSlots(GuiContainer gui, List ingredients) { + Slot[][] map = super.mapIngredSlots(gui, ingredients); + Slot[] ingredSlots = new Slot[9]; + + for(int i = 0; i < 9; ++i) { + ingredSlots[i] = (Slot)gui.inventorySlots.inventorySlots.get(i); + } + + for(int i = 0; i < map.length; ++i) { + map[i] = ingredSlots; + } + + return map; + } +} diff --git a/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceRecipeHandler.java b/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceRecipeHandler.java new file mode 100644 index 0000000..2bfb1f6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/nei/AlloyFurnaceRecipeHandler.java @@ -0,0 +1,173 @@ +package com.eloraam.redpower.nei; + +import codechicken.lib.inventory.InventoryUtils; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.FurnaceRecipeHandler; +import codechicken.nei.recipe.ICraftingHandler; +import codechicken.nei.recipe.IUsageHandler; +import codechicken.nei.recipe.FurnaceRecipeHandler.FuelPair; +import codechicken.nei.recipe.TemplateRecipeHandler.CachedRecipe; +import codechicken.nei.recipe.TemplateRecipeHandler.RecipeTransferRect; +import com.eloraam.redpower.base.GuiAlloyFurnace; +import com.eloraam.redpower.core.CraftLib; +import com.eloraam.redpower.core.OreStack; +import cpw.mods.fml.common.FMLCommonHandler; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class AlloyFurnaceRecipeHandler extends FurnaceRecipeHandler implements ICraftingHandler, IUsageHandler { + public void loadTransferRects() { + this.transferRects.add(new RecipeTransferRect(new Rectangle(11, 12, 18, 18), "fuel", new Object[0])); + this.transferRects.add(new RecipeTransferRect(new Rectangle(102, 23, 24, 18), "alloy", new Object[0])); + } + + public Class getGuiClass() { + return GuiAlloyFurnace.class; + } + + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("alloy") && this.getClass() == AlloyFurnaceRecipeHandler.class) { + for(List lrecipe : CraftLib.alloyRecipes) { + this.arecipes.add(new AlloyFurnaceRecipeHandler.CachedAlloyRecipe(lrecipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + + } + + public void loadCraftingRecipes(ItemStack result) { + for(List lrecipe : CraftLib.alloyRecipes) { + if (NEIServerUtils.areStacksSameTypeCrafting((ItemStack)lrecipe.get(1), result)) { + this.arecipes.add(new AlloyFurnaceRecipeHandler.CachedAlloyRecipe(lrecipe)); + } + } + + } + + public void loadUsageRecipes(String inputId, Object... ingredients) { + if (inputId.equals("fuel") && this.getClass() == AlloyFurnaceRecipeHandler.class) { + this.loadCraftingRecipes("alloy"); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + + } + + public void loadUsageRecipes(ItemStack ingredient) { + for(List lrecipe : CraftLib.alloyRecipes) { + AlloyFurnaceRecipeHandler.CachedAlloyRecipe recipe = new AlloyFurnaceRecipeHandler.CachedAlloyRecipe(lrecipe); + if (recipe.contains(recipe.ingredients, ingredient)) { + this.arecipes.add(recipe); + } + } + + } + + public String getRecipeName() { + return I18n.format("tile.rpafurnace.name", new Object[0]); + } + + public String getGuiTexture() { + return "rpbase:textures/gui/afurnacegui.png"; + } + + public void drawExtras(int recipe) { + this.drawProgressBar(12, 14, 176, 0, 14, 14, 48, 7); + this.drawProgressBar(102, 23, 176, 14, 24, 16, 48, 0); + } + + public String getOverlayIdentifier() { + return "alloy"; + } + + public class AlloyDupeComparator implements Comparator> { + public int compare(List o1, List o2) { + ItemStack result1 = (ItemStack)o1.get(1); + ItemStack result2 = (ItemStack)o2.get(1); + int resultcompare = NEIServerUtils.compareStacks(result1, result2); + if (resultcompare != 0) { + return resultcompare; + } else { + ItemStack[] ingreds1 = (ItemStack[])o1.get(0); + ItemStack[] ingreds2 = (ItemStack[])o2.get(0); + int lengthcompare = Integer.valueOf(ingreds1.length).compareTo(ingreds2.length); + if (lengthcompare != 0) { + return lengthcompare; + } else { + for(int i = 0; i < ingreds1.length; ++i) { + int ingredcompare = NEIServerUtils.compareStacks(ingreds1[i], ingreds2[i]); + if (ingredcompare != 0) { + return ingredcompare; + } + } + + return 0; + } + } + } + } + + public class CachedAlloyRecipe extends CachedRecipe { + List ingredients = new ArrayList(); + ItemStack result; + + public CachedAlloyRecipe(Object[] ingreds, ItemStack result) { + super(); + + for(int i = 0; i < ingreds.length; ++i) { + Object ingred = null; + if (!(ingreds[i] instanceof OreStack)) { + if (ingreds[i] instanceof ItemStack) { + ingred = ingreds[i]; + } else { + FMLCommonHandler.instance().raiseException(new ClassCastException("not an ItemStack or OreStack"), "NEI", false); + } + } else { + OreStack ore = (OreStack)ingreds[i]; + List list = new ArrayList(OreDictionary.getOres(ore.material)); + + for(int j = 0; j < list.size(); ++j) { + list.set(j, InventoryUtils.copyStack((ItemStack)list.get(j), ore.quantity)); + } + + ingred = list; + } + + this.ingredients.add(new PositionedStack(ingred, 43 + i * 18, 6 + i / 3 * 18)); + } + + this.result = result; + } + + public CachedAlloyRecipe(List lrecipe) { + this((Object[])lrecipe.get(0), (ItemStack)lrecipe.get(1)); + } + + public PositionedStack getResult() { + return new PositionedStack(this.result, 136, 24); + } + + public List getIngredients() { + return this.ingredients; + } + + public List getOtherStacks() { + List slots = new ArrayList(); + slots.add( + new PositionedStack( + ((FuelPair)AlloyFurnaceRecipeHandler.afuels.get(AlloyFurnaceRecipeHandler.this.cycleticks / 48 % AlloyFurnaceRecipeHandler.afuels.size())).stack.item, + 12, + 31 + ) + ); + return slots; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/nei/ComboGenerator.java b/src/main/java/com/eloraam/redpower/nei/ComboGenerator.java new file mode 100644 index 0000000..1682499 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/nei/ComboGenerator.java @@ -0,0 +1,90 @@ +package com.eloraam.redpower.nei; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +public class ComboGenerator { + public static List> generate(int sum) { + if (sum < 2) { + return null; + } else { + List> combos = new ArrayList(); + if (sum == 2) { + combos.add(new LinkedList(Arrays.asList(1, 1))); + return combos; + } else { + for(int base = 1; base <= sum / 2; ++base) { + label37: + for(LinkedList combo : generate(sum - base)) { + for(Integer i : combo) { + if (i < base) { + continue label37; + } + } + + combo.addFirst(base); + combos.add(combo); + } + + combos.add(new LinkedList(Arrays.asList(base, sum - base))); + } + + return combos; + } + } + } + + public static void print(List> combos) { + System.out.println("Combinations summing to: " + sum((LinkedList)combos.get(0))); + + for(LinkedList combo : combos) { + StringBuilder line = new StringBuilder(); + boolean comma = false; + + for(Integer i : combo) { + if (!comma) { + comma = true; + } else { + line.append(','); + } + + line.append(i); + } + + System.out.println(line); + } + + } + + public static List> removeNotContaining(List> combos, int required) { + Iterator> iterator = combos.iterator(); + + label23: + while(iterator.hasNext()) { + LinkedList combo = (LinkedList)iterator.next(); + + for(Integer i : combo) { + if (i == required) { + continue label23; + } + } + + iterator.remove(); + } + + return combos; + } + + private static int sum(LinkedList combo) { + int sum = 0; + + for(Integer i : combo) { + sum += i; + } + + return sum; + } +} diff --git a/src/main/java/com/eloraam/redpower/nei/MicroRecipeHandler.java b/src/main/java/com/eloraam/redpower/nei/MicroRecipeHandler.java new file mode 100644 index 0000000..00f4f97 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/nei/MicroRecipeHandler.java @@ -0,0 +1,438 @@ +package com.eloraam.redpower.nei; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.ShapedRecipeHandler; +import codechicken.nei.recipe.TemplateRecipeHandler.CachedRecipe; +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.base.ItemHandsaw; +import com.eloraam.redpower.core.CoverLib; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class MicroRecipeHandler extends ShapedRecipeHandler { + public static int[] covers = new int[]{0, 16, 27, 17, 28, 29, 30}; + public static int[] strips = new int[]{21, 22, 39, 23, 40, 41, 42}; + public static int[] corners = new int[]{18, 19, 35, 20, 36, 37, 38}; + public static int[] posts = new int[]{-1, 43, -1, 44, -1, 45, -1}; + public static int[] hollow = new int[]{24, 25, 31, 26, 32, 33, 34}; + public static ItemHandsaw[] saws; + public static int[] materials; + public static Random rand = new Random(); + + public MicroRecipeHandler() { + load(); + } + + public static void load() { + if (materials == null) { + List amaterial = new ArrayList(); + + for(int i = 0; i < 256; ++i) { + if (CoverLib.getItemStack(i) != null) { + amaterial.add(i); + } + } + + materials = new int[amaterial.size()]; + + for(int i = 0; i < amaterial.size(); ++i) { + materials[i] = amaterial.get(i); + } + } + + } + + public static PositionedStack position(ItemStack item, int row, int col) { + return new PositionedStack(item, 25 + col * 18, 6 + row * 18); + } + + public String getRecipeName() { + return "Microblocks"; + } + + public void loadCraftingRecipes(ItemStack ingred) { + ingred = ingred.copy(); + ingred.stackSize = 1; + if (CoverLib.getMaterial(ingred) != null) { + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(covers, ingred, -1)); + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(hollow, ingred, -1)); + } else if (ingred.getItem() == ItemHandsaw.getItemFromBlock(RedPowerBase.blockMicro) && isValidMicroType(ingred.getItemDamage() >> 8)) { + int type = ingred.getItemDamage() >> 8; + int material = ingred.getItemDamage() & 0xFF; + this.addCuttingRecipe(type, material); + this.addGluingRecipe(type, material); + this.addPostRecipe(type, material); + } + + } + + private void addPostRecipe(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if (thickness % 2 == 0 && (microclass == posts || microclass == strips)) { + this.arecipes.add(new MicroRecipeHandler.PostRecipe(getMicro(type, material, 1))); + } + + } + + private void addGluingRecipe(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if ((microclass == covers || microclass == hollow) && thickness > 1) { + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(getMicroClass(type), getMicro(type, material, 1), -1)); + } + + if (thicknessPow2(thickness) && (microclass == covers || microclass == strips)) { + int[] subclass = getNextMicroClass(getMicroClass(type), false); + if (microclass == covers) { + this.arecipes + .add(new MicroRecipeHandler.GluingRecipe(getMicro(getNextMicroClass(subclass, false)[thickness - 1], material, 4), getMicro(type, material, 1))); + } + + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(getMicro(subclass[thickness - 1], material, 2), getMicro(type, material, 1))); + } + + } + + private void addCuttingRecipe(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if (microclass != covers && microclass != hollow) { + if (microclass == strips || microclass == corners) { + this.arecipes + .add( + new MicroRecipeHandler.CuttingRecipe( + getMicro(type, material, 2), getMicro(getNextMicroClass(microclass, true)[thickness - 1], material, 1), null + ) + ); + } + } else if (thickness <= 3 || microclass == covers && thickness == 4) { + this.arecipes.add(new MicroRecipeHandler.CuttingRecipe(getMicro(type, material, 2), getMicro(setThickness(type, thickness * 2), material, 1), null)); + } + + } + + public void loadUsageRecipes(ItemStack result) { + result = result.copy(); + result.stackSize = 1; + if (CoverLib.getMaterial(result) != null) { + this.arecipes.add(new MicroRecipeHandler.CuttingRecipe(getMicro(covers[3], getMaterial(result), 2), result, null)); + } else if (result.getItem() instanceof ItemHandsaw) { + this.addSawUsage(result); + } else if (result.getItem() == Item.getItemFromBlock(RedPowerBase.blockMicro) && isValidMicroType(result.getItemDamage() >> 8)) { + int type = result.getItemDamage() >> 8; + int material = result.getItemDamage() & 0xFF; + this.addCuttingUsage(type, material); + this.addGluingUsage(type, material); + this.addPostUsage(type, material); + } + + } + + private void addSawSplitting(int[] microclass, int thicknesses, ItemStack handsaw) { + for(int i = thicknesses; i >= 0; --i) { + this.arecipes.add(new MicroRecipeHandler.CuttingRecipe(setThickness(microclass[i], (i + 1) * 2), microclass[i], handsaw)); + } + + } + + private void addSawCutting(int[] microclass, ItemStack handsaw) { + int[] superclass = getNextMicroClass(microclass, true); + + for(int i = 6; i >= 0; --i) { + this.arecipes.add(new MicroRecipeHandler.CuttingRecipe(superclass[i], microclass[i], handsaw)); + } + + } + + private void addPostUsage(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if (thickness % 2 == 0 && (microclass == posts || microclass == strips)) { + this.arecipes.add(new MicroRecipeHandler.PostRecipe(getMicro(swapPostType(type), material, 1))); + } + + } + + private void addGluingUsage(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if (thicknessPow2(thickness) && (microclass == corners || microclass == strips)) { + int[] superclass = getNextMicroClass(microclass, true); + if (microclass == corners) { + this.arecipes + .add(new MicroRecipeHandler.GluingRecipe(getMicro(type, material, 4), getMicro(getNextMicroClass(superclass, true)[thickness - 1], material, 1))); + } + + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(getMicro(type, material, 2), getMicro(superclass[thickness - 1], material, 1))); + } + + if (microclass == covers || microclass == hollow) { + for(int i = thickness + 1; i <= 8; ++i) { + this.arecipes.add(new MicroRecipeHandler.GluingRecipe(microclass, getMicro(setThickness(type, i), material, 1), thickness)); + } + } + + } + + private void addCuttingUsage(int type, int material) { + int thickness = getThickness(type); + int[] microclass = getMicroClass(type); + if (thickness % 2 == 0 && (microclass == covers || microclass == hollow)) { + this.arecipes + .add(new MicroRecipeHandler.CuttingRecipe(getMicro(setThickness(type, getThickness(type) / 2), material, 2), getMicro(type, material, 1), null)); + } + + if (microclass == covers || microclass == strips) { + this.arecipes + .add( + new MicroRecipeHandler.CuttingRecipe( + getMicro(getNextMicroClass(microclass, false)[getThickness(type) - 1], material, 2), getMicro(type, material, 1), null + ) + ); + } + + } + + private void addSawUsage(ItemStack ingredient) { + this.addSawSplitting(covers, 3, ingredient); + this.addSawSplitting(hollow, 2, ingredient); + this.addSawCutting(strips, ingredient); + this.addSawCutting(corners, ingredient); + } + + public static int swapPostType(int type) { + return containsInt(posts, type) ? strips[getThickness(type) - 1] : posts[getThickness(type) - 1]; + } + + public static boolean isValidMicroType(int type) { + return type == 0 || type >= 16 && type <= 45; + } + + public static int[] getNextMicroClass(int[] microclass, boolean higher) { + if (higher) { + if (microclass == corners) { + return strips; + } + + if (microclass == strips) { + return covers; + } + } else { + if (microclass == strips) { + return corners; + } + + if (microclass == covers) { + return strips; + } + } + + return null; + } + + public static int getMaterial(ItemStack stack) { + return stack.getItem() == Item.getItemFromBlock(CoverLib.blockCoverPlate) ? stack.getItemDamage() & 0xFF : CoverLib.getMaterial(stack); + } + + public static int getThickness(int type) { + return type == -1 ? 8 : getIndex(getMicroClass(type), type) + 1; + } + + public static int[] getMicroClass(int type) { + return containsInt(covers, type) + ? covers + : (containsInt(strips, type) ? strips : (containsInt(corners, type) ? corners : (containsInt(hollow, type) ? hollow : posts))); + } + + public static int setThickness(int type, int thickness) { + return thickness == 8 ? -1 : getMicroClass(type)[thickness - 1]; + } + + public static ItemStack getMicro(int type, int material, int quantity) { + if (type == -1) { + ItemStack stack = CoverLib.getItemStack(material).copy(); + stack.stackSize = quantity; + return stack; + } else { + return new ItemStack(CoverLib.blockCoverPlate, quantity, type << 8 | material); + } + } + + public static int getType(ItemStack stack) { + return stack.getItem() == Item.getItemFromBlock(CoverLib.blockCoverPlate) ? stack.getItemDamage() >> 8 : -1; + } + + public static boolean thicknessPow2(int thickness) { + return thickness == 1 || thickness == 2 || thickness == 4; + } + + public static boolean containsInt(int[] array, int i) { + return getIndex(array, i) != -1; + } + + public static int getIndex(int[] arr, int i) { + for(int j = 0; j < arr.length; ++j) { + if (arr[j] == i) { + return j; + } + } + + return -1; + } + + public class CuttingRecipe extends CachedRecipe { + ItemStack saw; + ItemStack ingred; + ItemStack result; + int cycletype; + List cyclemap = new ArrayList<>(); + + public CuttingRecipe(ItemStack result, ItemStack ingred, ItemStack saw) { + super(); + this.result = result; + this.ingred = ingred; + this.saw = saw; + this.cycletype = 0; + this.mapSharpSaws(); + } + + public CuttingRecipe(int typeingred, int typeresult, ItemStack saw) { + super(); + this.result = MicroRecipeHandler.getMicro(typeingred, 0, 1); + this.ingred = MicroRecipeHandler.getMicro(typeresult, 0, 2); + this.saw = saw; + this.cycletype = 1; + this.mapSoftMaterials(); + } + + public void mapSharpSaws() { + for(int i = 0; i < MicroRecipeHandler.saws.length; ++i) { + if (MicroRecipeHandler.saws[i].getSharpness() >= CoverLib.getHardness(MicroRecipeHandler.getMaterial(this.ingred))) { + this.cyclemap.add(i); + } + } + + } + + public void mapSoftMaterials() { + for(int i = 0; i < MicroRecipeHandler.materials.length; ++i) { + if (((ItemHandsaw)this.saw.getItem()).getSharpness() >= CoverLib.getHardness(MicroRecipeHandler.materials[i])) { + this.cyclemap.add(i); + } + } + + } + + public List getIngredients() { + int index = this.cyclemap.get(MicroRecipeHandler.this.cycleticks / 20 % this.cyclemap.size()); + if (this.cycletype == 0) { + this.saw = new ItemStack(MicroRecipeHandler.saws[index]); + } else { + this.ingred = MicroRecipeHandler.getMicro(MicroRecipeHandler.getType(this.ingred), MicroRecipeHandler.materials[index], 1); + } + + List ingreds = new ArrayList(); + int type = this.result.getItemDamage() >> 8; + if (!MicroRecipeHandler.containsInt(MicroRecipeHandler.covers, type) && !MicroRecipeHandler.containsInt(MicroRecipeHandler.hollow, type)) { + ingreds.add(MicroRecipeHandler.position(this.saw, 1, 0)); + } else { + ingreds.add(MicroRecipeHandler.position(this.saw, 0, 1)); + } + + ingreds.add(MicroRecipeHandler.position(this.ingred, 1, 1)); + return ingreds; + } + + public PositionedStack getResult() { + int index = this.cyclemap.get(MicroRecipeHandler.this.cycleticks / 20 % this.cyclemap.size()); + if (this.cycletype == 1) { + this.result = MicroRecipeHandler.getMicro(MicroRecipeHandler.getType(this.result), MicroRecipeHandler.materials[index], 2); + } + + return new PositionedStack(this.result, 119, 24); + } + } + + public class GluingRecipe extends CachedRecipe { + ItemStack result; + int[] microclass; + List> gluingcombos; + List ingreds = new ArrayList(); + int cycletype; + + public GluingRecipe(int[] microclass, ItemStack result, int usedthickness) { + super(); + this.result = result; + this.microclass = microclass; + this.gluingcombos = ComboGenerator.generate(MicroRecipeHandler.getThickness(MicroRecipeHandler.getType(result))); + if (usedthickness != -1) { + ComboGenerator.removeNotContaining(this.gluingcombos, usedthickness); + } + + this.cycletype = 0; + } + + public GluingRecipe(ItemStack micro, ItemStack result) { + super(); + this.result = result; + ItemStack m = micro.copy(); + m.stackSize = 1; + + for(int i = 0; i < micro.stackSize; ++i) { + int pos = i >= 2 ? i + 1 : i; + this.ingreds.add(MicroRecipeHandler.position(m, pos / 3, pos % 3)); + } + + this.cycletype = -1; + } + + public List getIngredients() { + if (this.cycletype == 0) { + this.ingreds.clear(); + int cycle = MicroRecipeHandler.this.cycleticks / 20 % this.gluingcombos.size(); + int material = MicroRecipeHandler.getMaterial(this.result); + LinkedList combo = (LinkedList)this.gluingcombos.get(cycle); + this.ingreds = new ArrayList(combo.size()); + + for(int i = 0; i < combo.size(); ++i) { + this.ingreds.add(MicroRecipeHandler.position(MicroRecipeHandler.getMicro(this.microclass[combo.get(i) - 1], material, 1), i / 3, i % 3)); + } + } + + return this.ingreds; + } + + public PositionedStack getResult() { + return new PositionedStack(this.result, 119, 24); + } + } + + public class PostRecipe extends CachedRecipe { + int type; + int material; + + public PostRecipe(ItemStack result) { + super(); + this.type = MicroRecipeHandler.getType(result); + this.material = MicroRecipeHandler.getMaterial(result); + } + + public List getIngredients() { + return new ArrayList( + Collections.singletonList( + MicroRecipeHandler.position(MicroRecipeHandler.getMicro(MicroRecipeHandler.swapPostType(this.type), this.material, 1), 1, 1) + ) + ); + } + + public PositionedStack getResult() { + return new PositionedStack(MicroRecipeHandler.getMicro(this.type, this.material, 1), 119, 24); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/MicroPlacementJacket.java b/src/main/java/com/eloraam/redpower/wiring/MicroPlacementJacket.java new file mode 100644 index 0000000..5b43a17 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/MicroPlacementJacket.java @@ -0,0 +1,153 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.IMicroPlacement; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class MicroPlacementJacket implements IMicroPlacement { + private void blockUsed(World world, WorldCoord wc, ItemStack ist, EntityPlayer player) { + if (!player.capabilities.isCreativeMode) { + --ist.stackSize; + } + + CoreLib.placeNoise(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + world.markBlockForUpdate(wc.x, wc.y, wc.z); + RedPowerLib.updateIndirectNeighbors(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + } + + private int getWireMeta(int md) { + switch(md) { + case 64: + return 1; + case 65: + return 3; + case 66: + return 5; + default: + return 0; + } + } + + private boolean initialPlace(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int l) { + int md = ist.getItemDamage() >> 8; + Block bid = Block.getBlockFromItem(ist.getItem()); + md = this.getWireMeta(md); + if (!world.canPlaceEntityOnSide(bid, wc.x, wc.y, wc.z, false, l, player, null)) { + return false; + } else if (!world.setBlock(wc.x, wc.y, wc.z, bid, md, 3)) { + return true; + } else { + TileWiring tw = CoreLib.getTileEntity(world, wc, TileWiring.class); + if (tw == null) { + return false; + } else { + tw.CenterPost = (short)(ist.getItemDamage() & 0xFF); + tw.ConSides |= 64; + this.blockUsed(world, wc, ist, player); + return true; + } + } + } + + private boolean tryAddingJacket(World world, WorldCoord wc, ItemStack ist, EntityPlayer player) { + TileWiring tw = CoreLib.getTileEntity(world, wc, TileWiring.class); + if (tw == null) { + return false; + } else if ((tw.ConSides & 64) > 0) { + return false; + } else if (!CoverLib.checkPlacement(tw.CoverSides, tw.Covers, tw.ConSides, true)) { + return false; + } else { + tw.CenterPost = (short)(ist.getItemDamage() & 0xFF); + tw.ConSides |= 64; + tw.uncache(); + this.blockUsed(world, wc, ist, player); + return true; + } + } + + @Override + public boolean onPlaceMicro(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int size) { + int hb = ist.getItemDamage(); + hb >>= 8; + hb = this.getWireMeta(hb); + int dmg = hb << 8; + if (CoverLib.tryMakeCompatible(world, wc, Block.getBlockFromItem(ist.getItem()), dmg) && this.tryAddingJacket(world, wc, ist, player)) { + return true; + } else { + wc.step(size); + Block bid = world.getBlock(wc.x, wc.y, wc.z); + return bid != Block.getBlockFromItem(ist.getItem()) + ? this.initialPlace(ist, player, world, wc, size) + : CoverLib.tryMakeCompatible(world, wc, Block.getBlockFromItem(ist.getItem()), dmg) && this.tryAddingJacket(world, wc, ist, player); + } + } + + @Override + public String getMicroName(int hb, int lb) { + String nm; + switch(hb) { + case 64: + nm = CoverLib.getName(lb); + if (nm == null) { + return null; + } else { + if (CoverLib.isTransparent(lb)) { + return null; + } + + return "tile.rparmwire." + nm; + } + case 65: + nm = CoverLib.getName(lb); + if (nm == null) { + return null; + } else { + if (CoverLib.isTransparent(lb)) { + return null; + } + + return "tile.rparmcable." + nm; + } + case 66: + nm = CoverLib.getName(lb); + if (nm == null) { + return null; + } else { + if (CoverLib.isTransparent(lb)) { + return null; + } + + return "tile.rparmbwire." + nm; + } + default: + return null; + } + } + + @Override + public void addCreativeItems(int hb, CreativeTabs tab, List itemList) { + if (tab == CreativeExtraTabs.tabWires || tab == CreativeTabs.tabAllSearch) { + switch(hb) { + case 64: + itemList.add(new ItemStack(CoverLib.blockCoverPlate, 1, 16386)); + break; + case 65: + itemList.add(new ItemStack(CoverLib.blockCoverPlate, 1, 16666)); + break; + case 66: + itemList.add(new ItemStack(CoverLib.blockCoverPlate, 1, 16902)); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/MicroPlacementWire.java b/src/main/java/com/eloraam/redpower/wiring/MicroPlacementWire.java new file mode 100644 index 0000000..9e852e4 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/MicroPlacementWire.java @@ -0,0 +1,157 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.CreativeExtraTabs; +import com.eloraam.redpower.core.IMicroPlacement; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileCovered; +import com.eloraam.redpower.core.WorldCoord; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class MicroPlacementWire implements IMicroPlacement { + private void blockUsed(World world, WorldCoord wc, ItemStack ist) { + --ist.stackSize; + CoreLib.placeNoise(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + world.markBlockForUpdate(wc.x, wc.y, wc.z); + RedPowerLib.updateIndirectNeighbors(world, wc.x, wc.y, wc.z, Block.getBlockFromItem(ist.getItem())); + } + + private boolean initialPlace(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int l) { + int md = ist.getItemDamage() >> 8; + Block bid = Block.getBlockFromItem(ist.getItem()); + if (!world.canPlaceEntityOnSide(bid, wc.x, wc.y, wc.z, false, l, player, null)) { + return false; + } else if (!RedPowerLib.canSupportWire(world, wc.x, wc.y, wc.z, l ^ 1)) { + return false; + } else if (!world.setBlock(wc.x, wc.y, wc.z, bid, md, 3)) { + return true; + } else { + TileWiring tw = CoreLib.getTileEntity(world, wc, TileWiring.class); + if (tw == null) { + return false; + } else { + tw.ConSides = 1 << (l ^ 1); + tw.Metadata = ist.getItemDamage() & 0xFF; + this.blockUsed(world, wc, ist); + return true; + } + } + } + + @Override + public boolean onPlaceMicro(ItemStack ist, EntityPlayer player, World world, WorldCoord wc, int size) { + wc.step(size); + Block bid = world.getBlock(wc.x, wc.y, wc.z); + if (bid != Block.getBlockFromItem(ist.getItem())) { + return this.initialPlace(ist, player, world, wc, size); + } else { + TileCovered tc = CoreLib.getTileEntity(world, wc, TileCovered.class); + if (tc == null) { + return false; + } else { + int d = 1 << (size ^ 1); + if ((tc.CoverSides & d) > 0) { + return false; + } else { + int hb = ist.getItemDamage(); + if (!CoverLib.tryMakeCompatible(world, wc, Block.getBlockFromItem(ist.getItem()), hb)) { + return false; + } else { + TileWiring tw = CoreLib.getTileEntity(world, wc, TileWiring.class); + if (tw == null) { + return false; + } else if (!RedPowerLib.canSupportWire(world, wc.x, wc.y, wc.z, size ^ 1)) { + return false; + } else if (((tw.ConSides | tw.CoverSides) & d) > 0) { + return false; + } else { + d |= tw.ConSides; + int t = d & 63; + if (t == 3 || t == 12 || t == 48) { + return false; + } else if (!CoverLib.checkPlacement(tw.CoverSides, tw.Covers, t, (tw.ConSides & 64) > 0)) { + return false; + } else { + tw.ConSides = d; + tw.uncache(); + this.blockUsed(world, wc, ist); + return true; + } + } + } + } + } + } + } + + @Override + public String getMicroName(int hb, int lb) { + switch(hb) { + case 1: + switch(lb) { + case 0: + return "tile.rpwire"; + default: + return null; + } + case 2: + return "tile.rpinsulated." + CoreLib.rawColorNames[lb]; + case 3: + switch(lb) { + case 0: + return "tile.rpcable"; + default: + return "tile.rpcable." + CoreLib.rawColorNames[lb - 1]; + } + case 4: + default: + break; + case 5: + switch(lb) { + case 0: + return "tile.bluewire"; + case 1: + return "tile.bluewire10"; + case 2: + return "tile.bluewire1M"; + } + } + + return null; + } + + @Override + public void addCreativeItems(int hb, CreativeTabs tab, List items) { + if (tab == CreativeExtraTabs.tabWires || tab == CreativeTabs.tabAllSearch) { + switch(hb) { + case 1: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 256)); + break; + case 2: + for(int i = 0; i < 16; ++i) { + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 512 + i)); + } + + return; + case 3: + for(int i = 0; i < 17; ++i) { + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 768 + i)); + } + case 4: + default: + break; + case 5: + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 1280)); + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 1281)); + items.add(new ItemStack(CoverLib.blockCoverPlate, 1, 1282)); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/RenderRedwire.java b/src/main/java/com/eloraam/redpower/wiring/RenderRedwire.java new file mode 100644 index 0000000..5b76477 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/RenderRedwire.java @@ -0,0 +1,497 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.RedPowerWiring; +import com.eloraam.redpower.core.CoverRenderer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.client.IItemRenderer.ItemRenderType; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderRedwire extends RenderWiring { + public RenderRedwire(Block block) { + super(block); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { + TileWiring wiring = (TileWiring)tile; + World world = wiring.getWorldObj(); + int metadata = wiring.getBlockMetadata(); + GL11.glDisable(2896); + Tessellator tess = Tessellator.instance; + super.context.bindBlockTexture(); + super.context.setBrightness(this.getMixedBrightness(wiring)); + super.context.setTexFlags(55); + super.context.setPos(x, y, z); + tess.startDrawingQuads(); + if (wiring.CoverSides > 0) { + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.readGlobalLights(world, wiring.xCoord, wiring.yCoord, wiring.zCoord); + this.renderCovers(wiring.CoverSides, wiring.Covers); + super.context.forceFlat = false; + super.context.lockTexture = false; + } + + if (metadata != 0) { + int indcon = wiring.getExtConnectionMask(); + int cons = wiring.getConnectionMask() | indcon; + int indconex = wiring.EConEMask; + switch(metadata) { + case 1: + TileRedwire tx = (TileRedwire)wiring; + super.context.setTint(0.3F + 0.7F * ((float)tx.PowerState / 255.0F), 0.0F, 0.0F); + this.setSideIcon(RedPowerWiring.redwireTop, RedPowerWiring.redwireFace, RedPowerWiring.redwireTop); + this.setWireSize(0.125F, 0.125F); + break; + case 2: + TileInsulatedWire tx1 = (TileInsulatedWire)wiring; + super.context.setTint(1.0F, 1.0F, 1.0F); + this.setSideIcon( + RedPowerWiring.insulatedTop[wiring.Metadata], + tx1.PowerState > 0 ? RedPowerWiring.insulatedFaceOn[wiring.Metadata] : RedPowerWiring.insulatedFaceOff[wiring.Metadata], + RedPowerWiring.insulatedTop[wiring.Metadata] + ); + this.setWireSize(0.25F, 0.188F); + break; + case 3: + super.context.setTint(1.0F, 1.0F, 1.0F); + if (wiring.Metadata == 0) { + this.setSideIcon(RedPowerWiring.bundledTop, RedPowerWiring.bundledFace, RedPowerWiring.bundledTop); + } else { + this.setSideIcon( + RedPowerWiring.bundledColTop[wiring.Metadata - 1], RedPowerWiring.bundledColFace[wiring.Metadata - 1], RedPowerWiring.bundledTop + ); + } + + this.setWireSize(0.375F, 0.25F); + case 4: + default: + break; + case 5: + super.context.setTint(1.0F, 1.0F, 1.0F); + switch(wiring.Metadata) { + case 0: + this.setSideIcon(RedPowerWiring.powerTop, RedPowerWiring.powerFace, RedPowerWiring.powerTop); + this.setWireSize(0.25F, 0.188F); + break; + case 1: + this.setSideIcon(RedPowerWiring.highPowerTop, RedPowerWiring.highPowerFace, RedPowerWiring.highPowerTop); + this.setWireSize(0.375F, 0.25F); + break; + case 2: + this.setSideIconJumbo( + RedPowerWiring.jumboSides, + RedPowerWiring.jumboTop, + RedPowerWiring.jumboCent, + RedPowerWiring.jumboCentSide, + RedPowerWiring.jumboEnd, + RedPowerWiring.jumboCorners + ); + this.setWireSize(0.5F, 0.3125F); + } + } + + this.renderWireBlock(wiring.ConSides, cons, indcon, indconex); + if ((metadata == 1 || metadata == 3 || metadata == 5) && (wiring.ConSides & 64) != 0) { + super.context.setTexFlags(0); + super.context.setOrientation(0, 0); + super.context.setTint(1.0F, 1.0F, 1.0F); + super.context.setLocalLights(0.5F, 1.0F, 0.7F, 0.7F, 0.7F, 0.7F); + IIcon icon; + switch(metadata) { + case 1: + icon = ((TileRedwire)wiring).PowerState > 0 ? RedPowerWiring.redwireCableOn : RedPowerWiring.redwireCableOff; + break; + case 3: + icon = RedPowerWiring.bundledCable; + break; + default: + icon = RedPowerWiring.bluewireCable; + } + + this.renderCenterBlock(cons >> 24 | wiring.ConSides & 63, CoverRenderer.coverIcons[wiring.CenterPost], icon); + } + } + + tess.draw(); + GL11.glEnable(2896); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + int meta = item.getItemDamage(); + Tessellator tess = Tessellator.instance; + super.block.setBlockBoundsForItemRender(); + int bid = meta >> 8; + meta &= 255; + super.context.setDefaults(); + super.context.setTexFlags(55); + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.5, -0.5); + } else { + super.context.setPos(0.0, 0.0, 0.0); + } + float th; + switch(bid) { + case 0: + case 16: + case 17: + case 27: + case 28: + case 29: + case 30: + switch(bid) { + case 0: + th = 0.063F; + break; + case 16: + th = 0.125F; + break; + case 17: + th = 0.25F; + break; + case 27: + th = 0.188F; + break; + case 28: + th = 0.313F; + break; + case 29: + th = 0.375F; + break; + case 30: + th = 0.438F; + break; + default: + return; + } + + super.context.setIcon(CoverRenderer.coverIcons[meta]); + super.context.setSize(0.0, 0.0, (double)(0.5F - th), 1.0, 1.0, (double)(0.5F + th)); + super.context.calcBounds(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderFaces(63); + super.context.useNormal = false; + tess.draw(); + return; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 46: + case 47: + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + default: + if (type == ItemRenderType.INVENTORY) { + super.context.setPos(-0.5, -0.2F, -0.5); + } else { + super.context.setPos(0.0, 0.29999999701976776, 0.0); + } + + super.context.setOrientation(0, 0); + switch(bid) { + case 1: + this.setSideIcon(RedPowerWiring.redwireTop, RedPowerWiring.redwireFace, RedPowerWiring.redwireTop); + this.setWireSize(0.125F, 0.125F); + super.context.setTint(1.0F, 0.0F, 0.0F); + break; + case 2: + this.setSideIcon(RedPowerWiring.insulatedTop[meta], RedPowerWiring.insulatedFaceOff[meta], RedPowerWiring.insulatedTop[meta]); + this.setWireSize(0.25F, 0.188F); + break; + case 3: + switch(meta) { + case 0: + this.setSideIcon(RedPowerWiring.bundledTop, RedPowerWiring.bundledFace, RedPowerWiring.bundledTop); + break; + default: + this.setSideIcon(RedPowerWiring.bundledColTop[meta - 1], RedPowerWiring.bundledColFace[meta - 1], RedPowerWiring.bundledTop); + } + + this.setWireSize(0.375F, 0.25F); + break; + default: + if (bid != 5) { + return; + } + + switch(meta) { + case 0: + this.setSideIcon(RedPowerWiring.powerTop, RedPowerWiring.powerFace, RedPowerWiring.powerTop); + this.setWireSize(0.25F, 0.188F); + break; + case 1: + this.setSideIcon(RedPowerWiring.highPowerTop, RedPowerWiring.highPowerFace, RedPowerWiring.highPowerTop); + this.setWireSize(0.375F, 0.25F); + break; + case 2: + this.setSideIconJumbo( + RedPowerWiring.jumboSides, + RedPowerWiring.jumboTop, + RedPowerWiring.jumboCent, + RedPowerWiring.jumboCentSide, + RedPowerWiring.jumboEnd, + RedPowerWiring.jumboCorners + ); + this.setWireSize(0.5F, 0.3125F); + } + } + + super.context.useNormal = true; + tess.startDrawingQuads(); + this.renderSideWires(127, 0, 0); + tess.draw(); + super.context.useNormal = false; + return; + case 18: + case 19: + case 20: + case 35: + case 36: + case 37: + case 38: + switch(bid) { + case 18: + th = 0.063F; + break; + case 19: + th = 0.125F; + break; + case 20: + th = 0.25F; + break; + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + case 34: + default: + return; + case 35: + th = 0.188F; + break; + case 36: + th = 0.313F; + break; + case 37: + th = 0.375F; + break; + case 38: + th = 0.438F; + } + + super.context.setIcon(CoverRenderer.coverIcons[meta]); + super.context.setSize((double)(0.5F - th), (double)(0.5F - th), (double)(0.5F - th), (double)(0.5F + th), (double)(0.5F + th), (double)(0.5F + th)); + super.context.calcBounds(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderFaces(63); + super.context.useNormal = false; + tess.draw(); + return; + case 21: + case 22: + case 23: + case 39: + case 40: + case 41: + case 42: + switch(bid) { + case 21: + th = 0.063F; + break; + case 22: + th = 0.125F; + break; + case 23: + th = 0.25F; + break; + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + case 38: + default: + return; + case 39: + th = 0.188F; + break; + case 40: + th = 0.313F; + break; + case 41: + th = 0.375F; + break; + case 42: + th = 0.438F; + } + + super.context.setIcon(CoverRenderer.coverIcons[meta]); + super.context.setSize((double)(0.5F - th), 0.0, (double)(0.5F - th), (double)(0.5F + th), 1.0, (double)(0.5F + th)); + super.context.calcBounds(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderFaces(63); + super.context.useNormal = false; + tess.draw(); + return; + case 24: + case 25: + case 26: + case 31: + case 32: + case 33: + case 34: + switch(bid) { + case 24: + th = 0.063F; + break; + case 25: + th = 0.125F; + break; + case 26: + th = 0.25F; + break; + case 27: + case 28: + case 29: + case 30: + default: + return; + case 31: + th = 0.188F; + break; + case 32: + th = 0.313F; + break; + case 33: + th = 0.375F; + break; + case 34: + th = 0.438F; + } + + super.context.setIcon(CoverRenderer.coverIcons[meta]); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderBox(63, 0.0, 0.0, (double)(0.5F - th), 0.25, 1.0, (double)(0.5F + th)); + super.context.renderBox(63, 0.75, 0.0, (double)(0.5F - th), 1.0, 1.0, (double)(0.5F + th)); + super.context.renderBox(15, 0.25, 0.0, (double)(0.5F - th), 0.75, 0.25, (double)(0.5F + th)); + super.context.renderBox(15, 0.25, 0.75, (double)(0.5F - th), 0.75, 1.0, (double)(0.5F + th)); + super.context.useNormal = false; + tess.draw(); + return; + case 43: + case 44: + case 45: + switch(bid) { + case 43: + th = 0.125F; + break; + case 44: + th = 0.25F; + break; + case 45: + th = 0.375F; + break; + default: + return; + } + + super.context.setIcon(CoverRenderer.coverIcons[meta]); + super.context.setSize((double)(0.5F - th), 0.125, (double)(0.5F - th), (double)(0.5F + th), 0.875, (double)(0.5F + th)); + super.context.calcBounds(); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderFaces(63); + super.context.setSize((double)(0.45F - th), 0.0, (double)(0.45F - th), (double)(0.55F + th), 0.125, (double)(0.55F + th)); + super.context.calcBounds(); + super.context.renderFaces(63); + super.context.setSize((double)(0.45F - th), 0.875, (double)(0.45F - th), (double)(0.55F + th), 1.0, (double)(0.55F + th)); + super.context.calcBounds(); + super.context.renderFaces(63); + super.context.useNormal = false; + tess.draw(); + return; + case 64: + case 65: + case 66: + super.context.setIcon(CoverRenderer.coverIcons[meta]); + tess.startDrawingQuads(); + super.context.useNormal = true; + super.context.renderBox(60, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(15, 0.0, 0.25, 0.25, 1.0, 0.75, 0.75); + super.context.renderBox(51, 0.25, 0.25, 0.0, 0.75, 0.75, 1.0); + tess.draw(); + tess.startDrawingQuads(); + switch(bid) { + case 64: + super.context.setIcon(RedPowerWiring.redwireCableOff); + break; + case 66: + super.context.setIcon(RedPowerWiring.bluewireCable); + break; + default: + super.context.setIcon(RedPowerWiring.bundledCable); + } + + super.context.renderBox(3, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + super.context.renderBox(48, 0.0, 0.25, 0.25, 1.0, 0.75, 0.75); + super.context.renderBox(12, 0.25, 0.25, 0.0, 0.75, 0.75, 1.0); + tess.draw(); + super.context.useNormal = false; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/RenderWiring.java b/src/main/java/com/eloraam/redpower/wiring/RenderWiring.java new file mode 100644 index 0000000..5fffe0b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/RenderWiring.java @@ -0,0 +1,605 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.RenderCovers; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.util.IIcon; + +@SideOnly(Side.CLIENT) +public abstract class RenderWiring extends RenderCovers { + private float wireWidth; + private float wireHeight; + private IIcon[][] sidetex = new IIcon[7][6]; + + public RenderWiring(Block block) { + super(block); + } + + public void setWireSize(float w, float h) { + this.wireWidth = w * 0.5F; + this.wireHeight = h; + } + + public void renderSideWire(int n) { + super.context.setLocalLights(0.5F, 1.0F, 0.7F, 0.7F, 0.7F, 0.7F); + switch(n) { + case 2: + super.context + .setSize(0.0, 0.0, (double)(0.5F - this.wireWidth), (double)(0.5F - this.wireWidth), (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.calcBounds(); + super.context.renderFaces(54); + break; + case 3: + super.context + .setSize((double)(0.5F + this.wireWidth), 0.0, (double)(0.5F - this.wireWidth), 1.0, (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.calcBounds(); + super.context.renderFaces(58); + break; + case 4: + super.context + .setSize((double)(0.5F - this.wireWidth), 0.0, 0.0, (double)(0.5F + this.wireWidth), (double)this.wireHeight, (double)(0.5F - this.wireWidth)); + super.context.calcBounds(); + super.context.renderFaces(30); + break; + case 5: + super.context + .setSize((double)(0.5F - this.wireWidth), 0.0, (double)(0.5F + this.wireWidth), (double)(0.5F + this.wireWidth), (double)this.wireHeight, 1.0); + super.context.calcBounds(); + super.context.renderFaces(46); + } + + } + + public void setSideIcon(IIcon top, IIcon cent, IIcon cfix) { + for(int j = 0; j < 6; ++j) { + this.sidetex[0][j] = j >> 1 == 0 ? cent : cfix; + } + + for(int i = 1; i < 3; ++i) { + for(int j = 0; j < 6; ++j) { + this.sidetex[i][j] = j >> 1 == i ? cent : top; + } + } + + for(int i = 1; i < 3; ++i) { + for(int j = 0; j < 6; ++j) { + this.sidetex[i + 2][j] = j >> 1 == i ? cent : cfix; + } + } + + for(int i = 0; i < 6; ++i) { + this.sidetex[5][i] = top; + this.sidetex[6][i] = top; + } + + this.sidetex[5][4] = cent; + this.sidetex[5][5] = cent; + this.sidetex[6][2] = cent; + this.sidetex[6][3] = cent; + this.sidetex[5][0] = cent; + this.sidetex[6][0] = cent; + super.context.setIcon(this.sidetex); + } + + public void setSideIconJumbo(IIcon sides, IIcon top, IIcon cent, IIcon centside, IIcon end, IIcon corners) { + for(int j = 0; j < 6; ++j) { + this.sidetex[0][j] = j >> 1 == 0 ? cent : centside; + } + + for(int i = 1; i < 3; ++i) { + for(int j = 0; j < 6; ++j) { + this.sidetex[i][j] = j >> 1 == 0 ? top : (j >> 1 == i ? end : sides); + } + } + + for(int i = 1; i < 3; ++i) { + for(int j = 0; j < 6; ++j) { + this.sidetex[i + 2][j] = j >> 1 == 0 ? top : (j >> 1 == i ? end : centside); + } + } + + for(int i = 0; i < 6; ++i) { + this.sidetex[5][i] = top; + this.sidetex[6][i] = top; + } + + this.sidetex[5][4] = corners; + this.sidetex[5][5] = corners; + this.sidetex[6][2] = corners; + this.sidetex[6][3] = corners; + this.sidetex[5][0] = corners; + this.sidetex[6][0] = corners; + super.context.setIcon(this.sidetex); + } + + public void renderSideWires(int cs, int ucs, int fn) { + int fxl = 0; + int fzl = 0; + int fc = 62; + int fxs1 = 0; + int fxs2 = 0; + int fzs1 = 0; + int fzs2 = 0; + byte stb = 3; + float x1 = (ucs & 4) == 0 ? 0.0F : this.wireHeight; + float x2 = (ucs & 8) == 0 ? 1.0F : 1.0F - this.wireHeight; + float z1 = (ucs & 1) == 0 ? 0.0F : this.wireHeight; + float z2 = (ucs & 2) == 0 ? 1.0F : 1.0F - this.wireHeight; + super.context.setLocalLights(0.5F, 1.0F, 0.7F, 0.7F, 0.7F, 0.7F); + cs |= ucs; + if ((cs & 12) == 0) { + fzl |= 62; + fc = 0; + if ((cs & 1) == 0) { + z1 = 0.26F; + } + + if ((cs & 2) == 0) { + z2 = 0.74F; + } + + stb = 1; + } else if ((cs & 3) == 0) { + fxl |= 62; + fc = 0; + if ((cs & 4) == 0) { + x1 = 0.26F; + } + + if ((cs & 8) == 0) { + x2 = 0.74F; + } + + stb = 1; + } else { + if ((cs & 7) == 3) { + fzl |= 28; + fc &= -17; + } else { + if ((cs & 1) > 0) { + fzs1 |= 20; + } + + if ((cs & 2) > 0) { + fzs2 |= 24; + } + } + + if ((cs & 11) == 3) { + fzl |= 44; + fc &= -33; + } else { + if ((cs & 1) > 0) { + fzs1 |= 36; + } + + if ((cs & 2) > 0) { + fzs2 |= 40; + } + } + + if ((cs & 13) == 12) { + fxl |= 52; + fc &= -5; + } else { + if ((cs & 4) > 0) { + fxs1 |= 20; + } + + if ((cs & 8) > 0) { + fxs2 |= 36; + } + } + + if ((cs & 14) == 12) { + fxl |= 56; + fc &= -9; + } else { + if ((cs & 4) > 0) { + fxs1 |= 24; + } + + if ((cs & 8) > 0) { + fxs2 |= 40; + } + } + + if ((cs & 1) > 0) { + fzs1 |= 2; + fc &= -5; + } + + if ((cs & 2) > 0) { + fzs2 |= 2; + fc &= -9; + } + + if ((cs & 4) > 0) { + fxs1 |= 2; + fc &= -17; + } + + if ((cs & 8) > 0) { + fxs2 |= 2; + fc &= -33; + } + + if ((cs & 64) > 0) { + fxs1 |= 1; + fxs2 |= 1; + fzs1 |= 1; + fzs2 |= 1; + fc |= 1; + } + } + + int tmpf = ~((ucs & 12) << 2); + fxl &= tmpf; + fxs1 &= tmpf; + fxs2 &= tmpf; + tmpf = ~((ucs & 3) << 2); + fzl &= tmpf; + fzs1 &= tmpf; + fzs2 &= tmpf; + char fxf = '讀'; + int fzf = 217640; + int fcf = 220032; + switch(fn) { + case 1: + case 2: + case 4: + fxf = 7512; + fcf = 220488; + case 3: + default: + if (fxl > 0) { + super.context.setSize((double)x1, 0.0, (double)(0.5F - this.wireWidth), (double)x2, (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.calcBounds(); + super.context.setTexFlags(fxf); + super.context.setIconIndex(stb + 1); + super.context.renderFaces(fxl); + } + + if (fzl > 0) { + super.context.setSize((double)(0.5F - this.wireWidth), 0.0, (double)z1, (double)(0.5F + this.wireWidth), (double)this.wireHeight, (double)z2); + super.context.calcBounds(); + super.context.setTexFlags(fzf); + super.context.setIconIndex(stb); + super.context.renderFaces(fzl); + } + + if (fc > 0) { + super.context + .setSize( + (double)(0.5F - this.wireWidth), + 0.0, + (double)(0.5F - this.wireWidth), + (double)(0.5F + this.wireWidth), + (double)this.wireHeight, + (double)(0.5F + this.wireWidth) + ); + super.context.calcBounds(); + super.context.setTexFlags(fcf); + super.context.setIconIndex(0); + super.context.renderFaces(fc); + } + + if (fxs1 > 0) { + super.context + .setSize( + (double)x1, + 0.0, + (double)(0.5F - this.wireWidth), + (double)(0.5F - this.wireWidth), + (double)this.wireHeight, + (double)(0.5F + this.wireWidth) + ); + super.context.calcBounds(); + super.context.setTexFlags(fxf); + super.context.setIconIndex(stb + 1); + super.context.renderFaces(fxs1); + } + + if (fxs2 > 0) { + super.context + .setSize( + (double)(0.5F + this.wireWidth), + 0.0, + (double)(0.5F - this.wireWidth), + (double)x2, + (double)this.wireHeight, + (double)(0.5F + this.wireWidth) + ); + super.context.calcBounds(); + super.context.setTexFlags(fxf); + super.context.setIconIndex(stb + 1); + super.context.renderFaces(fxs2); + } + + if (fzs1 > 0) { + super.context + .setSize( + (double)(0.5F - this.wireWidth), + 0.0, + (double)z1, + (double)(0.5F + this.wireWidth), + (double)this.wireHeight, + (double)(0.5F - this.wireWidth) + ); + super.context.calcBounds(); + super.context.setTexFlags(fzf); + super.context.setIconIndex(stb); + super.context.renderFaces(fzs1); + } + + if (fzs2 > 0) { + super.context + .setSize( + (double)(0.5F - this.wireWidth), + 0.0, + (double)(0.5F + this.wireWidth), + (double)(0.5F + this.wireWidth), + (double)this.wireHeight, + (double)z2 + ); + super.context.calcBounds(); + super.context.setTexFlags(fzf); + super.context.setIconIndex(stb); + super.context.renderFaces(fzs2); + } + + if (fn < 2) { + super.context.setTexFlags(0); + } else { + if ((ucs & 2) > 0) { + super.context + .setSize( + (double)(0.5F - this.wireWidth), 0.0, (double)(1.0F - this.wireHeight), (double)(0.5F + this.wireWidth), (double)this.wireHeight, 1.0 + ); + super.context.calcBounds(); + super.context.setTexFlags(73728); + super.context.setIconIndex(5); + super.context.renderFaces(48); + } + + if ((ucs & 4) > 0) { + super.context + .setSize(0.0, 0.0, (double)(0.5F - this.wireWidth), (double)this.wireHeight, (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.calcBounds(); + if (fn != 2 && fn != 4) { + super.context.setTexFlags(1728); + } else { + super.context.setTexFlags(1152); + } + + super.context.setIconIndex(6); + super.context.renderFaces(12); + } + + if ((ucs & 8) > 0) { + super.context + .setSize( + (double)(1.0F - this.wireHeight), 0.0, (double)(0.5F - this.wireWidth), 1.0, (double)this.wireHeight, (double)(0.5F + this.wireWidth) + ); + super.context.calcBounds(); + if (fn != 2 && fn != 4) { + super.context.setTexFlags(1152); + } else { + super.context.setTexFlags(1728); + } + + super.context.setIconIndex(6); + super.context.renderFaces(12); + } + + super.context.setTexFlags(0); + } + + } + } + + public void renderEndCaps(int cs, int fn) { + if (cs != 0) { + super.context.setIconIndex(5); + if ((cs & 1) > 0) { + super.context + .setSize((double)(0.5F - this.wireWidth), 0.0, (double)(1.0F - this.wireHeight), (double)(0.5F + this.wireWidth), (double)this.wireHeight, 1.0); + super.context.setRelPos(0.0, 0.0, -1.0); + super.context.setTexFlags(38444); + super.context.setLocalLights(0.7F, 1.0F, 0.7F, 1.0F, 0.7F, 0.7F); + super.context.calcBounds(); + super.context.renderFaces(55); + } + + if ((cs & 2) > 0) { + super.context.setSize((double)(0.5F - this.wireWidth), 0.0, 0.0, (double)(0.5F + this.wireWidth), (double)this.wireHeight, (double)this.wireHeight); + super.context.setRelPos(0.0, 0.0, 1.0); + super.context.setTexFlags(38444); + super.context.setLocalLights(0.7F, 1.0F, 0.7F, 1.0F, 0.7F, 0.7F); + super.context.calcBounds(); + super.context.renderFaces(59); + } + + super.context.setIconIndex(6); + if ((cs & 4) > 0) { + super.context + .setSize((double)(1.0F - this.wireHeight), 0.0, (double)(0.5F - this.wireWidth), 1.0, (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.setRelPos(-1.0, 0.0, 0.0); + if (fn != 2 && fn != 4) { + super.context.setTexFlags(3); + } else { + super.context.setTexFlags(45658); + } + + super.context.setLocalLights(0.7F, 1.0F, 0.7F, 0.7F, 1.0F, 0.7F); + super.context.calcBounds(); + super.context.renderFaces(31); + } + + if ((cs & 8) > 0) { + super.context.setSize(0.0, 0.0, (double)(0.5F - this.wireWidth), (double)this.wireHeight, (double)this.wireHeight, (double)(0.5F + this.wireWidth)); + super.context.setRelPos(1.0, 0.0, 0.0); + if (fn != 2 && fn != 4) { + super.context.setTexFlags(102977); + } else { + super.context.setTexFlags(24); + } + + super.context.setLocalLights(0.7F, 1.0F, 0.7F, 0.7F, 0.7F, 1.0F); + super.context.calcBounds(); + super.context.renderFaces(47); + } + + super.context.setRelPos(0.0, 0.0, 0.0); + } + + } + + public void renderWireBlock(int consides, int cons, int indcon, int indconex) { + int ucons = 0; + indcon &= ~indconex; + if ((consides & 1) > 0) { + ucons |= 1118464; + } + + if ((consides & 2) > 0) { + ucons |= 2236928; + } + + if ((consides & 4) > 0) { + ucons |= 4456465; + } + + if ((consides & 8) > 0) { + ucons |= 8912930; + } + + if ((consides & 16) > 0) { + ucons |= 17476; + } + + if ((consides & 32) > 0) { + ucons |= 34952; + } + + if ((consides & 1) > 0) { + super.context.setOrientation(0, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 0), RedPowerLib.mapConToLocal(ucons, 0), 0); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 0), 0); + } + + if ((consides & 2) > 0) { + super.context.setOrientation(1, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 1), RedPowerLib.mapConToLocal(ucons, 1), 1); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 1), 1); + } + + if ((consides & 4) > 0) { + super.context.setOrientation(2, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 2), RedPowerLib.mapConToLocal(ucons, 2), 2); + this.renderEndCaps(RedPowerLib.mapConToLocal(indcon, 2) & 14, 2); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 2), 2); + } + + if ((consides & 8) > 0) { + super.context.setOrientation(3, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 3), RedPowerLib.mapConToLocal(ucons, 3), 3); + this.renderEndCaps(RedPowerLib.mapConToLocal(indcon, 3) & 14, 3); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 3), 3); + } + + if ((consides & 16) > 0) { + super.context.setOrientation(4, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 4), RedPowerLib.mapConToLocal(ucons, 4), 4); + this.renderEndCaps(RedPowerLib.mapConToLocal(indcon, 4) & 14, 4); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 4), 4); + } + + if ((consides & 32) > 0) { + super.context.setOrientation(5, 0); + this.renderSideWires(RedPowerLib.mapConToLocal(cons, 5), RedPowerLib.mapConToLocal(ucons, 5), 5); + this.renderEndCaps(RedPowerLib.mapConToLocal(indcon, 5) & 14, 5); + this.renderEndCaps(RedPowerLib.mapConToLocal(indconex, 5), 5); + } + + } + + void setJacketIcons(int cons, IIcon[] tex, IIcon st) { + super.context + .setIcon( + (cons & 1) > 0 ? st : tex[0], + (cons & 2) > 0 ? st : tex[1], + (cons & 4) > 0 ? st : tex[2], + (cons & 8) > 0 ? st : tex[3], + (cons & 16) > 0 ? st : tex[4], + (cons & 32) > 0 ? st : tex[5] + ); + } + + public void renderCenterBlock(int cons, IIcon[] icon, IIcon sidtex) { + switch(cons) { + case 0: + this.setJacketIcons(3, icon, sidtex); + super.context.renderBox(63, 0.25, 0.25, 0.25, 0.75, 0.75, 0.75); + break; + case 3: + this.setJacketIcons(3, icon, sidtex); + super.context.renderBox(63, 0.25, 0.0, 0.25, 0.75, 1.0, 0.75); + break; + case 12: + this.setJacketIcons(12, icon, sidtex); + super.context.renderBox(63, 0.25, 0.25, 0.0, 0.75, 0.75, 1.0); + break; + case 48: + this.setJacketIcons(48, icon, sidtex); + super.context.renderBox(63, 0.0, 0.25, 0.25, 1.0, 0.75, 0.75); + break; + default: + if (Integer.bitCount(cons) > 1) { + super.context.setIcon(icon); + } else { + int rc = cons; + if (cons == 0) { + rc = 3; + } + + rc = (rc & 21) << 1 | (rc & 42) >> 1; + this.setJacketIcons(rc, icon, sidtex); + } + + super.context.renderBox(63 ^ cons, 0.25, 0.25, 0.25, 0.75, 0.75, 0.75); + if ((cons & 1) > 0) { + this.setJacketIcons(1, icon, sidtex); + super.context.renderBox(61, 0.25, 0.0, 0.25, 0.75, 0.25, 0.75); + } + + if ((cons & 2) > 0) { + this.setJacketIcons(2, icon, sidtex); + super.context.renderBox(62, 0.25, 0.75, 0.25, 0.75, 1.0, 0.75); + } + + if ((cons & 4) > 0) { + this.setJacketIcons(4, icon, sidtex); + super.context.renderBox(55, 0.25, 0.25, 0.0, 0.75, 0.75, 0.25); + } + + if ((cons & 8) > 0) { + this.setJacketIcons(8, icon, sidtex); + super.context.renderBox(59, 0.25, 0.25, 0.75, 0.75, 0.75, 1.0); + } + + if ((cons & 16) > 0) { + this.setJacketIcons(16, icon, sidtex); + super.context.renderBox(31, 0.0, 0.25, 0.25, 0.25, 0.75, 0.75); + } + + if ((cons & 32) > 0) { + this.setJacketIcons(32, icon, sidtex); + super.context.renderBox(47, 0.75, 0.25, 0.25, 1.0, 0.75, 0.75); + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/TileBluewire.java b/src/main/java/com/eloraam/redpower/wiring/TileBluewire.java new file mode 100644 index 0000000..45874a7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/TileBluewire.java @@ -0,0 +1,169 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.BluePowerConductor; +import com.eloraam.redpower.core.IBluePowerConnectable; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileBluewire extends TileWiring implements IBluePowerConnectable { + BluePowerConductor cond = new BluePowerConductor() { + @Override + public TileEntity getParent() { + return TileBluewire.this; + } + + @Override + public double getInvCap() { + switch(TileBluewire.this.Metadata) { + case 0: + return 8.0; + default: + return 800.0; + } + } + + @Override + public double getResistance() { + switch(TileBluewire.this.Metadata) { + case 0: + return 0.01; + default: + return 1.0; + } + } + + @Override + public double getIndScale() { + switch(TileBluewire.this.Metadata) { + case 0: + return 0.07; + default: + return 7.0E-4; + } + } + + @Override + public double getCondParallel() { + switch(TileBluewire.this.Metadata) { + case 0: + return 0.5; + default: + return 0.005; + } + } + }; + + @Override + public float getWireHeight() { + switch(super.Metadata) { + case 0: + return 0.188F; + case 1: + return 0.25F; + case 2: + return 0.3125F; + default: + return 0.25F; + } + } + + @Override + public int getExtendedID() { + return 5; + } + + @Override + public int getConnectClass(int side) { + switch(super.Metadata) { + case 0: + return 64; + case 1: + return 68; + default: + return 69; + } + } + + @Override + public BluePowerConductor getBlueConductor(int side) { + return this.cond; + } + + @Override + public int getConnectionMask() { + if (super.ConMask >= 0) { + return super.ConMask; + } else { + super.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + if (super.EConMask < 0) { + super.EConMask = RedPowerLib.getExtConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + super.EConEMask = RedPowerLib.getExtConnectionExtras(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + } + + if (!super.worldObj.isRemote) { + this.cond.recache(super.ConMask, super.EConMask); + } + + return super.ConMask; + } + } + + @Override + public int getExtConnectionMask() { + if (super.EConMask >= 0) { + return super.EConMask; + } else { + super.EConMask = RedPowerLib.getExtConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + super.EConEMask = RedPowerLib.getExtConnectionExtras(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + if (super.ConMask < 0) { + super.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + } + + if (!super.worldObj.isRemote) { + this.cond.recache(super.ConMask, super.EConMask); + } + + return super.EConMask; + } + } + + @Override + public boolean canUpdate() { + return true; + } + + @Override + public void updateEntity() { + if (!super.worldObj.isRemote) { + if (super.ConMask < 0 || super.EConMask < 0) { + if (super.ConMask < 0) { + super.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + } + + if (super.EConMask < 0) { + super.EConMask = RedPowerLib.getExtConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + super.EConEMask = RedPowerLib.getExtConnectionExtras(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + } + + this.cond.recache(super.ConMask, super.EConMask); + } + + this.cond.iterate(); + this.markDirty(); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cond.readFromNBT(data); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + this.cond.writeToNBT(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/TileCable.java b/src/main/java/com/eloraam/redpower/wiring/TileCable.java new file mode 100644 index 0000000..50a7c72 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/TileCable.java @@ -0,0 +1,75 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.nbt.NBTTagCompound; + +public class TileCable extends TileWiring implements IRedPowerWiring { + public short[] PowerState = new short[16]; + + @Override + public float getWireHeight() { + return 0.25F; + } + + @Override + public int getExtendedID() { + return 3; + } + + @Override + public int getConnectClass(int side) { + return 18 + super.Metadata; + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return 0; + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return ch >= 1 && ch <= 16 ? ((cons & this.getConnectableMask()) == 0 ? -1 : this.PowerState[ch - 1]) : -1; + } + + @Override + public void updateCurrentStrength() { + for(int ch = 0; ch < 16; ++ch) { + this.PowerState[ch] = (short)RedPowerLib.updateBlockCurrentStrength( + super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, 1073741823, 2 << ch + ); + } + + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getPoweringMask(int ch) { + return ch >= 1 && ch <= 16 ? (this.PowerState[ch - 1] == 0 ? 0 : this.getConnectableMask()) : 0; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + byte[] pwr = data.getByteArray("pwrs"); + if (pwr != null) { + for(int i = 0; i < 16; ++i) { + this.PowerState[i] = (short)(pwr[i] & 255); + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + byte[] pwr = new byte[16]; + + for(int i = 0; i < 16; ++i) { + pwr[i] = (byte)this.PowerState[i]; + } + + data.setByteArray("pwrs", pwr); + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/TileInsulatedWire.java b/src/main/java/com/eloraam/redpower/wiring/TileInsulatedWire.java new file mode 100644 index 0000000..a538766 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/TileInsulatedWire.java @@ -0,0 +1,93 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.nbt.NBTTagCompound; + +public class TileInsulatedWire extends TileWiring implements IRedPowerWiring { + public short PowerState = 0; + + @Override + public float getWireHeight() { + return 0.188F; + } + + @Override + public int getExtendedID() { + return 2; + } + + @Override + public boolean isBlockWeakPoweringTo(int side) { + if (RedPowerLib.isSearching()) { + return false; + } else { + int dir = RedPowerLib.getConDirMask(side ^ 1); + dir &= this.getConnectableMask(); + if (dir != 0) { + if (RedPowerLib.isBlockRedstone(super.worldObj, super.xCoord, super.yCoord, super.zCoord, side ^ 1)) { + if (this.PowerState > 15) { + return true; + } + } else if (this.PowerState > 0) { + return true; + } + } + + return false; + } + } + + @Override + public int getConnectClass(int side) { + return 2 + super.Metadata; + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cons, 0) ? 255 : 0; + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return ch != 0 && ch != super.Metadata + 1 ? -1 : ((cons & this.getConnectableMask()) == 0 ? -1 : this.PowerState); + } + + @Override + public void updateCurrentStrength() { + this.PowerState = (short)RedPowerLib.updateBlockCurrentStrength( + super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, 16777215, 1 | 2 << super.Metadata + ); + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getPoweringMask(int ch) { + return this.PowerState == 0 ? 0 : (ch != 0 && ch != super.Metadata + 1 ? 0 : this.getConnectableMask()); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.PowerState = (short)(data.getByte("pwr") & 255); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("pwr", (byte)this.PowerState); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.PowerState = (short)(data.getByte("pwr") & 255); + super.readFromPacket(data); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setByte("pwr", (byte)this.PowerState); + super.writeToPacket(data); + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/TileRedwire.java b/src/main/java/com/eloraam/redpower/wiring/TileRedwire.java new file mode 100644 index 0000000..f1bf148 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/TileRedwire.java @@ -0,0 +1,133 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IRedPowerWiring; +import com.eloraam.redpower.core.RedPowerLib; +import net.minecraft.nbt.NBTTagCompound; + +public class TileRedwire extends TileWiring implements IRedPowerWiring { + public short PowerState = 0; + + @Override + public int getExtendedID() { + return 1; + } + + @Override + public boolean isBlockStrongPoweringTo(int side) { + if (RedPowerLib.isSearching()) { + return false; + } else { + int dir = 15 << ((side ^ 1) << 2); + dir &= this.getConnectableMask(); + return dir != 0 && this.PowerState > 0; + } + } + + @Override + public boolean isBlockWeakPoweringTo(int side) { + if (RedPowerLib.isSearching()) { + return false; + } else { + int dir = 15 << ((side ^ 1) << 2); + dir |= RedPowerLib.getConDirMask(side ^ 1); + dir &= this.getConnectableMask(); + if (dir != 0) { + if (RedPowerLib.isBlockRedstone(super.worldObj, super.xCoord, super.yCoord, super.zCoord, side ^ 1)) { + if (this.PowerState > 15) { + return true; + } + } else if (this.PowerState > 0) { + return true; + } + } + + return false; + } + } + + @Override + public int getConnectClass(int side) { + return 1; + } + + @Override + public int getConnectableMask() { + if (super.ConaMask >= 0) { + return super.ConaMask; + } else { + int tr = super.getConnectableMask(); + if ((super.ConSides & 1) > 0) { + tr |= 16777216; + } + + if ((super.ConSides & 2) > 0) { + tr |= 33554432; + } + + if ((super.ConSides & 4) > 0) { + tr |= 67108864; + } + + if ((super.ConSides & 8) > 0) { + tr |= 134217728; + } + + if ((super.ConSides & 16) > 0) { + tr |= 268435456; + } + + if ((super.ConSides & 32) > 0) { + tr |= 536870912; + } + + super.ConaMask = tr; + return tr; + } + } + + @Override + public int getCurrentStrength(int cons, int ch) { + return ch != 0 ? -1 : ((cons & this.getConnectableMask()) == 0 ? -1 : this.PowerState); + } + + @Override + public int scanPoweringStrength(int cons, int ch) { + return ch != 0 ? 0 : (RedPowerLib.isPowered(super.worldObj, super.xCoord, super.yCoord, super.zCoord, cons, super.ConSides) ? 255 : 0); + } + + @Override + public void updateCurrentStrength() { + this.PowerState = (short)RedPowerLib.updateBlockCurrentStrength(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord, 1073741823, 1); + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + } + + @Override + public int getPoweringMask(int ch) { + return ch == 0 && this.PowerState != 0 ? this.getConnectableMask() : 0; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.PowerState = (short)(data.getByte("pwr") & 255); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("pwr", (byte)this.PowerState); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + super.readFromPacket(data); + this.PowerState = (short)(data.getByte("pwr") & 255); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + super.writeToPacket(data); + data.setByte("pwr", (byte)this.PowerState); + } +} diff --git a/src/main/java/com/eloraam/redpower/wiring/TileWiring.java b/src/main/java/com/eloraam/redpower/wiring/TileWiring.java new file mode 100644 index 0000000..190c1e7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/wiring/TileWiring.java @@ -0,0 +1,508 @@ +package com.eloraam.redpower.wiring; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.base.BlockMicro; +import com.eloraam.redpower.core.BlockMultipart; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.CoverLib; +import com.eloraam.redpower.core.IWiring; +import com.eloraam.redpower.core.RedPowerLib; +import com.eloraam.redpower.core.TileCovered; +import java.util.Arrays; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.IBlockAccess; + +public abstract class TileWiring extends TileCovered implements IWiring { + public int ConSides = 0; + public int Metadata = 0; + public short CenterPost = 0; + public int ConMask = -1; + public int EConMask = -1; + public int EConEMask = -1; + public int ConaMask = -1; + + public float getWireHeight() { + return 0.125F; + } + + public void uncache0() { + this.EConMask = -1; + this.EConEMask = -1; + this.ConMask = -1; + } + + public void uncache() { + if (this.ConaMask >= 0 || this.EConMask >= 0 || this.ConMask >= 0) { + super.worldObj.markBlockForUpdate(super.xCoord, super.yCoord, super.zCoord); + } + + this.ConaMask = -1; + this.EConMask = -1; + this.EConEMask = -1; + this.ConMask = -1; + } + + private static int stripBlockConMask(int side) { + switch(side) { + case 0: + return 257; + case 1: + return 4098; + case 2: + return 65540; + case 3: + return 1048584; + case 4: + return 263168; + case 5: + return 540672; + case 6: + return 4196352; + case 7: + return 8421376; + case 8: + return 528; + case 9: + return 8224; + case 10: + return 131136; + default: + return 2097280; + } + } + + @Override + public int getConnectableMask() { + if (this.ConaMask >= 0) { + return this.ConaMask; + } else { + int tr = 0; + if ((this.ConSides & 1) > 0) { + tr |= 15; + } + + if ((this.ConSides & 2) > 0) { + tr |= 240; + } + + if ((this.ConSides & 4) > 0) { + tr |= 3840; + } + + if ((this.ConSides & 8) > 0) { + tr |= 61440; + } + + if ((this.ConSides & 16) > 0) { + tr |= 983040; + } + + if ((this.ConSides & 32) > 0) { + tr |= 15728640; + } + + if ((super.CoverSides & 1) > 0) { + tr &= -1118465; + } + + if ((super.CoverSides & 2) > 0) { + tr &= -2236929; + } + + if ((super.CoverSides & 4) > 0) { + tr &= -4456466; + } + + if ((super.CoverSides & 8) > 0) { + tr &= -8912931; + } + + if ((super.CoverSides & 16) > 0) { + tr &= -17477; + } + + if ((super.CoverSides & 32) > 0) { + tr &= -34953; + } + + for(int i = 0; i < 12; ++i) { + if ((super.CoverSides & 16384 << i) > 0) { + tr &= ~stripBlockConMask(i); + } + } + + if ((this.ConSides & 64) > 0) { + tr |= 1056964608; + + for(int var4 = 0; var4 < 6; ++var4) { + if ((super.CoverSides & 1 << var4) > 0) { + int j = super.Covers[var4] >> 8; + if (j < 3) { + tr &= ~(1 << var4 + 24); + } + + if (j == 5) { + tr &= 3 << (var4 & -2) + 24; + } + } + } + } + + this.ConaMask = tr; + return tr; + } + } + + @Override + public int getConnectionMask() { + if (this.ConMask >= 0) { + return this.ConMask; + } else { + this.ConMask = RedPowerLib.getConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + return this.ConMask; + } + } + + @Override + public int getExtConnectionMask() { + if (this.EConMask >= 0) { + return this.EConMask; + } else { + this.EConMask = RedPowerLib.getExtConnections(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + this.EConEMask = RedPowerLib.getExtConnectionExtras(super.worldObj, this, super.xCoord, super.yCoord, super.zCoord); + return this.EConMask; + } + } + + @Override + public int getCornerPowerMode() { + return 1; + } + + @Override + public void onFrameRefresh(IBlockAccess iba) { + if (this.ConMask < 0) { + this.ConMask = RedPowerLib.getConnections(iba, this, super.xCoord, super.yCoord, super.zCoord); + } + + if (this.EConMask < 0) { + this.EConMask = RedPowerLib.getExtConnections(iba, this, super.xCoord, super.yCoord, super.zCoord); + this.EConEMask = RedPowerLib.getExtConnectionExtras(iba, this, super.xCoord, super.yCoord, super.zCoord); + } + + } + + @Override + public void onBlockNeighborChange(Block block) { + if (this.EConMask >= 0 || this.ConMask >= 0) { + super.worldObj.markBlockForUpdate(super.xCoord, super.yCoord, super.zCoord); + } + + this.ConMask = -1; + this.EConMask = -1; + this.EConEMask = -1; + this.refreshBlockSupport(); + RedPowerLib.updateCurrent(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + this.updateBlock(); + } + + @Override + public int getExtendedMetadata() { + return this.Metadata; + } + + @Override + public void setExtendedMetadata(int md) { + this.Metadata = md; + } + + @Override + public boolean canAddCover(int side, int cover) { + if (side < 6 && (this.ConSides & 1 << side) > 0) { + return false; + } else if ((super.CoverSides & 1 << side) > 0) { + return false; + } else { + short[] test = Arrays.copyOf(super.Covers, 29); + test[side] = (short)cover; + return CoverLib.checkPlacement(super.CoverSides | 1 << side, test, this.ConSides, (this.ConSides & 64) > 0); + } + } + + @Override + public boolean tryAddCover(int side, int cover) { + if (!this.canAddCover(side, cover)) { + return false; + } else { + super.CoverSides |= 1 << side; + super.Covers[side] = (short)cover; + this.uncache(); + this.updateBlockChange(); + return true; + } + } + + @Override + public int tryRemoveCover(int side) { + int tr = super.tryRemoveCover(side); + if (tr < 0) { + return -1; + } else { + this.uncache(); + this.updateBlockChange(); + return tr; + } + } + + @Override + public boolean blockEmpty() { + return super.CoverSides == 0 && this.ConSides == 0; + } + + @Override + public void addHarvestContents(List ist) { + super.addHarvestContents(ist); + + for(int s = 0; s < 6; ++s) { + if ((this.ConSides & 1 << s) != 0) { + ist.add(new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() * 256 + this.Metadata)); + } + } + + if ((this.ConSides & 64) > 0) { + int td = 16384 + this.CenterPost; + if (this.getExtendedID() == 3) { + td += 256; + } + + if (this.getExtendedID() == 5) { + td += 512; + } + + ist.add(new ItemStack(RedPowerBase.blockMicro, 1, td)); + } + + } + + @Override + public int getPartsMask() { + return super.CoverSides | this.ConSides & 63 | (this.ConSides & 64) << 23; + } + + @Override + public int getSolidPartsMask() { + return super.CoverSides | (this.ConSides & 64) << 23; + } + + public boolean refreshBlockSupport() { + boolean all = false; + int s = this.ConSides & 63; + if (s == 3 || s == 12 || s == 48) { + all = true; + } + + for(int var3 = 0; var3 < 6; ++var3) { + if ((this.ConSides & 1 << var3) != 0 && (all || !RedPowerLib.canSupportWire(super.worldObj, super.xCoord, super.yCoord, super.zCoord, var3))) { + this.uncache(); + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + CoreLib.dropItem( + super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() * 256 + this.Metadata) + ); + this.ConSides &= ~(1 << var3); + } + } + + if (this.ConSides == 0) { + if (super.CoverSides > 0) { + this.replaceWithCovers(); + } else { + this.deleteBlock(); + } + + return false; + } else { + return true; + } + } + + @Override + public void onHarvestPart(EntityPlayer player, int part, boolean willHarvest) { + if (part == 29 && (this.ConSides & 64) > 0) { + int td = 16384 + this.CenterPost; + if (this.getExtendedID() == 3) { + td += 256; + } + + if (this.getExtendedID() == 5) { + td += 512; + } + + if (willHarvest) { + CoreLib.dropItem(super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerBase.blockMicro, 1, td)); + } + + this.ConSides &= 63; + } else { + if ((this.ConSides & 1 << part) <= 0) { + super.onHarvestPart(player, part, willHarvest); + return; + } + + if (willHarvest) { + CoreLib.dropItem( + super.worldObj, super.xCoord, super.yCoord, super.zCoord, new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() * 256 + this.Metadata) + ); + } + + this.ConSides &= ~(1 << part); + } + + this.uncache(); + if (this.ConSides == 0) { + if (super.CoverSides > 0) { + this.replaceWithCovers(); + } else { + this.deleteBlock(); + } + } + + CoreLib.markBlockDirty(super.worldObj, super.xCoord, super.yCoord, super.zCoord); + RedPowerLib.updateIndirectNeighbors(super.worldObj, super.xCoord, super.yCoord, super.zCoord, RedPowerBase.blockMicro); + } + + @Override + public float getPartStrength(EntityPlayer player, int part) { + BlockMicro bl = RedPowerBase.blockMicro; + return part == 29 && (this.ConSides & 64) > 0 + ? player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F) + : ((this.ConSides & 1 << part) > 0 ? player.getBreakSpeed(bl, false, 0) / (bl.getHardness() * 30.0F) : super.getPartStrength(player, part)); + } + + @Override + public void setPartBounds(BlockMultipart block, int part) { + if (part == 29) { + if ((this.ConSides & 64) == 0) { + super.setPartBounds(block, part); + return; + } + } else if ((this.ConSides & 1 << part) == 0) { + super.setPartBounds(block, part); + return; + } + + float wh = this.getWireHeight(); + switch(part) { + case 0: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, wh, 1.0F); + break; + case 1: + block.setBlockBounds(0.0F, 1.0F - wh, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 2: + block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, wh); + break; + case 3: + block.setBlockBounds(0.0F, 0.0F, 1.0F - wh, 1.0F, 1.0F, 1.0F); + break; + case 4: + block.setBlockBounds(0.0F, 0.0F, 0.0F, wh, 1.0F, 1.0F); + break; + case 5: + block.setBlockBounds(1.0F - wh, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + case 29: + block.setBlockBounds(0.25F, 0.25F, 0.25F, 0.75F, 0.75F, 0.75F); + } + + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.ConSides = data.getByte("cons") & 255; + this.Metadata = data.getByte("md") & 255; + this.CenterPost = (short)(data.getByte("post") & 255); + } + + @Override + public void writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setByte("cons", (byte)this.ConSides); + data.setByte("md", (byte)this.Metadata); + data.setShort("post", this.CenterPost); + } + + @Override + public void writeFramePacket(NBTTagCompound tag) { + tag.setInteger("md", this.Metadata); + tag.setInteger("cons", this.ConSides); + if ((this.ConSides & 64) > 0) { + tag.setShort("post", this.CenterPost); + } + + super.writeFramePacket(tag); + } + + @Override + public void readFramePacket(NBTTagCompound tag) { + this.Metadata = tag.getInteger("md"); + this.ConSides = tag.getInteger("cons"); + if ((this.ConSides & 64) > 0) { + this.CenterPost = tag.getShort("post"); + } + + this.ConaMask = -1; + this.EConMask = -1; + this.EConEMask = -1; + this.ConMask = -1; + super.readFramePacket(tag); + } + + @Override + protected void readFromPacket(NBTTagCompound data) { + this.Metadata = data.getInteger("md"); + this.ConSides = data.getInteger("cons"); + if ((this.ConSides & 64) > 0) { + this.CenterPost = data.getShort("post"); + } + + this.ConaMask = -1; + this.EConMask = -1; + this.EConEMask = -1; + this.ConMask = -1; + super.readFromPacket(data); + } + + @Override + protected void writeToPacket(NBTTagCompound data) { + data.setInteger("md", this.Metadata); + data.setInteger("cons", this.ConSides); + if ((this.ConSides & 64) > 0) { + data.setShort("post", this.CenterPost); + } + + super.writeToPacket(data); + } + + @Override + protected ItemStack getBasePickStack() { + if ((this.ConSides & 64) > 0) { + int td = 16384 + this.CenterPost; + if (this.getExtendedID() == 3) { + td += 256; + } + + if (this.getExtendedID() == 5) { + td += 512; + } + + return new ItemStack(RedPowerBase.blockMicro, 1, td); + } else { + return new ItemStack(RedPowerBase.blockMicro, 1, this.getExtendedID() * 256 + this.Metadata); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockBrickMossifier.java b/src/main/java/com/eloraam/redpower/world/BlockBrickMossifier.java new file mode 100644 index 0000000..3ba833f --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockBrickMossifier.java @@ -0,0 +1,94 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.core.WorldCoord; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockStoneBrick; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +public class BlockBrickMossifier extends BlockStoneBrick { + public BlockBrickMossifier() { + this.setTickRandomly(true); + this.setHardness(1.5F); + this.setResistance(10.0F); + this.setStepSound(Block.soundTypeStone); + this.setBlockName("stonebricksmooth"); + } + + public void updateTick(World world, int i, int j, int k, Random random) { + switch(world.getBlockMetadata(i, j, k)) { + case 0: + this.crackBrick(world, i, j, k, random); + break; + case 1: + this.spreadMoss(world, i, j, k, random); + } + + } + + private void crackBrick(World world, int i, int j, int k, Random random) { + WorldCoord wc1 = new WorldCoord(i, j, k); + boolean lava = false; + boolean water = false; + + for(int n = 0; n < 6; ++n) { + WorldCoord wc2 = wc1.coordStep(n); + Block block = world.getBlock(wc2.x, wc2.y, wc2.z); + if (block == Blocks.water || block == Blocks.flowing_water) { + water = true; + } else if (block == Blocks.lava || block == Blocks.flowing_lava) { + lava = true; + } + } + + if (lava && water && random.nextInt(2) == 0) { + world.setBlock(i, j, k, this, 2, 3); + } + + } + + private void spreadMoss(World world, int i, int j, int k, Random random) { + if (world.isAirBlock(i, j + 1, k) && !world.canBlockSeeTheSky(i, j + 1, k)) { + WorldCoord wc1 = new WorldCoord(i, j, k); + + for(int n = 0; n < 4; ++n) { + WorldCoord wc2 = wc1.coordStep(2 + n); + Block block = world.getBlock(wc2.x, wc2.y, wc2.z); + Block rpb = block; + byte rpmd = 0; + if (block == Blocks.cobblestone) { + rpb = Blocks.mossy_cobblestone; + } else { + if (block != Blocks.stonebrick || world.getBlockMetadata(wc2.x, wc2.y, wc2.z) != 0) { + continue; + } + + rpmd = 1; + } + + if (world.isAirBlock(wc2.x, wc2.y + 1, wc2.z)) { + if (world.canBlockSeeTheSky(wc2.x, wc2.y + 1, wc2.z)) { + return; + } + + boolean wet = false; + + for(int m = 0; m < 4; ++m) { + WorldCoord wc3 = wc2.coordStep(2 + m); + Block bd2 = world.getBlock(wc3.x, wc3.y, wc3.z); + if (bd2 == Blocks.water || bd2 == Blocks.flowing_water) { + wet = true; + break; + } + } + + if (wet && random.nextInt(2) == 0) { + world.setBlock(wc2.x, wc2.y, wc2.z, rpb, rpmd, 3); + } + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCobbleMossifier.java b/src/main/java/com/eloraam/redpower/world/BlockCobbleMossifier.java new file mode 100644 index 0000000..78c6868 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCobbleMossifier.java @@ -0,0 +1,66 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.core.WorldCoord; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +public class BlockCobbleMossifier extends Block { + public BlockCobbleMossifier() { + super(Material.rock); + this.setTickRandomly(true); + this.setHardness(2.0F); + this.setResistance(10.0F); + this.setStepSound(Block.soundTypeStone); + this.setBlockName("stoneMoss"); + this.setBlockTextureName("minecraft:stoneMoss"); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + public void updateTick(World world, int i, int j, int k, Random random) { + if (world.isAirBlock(i, j + 1, k) && !world.canBlockSeeTheSky(i, j + 1, k)) { + WorldCoord wc1 = new WorldCoord(i, j, k); + + for(int n = 0; n < 4; ++n) { + WorldCoord wc2 = wc1.coordStep(2 + n); + Block block = world.getBlock(wc2.x, wc2.y, wc2.z); + Block rpb = block; + byte rpmd = 0; + if (block == Blocks.cobblestone) { + rpb = this; + } else { + if (block != Blocks.stonebrick || world.getBlockMetadata(wc2.x, wc2.y, wc2.z) != 0) { + continue; + } + + rpmd = 1; + } + + if (world.isAirBlock(wc2.x, wc2.y + 1, wc2.z)) { + if (world.canBlockSeeTheSky(wc2.x, wc2.y + 1, wc2.z)) { + return; + } + + boolean wet = false; + + for(int m = 0; m < 4; ++m) { + WorldCoord wc3 = wc2.coordStep(2 + m); + Block bd2 = world.getBlock(wc3.x, wc3.y, wc3.z); + if (bd2 == Blocks.water || bd2 == Blocks.flowing_water) { + wet = true; + break; + } + } + + if (wet && random.nextInt(2) == 0) { + world.setBlock(wc2.x, wc2.y, wc2.z, rpb, rpmd, 3); + } + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomCrops.java b/src/main/java/com/eloraam/redpower/world/BlockCustomCrops.java new file mode 100644 index 0000000..667e918 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomCrops.java @@ -0,0 +1,227 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.IGrowable; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class BlockCustomCrops extends BlockFlower implements IGrowable { + private IIcon[] icons = new IIcon[6]; + + public BlockCustomCrops() { + super(0); + this.setHardness(0.0F); + this.setStepSound(Block.soundTypeGrass); + this.setTickRandomly(true); + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); + } + + public IIcon getIcon(int side, int meta) { + if (meta > 6) { + meta = 6; + } + + return this.icons[meta]; + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + for(int i = 0; i < this.icons.length; ++i) { + this.icons[i] = register.registerIcon("rpworld:flaxCrop/" + i); + } + + } + + public int getRenderType() { + return 6; + } + + public Item getItemDropped(int meta, Random random, int fortune) { + return null; + } + + public boolean fertilize(World world, int x, int y, int z) { + Random random = world.rand; + if (world.getBlockLightValue(x, y + 1, z) < 9) { + return false; + } else { + int md = world.getBlockMetadata(x, y, z); + if (md != 4 && md != 5) { + if (world.getBlock(x, y - 1, z) == Blocks.farmland && world.getBlockMetadata(x, y - 1, z) != 0 && world.isAirBlock(x, y + 1, z)) { + if (random.nextBoolean()) { + world.setBlockMetadataWithNotify(x, y, z, md + 1, 3); + if (md == 3) { + world.setBlock(x, y + 1, z, this, 1, 3); + } + + return true; + } + } else if (world.getBlock(x, y - 2, z) == Blocks.farmland + && world.getBlockMetadata(x, y - 2, z) != 0 + && world.isAirBlock(x, y + 1, z) + && random.nextBoolean()) { + if (md + 1 < 4) { + world.setBlock(x, y, z, this, md + 1, 3); + return true; + } + + if (world.getBlockMetadata(x, y, z) != 5) { + world.setBlock(x, y, z, this, 5, 3); + return true; + } + + return false; + } + } else if (world.getBlock(x, y - 1, z) == Blocks.farmland + && world.getBlockMetadata(x, y - 1, z) != 0 + && world.isAirBlock(x, y + 2, z) + && world.getBlock(x, y + 1, z) == this + && world.getBlockMetadata(x, y + 1, z) <= 3 + && random.nextBoolean()) { + int mdup = world.getBlockMetadata(x, y + 1, z); + if (mdup + 1 <= 3) { + world.setBlock(x, y + 1, z, this, mdup + 1, 3); + return true; + } + + if (world.getBlockMetadata(x, y + 1, z) != 5) { + world.setBlock(x, y + 1, z, this, 5, 3); + return true; + } + + return false; + } + + return false; + } + } + + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList tr = new ArrayList(); + if (metadata == 5) { + int n = 1 + world.rand.nextInt(3) + world.rand.nextInt(1 + fortune); + + while(n-- > 0) { + tr.add(new ItemStack(Items.string)); + } + } else { + for(int n = 0; n < 3 + fortune; ++n) { + if (world.rand.nextInt(8) <= metadata) { + tr.add(new ItemStack(RedPowerWorld.itemSeeds, 1, 0)); + } + } + } + + return tr; + } + + public void updateTick(World world, int x, int y, int z, Random random) { + super.updateTick(world, x, y, z, random); + if (world.getBlockLightValue(x, y + 1, z) >= 9) { + int md = world.getBlockMetadata(x, y, z); + if (md != 4 && md != 5) { + if (world.getBlock(x, y - 1, z) == Blocks.farmland && world.getBlockMetadata(x, y - 1, z) != 0 && world.isAirBlock(x, y + 1, z)) { + if (random.nextBoolean()) { + world.setBlockMetadataWithNotify(x, y, z, md + 1, 3); + if (md == 3) { + world.setBlock(x, y + 1, z, this, 1, 3); + } + } + } else if (world.getBlock(x, y - 2, z) == Blocks.farmland + && world.getBlockMetadata(x, y - 2, z) != 0 + && world.isAirBlock(x, y + 1, z) + && random.nextBoolean()) { + if (md + 1 < 4) { + world.setBlock(x, y, z, this, md + 1, 3); + } else if (world.getBlockMetadata(x, y, z) != 5) { + world.setBlock(x, y, z, this, 5, 3); + } + } + } + } + + } + + public boolean canBlockStay(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if (world.getBlock(x, y - 1, z) == Blocks.farmland && world.getBlockMetadata(x, y - 1, z) > 0) { + if (meta != 4) { + return true; + } else { + int upperMeta = world.getBlockMetadata(x, y + 1, z); + return world.getBlock(x, y + 1, z) == this && upperMeta != 4 && world.getBlockLightValue(x, y + 1, z) >= 9; + } + } else if (world.getBlock(x, y - 2, z) == Blocks.farmland && world.getBlockMetadata(x, y - 2, z) > 0) { + int lowerMeta = world.getBlockMetadata(x, y - 1, z); + return world.getBlock(x, y - 1, z) == this && lowerMeta == 4 && world.getBlockLightValue(x, y, z) >= 9; + } else { + return false; + } + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List items) { + } + + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + double sy = (double)y; + double ex = (double)x + 1.0; + double ey = (double)y + 1.0; + double ez = (double)z + 1.0; + if (world.getBlock(x, y - 1, z) == this && world.getBlockMetadata(x, y - 1, z) == 4) { + --sy; + ey = (double)y + 0.25 * (double)Math.min(4, meta); + } else if (meta == 4 && world.getBlock(x, y + 1, z) == this) { + int upperMeta = world.getBlockMetadata(x, y + 1, z); + ey = (double)y + 1.0 + 0.25 * (double)Math.min(4, upperMeta == 5 ? 4 : upperMeta); + } else if (meta < 4) { + ey = (double)y + 0.25 * (double)meta; + } + + return AxisAlignedBB.getBoundingBox((double)x, sy, (double)z, ex, ey, ez); + } + + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + return new ItemStack(RedPowerWorld.itemSeeds, 1, 0); + } + + public boolean func_149851_a(World world, int x, int y, int z, boolean isWorldRemote) { + int meta = world.getBlockMetadata(x, y, z); + if (meta != 4) { + return meta < 5; + } else { + return world.getBlock(x, y + 1, z) == this && world.getBlockMetadata(x, y + 1, z) < 5; + } + } + + public boolean func_149852_a(World world, Random rand, int x, int y, int z) { + return world.rand.nextFloat() < 0.45F; + } + + public void func_149853_b(World world, Random rand, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if (meta == 4 && world.getBlock(x, y + 1, z) == this && world.getBlockMetadata(x, y + 1, z) < 5) { + this.fertilize(world, x, y + 1, z); + } else { + this.fertilize(world, x, y, z); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomFlower.java b/src/main/java/com/eloraam/redpower/world/BlockCustomFlower.java new file mode 100644 index 0000000..d6d2a6d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomFlower.java @@ -0,0 +1,99 @@ +package com.eloraam.redpower.world; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.IGrowable; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.event.terraingen.TerrainGen; + +public class BlockCustomFlower extends BlockFlower implements IGrowable { + public String[] names = new String[2]; + public IIcon[] icons = new IIcon[2]; + + public BlockCustomFlower(String... names) { + super(0); + this.names = names; + this.setHardness(0.0F); + this.setStepSound(Block.soundTypeGrass); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister registerer) { + for(int i = 0; i < 2; ++i) { + this.icons[i] = registerer.registerIcon(this.names[i]); + } + + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.icons[meta % this.icons.length]; + } + + public void updateTick(World world, int x, int y, int z, Random random) { + int md = world.getBlockMetadata(x, y, z); + if (!world.isRemote && (md == 1 || md == 2) && world.getBlockLightValue(x, y + 1, z) >= 9 && random.nextInt(300) == 0) { + if (md == 1) { + Chunk chunk = new Chunk(world, x >> 4, z >> 4); + chunk.setBlockMetadata(x, y, z, 2); + } else { + this.growTree(world, x, y, z); + } + } + + } + + public boolean growTree(World world, int x, int y, int z) { + world.setBlockToAir(x, y, z); + if (!TerrainGen.saplingGrowTree(world, world.rand, x, y, z)) { + return false; + } else { + WorldGenRubberTree wg = new WorldGenRubberTree(); + if (!wg.generate(world, world.rand, x, y, z)) { + world.setBlock(x, y, z, this, 1, 3); + return false; + } else { + return true; + } + } + } + + public int damageDropped(int i) { + return i == 2 ? 1 : i; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List items) { + items.add(new ItemStack(this, 1, 0)); + items.add(new ItemStack(this, 1, 1)); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldObj, int x, int y, int z) { + int meta = worldObj.getBlockMetadata(x, y, z); + return meta == 0 ? super.getCollisionBoundingBoxFromPool(worldObj, x, y, z) : Blocks.sapling.getCollisionBoundingBoxFromPool(worldObj, x, y, z); + } + + public boolean func_149851_a(World world, int x, int y, int z, boolean isWorldRemote) { + return world.getBlockMetadata(x, y, z) > 0; + } + + public boolean func_149852_a(World world, Random rand, int x, int y, int z) { + return (double)world.rand.nextFloat() < 0.45; + } + + public void func_149853_b(World world, Random rand, int x, int y, int z) { + this.growTree(world, x, y, z); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomLeaves.java b/src/main/java/com/eloraam/redpower/world/BlockCustomLeaves.java new file mode 100644 index 0000000..f2b2b58 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomLeaves.java @@ -0,0 +1,138 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.WorldCoord; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLeaves; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockCustomLeaves extends BlockLeaves { + private String opaque; + private IIcon opaqueIcon; + private String transparent; + private IIcon transparentIcon; + + public BlockCustomLeaves(String opaque, String transparent) { + this.opaque = opaque; + this.transparent = transparent; + this.setTickRandomly(true); + this.setHardness(0.2F); + this.setStepSound(Block.soundTypeGrass); + this.setLightOpacity(1); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister registerer) { + this.opaqueIcon = registerer.registerIcon(this.opaque); + this.transparentIcon = registerer.registerIcon(this.transparent); + } + + public boolean isOpaqueCube() { + super.field_150121_P = !Blocks.leaves.isOpaqueCube(); + return !super.field_150121_P; + } + + public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l) { + super.field_150121_P = !Blocks.leaves.isOpaqueCube(); + return super.shouldSideBeRendered(iblockaccess, i, j, k, l); + } + + public IIcon getIcon(int i, int j) { + super.field_150121_P = !Blocks.leaves.isOpaqueCube(); + return super.field_150121_P ? this.transparentIcon : this.opaqueIcon; + } + + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if (world.getBlock(x, y, z) != this) { + updateLeaves(world, x, y, z, 1); + } + + } + + public static void updateLeaves(World world, int x, int y, int z, int radius) { + if (world.checkChunksExist(x - radius - 1, y - radius - 1, z - radius - 1, x + radius + 1, y + radius + 1, z + radius + 1)) { + for(int dx = -radius; dx <= radius; ++dx) { + for(int dy = -radius; dy <= radius; ++dy) { + for(int dz = -radius; dz <= radius; ++dz) { + if (world.getBlock(x + dx, y + dy, z + dz) == RedPowerWorld.blockLeaves) { + int md = world.getBlockMetadata(x + dx, y + dy, z + dz); + world.setBlock(x + dx, y + dy, z + dz, world.getBlock(x + dx, y + dy, z + dz), md | 8, 3); + } + } + } + } + } + + } + + public void updateTick(World world, int x, int y, int z, Random random) { + if (!world.isRemote) { + int md = world.getBlockMetadata(x, y, z); + if ((md & 8) != 0 && (md & 4) <= 0) { + HashMap wch = new HashMap(); + LinkedList fifo = new LinkedList(); + WorldCoord wc = new WorldCoord(x, y, z); + WorldCoord wcp = wc.copy(); + fifo.addLast(wc); + wch.put(wc, 4); + + while(fifo.size() > 0) { + wc = (WorldCoord)fifo.removeFirst(); + Integer stp = (Integer)wch.get(wc); + if (stp != null) { + for(int n = 0; n < 6; ++n) { + wcp.set(wc); + wcp.step(n); + if (!wch.containsKey(wcp)) { + Block block = world.getBlock(wcp.x, wcp.y, wcp.z); + if (block == RedPowerWorld.blockLogs) { + world.setBlock(x, y, z, RedPowerWorld.blockLeaves, md & -9, 3); + return; + } + + if (stp != 0 && block == this) { + wch.put(wcp, stp - 1); + fifo.addLast(wcp); + } + } + } + } + } + + this.dropBlockAsItem(world, x, y, z, md, 0); + world.setBlockToAir(x, y, z); + } + } + + } + + public Item getItemDropped(int i, Random random, int j) { + return Item.getItemFromBlock(RedPowerWorld.blockPlants); + } + + public int quantityDropped(int i, int fortune, Random random) { + return random.nextInt(20) != 0 ? 0 : 1; + } + + public int damageDropped(int i) { + return 1; + } + + public boolean isLeaves(IBlockAccess world, int x, int y, int z) { + return true; + } + + public String[] func_150125_e() { + return new String[]{this.getUnlocalizedName()}; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomLog.java b/src/main/java/com/eloraam/redpower/world/BlockCustomLog.java new file mode 100644 index 0000000..5a68e4e --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomLog.java @@ -0,0 +1,54 @@ +package com.eloraam.redpower.world; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLog; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockCustomLog extends BlockLog { + private String side; + private IIcon sideIcon; + private String top; + private IIcon topIcon; + + public BlockCustomLog(String side, String top) { + this.side = side; + this.top = top; + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + this.sideIcon = register.registerIcon(this.side); + this.topIcon = register.registerIcon(this.top); + } + + public static int func_150165_c(int p_150165_0_) { + return p_150165_0_; + } + + @SideOnly(Side.CLIENT) + protected IIcon getSideIcon(int damage) { + return this.sideIcon; + } + + @SideOnly(Side.CLIENT) + protected IIcon getTopIcon(int damage) { + return this.topIcon; + } + + public int damageDropped(int i) { + return i == 1 ? 0 : i; + } + + public boolean isWood(IBlockAccess world, int x, int y, int z) { + return true; + } + + public void breakBlock(World world, int i, int j, int k, Block block, int meta) { + BlockCustomLeaves.updateLeaves(world, i, j, k, 4); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomOre.java b/src/main/java/com/eloraam/redpower/world/BlockCustomOre.java new file mode 100644 index 0000000..1ec8699 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomOre.java @@ -0,0 +1,103 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +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.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockCustomOre extends Block { + private IIcon[] icons = new IIcon[8]; + + public BlockCustomOre() { + super(Material.rock); + this.setHardness(3.0F); + this.setResistance(5.0F); + this.setBlockName("rpores"); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + for(int i = 0; i < this.icons.length; ++i) { + this.icons[i] = register.registerIcon("rpworld:ore/" + i); + } + + } + + public float getBlockHardness(World world, int x, int y, int z) { + return 3.0F; + } + + public IIcon getIcon(int side, int meta) { + return this.icons[meta]; + } + + public Item getItemDropped(int meta, Random random, int fortune) { + return (Item)(meta >= 3 && meta != 7 ? Item.getItemFromBlock(this) : RedPowerBase.itemResource); + } + + public int quantityDropped(int i, int fortune, Random random) { + if (i == 7) { + return 4 + random.nextInt(2) + random.nextInt(fortune + 1); + } else if (i < 3) { + int b = random.nextInt(fortune + 2) - 1; + if (b < 0) { + b = 0; + } + + return b + 1; + } else { + return 1; + } + } + + public int damageDropped(int i) { + return i == 7 ? 6 : i; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i <= 7; ++i) { + list.add(new ItemStack(this, 1, i)); + } + + } + + public void dropBlockAsItemWithChance(World world, int x, int y, int z, int md, float chance, int fortune) { + super.dropBlockAsItemWithChance(world, x, y, z, md, chance, fortune); + byte min = 0; + byte max = 0; + switch(md) { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + default: + break; + case 2: + min = 3; + max = 7; + break; + case 7: + min = 1; + max = 5; + } + + if (max > 0) { + this.dropXpOnBlockBreak(world, x, y, z, MathHelper.getRandomIntegerInRange(world.rand, min, max)); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockCustomStone.java b/src/main/java/com/eloraam/redpower/world/BlockCustomStone.java new file mode 100644 index 0000000..86acbba --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockCustomStone.java @@ -0,0 +1,122 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.core.IBlockHardness; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +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.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class BlockCustomStone extends Block implements IBlockHardness { + private String[] textures = new String[16]; + private IIcon[] icons = new IIcon[16]; + + public BlockCustomStone() { + super(Material.rock); + this.setHardness(3.0F); + this.setResistance(10.0F); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + for(int i = 0; i < this.textures.length; ++i) { + if (this.textures[i] != null && !this.textures[i].trim().isEmpty()) { + this.icons[i] = register.registerIcon(this.textures[i]); + } else { + this.icons[i] = null; + } + } + + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return this.icons[meta]; + } + + public BlockCustomStone setBlockTexture(int meta, String textureName) { + this.textures[meta] = textureName; + return this; + } + + @Override + public float getPrototypicalHardness(int metadata) { + switch(metadata) { + case 0: + return 1.0F; + case 1: + return 2.5F; + case 2: + return 1.0F; + case 3: + return 2.5F; + case 4: + return 2.5F; + case 5: + return 2.5F; + case 6: + return 2.5F; + default: + return 3.0F; + } + } + + public float getBlockHardness(World world, int x, int y, int z) { + int md = world.getBlockMetadata(x, y, z); + return this.getPrototypicalHardness(md); + } + + public float getExplosionResistance(Entity exploder, World world, int X, int Y, int Z, double srcX, double srcY, double srcZ) { + int md = world.getBlockMetadata(X, Y, Z); + switch(md) { + case 1: + case 3: + case 4: + case 5: + case 6: + return 12.0F; + case 2: + default: + return 6.0F; + } + } + + public int getBlockTextureFromSideAndMetadata(int i, int j) { + return 16 + j; + } + + public Item getItemDropped(int meta, Random random, int fortune) { + return Item.getItemFromBlock(this); + } + + public int quantityDropped(Random random) { + return 1; + } + + public int damageDropped(int i) { + return i == 1 ? 3 : (i == 6 ? 3 : i); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + for(int i = 0; i <= 6; ++i) { + list.add(new ItemStack(this, 1, i)); + } + + } + + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { + return new ItemStack(this, 1, world.getBlockMetadata(x, y, z)); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/BlockStorage.java b/src/main/java/com/eloraam/redpower/world/BlockStorage.java new file mode 100644 index 0000000..dfa19f6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/BlockStorage.java @@ -0,0 +1,48 @@ +package com.eloraam.redpower.world; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class BlockStorage extends Block { + private IIcon[] icons = new IIcon[8]; + + public BlockStorage() { + super(Material.iron); + this.setHardness(5.0F); + this.setResistance(10.0F); + this.setStepSound(Block.soundTypeMetal); + this.setCreativeTab(CreativeTabs.tabBlock); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + for(int i = 0; i < this.icons.length; ++i) { + this.icons[i] = register.registerIcon("rpworld:storage/" + i); + } + + } + + public IIcon getIcon(int side, int meta) { + return this.icons[meta]; + } + + public int damageDropped(int meta) { + return meta; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List items) { + for(int i = 0; i < 8; ++i) { + items.add(new ItemStack(this, 1, i)); + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ContainerSeedBag.java b/src/main/java/com/eloraam/redpower/world/ContainerSeedBag.java new file mode 100644 index 0000000..e0e684a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ContainerSeedBag.java @@ -0,0 +1,110 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.core.SlotLocked; +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 ContainerSeedBag extends Container { + private ItemStack itemBag; + private IInventory baginv; + private int hotbarIndex; + + public ContainerSeedBag(InventoryPlayer inv, IInventory bag, ItemStack stack) { + this.baginv = bag; + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 3; ++j) { + this.addSlotToContainer(new ContainerSeedBag.SlotSeeds(bag, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + for(int i = 0; i < 3; ++i) { + for(int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for(int i = 0; i < 9; ++i) { + if (inv.currentItem == i) { + this.addSlotToContainer(new SlotLocked(inv, i, 8 + i * 18, 142)); + } else { + this.addSlotToContainer(new Slot(inv, i, 8 + i * 18, 142)); + } + } + + this.itemBag = stack; + this.hotbarIndex = inv.currentItem; + } + + public boolean canInteractWith(EntityPlayer player) { + return player.inventory.getCurrentItem() == this.itemBag; + } + + public ItemStack transferStackInSlot(EntityPlayer player, int slotId) { + if (!player.worldObj.isRemote && this.itemBag != player.getHeldItem()) { + player.closeScreen(); + return null; + } else { + ItemStack result = null; + Slot slot = (Slot)super.inventorySlots.get(slotId); + if (slot != null && slot.getHasStack()) { + ItemStack outStack = slot.getStack(); + if (!ItemSeedBag.canAdd(this.baginv, outStack)) { + return null; + } + + result = outStack.copy(); + if (slotId < 9) { + if (!this.mergeItemStack(outStack, 9, 45, true)) { + return null; + } + } else if (!this.mergeItemStack(outStack, 0, 9, false)) { + return null; + } + + if (outStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + if (outStack.stackSize == result.stackSize) { + return null; + } + + slot.onPickupFromSlot(player, outStack); + } + + return result; + } + } + + public ItemStack slotClick(int slotId, int dragModeOrBtn, int mode, EntityPlayer player) { + if (!this.canInteractWith(player)) { + return null; + } else { + if (mode == 2 && dragModeOrBtn >= 0 && dragModeOrBtn < 9) { + Slot hotbarSlot = this.getSlot(36 + dragModeOrBtn); + if (hotbarSlot instanceof SlotLocked) { + return null; + } + } + + return super.slotClick(slotId, dragModeOrBtn, mode, player); + } + } + + public static class SlotSeeds extends Slot { + public SlotSeeds(IInventory inv, int par2, int par3, int par4) { + super(inv, par2, par3, par4); + } + + public boolean isItemValid(ItemStack ist) { + return ItemSeedBag.canAdd(super.inventory, ist); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/EnchantmentDisjunction.java b/src/main/java/com/eloraam/redpower/world/EnchantmentDisjunction.java new file mode 100644 index 0000000..63b9afc --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/EnchantmentDisjunction.java @@ -0,0 +1,37 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentDamage; +import net.minecraft.enchantment.EnumEnchantmentType; +import net.minecraft.item.ItemStack; + +public class EnchantmentDisjunction extends Enchantment { + public EnchantmentDisjunction(int i, int j) { + super(i, j, EnumEnchantmentType.weapon); + } + + public int getMinEnchantability(int i) { + return 5 + 8 * i; + } + + public int getMaxEnchantability(int i) { + return this.getMinEnchantability(i) + 20; + } + + public int getMaxLevel() { + return 5; + } + + public String getName() { + return "enchantment.damage.disjunction"; + } + + public boolean canApply(ItemStack ist) { + return ist.getItem() == RedPowerWorld.itemAthame; + } + + public boolean canApplyTogether(Enchantment enchantment) { + return enchantment == this ? false : !(enchantment instanceof EnchantmentDamage); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/EnchantmentVorpal.java b/src/main/java/com/eloraam/redpower/world/EnchantmentVorpal.java new file mode 100644 index 0000000..00a1c2b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/EnchantmentVorpal.java @@ -0,0 +1,43 @@ +package com.eloraam.redpower.world; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentDamage; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; + +public class EnchantmentVorpal extends EnchantmentDamage { + public EnchantmentVorpal(int i, int j) { + super(i, j, 0); + } + + public int getMinEnchantability(int i) { + return 20 + 10 * (i - 1); + } + + public int getMaxEnchantability(int i) { + return this.getMinEnchantability(i) + 50; + } + + public int getMaxLevel() { + return 4; + } + + public void func_151368_a(EntityLivingBase attacker, Entity target, int damage) { + if (target instanceof EntityLivingBase) { + EntityLivingBase targetLiving = (EntityLivingBase)target; + if (target.worldObj.rand.nextInt(100) < 2 * damage * damage) { + targetLiving.attackEntityFrom(DamageSource.magic, 100.0F); + } + } + + } + + public String getName() { + return "enchantment.damage.vorpal"; + } + + public boolean canApplyTogether(Enchantment enchantment) { + return enchantment != this; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/GuiSeedBag.java b/src/main/java/com/eloraam/redpower/world/GuiSeedBag.java new file mode 100644 index 0000000..6c1fe08 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/GuiSeedBag.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.world; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiSeedBag extends GuiContainer { + private static final ResourceLocation res = new ResourceLocation("textures/gui/container/dispenser.png"); + + public GuiSeedBag(InventoryPlayer pli, IInventory td) { + super(new ContainerSeedBag(pli, td, null)); + super.ySize = 167; + } + + public GuiSeedBag(Container cn) { + super(cn); + super.ySize = 167; + } + + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString(I18n.format("item.rpSeedBag.name", new Object[0]), 65, 6, 4210752); + super.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, super.ySize - 94 + 2, 4210752); + } + + protected void drawGuiContainerBackgroundLayer(float f, int p1, int p2) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture(res); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemAthame.java b/src/main/java/com/eloraam/redpower/world/ItemAthame.java new file mode 100644 index 0000000..b369d33 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemAthame.java @@ -0,0 +1,48 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.util.DamageSource; + +public class ItemAthame extends ItemSword { + public ItemAthame() { + super(ToolMaterial.EMERALD); + this.setMaxDamage(100); + this.setTextureName("rpworld:athame"); + this.setCreativeTab(CreativeTabs.tabCombat); + } + + public float func_150893_a(ItemStack stack, Block block) { + return 1.0F; + } + + public boolean hitEntity(ItemStack stack, EntityLivingBase victim, EntityLivingBase hunter) { + stack.damageItem(1, hunter); + if (victim instanceof EntityEnderman || victim instanceof EntityDragon) { + victim.attackEntityFrom(DamageSource.causeMobDamage(hunter), 25.0F); + } + + return true; + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return ist2.isItemEqual(RedPowerBase.itemIngotSilver); + } + + public int getItemEnchantability() { + return 30; + } + + public Multimap getAttributeModifiers(ItemStack stack) { + return HashMultimap.create(); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomAxe.java b/src/main/java/com/eloraam/redpower/world/ItemCustomAxe.java new file mode 100644 index 0000000..3130e49 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomAxe.java @@ -0,0 +1,20 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.item.ItemAxe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; + +public class ItemCustomAxe extends ItemAxe { + public ItemCustomAxe(ToolMaterial mat) { + super(mat); + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return super.toolMaterial == RedPowerWorld.toolMaterialRuby && ist2.isItemEqual(RedPowerBase.itemRuby) + || super.toolMaterial == RedPowerWorld.toolMaterialSapphire && ist2.isItemEqual(RedPowerBase.itemSapphire) + || super.toolMaterial == RedPowerWorld.toolMaterialGreenSapphire && ist2.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(ist1, ist2); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomFlower.java b/src/main/java/com/eloraam/redpower/world/ItemCustomFlower.java new file mode 100644 index 0000000..7c226a7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomFlower.java @@ -0,0 +1,51 @@ +package com.eloraam.redpower.world; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemCustomFlower extends ItemBlock { + private BlockCustomFlower bl; + + public ItemCustomFlower(Block block) { + super((BlockCustomFlower)block); + this.bl = (BlockCustomFlower)block; + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setCreativeTab(CreativeTabs.tabDecorations); + } + + public IIcon getIconFromDamage(int damage) { + return this.bl.icons[damage]; + } + + public int getPlacedBlockMetadata(int i) { + return i; + } + + public int getMetadata(int i) { + return i; + } + + public String getUnlocalizedName(ItemStack itemstack) { + switch(itemstack.getItemDamage()) { + case 0: + return "tile.indigo"; + case 1: + return "tile.rubbersapling"; + default: + throw new IndexOutOfBoundsException(); + } + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List itemList) { + this.bl.getSubBlocks(item, tab, itemList); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomHoe.java b/src/main/java/com/eloraam/redpower/world/ItemCustomHoe.java new file mode 100644 index 0000000..66cf7e0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomHoe.java @@ -0,0 +1,20 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.item.ItemHoe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; + +public class ItemCustomHoe extends ItemHoe { + public ItemCustomHoe(ToolMaterial mat) { + super(mat); + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return super.theToolMaterial == RedPowerWorld.toolMaterialRuby && ist2.isItemEqual(RedPowerBase.itemRuby) + || super.theToolMaterial == RedPowerWorld.toolMaterialSapphire && ist2.isItemEqual(RedPowerBase.itemSapphire) + || super.theToolMaterial == RedPowerWorld.toolMaterialGreenSapphire && ist2.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(ist1, ist2); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomOre.java b/src/main/java/com/eloraam/redpower/world/ItemCustomOre.java new file mode 100644 index 0000000..91441f0 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomOre.java @@ -0,0 +1,40 @@ +package com.eloraam.redpower.world; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemCustomOre extends ItemBlock { + public ItemCustomOre(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getMetadata(int i) { + return i; + } + + public String getUnlocalizedName(ItemStack itemstack) { + switch(itemstack.getItemDamage()) { + case 0: + return "tile.oreRuby"; + case 1: + return "tile.oreGreenSapphire"; + case 2: + return "tile.oreSapphire"; + case 3: + return "tile.oreSilver"; + case 4: + return "tile.oreTin"; + case 5: + return "tile.oreCopper"; + case 6: + return "tile.oreTungsten"; + case 7: + return "tile.oreNikolite"; + default: + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomPickaxe.java b/src/main/java/com/eloraam/redpower/world/ItemCustomPickaxe.java new file mode 100644 index 0000000..1a40b0a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomPickaxe.java @@ -0,0 +1,20 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; + +public class ItemCustomPickaxe extends ItemPickaxe { + public ItemCustomPickaxe(ToolMaterial mat) { + super(mat); + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return super.toolMaterial == RedPowerWorld.toolMaterialRuby && ist2.isItemEqual(RedPowerBase.itemRuby) + || super.toolMaterial == RedPowerWorld.toolMaterialSapphire && ist2.isItemEqual(RedPowerBase.itemSapphire) + || super.toolMaterial == RedPowerWorld.toolMaterialGreenSapphire && ist2.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(ist1, ist2); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomSeeds.java b/src/main/java/com/eloraam/redpower/world/ItemCustomSeeds.java new file mode 100644 index 0000000..6dd40b6 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomSeeds.java @@ -0,0 +1,63 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemCustomSeeds extends Item implements IPlantable { + public ItemCustomSeeds() { + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.setCreativeTab(CreativeTabs.tabMaterials); + this.setUnlocalizedName("seedFlax"); + this.setTextureName("rpworld:seedsFlax"); + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int i, int j, int k, int l, float xp, float yp, float zp) { + if (l != 1) { + return false; + } else { + Block soil = world.getBlock(i, j, k); + if (soil == null) { + return false; + } else if (soil.canSustainPlant(world, i, j, k, ForgeDirection.UP, this) && world.getBlockMetadata(i, j, k) >= 1 && world.isAirBlock(i, j + 1, k)) { + world.setBlock(i, j + 1, k, RedPowerWorld.blockCrops, 0, 3); + --ist.stackSize; + return true; + } else { + return false; + } + } + } + + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i <= 0; ++i) { + list.add(new ItemStack(this, 1, i)); + } + + } + + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { + return EnumPlantType.Crop; + } + + public Block getPlant(IBlockAccess world, int x, int y, int z) { + return RedPowerWorld.blockCrops; + } + + public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { + return 0; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomShovel.java b/src/main/java/com/eloraam/redpower/world/ItemCustomShovel.java new file mode 100644 index 0000000..df1895a --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomShovel.java @@ -0,0 +1,20 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item.ToolMaterial; + +public class ItemCustomShovel extends ItemSpade { + public ItemCustomShovel(ToolMaterial mat) { + super(mat); + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return super.toolMaterial == RedPowerWorld.toolMaterialRuby && ist2.isItemEqual(RedPowerBase.itemRuby) + || super.toolMaterial == RedPowerWorld.toolMaterialSapphire && ist2.isItemEqual(RedPowerBase.itemSapphire) + || super.toolMaterial == RedPowerWorld.toolMaterialGreenSapphire && ist2.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(ist1, ist2); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomStone.java b/src/main/java/com/eloraam/redpower/world/ItemCustomStone.java new file mode 100644 index 0000000..910fe76 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomStone.java @@ -0,0 +1,42 @@ +package com.eloraam.redpower.world; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemCustomStone extends ItemBlock { + public ItemCustomStone(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getPlacedBlockMetadata(int i) { + return i; + } + + public int getMetadata(int i) { + return i; + } + + public String getUnlocalizedName(ItemStack itemstack) { + switch(itemstack.getItemDamage()) { + case 0: + return "tile.marble"; + case 1: + return "tile.basalt"; + case 2: + return "tile.marbleBrick"; + case 3: + return "tile.basaltCobble"; + case 4: + return "tile.basaltBrick"; + case 5: + return "tile.basaltCircle"; + case 6: + return "tile.basaltPaver"; + default: + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemCustomSword.java b/src/main/java/com/eloraam/redpower/world/ItemCustomSword.java new file mode 100644 index 0000000..a8fac4b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemCustomSword.java @@ -0,0 +1,23 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.item.Item.ToolMaterial; + +public class ItemCustomSword extends ItemSword { + protected ToolMaterial toolMaterial2; + + public ItemCustomSword(ToolMaterial mat) { + super(mat); + this.toolMaterial2 = mat; + } + + public boolean getIsRepairable(ItemStack ist1, ItemStack ist2) { + return this.toolMaterial2 == RedPowerWorld.toolMaterialRuby && ist2.isItemEqual(RedPowerBase.itemRuby) + || this.toolMaterial2 == RedPowerWorld.toolMaterialSapphire && ist2.isItemEqual(RedPowerBase.itemSapphire) + || this.toolMaterial2 == RedPowerWorld.toolMaterialGreenSapphire && ist2.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(ist1, ist2); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemPaintBrush.java b/src/main/java/com/eloraam/redpower/world/ItemPaintBrush.java new file mode 100644 index 0000000..29ddd11 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemPaintBrush.java @@ -0,0 +1,53 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.IPaintable; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ItemPaintBrush extends Item { + private int color; + + public ItemPaintBrush(int col) { + this.color = col; + this.setMaxStackSize(1); + this.setMaxDamage(15); + this.setNoRepair(); + this.setCreativeTab(CreativeTabs.tabTools); + this.setTextureName("rpworld:paintBrush/" + col); + } + + private boolean itemUseShared(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side) { + IPaintable ip = CoreLib.getTileEntity(world, x, y, z, IPaintable.class); + if (ip == null) { + return false; + } else { + MovingObjectPosition mop = CoreLib.retraceBlock(world, player, x, y, z); + if (mop == null) { + return false; + } else if (!ip.tryPaint(mop.subHit, mop.sideHit, this.color + 1)) { + return false; + } else { + ist.damageItem(1, player); + if (ist.stackSize == 0) { + player.inventory.setItemStack(new ItemStack(RedPowerWorld.itemBrushDry)); + } + + return true; + } + } + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && !player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } + + public boolean onItemUseFirst(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float xp, float yp, float zp) { + return !world.isRemote && player.isSneaking() && this.itemUseShared(ist, player, world, x, y, z, side); + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemPaintCan.java b/src/main/java/com/eloraam/redpower/world/ItemPaintCan.java new file mode 100644 index 0000000..55641c3 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemPaintCan.java @@ -0,0 +1,36 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.ItemPartialCraft; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ItemPaintCan extends ItemPartialCraft { + int color; + + public ItemPaintCan(int col) { + this.color = col; + this.setMaxDamage(15); + this.setCreativeTab(CreativeTabs.tabTools); + this.setTextureName("rpworld:paintCan/" + col); + } + + public ItemStack onItemRightClick(ItemStack ist, World world, EntityPlayer player) { + for(int n = 0; n < 9; ++n) { + ItemStack isl = player.inventory.getStackInSlot(n); + if (isl != null && isl.getItem() == RedPowerWorld.itemBrushDry && isl.stackSize == 1) { + player.inventory.setInventorySlotContents(n, new ItemStack(RedPowerWorld.itemBrushPaint[this.color])); + ist.damageItem(1, player); + if (ist.stackSize == 0) { + return new ItemStack(RedPowerWorld.itemPaintCanEmpty); + } + + return ist; + } + } + + return ist; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemSeedBag.java b/src/main/java/com/eloraam/redpower/world/ItemSeedBag.java new file mode 100644 index 0000000..7a09709 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemSeedBag.java @@ -0,0 +1,356 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.CoreLib; +import com.eloraam.redpower.core.WorldCoord; +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.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemSeedBag extends Item { + private IIcon emptyIcon; + private IIcon fullIcon; + + public ItemSeedBag() { + this.setMaxDamage(576); + this.setMaxStackSize(1); + this.setUnlocalizedName("rpSeedBag"); + this.setCreativeTab(CreativeTabs.tabMisc); + } + + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return meta > 0 ? this.fullIcon : this.emptyIcon; + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister register) { + this.emptyIcon = register.registerIcon("rpworld:seedBagEmpty"); + this.fullIcon = register.registerIcon("rpworld:seedBagFull"); + } + + public static IInventory getBagInventory(ItemStack ist, EntityPlayer host) { + return !(ist.getItem() instanceof ItemSeedBag) ? null : new ItemSeedBag.InventorySeedBag(ist, host); + } + + public static boolean canAdd(IInventory inv, ItemStack ist) { + if (!(ist.getItem() instanceof IPlantable)) { + return false; + } else { + for(int i = 0; i < inv.getSizeInventory(); ++i) { + ItemStack is2 = inv.getStackInSlot(i); + if (is2 != null && is2.stackSize != 0 && CoreLib.compareItemStack(is2, ist) != 0) { + return false; + } + } + + return true; + } + } + + public static ItemStack getPlant(IInventory inv) { + for(int i = 0; i < inv.getSizeInventory(); ++i) { + ItemStack is2 = inv.getStackInSlot(i); + if (is2 != null && is2.stackSize != 0) { + return is2; + } + } + + return null; + } + + private static void decrPlant(IInventory inv) { + for(int i = 0; i < inv.getSizeInventory(); ++i) { + ItemStack is2 = inv.getStackInSlot(i); + if (is2 != null && is2.stackSize != 0) { + inv.decrStackSize(i, 1); + break; + } + } + + } + + public int getMaxItemUseDuration(ItemStack par1ItemStack) { + return 1; + } + + public ItemStack onItemRightClick(ItemStack ist, World world, EntityPlayer player) { + if (!world.isRemote && player.isSneaking()) { + player.openGui(RedPowerWorld.instance, 1, world, 0, 0, 0); + } + + return ist; + } + + public boolean onItemUse(ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side, float par8, float par9, float par10) { + if (side != 1) { + return false; + } else if (world.isRemote) { + return false; + } else if (player.isSneaking()) { + return false; + } else { + IInventory baginv = getBagInventory(ist, player); + ItemSeedBag.SpiralSearch search = new ItemSeedBag.SpiralSearch(new WorldCoord(x, y, z), 5); + + for(boolean st = false; search.again(); search.step()) { + Block soil = world.getBlock(search.point.x, search.point.y, search.point.z); + if (soil == Blocks.air) { + if (!st) { + break; + } + } else { + ItemStack plantstk = getPlant(baginv); + if (plantstk == null || !(plantstk.getItem() instanceof IPlantable)) { + break; + } + + IPlantable plant = (IPlantable)plantstk.getItem(); + if (soil != Blocks.air && soil.canSustainPlant(world, search.point.x, search.point.y, search.point.z, ForgeDirection.UP, plant)) { + if (!world.isAirBlock(search.point.x, search.point.y + 1, search.point.z)) { + if (!st) { + break; + } + } else { + st = true; + world.setBlock( + search.point.x, + search.point.y + 1, + search.point.z, + plant.getPlant(world, search.point.x, search.point.y + 1, search.point.z), + plant.getPlantMetadata(world, search.point.x, search.point.y + 1, search.point.z), + 3 + ); + if (!player.capabilities.isCreativeMode) { + decrPlant(baginv); + } + } + } else if (!st) { + break; + } + } + } + + return true; + } + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack ist, EntityPlayer player, List lines, boolean par4) { + if (ist.stackTagCompound != null && ist.getItemDamage() != 0) { + IInventory baginv = getBagInventory(ist, player); + + for(int i = 0; i < baginv.getSizeInventory(); ++i) { + ItemStack is2 = baginv.getStackInSlot(i); + if (is2 != null && is2.stackSize != 0) { + lines.add(StatCollector.translateToLocal("item." + is2.getItem().getUnlocalizedName(is2) + ".name")); + return; + } + } + } + + } + + public static class InventorySeedBag implements IInventory { + ItemStack bagitem; + ItemStack[] items; + EntityPlayer player; + + InventorySeedBag(ItemStack ist, EntityPlayer host) { + this.bagitem = ist; + this.player = host; + this.unpackInventory(); + } + + void unpackInventory() { + this.items = new ItemStack[9]; + if (this.bagitem.stackTagCompound != null) { + NBTTagList list = this.bagitem.stackTagCompound.getTagList("contents", 10); + + for(int i = 0; i < list.tagCount(); ++i) { + NBTTagCompound item = list.getCompoundTagAt(i); + byte slt = item.getByte("Slot"); + if (slt < 9) { + this.items[slt] = ItemStack.loadItemStackFromNBT(item); + } + } + } + + } + + private void packInventory() { + if (this.bagitem.stackTagCompound == null) { + this.bagitem.setTagCompound(new NBTTagCompound()); + } + + int itc = 0; + NBTTagList contents = new NBTTagList(); + + for(int i = 0; i < 9; ++i) { + if (this.items[i] != null) { + itc += this.items[i].stackSize; + NBTTagCompound cpd = new NBTTagCompound(); + this.items[i].writeToNBT(cpd); + cpd.setByte("Slot", (byte)i); + contents.appendTag(cpd); + } + } + + this.bagitem.stackTagCompound.setTag("contents", contents); + this.bagitem.setItemDamage(itc == 0 ? 0 : 577 - itc); + } + + public int getSizeInventory() { + return 9; + } + + public ItemStack getStackInSlot(int slot) { + return this.items[slot]; + } + + public ItemStack decrStackSize(int slot, int num) { + if (this.bagitem != this.player.getHeldItem()) { + this.markDirty(); + this.player.closeScreen(); + return null; + } else if (this.items[slot] == null) { + return null; + } else if (this.items[slot].stackSize <= num) { + ItemStack tr = this.items[slot]; + this.items[slot] = null; + this.markDirty(); + return tr; + } else { + ItemStack tr = this.items[slot].splitStack(num); + if (this.items[slot].stackSize == 0) { + this.items[slot] = null; + } + + this.markDirty(); + return tr; + } + } + + public ItemStack getStackInSlotOnClosing(int slot) { + if (this.items[slot] == null) { + return null; + } else { + ItemStack tr = this.items[slot]; + this.items[slot] = null; + return tr; + } + } + + public void setInventorySlotContents(int slot, ItemStack ist) { + if (this.bagitem != this.player.getHeldItem()) { + this.markDirty(); + this.player.closeScreen(); + } else { + this.items[slot] = ist; + if (ist != null && ist.stackSize > this.getInventoryStackLimit()) { + ist.stackSize = this.getInventoryStackLimit(); + } + + this.markDirty(); + } + } + + public String getInventoryName() { + return "item.rpSeedBag.name"; + } + + public int getInventoryStackLimit() { + return 64; + } + + public void markDirty() { + this.packInventory(); + } + + public boolean isUseableByPlayer(EntityPlayer pl) { + return true; + } + + public void openInventory() { + } + + public void closeInventory() { + } + + public boolean hasCustomInventoryName() { + return true; + } + + public boolean isItemValidForSlot(int slotID, ItemStack itemStack) { + return false; + } + } + + public static class SpiralSearch { + int curs; + int rem; + int ln; + int steps; + public WorldCoord point; + + public SpiralSearch(WorldCoord start, int size) { + this.point = start; + this.curs = 0; + this.rem = 1; + this.ln = 1; + this.steps = size * size; + } + + public boolean again() { + return this.steps > 0; + } + + public boolean step() { + if (--this.steps == 0) { + return false; + } else { + --this.rem; + switch(this.curs) { + case 0: + this.point.step(2); + break; + case 1: + this.point.step(4); + break; + case 2: + this.point.step(3); + break; + default: + this.point.step(5); + } + + if (this.rem > 0) { + return true; + } else { + this.curs = this.curs + 1 & 3; + this.rem = this.ln; + if ((this.curs & 1) > 0) { + ++this.ln; + } + + return true; + } + } + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemSickle.java b/src/main/java/com/eloraam/redpower/world/ItemSickle.java new file mode 100644 index 0000000..6b53657 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemSickle.java @@ -0,0 +1,95 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerBase; +import com.eloraam.redpower.RedPowerWorld; +import java.util.HashSet; +import net.minecraft.block.Block; +import net.minecraft.block.BlockBush; +import net.minecraft.block.BlockLeavesBase; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.BlockEvent.BreakEvent; + +public class ItemSickle extends ItemTool { + public int cropRadius = 2; + public int leafRadius = 1; + + public ItemSickle(ToolMaterial mat) { + super(3.0F, mat, new HashSet()); + this.setMaxStackSize(1); + } + + public float func_150893_a(ItemStack ist, Block bl) { + return !(bl instanceof BlockLeavesBase) && !(bl instanceof BlockBush) ? super.func_150893_a(ist, bl) : super.efficiencyOnProperMaterial; + } + + public boolean onBlockDestroyed(ItemStack ist, World world, Block block, int x, int y, int z, EntityLivingBase entity) { + boolean used = false; + if (!(entity instanceof EntityPlayer)) { + return false; + } else { + EntityPlayer player = (EntityPlayer)entity; + if (block != null && block instanceof BlockLeavesBase) { + for(int q = -this.leafRadius; q <= this.leafRadius; ++q) { + for(int r = -this.leafRadius; r <= this.leafRadius; ++r) { + for(int s = -this.leafRadius; s <= this.leafRadius; ++s) { + Block bl = world.getBlock(x + q, y + r, z + s); + int md = world.getBlockMetadata(x + q, y + r, z + s); + if (bl != null && bl instanceof BlockLeavesBase) { + BreakEvent event = new BreakEvent(x + q, y + r, z + s, world, bl, md, player); + if (!MinecraftForge.EVENT_BUS.post(event)) { + if (bl.canHarvestBlock(player, md)) { + bl.harvestBlock(world, player, x + q, y + r, z + s, md); + } + + world.setBlockToAir(x + q, y + r, z + s); + used = true; + } + } + } + } + } + } else if (block != null && block instanceof BlockBush) { + for(int q = -this.cropRadius; q <= this.cropRadius; ++q) { + for(int r = -this.cropRadius; r <= this.cropRadius; ++r) { + Block bl = world.getBlock(x + q, y, z + r); + int md = world.getBlockMetadata(x + q, y, z + r); + if (bl != null && bl instanceof BlockBush) { + BreakEvent event = new BreakEvent(x + q, y, z + r, world, bl, md, player); + if (!MinecraftForge.EVENT_BUS.post(event)) { + if (bl.canHarvestBlock(player, md)) { + bl.harvestBlock(world, player, x + q, y, z + r, md); + } + + world.setBlockToAir(x + q, y, z + r); + used = true; + } + } + } + } + } + + if (used) { + ist.damageItem(1, entity); + } + + return used; + } + } + + public boolean getIsRepairable(ItemStack self, ItemStack repairMaterial) { + return super.toolMaterial == RedPowerWorld.toolMaterialRuby && repairMaterial.isItemEqual(RedPowerBase.itemRuby) + || super.toolMaterial == RedPowerWorld.toolMaterialSapphire && repairMaterial.isItemEqual(RedPowerBase.itemSapphire) + || super.toolMaterial == RedPowerWorld.toolMaterialGreenSapphire && repairMaterial.isItemEqual(RedPowerBase.itemGreenSapphire) + || super.getIsRepairable(self, repairMaterial); + } + + public int getItemEnchantability() { + return 20; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemStorage.java b/src/main/java/com/eloraam/redpower/world/ItemStorage.java new file mode 100644 index 0000000..92c2ce7 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemStorage.java @@ -0,0 +1,44 @@ +package com.eloraam.redpower.world; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemStorage extends ItemBlock { + public ItemStorage(Block block) { + super(block); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + public int getPlacedBlockMetadata(int meta) { + return meta; + } + + public int getMetadata(int meta) { + return meta; + } + + public String getUnlocalizedName(ItemStack itemstack) { + switch(itemstack.getItemDamage()) { + case 0: + return "tile.blockRuby"; + case 1: + return "tile.blockGreenSapphire"; + case 2: + return "tile.blockSapphire"; + case 3: + return "tile.blockSilver"; + case 4: + return "tile.blockTin"; + case 5: + return "tile.blockCopper"; + case 6: + return "tile.blockTungsten"; + case 7: + return "tile.blockNikolite"; + default: + throw new IndexOutOfBoundsException(); + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/ItemWoolCard.java b/src/main/java/com/eloraam/redpower/world/ItemWoolCard.java new file mode 100644 index 0000000..93447a8 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/ItemWoolCard.java @@ -0,0 +1,21 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.core.ItemPartialCraft; +import net.minecraft.creativetab.CreativeTabs; + +public class ItemWoolCard extends ItemPartialCraft { + public ItemWoolCard() { + this.setUnlocalizedName("woolcard"); + this.setTextureName("rpworld:woolCard"); + this.setMaxDamage(63); + this.setCreativeTab(CreativeTabs.tabTools); + } + + public boolean isFull3D() { + return true; + } + + public boolean shouldRotateAroundWhenRendering() { + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldEvents.java b/src/main/java/com/eloraam/redpower/world/WorldEvents.java new file mode 100644 index 0000000..c55ff68 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldEvents.java @@ -0,0 +1,95 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.MachineLib; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.eventhandler.Event.Result; +import java.util.stream.IntStream; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EntityDamageSource; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.player.BonemealEvent; +import net.minecraftforge.event.entity.player.EntityItemPickupEvent; + +public class WorldEvents { + @SubscribeEvent + public void onBonemeal(BonemealEvent ev) { + if (ev.block == RedPowerWorld.blockCrops) { + int md = ev.world.getBlockMetadata(ev.x, ev.y, ev.z); + if (md == 4 || md == 5) { + return; + } + + if (ev.world.isRemote) { + ev.setResult(Result.ALLOW); + return; + } + + if (RedPowerWorld.blockCrops.fertilize(ev.world, ev.x, ev.y, ev.z)) { + ev.setResult(Result.ALLOW); + } + } + + } + + @SubscribeEvent + public void onDeath(LivingDeathEvent ev) { + if (ev.source instanceof EntityDamageSource) { + EntityDamageSource eds = (EntityDamageSource)ev.source; + Entity ent = eds.getEntity(); + if (ent instanceof EntityPlayer) { + EntityPlayer epl = (EntityPlayer)ent; + ItemStack wpn = epl.getCurrentEquippedItem(); + if (EnchantmentHelper.getEnchantmentLevel(RedPowerWorld.enchantVorpal.effectId, wpn) != 0 && ev.entityLiving.getHealth() <= -20.0F) { + if (ev.entityLiving instanceof EntitySkeleton) { + EntitySkeleton ist = (EntitySkeleton)ev.entityLiving; + if (ist.getSkeletonType() == 1) { + return; + } + + ev.entityLiving.entityDropItem(new ItemStack(Items.skull, 1, 0), 0.0F); + } else if (ev.entityLiving instanceof EntityZombie) { + ev.entityLiving.entityDropItem(new ItemStack(Items.skull, 1, 2), 0.0F); + } else if (ev.entityLiving instanceof EntityPlayer) { + ItemStack ist1 = new ItemStack(Items.skull, 1, 3); + ist1.setTagCompound(new NBTTagCompound()); + ist1.getTagCompound().setString("SkullOwner", ev.entityLiving.getCommandSenderName()); + ev.entityLiving.entityDropItem(ist1, 0.0F); + } else if (ev.entityLiving instanceof EntityCreeper) { + ev.entityLiving.entityDropItem(new ItemStack(Items.skull, 1, 4), 0.0F); + } + } + } + } + + } + + @SubscribeEvent + public void onPickupItem(EntityItemPickupEvent ev) { + for(int i = 0; i < 9; ++i) { + ItemStack ist = ev.entityPlayer.inventory.getStackInSlot(i); + if (ist != null && ist.getItem() instanceof ItemSeedBag) { + IInventory inv = ItemSeedBag.getBagInventory(ist, ev.entityPlayer); + if (inv != null && ItemSeedBag.getPlant(inv) != null) { + ItemStack tpi = ev.item.getEntityItem(); + int[] slots = IntStream.range(0, inv.getSizeInventory()).toArray(); + if (ItemSeedBag.canAdd(inv, tpi) && MachineLib.addToInventoryCore(inv, tpi, slots, true)) { + ev.item.setDead(); + ev.setResult(Result.ALLOW); + return; + } + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldGenCustomOre.java b/src/main/java/com/eloraam/redpower/world/WorldGenCustomOre.java new file mode 100644 index 0000000..fc8297b --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldGenCustomOre.java @@ -0,0 +1,71 @@ +package com.eloraam.redpower.world; + +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenerator; + +public class WorldGenCustomOre extends WorldGenerator { + protected Block minableBlock; + protected int minableBlockMeta; + protected int numberOfBlocks; + + public WorldGenCustomOre(Block block, int meta, int num) { + this.minableBlock = block; + this.minableBlockMeta = meta; + this.numberOfBlocks = num; + } + + public void tryGenerateBlock(World world, Random random, int i, int j, int k) { + if (world.getBlock(i, j, k) == Blocks.stone) { + world.setBlock(i, j, k, this.minableBlock, this.minableBlockMeta, 3); + } + + } + + public boolean generate(World world, Random random, int i, int j, int k) { + float f = random.nextFloat() * 3.141593F; + double d = (double)((float)(i + 8) + MathHelper.sin(f) * (float)this.numberOfBlocks / 8.0F); + double d1 = (double)((float)(i + 8) - MathHelper.sin(f) * (float)this.numberOfBlocks / 8.0F); + double d2 = (double)((float)(k + 8) + MathHelper.cos(f) * (float)this.numberOfBlocks / 8.0F); + double d3 = (double)((float)(k + 8) - MathHelper.cos(f) * (float)this.numberOfBlocks / 8.0F); + double d4 = (double)(j + random.nextInt(3) + 2); + double d5 = (double)(j + random.nextInt(3) + 2); + + for(int l = 0; l <= this.numberOfBlocks; ++l) { + double d6 = d + (d1 - d) * (double)l / (double)this.numberOfBlocks; + double d7 = d4 + (d5 - d4) * (double)l / (double)this.numberOfBlocks; + double d8 = d2 + (d3 - d2) * (double)l / (double)this.numberOfBlocks; + double d9 = random.nextDouble() * (double)this.numberOfBlocks / 16.0; + double d10 = (double)(MathHelper.sin((float)l * 3.141593F / (float)this.numberOfBlocks) + 1.0F) * d9 + 1.0; + double d11 = (double)(MathHelper.sin((float)l * 3.141593F / (float)this.numberOfBlocks) + 1.0F) * d9 + 1.0; + int i1 = MathHelper.floor_double(d6 - d10 / 2.0); + int j1 = MathHelper.floor_double(d7 - d11 / 2.0); + int k1 = MathHelper.floor_double(d8 - d10 / 2.0); + int l1 = MathHelper.floor_double(d6 + d10 / 2.0); + int i2 = MathHelper.floor_double(d7 + d11 / 2.0); + int j2 = MathHelper.floor_double(d8 + d10 / 2.0); + + for(int k2 = i1; k2 <= l1; ++k2) { + double d12 = ((double)k2 + 0.5 - d6) / (d10 / 2.0); + if (d12 * d12 < 1.0) { + for(int l2 = j1; l2 <= i2; ++l2) { + double d13 = ((double)l2 + 0.5 - d7) / (d11 / 2.0); + if (d12 * d12 + d13 * d13 < 1.0) { + for(int i3 = k1; i3 <= j2; ++i3) { + double d14 = ((double)i3 + 0.5 - d8) / (d10 / 2.0); + if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0) { + this.tryGenerateBlock(world, random, k2, l2, i3); + } + } + } + } + } + } + } + + return true; + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldGenHandler.java b/src/main/java/com/eloraam/redpower/world/WorldGenHandler.java new file mode 100644 index 0000000..68cd5ea --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldGenHandler.java @@ -0,0 +1,131 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.Config; +import cpw.mods.fml.common.IWorldGenerator; +import java.util.Random; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.feature.WorldGenFlowers; +import net.minecraftforge.common.BiomeDictionary; +import net.minecraftforge.common.BiomeDictionary.Type; + +public class WorldGenHandler implements IWorldGenerator { + public void generate(Random rin, int chunkX, int chunkZ, World world, IChunkProvider generator, IChunkProvider provider) { + BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(chunkX * 16 + 16, chunkZ * 16 + 16); + Random rand = new Random((long)(chunkX * 31 + chunkZ)); + if (!BiomeDictionary.isBiomeOfType(biome, Type.NETHER) && !BiomeDictionary.isBiomeOfType(biome, Type.END)) { + for(int a = 0; a < 2; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(48); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 0, 7).generate(world, rand, vc, bgb, n); + } + + for(int a = 0; a < 2; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(48); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 1, 7).generate(world, rand, vc, bgb, n); + } + + for(int a = 0; a < 2; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(48); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 2, 7).generate(world, rand, vc, bgb, n); + } + + if (Config.getInt("settings.world.generate.silver", 1) > 0) { + for(int a = 0; a < 4; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(32); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 3, 8).generate(world, rand, vc, bgb, n); + } + } + + if (Config.getInt("settings.world.generate.tin", 1) > 0) { + for(int a = 0; a < 10; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(48); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 4, 8).generate(world, rand, vc, bgb, n); + } + } + + if (Config.getInt("settings.world.generate.copper", 1) > 0) { + for(int a = 0; a < 20; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(64); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 5, 8).generate(world, rand, vc, bgb, n); + } + } + + for(int a = 0; a < 1; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(16); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 6, 4).generate(world, rand, vc, bgb, n); + } + + for(int a = 0; a < 4; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = rand.nextInt(16); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenCustomOre(RedPowerWorld.blockOres, 7, 10).generate(world, rand, vc, bgb, n); + } + + if (Config.getInt("settings.world.generate.marble", 1) > 0) { + for(int a = 0; a < 4; ++a) { + int vc = chunkX * 16 + rand.nextInt(16); + int bgb = 32 + rand.nextInt(32); + int n = chunkZ * 16 + rand.nextInt(16); + new WorldGenMarble(RedPowerWorld.blockStone, 0, rand.nextInt(4096)).generate(world, rand, vc, bgb, n); + } + } + + if (Config.getInt("settings.world.generate.volcano", 1) > 0 && rand.nextFloat() <= 0.04F) { + int vc = Math.max(1, rand.nextInt(10) - 6); + vc *= vc; + + for(int a = 0; a < vc; ++a) { + int bgb = chunkX * 16 + rand.nextInt(16); + int n = rand.nextInt(32); + int x = chunkZ * 16 + rand.nextInt(16); + if (new WorldGenVolcano(RedPowerWorld.blockStone, 1, rand.nextInt(65536)).generate(world, rand, bgb, n, x)) { + break; + } + } + } + + byte ampl = 0; + if (BiomeDictionary.isBiomeOfType(biome, Type.JUNGLE)) { + ampl = 1; + } else if (BiomeDictionary.isBiomeOfType(biome, Type.FOREST)) { + ampl = 1; + } else if (BiomeDictionary.isBiomeOfType(biome, Type.PLAINS)) { + ampl = 4; + } + + for(int a = 0; a < ampl; ++a) { + int x = chunkX * 16 + rand.nextInt(16) + 8; + int z = rand.nextInt(128); + int y = chunkZ * 16 + rand.nextInt(16) + 8; + new WorldGenFlowers(RedPowerWorld.blockPlants).generate(world, rand, x, z, y); + } + + if (BiomeDictionary.isBiomeOfType(biome, Type.JUNGLE)) { + for(int a = 0; a < 6; ++a) { + int x = chunkX * 16 + rand.nextInt(16) + 8; + int z = chunkZ * 16 + rand.nextInt(16) + 8; + int y = world.getHeightValue(x, z); + new WorldGenRubberTree().generate(world, world.rand, x, y, z); + } + } + } + + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldGenMarble.java b/src/main/java/com/eloraam/redpower/world/WorldGenMarble.java new file mode 100644 index 0000000..3566a88 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldGenMarble.java @@ -0,0 +1,117 @@ +package com.eloraam.redpower.world; + +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Random; +import java.util.Set; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; + +public class WorldGenMarble extends WorldGenCustomOre { + private Deque fillStack = new LinkedList(); + private Set fillStackTest = new HashSet(); + + public WorldGenMarble(Block block, int meta, int num) { + super(block, meta, num); + } + + private void addBlock(int x, int y, int z, int p) { + ChunkCoordinates sb = new ChunkCoordinates(x, y, z); + if (!this.fillStackTest.contains(sb)) { + this.fillStack.addLast(new WorldGenMarble.CoordSearchPath(x, y, z, p)); + this.fillStackTest.add(sb); + } + + } + + private void searchBlock(World world, int x, int y, int z, int p) { + if (world.isAirBlock(x - 1, y, z) + || world.isAirBlock(x + 1, y, z) + || world.isAirBlock(x, y - 1, z) + || world.isAirBlock(x, y + 1, z) + || world.isAirBlock(x, y, z - 1) + || world.isAirBlock(x, y, z + 1)) { + p = 6; + } + + this.addBlock(x - 1, y, z, p); + this.addBlock(x + 1, y, z, p); + this.addBlock(x, y - 1, z, p); + this.addBlock(x, y + 1, z, p); + this.addBlock(x, y, z - 1, p); + this.addBlock(x, y, z + 1, p); + } + + @Override + public boolean generate(World world, Random random, int x, int y, int z) { + if (!world.isAirBlock(x, y, z)) { + return false; + } else { + int l; + for(l = y; world.getBlock(x, l, z) != Blocks.stone; ++l) { + if (l > 96) { + return false; + } + } + + this.addBlock(x, l, z, 6); + + while(this.fillStack.size() > 0 && super.numberOfBlocks > 0) { + WorldGenMarble.CoordSearchPath sp = (WorldGenMarble.CoordSearchPath)this.fillStack.removeFirst(); + if (world.getBlock(sp.x, sp.y, sp.z) == Blocks.stone) { + world.setBlock(sp.x, sp.y, sp.z, super.minableBlock, super.minableBlockMeta, 3); + if (sp.p > 0) { + this.searchBlock(world, sp.x, sp.y, sp.z, sp.p - 1); + } + + --super.numberOfBlocks; + } + } + + return true; + } + } + + public static class CoordSearchPath { + private final int x; + private final int y; + private final int z; + private final int p; + + public CoordSearchPath(int x, int y, int z, int p) { + this.x = x; + this.y = y; + this.z = z; + this.p = p; + } + + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (o != null && this.getClass() == o.getClass()) { + WorldGenMarble.CoordSearchPath that = (WorldGenMarble.CoordSearchPath)o; + if (this.x != that.x) { + return false; + } else if (this.y != that.y) { + return false; + } else if (this.z != that.z) { + return false; + } else { + return this.p == that.p; + } + } else { + return false; + } + } + + public int hashCode() { + int result = this.x; + result = 31 * result + this.y; + result = 31 * result + this.z; + return 31 * result + this.p; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldGenRubberTree.java b/src/main/java/com/eloraam/redpower/world/WorldGenRubberTree.java new file mode 100644 index 0000000..e14aa3d --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldGenRubberTree.java @@ -0,0 +1,168 @@ +package com.eloraam.redpower.world; + +import com.eloraam.redpower.RedPowerWorld; +import com.eloraam.redpower.core.FractalLib; +import com.eloraam.redpower.core.Vector3; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenerator; + +public class WorldGenRubberTree extends WorldGenerator { + public void putLeaves(World world, int x, int y, int z) { + if (world.isAirBlock(x, y, z)) { + world.setBlock(x, y, z, RedPowerWorld.blockLeaves, 0, 3); + } + + } + + public boolean fillBlock(World world, int x, int y, int z) { + if (y >= 0 && y <= 126) { + Block bl = world.getBlock(x, y, z); + if (bl != null && bl.isWood(world, x, y, z)) { + return true; + } else if (bl != Blocks.air && bl != null && !bl.isLeaves(world, x, y, z) && bl != Blocks.tallgrass && bl != Blocks.grass && bl != Blocks.vine) { + return false; + } else { + world.setBlock(x, y, z, RedPowerWorld.blockLogs, 0, 3); + this.putLeaves(world, x, y - 1, z); + this.putLeaves(world, x, y + 1, z); + this.putLeaves(world, x, y, z - 1); + this.putLeaves(world, x, y, z + 1); + this.putLeaves(world, x - 1, y, z); + this.putLeaves(world, x + 1, y, z); + return true; + } + } else { + return false; + } + } + + public boolean generate(World world, Random random, int xPos, int yPos, int zPos) { + int trh = random.nextInt(6) + 25; + if (yPos >= 1 && yPos + trh + 2 <= world.getHeight()) { + for(int x = -1; x <= 1; ++x) { + for(int z = -1; z <= 1; ++z) { + Block bid = world.getBlock(xPos + x, yPos - 1, zPos + z); + if (bid != Blocks.grass && bid != Blocks.dirt) { + return false; + } + } + } + + byte rw = 1; + + for(int org = yPos; org < yPos + trh; ++org) { + if (org > yPos + 3) { + rw = 5; + } + + for(int x = xPos - rw; x <= xPos + rw; ++x) { + for(int z = zPos - rw; z <= zPos + rw; ++z) { + Block dest = world.getBlock(x, org, z); + if (dest != Blocks.air + && dest != null + && !dest.isLeaves(world, x, org, z) + && !dest.isWood(world, x, org, z) + && dest != Blocks.tallgrass + && dest != Blocks.grass + && dest != Blocks.vine) { + return false; + } + } + } + } + + for(int x = -1; x <= 1; ++x) { + for(int z = -1; z <= 1; ++z) { + world.setBlock(xPos + x, yPos - 1, zPos + z, Blocks.dirt); + } + } + + for(int var21 = 0; var21 <= 6; ++var21) { + for(int x = -1; x <= 1; ++x) { + for(int z = -1; z <= 1; ++z) { + world.setBlock(xPos + x, yPos + var21, zPos + z, RedPowerWorld.blockLogs, 1, 3); + } + } + + for(int x = -1; x <= 1; ++x) { + if (random.nextInt(5) == 1 && world.isAirBlock(xPos + x, yPos + var21, zPos - 2)) { + world.setBlock(xPos + x, yPos + var21, zPos - 2, Blocks.vine, 1, 3); + } + + if (random.nextInt(5) == 1 && world.isAirBlock(xPos + x, yPos + var21, zPos + 2)) { + world.setBlock(xPos + x, yPos + var21, zPos + 2, Blocks.vine, 4, 3); + } + } + + for(int z = -1; z <= 1; ++z) { + if (random.nextInt(5) == 1 && world.isAirBlock(xPos - 2, yPos + var21, zPos + z)) { + world.setBlock(xPos - 2, yPos + var21, zPos + z, Blocks.vine, 8, 3); + } + + if (random.nextInt(5) == 1 && world.isAirBlock(xPos + 2, yPos + var21, zPos + z)) { + world.setBlock(xPos + 2, yPos + var21, zPos + z, Blocks.vine, 2, 3); + } + } + } + + Vector3 var23 = new Vector3(); + Vector3 var24 = new Vector3(); + int nbr = random.nextInt(100) + 10; + + for(int br = 0; br < nbr; ++br) { + var24.set((double)random.nextFloat() - 0.5, (double)random.nextFloat(), (double)random.nextFloat() - 0.5); + var24.normalize(); + double m = ((double)nbr / 10.0 + 4.0) * (double)(1.0F + 1.0F * random.nextFloat()); + var24.x *= m; + var24.z *= m; + var24.y = var24.y * (double)(trh - 15) + (double)nbr / 10.0; + if (nbr < 8) { + switch(nbr - 1) { + case 0: + var23.set((double)(xPos - 1), (double)(yPos + 6), (double)(zPos - 1)); + break; + case 1: + var23.set((double)(xPos - 1), (double)(yPos + 6), (double)zPos); + break; + case 2: + var23.set((double)(xPos - 1), (double)(yPos + 6), (double)(zPos + 1)); + break; + case 3: + var23.set((double)xPos, (double)(yPos + 6), (double)(zPos + 1)); + break; + case 4: + var23.set((double)(xPos + 1), (double)(yPos + 6), (double)(zPos + 1)); + break; + case 5: + var23.set((double)(xPos + 1), (double)(yPos + 6), (double)zPos); + break; + case 6: + var23.set((double)(xPos + 1), (double)(yPos + 6), (double)(zPos - 1)); + break; + default: + var23.set((double)xPos, (double)(yPos + 6), (double)(zPos - 1)); + } + } else { + var23.set((double)(xPos + random.nextInt(3) - 1), (double)(yPos + 6), (double)(zPos + random.nextInt(3) - 1)); + } + + long brseed = random.nextLong(); + FractalLib.BlockSnake bsn = new FractalLib.BlockSnake(var23, var24, brseed); + + while(bsn.iterate()) { + Vector3 v = bsn.get(); + if (!this.fillBlock(world, (int)Math.floor(v.x), (int)Math.floor(v.y), (int)Math.floor(v.z))) { + break; + } + } + } + + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/com/eloraam/redpower/world/WorldGenVolcano.java b/src/main/java/com/eloraam/redpower/world/WorldGenVolcano.java new file mode 100644 index 0000000..b7c0953 --- /dev/null +++ b/src/main/java/com/eloraam/redpower/world/WorldGenVolcano.java @@ -0,0 +1,141 @@ +package com.eloraam.redpower.world; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.BlockBush; +import net.minecraft.block.BlockLeavesBase; +import net.minecraft.block.BlockLog; +import net.minecraft.block.BlockVine; +import net.minecraft.init.Blocks; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; + +public class WorldGenVolcano extends WorldGenCustomOre { + private LinkedList fillStack = new LinkedList(); + private Map fillStackTest = new HashMap(); + + public WorldGenVolcano(Block block, int meta, int num) { + super(block, meta, num); + } + + private void addBlock(int x, int y, int z, int p) { + if (p > 0) { + ChunkCoordIntPair sb = new ChunkCoordIntPair(x, z); + Integer o = (Integer)this.fillStackTest.get(sb); + if (o == null || p > o) { + this.fillStack.addLast(new ChunkCoordinates(x, y, z)); + this.fillStackTest.put(sb, p); + } + } + + } + + private void searchBlock(int x, int y, int z, int p, Random random) { + int rp = random.nextInt(16); + this.addBlock(x - 1, y, z, (rp & 1) > 0 ? p - 1 : p); + this.addBlock(x + 1, y, z, (rp & 2) > 0 ? p - 1 : p); + this.addBlock(x, y, z - 1, (rp & 4) > 0 ? p - 1 : p); + this.addBlock(x, y, z + 1, (rp & 8) > 0 ? p - 1 : p); + } + + public boolean canReplace(World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + return block == Blocks.air + || block == Blocks.flowing_water + || block == Blocks.water + || block instanceof BlockLog + || block instanceof BlockLeavesBase + || block instanceof BlockVine + || block instanceof BlockBush + || block == Blocks.snow + || block == Blocks.snow_layer + || block == Blocks.ice + || block == Blocks.packed_ice; + } + + public void eatTree(World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + if (block == Blocks.snow) { + world.setBlockToAir(x, y, z); + } else if (block instanceof BlockLog || block instanceof BlockLeavesBase || block instanceof BlockVine) { + world.setBlockToAir(x, y, z); + this.eatTree(world, x, y + 1, z); + } + + } + + @Override + public boolean generate(World world, Random random, int x, int y, int z) { + if (world.getBlock(x, y, z) != Blocks.lava) { + return false; + } else { + int swh = world.getHeightValue(x, z); + + while(swh > 0 && this.canReplace(world, x, swh - 1, z)) { + --swh; + } + + int yTop; + for(yTop = y; yTop < swh; ++yTop) { + world.setBlock(x, yTop, z, Blocks.flowing_lava); + world.setBlock(x - 1, yTop, z, super.minableBlock, super.minableBlockMeta, 2); + world.setBlock(x + 1, yTop, z, super.minableBlock, super.minableBlockMeta, 2); + world.setBlock(x, yTop, z - 1, super.minableBlock, super.minableBlockMeta, 2); + world.setBlock(x, yTop, z + 1, super.minableBlock, super.minableBlockMeta, 2); + } + + int head = 3 + random.nextInt(4); + int spread = random.nextInt(3); + + label67: + while(super.numberOfBlocks > 0) { + while(this.fillStack.size() == 0) { + world.setBlock(x, yTop, z, Blocks.lava); + this.fillStackTest.clear(); + this.searchBlock(x, yTop, z, head, random); + if (++yTop > 125) { + break label67; + } + } + + ChunkCoordinates sp = (ChunkCoordinates)this.fillStack.removeFirst(); + if (!world.getChunkFromBlockCoords(sp.posX, sp.posZ).isEmpty()) { + int pow = this.fillStackTest.get(new ChunkCoordIntPair(sp.posX, sp.posZ)); + int hm = world.getHeightValue(sp.posX, sp.posZ) + 1; + + while(hm > 0 && this.canReplace(world, sp.posX, hm - 1, sp.posZ)) { + --hm; + } + + if (hm <= sp.posY && this.canReplace(world, sp.posX, hm, sp.posZ)) { + this.eatTree(world, sp.posX, hm, sp.posZ); + world.setBlock(sp.posX, hm, sp.posZ, super.minableBlock, super.minableBlockMeta, 2); + if (sp.posY > hm) { + pow = Math.max(pow, spread); + } + + this.searchBlock(sp.posX, hm, sp.posZ, pow, random); + --super.numberOfBlocks; + } + } + } + + world.setBlock(x, yTop, z, Blocks.lava, 0, 2); + + while(yTop > swh && world.getBlock(x, yTop, z) == Blocks.lava) { + world.markBlockForUpdate(x, yTop, z); + world.notifyBlocksOfNeighborChange(x, yTop, z, Blocks.lava); + world.scheduledUpdatesAreImmediate = true; + Blocks.lava.updateTick(world, x, yTop, z, random); + world.scheduledUpdatesAreImmediate = false; + --yTop; + } + + return true; + } + } +} diff --git a/src/main/resources/assets/rpbase/lang/en_US.lang b/src/main/resources/assets/rpbase/lang/en_US.lang new file mode 100644 index 0000000..ea9997b --- /dev/null +++ b/src/main/resources/assets/rpbase/lang/en_US.lang @@ -0,0 +1,147 @@ +achievement.rpAdvBench.desc=Construct a project table +achievement.rpAdvBench=Civilized Crafting +achievement.rpIngotBrass.desc=Smelt a brass ingot +achievement.rpIngotBrass=Brass Monkey +achievement.rpMakeAlloy.desc=Build an alloy furnace +achievement.rpMakeAlloy=Mixed Metal Surprise + +tile.marble.name=Marble +tile.marbleBrick.name=Marble Brick +tile.oreCopper.name=Copper Ore +tile.oreGreenSapphire.name=Green Sapphire Ore +tile.oreNikolite.name=Nikolite Ore +tile.oreRuby.name=Ruby Ore +tile.oreSapphire.name=Sapphire Ore +tile.oreSilver.name=Silver Ore +tile.oreTin.name=Tin Ore +tile.oreTungsten.name=Tungsten Ore +tile.basalt.name=Basalt +tile.basaltBrick.name=Basalt Brick +tile.basaltCircle.name=Chiseled Basalt Brick +tile.basaltCobble.name=Basalt Cobblestone +tile.basaltPaver.name=Basalt Paver +tile.blockCopper.name=Copper Block +tile.blockGreenSapphire.name=Green Sapphire Block +tile.blockRuby.name=Ruby Block +tile.blockSapphire.name=Sapphire Block +tile.blockSilver.name=Silver Block +tile.blockTin.name=Tin Block +tile.blockTungsten.name=Tungsten Block +tile.blockNikolite.name=Nikolite Block + +tile.rpabench.name=Project Table +tile.rpafurnace.name=Alloy Furnace + +tile.indigo.name=Indigo Flower +tile.rubbersapling.name=Rubber Sapling +tile.rpleaves.name=Leaves +tile.rplog.name=Rubberwood + +item.seedFlax.name=Flax Seeds +item.dyeIndigo.name=Indigo Dye + +item.ruby.name=Ruby +item.sapphire.name=Sapphire +item.greenSapphire.name=Green Sapphire +item.nikolite.name=Nikolite +item.nuggetCopper.name=Copper Nugget +item.nuggetIron.name=Iron Nugget +item.nuggetSilver.name=Silver Nugget +item.nuggetTin.name=Tin Nugget +item.nuggetTungsten.name=Tungsten Nugget +item.ingotBlue.name=Blue Alloy Ingot +item.ingotBrass.name=Brass Ingot +item.ingotCopper.name=Copper Ingot +item.ingotRed.name=Red Alloy Ingot +item.ingotSilver.name=Silver Ingot +item.ingotTin.name=Tin Ingot +item.ingotTungsten.name=Tungsten Ingot +item.dustTungsten.name=Tungsten Dust +item.dustSilver.name=Silver Dust + +item.tinplate.name=Tinplate +item.rpcanvas.name=Canvas +item.planBlank.name=Blank Plan +item.rpBag.name=Canvas Bag +item.rpSeedBag.name=Seed Bag +item.screwdriver.name=Screwdriver + +item.rplumar.black.name=Black Lumar +item.rplumar.blue.name=Blue Lumar +item.rplumar.brown.name=Brown Lumar +item.rplumar.cyan.name=Cyan Lumar +item.rplumar.gray.name=Gray Lumar +item.rplumar.green.name=Green Lumar +item.rplumar.lightBlue.name=Light Blue Lumar +item.rplumar.lime.name=Lime Lumar +item.rplumar.magenta.name=Magenta Lumar +item.rplumar.orange.name=Orange Lumar +item.rplumar.pink.name=Pink Lumar +item.rplumar.purple.name=Purple Lumar +item.rplumar.red.name=Red Lumar +item.rplumar.silver.name=Light Gray Lumar +item.rplumar.white.name=White Lumar +item.rplumar.yellow.name=Yellow Lumar + +item.paintcan.empty.name=Paint Can +item.paintcan.black.name=Black Paint +item.paintcan.blue.name=Blue Paint +item.paintcan.brown.name=Brown Paint +item.paintcan.cyan.name=Cyan Paint +item.paintcan.gray.name=Gray Paint +item.paintcan.green.name=Green Paint +item.paintcan.lightBlue.name=Light Blue Paint +item.paintcan.lime.name=Lime Paint +item.paintcan.magenta.name=Magenta Paint +item.paintcan.orange.name=Orange Paint +item.paintcan.pink.name=Pink Paint +item.paintcan.purple.name=Purple Paint +item.paintcan.red.name=Red Paint +item.paintcan.silver.name=Light Gray Paint +item.paintcan.white.name=White Paint +item.paintcan.yellow.name=Yellow Paint + +item.paintbrush.dry.name=Paint Brush +item.paintbrush.black.name=Black Paint Brush +item.paintbrush.blue.name=Blue Paint Brush +item.paintbrush.brown.name=Brown Paint Brush +item.paintbrush.cyan.name=Cyan Paint Brush +item.paintbrush.gray.name=Gray Paint Brush +item.paintbrush.green.name=Green Paint Brush +item.paintbrush.lightBlue.name=Light Blue Paint Brush +item.paintbrush.lime.name=Lime Paint Brush +item.paintbrush.magenta.name=Magenta Paint Brush +item.paintbrush.orange.name=Orange Paint Brush +item.paintbrush.pink.name=Pink Paint Brush +item.paintbrush.purple.name=Purple Paint Brush +item.paintbrush.red.name=Red Paint Brush +item.paintbrush.silver.name=Light Gray Paint Brush +item.paintbrush.white.name=White Paint Brush +item.paintbrush.yellow.name=Yellow Paint Brush + +item.athame.name=Athame +item.swordRuby.name=Ruby Sword +item.swordSapphire.name=Sapphire Sword +item.swordGreenSapphire.name=Green Sapphire Sword +item.pickaxeRuby.name=Ruby Pickaxe +item.pickaxeSapphire.name=Sapphire Pickaxe +item.pickaxeGreenSapphire.name=Green Sapphire Pickaxe +item.axeRuby.name=Ruby Axe +item.axeSapphire.name=Sapphire Axe +item.axeGreenSapphire.name=Green Sapphire Axe +item.shovelRuby.name=Ruby Shovel +item.shovelSapphire.name=Sapphire Shovel +item.shovelGreenSapphire.name=Green Sapphire Shovel +item.hoeRuby.name=Ruby Hoe +item.hoeSapphire.name=Sapphire Hoe +item.hoeGreenSapphire.name=Green Sapphire Hoe +item.sickleWood.name=Wood Sickle +item.sickleStone.name=Stone Sickle +item.sickleIron.name=Iron Sickle +item.sickleGold.name=Gold Sickle +item.sickleDiamond.name=Diamond Sickle +item.sickleRuby.name=Ruby Sickle +item.sickleSapphire.name=Sapphire Sickle +item.sickleGreenSapphire.name=Green Sapphire Sickle + +gui.busid=Set Bus Id \ No newline at end of file diff --git a/src/main/resources/assets/rpbase/lang/ru_RU.lang b/src/main/resources/assets/rpbase/lang/ru_RU.lang new file mode 100644 index 0000000..7420c70 --- /dev/null +++ b/src/main/resources/assets/rpbase/lang/ru_RU.lang @@ -0,0 +1,147 @@ +achievement.rpAdvBench.desc=Сделать проектный стол +achievement.rpAdvBench=Цивилизованное производство +achievement.rpIngotBrass.desc=Выплавить латунный слиток +achievement.rpIngotBrass=Латунная обезьянка +achievement.rpMakeAlloy.desc=Сделать плавильную печь +achievement.rpMakeAlloy=Сюприз со смешанным металлом + +tile.marble.name=Мрамор +tile.marbleBrick.name=Мраморный кирпич +tile.oreCopper.name=Медная руда +tile.oreGreenSapphire.name=Руда зеленого сапфира +tile.oreNikolite.name=Николитовая руда +tile.oreRuby.name=Рубиновая руда +tile.oreSapphire.name=Сапфировая руда +tile.oreSilver.name=Серебряная руда +tile.oreTin.name=Оловянная руда +tile.oreTungsten.name=Вольфрамовая руда +tile.basalt.name=Базальт +tile.basaltBrick.name=Базальтовый кирпич +tile.basaltCircle.name=Резной базальтовый кирпич +tile.basaltCobble.name=Базальтовый булыжник +tile.basaltPaver.name=Базальтовый асфальт +tile.blockCopper.name=Медный блок +tile.blockGreenSapphire.name=Блок зеленого сапфира +tile.blockRuby.name=Рубиновый блок +tile.blockSapphire.name=Сапфировый блок +tile.blockSilver.name=Серебряный блок +tile.blockTin.name=Оловянный блок +tile.blockTungsten.name=Вольфрамовый блок +tile.blockNikolite.name=Блок николита + +tile.rpabench.name=Проектный стол +tile.rpafurnace.name=Плавильная печь + +tile.indigo.name=Цветок индиго +tile.rubbersapling.name=Саженец каучукового дерева +tile.rpleaves.name=Листья каучукового дерева +tile.rplog.name=Каучуковое дерево + +item.seedFlax.name=Семяна льна +item.dyeIndigo.name=Краситель индиго + +item.ruby.name=Рубин +item.sapphire.name=Сапфир +item.greenSapphire.name=Зеленый сапфир +item.nikolite.name=Николит +item.nuggetCopper.name=Медный самородок +item.nuggetIron.name=Железный самородок +item.nuggetSilver.name=Серебряный самородок +item.nuggetTin.name=Оловянный самородок +item.nuggetTungsten.name=Вольфрамовый самородок +item.ingotBlue.name=Слиток синего сплава +item.ingotBrass.name=Слиток латуни +item.ingotCopper.name=Медный слиток +item.ingotRed.name=Слиток красного сплава +item.ingotSilver.name=Серебряный слиток +item.ingotTin.name=Оловянный слиток +item.ingotTungsten.name=Вольфрамовый слиток +item.dustTungsten.name=Вольфрамовая пыль +item.dustSilver.name=Серебряная пыль + +item.tinplate.name=Оловянная пластина +item.rpcanvas.name=Полотно +item.planBlank.name=Пустой план +item.rpBag.name=Брезентовая сумка +item.rpSeedBag.name=Сумка для семян +item.screwdriver.name=Отвертка + +item.rplumar.black.name=Черный светящийся порошок +item.rplumar.blue.name=Синий светящийся порошок +item.rplumar.brown.name=Коричневый светящийся порошок +item.rplumar.cyan.name=Бирюзовый светящийся порошок +item.rplumar.gray.name=Серый светящийся порошок +item.rplumar.green.name=Зеленый светящийся порошок +item.rplumar.lightBlue.name=Голубой светящийся порошок +item.rplumar.lime.name=Лаймовый светящийся порошок +item.rplumar.magenta.name=Пурпурный светящийся порошок +item.rplumar.orange.name=Оранжевый светящийся порошок +item.rplumar.pink.name=Розовый светящийся порошок +item.rplumar.purple.name=Фиолетовый светящийся порошок +item.rplumar.red.name=Красный светящийся порошок +item.rplumar.silver.name=Светло-серый светящийся порошок +item.rplumar.white.name=Белый светящийся порошок +item.rplumar.yellow.name=Желтый светящийся порошок + +item.paintcan.empty.name=Банка для краски +item.paintcan.black.name=Черная краска +item.paintcan.blue.name=Синяя краска +item.paintcan.brown.name=Коричневая краска +item.paintcan.cyan.name=Бирюзовая краска +item.paintcan.gray.name=Серая краска +item.paintcan.green.name=Зеленая краска +item.paintcan.lightBlue.name=Голубая краска +item.paintcan.lime.name=Лаймовая краска +item.paintcan.magenta.name=Пурпурная краска +item.paintcan.orange.name=Оранжевая краска +item.paintcan.pink.name=Розовая краска +item.paintcan.purple.name=Фиолетовая краска +item.paintcan.red.name=Красная краска +item.paintcan.silver.name=Светло-серая краска +item.paintcan.white.name=Белая краска +item.paintcan.yellow.name=Желтая краска + +item.paintbrush.dry.name=Кисточка +item.paintbrush.black.name=Черная кисточка +item.paintbrush.blue.name=Синяя кисточка +item.paintbrush.brown.name=Коричневая кисточка +item.paintbrush.cyan.name=Бирюзовая кисточка +item.paintbrush.gray.name=Серая кисточка +item.paintbrush.green.name=Зеленая кисточка +item.paintbrush.lightBlue.name=Голубая кисточка +item.paintbrush.lime.name=Лаймовая кисточка +item.paintbrush.magenta.name=Пурпурная кисточка +item.paintbrush.orange.name=Оранжевая кисточка +item.paintbrush.pink.name=Розовая кисточка +item.paintbrush.purple.name=Фиолетовая кисточка +item.paintbrush.red.name=Красная кисточка +item.paintbrush.silver.name=Светло-серая кисточка +item.paintbrush.white.name=Белая кисточка +item.paintbrush.yellow.name=Желтая кисточка + +item.athame.name=Афем +item.swordRuby.name=Рубиновый меч +item.swordSapphire.name=Сапфировый меч +item.swordGreenSapphire.name=Меч из зеленого сапфира +item.pickaxeRuby.name=Рубиновая кирка +item.pickaxeSapphire.name=Сапфировая кирка +item.pickaxeGreenSapphire.name=Кирка из зеленого сапфира +item.axeRuby.name=Рубиновый топор +item.axeSapphire.name=Сапфировый топор +item.axeGreenSapphire.name=Топор из зеленого сапфира +item.shovelRuby.name=Рубиновая лопата +item.shovelSapphire.name=Сапфировая лопата +item.shovelGreenSapphire.name=Ломата из зеленого сапфира +item.hoeRuby.name=Рубиновая мотыга +item.hoeSapphire.name=Сапфировая мотыга +item.hoeGreenSapphire.name=Мотыга из зеленого сапфира +item.sickleWood.name=Деревянный серп +item.sickleStone.name=Каменный серп +item.sickleIron.name=Железный серп +item.sickleGold.name=Золотой серп +item.sickleDiamond.name=Алмазный серп +item.sickleRuby.name=Рубиновый серп +item.sickleSapphire.name=Сапфировый серп +item.sickleGreenSapphire.name=Серп из зеленого сапфира + +gui.busid=Укажите адрес шины \ No newline at end of file diff --git a/src/main/resources/assets/rpbase/rpbanner.png b/src/main/resources/assets/rpbase/rpbanner.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3bfbbea21e96c6bb8956149cbf7d156f47022e GIT binary patch literal 19187 zcmV)TK(W7xP)U@7xb(pzxHz15L*4bb0%pIq_JxovU z`w8B<5AK8inGoIkB90xY?_FK@l3v{h_rZNo!cTz!{MSJg#RKjhJrTH%T-*o$+u=y; z`RAGdG?JlvUB-Px;6C`@0zZi?{&P(Lj2R>Wz_FtBeMI0s_(g-Cmg22{O64389w$0$GQ~jQbcUHTzTCG_rWhJs3oqS7DWG5+%ZlXC;_Dv<6|v0u4?dzhpgda zU);gI+0GH)Z#3%Sf7L=KcJagEo7343ZgflulK?KT=-d<(+i0DE55f# zvSzeNZer%UptZsnO`2)8>`t+B2WZAk8jVnw2-aGx%@>tZNdR)xjS>VIL?8$RLaBjB zQzsgY#&G#P&r__;j;`{bAw(j8kl#lD{zt-p2cj~;VB30{pBj{DTaK_o}>~Vp&?jWse`{>@!-t?yY+`55oz@ z0B~6paiz<7{xg=b_dw34zA(+fDX&`H2miC7H8e!C(Ez2$^Bm_K&N=cdLupNtBq$VF zmeJ`f^u2xb^M9{aenCgZl8E&yh6r|ewDJbGVj+q+Pzu}a*S~|L07#ZYW@#j?d()(! z02E4@p9AhCrNmUfw`^STJ5L>D3TJ<^QZO7!4 z#Y;-U#8^b$?eL~|9^wgc#7V}KZ>=|mr^PY<_Q69u>cSXRj+r0=aV(s;A>r;_8Qrej zCmH-4L95kbWOS4~x16)ma>}V=Oz4bjcZYdWiY!eL5#l7qT1TE|fC3TnEGLNBXk&18 zkoW7zV3g9YzBe6F${WZCi0*yy{?bZ;0( zar})9C!Bi1GH%{FhsS=;wVVqr(-M>dVY+SEv2P&|2VHhDSPRk3gvPL;J?DOcmi&Yu z;$46PV+RV`z+!|sTARVp&=4CpZe)CXobP<+J4-%y{941ao-)Rzk881OzXs{@-J3c* zFK>Z2$R-Y53m-)ml=4Il69+IE5Z*!aj>q5n3zK%pn5ST0{y-I;eC3*N~tF zl-uQx9s16bzVy+4RZ2>!jHp&?E??X<&kU8P{p{+us;eU?ifD;&2x z5kYH(bG3CBB!Gg^7G3vo zVXl;Dj|GlG0bZ(5LB$$Lv+^+sjnhh@v?l}J$Of}1+%O9hI^(1h625kO>WP>LS}6|9 zIO5>{H%8O#E|8@ij%m}6HpFq$hyKuRy0`0>P57j_PA{>^kH?;`bAjGpM|!%2BGafp`KvXg+lx z(UnES{Ak8{x;hyJQO~(^Pk)_=h{=S6=&D_!n~ z@rY+p${+|PFl6VBuATS70;ZVHVBfSS0G>FBZ@lt1lvX8@Pb_P(X{^Ea$qck$jK&xp z8Y>tyQIIGajTYi8^X(}%P?-gLYhMhzfQ9ZnNo$liZcrG~(r%k9U7!i9JBps|02aCn zp&V~nw}F71bQJBdz}!V|KkrI) zMu}quFn*L=7~s+Di&8ek;cnFaRIO8~&p5@Bua z&Q=P-R(YV5cy;pxmS$%K>;u{%!m^*(D6wc@y_sD2^B%9VO9@+wPoX zmo!iszQ02U@mbMmG`#*_deS6_|AN-K#>7-<6L4ZdDWWJsDMhDq@e1lL-a;ZJBy;i&8v?dyMS0p8#oUl3bckV3N| zT>R)!E;zTzSFW4oN1GS;{oiWv+^5Fi9Fx;Ivu(@neU=Y?(s4sIq(uI*4R^qAT>@|an<27H@${FpS-o8Gi-`<~I_ zI30Ma)~v48+3RerKD)p_iEx!Tq}DGjj{5_zQ;OvS-Wycre&CWmwQ+c82yF~e5@E)h zFqxwp35`aBEYHx&k)~Pc32+6DAZQbz5UdM!0D`J5fbvqE6N}PE@7@222|%McRC0Y( z7$)USeuet)f;G^Xh*?qWoDoJ7O*GQL7>9GVSFaW!&r%jT3uIXuI_`rNmO}c9b|{ts zzYDz7Sz?!?wed0h2*0N^qkZoTDhFT{@ViR!GMkf#EyZR4qf{x83@WGiemd}atvT0P zI^w*DCc>#FHh9r?oCA|NlQWj7Da%*CBiz0nK0Mx{5f%el zFVge=C7a{HmpCqXOz-^cxEn5etngQVknqs6VYsQe{;DxnEpO2pA7*+g;_KgSbIay# z$$2#p4Ilu6kT(Kes1$E;4jcMcKnBbgF(BdIPI+jNI`n@6G_mtujA}EoP16zb=D#fZYwnYY(Q~&Ho!`4uXMzev|hR2@2 zj`=M+c;KoAL&uG=>+VC`+SS46=Ss`JH~zUG`j>d`YfuVYA$bRBKmpEq*I{l4s{*wt z{)q{IZ-^H^R7C;24(uF88MF>Q0CA`&LDCNGMibS^D&(*18ihpD1NB8vNA{k-Yo8NU z3wu77u>>KhE%^Fx%R?s@7G?qEMX%77qagqQqrg+N=EKh60)kA<Q^N=a@#uu01*9BO0xw94XywV!~F_$jccF6QM4F(tzFb zZeLmbq}1aA{Pz7LhW6aUO$!Z9Xc}gAw|U?hO-#GVx4(N2f_T-c2&*sLf6g=8qJFJ3 zR{59_>%97{(Kr#0H^$(OV6(Uv1Yl6X;tgk7hqg;0`7$xyaf;VC$LIRWP{5yR&6A7ZioW*? z!(N>Lyxcjy)K`uMUTF*$D@6`$l)@+Asr1g>InRID9MsH+bp|xJNC^8x$_Ac zHWA!^B z3*oQum_rW@VWJ3e4m&dw7+Bq;3H>NjpR>aWwMQZVy7vB6BK)&+i=>*zD#a^wVGkK> zy(rd~0G|-yZ6b@xd4f{>NzvxMa-4Hm=NO4n_Qc~n?evs28<+EmZ|>&9*BjFAELrg5 z$8n4}kMv&07nC>VZPYBSzpAnGwG9|L&re&Oe@O% zfJ1m=Pkr~Fh-02gN?1x0u9tHV*jqF36ycF&z;$ zTg&a%vL(0Nxx;bCcFXr%#_rq`CJjX5+jZr_0@F#tsjU{BB;lSs?}>R35$*x>^5xZB z@7&q5c1m^0S?Xw}Mn=%B7UCRcZVrNfJ3?WV9vEAp;uvELIEPvyz(s{Q5eBOXP)U&j zEP$6j>h+1^Q0*C`2G4$-kj&wAe5sYA#4%laMypM1LoO)`mEa$?aMZyZxo|I5gP;aHmvt-gw4VU< zLPb3KC$ArLtA#SgFXna|(#8A!FBlu+ENglFMY%+%RTJx|#6h4*b-0U2GbjBGxY~@NmwP(-b0Wii(0M1p$C+c(Wxz`uYKc7vl z7C1+UWua1P$v?qBz#MkQ`waKvpRIoj5SGCj}xs}!TzoLXl+_eG!5c}$aoJ~p64i~ zXe15NEW_C_hEf^*OcddYNJ0ATHdOYx!-)3-Z2;OtXjA=E&z6X;bdXLf zq^uf1Y4CIHE-EoT`c@m3(P5v`fL8-@YjHIqFnIEczhu!fr3&B{ry3hvPH%}CJa-2e zu)#tN4WXmRbK@m^twYTwPg%B%sMX@NyLN$6JUfnih>%u_S>TL|E?S~BgW%Zud{0T2A=!8=W)h+-s9^IoU4Bi*{AZHw`3VFI_Df- zdd@jqKM483BiyoOm2s*E1cmU@`=8B8>(_&G+&w$X&4&(E5wZG^ed@@!$(L@Y>sVliszDPInw_B9exXrdjDh6J6NbioF1S zZ5Jv`F$byx%F-sgGv%G z2IXAE-OJ8Fj8Y}kMv9|!07;*K5s*>%?~>ci?Q*0SlqekRTu=CyCX8JENG>Br%A&){56+D);}5yvrF2d|n{B_0XhCQwBC z)x(6P)~b3N4`<#xqM5M1SVx9UDOyxi(LYf*K$I$6e}Ov(vgDlL7E)ZNi|cezk>Sw6 zdFE7%)*7RAkM+N911J!@_`%tnEbEfzl{9iB#409l@H3&dC_*(Fs73=0w_&(U=|OqF+-b@_+3bxcCBL|Gve7 z%iAu$oGaRGZu#|JUxfUZXBltFQpQFNr>$Sl$lA5Ut5%^#M|;Xxv0^17qobt+peH6g zk`FMLsi7hC*cfVb)Q=}#4XiG2<4_|b=;2|Hz)Osy8XEFrofNqa>c%X*wAN~&noVdn z%lkd#K8~w-t!=1My-)S55z61ICkAo%dO1DM)YhyMhqabpJ0oVxod@{rk7l^?>j&xV znq>P-!e_tk_i!jQS)O|-*!j&sS(XR&p&}wqLRfH33iH!YCjm8B!m9y?AprHk*f8eU zv_2ux^_3+9z6agBbpKRzXsijYn|Ur9X--_%KpDeSN6P2CURAtb5s-SP9D=bHV{?qP zrQv5WVyW5$F8OqN#Yk<6!n!8{wfwz;h(S7Q$7_%sAiL-)nZw*iBgKu zv55C)8L#j5s!+!YD_5-GO*dc9rt@ZaJdTQzS-txZpaivn+dU2&Y zyemz4bDE;GVxi+$zh(`|iWTVP%h7=VL|PFkXwOd3nQx<`2t7WI8Xxxrpf*M&qBNTx zxkpAk(h=q{So?JtYt?F1$lEuPJ!9Q$R`VesHm3-ORa$#OQOwBzP*LQ63(}nz#VyX| z{0dY(ena~%AqKG7p ziQ~vy@2y2?Zx`@3HANW{;0Lyh8dRvkSb3NZMLpC(^&(3FL#>Ddvnl(hv)&&BLl-}szvk8Ome&h&vvBUY=kl+w zcm;X4%Rj#BU3~6KU+O9AjqiOgXa4Qqa?gAp&j@P=jT9+uN_IWn&>_W}0J@G)L7L{X+ zA!#I-#BugH$J1SI_{Mj)lO9a5ZiL)6$g>P5jwp&s-#?NA!5xSyCGWz$T~`ZgLir-7 zy8ssraSs8gMKYC^PQbJh=yb8xh93%-L(R%4o)WoWBhcbE1NlJ~ve^!eM6+Q$;ds+! z@0xLT?wI73&)rd4^NSuVC9ym~DW1@$%hxBX82H12QoJmR_{*Tjm->A1y&iBg2nzA_ zFa&^_E3b$k^dX&!Q%}}>WLt^@UfuUvqtW21k9>sn&atp<8;uPcc=>zZ%N18#0eEBV z?80rl;XNMtU-E*4k9?p@fj?=Qa>{krvFfU;7=QW8nVX;I>wWsSO;cW*c6oQ6^5C;0 zZn<5ssZS-EjExaZOn|kVapsx4;k47dzusD}SM+@!WF!Ur_(Ty>jKdORL{OoYQl-kV zuGtz^H5&ZK!yd-pZQjh)d-wXW4qSbZZeNxYu1kl8xFissdVk7(9Y$P+YK=WyDITtR zqXFyRdq9M<*GD|%0Wl}i;o93KSy;6SJ%4~G9w9r}_WNam<=?;JLYd+%d|Frd8C-(SfAP*9^t^?Y`fyP_ZfyJlf5hMn_{ zZ`{@4&O0ZWB}QrQ#}!v>ayVRzjtt+Y5WntSImZIUIR?Eu)%?Vy)|TTlF|Ig%ZN%&T zs>LT<%4FZfO;1mA$z_+ZcYdA|zxFj&-+XiVo7S*$CH&*RW+V;xz`w!dLE+LT!zri1 z@CaUdIPN&ov(Dm_tFPvDuX#kk2 zyWOAJSRdbN@t^0N$H~LPy!!zU;7O}j|HQVGV*#c7n%evmzpps=j8S%Va<2T+U0lC& zf&AbMcefMv?C_!H)>=B9PMQ3(#GNwQ(5p}tiuKw620_g}Sf0bte?__VmTqH`MT5Df z1t*^}jB9t9%PKLW61JrJyC#YhovvJj-a9ax3W}6yd>GrF2dj|GyE~LtDDmNor3lpD zA*j{tqq^>rDh>8cz`F+QPU|0)YxA5tt*tnHjq9uM{q~wz>Z!5@tmiTTsS!bG9o(id z;w*XIq40TI5%w)CkRA zdC_y8gW0!_n{U3k+$ZsfN5X%88k#M*d7(WAyLRp3T|0N;PCAJ^ z&zZma>P6jei|{vpn(&NYPuRITqLapa;&Th^IpEm3Z5!$2B(X8fw%csowaYKCV)t3_ z-D53#4jtkjuDXgy>z-&hz>iO!L!SHRmzakhE<6Z|v38E*noT}^-g#^c+&dECU1y%j zC->~Bxc5?Z6|o4;@#8e*>zz(dd_vi;fNYDMyB_)8<{ZOXb2b&n-=q}vG`54#apSlU zcV}@Z;_+e3NEbbvuzlW;xeSzNd`c;t^PA7At=~b)7KaYDfGp2y(zS2jl4Fbts;;1o z3ZAyAm5~hxSlGUUER;43uN`5}{w_099oiBaQ1BbHop`ZYQMz9_<%MR;w{*BtPh&e5(tXOsf9Sfs3rXP>Z^ zPX>SZ;h>NtRFF^rzpxA0s(#h$$aBcTmQHJlBh9N`vW8!Jgk~(Br!#B0x7+24kA1AHcmMwV{Pk;JTeTy|omYPXmM@#&VGn8Zf){6ez+B(b`akDTJ5Rh|Cc1ouIx5@R!cg{MBZUo}F|xA|Rnt#mW_NSO<0?#SF*flXIxZFr9MuZ!?W5uPf-xk@n%JV`085CI+e9xh=Fs_SSF;>U}3 zme4zlQYc+z;sKB>^9w49N{%Ds^hBcPInwE%j3Lc3CdLehrYs9Hin!@@vhfkkuRhZ8 z*{}RQFMQD#xnt{AZn)uw!E+I4j4`lkZJSs8OUBh7QM~O9W6Vq+T51XhLaV75AJG^M z`zN8*((IiTqF6BzMd;~ioKml0kXDhTsFs$#Xx$;T;WN{23NY&AqDq4`F?)IBf6{a5h%YuGn0sd|Zt7M8HH5h$FW? zKxmNjuMAWS-6&0WeZ4;X(O^a+-K<3BVq1t} zZFDn1tRq@BjB92nqft}Ev0w(2lz~9yK-S8;LWGBgLHOpvkp?AtF zaYkH*?pq6@2n3+^PN#zeqhYb&>Z%EVq^V!rS`$0R)Ktztzw-bezS=O-%6ZJgHBY!m zvwTAHs~10wo44G~jW^zSxT!!Xm{<<4c|*n*Kdt!Wn_E2l>Cfd=|MD+~eXk#aL7eM< zX!**w+H|vwE!(X>#C2{CH93g`qztL;-RyKUAoKIMnHg{nlcvPF2%o7ScFq$C=awb_ zX^PCxdl5Y#Z*DE0pPc0EMuQE;^bmt3jgmE~p|qIR=H9s+)2B-dAi7AQRzbn&9PnF8 zm2T)O`V8oWp$=eZ?Q){!6EHs?axxlhJ3|HHDo#j}7-L3CLfKjH>F`Wsg3D6SxX^6r zAI`;NCw+gYN@b9u`*Ng6KmpZ^!X_R8v}dvuB`khH2Z~j2a;+6g32_`ly1)jL5g$KH zHq~KSD`VNlaqOXKb}Gwfr-O0A_B3J9fPPMdR{~?eSxRxHQrs?%rT2qTZLTQq__~TM zlUX&^2sNolw$ARz0AzaFgybP_qB>|epT^>e;elW z4?LgCo4u~Yp`jtxuU}sphl;CiREnaQL$jK9U(w~$*W`$F=%zxaYZ-M8cj%ChxC{iK ze!$DofKrODZr#dbLnPp{*RSWY!d!w|BOc1sNm7X^Z_3XOl4r-o#S++xPM?m zv%qI+80YGU2AF+QJo+a6zxCV(+u#zrOFZ?j{bD5%d)O=j*Mzsa{U6hPt~M4FY5=OH2dcs&P$(NJ=r^7Vow%ln8Ba*}cG=MtRI`EP zUF^8!;MhQGgA?KRZn}xj@7&3{ z5D4_gt5>ru?Ct;Hfdg#qc0q*C%*?PYO+iPCjEO8Pc&1Y0^51BClkcrr#?0(2qXkzV zkmRF)`n)cFrpCGZo*h`0SQ6k8Do+0)5uedoT+g=TqU7znJDhjPNerF2oD=T2i;EsK zOtfr_&)Ed#Vb4SN8}3cbl8WYAL5kFR~kRTO?e z-%ABcqz`&PkDycN89_=g1hHL;7zRN%8cfaQj2KW!jN~~=E0R@XsBq8Drx2NnVliOy zlxB-KZUP&LJw~GmvT$ zWMRP@p0uu6rUhp$LoLfw9yh`tJbj4f@|Aq-Bma-dsho*W-h)p)m7%9Tl?A1E+O?l& zYo+U=46xSx;!fIsaSXSwR&B!X|tGvb(ukP+zP2M%yu zr-M=c3(2o{#3z6qYBb0@3j>+RaV^FAmSgvi4xleShg)vj&uw428)sv(EN5Y1fjEw6 zHJjuiAgE|n6va3Mn^}rbVE;=UqYH)`zN*FEfqufLR5(#+5dR-ev}d(_o$vV!6_vio zLM;e?+uWgaNJbE-(w4iX&<(>u(WnR}8k#BR5SwEcEV>z?V(nwVgE!WRl;T@KwUjm( zXZe^2_Yd_xMJYZm4kHpyCl30Z@+TG9S~&pLIc(a?K?@>L@2yv1s^PODJ)0mXQKK$aBt~&N!tp z&imhYh!_8b;`ZC%t$(9=s~+XT{Rfdh{$oxm+8x^Erlv>(@>>zIFdrKt&E~CwBVlNy z$-7@W!V{l+50kqc4_g)S(I0z*o12{U#Go(L*U>^x9*I()7u@tTPHRszvkXx_6Ht=G z3=fZR=+L2H#I5P>S%$5-_HGoR0~oDQ)^VK(kE+$Z)QJSH_FFl}eMh&6QspyN`q8E6 zo5LYIRq2vgd{l&3X_7cuOaMYTKbp2Y_{Kdv;t|XF){VQl_RCvIRt{sWMQe?7j&3(4 zihTUPm*_*5UsnVK5tyr2rxePYW~Ua|J6jEY zFZxR*@zy*6J=C?};I2qf=ZhUmOt+guS=e- zH4jvZ=g!aagvTqy!rNW}AJ9XbjU(-Lk)1m$?iC1t4gIvxBL$p_=DP3YeEUYY=ur*s z+GP=^Sw5Pu_S_TEx8CRpKo~H$lyCk>;4Dp`QM;u9=H{@)Sd~V}oK7b%kGJ-Al4>N2 zIV<40V3L=qsl{*b9~7#G1FLU|`FYT5Kq;xuXG;I8Fu54CT!M zpB2G0n`Q7>;UOsM1xVH`;|J}W*&j~xfm;;qNrj0MtZk!|CW>S7EDNE!67u>5K40s< z;0c0XOV!ODyI!H=m*Y}rWwpOTxBAWogh$_R8DIJSL3*={45o;JlUc0~g*ihWaad{%_Z zLWiHG6t9tB4D4%bUYn3jcx11Jg;IJc>Pib0K$WHppqBugtQ05r3~%+_hB_~I&bxb* zLhFc~_jLJ#m+hq0gaea~g}Iz3>4+?ho%54|1KyH%*>}9<%n|s^+Z7+v!)(x+Y3H!O zP|fI6N&r*@z}5)BiAwX$ttl_~t0|T*o1@zmcI*KmVaMlvOug%LumSN)qT7cAhX?=8 zOSR_tTG#GWV<#fKTWj*#8#jsYy91*5oJdJD0KOS4;!1(injhPoStuj%mXZMSFdhP| z2v>TK!l&`)GK?lk$+GIIL{Z1+-FrCUf^~dlcAPu!KETu= zu=@^@G#Y3v#9^aS+D%Ii?+OE;)WU)llqWm68vm{1c%iY@rI_0KEsXe~IHD+u%j_fT z#xjUP8Jian4p;4a**-m!i;VqogCAQxqC80a>ap8 zL`&r?9~nZ0_`YI5iw-y^j15KP!$a(!p68?D_>DjUF9u#m*eNC^tX;nlzb(SWgOI-O zd+~V`7ldyY#H-vk};BrogG-*I!6Z-o# zoAa?o%E`-w+x|myg&AgCDc;-d@~>H!9Qfn7!84Pj%(uT30k9&RpcLI4cJ4Lo+LIvy zNux!aX!6|u?UYBBqMramtpD*7*X2Oo8)O&koH6?{OX(wq7ujpF+(@L>@S0+ES(0+f`} zB|$(ODX>u~vVg#mQf#%BSK2OPEg|}m;s5CtU&%85HBUK+2ip z70$93IA=iJ{q5N*!e@$lYI3%6j^lwV!<`us?gWM#E#f%A7;ksl0(>YuGaK5zb?YSU zQA6HI5Rww9wE`2F5>E^Et&IuZJVl=8rR!0nD8l#)R@-Bw?jQ6;li+O!MP#i2s@WO~ zY`)_5M{@vT$xDN{p^AL)s&}_hmF35OUojeU!3IULe1uWgHQet75pMV!e2QQ}WvA@nEDb4)Gy!(scT6k_7A`NEfB zZH~*j9Nmd`3ba8-jYWp7I#`>LXA69y*v+i`Gs&4h{&QXrg_#yAJrK3f&e;7N)gwW)BlXuos03b zHbeDgyA?p0xC~+T+%-o_-zii}f!_6QoU=Ha_O-`z@{#dn7^8`zn5oHw;Iism zf$;w0&tJ!Qp0P6@X3N2tLz4%|vK*r|aiamwk!BfLmIlAS32DWGLD}V)kOnNbdC>a< z?$!7DFIr|L`!Cz0!tJt&&DL09r7N|VqZz24x&phc>mxe&!Hb`DNcm+<#LJ$xj-5B{ zVg|$f>J>~hHEU<*`0{Pj=s03*B;i}z(w?o6c{t`sg&sV3Rm2%*E#r{{vo0ep%m|)OY^_SBxBMf?`uPk-A=Z>u{DiBMp6efx>CY;EFVraO7zEO^>yHJeAOO0u?1Rsl3Eo90 zgv>w{))rkX6NL2irT^~=OcXa>?T=zE^o64zsQRXzf&di$d!-H9C~WRs9X^yXLTkm^ zabV3dB+Z%KH_y5u$N2H%tei;La!9ZX9nRelbH_pNIxCJm4z+;5-UZ>-9Ub;|6^}Z7 zi1`J}OsB9Gcq{3mr6SdShEhkMuwzt+UIgtF$;69fOA7Jj2Jy2Ze8p$vIoJ`A--ERo zrz*H0M4-Lb<$N`FoS+ro%^gz+W22fYFJI1s&q`=SnlF7L=hi!gd-lQng65=62`8P_ z;C?43T=T7rt&^57TFbYcW1aHnC1!XDV6zB2M1noW6ME|`&UyovbvAH2TSlNAJk;gx zIp`!YS={1+^VjgE7oW~eyM=uRa1ZE_m`7a#xpSV{Oo0|GrZkf1aj1P-~uH495e-RpfEZjPW+fu20bB7yXYvUwP6*>$}!qM+=a}i44t@!*=>`U zkp!jqoIJCbNTao;)ohh2YMy1@))Lg{r4ydjpdh?`QbEbw3#L^pSP^vP z=Ig(xiMhSvt}jc4@~fQZ)J5)K6fE2sKGA{yv31f0?rJ->-m^e!xWNG%gH}YXgf%Cx z;PyKYantq=(|7Ih*3@zXho@R5BuI4Pk35pp?+1U(sU!4*i0AxLF2pLWd3`yQ-)rON zk>5dZ&Gbl9MJ~ieGcb6OiOX>=3yCOm|F<|2;O*A(errLzcrK=}JqW8;Ms#eG{RbNS z$Cq-xe~V>u+Pg#d9)vG`&9eOl&CG#_Lo>b&TC1{*TSWMaEaMH+Se*4p@Eu~o4%uaLF|B{=t&F-?qVQqRz2OarasfzKCdC@=5a$LxWC4sYfNdw;orGskaN#y><t*sU@}EDBEEV@Mz@=mX~T*ITVK3dYu1fMtRB}aUp2y)uHVPuz)S1}>#I@6f;iMA zhEm_EjHJCIoeQF-DqnQp z2t;v26vY^=+4&C}c;lC6dDAz2da*3c=ytoF*d>ji!+I;Y6Nd?ra0R2HHp*H@sM-NF z{Y%rImRn!D3Pr@Auwsf-+Ad%8lM42#YN`%BPUNE zWcZ{BIy>jMab9u5!Y~_DhxYgwQ*$}D@5s6N$J1nKiqeMpcAG*KQ%aMiDI%V@yKrKZ z-?3`Qi^$T#+g8IjrM!E*oSPug_3VgTLRT99_hIFUQ*QhXcPxH+EOJFS0rhW(kP>f zHWq_dtoC5>#h9x8Lb3{?sB?;L3i}RP=Gv8wqnPaJ8O!b4Qugfk2_t&8(-!Si`26{y z?qX~X2jw`F%%rNbN(Sq}iNofWEYD~RHIWr#q|DlN>Vr{Ir)YPC z`)wFTwBnlUeN2KsD=mmX0jUGuD%+Gf$Z{c%B08P0nWCUc$_0r8N;h6VE3ZlTI{a;P zwLe|gxg-9FW*4}l|0oF4Vh%Zop8Aa)x^DujZPn#-MSm53p{lC!^}YJ4Tol!NRlVT= zO%=FZ(So{&*mu=OxC-*>o&TQxgm!#uOPA|@G{yGm9A_PQmU`}`6j_><@$bdjF*?|F zoRrKWFS7m+IGz*+*g<>ORPWpb0w7p~w1x=9unFb zRF|!_bh{}ih~p#>6|egn6P30G@PxLoI}~%c$Zl6(fBj(Z|&PH-$=t0EkWylvJM!5P9Lb{onqgMaD+UwrnD zSutPz*=Ka6N>uGFM8;yg2mD)-Aa=LgrQ7Y2rYUKff-3sy=ezJi6iHzGl=;j(V)KGOhBNY{)(HY~hcGC?tMf&i zNPX|O0#&L@IU=dI`Gm35!El|#-frOA)Z2Zn{n6WxIHAGl)GTXO4YOza6v;#bz2hJ^ z-#yEwlUFl35|eJgvAa5wxj!+93!J-u4J%b_`Y1Sd(Op#@z*sCQsV#DAi-_{x z;gLl(^u-(W3~51Jr2e=^p28QesEwiW3scovsR&3@BMdce5T>D~0u5+OIhWMl>7)2d zAb(vgD!c~8^M#wL-2YLN9*RH~qfPZ3iagH%?=mjOMQQ}EZ=9UVsy|&ZCdC4DC{t%p zy<<}93kV_^h@lMb4wA4A2{=`uwkn4S$D12tdXVtJ$HzS7G3z-vInA!kvoux@5yiqm z-DG&I$-Z5a+%w%}dfPlhBRS95xWG-jhyA*>3Z?v^A$gu*tpTM9TJN4y-DKE%e0xJbb+&$2FpmHwrue018-1L_t&` zl%a+Gwihvr2{ENLQ%b6S#wp9NGxOw`urLjKN=oK~g~k!iIBA^Svj^GHZP4z(q1i5R zWXSTIMr7#P99OJu=a3SyD2ad$*zZrB)ujqi^?{o4D~M!4hj;eK(U7GMR%a|>01K{F zaK#?tS#DZ6awkh~y#;>uGn(*6t<0V-`f`vOr?1uTYUk=fNf3PF1#wxW#s+ZW zyvQF~WugeJyfMxgO`J4X)9kXo>3G=54emUYv*pKaChwY}F*ky3r)YuWP8?<38LPN) z+bm~{8dfxO_OD%oyKcryIw8=_gac$coesrjpi-)WiK&)O=Qr58<>s#hU_BP)jq3n$+{gC0(p%{97_{{MxYOOG8# z6~}+o-S;sw9@}Gk;)y+eB%?_zML?28Hbz20MB;nE3WQj(%7!lhOQbCF0T2ra!YB$t zA!LIh;v`tc1_!^eGx1~W8_(EtZ{Mz}EUHe`>Au%+7c;l}_M__5dHm0*Q>PNlJ+Wvw zu|DMV>X2(Y4V$l>;`PV(sPFIb%TEfdw=51TN?>Y2-uy&TQGL$-Yj?35D9N1=E9B$4 z3hQiy`GJ$={?-EtKBsdcoLOLkN8l2C>`t#4lNG6f6hp|zUYE1eg8SxWjeEXAKdi;b62Q_1DI*-kr>foE z(qI-xS>-7~LwXgJVajM<-?Kb4T)wu8pE}NLSgtwGU;f!}Yyj7HJbe?g+J?g(qeqXCEtCv| zt<;o2NpaD61WPblR#geK&IU97&stQNK_>Sy6U|yHtqz5p$-*J>(nco9q4Bf9z*)Ud zveJbKb>zL1AZd}LBm~grZ6e|EDeXBbK@~)7X$yTDv&@tf*v!Yr>9ww8oAzOgQRCmP ze#;OuH80R0vEED@v`1r`sF>B*WR;bdE>~qqRaMdL3;{(G6~2w-#n)ds!@|yWZVV0o z`QyL&)7E7u4bAd^&7BcU8}_}r$)Df;8)ebsTc?&N@7&U;{yDZjT%Hsfh?oSHQ- zdQ|fLA?BTK2xp8w4%fa}GYUm1wY2N3mljAmq*!Ouy0y&#dEYt> z>s72VKgp9B*>oP$VNT6!c{;26@p>3%hDTi$c7oQHU)HL437iI+$hsAA4MIIW!Y)un z$xGD^OIWTp3!K?F%#RK}V*ST&u=~*!>}W)P?J&1?9g}B|aO}vC^<}uURdJ6VBRi!i z;s&@b2Kq#bd^u}jaE*=ev3@}8ZxPLrFR45s zqs<%59BnFwfs;rxX-Q%pLp9PS>xn#lC3Ehfq4vp?{>Ccf>-U+C>(uZYBg->u%M}0k zid(lDwvI2dYHf@nPbiFMQcrj?t`kGIlw9n%pc*-!53@ih6Q39)L8oMa!!OA_GQz-_ ziBho!B8)U3d%L&Lk!WQ_IiYJ9e05&6Ns@Xp0@fBm37H@WQCg;LEqr=c-oYt1uORz~ z8r6u^F$o=pTLl3LeUt@vZQ)m7FkAPo7_$O zxzFgEFZ1!mn|LM^Wr1zNF4^9?4%~|WD;OwR{^TMF+Vl~Wn8Xj^TsBF1T3QsK z1e&E+y0(GG((F#vF}(G&mpM>B=H0(;QS=SFqepzgfXSW9TqLEAZy`R@r{< za}K<6ly|oK6blt+kCi<7!t&1VuQ2)I0p1;CT2JE|e;1?vfjAOWO?>8KJwS9V09jw* zI@N*a^O17}29KK>oP*wi$GZmK6cm-gSx?#T^?%-V$rOvWUXevTd@GHKwa|mvH^z`H zi3H^YHH33jSyGJ~s-w#sS?=-tYQ?#a@6${hHeXo5?(Fixg>A;;JwAUp=DiDFu~a(7 z)2OY5Sxsb)cp%J}tlLwF68vp_>=m=L1vM=6a2+%-KT#*mTdUuSxQa1P#~JnR{JyL# zMVUycb@i;6L!sLZq?Fxwvenn8&IkX$<0#3Zz%^}kJL5|c=@z{;hm`;GI3cW*eoSi! z^>lMLDQWJ!plW zX9G$IP~K#>TDjp#8Ae%{Axm5X6JkAvqVOTt$%G6_=fDgG!?rn%kTt{BtVVFlQ_38g-eK# zK1>Z-+r%Z-St;8lmJmZBqXez8tm+<>g9bM(@y<{U8m1E;)2$uO6?_eS5Y*R6N*GH3 O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0v$<2K~y+TZBpxR(ohudCNY6AETt`Np|m_! zS}u<%4D1+t$jfb+u#vGBvP~Tc$`mn+Gnp}d&@cYe{>pV^A3Qm^Ilps$=bp#COi~dI zS&U0UE=`tXAt4E{V?iDee(Ir+`WbjPbg7XD{kpw5OzSWzT5u~S1D<4KG(=&`ibR9} zlO?Iqd2e#{2Cg5IPapbcgOe_WXPtI!eQmc^1*9R8G#C^`>i6+APE!)Zz;60~Lm?3TO#;Q>y!3eoj8ZuZujBu}s>)=XaO0erDH$>YvJ=yW8`F z7RXKolq=_#^Tfnivy0ude$?7~$cEfqzuz&!PD_|!qf|iHr9e8`4i zj1JM9EuqSGDq3GH`FuW(<96)gW zw^=`~Zw`9Lqml&=&R#aYpVDrIR~Jv00Q<`cGZbXfVF?e^N$G7XQk_0fW4#QmtmJX- z8ew?GHlZA6hFnB>or_akE!*Y7GuQmwOp*3twSuSfTM~lUapm1nbWU<84OJ&gs8G4`dRRx)NqogX@JRC6#qOLPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0yRlQK~y+TO;TA;8c`I!ZH!5+Z9sMuW>|!Q z89-(0Fo1|KR4su(WKoJsD+wyqVo6EGv`xAs^`$R;ZPGvETmO*{{jL{GZ%$6m`ObIl zS?(oXtI=aIy3B@(A5?%_60(4G})g-=NDyq{YGdm5cGDj0ez2i;K0&NL1 zti~fj&68!FW<{@+<}|7tDQ^_EW~S=enXGmelGZ%N7*&y@TSAo$zayWB-{{Cqi)_lV zjN8@W&QAUO)qc0V16>U`u_&yR1Z?JRRM-~zS|Q)aXF9FM=tbuD)w@p>wWlTz zGqFMUXn%R}H12CJxrKQXkrvE&psJs5M#Y8_`Ss(wnpPmGXc+qXq6g%IDl-n9A!N6{ z47ob#@Npr%uE)o#_R^PUJp{m@)IVd*av*DR?8|U~ zjnlQFB{Urq1%xSy3GCa6aVN#pv!C6z4>JU9mXll}BzR~TBql8FKl^zy-pMD&Gk7?g qD2n3>OoMlC+<{)F1OMD%(*FY|#LY>hfEwHY0000%A_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0jo(wK~y+TZIane!cY)~`wr3#XsM-?ma@eq zMx!wrqlp^?m$(5+K!ajH5)!;HUisdB&6tJ@Z%*d_=bV{urd5h*%{R5Yq1MV#!Bjm% zC3f``5?>sV;w!kjj&bN^e&(~QvO}RGpVAE1TLJA%* zP)Qcw(Nan!3I#e1lbLWPXCM3;Zpf}Fp-0Qq>)OtP$0saVEvJ$PCvwCmnwh($07*qo IM6N<$f)A1RE&u=k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceVert.png b/src/main/resources/assets/rpbase/textures/blocks/alloyFurnaceVert.png new file mode 100644 index 0000000000000000000000000000000000000000..abb68a6abec88bf134d5d7d3224cf6f9314b5c9d GIT binary patch literal 481 zcmV<70UrK|P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0a8gsK~y+TMbXJh17Q#Z;CY8+vZ<38m!JmC z!IK~ef;SNaaS14RiRi(T=nMGXenW*{_^0Wus;hgdyJYpi!zJ>4VYq=N=!j?CF+ zKNL3yO}hh-f^h&S!&<^nz@U(6cW|%l7fCuYA&atQX)`CiZnZP0L19uZ$H@>Ztkxvk zrAfl7PmM}tmaoh=Ey9HI>!qb~M+I`ThKz$|hr&1}2>?xEg>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0y9ZOK~y+TWm3y-+E5haKf0(?MT%6Zk-A{f zMVqEPY+wAqh7z@lc2!y#^EQ|m$F&V6Jd@ynfucZBf3$OBc99Mi$DVs<=A4Pe&raUQ zUq{7!c#F!h@9=!y0(tuCMGQ^r`^Q0uXG)6JJeCYfR9}07e;b=w25dokDmet~%u4WY;Di zw8-XKUKp93qbxi8&b@?nw?vMTrcGh*U5;xR7#LSBHm0z(#GNgzt=ywqc<6|;X69BG zZfYV7Q`25qm^Ao-mL8PTKmZrCd4NJw-drnx?EK17c5VUp9vQkt7L4Gf?2ZB@dq;vQ zXoEuNgj#5Za%vg};0B(CTGIJ(e&1k6HE!M(<~o6U%wSUIFgHvEFuG|R!n`mw%x+re zrgeOSU4qF1hbd#$p_v84KmY4dQWOd-2nF_ei+@7MtF9av61M4UEH;b%Qq$OWPh&$< z!d}A;zq%5T2)Kk-)U7TKt7K^^QGAdiDha9Tl~R2zeQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0#QjsK~y+TWl&jf5@8g*|HDL|DN&lp zN2IFiU@+)(I>llU1mbyKlB9OKJsb{^8HRxd)GeYlh$X4t?{~Z1@p#;5G=jk(#bPno z1M2m9nkJD*K;tIjI1a{>$ppC80-4-yw=BzwqSWhkybk4PG{TUYH+Vqch*q^)U5sS4 zTFqv&!C3}a?e*jVAv)kbhk&-wb*zX^~yA8*=d=Laik3WY-JH zwe3wGXkpe)F>dAJq0IZ8zrP%RJL{sJs!`-hPPlsaq+DFI1Ab7VRj+Fd3KPD zt$Xk0qvLz>t`gNO8Hee|5_0i$@9sjAIGAVPRsOCNwZTJTzmU+bsB(!>ld6 z!Q$sYnTjyD!dHq179(LecwjI<5F-Qm7et^yEMCAKcm#vt0s~~k|5q(or|A!Q*YJAt Sw9ID!0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0%l1>K~y+TWl(EV8bJ`8|B(+U!BVN9Bx;BT z@!&x4;5^|FkOU|wp zEQZ5j0El52Q55s}ye!K&XJ==@0d$4vGsvP?E|(=qYBrn6WO89)f!uC4?nv)LRB1|yM3B9TCMFn4!%VREPq95PTuDHe-qmL?`9#>U1* zM@J_oCk+MzMmL#Edc9t!(;@%%bs>p6meFXW`48i~^J8{{%}1GZa4{XSmE-JI#1h}A=F>aEZshzojc}*9qUP9ZnOAd;tE#tG_x@}J@0tNbC-3PL zmdjrk7w3%Rw!Lpl{Kd8p=woU5Sq(kzi>H$FFylBXET5O`mplA<+1qc2zwPiE0edgw z8FV*Z)bL&1_o4)PHE&-LZe{MV=^H3(4|VRovHGlpuB*IhT&EEp_k*{x_q6C#HkYoq zJxb2m%GhtJT)!P0sQz|Ad-m!+z{d4&2&C__&{sph)Ihhuo|PQ8wY6T2JFj@UTdqMT zbk`8>n``Ls`zZR?(*2$YOMS(U=+%5@l1t4nxC4p-_BL51=Q=5IPpx$fOmkC)i*5e0 zy4uP*>nZ!yj<;KIJ?sbYMFYWf0AnaW9cm!hMf^(wdMt5rg3&r) n4m5!=JRpD*@&9ueb5n*tgUtdMy&D4g00000NkvXXu0mjfx>Ze; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/blocks/projectTableTop.png b/src/main/resources/assets/rpbase/textures/blocks/projectTableTop.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebaeabe4d4c1b4fc437549253fa04b08916e3d2 GIT binary patch literal 545 zcmV++0^a?JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0g_2XK~y+TU6MgdLQxQf&mRzJ6I>AKEfU)F z4_dWq)gs!o7I*r<7M38PfkHinLW(31%t(?*l!6xhx4wDv5EAa2ckawNGjr!&g%F}B zDwRsbV(~yal#ZlR2@E(+J%k`YgDie=94GDeiPVxFq;a|cvlQSY1Ys~3Ko-(|r{nCW zElu(o?`yWF=N-Kk%!AT37u70cE9dNaS*xCYzx6XU3;r5rfRJk-Td$s*!1=a%GEyt2 zenHEwu7Ymz7VUyaup21|c#67=sOg*hkRnHf!c>s7cenT~#k#bADbL z2LWUgfk;3;ET!gCvtX1o=H231cuR;FA6|H*0W6vp22%v!r(z4u1YFI!g158=_ce`D zj0X-YtKb_da04izV!?PiyN1zVDUwZzd9mT3cxixxvSmJgs+#_fb>rgb0VOFNPz^ge zGeUN8-1cLVxQ2XQ`aNfFgyrLMc3dvo)8IW-DwXR-!!@v(2A1V#b2jg-Ua#BZ+j!nA j#^8V}a!d#Uv=G7{=5@S1V^d>F00000NkvXXu0mjfvH;vI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/gui/advbench.png b/src/main/resources/assets/rpbase/textures/gui/advbench.png new file mode 100644 index 0000000000000000000000000000000000000000..67f1ae5c40c77853c090d370606ebf7c00765287 GIT binary patch literal 1595 zcma))4N%f&9LJwOA^ep>DAU!j8BumObGBLe!judT$%OfK)hweIwaYgUG_*8ucT-l8 zo3nMP*tW`9%b2BhX!yVg<~IQ0$;1iMR?SZ5_}9;LyONZ;TPD^$&xSwTUFeSkYB- z>rEo1O43$m z@GaU?9nzJ$sU?PM!!3JtrHsw96p6JDnkz~f$t~U1UYOKP?yuEV$ac&zqjoim*lhN| zi~1=GmBnItX==f>XA>nCE|4R7&17y?R-I}1UZy+qo13Gf=NuaMVhK8L%H-#fE#xAD2o`}tAcInp z|Fl>v_!u@@L3n3Nyz8XK$gqv&f;dmm;^x$`8XtE~-)C z?!-sE@lQe`U5LcB<*ZV(Pa5=J{|F%b4Kj1}rZ72G6=%h2jecDal`=^fk5j#G4hbM{_iEmHLlIoI1CA6MU7CPf? zF8%G?7gtPLBwJSh!g<7N*1QPaghPtxYc=SSg_esv&y@tj4vKdK$6caUX_<4$+7R z06KI}nlAtfQBgp^Ay-hGc+b2Q@9W_P zt@DDaI~^fIocIK~w>!RDP4wV^TvXJ0G4)`={$*$G{VHz9Qr~qH`)JbnE}Chh+{GT}YESECss=~7 zm*sJaH%u>)U$a}W&e7XW6iSwqo!i!~a6D>PpHHjpEo>ecvL!JLggD)t#(q10_KPKw z0nzn0duN|sQzh>6r`mvk&mft-;QnnS8N4vJ;l)sg5f226msyAUFWQWepQ+SuGj&^B z)#J>W&cvU`1yH^a?hanDu+6Rq@ z1XvU8Filpyeb6bN56J16OH9ZELDVZo&TyWj=|+gtgSA{MrxZ1Q9z5%A1@x~~N7*WO z7W;0yux15_>-LAWC@mzlsV~#H+x1;k-2EjTktq$lH3hF$+0{3kIMyHFGX2;1K_U|S zlmA!hhGD)ry;r8_iEeqUF4^b@`Rg;;wf^AWH94(SD;@tQ)Wzgn$?~kNlVr4aGfDWy zkGH)dU}O@XzVYPULEq}Z%T_B{L=bAAA%kZDO}&DBoe5Md=#*nHP#O~(yMqXcCZ*lo z-R(6=TrM&_qJ#6c0(+%5O3<2~I*6KT4zzyC*Gvz=0xq=>E$Efm6g~@BuLw@k=IVo? zic%wGqQ3t_R#n1!U0OjDXL|?5*0+_H^CI63^e2N4)4d`lNc6k@sVI3c-$D{^Ia_ha zL>z;yEYA(B_SrV{(B4oxyqolAD6vvjrAl_OY0_fWoMHalb8Um$ZVgr!I)sa=^pZak zP7roI&nqiOH7N$-Y;U@b+eBJ}ak3i^hnGa?TH!A*5^Rou=z3?3Mjg~7_9n4(F%>(- zDQIv$S|yFbm2IIy_Y05mKDD*cJx>IniZzS`8(`;oort$+i?8P8)3_4KYtS5uDIVL!@P0SPF= zLOMIcpaM5BJ)1d~K2h_uN7@$H8{7DHIhLxxE&1+FZ*+v{M_JvLt|dsFPn7=PqQVFo z;i1u7N2Ufxx0DrzSKn4NC8xwt&|xBN*-#QDE@djI1g<*@2$Vjyh)v;OuH)bXg-;?c zP!yz15Uv(>*4|b;(etDfMc>V)Qa%f&sm^Rs?&;-eUa0xS2m{{RgD^KND>?T&7~B9> zpT&EMjeX$=#ib(eg`f{({-}Kn&jtapKNXx-?e~uJ#H11J=gh%6ER35SG}FFk!kzX@ zS9lSfKN7@dV>`wY)*VQ{UkP?d zUJ32m4Ec2e3=SZ#urOdUEE@XP{+Btv@rU@F^Urt0t$#M-^M^T!5_^K<1slGyOxY2m zSGYIstl{&AmUc^DiD5ASZY0YAMW7v4TXyn4sIfc#v`F)x>a!Wnvx8io%qe#H^QWpn zy75eA;<>+W3o>UZDJ9K&{?*i{R~ux>hL6YQT(UG{s$^r}U{GKHh8hzV2Gauppp5J$ z!4q?yJrC&bb$DiCf81?>cr4=@^#v`x=Fg^_+bDR#7`ImifUa)`2EvO8V7={CX68(e z-8n2p+*oV_IRxyKyEp$>e6Z*{y8pr4{oC)&d45K+?V$BnQN{>=htBeU_o|BL86Q7> zbe=NAAi#xVB7&sc7fnic|A}pbJ)_iB%ZA`@$+n9EYtH-G9>M zE{f1?*DuH?sCJGT}-HvXUhzB6plQ?Sis@H(7<<-BgOA?@rv|fWq~ax+!VG$ zlBrF~XT=3;4?Npq@Vrjjz@O_t6_eMEs%*cPGW^SlN)tJ(X3KwCUP;zAXiwJO5DiYf z3wEEb|MpQ37(896kuotazH&V%v9gqsX=4Xw07Aflbw8uta@&GqjA%6cy>9y{F5M*2F(cx(*q2IMiE^t*5C4*>89{x{hG zSs(v7-sA}|Fwx~9bDkBF5qO!~vkCy5`^P{>%OZrdIvM%ee$=*eb6UyYt)@oJbY+rW zCP)w^ROLp;MLXMx*yZLX;-Dv(ZAocX_qa%DHHN&h-^}mJC8(x{EG9h=z5g&@mW%T~ zSogB*xs^fbe&y2|rk*@f--DZ$OLBgU=S=j!sEw}_kX*skB*JSf#8ird{k=S!NF7kgAv*^Bj9@jQij=@ z^$T7)`o`qS79vpfFNU_Od6V+%#&1{Kfo;2gdsZu}s1*29dp&m7COM-q#`h?Q$y4Hx z5)PhIwUU)qM&PF&&pi!GOK7-~tCibk_Bm`4&*!_&Kv0(R{a>`}8Gp0s%^bjx?m;WU zq@pbb#T{)W0w~c1)Gl!VP{_ci)s?*B7Oai+T3+l)$P3IuMoz(@F5pJ@Ao3ALcNZ-W zuu^#>0&sP6b16+HjhJIxvPg}#dWTW~$G~hf+B&T&km|7O-u5zii4F>2wQ`BoA6!un zUb_vEUfM!os^|0i$wYF}a)BL#;;UG!?Onf2n3V@NI)O{b^Fap?x%Ry8 zR#vW%p)z1PW z6z@u8k2~F-Hu}0x4w^I@0v{RO`_OVbyub;2K_T@lEyqpI22GEvbreMftj_44QHl#=TJ%<0@bV5Nj6B}fVPd1*A9^b9pI)P}r z?u7;~yt6@2c9|-gE2ZtF4VJQm>-<2F^-|F+>@7{drL%kM!WgP+3X8gVwF@m7Y+c^V zV|3ez!g1FYQJPk6_rPN|tkjUcE1|v@{kvtpVpb727%m5EFQ2WWfPGX!e}?ga%+`zX zDYs%21Y;%ifgD*}p*UcdEOB14=#R_kEs0neZF?lLg-j$%Eeq(NAHO{l685Xa`q@JN zr83tNV}M`$91D~H zsfv@I1IzM<(rX-BEX6G5J*}I$BMJ-`PRJH>37J}*JVhxdgr;A%R$5!(+l?udP)b$I zxFsh&l%%MAl4tc?^#;QLM%N5`qq8kQqs*~G0yryA6vDaL#UXIsMs>E&wMjz!o^=Af zIJvpm!|9#|z+Y54bnWPrs11Ku>!DWr+*WcYudD%*q8hD_yUcT8bdV!~>Y%A*eGw4* zJ)R9`G^m}~`sK&MWP6*?;o>8fQMscRyUlm`y8)x!x%C$;?mb$olV$(+iaqjc2mt=&uV4%<>82U9lDF24rb2>Di9Hwzcq;vR6K2y1^)U_|^DTv23{c4MD?$ z!g`X*z|Z{y&}7cu&iMA86ZZzG_{?h70{_R@jro;|iyBQA+MNrJQc*xai%yL*r(N2P zFUTMUjcUo zH^Dj!ha}2_pX-Q<;~yyq$PfyT$q~2|H&np!LFRzd#YV@}b?|+SsdwCL2H|R{?n_X} zby0IxU=tUkW_M}qSK55p;Ufo!qaGkeGoR`1t3}$GP!DpoHMfhJxI!pgdqZ0e=Nn9) z*tP+2?)a{GQgM)c6>TD76!yj^1f62406ee3W+ef5&tX6ARkJcU0htb7zS zU$yz(r88(+RqOZgSiCW-a}Js}E2T549yem(CJeE;NoBx?D*r|dC5xuf*$@_S&3icb zb#P#@0i%R{Rb>6X3MJSiAkfRzz;&?qRT(Le(y5^ybgi_%K}vn;_xowhfq}>4jFnFd z3o3yWwZQGM%&RChlRCa=)Ec|ZI1ubp=W=B>FK^WSFiUU5^bWB1oG5#gsBEWAYQ z6PAgpoa?ikvU6ZmqVS;(3?(hXlxPH`Px@1kg*9G%<1VF>=mwy4*-kscCNB$80`|5s zdP(M-xSnNVhW2aE5N5<*1nGt9ZM0v?-AWpz$m3m~6w~-=D%5fRh8Eyh+#ckt3jXTA z!k*-+8(ShE7x{fF{*5QRp3Cs(w*Nb|5Ybu;>;Vl+OI=ox@ufKrKJaEZo(1IrYMmXT zW02pkB^le?43SomMr1NapPb?2Q+%(N1m_ICxJ0C)puW$t@rdG3#>SZ$60O7G$Mdk8 zP5`-St|Ew1c47OfjzM8wevVF(vE=w4%lETkkqpm77!1BS6r7wQzI}6v*zf{|7U#$oN5J&>a2XG$hI);?87k&`A%%gY$Ozj7!dn%#d~WCLfIjXucf24yG|3l0B8tmA+qSVKn+ zrq4Z|GtF4mcQ$LwnCLrMJ-yxBqD#c10o<(F=Q8FO{aGqtiHMxdex?MsX8l3Fe9ZrZ zt@f-#^v2tLLxTTtkZe`&L0|k{7jloU$R;G9;Y0fRVZ^==Nv@`_Qrjo0rE zQHC6?R4oz1-%5w(ZS6X0#$7|3F^j4tUD+Kwl%kz`>pHhc1p$S&|20?N#v*H6O1(zM z(-S{w2NjQ`W98LG=J(RE)oubQ;@AHSL zI7RR5Q@=V@5-~vSReD`NCkJ0IXYI8NItUQ0=RA+!w|z{p7_gz;qS94-8n?=s4kMMt`sOkURzNE);Z^PQaO99d0W$*$so=-hsS3h8l>>sv7 zCS88yZ4u?;ea695S^8Lty*JATe%8Ug8G`=Hi5hGsz0`KHN(T%Q8dRsnpzD6VbNj&D zn<3?f1y|%rxn*RdQum)&ARC{jr#veV9(a32pBuE#6ddiAjARU~pM$3NrA$=HAfoe- z*66~&=>beHg%1Yqqy`TijUNpU32H}54yW^_xRPSmaxM(?I<~y^^Jc!QG*V9opKu<3 zk#kT%gGeOZe&%DFik1;R{me{wWz5#0Uvg`8+(j%0o|t}V5;{IyW->`LZoD%pSlO+f zRm%0oOgU_I{@)-INnMP0i^F^0KKa7b9q#kZtR9ERJ{_t3>su384+cdVS|6}~sm@+4 z_{a`783daS@3Q8L`V+(Rk3zd#A0U@c5y{Tq#7xK%uup(hr+AGdrAz(eAOY zV{8)^_qNR=n4en{KE#)!67Teo3T&Svup-;6Ys~U5-)(hAqlDnJOTSwF{T$CG~0Y({9oIf*| z+`ti5>I)mh6C>PBKI;Ab&pq4@4=F%3%ZDze1dQSk@!*Qi`IXiI^Ln=0du)z=Dpk2E z>G``;%3s{EjW_Pw*wTF)JnYd8E|@5K^UFVqz~J#$2PcuwmO+O@JV8rR2sJw^kQ@)W z^_yebT6m{`CoVtVWfLwwQ?cLjyZ*Ql)jaTpAxz3fbk!E8*T%lJ1$zx?OxHr-3Mw{Q zGUC#xd@RxrgJ)^L=yaeDIAs90hCE#~#oDjlAD!^+pCAM~{N8aBQxoXYj7ISR9zK5b zD`nYN47qeLBAn#-GL~#r^?s3noDro4E;pGi|2WKRN#!vU<6J&fn~ykHQ3~tsL=Udx zBQFa`!>!VtaBYbFvc)M_nL=z_huM(OuoC70G-_9-iLv%*X*%ygqA%}PNzt@>r3QjEejI5f6{rz7wYU~xQh zeI!{dlD@M_s{j6o`z#hRywaiUY_Oj(fm`J8owyYug)F5c^v;pxmQKWLoRCEz9J!BEfG}U+_gSLb9SMk{0G-AVC1Z|e)Jed=Da}nmHjtMy zH8$atF{ExO^6RldNuTvJ%%TwhFVVU@S`*`UoNtLfa+9{Vk; zPq$gwstb=1pHdqHXQDh>Qhq|e`zHG^+bipzO=scFhPJ@nA6Za%-8|)7$_O{VRDlf{ zqNzm4pBZ(nyWN#8Aa*!+5WJYlaG9jlxy=UMKwOntu%6yc0h21e>ZtMjYKQ5fHh~3IC+G1z6*wvRU}F=?X^$o-P?o zEn9mdnz|L=DVt69^TQgyG5O1QTy@y67B_biM6Th-T~gqgXr!&fQ+zGlAbRUfcYxTH zfk2PDP20p+i{aJoq+OvW{4-HrGxmwI^3etvrcg120Xy7;-tYp*MkKI?lkz`ChEC-ru(-XUzA_7S`ADb+1lzGT6CFZ!;F zlR(L-MwjfEdg5w7QOhi;1_E67j61mW7pDgfaoW0(A>-y8*1uf0y`m;7#b0t)_>c9@ zr;!9aEe-TZb71sW0+0|_`6zNMH!!l>4pt}QUR50&bb2T{@q^=8ec5`O%*5 z?p`<14b*|9!?M1hs$Ov1`Hi?Du!-+1G2Mv!goNC#O~Cys!Y6EQRYzw z9Mfdj$w0m)rpkc;wSS^9ReXSG!2fYXJIOaBaC{Cx0F;!V5qmd;`TbC?fS^CkY>;Hj w#GII$#`Ijr>~YN8F8}c_+5dZsw(dM)Pm|%()f)!H{g({`T~nR1dyX&u2UrUadH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/bag/0.png b/src/main/resources/assets/rpbase/textures/items/bag/0.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1635f6d29ca87c309609f27fc3be44c6812ddd GIT binary patch literal 628 zcmV-)0*n2LP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0p&?VK~y+TrPA+9Q&AkpasLmAzzmrzMbp$2 z7ZwT?3rdYBpHvz(96iV~LAP?$oRrg&O_RHvS-81Sw~AE`(tZjB1s0``3i8i*cfSXA z@v@6SJ^0*nFNg2ze9yTj&*kv^SJdOHhks5EP+M6{qoW)d%j`SYJZBXXVB5Kkc*M`o z)eNbJLmWF)$C(pNY82E8Gy$^e`}8EgzAdrw{S}$HJ0!GT(y<_OlYVaYo>!e&0(&cL zYL)tGJ5OiB{MLb3xQn9=`9yBJc#{e>~4tZ4v*=-m=78wn66Pxhy?wQ8R*I}NwZMlb-{g9OJ zDny{FvLgKY#gW2`=Z;faTtKU{-gJPH9AI-C`dyGB0j=gGTLOO%d4B+JOg`tLjI$&F O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0l7&;K~y+TrIO!ElW`QrAKLIAFb%UL3<{+f z)nK$$i@_q-+S*nd*3?vn7pvi&-VGtBE`r@ecr&5s!i_ecn zGBcQ$S#%81dQn}J6)DKm2R@TZYMgb0t{yNcn`j-Nssqp}zx)eoQlQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0ia1lK~y+TrIN=>13?(Y-!V5YM(i!tC=nu- zL$FH(8!E9RL@}-<1_c|4pa~*kIoJ-CgYDu$@Zw!i{|En_=X?WMvSd-v!`s=}+4uY2 zH#3N}#{VV#_=@w-N&^(aO&7eBF$XTDuGz@~aH4>tIN%E27{m$P@X-su9tCO#v;d^4 zfd{VQgX?(bLdFGWo!gvtoN`=&yAajMYykzR)>Vp7%Mh-(rT~U>gPrAh3}?nTqrOex zkj3!W11iv{Vjr^&5mupDgMy9(gPC*ecPz3T4Z46wwUmo86Ji3gP{dh0s_35_#1@+n z&;~I|Y&Y6ij{$aIj#A75kofH|xQtf~h~kM;IM;~+*rOjy^dY3pW7wzsZvm8`j>Cv6 zPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Z~arK~y+TrP94iLQx#X@iW#GL`@<=8KFo* zku*fLxwVBuv_uFcwFwcF5)r)&y$xAIR!c+B(jHjnW2s{i5*Usd~O9RbE<7^a}-n2mndO)S8eB*QV@agI3@T2F;`208&+^${Ov+QETq zn;hP={e2hA6}*8=EF=gpCe5H#vZ$j;am7xLCv0M<-1_VUlRpLI8P2eVS!7wcMsbPf zCi59+0c|N2ghT>H7@qKnT`WTdD%92%v4j%x@c_U5b-Y0V&$xm*I>Z)MpyDH>-GCf# zn!TVM@QMa*pnv2P>g*Oe6Tb_mgFEyJs6YYgt`G)zFF_aD#sj(qY@-Hs;BO-c2t#(D zec$5}x&sH;ht6OX&LOrZen^TzK@-r$QDG6Im`8Yk-tXOjDF0HaC>JY=>KX7mYrX+r W*0o(B%*gcs0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0bNN%K~y+TrIP7R0znXjJ1)VK8)01pJfaBk zh~fy%YYmh5IXnCOpUn9TIo)irBh#fW?AzJ&by5m~}E35iCfR=cxdn#k$Zb8+=+8XxQ>FJ$ zkmvm4rn7!sGaMCMfeI^h7wot^x*S8zVgT7cW9M1h0bW~%0mo2~3iZ5dI4QZ}d+wt- zEC8D8rtS(ufM63k8a511glRlEQx*y{bP;nf;N?|-t6c|>JB_mh=uhZk%0fM58sLJX z^m!-xoJ&9mxnvj3EyyzqrCaU=R|d)=5n{NJ^tB08;;K$6JTCGpPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Y*tgK~y+TrPA9Ko z%Ff&p^qg^)ohy-4apj~hAiZ^Ey591bf0}J6=jMc%K!T>kV zq;^@rB?yQ*fmNzwR&JHdT`{JR=%;{XCfnG?3J40@ft8yj3mbHxd2O(c*+Ix4V2X)5 zyyE~Bs6d5!wKZ&__BECZ@a^y51qygX2Rg_mcCiH&pMv%IfJFw6@Ps7b8TaVo0(!lD zTtkN$caiTvi$?`Cpa6Bp^`-&-OVWi3b(KW{dpL$Vh+iWONJF%X-uni+P8FZv5IO^$ z#qc2}Kl}h!Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0ZU0lK~y+TrP5DJ0znwZ@g*a=bHhWrCSte?c%h)TOAG(%YH7KWSu_9Te*Dah;uge)G)i zdWGrYzqEe7i{{Tl0V&TjIw`5Xw^r2;0yJEK2wfG zOtn8^E*P&v&o~2;OlXxf%J{@3#S4iZa}@10cN$|1&VWfKO2}gh3OZ-yeTuiaPB7L2 z^B6`bV33Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0a8gsK~y+TrIJf>gD?<8y)a+%lLUy5U3RLn z$qBN|fpQ4nGS}%$PYMEoa;lO=gCwLk-GdJAZ})#mA0K!8SsOqU21w!%e22ji%Wr#H z0fOTZjWZYrkG3{QlL*-<(Kn%cz!iX1ySB!8=tLgZi^ucT$+$)%z^csE*)CwR9!CM% z#wy_HV)6PC;5J$TTXhvj;XWXVBi&FInOY|3JUHCW2CdB%PMy*OVfYcsHF1Pw+iUH8eU@1QR6C@Do2r@^f2ekJ}7{>YN6bhg_#+d;e%q}DbH|+u>N^K?5;&;w~ z31UsDIj2e#=Y+EdrSxLc#A!nDwh_b%ti*$CAlLaPmJOsffTegBcPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0lG;Ot2wwBMm`~hL|5nqY-8cEh8icqcj4;21-(K5fs!SS{3M@@p#XL zdGTdlM##l;@B7}%`JLySb4kQg`;uRNrS#v*1Dv5kXQ`3x)g0FDyC{VKUD!=zZ*0P7y?+<4PNLUU$o6a1XOV!@l>00VRO$my zwdDZwCB3>(c0e=534L{E?-*8`W6^*XPHKr!rD)fA>O3eD>(f+mr_!-oI>!m0pv{$Z zoFf4w090~Fo6I`vtD5Gny1DEFEU@0$zC@#L(y9SEWywN-Q_g-r9s0wP2YhEvpO|os z9MwDn8soO^aLorVFeocG1Zbj4FG=YKnE>#cH~PkmR+-eYo5&&~-q{*c8YU6A@Bky4 zgDlSq0w(G80CQ*K4FL9$bMe!avBC35K$>p7qR%_Xl@S1PkS8R4-Rn$ig>ii(t=Bxz zEcbm6l3dSkV(!OO<3?nlT8?VSJsb<{;i{@A)fE~-4K(Eeb}R1Qf(02c>fTfku(!kx X*b4mw2(k4J00000NkvXXu0mjfKwtP2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/bag/3.png b/src/main/resources/assets/rpbase/textures/items/bag/3.png new file mode 100644 index 0000000000000000000000000000000000000000..3048c21c12873c6f45fbbb750255f598cf50fcbe GIT binary patch literal 598 zcmV-c0;&CpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0mn&1K~y+TrIJ}o0$~(}`wLN4YO6|;Ekc`Z zrX*9AHchUKW|_25rguUFr9_0)McYNoMcYjmK{wq8)qm*kynW{bhX#j&x_IZC;p05- zd(N4Pv@8EF@yBN#e^wblZ?vJYxf^uqYRve4rzI7jvZ?`Isfc9y75?Bc%&jA^bx!b; zpjto`fLz0gdn7mBk;=Rwo;*iP-bP41fp4~mLDw2jrU}p++PI6Mz5~;dODr;g9L>Sq zYeaB1jbQAOK@MPS=+Xu>oBH7o9HD#Ch@L%s!}H6`;P+4#Ag)oO)6KbIZ?&F5Dt0UqB2W!xuP&$Ge44{0c*^ zw331Yh)4+}`T9qITgY($rK9yK0D38r*|Pt?eH1&I1=SUEPar4Y()gB)mxd<8ZWf>Mp3OZu}zGs21qIce3y~^ k3sgivt$WgsfZv6RFPsPT%bECnng9R*07*qoM6N<$g5D_j*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/bag/4.png b/src/main/resources/assets/rpbase/textures/items/bag/4.png new file mode 100644 index 0000000000000000000000000000000000000000..691e713a8419ad8f459e255d7385bac559f4f2f4 GIT binary patch literal 563 zcmV-30?hr1P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0i;PpK~y+TrIJ}I#ZeT+SN`%%Br=36V{Rc2 zh(b#7BzX{dkl}$#l%ePq03>=?KHSN1$MP)XQqG@i_Vgs1a2;YZwlZXF<6)p#L50(9cN6+4O*NqINBXddxycCOr4;t7_>zDAYMRZ7Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0bNN%K~y+TrP9qSL{S{Z@sm5L+1gICloCoq zk;N3UQC2nkZ!U?yTXg z-jaFG;swv#F10z(Co;fw(5P9uZ~_97o1Ue5>nyPxGj~aC58Xcn^wW5NX$*j%c+RuL zV$9-MR?tUH6AYuR98wNwqTv=FSj8ALKm)b4A&g=cOcn}oDT*_Ah63(!ibHH;0h7?+ zJlJkHpoii*9#9N;#2qehjD4)&3iAk7@fDy0)C$f~D_{u<(CWC}Qh@(bT*VV~l~Dm% zY(OgrwowWwg=m%>uA%EJU<+%|8BC%25Q~5OLMt5<)DC?(8aR$-=q4%-(C=RzP|5$O iG>E{ccBvWgJ9D20wZCa3$#--B0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0oO@HK~y+TrIO1_8&MR-{SV?ZQKOAwKqYFJ zs7cIg#z~BmI5AOU1QCiYT?yi@-338V7eY27ZWNR*R0LlLin={u!V5 zT*>H=!9u(E?t{zuo$s7;izdYEe~B+Yv-oEf0Q?mdh*njBcA=ycZ{Lih12mgV*a}7P zEBz4%-3o?kKj3qNo$mxS0_p&i^*T0y-|2BY4UgljKY{H&2}epCJ7NU0LML}-2=JA^ zSPz-aI1H=!!vLGH00spURwG_q^s3mEdLWuD#sJl7#l93pwpBpVTEjtGvW#W96FIL3 z@oFniFjj9zN9k)R8lc5gj2mYEDf0;{T|rDXId}jC2AJ)%tqx!8jhJz^gOce0UCjP; zn+uPrQ4Y9M(>RU9SRAY-%X8b~Styp_oQ0tFG!=$-T~;O|1wGfYVP4*~wC1poj507*qoM6N<$g7`%I AZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/bag/7.png b/src/main/resources/assets/rpbase/textures/items/bag/7.png new file mode 100644 index 0000000000000000000000000000000000000000..7646c863569153ee44d98e6f4d6165f5ac9e94be GIT binary patch literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0gFjQK~y+TrIP7xf>02J{aY*UYqiFOh>DcO z4M9c4rP01gAHuin>zv-11R|B#r2TQYm%w~;W=VW{*MEs0UswEDcYs1JjY=sCI$)To&jyQA@j0J;P&4m*cO83)i+88dUp4uUd5Kmai`1@o~gAY-g- z9V-z$w}uR-9w>72zKOvLDJw=qpnO*1#i2mC(?CXSVWU=zG>~)$xK&B)0tNkCo?ATx c{4ONE0hsi>bP#OK(*OVf07*qoM6N<$g3=kPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0kcU&K~y+TrIPDT!axv(eFQaNKtw_DLKK5H zq8P0PODrIupcSDiP${O0Rqz%R5)H5D>l{04Xl!US(I2O~&E$M@c6R$zuKh2u&qo`7 zRu5o&%z+u78?=r%ZTMcZk_q6j51?E~;;mUj_51+A*$J#I`PoWPE1(HLUF)iZ_ZJPF z*BjicA~ab*t&+usltglOgC(;Bct^jY`#erumX8^rR^-8l`k|a`;jVg&ij;!S>#_#S zO^-o2OGAjPVt&TMK#CNHEN(zdahTQX)LBLUC1WdqP^$auUiKvP7h#RDj(Y2-6eHj9+7X{7i{pc5%Ut&;l@Af_V>KPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0i#JoK~y+TrIN`jgmD;|NN^^l40@$Y7nO0z>b-0;05@$<;M0U~- zfTB!dWr%32A&RpU$TH`lb)cRWZxd0Np#zkOl#=Wr$Oj-ck~mu;UapBiH&Iuv9i*d7 z&6!VBJBhA(%3uZn(uDkuTH^jt1FqJIol#;{D4OjfJS{{^m39vHQ>JSK&iK*$-G=_SV9x(2P)-;4OZQ3r{3Do{$S9vtb| zP(j2;iB9Ah3aH+H1$;I&RMJTR&F-az1^jNrEB6WaF)A?qqW}N^07*qoM6N<$g7kXq AEC2ui literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/bouleSilicon.png b/src/main/resources/assets/rpbase/textures/items/bouleSilicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9d986ed5f6c39f3811770a0ac6c7b90d91280634 GIT binary patch literal 548 zcmV+<0^9wGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0hLKaK~y+TrP57H8&MR-aleLWGLua2%w+D& zRH}Km22q-XYF(6ehOiP^nb7{&vmQ z^DSIC85skF2(!Fov)~%^_Fr=IbI6CIQ(RXNGu1I<3@~Mk&Q6zSYx8^>w7B_k!uQWT z^7%ZD>-YnPGf!cyj^#Y!-PIR<{r*Gm>?0eEHkuIti0TIB++#Ai5~*C7jTgtn7pu%A zmI*~7{(!2fJXy)Jl3nF&?=7!eZ+L%r#s2OqG@%9PKtzezF)V4J8#?Qyb(+m4nZ*pr zbkZNt9%vMw7Lm53R;w}mI^^==l4`ArFm->xdpVs=<9#IQ+9a|`+TAww%{qy6B0vYX zbH2`vxQHdzbgl7naL!*L1u`n7bdJ79v_yb<1XQxMq5>?PG m9bM`unle`GWg-wfO#K5`9RdnKAVCxW0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0ai&wK~y+TrI9gf!cY*${RBb=g9su>;*iM> zLMep~5-3t>DH61{h=?{pIw-ABY7nPV4d^Nq`+c0HWA^Os|9S_$=Cy$q4gA98^6vNU z-HUb4MhC&K&k^=U5~R~<{D(*Z{dns4(RCb{rumEWEz89MW7m}=ETBZaR>R!$P$(24 zp<=UG#7(t|2iq1BA(&04$mMd8R4og$$ppz{61uK)ECduh4+gL*6{xBj3AIhd_1il% zTOBkT4OuW64w21f5d;CV*=%s%=?DR}Zx{yNmmkdQn}-*7%n}wn_IfPveV+yE^_nHC z)rtkwvZiUcy0!$Zw(~8ZBhbR5d>-_KC6uQP;_*0AsT7V+PURs|K)3B(d9V-YJTmBwQ>66i|}xIg`oo#D9`VBv=wImIOP=UxbSZNw5zG b3K07Ot%2meF!iyL00000NkvXXu0mjf^SZ*w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/canvas.png b/src/main/resources/assets/rpbase/textures/items/canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3847e5c3d88a9d18f521bc2612ab8531359af2 GIT binary patch literal 431 zcmV;g0Z{&lP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0U$|4K~y+TW5~9zrwD_IYxV!}VjEq7|DI-| z|3PdJts%z^W`i(M27okW_{o6{=}cEA%>Y|#^Z$qTZo#SbZAK#pgSOWfR? z;F@vS4#IF3z%;|+8DtyCR(!U@4FG8XVUPfbhQ%|;R*+^~wu3O-3%D>o%^*zB0Q~qr Z0|4RzI-X#@*RcQq002ovPDHLkV1gGwwBY~% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/copperCoil.png b/src/main/resources/assets/rpbase/textures/items/copperCoil.png new file mode 100644 index 0000000000000000000000000000000000000000..025b2f42f95cc9ce3f77e870312e661163017742 GIT binary patch literal 616 zcmV-u0+;=XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0oh4JK~y+TrIOo9TR|9wXU78b1G{(?0 ztwuDS8sn*{Him3lPa#p%h$s@g@I*^Nzob7mCH%7<1#w-`euZzBMJ#QM zVoD6BFBImz4s13n?6oQQm9hgSlik{E#iq8_QXrVgR_Y8iIuyn#f39N!wE=kQzsJty zU*Wl-z}9H4mwAI!?UHrYW1!Gt*a56=_0Eye<5I2YQwVyTXcePJ0E7(7e~rBms0wD2M<;k9W`Z(a1L3L%2{>UJgfPXMnI43_PHcD7BHrlM{nN}u zNm&PET?U}|`Uv6ON1_3k&0d7>jqE#8<3dQl*8Va8#p|4wr#qSIMvuP^`I-uB_-m1n zRwf$UHZxTQuoN8+>E}Bz{1o9{pPoOq?~j1L6Vwm%uiP9-8xG$900000#LT=By}Z;C1rt33 zJ=4@yqg0@psh%#5Ar}705>^U#eE!&TIPW~dI73a~-h|cc$5?nBuYdXfb=Cj%VLJ{Q zhBgTe~DWM4fRCr+2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/diamondDrawplate.png b/src/main/resources/assets/rpbase/textures/items/diamondDrawplate.png new file mode 100644 index 0000000000000000000000000000000000000000..41dcbc1d48bf505d1afd069b12c54b81dea1ef0b GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pPo6H0Ar}70C$_C$&e7bN{q_ID2v^sy_8i@v-hbT1j<*`}6cm*Fn!hFM zUOlU;>LQ+lSqHwX_y4EAr~2o9BSF1`1_w^uc=G?>`uzXR2iEMK&LP!wm0*%~e>On=(<$AkVUJ+-WTUr~yT9PKHr8r*^ z`zn;qz~SwA`j7eC%e>|;&)*#TA5|?boX^0~%)|IocFD}pAReD&Z)po&hQtYqU9zbO zXQf^*pPUDh51e`ZXZ*^IANH@AWAl=&!Qh0z$}K1U3rz}oBFS(_;kKp`gZ01j3=BGf W0^1pFE>r@2&*16m=d#Wzp$P!Ijg>?I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/dustSilver.png b/src/main/resources/assets/rpbase/textures/items/dustSilver.png new file mode 100644 index 0000000000000000000000000000000000000000..804ca21b2f983a8a74ecd5fefd5fb0f1ed17c663 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rZRfEIEGmGZ=D#K)#@PNdjH&}1v-aZSMjI26wYhs|G4~6W`I(z+{4zI zn77AvEzg_Uf1dxbe^CE&#r&858P~n;%Dr9mop&!w#XR-H1{$f6W!ygn1y~y2{MLJH z;U&>#w{)2t8C0*I3vP*z#~2AN~x}EpvS!D zla{^Y+{rMbGB!Nb>CWtBfr~>zm-eVIad!wSY14(?pr zbAzo9@Jv~%=DEmW24g0Ji=x0Y))q;Dl?ETT>AbFEZ`Vked4`iiIo9%cVa=?Ix(@{Q r^F)ZaPCr|J-TOd(3DdplAAc|fy0uT;*Hr5b3^4{zS3j3^P6!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~GmH$NGusL9jC zF~q|E?u6aEM->EEI6YQ0^r&St|GWM1vO<4J<5}ZQ=Ji{gYRd9lf9)tb$8NX1TIojh z{CjNz63J%@vfr-QYS(_`q|^cB6QL0fnyK4%wH74i`jm#9%h{0gsHFKKTjoZV0#60A zPKH`e2d52*%O5?J*N}6W@a<2{w|KT~&HCC)<&PPZ&ie7`Q#jBy44$rjF6*2UngA|F BU4#Gt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/dyeIndigo.png b/src/main/resources/assets/rpbase/textures/items/dyeIndigo.png new file mode 100644 index 0000000000000000000000000000000000000000..0b43aedf7556ad2bcef339ec3d4ec57110ff524c GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pK2I0N5DWk06Wi7==Vm4(D0A+CdNziQ X+ZbXeD|&PRUB=+)>gTe~DWM4fDg<9Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/fineCopper.png b/src/main/resources/assets/rpbase/textures/items/fineCopper.png new file mode 100644 index 0000000000000000000000000000000000000000..4c749ce856ac488dcad30d32029bf738754b90cd GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wPM$7~Ar}70C$_C$&e7bN{q_ID8)weE*}re!zxotI0WmSLf9qGS>{RSa zVh|UcH4*l6-u?Vv?PPj#hn+k2z&eJDUpGcctZR^FxWsTtLtno? ziQ&vog{stE)(AdJ8H1Pw>(=p^Gl)!BAGV{>^iakG84sD|j0QZ$3{OfXa8KCVaFunz zfyPSamWj-QV#4o^CGB7qY)M?#z$#K@(!>)Q5YUi)EE8zr3C@+ek@9+dmli?&EIln8cp$)RZ{Et;AJ<$4F$hMH}OihyQsPa0#LT=By}Z;C1rt33 zJ=4@yqg0@w_MR?|Ar}70C$_C$&e7bN{q_ID8)weE*}re!zxotI0WmSLf9qGS>{RSa zVh|UmdKI;Vst0Q`)u ABme*a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/greenSapphire.png b/src/main/resources/assets/rpbase/textures/items/greenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..3d042d3e7571db2d729d761a4113ee21b2761322 GIT binary patch literal 487 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0a!^yK~y+TV;F{jQH$X}J`7cc9e@<Q^&52mGgSdK20(E5;xOEXfFusSI{1I?% zj-MC%-(!~B|A^&S3;_x3zPkJW%v&@5mz^#BKkxOt{~hl;{x^JS_@8$q7mO$0nDjq> zdF+4teK!A%XBnUx0^-!nsrer@GxC4$jqd*wuTJ=%cRcrh{yCs#APqL))};SEH@f~C z&oTJ#Fy9W-favz9|KbH=|9g%B4Y)M{p?O#C|Dqd(K=H2s{rmg=8#NgGXDUVuP!Pwv z&ig-e6T^R&)eK-4Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Zd6mK~y+T)sH(!13?r;U%=LMR>mTr2=Rj` zDw@gKcSZdQkrISp*mbw-!DSI(+aU;XrezhK5g{vEi05dsjl;@e^83 zUeIvl{vm1VFp#>4UA$_Dsn59xUqgrIXz>f7t8Yl=(j(zvVhQp462^<4=skPW!+|_7 zRCw3jillE0G8#9XX>3;#wYhdTrzIRB(0%g@nprnJbpT1EA^W%HtOe@%LFXL7Rdt~x zl5`*gQKAHOb`VHsA@iF?vbY6t@)ejH2{4lh(b zQ;_XFBk*puAc1HM($)_NN6N4*uY>{%csJSnTa@s5R$#Yqqwk`G5aB8*ksn441D^0#LT=By}Z;C1rt33 zJ=4@yqg0@p1)eUBAr}705>^V99bfG^oOd2!oS`OQx35RKhf}I)-OKl@|NgI!f6|`3 zrY+%e%Q`{H#S%S#UXW~>P-neNO@fVGiKBt%=DrEiIRYmb7MUz$ ro}s9~+;Odi&!KI?n#=}9W@ZNAAY;|WLPHLqTNylE{an^LB{Ts5LQZ5X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/ingotRed.png b/src/main/resources/assets/rpbase/textures/items/ingotRed.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4c94dcba09570b529383fe9533e2d689b46a85 GIT binary patch literal 438 zcmV;n0ZIOeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0VhdBK~y+T)sHbtLSYn!KfzTuCl#D8Mi7|j zmbk=qYY;?QoEnN8!lgOsFSND>4gG=$`U8y(5|z-*1~0%tXF>?{s4Kpk1E#iMrSzL7Q(1g)Btd z)EkW-(lJrLB2)5U=NO>t-xiCQ5`|olJ>pv=XjnX1KOzGX1M~~$`8=+3Ih^pUkW+F` zT-HVj;=uYL`3{(nGjd53u)Nhp2`OojghbhEIYa?2sO!2Kc1&3N2bZe?^J zG%heMF*h@ApJM<30W3*GK~y+T)sHc&f?yPe`vE42C?QH|1VSL9xG2=n+9X7igDovB zAq_3=LI1!X`(ECYpSMdxcf9w&%lSS%&vSJ2f66pXOePcb*WVQZhVbch!hXO1Ea8Bz z>jE`RgRbjvzu!@oCF;7y;c$4D5McP?cDo70aO3fKl<-VpRaMCI{9D3<=XrQM9%$PZ z=kr;Hce@>~*Q<0TvMdX(>q=+F<1u9Wdc772hX`CQmmiSt`_j`iMHq(IY&LQp1l#Qv zNs@>piXu#>(_sq%4l|r%pU>xT9Oo(EFRWH8WLbtF2t=}6E>RT40COV&W;UBir(_T; z77H1U<5&c*TNOyawrv=O0Zr4Mu&P%H1qyiGq|zhrMF~Go3Dg#D>_m~kN$j( ZMqdac%jU(h`Pu*g002ovPDHLkV1f;ythE3D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/0.png b/src/main/resources/assets/rpbase/textures/items/lumar/0.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1ddfd20518c2b03388047e7699194a0a644d9f GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@prJgR1Ar}5;`!@2jDDtqZ>}p{000NGTW-E=>2|^kTUK$OT7kxj?Xm#)A z`YlchX*pl-&n(vaQaqLQfkbk+j^Yi8&DxU+c5L02wRXR^#hvQ=1?MV{O1z(RIc3$g zU$I3^hLY-Lj6GHF&kN}>gn0e*b7xHE&VC!)plKqhzV`i`Xw9XY86FCW1aKsBGhY5J vxNJg8x5W>x;17-678R|P90JXoG`=#dzZ|jFog@DT(7_Czu6{1-oD!M<17U2D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/1.png b/src/main/resources/assets/rpbase/textures/items/lumar/1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1cae36ce58d9caee320a0bd7bfef29f92a843a GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pOP(%{Ar}705_cZl`#0~u0?*S)Yz|WXKD~eIlgf-X+X!#2q_Q&&z2rfWQ3 zjeU$yqzUjAae5eY+&?@EpHWgF7Xt#t~9yAu)y4qmw`>lLnwv& z3{ZLTzE+*X_2r^Y_ZoIFwK&d_5m97oGC6!?V^$mE48`MWZih@2vX2y4nK1-07<2SA qGO}%+x*#ou;j+Ufw@VDn%nTe6jJ69MS3U&#j=|H_&t;ucLK6U$W_B(B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/10.png b/src/main/resources/assets/rpbase/textures/items/lumar/10.png new file mode 100644 index 0000000000000000000000000000000000000000..60e56e3bb66035240551153eedb73fea4cfe1d1a GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p8=fwXAr}5;C-`z5G7xCJuUMko)uFxcb`!Ta7wbXk6&y|3{SUnaU0nPh z2UT&c7y8*0thCntrsW5Z*=N4rQ~C9N*SmLow)Ky>KI}MgH+Aaq*$i{0?Od(>vCC*< z$^oBf^GnC-<)7KlX!+oh&aXaeXP?pj?}b8q861;+O~2aB-jG;sHX|iWjnPe)w}yYO zzFMMHz^c-TeGM}gExhu*;Or#E{v(Q-)6Qf)HosaP+gp47cJ>VsjumScnzL;C>viLl z&$r9bj4cV7Usf$T*dxH7wle`j1NxD{)78&qol`;+03Y>= A(EtDd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/11.png b/src/main/resources/assets/rpbase/textures/items/lumar/11.png new file mode 100644 index 0000000000000000000000000000000000000000..fb13ab67652fed44fc622fc1c602c8c7d70b0c58 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pYo0ESAr}5;C;0L;8Hlv()=+I>c&<>G{pe6DxA6N1vwjFGZ7+Dr7*i;F zIk;l#D;t?0=B~RxCwVTcy?-YAYJK?ad$M1C@oG05Z!YysKJ3eIWov2Fc^5}DAGR6K z#iysH|Gf9U&fw$2MLW3Ws6>k&fBn+4pn=VP=A~VK@|t+>%`}*_F-hpa1Vitaj_+r8 z&gawc^{=(MvUIv$*RxB_*?c@7JS<$eCT}dNNftX_s%$I2{-EXpzNk*cgm?XibY_KI yUCUlmVDKwqVWXRXT+hnM8{%1-4sHl~#rXWk*Y52l9kYQxWbkzLb6Mw<&;$Sv&x{8E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/12.png b/src/main/resources/assets/rpbase/textures/items/lumar/12.png new file mode 100644 index 0000000000000000000000000000000000000000..db988412fcfdde51a85f2672e57ccf1f37234f7b GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pvz{)FAr}5;C*0+7bQEcQKIzYt;=&f?aJ|^mz27HH`NS|O=sD|@fP069 zD|S6J7F%4Lb!Kkt>dd-*TffPDzF)d~o=#QnW3CT7VsCiw>oRAwct6c-<*en4e5UYN zoa~YPKIdejG5_ozA4(oPNKDGP_Gh86Ud01-@3meBTA0u3%t#5dVsx9k%lP5j>7DcW zOuX!0a?H@XG|M>QOcUe$BdVHSX`#R0vfttFU8pAzu>B!VV`&`M>Xc3K=kGP}i$&>c p%bno(nCQiOsE)IP?eVD@*34_}?+AOjvjFHZ22WQ%mvv4FO#uGGh&%uQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/13.png b/src/main/resources/assets/rpbase/textures/items/lumar/13.png new file mode 100644 index 0000000000000000000000000000000000000000..db755eabb018df5f3fe80081dfc5484e4acc420d GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p^PVn_Ar}5;C*0*cWFXS&{O6|AFO?334sMG^W|566Tm{lUo|SdsYO1yf zIdk%?Cg<8Cdnz9a&3f|tobT28>u+mKGycyEXLy~Ker~;0Jkx_Occf!Au15-~G0Vv3 zhAUaxY|HdyiD!{pH&s%neg+Hs4gs~zUsV(jvfcNQIO&(5&iJNEPv}msO5mE=h&@2`^~StSmNg&)SSbitnb1xJ?n$rWwmEQ=xxLqp pS-{aNf9#5ij96oi!TKq`7<7+4RyK?L@)YPb22WQ%mvv4FO#nH(enJ2M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/14.png b/src/main/resources/assets/rpbase/textures/items/lumar/14.png new file mode 100644 index 0000000000000000000000000000000000000000..c74eeb1ff236c26f988a81b718088d3d9020d2a6 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pE1oWnAr}5;C-`z5G7xE5ohw@Jr?{h7k)!E>ppBDYpeBc2%+7CIdbS-3 zN)?>%g@13A?c5@<>GQz}W|jBPcsKoDcl~Kjz|Ys=4c|*r=l#BNpXI^E+cOexoOqhL zDCI!1zEOMLl=}PIytjAq&i_@&r+;hV%%i^FRb(zCsCzf(ykE{Ky=!yAq{x{p624x- zRr`J3lq^^hd_c$`xM$I!hU_q&3Kc%jK%>>ibP0l+XkKt{#Ry literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/15.png b/src/main/resources/assets/rpbase/textures/items/lumar/15.png new file mode 100644 index 0000000000000000000000000000000000000000..aebde3f6ae37f6cd844920fab81c3358d6aa82eb GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p&7LlfAr}5;CpdB)RuFO7JXvGM38x}=&tRr`CzGS*l{Dqv>e^i=;qztx z%=MS+!_Vzp@cexQDmq7_gOsu zHMzjSdG;N@50_hb??wuoT;s#kvu5ko_Iu)!zkf-M^iy8)rE=cuQ>OZCHbU)7G-gh< z1oI*fNMZ-)U+&xg;Ct Od0#LT=By}Z;C1rt33 zJ=4@yqg0@pyPhtNAr}5;C!FPMb`WT_mE>)7m?XurzKQ){a{~9b1dc`rt`A9!ViVnt zq^#aBiw5&*_8ji5vZ%erj`g zHrQ_4WNGr{&mNvKVc~avvInoOo8%gCLtQb#bjHawC;IDV3#=(mlQ?N%$eEzQz3HUO z*SZ-qUN*d{wO#JqVCcHZQ;m7+vqKEiTjqN_OqpX-C$(hLooSN~UN`+BBCx>b%t--* z`uNtJH0#LT=By}Z;C1rt33 zJ=4@yqg0@pyPhtNAr}705_cYaSo!_Gqr@py-UgF%v4t=HFDjkxVa~E7@!u=&|Ef>V z9Gs!zoM6^$!lt(7|9k1pGH2%P?cs2qVA`JkhB@18qxO&W>*T#|s48$yU`m;t7~ynG zV!xsSjKz{B{2Xpxp*f~i7& zk^}>n$^?}YVl&PvNIk1@E&cv~R@=k`Q;WTf#jG67CM#dDH1M)ywsj_7_KhnWfgWY>boFyt=akR{ E070#LT=By}Z;C1rt33 zJ=4@yqg0@peV#6kAr}5;`wh8T3`AW17qUcib8|a>;B#zg*m`_JQFXq`yhE!~%0JD$ zdxCA#%WsE27(P4e^JM>X8+pE6cAwcE6!z%*{#4_N4xjdDYU-hshSyqokr_rye4Q$8 zipE)<>AX|KBBINToP-I6IGHIb0)0F%t(5#mT0x0^4}8YhKq|2oaY?=G?H-%qAzaB~FQUZt2Y&pnaP_uJh)jRJpG$w|j7n0V^f+0U<|syI@bE0sU7 Y#HR~wJ1Zz>4fF|vr>mdKI;Vst0O)jo5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/5.png b/src/main/resources/assets/rpbase/textures/items/lumar/5.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd9ceed9fe5dbd7f693dc5d01d0b95fef9ae294 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pE1oWnAr}705_cY4_&x8x0?*S)Yz|WC@m+uSKL|2<+16lkX77{_@rULx z_IMhxq#1iGzF*b$Kkl?*+nGHgzBdF?&MN*^nAOWA@o#mj&_kgKEFO%T&Kl_C`5X|K zz;Ncg!C8gbjwUBm70xQGdBSYSvPA5tK+0{$Svl5%+nNnLj8BMe@)KZoxOc>WLBvDB zbAqk`Q2CjkpWgBOzpBhx!TgL%fGsnKvq6I65|8llRg!E8Z9cn2IIlOX5j_0z27?FV u83h40R*5rVO|vF4`Y@lA@?_@WVUTp=Iy~{>Qea>(FnGH9xvX0#LT=By}Z;C1rt33 zJ=4@yqg0@pyPhtNAr}705_cZ_-M09@qr@py-UgGntk@6#gT5PG;$_T!7xCwQjDu8< zrx8ng*VE}xC~iVh#eJ3x$QX1%5=`dZOsNA#wSGm4si)EH{3g7 z!XV+H;5k9p0I1{4&v%Qw{wputqR95(3)>Y@1)fVH3hVgH1eQpu^@SSq9N^h`#e#hu zW2AE1<&BIJn07cS@bDPSSj%Fn%shi_lIbKi2?+)hF`2XLCDRrIJ<8ze>gTe~DWM4f DUQB*2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/7.png b/src/main/resources/assets/rpbase/textures/items/lumar/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9671922a7ba8685c54e31b494d340ded7a9eb0f8 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pW1cRKAr}5;CpdC78wj}CI>)%U6u!K)cgM%FB;BUtAB!~eUrZOtRo%^3 zv*_fW|LQ0I?fzEF|KjiLu!i%goVT|voz1Z3wbUmYbJdv|k_8fN7ryVUwSV^Wo=V&C zLX#c2w*#(!{i`B#K|tO6+|K)IIWNvNd8VZbC4@{{`t`!^M4{!(rLpBploOVHxEIZT z-A3|*hs>l!DPg_wBCZ*;j#cf8a}HKmuxiyAfr#JJH+ZRCHj#DUndi1&ODd(M!eHsW iLxr3kY?rl8$6aUnz47+BWgS2tF?hQAxvX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/8.png b/src/main/resources/assets/rpbase/textures/items/lumar/8.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a1efa02d5d6eb45d8b65fbf0f62d64df84d403 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pQ=Tr4Ar}5;CpdC78wj}W^(+ta_9UMvJQh68FMi+KC;z!7 zU+C~-3#mKXa#y_mRVT!k(J@)|`JH@Wvy$|KDw~Zs4YW>Qs(SI)p!0I$u65Rz1Py{K z-mh)Xp2t(6!si)iwECESmy(HZvTgkOg_;5Zp`mFUYyNsis7}tD#izjLzc^l$*T~6c kMo|949V{x%nNw5sQywZd-Bo{m1n4UUPgg&ebxsLQ0Am7xZ2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/lumar/9.png b/src/main/resources/assets/rpbase/textures/items/lumar/9.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc222d869f4c101064f84f6306eede6c92ed24e GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pQ=Tr4Ar}5;CmiH#F%WRQ+)*LqB5;Il%>gDcvB)oJy3y?&3OCwaQ!5uQ zX1hD}PT7OW63_qIcm8}|b$+w!>*eu`VTTiDXMQqgtms{AnyB%~=weFa>szx{P5Qg} z{d-@T9l7E=G}fHl^xN}?WAo%STut}YWOB;GW~79vF}isw*?zH7^Ro(weD{)LhUOxV zsvXZxHnH+3{VAquUtIERCdQ>NlQ{Owi$4^V_36c~yDu2#x$W1Iy29}> lVOABlyf0#LT=By}Z;C1rt33 zJ=4@yqg0@pCQlc~5DWji69Ty!6a-whGhdCryRh!HQt7_~Wp~s>e75x4$w;(Zt+duy zoBd+$cXh>zH_x&<*sRKtgqEvz}K~za*toW*7XH z?K!hx+X?1^m5nPrITlQ2=n$BZm>2r|f5V|>0hi)99kx}?|Gl0tdFf2Ky>>(8ETC%` NJYD@<);T3K0RWe8U!DK} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/nuggetCopper.png b/src/main/resources/assets/rpbase/textures/items/nuggetCopper.png new file mode 100644 index 0000000000000000000000000000000000000000..6377fc75d0746bb4869caac512beec3271b3a810 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pLQfaR5DWk06Wi7==V~()IuU z*N6Z8U$^w}{`HLF!X^y@av9A3j2RfV#_6{`cp4J{w4A}y)z4*}Q$iB}r_EWw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/nuggetIron.png b/src/main/resources/assets/rpbase/textures/items/nuggetIron.png new file mode 100644 index 0000000000000000000000000000000000000000..30d6ffa7bd74ed5e3d46b93603a27a930fba7e4a GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p98VX=5DWk06Wi7==V0#LT=By}Z;C1rt33 zJ=4@yqg0@pLQfaR5DWk06Wi7==V0#LT=By}Z;C1rt33 zJ=4@yqg0@pVow*x5DWjiXBYAwP!MTJG<(grCa^zMlr2H>OmKyYa!j#`#e=OOCYmSv z6~8B*JG_5Y?4yl$?=wD^sajla#%giOvU&M6uI#r0kxaEQUX2|*6K^~8e3U%Uv8FCv x>%hl1<;$2fRa*qUF}S6erD-krYRXW|IP0df!uhwJD}mNCc)I$ztaD0e0sz>>SB(Gw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/nuggetTungsten.png b/src/main/resources/assets/rpbase/textures/items/nuggetTungsten.png new file mode 100644 index 0000000000000000000000000000000000000000..f37894a7a032904c2e30899fea533bab9aa51de3 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~GmH$NGuD9h8u zF~q|E?%9K!2NZZ(AL=Ni@SgXZvU+z5&%*_p>mT^`=4!Ue)#-oQ7vS|W@VT=c4Qyu^S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/paintCan.png b/src/main/resources/assets/rpbase/textures/items/paintCan.png new file mode 100644 index 0000000000000000000000000000000000000000..383277758ca598dd912fb8149a5d053d6a8e21ef GIT binary patch literal 311 zcmV-70m%M|P)cD5z-~>bj2lzL$!g1g`5+RaG1;%aX&x zFwi)TECHIPkyMZ*2|)tty5{gSO*GFl2LalW3gS4Xecu_=G#L?W+m@wLfn`|~hT&Zx z*tU&v9Ow81x~@~6=N!WG7zX$b0Zt`t0R^uDtRcLvE4OhdNYj*y#cm=9mSy1y9ZtdX zytn>E7$b#1RaH8?NI?*gZQCq(3}a_SQRw5VY#7GVDF5~|-2foqD3Y=8pz{C#002ov JPDHLkV1n3kf(`%x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/planBlank.png b/src/main/resources/assets/rpbase/textures/items/planBlank.png new file mode 100644 index 0000000000000000000000000000000000000000..1e170b7f0c0a0721f566c65b6c89829fff0e3378 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pJDx6%Ar}70C$_C$&e7bN{q_IDh@c5S?G=00$Q@;v@MMck@Bi1!*^&|_ zSa{sK-6DNdfQPxy$Ke0}FBx)dY@N+d&W7A9lx8?owCK$Lt*Md!qgNC!NSGkOp`6W@ zxF&JJJJp~2b&g6fvqy0XrXP4^_4mJe*ztux1-sG&j&U^W>bCvY&-Zmas9=~g%TeNR zgKezZ|Mzdsx&Q^5*cwCFVdQ&MBb@09PT0 A#{d8T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/planFull.png b/src/main/resources/assets/rpbase/textures/items/planFull.png new file mode 100644 index 0000000000000000000000000000000000000000..376ca9386f86acc0b996db34041b3cb1b2b063dc GIT binary patch literal 476 zcmV<20VDp2P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0ZmCnK~y+TW5~9zrwD_IYxV!(SW=MrKOu~) z9>oBV4a4w5%hWyfs*2+N5w|JRmf{coYpfr3F|AdIXTgt3M}x|ihtvJ~V0G5+x=bfA?G zaRy8;aQnY;M#2BethxW^v^9d+ATe~!AdC?P^GiMcPpY5%fA_-D|4aK@|2GxQ2a93T z48j-&EUWhZe|SaJ|FVpA|5s1#1he;anGiMrqyQAspb($eHS2#*^|Jrfxf}nlZScjZ z8H7;`0ND<*wXJmV{~0aQ!M20Mh&BM`|Dx2@{~HPx{9n@72KPS<<27J)o&Nt5tKZ$+*B*5WfK+3{rp(BdY~r30#LT=By}Z;C1rt33 zJ=4@yqg0@w;hrvzAr}703nVY3Cj98{S$L?0(dTd)+r|I3JWL5ZNy4cDK96hI6b)); zIWqM)zL8?v_dl2C&kkNj&jynw1CPsxZ+0L2QRRF4|7}Ol|KY|RfAmuxu%1pfWl3Z3 zF!o^Pi1*R{Rd1!ic!urbRfq5dQwEg@>?X1;j$DbeF7PsZbiCKt${AvPq``nqPlVaw zM_m->9RUGeBaO+8&+B!V&6hFq9$;YlDY!(SEjlOWpMCah4l|A=KX>)Y*D-HnIo>GR z_(4Z{`~T=%n}f3)+xEn6WYl?g;y_;}14jdkk%;Mkf4)AZ?04G=S+gq)6UFXKVB%%o zz$h`xkwGOQC*z}iOQUd)!KJniN7!3@bu6{1-oD!MPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0dGk}K~y+T&5%n=0#O{rFNLK&$cR=M1SzGP z7SSe?GAf7|^o}_`hfs{ARK>VV~VWIs{;g@ zK|nafpdkWBssg8YtZWc)7ohFWKr?%breLK$K$aZXttkvov17J{mUz%cqUkBp-~AZCA(Q+3KMm|EFA&d|1!bxS>SIHxI$sRO1#F#{d8T07*qoM6N<$f>UeG AxBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/screwdriver.png b/src/main/resources/assets/rpbase/textures/items/screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..188e4a6519abc1f8587163132fb71fe6348f8710 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}1CrFq)xU;kP|9qRu zPxEt_U%h(u@BDoG`YQrDZ85vc-tJ$w?p=LpX{mwQ$qAb_ZTjEV)|S95X3jnNom6ga z?uKW_O7{KF6PuIZtTu&1AYb6b$&>$L63+H-J2@$jTf z^rq598kvbqMk!IP3SEjS>{=%#oMOrQWb&AaVM0#LT=By}Z;C1rt33 zJ=4@yqg0@pDV{ElAr}705>^TdCco@CoOd2!oS`NVx24KjLfC{QR+wYX&W}8O8>O0j zg*g1qP=jLIz~ z4)Zp6%2*UnUZ9r3W6mI=q0n=dA!k;CgiMD*Lk`CYhD9a|nP(^(Fn3&P;d5x4uqLyC ck(rqx^;40#LT=By}Z;C1rt33 zJ=4@yqg0@pR!WMXMV|)09tWpYmE9bH+yK z-{vWo7(Rc@(P@m*-q;(#`FbyR-jT@$x>?gW@`}y{?|kmb@Z7}km?I;Pe%YkI+gN@W z#Lrg=@KRJcARm<-?WxT8N8|ykP3OY-9WObU+$YJpTNJ3=RQwe6t3olxRj*^`w#k7Y P-!gc*`njxgN@xNAb^lw7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/tinPlate.png b/src/main/resources/assets/rpbase/textures/items/tinPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..5f49bdb6e9bec998de18708d733e592e7e7bc5ca GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p-JULvAr}5eCpdB)G7w<+ZT$a2b=(8xUmAj}`vtkKuCVM_Bqqe<*{{8O z!_v$kQCA)xz0*F^L_SA;6)m|cT65+-vlE9yk#UOA0i}5Yhf-8Hd0gMyT0CEn8+{=v zUAZPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0oqAKK~y+TrIF1`8(|Q}J*fF`v)OfbljtT9 zjUdL4s7Meg>Y-j+q_h_+g^DPMh(rlN{7fRb1WG9s+KW=fQ+u+4_EJI*?L~Sjc8g1q%iDMe|-mqK%J3%sj!zbks zFn+?@vVSM23ScE(qbK=RM1Nr20dZ`R3oeKQ;2(;1imAsxkS|n3^!SV7&g0)jQ2R`P zqKLO4Re;pU33A&vI6S%%(RRWPvS z3esZ-NDh5NSNA$WMg_zHuvJC-Ko-BEr}y1|>qV&gM?~7Q7)X^7>&T!zx=n>v92X8i zHogl7T+yn0O+Bx|h@K%eltu60Cjz~MV(ihoSG53ZZK_^&0K7g`-$38+F=FurbRPv^wPpBy|%W-!pimz4`zfB8Sc?VGi*`8T|wE2%B4!I0J8>fM)MZRk91f;s>nG zM21?JMJTe0#-^v@t~QzF0@&i2*h%#gZQTjDpV06RI-$~ZA_y%<00000NkvXXu0mjf D%&-Ho literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/waferRed.png b/src/main/resources/assets/rpbase/textures/items/waferRed.png new file mode 100644 index 0000000000000000000000000000000000000000..d389f4f80fa86c5051a5a571c9b71dfccf0be0d9 GIT binary patch literal 582 zcmV-M0=fN(P)^95-DVYuXQpV?)&< zkU4-Kc$9d3IK}JJvy9Dzf}T!=ii$qLTAD87A|wPjb31swd%(xryNq)u1Re+rUCYMQ zN=E^_EVk$h6E~A1yxiT($g|54$i>9Y;9@YuWvh!FXOkd?gv^y?}<5n!AvIv|(ajUy}~FBX^e8bra)M7AJn6#_Ph(715y)s#Y=# z;0rEnQ`Z2%$Je&gIPZAyH!2u8RaB_3ZQ3YPUI@T{c#Lh@FmJg|@+rwD%U7cb+>9STKFAi}(Xxi+8XR)cGA!g31@-v%OBDeGkUcuCDlO@NERVN) z@Uuk}6ph{m4Y_zCR2%`YI6;D_^H!;hP9{r*ae41|F)IQHwD=({D-5&}@HZj$1&rvH U9_O)6z5oCK07*qoM6N<$f(&BnlK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpbase/textures/items/waferSilicon.png b/src/main/resources/assets/rpbase/textures/items/waferSilicon.png new file mode 100644 index 0000000000000000000000000000000000000000..503b9b273c6b6cfa155462f646a6ada33309cabf GIT binary patch literal 507 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0c=S`K~y+TrIEo-!ax*7`4%xzDG;boXiHn9 zg#fK62qp^dTo_!t<}-9DJHJ3TeuuwvojYWjmX^fC#pO+#Ip@7T3eVo=Uy(mQ8)Q;E z)^JoTftAU-!(;>sxaeKM>t4$E!R(+YCEx{KUap>Gb=)u(u`>ITSfJqb`UTtVhpc=~ z!s?uqqy+5z`u2{`uWwn^Bm_I15&DB01pVFTqy$_R%^aDX39AYCp0Mv<?u)9DJ` z?pQ83C14kZ5Id{0?A)Is3>QKcp>6u8)$MqSSitUTX#^R&GZft-OlM1s$8#8lhf1}L zsz^$}hvbq7@6Hp1(Jef01ltY-+(M<&Lb=>b3wTg_U>s)**NY@LUp%1EbOdCeTrr>} z;FN$b`3a^qkfWPc0M{MD5|waCJI7f`$H{3eU!Wv}8x2p?f%w}d&~+P{*2sl30)`hD xc5a(J)O9Nc_hBX@P~lD#ln1ID6#OkH`~onh*!pLAe1rf1002ovPDHLkV1fmO(C+{M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcompat/lang/en_US.lang b/src/main/resources/assets/rpcompat/lang/en_US.lang new file mode 100644 index 0000000..074b69e --- /dev/null +++ b/src/main/resources/assets/rpcompat/lang/en_US.lang @@ -0,0 +1,4 @@ +tile.rpbtengine.name=Blulectric Engine + +item.rpbgear.name=Brass Gear +item.densePlateTungsten.name=Dense Tungsten Plate \ No newline at end of file diff --git a/src/main/resources/assets/rpcompat/lang/ru_RU.lang b/src/main/resources/assets/rpcompat/lang/ru_RU.lang new file mode 100644 index 0000000..016cf2f --- /dev/null +++ b/src/main/resources/assets/rpcompat/lang/ru_RU.lang @@ -0,0 +1,4 @@ +tile.rpbtengine.name=Блутрческий двигатель + +item.rpbgear.name=Латунная шестерня +item.densePlateTungsten.name=Плотная вольфрамовая пластина \ No newline at end of file diff --git a/src/main/resources/assets/rpcompat/models/btengine1.obj b/src/main/resources/assets/rpcompat/models/btengine1.obj new file mode 100644 index 0000000..5e195f7 --- /dev/null +++ b/src/main/resources/assets/rpcompat/models/btengine1.obj @@ -0,0 +1,125 @@ +v 0.000000 0.000000 0.000000 +v 16.000000 0.000000 0.000000 +v 16.000000 0.000000 16.000000 +v 0.000000 0.000000 16.000000 +v 0.000000 10.000000 0.000000 +v 16.000000 10.000000 0.000000 +v 16.000000 10.000000 16.000000 +v 0.000000 10.000000 16.000000 +v 14.000000 0.000000 0.000000 +v 14.000000 0.000000 16.000000 +v 14.000000 10.000000 0.000000 +v 14.000000 10.000000 16.000000 +v 1.999999 0.000000 16.000000 +v 2.000001 0.000000 0.000000 +v 1.999999 10.000000 16.000000 +v 2.000001 10.000000 0.000000 +v 0.000000 0.000000 2.000000 +v 16.000000 0.000000 2.000000 +v 0.000000 10.000000 2.000000 +v 16.000000 10.000000 2.000000 +v 16.000000 0.000000 14.000002 +v 0.000000 0.000000 13.999998 +v 16.000000 10.000000 14.000002 +v 0.000000 10.000000 13.999998 +v 0.000000 4.000000 0.000000 +v 16.000000 4.000000 0.000000 +v 16.000000 4.000000 16.000000 +v 0.000000 4.000000 16.000000 +v 0.000000 7.000000 0.000000 +v 16.000000 7.000000 0.000000 +v 16.000000 7.000000 16.000000 +v 0.000000 7.000000 16.000000 +v 4.000000 16.000000 4.000000 +v 12.000000 16.000000 4.000000 +v 12.000000 16.000000 12.000000 +v 4.000000 16.000000 12.000000 +v 4.000000 10.000000 4.000000 +v 12.000000 10.000000 4.000000 +v 12.000000 10.000000 12.000000 +v 4.000000 10.000000 12.000000 + +vt 0.125000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 0.914062 +vt 0.125000 0.914062 +vt 0.375000 0.937500 +vt 0.375000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.937500 +vt 0.500000 0.875000 +vt 0.500000 0.937500 +vt 0.375000 0.914062 +vt 0.312500 0.914062 +vt 0.312500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.937500 +vt 0.265625 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.265625 0.921875 +vt 0.171875 0.914062 +vt 0.171875 0.937500 +vt 0.140625 0.937500 +vt 0.140625 0.914062 + +vt 0.062500 0.875000 +vt 0.062500 0.914062 +vt 0.203125 0.890625 +vt 0.234375 0.890625 +vt 0.234375 0.921875 +vt 0.203125 0.921875 +vt 0.109375 0.914062 +vt 0.109375 0.937500 +vt 0.078125 0.937500 +vt 0.078125 0.914062 + +vt 0.000000 0.875000 +vt 0.000000 0.914062 +vt 0.046875 0.914062 +vt 0.046875 0.937500 +vt 0.015625 0.937500 +vt 0.015625 0.914062 + +g 0 +f 1/5 2/6 3/7 4/8 +f 8/7 7/9 6/10 5/8 +f 12/11 11/12 9/13 10/6 +f 16/11 15/12 13/13 14/6 +f 20/11 19/12 17/13 18/6 +f 24/11 23/12 21/13 22/6 +f 28/9 27/14 26/15 25/10 +f 29/10 30/9 31/14 32/15 + +g 1_1 +f 2/34 1/24 5/25 6/35 +f 6/25 7/35 3/34 2/24 +f 7/25 8/35 4/34 3/24 +f 1/34 4/24 8/25 5/35 +f 36/26 35/27 34/28 33/29 +f 40/36 36/37 33/38 37/39 +f 37/36 33/37 34/38 38/39 +f 38/36 34/37 35/38 39/39 +f 39/36 35/37 36/38 40/39 + +g 1_2 +f 2/24 1/1 5/4 6/25 +f 6/4 7/25 3/24 2/1 +f 7/4 8/25 4/24 3/1 +f 1/24 4/1 8/4 5/25 +f 36/26 35/27 34/28 33/29 +f 40/30 36/31 33/32 37/33 +f 37/30 33/31 34/32 38/33 +f 38/30 34/31 35/32 39/33 +f 39/30 35/31 36/32 40/33 + +g 1_3 +f 2/1 1/2 5/3 6/4 +f 6/3 7/4 3/1 2/2 +f 7/3 8/4 4/1 3/2 +f 1/1 4/2 8/3 5/4 +f 36/16 35/17 34/18 33/19 +f 40/20 36/21 33/22 37/23 +f 37/20 33/21 34/22 38/23 +f 38/20 34/21 35/22 39/23 +f 39/20 35/21 36/22 40/23 diff --git a/src/main/resources/assets/rpcompat/models/btengine2.obj b/src/main/resources/assets/rpcompat/models/btengine2.obj new file mode 100644 index 0000000..c05d616 --- /dev/null +++ b/src/main/resources/assets/rpcompat/models/btengine2.obj @@ -0,0 +1,23 @@ +v 2.000000 10.000000 2.000000 +v 14.000000 10.000000 2.000000 +v 14.000000 10.000000 14.000000 +v 2.000000 10.000000 14.000000 +v 2.000000 13.000000 2.000000 +v 14.000000 13.000000 2.000000 +v 14.000000 13.000000 14.000000 +v 2.000000 13.000000 14.000000 +vt 0.632812 0.875000 +vt 0.679688 0.875000 +vt 0.679688 0.886719 +vt 0.632812 0.886719 +vt 0.617188 0.882812 +vt 0.617188 0.929688 +vt 0.570312 0.929688 +vt 0.570312 0.882812 +g 0 +f 2/1 1/2 5/3 6/4 +f 6/3 7/4 3/1 2/2 +f 7/3 8/4 4/1 3/2 +f 1/1 4/2 8/3 5/4 +f 1/5 2/6 3/7 4/8 +f 8/7 7/8 6/5 5/6 diff --git a/src/main/resources/assets/rpcompat/models/btengine3.obj b/src/main/resources/assets/rpcompat/models/btengine3.obj new file mode 100644 index 0000000..c6172d3 --- /dev/null +++ b/src/main/resources/assets/rpcompat/models/btengine3.obj @@ -0,0 +1,107 @@ +v 7.369397 -1.500000 0.000000 +v 5.257074 -1.500000 -1.045697 +v 4.952058 -1.500000 -2.051211 +v 6.127429 -1.500000 -4.094218 +v 5.210949 -1.500000 -5.210951 +v 2.977890 -1.500000 -4.456733 +v 2.051205 -1.500000 -4.952060 +v 1.437697 -1.500000 -7.227799 +v -0.000003 -1.500000 -7.369400 +v -1.045701 -1.500000 -5.257080 +v -2.051211 -1.500000 -4.952060 +v -4.094222 -1.500000 -6.127432 +v -5.210955 -1.500000 -5.210951 +v -4.456737 -1.500000 -2.977897 +v -4.952065 -1.500000 -2.051208 +v -7.227804 -1.500000 -1.437698 +v -7.369403 -1.500000 0.000000 +v -5.257080 -1.500000 1.045698 +v -4.952065 -1.500000 2.051216 +v -6.127435 -1.500000 4.094221 +v -5.210951 -1.500000 5.210959 +v -2.977893 -1.500000 4.456741 +v -2.051207 -1.500000 4.952060 +v -1.437694 -1.500000 7.227802 +v 0.000005 -1.500000 7.369401 +v 1.045701 -1.500000 5.257076 +v 2.051214 -1.500000 4.952054 +v 4.094226 -1.500000 6.127425 +v 5.210955 -1.500000 5.210944 +v 4.456739 -1.500000 2.977887 +v 4.952058 -1.500000 2.051201 +v 7.227798 -1.500000 1.437686 +v 7.369397 1.500000 0.000000 +v 5.257074 1.500000 -1.045697 +v 4.952058 1.500000 -2.051211 +v 6.127429 1.500000 -4.094218 +v 5.210949 1.500000 -5.210951 +v 2.977890 1.500000 -4.456733 +v 2.051205 1.500000 -4.952060 +v 1.437697 1.500000 -7.227799 +v -0.000003 1.500000 -7.369400 +v -1.045701 1.500000 -5.257080 +v -2.051211 1.500000 -4.952060 +v -4.094222 1.500000 -6.127432 +v -5.210955 1.500000 -5.210951 +v -4.456737 1.500000 -2.977897 +v -4.952065 1.500000 -2.051208 +v -7.227804 1.500000 -1.437698 +v -7.369403 1.500000 0.000000 +v -5.257080 1.500000 1.045698 +v -4.952065 1.500000 2.051216 +v -6.127435 1.500000 4.094221 +v -5.210951 1.500000 5.210959 +v -2.977893 1.500000 4.456741 +v -2.051207 1.500000 4.952060 +v -1.437694 1.500000 7.227802 +v 0.000005 1.500000 7.369401 +v 1.045701 1.500000 5.257076 +v 2.051214 1.500000 4.952054 +v 4.094226 1.500000 6.127425 +v 5.210955 1.500000 5.210944 +v 4.456739 1.500000 2.977887 +v 4.952058 1.500000 2.051201 +v 7.227798 1.500000 1.437686 +vt 0.644531 0.902344 +vt 0.636719 0.902344 +vt 0.636719 0.890625 +vt 0.644531 0.890625 +vt 0.675781 0.902344 +vt 0.664062 0.902344 +vt 0.664062 0.890625 +vt 0.675781 0.890625 +vt 0.656250 0.902344 +vt 0.656250 0.890625 +g 0 +f 41/1 40/2 8/3 9/4 +f 36/5 35/6 3/7 4/8 +f 62/9 61/1 29/4 30/10 +f 57/1 56/2 24/3 25/4 +f 52/5 51/6 19/7 20/8 +f 47/6 46/9 14/10 15/7 +f 42/9 41/1 9/4 10/10 +f 37/3 36/4 4/1 5/2 +f 63/6 62/9 30/10 31/7 +f 58/9 57/1 25/4 26/10 +f 53/1 52/2 20/3 21/4 +f 48/5 47/6 15/7 16/8 +f 43/6 42/9 10/10 11/7 +f 38/9 37/1 5/4 6/10 +f 64/5 63/6 31/7 32/8 +f 59/6 58/9 26/10 27/7 +f 54/9 53/1 21/4 22/10 +f 49/1 48/2 16/3 17/4 +f 44/5 43/6 11/7 12/8 +f 39/6 38/9 6/10 7/7 +f 1/4 2/10 34/9 33/1 +f 1/4 33/1 64/2 32/3 +f 60/5 59/6 27/7 28/8 +f 55/6 54/9 22/10 23/7 +f 50/9 49/1 17/4 18/10 +f 45/1 44/2 12/3 13/4 +f 40/5 39/6 7/7 8/8 +f 35/6 34/9 2/10 3/7 +f 61/1 60/2 28/3 29/4 +f 56/5 55/6 23/7 24/8 +f 51/6 50/9 18/10 19/7 +f 46/9 45/1 13/4 14/10 diff --git a/src/main/resources/assets/rpcompat/models/compat1.png b/src/main/resources/assets/rpcompat/models/compat1.png new file mode 100644 index 0000000000000000000000000000000000000000..0157ac6c0935276f01956b9bed4d98b0f3070b5e GIT binary patch literal 6084 zcmeI0c{J4h+sD5qBB~jCWf^5D5wbKG%UFlRWM4BW+@Z$O$Zjl2M3&N62iZcDkaY-2 z(byw9Wv#4Z8D`8p?%#8Mo%5XgJb&K5=lSFQ<8waCx&FAW_w~B2&*yw%u9_f^v7cfG z0N|LRfvy<HO{FfLdTMHxAni!cRD z_Dulbmoe1Uvha6Y&KUD_wzm3!GI;LLFwtb4vMMuXS)S2#Z^Tk&%mwdRF|piKo7I#L zKcd6RB_SsA-i5#h$`y%cd&sIE=bCu9fxQlgzJuH;n#YGKfN!5aVFZptwzd!R4cBfEFtAwv%(x~z1XZI5Ak?j3GHHPoz{ zkNjlOZ3?R9PpT=I2w(>MztpfddI~cEj$37*)eIyMW*t)cjylf?Oj}N!Uu*iiOz(Gn>+5L#`jxR+W84UfFMJ?*Ei>Oi#dvo^ zktFR>T=K;IXz^?*H^YolShh($LW5%;cH*8=c7k3EFA)RmNkK+0UL|4!wi-tzs zpVrm^_PJlW9#y@mLClq%Nx8(Xh?cz?W9jh8?4EaWa(nJ~@`zA_Zp^yIsm!%@mlcHS-Ph;4$ECgus0`X6Zk$yXOw-b!e=&0C890(|pOrg|#%0M|tJhUm zS05Z6MpoFweOp&PcGRm+f~&)ReJ(&{yETeKv07P1Gh$6e#uuH_6po4Y4mZjLn|MLI z`oP8#t#pLE{=Sa-ApEPbkUBq#8IgPSAs;_~-qzMuP9RaZtgKA0w6xT;z%1r+ftey4 zE}m>=2)fJNnj5S(_G39OiW15l)$`9?g2dL=$@WwWOYLb> zaMabqZDWggO}Afnt*_7Yl#u5u3*1JD)q2QPq24T6Xn)2kw0A#YXDRa4?E!o!<`IV2 z+@f{0s7BMSXrjT_PSc^V`lpe_XH*r&;##Js&t&!;@UBBA4O z+bP4OC{j~J#ZXjKbZ}(EFv>l)-hXy=`rGQt%JI{ulh+nkSHZ8w#>RrAkAO{)NLB^@ zI_}yNAZIr>LtQu=j`jC9fMLdSJci5r==9LFOP4M^j0|Uldc4=t57a?Z`_Yp$5!Lml^nXrFbj5RKK2rHbwjy|_TWvqQQiD_keWUZnGv;=#172{f}!()WDIoRTGx7!i#je$e%xAo%Fm7)Q2NgnlbBLf_HoF}`Q;Y2&?WJMks{1(pFSZ}zdLDZH&T4n8h3WLbrhU=K)TqMSnl37?mqv2cv2pH_#4J;bakXa~ zAFOdP%cs=(uir?uYuq07aFQ~A;EESrMxBl2N{O#pQomTC_ zqZ<^r9w>Q(fO>gv0lIrAE?!)+{%Z^Fv%^>YSH#f9e@BSY^pL~Rhn+a(e&M#2xMibc zoGPoTv`wL`@7juyY@(s%TQ+^7YW%^QMYu21xcyR|{T3*Uf};#WKnK-rLjJ=t^kN&+ zYrWyAnddKh%w+j-H=Zs`f4@iwBGcd}7gXv#HwP70Hb-taRB-`cy2hDik+;&|hb8S! z2Dl6k$2M7V@u-2pdES@+RcVU&2W4h|=Vy>aPR1M_UC8g~A5I8bsmoc&#t|F?mkJ;t zGn%~8B6Mk{haY}CENEwCeQJq(2vHA7J0${~QuWm6To=TatLn@J#*~b4&_pwf>QYY9 zb6sA1ys&t*=EWPXEc+|wu1>MZEQCKg&nqTq=x}?hdJ<6YVxafqhH|e{1vnB-{XD<& zqy7c74M9hQhsX@_ETh?qGrhiBWnw)!nQK;dg8drb%;66=24TJ2_2FL)pzSI=fn3*| z1}D|*a!0q=jrlsX0RxZjyFcXWJ@lr|yY)P3zrprsWXnMmpzJ$i@sPwmM|Qg6Spst; z^L+!p!^r+aGc+S$oEQXae7h}V9|b5EljlVxn>wx1-0`JqtYv-MB&E?hOE8DYSj~{z zs$G$9>Rr|z{c$SYQD~HpyMC|`N zk&RXRQ}nJ6Ah86>X=Z2i+g~-pQmUkE%cVNQQ5A>0pPsAzSCpW3p(l55wh^nUt4UEL z;hsL$T8>4-kF7$iA2O6mCeB40MQ{jIIw|6#l+ygNWyS}RO`PuCyTptr*5DrEbS^;a z`?~F;1Lk;@09_K0xTIBkIdRVk7;g%JWBEt@Zu5es^Sd(=a9%Ehh7O5>l~?s_=3%I9b0ada*G;gXwH2#MBy^&L~@%&Pm6I7F^te3Yu-gaHzgjhSN={+;@&YE1nO~Y*XgXOg0eptfwYs9wTFk zQp^ayMg<;5Z?9J>6})!tf>4tyZ z{>p4dH2gxHp|f0C4tai;Idd(+p5jWC9c!{l9moz~7x4h(_wKH1K3@INtb1?^b<=jE zI4>z^8V32*EOzcMLxMvbX64T&9P7Fq6Snd!dXTCoM%>5twCeN7&vV!+#)nlAw5SLDULACZ{75h;E*+zM}c91+2fe*9vmH6bcweYS3X z9UKrqd++Y2!Hh^kI)-`$n_WmRUZZ)t%kiuQYy^W$C};VY3OM|g8DOpJw#>m_x1qA2 zjYTLW`X|#tzxb9HlADO4W}kJsPwFmu(Ji{yT~_UthO(m0xe5fBjM5>89cbTtxBPlP z`#jj5EEyP@IWJzBS5;-pF16=VhL&l|`ja=%({@$KZBTSf+&3puI9f+rE7pF9$+-$| zg5Wz;Kxu#SlkvtxV>3K_QgM7?{xx3yK{-RSn{jfOlVdz zz)?Mp?8Q^Fs;q<4B=#KHlK*F<$)<{J%a=5jHH!H@Etj?uUK6GM4vXP<7KHHrp`MnUb<`Ns6~1H(xJ^DO?-Z}K!eF28>6hDG!D#*9q${lN zpEPXE4{cQ4t#!%F%f}Yb80O@+j)lCVes@wD8J(T6fzYraCT!!LplTR2w`eZU zn{cSR+_jB3-yhLEyg_UGXj-VK=i|9|TdC`gdu*(aXP|gn0@=b&(ku!|uyBe{)Cjs- zl*GCtNwm%zPw~Ahykfq+F`7n!?bIx}`aU~8#Q&ncX5HqXWv(a87-A=BgGX6`o`o9B zUDHAGI7_}H*^4Mzndof%AWYiJPh`Q>DbGM4TB_>aYu!)da-=Wpxgq#(DQBL6o|sw* z8#TzbPc}*-gC)Jz3m*PKAv(LCo`|B51pL!?4tmfkHJE6?yan0?Pdmy_AbxgK5F&mi+RR{d4&0@GV9e zyHH56wr7)dK@haOPoQRa@dv!LD&!-XA@I{;Bn`~r&y_B(YBZz7;b<3JH-a2uarR!D zDXVGmyvJ@fSl4MmNl+J>conUEa6v$lK=>QaOc0|XrnS@raTe(gN9RI?p<3S5B4|>h zb)CcUW#af=LtUMry}iAb`~u!S++`Lo1p#ZKDfHHk8!_jEQCkL>xoIb(DRy0%21J)5i2BL2k*+ewqk0`%LPydHdYe+lYxn^fsB?HJFzG z52w#ezFrZ5L1Vr-9ea+y5lNhp5Knvjv4YeitHz3=fHg>rU*^($k+Yh>Cj;5!kR%G% ziE%eUa?Jbdii(Pz?LF6Ab3ZzXhb!r%#of1h*1vRx4RnO{$OHf2u*h?Lv(R1BY`x`f zqz?=qC+3D}X*&ihu(-8fFhMAGZkto7(9g6Wkqjkg; znPxE2%xy%xU2w|pFF*GWnl9RN_^f~HR(7<898`m76+c+t;1e4G<40#Zmz6} z{N_MA1h(FB@xCg?P`4@PdIMJsPL)!Rm zu?R>=mQjv-qD% z!CxHsjRO<}MC5GqsQ%3i{O=C@=J6j){vy&pnEdASA54BL@DC<`QQ-eCChBBe25aYc WcH0KRAnxFM9Wc~0(Jj}$9`RpcZl@~% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcompat/textures/items/densePlateTungsten.png b/src/main/resources/assets/rpcompat/textures/items/densePlateTungsten.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe8d88295d8474832026af3171cb35c3e7979f3 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXJ~GmH$NGuXtJk^ zV~B@v0|q zr|mxOI}@Eb&NFMtv)wwx)WF*IRC9rNErSg6bjG&i>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00EmxL_t(IPo+`aD?@P@-iM8Ie(mpYCCSAk zS;$<7o8^)e|^RtcmLjQvNT!&DEcCQ2VwRTjhttb)T@JGgjyQF|YWc_-e*Vb90M1X|H z9f9T98a!+Z>@6ws_r-=Ndxa@rY`fXg$$>5>h5}XSXmX&X!7h6*`-Q8D1lYWc33GFw zMxGjWBeAF;5>_xd=#oPGj|;wzJ*FKgVEE(!w~>4mQ}CG)c-j>>j3}5HuSQRsQ_e6S zoV)WYFi)3K_7;r{W;PB&plylvlC$rscw!vKbiQfN@DKAxuGTHnv((B0zOM-S?^P tlO)zZX9eF@ln4+8u~KbCS%JR;wqNaw0$T@%>|Ou>002ovPDHLkV1o2+>VE(L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/forth/redforth.img b/src/main/resources/assets/rpcontrol/forth/redforth.img new file mode 100644 index 0000000000000000000000000000000000000000..2c2a238f4b7b3d2f0bfff28673fe6ab3ebb05de3 GIT binary patch literal 5888 zcmZ`-4RBml6+Z86?t3r0+3s%A>~0d2^;s~q^oLHT4N!uc-A(t|Z1%A~ZNyOi8rZUJ zQb~iQGi!@g)M^Y$agY`}G=mTj%Mf9-j@AU7&VWF}C^EG|CyI8IF+uPz+Q#qPw;NKd z{ABO>Klhw-&pr2r|2@89gj`d~lsZCHQ?9A15fW2cM@tjM)3J0X;h$5_QgVq3ctbQp zv`CyfDWP~ektJFsu0E+!^VTgpE+dMGwxmjlE-Oc53ve~xa_7yxw-!L^7Hv;-199yf zrYH(+Csc{t+y{=5Xd7177g~Nt>kG^%k%JH`W2arf7YnRpYhT}XNE`<7F=|{#U#2}L zlx{4)NT4n$laH}1g>R<{L%47|Nsg^OH{aC*1#gIAvF-8asC%DE`Oc1X+QxRZVo@cF zXrcBPgjHkTM!?4)zw2c3dJr9jFKNRXg11-Ow^tpmLMZlD?PEntCHou9p1d9g zJ1toM4_j9$muKT1om~Og3X5UAupTB_i7wHLzhxjs{P0GgIy-GX&^fEZi~Fs{$E zJWIa=Tu>BbP$OAMUQR(AEoAnu#6G&M1>ob#)XK83W0>l!c-FhK>tK92Sq9J`) zMJ?=Ap(nMN=%8LW+Hx_?B;Q1?81Y>o!es=&A6Mug1N=pWitwhEXA&u*-{>>16iyy( zxshhxgu(XI@>Dub^q2YQBh!JCF|Ma+H+)g|sz+ZVb%rfE%)*d5!et#RVQHm-OhMnu zBPT*Si6?!Ccr->nik>34l>#a2euo9k2)DfwC^hIA!CV-4x+cJ-&5f!1L$LCtDP*SqFtzeH@mL# zVM$r&fnkRI4vd3G)a>>YcFlDE=<#XKWTfo@I`gFy{~C{=;k8?=`bsyboM<;!K8Q11 z{i#GMmcmi%niKXy_*Zno1CD<{oIS)3f~%C{pUq`D5^&%y_b@#%LNpoq6-~R&?18a; zd^q4>rouCF9?uKRQ#e^>%4PEK`X#ryNX*Vsd$c19aEd{~35{iwGo%0%N9LUNJETqWE@ZP?xtCPj$yRxTYSTH`T&9$PHLk+q?3RNJhdG6pqXFY)y2 zD~v~h_ zDv6~vl|4;hPw+5nckuQ0pvN54M)B`%{Vf=@rBG{47~5eSo7=6k!IIc2X_*>!rX)T) zPoYP5ROT|WFs`mKd$bYvApUQ5PZ)Q(Vb03tJM(B>Lp2DAjqGsvegYjjIwFVlAi}h| zdQjs~pE7nJNOjdxPKrIrVo%m^HkQh0fs~Kt(zxFyYfNWrPM{slVebbuk4nuiOT8u0 z?sY8vMjwLj9Fn3?y#ty|o}>3Ho7@fG*kDQYdMAvtHP0iY+r4LNU_P1XA|>yIaX;## zg|i+{#H>`bgOpv2c303jc@uu!`y#5mjoZ|t-og}0K9|U(qVYKT{rc0`1J55W*JgMT!OD;;#<^WBz}YKpQ6pChaJr=GE-sx%y(M8Ru%Q$GOAcJf zQWM<7K}qxRe&s@TNMSpyeV&~wDt25Ku(KU@=6MI+vUkw*|GoPTq~`e)Llo95nA^9C zU2s)!mHd9engvDiSLO$H!r)(y2>YjCg&ieQT+7ElC{L14k-Ge@A)Tchs8ecg^&N-i z4xfW%&1HRU=%l)DGV;{Vyi@d);+pnfHK@3rcuI8*l4~ULu;0avaDC#F*P?sO@m0BA z5+F=h@%_O~kU20Ap3iW?_2QntJ*ByZ{!#^I+(psc(k`%lyTUfJZ%}pNk0OmUFEcUW z{oH3R#{t=`Z_rBOA3oj3XZtPuy@a=)wWBfA&7{v<we9CJBFw&k$K#wci2t;IPSK z32s{~5{CkZ*o9aoA>(b&r>+7OG(4%SXj=!u)>~`#LY8+4{HKV%%7zuBMLK%}DGxiI zlo3fQ4yo_en(Pf)l)MP|@T-^_2azUd$s{%;&{k>uf4LM)nq@94l}f}d>Ef9SG0v%L z-rU#Ik0J}y;ZU*J3BzgMcnP+WvZf9Wuc(5I^&Pw5ff^v7g zc@Cw;Q{0d0-w8W&sGHVHzz#Sh3Mj%f?FszN>5{@_qeogA7g-mCDwPR^qL z3{JU=fq8h?HIjViz$8q5CxFl`~@!F7c zogEs$Z7{0c0DMO%@8cbA0$umh@k{ALWoJ%aUJhM@k~k6K?7Sw|waDIX zeX^z`W7y~ zzbF*NhZ|%?w5K!cI6Loz<%!rIJY~F!2soaVFF-5Z<&5J?8Zc4lL_pvfX*Za5LwOu` z$teVQO!1rE$Ez5axeC%NON>5?*Sji?kCKZ-w&Zvj3Gg=HNZk*X^i=XC6G-U}{U>;WGi`}1`Q zsq?#1=Qk^UWT0c22vK4reMc+qAe%NUKxdDy}?v(dbai`Sr ziAo+;v9yV6XaJ&n&}xo}rly5lL$P!R!f>t;!Q}6CuQ%|6N5N{$+oB&|aD2g}FSVt& zC!LLKxMJDLh}FAg$CjJ7ZrRnd8S|YtFon{|2R8X9eYf1bqo+S|+nqf<%Rs?^dkH=z zHktQuq%ar{HJSJEQjWzBHJL+A0OHmLqQ{!dhX6$JajXehR`At1i4o@~P3ESCLjf)a h{+d)0e{5oB@CCalrkrJaJ0=P66TR5P=KcvA{{<6&c%}dV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/forth/redforthxp.img b/src/main/resources/assets/rpcontrol/forth/redforthxp.img new file mode 100644 index 0000000000000000000000000000000000000000..2d75140334938f1354a97679644458059bddc1e1 GIT binary patch literal 6912 zcmZ`-4RDm@o&WF0`;pyjb~hoL&6nA}hh7BvkYNBdMmD<}@*ca{*ZqLhiy+AA!a@Qh z@sOL8P^{OZO~akodIie}<7u=O$Ba&;b4L?-@ZY7^scoSZ z`*pzt(R}IBMX?LVBT1s=(mfZg)VO_X@9jh(sin*Ke1kd z5pNe^8&;-Qy-puvpS4m5fF$q}fv0IKV5QYWTa;;}6Hr+9DAN;x*J)@h0Kh_`eM;8< zusG`?q9Nsk6}fQ03OTU_L`RkEsZ|X$-S!b;#eg3J;LiiF{g(nBXl&mpVBy}_l0+m% z^ebihz3jzPt2WZ~M^M-rTM~a<$x{L1J+X)$U4m$O=3wEGW>ZN z%b;nQibz4;vL!?j^#m=*Zo@9!42RvX?#=qQef!*(05mlbJ%s(wiKZm~0uvZ)hXFg) z>|dA>hPR(ovo^8mh-3GZnhlAa-j3)a$j_-+eP#yY+9PX%oQ1CmKn);w!h>(AS+Ruw z&a2tG0Zkfk^d%gFWP=G-TGQmJ;5ce|l z(DlS=P#+ZVxztTC@_0c;QC~BlKNV0RqbM8TcNxr96oH{gG)nYI$rn~w${X~tt0iU> zW5EvOzk^M;aQ1Ls=u{!gY7(FhE9%yEKV8YY?u z{F0_@R|cT$AQuM=OcZE_ucJA`G}()JqEsRctIs;L`O?e`wFaX}Y$th3sL)U%mr{&tamz4vM1bqN; z8UbGkexFi#;TQd*P&t62T|fUS_tJOF0^ggtvf72UBs}Zxf}Oc{J0}reweC zM#&>W^1DKAztrk7HT_B%g6-^*oMd(N$s%~B+^ei|A8ccV{Zg0fyn40tEx2^2>uM>~ zw?#V0l6FD42l=szqaKcg^jI)Tmc0yi6u>EQ6aItiZDe^1x2fk{*-4~)Dw2o=!(sHt zS6#?T3x1D^;u*=CG{-%vfefrDA0POc7Yc#;NnX zt6x&f49LVkL4gZdNP?LtlsK37dpFZV7S_Yk=jge!pvQI-Jv*Uij&-2TTL(#BZQVbE zYmQAJcwuE(@!VFNg0q6NI@oR`;vPO7*k0-yhrrnF0gh^#tc^Zx8(b71=iQJ3EMR7X?#`IzaZL0@?Jz zL8}daEJ8`+Vht1Czqz#~D3E>1I=Nr^gIjTPZGVElxAO6mMlgiDnQ&_>or)WP)YlE{ z6_3bZW?A4dS^Spg-NAZ9#4a(&nt++R* zhYcQWL=>x}f(G-#PLHjq-4s_QGqNxI;?XdmIcy-U)ZSuQ$;BNMJ{1NB8c>k%iBBE_(*$_dQ`| zyn|?)SG!uW%_~~O9U-D)URY=WSmf><$hDI!mb>Z&FaMtOa(KsJ9cTGTwh4YS@03xm zHUhJraiVQ|gh-(B&HPgnHz?nOPMOEHMS@`-xYcqfWnrIsN4@51404WnFMGyJId~?) zqwP55{Bmu6xglwwHl+E|G4C-pA(V&+e;aeL%Yg+BPbxjw5{28k%C#==@+krTYohP6 zVhh3|jD3(S&zhFx0d0C1Tt6w-*c!AbaS?FwTQM~bB218yh^&jCtAqylzrS1S%cxu^4}GjsSKdtnjnLuc}1Bb8tL|w zj@!v^g4sL)Uf-r8a+W3YZfP;*8Z21#}<79b+xd-Q1&sdmpA0wY& zvp9EDa#?P~U(t0Djt7|I zfy(Q`k|Ir6yldZjMkE1#BLuAC?LVd(e_I9%j7S0PUd zZgQZOsV zQnSxgEO-+58j#>TtoDgY6hIza(4C?_jqi{y-}A0ZaKJ-8C{G$oi8lIp^5(Y}HhaXz zM$PTP7%KW(KDb5_)qK`*6eR{G#^5n@*oSU6?BFq5#vy@d)%gK=(p0TOm%S<@ANCEE zR*0dwV7(RASBP2k|9q2R%<8i;Vxr*1SnCpzHKHLT)@`Hd!tI}>h;RfIpHxKpa!PyAu8mJl_9HM-)S(?N} zR9z*mH5@>1M=Xp)1UmOrY0qHj9(LRYi8Tm3H)35L_puKzRyh?;i+<_fg$;$1nQ?iy z>RzP8xhjs%1+gwi^!6zerTx-$RoZ28{%=(wZaJykKjBVy<+{56rYn%@&Skpp4&Y|z zD~KoODaI$cWZ>Vhu;a!@f)E`|yBiS^fgl;~nNWzOWh- zg^dURJR^;2&8W_g<2Esc0FEhs!z|p2ftj-)-jQS_kIlvOC{KxzwLpP~E(W3k#cKlB zqdYlF6V{V!O*>v=JFNH^1qj!UM)Uy~aV@Fk9~4a*L9U%w??QI+JpD~E^L|szyjGFn z^J|`W<)pG27|4QjRN8N=wE{m+^mBP^f~Q09wA3I|Z2Tx*jc);N425|a>k+CuYl<=k z%=d!LkOn}FyF@@9?p z+iDmpai`pG=T52M6O|}dX;CfbP#;(a&}vRgwYBp&hZ;9;&u#8|1Refb4SbC0ks)3D z{kExg7SP9^XJc~!+q*Yy0cb-W)EZ4Ek;%JiwWiu0C5C@IN89izjN6N8!ANZe`c1RV z$L4A2Sy-_j2VqGfFL=V?L3yAS;WeROEm5k=$Zy^taZ*Uc$y%au{`7gqG>NODu?`~b z+q_LsrORw2Pr6NYeKM=)lo-Ojs;zFIHU^qAwI-a>Mp#T!6?HJmQZO~Da{_Oy(<z=kNfkwdK}Dw?_>Sa59<_9J&Kp}$He}$j{6zEMNUgE)yeF{jlrb`8-jO6oKK@Sgs(2(rnFTZ#55{)#! z`u}(%55IXiX_<2lbtoQo!GnvJ};BkB_T1kVppSvs` g)o(Xwhj=NT)E64Gw;Qkt>+6U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/forth/rpcboot.bin b/src/main/resources/assets/rpcontrol/forth/rpcboot.bin new file mode 100644 index 0000000000000000000000000000000000000000..0a17857cf7d426862104e15b2481cfb690b93ea6 GIT binary patch literal 82 zcmb36y_DfS!y$u}49xEt-!r8!tz=+rWm(G9+ra!tVI@m%6Z7e_P0SyDtpyUC@0%VO mSp4>3U_GR;h=Dm~fdhlnB$j7D*m2?8QkD-7o-z4|u>b&O;vx9} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/lang/en_US.lang b/src/main/resources/assets/rpcontrol/lang/en_US.lang new file mode 100644 index 0000000..8dbe567 --- /dev/null +++ b/src/main/resources/assets/rpcontrol/lang/en_US.lang @@ -0,0 +1,18 @@ +tile.rpcpu.name=Central Processing Unit +tile.rpdiskdrive.name=Disk Drive +tile.rpdisplay.name=Monitor +tile.rpioexp.name=IO Expander +tile.rpbackplane.name=Backplane +tile.rpram.name=8K RAM Module +tile.ribbon.name=Ribbon Cable + +item.disk.forth.name=FORTH Boot Disk +item.disk.forthxp.name=Extended FORTH Disk +item.disk.name=Blank Floppy + +gui.cpu.diskid=Disk: %d +gui.cpu.consoleid=Console: %d +gui.cpu.selfid=ID: %d +gui.cpu.start=START +gui.cpu.halt=HALT +gui.cpu.reset=RESET \ No newline at end of file diff --git a/src/main/resources/assets/rpcontrol/lang/ru_RU.lang b/src/main/resources/assets/rpcontrol/lang/ru_RU.lang new file mode 100644 index 0000000..62ef2b5 --- /dev/null +++ b/src/main/resources/assets/rpcontrol/lang/ru_RU.lang @@ -0,0 +1,18 @@ +tile.rpcpu.name=Центральный процессор +tile.rpdiskdrive.name=Дисковод +tile.rpdisplay.name=Монитор +tile.rpioexp.name=Расширитель Ввода/Вывода +tile.rpbackplane.name=Объединительная плата +tile.rpram.name=Модуль ОЗУ на 8K +tile.ribbon.name=Ленточный кабель + +item.disk.forth.name=Загрузочная дискета с FORTH +item.disk.forthxp.name=Расширенная дискета с FORTH +item.disk.name=Пустая дискета + +gui.cpu.diskid=Дисковод: %d +gui.cpu.consoleid=Консоль: %d +gui.cpu.selfid=ID: %d +gui.cpu.start=ПУСК +gui.cpu.halt=СТОП +gui.cpu.reset=СБРОС \ No newline at end of file diff --git a/src/main/resources/assets/rpcontrol/models/modem.obj b/src/main/resources/assets/rpcontrol/models/modem.obj new file mode 100644 index 0000000..25fdccd --- /dev/null +++ b/src/main/resources/assets/rpcontrol/models/modem.obj @@ -0,0 +1,470 @@ +# 18 Vertices +v 1.000000 0.000000 1.000000 +v 0.000000 0.000000 1.000000 +v 0.000000 0.000000 0.000000 +v 1.000000 0.000000 0.000000 +v 1.000000 0.500000 0.000000 +v 0.000000 0.500000 0.000000 +v 0.000000 0.500000 1.000000 +v 1.000000 0.500000 1.000000 +v 0.000000 0.312500 0.250000 +v 0.000000 0.187500 0.250000 +v 0.000000 0.187500 0.375000 +v 0.000000 0.312500 0.375000 +v 0.000000 0.187500 0.500000 +v 0.000000 0.312500 0.500000 +v 0.000000 0.187500 0.625000 +v 0.000000 0.312500 0.625000 +v 0.000000 0.187500 0.750000 +v 0.000000 0.312500 0.750000 + +# 304 Texture Coordinates +vtc 0.312500 0.812500 0.500000 0.500000 0.500000 +vtc 0.312500 0.750000 0.500000 0.500000 0.500000 +vtc 0.375000 0.750000 0.500000 0.500000 0.500000 +vtc 0.375000 0.812500 0.500000 0.500000 0.500000 +vtc 0.000000 0.812500 1.000000 1.000000 1.000000 +vtc 0.000000 0.750000 1.000000 1.000000 1.000000 +vtc 0.062500 0.750000 1.000000 1.000000 1.000000 +vtc 0.062500 0.812500 1.000000 1.000000 1.000000 +vtc 0.062500 0.781250 0.800000 0.800000 0.800000 +vtc 0.062500 0.750000 0.800000 0.800000 0.800000 +vtc 0.125000 0.750000 0.800000 0.800000 0.800000 +vtc 0.125000 0.781250 0.800000 0.800000 0.800000 +vtc 0.125000 0.781250 0.800000 0.800000 0.800000 +vtc 0.125000 0.750000 0.800000 0.800000 0.800000 +vtc 0.062500 0.750000 0.800000 0.800000 0.800000 +vtc 0.062500 0.781250 0.800000 0.800000 0.800000 +vtc 0.250000 0.781250 0.600000 0.600000 0.600000 +vtc 0.250000 0.750000 0.600000 0.600000 0.600000 +vtc 0.312500 0.750000 0.600000 0.600000 0.600000 +vtc 0.312500 0.781250 0.600000 0.600000 0.600000 +vtc 0.125000 0.781250 0.600000 0.600000 0.600000 +vtc 0.125000 0.750000 0.600000 0.600000 0.600000 +vtc 0.187500 0.750000 0.600000 0.600000 0.600000 +vtc 0.187500 0.781250 0.600000 0.600000 0.600000 +vtc 0.375000 0.812500 0.500000 0.500000 0.500000 +vtc 0.375000 0.750000 0.500000 0.500000 0.500000 +vtc 0.437500 0.750000 0.500000 0.500000 0.500000 +vtc 0.437500 0.812500 0.500000 0.500000 0.500000 +vtc 0.000000 0.812500 1.000000 1.000000 1.000000 +vtc 0.000000 0.750000 1.000000 1.000000 1.000000 +vtc 0.062500 0.750000 1.000000 1.000000 1.000000 +vtc 0.062500 0.812500 1.000000 1.000000 1.000000 +vtc 0.062500 0.781250 0.800000 0.800000 0.800000 +vtc 0.062500 0.750000 0.800000 0.800000 0.800000 +vtc 0.125000 0.750000 0.800000 0.800000 0.800000 +vtc 0.125000 0.781250 0.800000 0.800000 0.800000 +vtc 0.125000 0.781250 0.800000 0.800000 0.800000 +vtc 0.125000 0.750000 0.800000 0.800000 0.800000 +vtc 0.062500 0.750000 0.800000 0.800000 0.800000 +vtc 0.062500 0.781250 0.800000 0.800000 0.800000 +vtc 0.250000 0.781250 0.600000 0.600000 0.600000 +vtc 0.250000 0.750000 0.600000 0.600000 0.600000 +vtc 0.312500 0.750000 0.600000 0.600000 0.600000 +vtc 0.312500 0.781250 0.600000 0.600000 0.600000 +vtc 0.187500 0.781250 0.600000 0.600000 0.600000 +vtc 0.187500 0.750000 0.600000 0.600000 0.600000 +vtc 0.250000 0.750000 0.600000 0.600000 0.600000 +vtc 0.250000 0.781250 0.600000 0.600000 0.600000 +vtc 0.437500 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.812500 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.812500 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.812500 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.812500 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.812500 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.812500 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.812500 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 +vtc 0.500000 0.812500 0.600000 0.600000 0.600000 +vtc 0.437500 0.804688 0.600000 0.600000 0.600000 +vtc 0.437500 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.804688 0.600000 0.600000 0.600000 +vtc 0.445313 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.804688 0.600000 0.600000 0.600000 +vtc 0.453125 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.804688 0.600000 0.600000 0.600000 +vtc 0.460938 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.804688 0.600000 0.600000 0.600000 +vtc 0.468750 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.804688 0.600000 0.600000 0.600000 +vtc 0.476563 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.804688 0.600000 0.600000 0.600000 +vtc 0.484375 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.804688 0.600000 0.600000 0.600000 +vtc 0.492188 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.796875 0.600000 0.600000 0.600000 +vtc 0.500000 0.804688 0.600000 0.600000 0.600000 + +# 6 Groups +g 0 +g 1_1 +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 5/9 4/10 3/11 6/12 +f 7/13 2/14 1/15 8/16 +f 6/17 3/18 2/19 7/20 +f 8/21 1/22 4/23 5/24 +g 1_2 +f 1/25 2/26 3/27 4/28 +f 5/29 6/30 7/31 8/32 +f 5/33 4/34 3/35 6/36 +f 7/37 2/38 1/39 8/40 +f 6/41 3/42 2/43 7/44 +f 8/45 1/46 4/47 5/48 +g 2_1 +f 9/49 10/50 11/51 12/52 +g 2_2 +f 9/53 10/54 11/55 12/56 +g 2_3 +f 9/57 10/58 11/59 12/60 +g 2_4 +f 9/61 10/62 11/63 12/64 +g 2_5 +f 9/65 10/66 11/67 12/68 +g 2_6 +f 9/69 10/70 11/71 12/72 +g 2_7 +f 9/73 10/74 11/75 12/76 +g 2_8 +f 9/77 10/78 11/79 12/80 +g 2_9 +f 9/81 10/82 11/83 12/84 +g 2_10 +f 9/85 10/86 11/87 12/88 +g 2_11 +f 9/89 10/90 11/91 12/92 +g 2_12 +f 9/93 10/94 11/95 12/96 +g 2_13 +f 9/97 10/98 11/99 12/100 +g 2_14 +f 9/101 10/102 11/103 12/104 +g 2_15 +f 9/105 10/106 11/107 12/108 +g 2_16 +f 9/109 10/110 11/111 12/112 +g 3_1 +f 12/113 11/114 13/115 14/116 +g 3_2 +f 12/117 11/118 13/119 14/120 +g 3_3 +f 12/121 11/122 13/123 14/124 +g 3_4 +f 12/125 11/126 13/127 14/128 +g 3_5 +f 12/129 11/130 13/131 14/132 +g 3_6 +f 12/133 11/134 13/135 14/136 +g 3_7 +f 12/137 11/138 13/139 14/140 +g 3_8 +f 12/141 11/142 13/143 14/144 +g 3_9 +f 12/145 11/146 13/147 14/148 +g 3_10 +f 12/149 11/150 13/151 14/152 +g 3_11 +f 12/153 11/154 13/155 14/156 +g 3_12 +f 12/157 11/158 13/159 14/160 +g 3_13 +f 12/161 11/162 13/163 14/164 +g 3_14 +f 12/165 11/166 13/167 14/168 +g 3_15 +f 12/169 11/170 13/171 14/172 +g 3_16 +f 12/173 11/174 13/175 14/176 +g 4_1 +f 14/177 13/178 15/179 16/180 +g 4_2 +f 14/181 13/182 15/183 16/184 +g 4_3 +f 14/185 13/186 15/187 16/188 +g 4_4 +f 14/189 13/190 15/191 16/192 +g 4_5 +f 14/193 13/194 15/195 16/196 +g 4_6 +f 14/197 13/198 15/199 16/200 +g 4_7 +f 14/201 13/202 15/203 16/204 +g 4_8 +f 14/205 13/206 15/207 16/208 +g 4_9 +f 14/209 13/210 15/211 16/212 +g 4_10 +f 14/213 13/214 15/215 16/216 +g 4_11 +f 14/217 13/218 15/219 16/220 +g 4_12 +f 14/221 13/222 15/223 16/224 +g 4_13 +f 14/225 13/226 15/227 16/228 +g 4_14 +f 14/229 13/230 15/231 16/232 +g 4_15 +f 14/233 13/234 15/235 16/236 +g 4_16 +f 14/237 13/238 15/239 16/240 +g 5_1 +f 16/241 15/242 17/243 18/244 +g 5_2 +f 16/245 15/246 17/247 18/248 +g 5_3 +f 16/249 15/250 17/251 18/252 +g 5_4 +f 16/253 15/254 17/255 18/256 +g 5_5 +f 16/257 15/258 17/259 18/260 +g 5_6 +f 16/261 15/262 17/263 18/264 +g 5_7 +f 16/265 15/266 17/267 18/268 +g 5_8 +f 16/269 15/270 17/271 18/272 +g 5_9 +f 16/273 15/274 17/275 18/276 +g 5_10 +f 16/277 15/278 17/279 18/280 +g 5_11 +f 16/281 15/282 17/283 18/284 +g 5_12 +f 16/285 15/286 17/287 18/288 +g 5_13 +f 16/289 15/290 17/291 18/292 +g 5_14 +f 16/293 15/294 17/295 18/296 +g 5_15 +f 16/297 15/298 17/299 18/300 +g 5_16 +f 16/301 15/302 17/303 18/304 diff --git a/src/main/resources/assets/rpcontrol/models/modem.png b/src/main/resources/assets/rpcontrol/models/modem.png new file mode 100644 index 0000000000000000000000000000000000000000..ee19fe995cfd1bca218be2475167a63d56517b83 GIT binary patch literal 3225 zcmeHK=~vTN8V)TItkPH+4+WLzpwUB}#;_2%*yg5)6?gKnM^dn}8vPG=vcH%fR$ZPyYlz%!hm4d*A!zxzGEY=Y8+( zix<4~J~8?P1On-KpL4$i0%>h;wLrQ$+aWyVN$hse#<=>qf*M@U)#Ha0CYG9?C-92u9CW}Xz2 zcEsBJw7E^pw^lJA&|YnCch|ryl$fJT4H6g*NT;fb0x)R+kakOq<{$8!Ddq+VKEA0i>n;@r``>ufvKYD-U zL%J;RR4p1li+qWm+$ag3HyO#dilhg1!9N*ePNA z^aR@>83-h-*4Q9x246-AED`F%0^&K1aucJ*i?cX2VC@&yDenpG^=C2?Lq8*CFDgdo zY)v!P%?l6r_|#h@h8S`1cjP`lMh$_bd>&+=eD&LBsl2t22q4Js%`ql->9P9chy(Ar z9cIGNQayKj)M14|x=(qy@(9%v?b&9g7$Q(kFuCVeRvx*OcS(!ol(vTN;j?44#E4x2K&GlX?Q>+t_=*FkCAJD=@k zbEC$Im@X@FSoxi<6cv5HEKb)KDG$aGY^4h~TZrVtSiJ1owF=Lc_u!1QK-10VR$6?z zhSe)a$cRW75!c}h>Rj{BQ!A%m#JavanSO9aWX#%^l=5v$P3G2yR5~41{He9H6H{mZ zQ#KgOtWE&#PePKCl9kPrG8@-iwZyKhj?ctAl)tA!Q8U~%#5~_qqLJtd*e~___8_95z;j;^8oe$W2l5>qcxTZV`GWc$CFXCA)Q2I91#niSr&TOz!U+Ehe!FiCyf2g{g$nmmV{RJQ8*U5M} zbu0T_bN`GL?iBWi{j%5#Mo+M4E0bE~ct=QQa%gTV&O?4N#Y@t9_42Z5@Npz9w!djZ z289-}$I+Vk3CY|Hw~xUF_SYa>_M~8S);pfa+}}*Js3*W%yO?d=k|9G_c5lf zcdlUwwnWXxzXC&UEJ@>uYwObiK|M{9@byRp8pfSQqu>id^xWsvS%>x%ju-~{3ic*5 zg18i8FlaBTjj-2zA=10gM%IsfS7_0he2!2{>pEHk9kU_7WpHF$cc1@B%e(nm+uz+> z=Jt@ld0;wSgY0}q4qhe121JMTl)MLe z=?~Q$-s@hmR5_nmmLKOo6Uq`Vb1wQBv3=Qru)96xL8mH>rpm4>qj7ZE<9-N{aQ;Eg zmh&olQ-=xrTEhPIDk0m-!uFiWp&a_M1p>{Lhi6L1E=(z*i zb{!|;U#hK)hC?^x{vdt2_UlbX4BnR50tjlIp+N#Ve2GQt?9fu=~tj}Y|E8YZqv|=lc%w1arTSNu4lBnT`o-Sf`!Z)mPqN!{-gW+&l){h zzxlvVDux0UYrB(*CXrYVFQp@8OJ|1EKOQCc@$#GJSE_)VSpsLe61_guRc?q4^t-3x z^Y20bPD06>!zRe#2>v**92prrT2)^pUXO@geCxKLn}@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/backplaneSide.png b/src/main/resources/assets/rpcontrol/textures/blocks/backplaneSide.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8c07028caacd1d34e199178db15371e91445bd GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-gY_ImR*7;v~mM%F)w zPu?Re{^&z;=A|Xov1NvhJ{9~*N;N*BA&#PdlnjhNXug=wde>I@$lkrnMBdj_%}*~b w;Cj!L?ip&B(fgc5M2@{UYponCvoh2wV^FUB_dQUN?VEagCGGy<wsmvE{C z5gf^pOMc&DXEvz=st||Ocy|5X%+9_ihQlHJY7sK>;I4@b8}4H!dMF&d2!)XQ+|=D_}3f!+3z`xrrXLs)N%aJE7waPH{*je=eC7(-Yw z9*?1#ks(;o1Q#&_?eA5{jzaEznLBWPH4MQk{ZHLv3}MA&GJzL|Opq(P$n1*W`~(%p5wf0vm-`fv{paoic%~XRvm%gZ5b;?H5OAKiBK@2&>QbkUZJuC3c$# z?%#si-GCDoKv*%G&EO?PCh#BJgb)Iv75+0OgDw*g_D_O?8>k$15DadkdD27W@fLr} z{svd)wNr=cx8bN|g83Ev<4uT0U@EOB^SxM<&-aP+$_}`~GAPk|H9sYoFS);VH379x zhg4y?^}nw`GjNMuO5m1!CZGxb&k(B*@1_LH&lvR9A$zUMYE)SbI{bu}Q4cUV=%mlc zLef_tAvrCD%)W$G(Sq5NMmPf(*~m6|RpMGV4=a?ZkVuYfrbJ6LDX>&Y%DH!XE}H?H zX*til^!UG^Q8rRun2D}H8n@0vHV;Mi#6`k+{zJrWv|cMiurSlY&W`SY>@2?~#?ItE o4U|7?OvL-zRM~T-ubSHVH^pj!Z~*xa@Bjb+07*qoM6N<$g5#Px# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/cpuFront.png b/src/main/resources/assets/rpcontrol/textures/blocks/cpuFront.png new file mode 100644 index 0000000000000000000000000000000000000000..8dda9ef8c1ebf4f0966af85c6c2032eb7e12ce0d GIT binary patch literal 712 zcmV;(0yq7MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0y#-UK~y+TO_JYhQeha!&tFiqt!5HVJx-m9 zw)I2S%~*pmSOwh~j3Q{zl@Ue3AO;b%IVd+b=TVw^bZtw^EW6o7&|TL-L_xG# z4GCN~ee8`Pe9y!8ea`p!@jmY(rDIchbym+M-sl-n)74rf{koibRZ3OYQ`KVfCD4`% z+4*cDq|DxxP#X_+m<*lr5u?-6<&w=lhwZ4t*6Zx{+GUT;f|Fkekg3YFr03!s-Ua%$ z#!vmYeSUj#Z2SKB_uw!D5BBGSAOr!jygDb*1_^Ney6F2Io7lNNQV(4f1P@%0tuZe$ zvNr=LT2~#rF9N&8(|f%p+PH`Mqr*#>;0saD~#Z-PmKsoJ}EnJZbWTiR~Sp_FxkTE#BJvM7;ZBb%^%tTZe>_6%Ex);I^ zvG*qLVDX?%wzmz~Wn}BCixTsOG0MFL(Ct|PV#w&T%f;2G#OsKbM3J4Fqo0E#ji>$J zvi?^7KVT&)Z4{H-h5$eSO@9n{xWLz_p_TL3Wi@M$7o-hsiLr|Gp!eTE1Q8yN0>}yk zuqVxj8}q(To)t48B^LhWf(QF4(uwCo_z<$fazrXD&-3Qml{1Q>yuA@%e3480u+N9( zXG0cj{@Q`+M0@n|eq@|G8NI+4ZQ|up2W8E#whpf4+d}@3;r_Sm5cqOOs umL;&Z$ON^OD7Vy>=h^K{Vg_Y+YT_@%i!RO~VPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0h38YK~y+TjZ#fd!ax+1nR?p%6cCL@*K3$s3PE?ULc*_m9Y{fdmoB=+F6&^kJ z)W_-C$rT5~&KbXZF0K+0$Yg;beW8L^!e*P{TTUxJsa;kj&e7Vo+CncU;HY7~){S8u kRT>J9*_MS0lq`Mo1BpXLfvHN;9RL6T07*qoM6N<$g1(a34FCWD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveFrontFull.png b/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveFrontFull.png new file mode 100644 index 0000000000000000000000000000000000000000..39c9016fa8666ffe454038fc77fc14202dae6960 GIT binary patch literal 584 zcmV-O0=NB%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0l7&;K~y+Tjgm`i8c`I-@2+H{;sXT{6~Px2 z!Qd+2Agk=M>^CT(kVqd?G_)Bt3pK{5Lw$@IYiFqAYc|!?uKKn5vjcw?Z@Au>4(mg?)T$N)bm8sU^@rEB z()(uR@~=(_08D8Wg`u_yD$=`R;o=_-0H!H5!EclTve;bQ%I2?^eW3gB$6xz=tSbjmU>?260(>9yU z+#5kW9%t7`Btl5i;c#R!83c>Tov28=_9=5Z#@>NIAQ%in`~7}GGY^2^WA2ss`S8{1 zA?@){v)k=1m&@sNvM^E1>|wne38uq}g4Oq*MhSqMosAn}J?k=>r_2FNzrPi0y<<)E zzdl94J7My9>FOj~eVH%kt|SWD{inG$*mp8u)6tEXj_Ss*SkI!oeo}JbYUi9{z z4A?*}iJ@HPmI$8m_;#8+sE<;wNH@^Vk WrAI?saWO^!0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0m4Z{K~y+TjgmoY8c`6(-z|g^6%`ajR3y3z zMX-1Zfu4KHEysL=5(;f-S{h<#vT6uw)Tm1mT{UUCOI)Mwr6#qfey#q@gCHSo^O%J< zGr#}5H#<+X>#C`jY(x8Hcd)6gPsi<_qt@N9b$ipg9i0Ebth0W%($(^fQdU4`KW!d< z{aDU_sTcR2G*SRydLt)nqlr^gKj*R^{$T)Mrd}3YBfqzmNFi%ldFiN#{^csv{q&&Lsrz9Sg55v0>; zhr=OjBTy8Ds?lf^m!Qk#%49MKhF2$|sLt9a&FQPl%hV1AgP~9eIuHop5|kQ$kOv`7K)X9t%xF&UgQn&->` z%(|$GiFNic(f?W>0q=y#@2UrDTcx+Vg`ESHgn4m#V|M0^2w1;&Ec(3)Gne$rX7$bc zGJ=Km%Hl?A-iUy8w7lqQ1^yDwa~|L9wesoBoS~O(vpF^z%yNiboeaL!tjii*TD=Ny fyQ38#i|Y0tj!Z|lw0m`x00000NkvXXu0mjfy+;F@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveSide.png b/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveSide.png new file mode 100644 index 0000000000000000000000000000000000000000..783c53d0da388df0f895146f45438911798d4d25 GIT binary patch literal 707 zcmV;!0zCbRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J{fL_t(IPfe29auQ(>h3B2*##l*|l%@bp zd=T$6YRHX=8%t?If+T=4%*HkZW@iGkvIj7UZ{+z$RH}OZnv1Vboj%=eRBH2CzL?5qjwnEWhaYtKooLuM*qun&)tIN-4{fy^ z!za$Rk^!ccWoTDvbkrcvTsg zLX$nEe1p5`UwQ_&@gM~4^|cVR*YDr6<kF0=+3G-mFB z771Av;>Vx&QC~m3MSc1B29^GRdYyj1 zmpa-@9=>|F|ALx0tzQ%4Zmi#pwcC+)Gt_<#wZ%Z4_m#OX&pmnON!Ok^U1==e#(JtF6V<|Mz4&+<>8M#(`Y#}MKr$)1&i+Su)Mb*#c pT289wFr_49aob!m4e}%r{|#Ks_2hst`;7nq002ovPDHLkV1mRkJg)!% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveTop.png b/src/main/resources/assets/rpcontrol/textures/blocks/diskDriveTop.png new file mode 100644 index 0000000000000000000000000000000000000000..31ac571b772eab254156bb43de5a37b77047dd75 GIT binary patch literal 662 zcmV;H0%`q;P)N2bZe?^J zG%heMF*ZbLuk`=`0uxC@K~y+TRg&9s(ohtJ^Gs5m77*GhbxKG3K3;lbTRM&{A(RF} z&Ib-5C&+<>9122J##eIf9R};n+IQdn*T2^K3GU%)#NW+^bUG8Dk{O>&x!7SBHXB)N zWcKG!1~U;!k-q8NeIbBOUGYz*Z?o|>9sN#5zvAJ~c=)^+Y@)#?)Yfx#HCI-F?CD*; zb4{qsx7g+)o86{kL??S%+k`66KQKKVcAUXOzx9=I)vZ$$f2=8CB+SPEq-l+r~m)} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/displayFront.png b/src/main/resources/assets/rpcontrol/textures/blocks/displayFront.png new file mode 100644 index 0000000000000000000000000000000000000000..7b33a7d00e4ac0337480b372f45a7fa1bd0f6a16 GIT binary patch literal 561 zcmV-10?z%3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0isDnK~y+Tjgm`C0#O)-zb;V!V5(JZTNG_t zMA3x`X(4T*7U3!lS7Cyc5JZcZa#5LSI-$-u-Wt&v=TelK6)pN#y;Cy^1`<32!#U4; z_|A7e;_uj!aBWE3n~?!cLul&!tCnu4>3TI?S5hxPPFBQ-$X&#*PYL$My2H7)w6;3m z1vuNAP9c6yhLnK4Fgr~QbpZl0B_T{Gqiqin4HJ#D85kWf7wrsAHv=n+GnT#FOH(~9 zdvI)!nP6HOXu5PqOB`Jj{;dQLQpB7nQ(Y~~jk5WxZb!ltM2GHc(E!E`YKOfGq zJXb*gbMiYHSi-eBKpEiIhEvJjP$e7re9j*SysX#tH93Cfbp`#qNBh8Yi92az2V%%Gn5JJHv%wUa`S%#Io9OUKXNP00000NkvXXu0mjf&KBfj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/peripheralBack.png b/src/main/resources/assets/rpcontrol/textures/blocks/peripheralBack.png new file mode 100644 index 0000000000000000000000000000000000000000..830b8770ac37be0ab7215e6b39c00e2d19ef6c39 GIT binary patch literal 725 zcmV;`0xJE9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0!B$hK~y+TWs>V_(_j?F-+xFD=EQXs>pI#!V?nm{?5aB zpK}P8-B)~f_1 z94bEs^7n!KtuM`b(yUv(=!nx!W!f$`Yk58wC$>z3wiOy5mXtH4Y+cG4)r=vgjY>){ zr?hfXEgjc{<4Lom@Ckx88VY@5{%XKKzY_FAccG<4Pj{f(zMH;l*XORdozqT%rO@Hf za%3|EJ$VGJLE8_Z`_SVJ=w4_wfC5X-lA*<;lUs|9z2hDHYrN!xH?$mp7W@ly5>KIF zGBi27!fQd#d;34{tq0I*XeA(VRK1!ZND!I0x6J63v|dT6&MlKQApt4H1Uiv<3iQC_ zz!2o^CRm;I#EY)@wJlEDmGf2^nM@kO*cRO36bB~XH#uEQ6HLdUfkJNHf9R$#Zn(4s zl<(KMUY$h?q^qC8`(OIJS$0s5w)ufm;Lu%z)ygT-)e4xUNB2$EJ#f~+^KPjpO*P-B zF`&CfK}7-fWQyT~u5(m;@9nGSFJsZ&Sfs5LT5A62^ZO5PVy}01unPEtkrM=hTRH^> zyZ7$Jv!@%;t@Y^UdP_TL)$*WsB4K20$vG4hnFAs)huEr#+qbirdcpH{+vDsr8s4UB zk9Bgk6%S9xWj=ue*m%o_0U<%HlEy8yQWCpeWDY@o+5h+(I@!Td_1FKF00000NkvXX Hu0mjfc;Qj+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/peripheralBottom.png b/src/main/resources/assets/rpcontrol/textures/blocks/peripheralBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..1581015222858fef37120835bab6ba0d04452c66 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wcAhSdAr}6H7IO3|V&XJ^Y5J+kA7=`d>DGUJ7Tt_<7;z{oF5CU8V<@tSp}& zuvIr$omc$dtC@}0+|1kTcA0-|@BF#EfQ3Qg`|~yDnHTvwH;afU%`f8Gm-d5qQSR+| ze)5{>M*D=fd}w_5`Z|kMLw2N?Du-s>^!yta3JcXP7YRPxF7J_%%%$MaB&=U_L&mmE zT4bX|^Rc!zy;f)a<;}+n?ss`#+8X`j1Yd}JOxsHhz0NL;w7umwciszBFjo(s{P)%0 z-npxFcYcy-5!vs;^sR+$`I*M96LuSns#8;+X{=sY;%~>0;JG6qbH|_mpJKO*^7B8l zjQ{R>;i+BPO$T>=^N6>xC6TFoW!9Y272?zU_Y2hStq@@S&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0wYO8K~y+TO_FJE5@8gD-(OgbiCaJ$+!Kp_ zXiaQQT8qkBDEkZyFgr6a$T9;1!mt;MOXFYiyaUxHXTCl6%(>^iL}bGaDPSgn8Zmwew>RR!`uJL>woFpdjWZ%*UvqkdppU{A?y>u_uV=M zx?)X8=zKz}B(!q8T0T=tXG$rCPUK=#Dn=xCJ&{3*uvKFS8vNJEB|337ooE-|RA@0! z7k!1+-IJ$X(bO4&zFoSu9_ygL4|SKWE(hweuPkhrwn0miuGrD@1g}GBppe`5mL4eA z-aw^^C5|njqveUy;o*Igz8F*~x}j}pN(U(Im_oanBTl=5x7^Z0bxCsr-Fk15Y-q=< zv@n1>S>f@wN#ISlMCi?y|LG1t#6_tY(o(b7k`B1Jw@E<5-V#v>=#fe94+An6B?=eA zRk_|bXzDGDEzvP~>h0P$l?=UBe0Uv0O52TM&nVz6EvUwz!M2vimTfhQ+m^W)$Yl8F YFNj{~N@f^4asU7T07*qoM6N<$f{$A^O#lD@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/peripheralTop.png b/src/main/resources/assets/rpcontrol/textures/blocks/peripheralTop.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0982eb5dadaf943129d75cc6df42f83f179f76 GIT binary patch literal 719 zcmV;=0xN2bZe?^J zG%heMF*ZbLuk`=`0!&FnK~y+TO_J+R+F%sM-~VlkUv|+9=dw6&;AXNcnOO!d&M%w9 z07aCm+y-rFOQGD_LPaQ0t4ua^`jk5MgoFUi_rGcWHyytXZz?78k0p-U!H_}U z8z^mRY)48Hvs1z@=k!3lx)AL?(7Cqj#HCHG)J6mDWQyg_oj_ZJJWRV&{-@RQ02d`D z2?D{Cw88N`cLEynI)_L=4>fv!Xs8q-L?|%0Do6VPO|{vP&Y4=7YCG~RAxWKN^fqkU0oG*K}11F2%>`!ltd_nh$Wa%AYKIV;LW2q|Mcs7)9$*Kw+_SG z-FfeQ^Uchv`FxJWVuAH~jm>6*?RJaZZg(`8BZpjSs8xJ8OT`emiX-xrgkdLObS_}L zUcz|L`0U}!rQ{;nbKz1$t)d%Wm{iwMm`)PrV+!Ut4YQ~5UE{z*=A55HXhN-GNjzEI z#9+EfMA9+DZ_~KAw*^z3T!75^Cai>7#e30FoUL;>j)QzYe}Lg2=Oi1&X(ui{QEX1w zpjxe>QmLR`ufug+G#U+*N~Ivg;4TisO-N(^7-TXTl*?r_n@zM@Es1u!jasdSVzDS3 zWAM|^z<~Gh4Z^2|gW^J=5ExK%v;y8Um&?ih8GN>F8SY_=htNfx@ z_bsK@_!m;Bm+oMd|NS$K$775}BTT1L`LJ58gmf&JBZpjSs8!u=7yW)8!{HE<$po|6 k49n&6XfQ_(xztem4Lf_JgoZ<;D*ylh07*qoM6N<$f+11oPXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/blocks/ram8kSide.png b/src/main/resources/assets/rpcontrol/textures/blocks/ram8kSide.png new file mode 100644 index 0000000000000000000000000000000000000000..72d5288198b44e99dd6286aa151e577b3bbd0d41 GIT binary patch literal 452 zcmV;#0XzPQP);aLq|hPM@h$}wUS~RGn1Juw(vwFOP{4*inv~{aJ${$ ze!s)x@qp*^39r{{^Uxi|P%Pz8t{_9U1*k&-nUtU>3%aeqD8;tw61%TBMs+2quaY5x zXavy53JR?u``&>bER<;LWwrC*A1%i)4C5(RP)W)m*;$x==9p9jz?9gtjgP3l=5_@2 z#bu*oo)K_r7|?cY1oT6{`Vrt}xBAD1H4!8Z1G*ZPWr+ZWabNqfN>nxm)es3*(s?80TM<0sDMQ5TnB2Xcudp|E05q| z8o>Apf}k`~1_TkaV+|Ev%Aw?uvTz$?B-mw1$tVbD&&t uKA$10a(0F!z4HmX%KZgg0e1KSsqI1l0000PXHfh#1IPyt}^7le=p;~ zgM1EMjjxwSnT%Q%*!YPd)`%!WUjFn8!H6hQLKSCocTfDIW4#(Y{n>c}aNsKHA~l?l z2WRJcb<6vD?;TXu3cyt~hZ>8Pz@=~%9Zn0BOFI_EP7BafxN8NbVJ9K*JN6SoaI8QS zwl`(~J_0u@FpXxp8N_ciK4r1Su zW^gW&{1@E8KAZ8(*4O`x%VqzZzf{jOneCLI8N-ShmCv^R*ZKS|>5_wG6I(+LlV)1% zClR1z@2&?dvWp5i)Kb5^IdlH}|M;%?591;Fw|Q6z^UgUq?bmZ{{V5EXE{gG=siWe>cIDXIS3%1 z!=B8~AV~u0-5Uq`pw_E`HUm1^_aSeCt_oyX#lUu;OlaALNCz)YSCXk2fdXv|w5H|y zGTKmprltN zWint2aa=*P8BCF_roa)7qK)MqFokjtT0c`80}7A<9jyCI>d5{JrNDo_GwWYOtX`wI S$o_Bu0000fM$3z6(V_=YqsQosnS|&idLP|j zqMHn(-SNKPz4u#p-TNQhv(`ELJm;)^p0a;?KfmYfm}hz#ROBq=004kWOH<7d0KmiD z;sHpBagF7hGRGUq$52BRP(94HjT4ApX=|wATHJB=xDAYJ$hRDkX;iiy`4dvDF|^}nYX-0gzkz9inm!W8c*IfLxa`Atunz5#y|UxmwfaWSXX8`X;tOj z7k+cv93lb{oTzMHJNw{Y4$BFc$Bk4WZ7s*qvYEWs7M@qn3TRjPkLOUHGlPVI2p`^4 zJMcdIJETwS=g%vBzNaB~h7*;pHU}2kFW(2Zh`r(H@pW#W&}yc`zvPw3NKJ}z=<6BB zmmnpk@i{GgV5x08q#(PqB)kk2Q|GVA|Fj)X{{`M*dU(8P8jaV;^*Wh8Ky4$^6k86Q|80t3K zU9LIn+`V(t1C%MFHO39!SQRNo$Ham^@@l$9Xy_bsLJth36_yU|j%iL*ghjLk`>lXt zdFQ_s#ToCU$4`e`j_NM(^(A-MPGkt=WZ_*Pua9ib_Apn^Z_zt->w}N%5SKqkL>8B< zvTg|{&!#TEc^Ow4h5WSigC$KBZ=ItxH#td!>BRMxqIJ|GSqFksT-Q{Zj_Y0e>u)vf zm&0~Y{rQvC-=}-?`<71$yg+Z5NQ4Gvg;qOibnwrs*8?&jkBndZKo#Coixmjvw%+$| z`uIy@Tf(ndotR5a``}TlGUnrCXr|wBodQ6Cr1NoIbGots0qvJdwYWi%?1=Pu&9S7e#X;b^GMJI0R@YdWE07wbev0YyYXeyn>I9dOR zxayzZ2b7)hnXB~3V84r0lKD^EXX}s(_%^2ywGc)YEKK$m zwVtTFSs{L%uf9Y9jM`(KU{H=`L<8Q)1)6pcg!`nzc{ui=M#g|$WVfs5*t_jXmk!LK zXY<(!L3i1|t5Ilepx+s~bv?vg}Q_sf9)!HjQjS zPj)(D5SQ4dRDPxm+wNOu`Zy0HBp#KMYRdC$kn7@AgOT7H1p##&siH&EPGmmj*a*6l zw5BDqQ$Gx9DN9NEJTS9RQUXG7dZOVe#B+JPbiPC}S97U6?a^H3pHGkP$cF7z<$4rV znswcCbkOrlWyj<-x!11JW#VJ)1+yPQuGRtP>>llZHp95jkII%RNfTW0^RBk2x;de+ zj~^k(R-5aoAJdR^rKb|mV}5A5wUz(gI4AV`bjZPDS)0o_ZdgyLQlK4gIm=;2A?eqF5xxqzV`Ai$AqRi~9``CG?5eLYzU@^Avrsi-prd3^JxIPlc`MY?Ti@ zyw?NERFam6*@*mXObx-vIvaDFo8Ud_kOeOmLy%%b*)u~a3uq7N>5XJoNU0e zVEM#eNwOifT=0mCW5v2xJit8cuYg`ddVH-Fr29o|iM)=hrkQl|Gfzq4 z|Fm&lJ0f_p74!<9U(L~kJkmdKjDnffaTaG@4iD(UH(*Y%edny1_-TavFTyA1eLF`= z_yJZs(wyHy+%0YBDv>+gTxn#3{g<6y=s? z=1cHsqU-KXhR?>}@59qSdRo_#FW-Ih;)uhZ>*;CiVf0nCk1)*6AuB4FnDI&&BcW(F8G~TQgO(eAPh0fp2`6jmaSemG-`mcYO z4k_>Fr~kNgUN@JTXI*A&4OILg33numkv7J408-SV?lQ8Y7E^!qUX>Rx0pkbCw@p9M z(y4PimABarOjb`w-;60(|E{O9!e;TFa(Uq$qbi%aN7DIPxV0!p9EF?psa)k1O}Ryc zzHl9CWjH~Mv^%$I_AH{@BsAy6d5=_gwJD8qvlJo`XU#H;dTx}`|yjmUXy*gL2ZiNLz52ak2Iq9H`Lc885@;-8ZYw+xj zc~^o=H@x0@4Q3Z5vSEy~h~fw1WKQ0T@QUQ?Y8fe2TZ&S0<>=T!(w->is3e*N32FT+ zkumB*330$poPGjwNMeIBeE-N$Z8-o`E$wmUx6JFGIk}K?b@6V-2!!Tct@i|B-d&d! z@(st`2(qN^4@3RHhdwtM2Xqqo!dsGvR+X45@*^JU9o%4%;u6{aEk;kS#?+A1erqT$ z^h>a0r@ozcJ7MH0E4+J(F=b@0He|3ORla^Ff!BRZDe+s#APn>J@>*(}^XiI%B&3%i z&$kDu`W%27KIZEiofgQ;IMjCl`5Z}YPgkwWZI6PH)!&zqIS|fGTDcpTGLPzsLvhl;r)64u24{4=S zI0Ml_jg4ov^`Y7BX=OX!LRW9tHy|WCLy8k(t@pN@dP??EWIUB^MxhKylxp&@s<8kR z_|vIj&F4-afS%0=qJb!qF`fhb)qrf$g;|*JF1{prY425han_Fr2h ze9&ZGu(%+@sAhL;l(NUUpI`9qpC*dabV>K(|I{BBHiD9hwjkfCM750{U>djm!V-5! z307FGmK)oGjVXobh!`AL9c3Cdgz4 zFepQ}zg2^7CT4hI&!SC9I=m7a{-_^CgwU@BU(KZjqqoVHI0g8?n*#DAUHrctCy}Bc z(fiAb#ST{PFkrs1~jmFi!Hku7hd|X@77Y-h2CW%Xn;b*~_Vmdsa;`kzM?T zf*ppw2dOB%ycqjJ5v-W-2b(7bqGnD4!($TznEO_e-CY4!_?M!y$-3rScO9 z^G|@yP__G$flKI_KX z&$6m?{srk`I`X;2w`tk;xBYt{xzu0%kmb@6hDc3zOKk##Of?Oc_DZqJ?ZJ}lY?aM| zwUw57SpH>6F#&A=7M(g?Woaz$C@V!EQk)D_1b61uu%=51ee`yl`aT)@(%`#35 zIAe3wkTx$h4Kk5a6!Zi{@T|}f0~eRQvgP=lw`@|4lF53)js5M1G|o-Ctij-@%&7=65tM8wft{-jg5X zW*;#c*NB~r9WCcAL6bbdA9+i!9$BGZbbZL+N8nuiEvT=v_yj85rlBJd|HGxx9t z+`wF+e1cPF&m>bWhB6tJRjq~t^2^W;&{tIAH){=g4KnA1 z7YNiMja*L0M?7k>P#cU35vd570q&$MAKY2a?eUsWxQ8n|CLRmjwLQUFRiBj7!ZkG8 zd&0R>je$&-8(U%`Vl4 zcS@7M9hae~PPY&f0ZBcLvsM+5lWYHGy?s3uSbx|DbrzI9C*&AIPyxeiKAvGFun-={ z+|Dyj(6{gkg`ziU@NNpySUd0buE1qTDDsX z5w-rE&AWB>g6bYjynZh|0Bvhx7IHlnT@t@(wn1&OGpfYD)U7q~YhYOMq#Z2n`{S-J z@UjP~hkf=xt}lQ4>`8Sv$pei(ZG1z3<$(i$NXq;w%3u%#bqGD5d?G58JS{yECsy|` zQ)q#Wz*an0D2Tn=NY#4rNvRHfzXwv;onDwo(Zr?&F4pC~u-xwrix##ulNMEt7vsKPI5%Urn+@Om^icKX38z+`UU zM-A9=s%PH&$TZnYqlPR;CY(cp(T^@Lg{@`5|4kbP01u?+9ke7FlffRuAW*Hlavj)R zMg&ds8lU4~;^(M#c^jWSH_skqZN``s1bE82*Q$duyI zU1X5Zq$@(uyk1F#U3mZgiDImVqSdeAEl^u&U2|z7cZOKJdQY3ip6NDTY`2MmK$EUg zS>F6mh1~w$^lL$K=1ET+|Djw?9!EJMTRX1rbxV844Ke>VavlkE9|g)WWAcr$HYNOE z1|Q$q>x*{{9ba4oJkk$d4xEUGYU{B|5$Jm943&?fL%(8(MZ3IdT+>1be}Ae)Rg9wZ zCGK%Y2tw=-cQ4h5y;^|o`v(nu(X5MbF8{y!UM)5ot2GYv4te*L<_tOJQ^i%_D!nbq zy%npa(X4-nO{rb>iSwdPn^d-6n}+tD)v_<%wc%1(p)QtH9N=BZdJ4HdsB*dWEUt@G z?30?r-EPmOH&>gTBd7IZY@atB^TiHil9*705cMA_lW9xNaX;P1_whMd+q+iFC%;P}#FL0lSHs>v=%G~+CyA4mwR^;)l&BEY*y=$&TeD_=0&&INQB z3^wXs6CLb-QlE9)&Xs+=SL~8)P3+YNyvGrXK3Zaqfl#S9c8%Tt=HlW7H-qslQc7}@ z?9pkda)FFne`2BiSVja!UuD0&CVBRE(k4O+0mcu~GWKu+I0w6W*!q^7gxGh;*0=`( zL(9~!#0?FBp_7GR$*t8@*F;Jkx+c{ z3k-f-p;S-qTZw14S0abwm$*^BS|7q6Je#VZ@#~@Y4Y|bAIiA`XAY2^)YyN(FKQ@PY z(9ZyyOU4Sr1{Eazx&a*>#CW1lN&B>$AwSL-RBO!k8=r5Ml5lYUmBo-j1t!C7pKc)e zRTe}pH(64BzHvL-+LSSke?40+^@(1leqWEwV$i>fF;BIjw{&?q zR?XfC0xUz>F6XEF`v%!(D31z#w=0V7=AvS7>~apM#(oj1fRJhB$Ne?nL(ES}$4vBM zU-|ebW*q;hZl^m%c~tx|7zp3kY?mgeDot1>5IK>hq}O+He*Y8=TA$U6%6%1B9Vo#K zqW0--kgUy3mzN72TrO5ga~m3+szf9?9axfEz|o(!jqxns48N0jrsQq^9fBZBalJiVWlp1zvVV+@^$-hqrv*<;^xjXXtyrQdniF8o%*JzZJMu&&)#x7VX_4 zjMGNfE8MYP33X%vMC@ob9!R*RX!8}X&**i1@5e%&tox%2ad@P{u_k)-nD zy389%D4^wTs5T3Mi?s-}0Sd)TpL=wsGmnhJ<_L4c@EnI=<@>>*eJ zaW0ll`X9ztKK`YHMP=aiGCOr)wECF$i>9Yid7-hB(H1<*R7Zi^k@~iV%5x;z^TmAq zfCmb=IsA5YxrBPUnRVoMy@i`l<6-R{{p=K9n)$O#RO}b{S!zE%8^lc6 znKpbrTZ)jTO(q53vTVSehM}RO(v)E;QIe>;UQdL879q_N#_1QWLF^Y?4M-m;2&hPee1!jrfts$?YlS+qklk-mQS6X9J#FJ|XY z%fhc1ElN#^xb)hATRaPMIR`rpSE`vD;d~QvZ~A8+61O9#92+ppLg?}BRMyTb`Lhc0 zA8UsC_^FJC!?$vf!&8x>?>#9Oeo(V5kFS3@JHN& z@YYDiEc;yp+(|Us91$ zwe;X}a^)GZS7yK%4yDfcs=a{Wm}3MbPnY+BEFn&cq!kC;iKJ8}y+c6zx99|4JV$~z z;Ah2bSEtz`O{+|FtK#CH*Mo5T9Y_a&C9KtPQOKAlvYDq3W($y@fA%QSzct77h~iEp itt#pNU;aG?S4tEMDt}ePmXjN&!d zfD{1KIyXL;wvk&lRJb|yjED2)Q6)8PLmOq)A*f{Q&NGP9zSl>1Cb>3BK7YX}{vPLUQnlSB)Ytvl*yoeEx60Y9E$Vx-Obk({*=;xs@omDGT z#W8KP<@x@3^tq>#Tk0ruI-SWqU{Nigpe6B=g_3So*dSGqggz@>Tkt~4h1cQncqVr# zQzBa8UI^;N>Cf|zUkI}(o=D!YJ42~->AH(kuXgl)j4Afq8tgk0g~O)8U)Xttj*x{* zC_LN8^XS?fMT7c#nPFUS%-C^I?JOB!Jp_PSH@VCBNwuN$mDXr|bc`$jW;U^QB1@{K zA^`VsbrfY*=1AMr-p1;9Hy!T7icue((T6fUqIp_QCV{?2(unvLW0M>ak=k?V1Z6c$ zHQVMI?|n+N95~T|jm-_$WWq8OEjKnIlr;%B>@2GQMlD zwV+cl_8R>$41k<40K&8OxO>bC7yn`f{zc|n)E!r)@RiTi>)U6%jFk8%E)a)1Z`uQJ z_VRf9!3@6Lr}k)FBkxhBmbALFNXd{OA#ys~#KE!()cs20AtSP7D{er;G>ps|vzc_i+gPo;b#|IxMOG+B!bqf}Ku&3Eb&l~FE71fQ(@LtFZ!!kUz0>kW^q zIc=mpU9#|_g%_RZWeT}_wN|;;yJL6Yd!LTd^e}fF(bV!`om4l9!zAiy%L*mb69$5# zELrs-JS!1xx%}QJfw?8mY%rSF2DvfMKv%^e2D&O61p$=?Eed8r5owgk$9l~tv|#qU z>7Nj@`iw!gW-gX%H9NR`n7ioXoXqVx$zXbUbl}IN43?9nEy62ownZ8RK!T;F`r-Ek zMm!hA%u8+3&#gJIJ%Ac#P+Ju82YSGlcxzb7mj&7PbFnX%5@v+eIj>V6VrxFcYqz+< zU3o!OTRMjRHoSe#!|)mHDtu;TRxcZ>ojYT!#PG~y$dFa`HHe9avI*!T`DI8iA~HAq zn|OwoZUlh&>lG&MntSo4XmOSy&dE&nt$Yyy<^@5)p*ftC(~rOW^hv9L_mFkW8Qa4Z zZu`6>&I^_cmj~H?yy_oTpc7;@^Jeg&+-#r-RVI4UhNVY!Gl! z=Y}WUa!uIS;C{UJ!)7=DkFOpG$IJW@mzsjO*_!ON{v=e+1#>Br&Ol1hilo_4A7okd%YN$^hy&Lx~;ou^%}RO`o@( zS?tl4e*aYloVxOnRgc5OrH;PA*;{vqwc!ozS)#I@G4`SS!SZ5t$Bs_xjU$_C zN!U))U})AqOyL6S^+Fy~hgIBgwpQ5ee8lnW_;_7lbwxX$uPX+P=x?@Y(3ve03I{ z@ZeXIa1#5o;V5(Lb#yIfzV_i*N~{yy>yF6nF-OpM44$otT&bq(HK>uA`s4dwP}23# zeS#o-QonuvI;I~0+xL0pjwMb2oVu~CbiZt#+LrQ)HY6pCyRdh(-}*RKs}iCxH5h8C z${|ur(;$_gU$h9}+~4WwJO2|*ZJFbLpwy#Sve-|(3e3jK4$;e=v3WD_( z^%@v>Y%BYA+w(%y1U?f#GDJR%R!Oc@$qd6H3~moct3s5nrg{WPMsgfG$8v5Ea@CnS z>meN9n*hv(XOLZMns(Rv*hA8&(mOs=pdS&v?-G;f)qKDqdk96oW>t zc_ww`(bnGeTS+;ssg<3EQK06}4Sbv*%{Tn(){x8T1`D0%TayyLmF(RAC}H6#s`h-2 z4fEJ34O$?|7~=NpA82;org1Jk&xL_>Ez_MWM60@s3&g*cgC-}F?K(u1rW#mGF^p4e zcSTVR^1i?0x5jX17cL1_@iu|H>|$M>pz(1u?l+-C4rFgOPAh%YQu_M&^n=jy@10$= zh4R|Atk8t#@O~~nR<6C5qX`4q<1#&;9J(%kZth}hLO5SY(%%Z-YbU1;i6e4Pu0i?v zuVw68f6_A2y8{%VT@VF}6hwXu`W2ZW-HEm(Cf_>^#g+eJ@%DA*zdNle6`&{y!UYN}TlLOAYf2E>yj*d(d;s#|%MaKLEoITq zj(r3IBgS_ZDT%I~o4M$pU$Tt-^NOqvOlGe6%Z6TSVW4@pCthgN^25pPys zSxF1aev-m#@zLh?W)9LvZT*owlhKQ+ zh&u)m+gN*DV*aFiId|IhH0MNHbvKra4xGR?3icgu+Y5mDFKrr_SJXt0df~RYvGv)2 z2Zk1^ExNfS!kAUt`V+=bjG6gPBm2SC{2xB-6~m4%G{W_nkJKTF#sC=?{#`8xiu>lI z82_-vCeu9kpqt^`RYT?IZzm{(+})@IoiS9XeUoICcNfC^E-&q?zsYt)?hTXeANg?{ zN6Hv^>Xs)*h|Ef~(2+7X6tFMvJF4-O9nxSJHPShCQVR5hTqhk@$^@`j>ZGG29enwUZz|CCFl?HU!D~ zAs)IET<=v*39|rTi^bnB3fK@MdX~t=D8kCSx?XVj3;|QrPD`)%>^JC!Hr0J6YAAXJ z|JnWxqBhzfmT&hVb2f!Ys?hv;UZ@K-O*o-hAV%-o_iTjkqMTI)YFG}RZkPv}r-;Kc zU+=%OIB}IDW(QMp#@NK_%XL1`edONR^LT$3KP5$mi+y$Z+{bmiQK4V^r{5tqottF& z_#+2A-&!6T33R#sebz0piDDzK0P&S0LuO<|sd-Uk7^o;rw=zvrnpK4{n1XlhA#(ff{4+ntB)W!-&$av5fS=r@4KZO zte^FT-Ow@ObMcX1xQA(6?JYsCw8)P%Tx4zm0RPMS$5e_-qCrRxQ?ww;C=YeWP;u+N z;alKJqR*=S3u0@{Pp=IH!(=Vl-xV&p2h=<6|_E=-vJd?4O z!VUs_XvDok1yFCh@ClIt7RSs;%*=}L;gth}Ip)W1u}n${7h4Ei#UUvvO%={naTUy- zalZzE5~HTpAb03kpg`69dD=q5$wA$;`=t}1$|M0KA-1k`xkxWk8qdc;SOT39H*V+9 zGW;W>001;Y@K4M?9TIByPlw!S_kWn|e~qlZ_-NDSFD%EJ*`FP=xX z^Twn~wnHko{uz>VsOo)dV#~g=ES`+cVCdh#JT6TmK0=5(VY} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/items/disk.png b/src/main/resources/assets/rpcontrol/textures/items/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..13be704da1b7018fa2f57a98ea7dcf870ac116cb GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pJ)SO(Ar}70C$_C$&e7bN{q_IJV+G7As;d7dH*J(E`0?T4|7x={|M%x6 ze*Uk!`PBdS_jfYtwDl}qy0lPwL-Em;|I)vL515>2@C`0H$kxQulsJKL)~s1Kco{r} z4&AzS>;K=se>tTWtXS~j{?&U@JyS(R1D|vhF?uNbOk6)(xl87pfkT+fMnr~#A{%9fw`JBc1{NK8{M-9;vB?}XEIo|?PQoO)5iEDiHrBgc?O0* X8po|HjqZyB{lVbr>gTe~DWM4fY`T8~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcontrol/textures/items/diskForth.png b/src/main/resources/assets/rpcontrol/textures/items/diskForth.png new file mode 100644 index 0000000000000000000000000000000000000000..bec2b5e4e984ae0b3e740685907172daff00cbee GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p^PVn_Ar}70C$_C$&e7bN{q_IJV+G7As;d7dH*J(E`0?T4|EaO%|JB3n z{_d~*?P*Z|a#r#G>a;lK&5jXKQBvC(xu?JRFF))1lltdRg8zS(TKC^yWB2#^Q*Rdk zzq~sC|NRYh))LJ;7p`16lE>gNN#NSGYyaNAfA4>T!Iic3|GID264tC)(V^r%h1)?Y zv8(2;OyHA(HpWd#UAzGkrvK-^#BpfVDKCv87s&>G;oOGKM!6f>FCMu_C*)_cePh~X q;m3Tz@C@sXCk8wU;=vgQ>e(1pTsc0#LT=By}Z;C1rt33 zJ=4@yqg0@p%bqTdAr}70C$_C$&e7bN{q_IJV+G7As;d7dH*J(E`0?T4|59Q9zvnad ze5wEZZF0iDOQz5N`A6-MJj0flnVETqO($m4|NXi5TmL`pHvh{%ujteM%TI#;tFN2; z>3;FwJO3}2>HXWE__u5W(>9jfB$kyFIchQ!~LuGq>#nyDs(s(0dG?u6{1-oD!M1@Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpcore/default.cfg b/src/main/resources/assets/rpcore/default.cfg new file mode 100644 index 0000000..45d9f6f --- /dev/null +++ b/src/main/resources/assets/rpcore/default.cfg @@ -0,0 +1,37 @@ +# RedPower 2 Configuration + +enchant { + disjunction.id=79 + vorpal.id=80 +} + +settings { + compat.gear.altRecipe=0 + + logic.enableSounds=1 + machine { + frame { + alwayscrate=0 + linksize=1000 + } + + } + + world { + generate { + copper=1 + silver=1 + tin=1 + volcano=1 + marble=1 + } + + tweaks { + craftcircle=1 + spreadmoss=1 + unbricks=1 + } + + } + +} diff --git a/src/main/resources/assets/rpcore/lang/en_US.lang b/src/main/resources/assets/rpcore/lang/en_US.lang new file mode 100644 index 0000000..036e56d --- /dev/null +++ b/src/main/resources/assets/rpcore/lang/en_US.lang @@ -0,0 +1,2055 @@ +itemGroup.RPMicroblocks=RedPower Microblocks + +achievement.rpMakeSaw.desc=Craft a diamond handsaw +achievement.rpMakeSaw=It Slices, it Dices + +enchantment.damage.disjunction=Disjunction +enchantment.damage.vorpal=Vorpal + +item.handsawDiamond.name=Diamond Handsaw +item.handsawGreenSapphire.name=Green Sapphire Handsaw +item.handsawIron.name=Iron Handsaw +item.handsawRuby.name=Ruby Handsaw +item.handsawSapphire.name=Sapphire Handsaw + +tile.rpcov3.basalt.name=Basalt Triple Cover +tile.rpcov3.basaltBrick.name=Basalt Brick Triple Cover +tile.rpcov3.basaltCircle.name=Chiseled Basalt Brick Triple Cover +tile.rpcov3.basaltCobble.name=Basalt Cobblestone Triple Cover +tile.rpcov3.basaltPaver.name=Basalt Paver Triple Cover +tile.rpcov3.books.name=Bookshelf Triple Cover +tile.rpcov3.brick.name=Brick Triple Cover +tile.rpcov3.clay.name=Clay Triple Cover +tile.rpcov3.cobble.name=Cobblestone Triple Cover +tile.rpcov3.copperBlock.name=Copper Block Triple Cover +tile.rpcov3.diamond.name=Diamond Triple Cover +tile.rpcov3.dirt.name=Dirt Triple Cover +tile.rpcov3.glass.name=Glass Triple Cover +tile.rpcov3.gold.name=Gold Triple Cover +tile.rpcov3.greenSapphireBlock.name=Green Sapphire Block Triple Cover +tile.rpcov3.iron.name=Iron Triple Cover +tile.rpcov3.lapis.name=Lapis Lazuli Triple Cover +tile.rpcov3.marble.name=Marble Triple Cover +tile.rpcov3.marbleBrick.name=Marble Brick Triple Cover +tile.rpcov3.moss.name=Moss Stone Triple Cover +tile.rpcov3.netherbrick.name=Nether Brick Triple Cover +tile.rpcov3.netherrack.name=Netherrack Triple Cover +tile.rpcov3.obsidian.name=Obsidian Triple Cover +tile.rpcov3.planks.name=Wooden Plank Triple Cover +tile.rpcov3.planks1.name=Wooden Plank Triple Cover +tile.rpcov3.planks2.name=Wooden Plank Triple Cover +tile.rpcov3.planks3.name=Wooden Plank Triple Cover +tile.rpcov3.pumpkin.name=Pumpkin Triple Cover +tile.rpcov3.rplog.name=Rubberwood Triple Cover +tile.rpcov3.rubyBlock.name=Ruby Block Triple Cover +tile.rpcov3.sandstone.name=Sandstone Triple Cover +tile.rpcov3.sandstone1.name=Sandstone Triple Cover +tile.rpcov3.sandstone2.name=Sandstone Triple Cover +tile.rpcov3.sapphireBlock.name=Sapphire Block Triple Cover +tile.rpcov3.silverBlock.name=Silver Block Triple Cover +tile.rpcov3.slab.name=Polished Stone Triple Cover +tile.rpcov3.snow.name=Snow Triple Cover +tile.rpcov3.soul.name=Soul Sand Triple Cover +tile.rpcov3.stone.name=Stone Triple Cover +tile.rpcov3.stonebrick.name=Stone Brick Triple Cover +tile.rpcov3.stonebrick1.name=Stone Brick Triple Cover +tile.rpcov3.stonebrick2.name=Stone Brick Triple Cover +tile.rpcov3.stonebrick3.name=Stone Brick Triple Cover +tile.rpcov3.tinBlock.name=Tin Block Triple Cover +tile.rpcov3.tungstenBlock.name=Tungsten Block Triple Cover +tile.rpcov3.wood.name=Oak Wood Triple Cover +tile.rpcov3.wood1.name=Spruce Wood Triple Cover +tile.rpcov3.wood2.name=Birch Wood Triple Cover +tile.rpcov3.wood3.name=Jungle Wood Triple Cover +tile.rpcov3.wool.black.name=Black Wool Triple Cover +tile.rpcov3.wool.blue.name=Blue Wool Triple Cover +tile.rpcov3.wool.brown.name=Brown Wool Triple Cover +tile.rpcov3.wool.cyan.name=Cyan Wool Triple Cover +tile.rpcov3.wool.gray.name=Gray Wool Triple Cover +tile.rpcov3.wool.green.name=Green Wool Triple Cover +tile.rpcov3.wool.lightBlue.name=Light Blue Wool Triple Cover +tile.rpcov3.wool.lime.name=Lime Wool Triple Cover +tile.rpcov3.wool.magenta.name=Magenta Wool Triple Cover +tile.rpcov3.wool.orange.name=Orange Wool Triple Cover +tile.rpcov3.wool.pink.name=Pink Wool Triple Cover +tile.rpcov3.wool.purple.name=Purple Wool Triple Cover +tile.rpcov3.wool.red.name=Red Wool Triple Cover +tile.rpcov3.wool.silver.name=Light Gray Wool Triple Cover +tile.rpcov3.wool.white.name=White Wool Triple Cover +tile.rpcov3.wool.yellow.name=Yellow Wool Triple Cover + +tile.rpcov3c.basalt.name=Basalt Triple Cover Corner +tile.rpcov3c.basaltBrick.name=Basalt Brick Triple Cover Corner +tile.rpcov3c.basaltCircle.name=Chiseled Basalt Brick Triple Cover Corner +tile.rpcov3c.basaltCobble.name=Basalt Cobblestone Triple Cover Corner +tile.rpcov3c.basaltPaver.name=Basalt Paver Triple Cover Corner +tile.rpcov3c.books.name=Bookshelf Triple Cover Corner +tile.rpcov3c.brick.name=Brick Triple Cover Corner +tile.rpcov3c.clay.name=Clay Triple Cover Corner +tile.rpcov3c.cobble.name=Cobblestone Triple Cover Corner +tile.rpcov3c.copperBlock.name=Copper Block Triple Cover Corner +tile.rpcov3c.diamond.name=Diamond Triple Cover Corner +tile.rpcov3c.dirt.name=Dirt Triple Cover Corner +tile.rpcov3c.glass.name=Glass Triple Cover Corner +tile.rpcov3c.gold.name=Gold Triple Cover Corner +tile.rpcov3c.greenSapphireBlock.name=Green Sapphire Block Triple Cover Corner +tile.rpcov3c.iron.name=Iron Triple Cover Corner +tile.rpcov3c.lapis.name=Lapis Lazuli Triple Cover Corner +tile.rpcov3c.marble.name=Marble Triple Cover Corner +tile.rpcov3c.marbleBrick.name=Marble Brick Triple Cover Corner +tile.rpcov3c.moss.name=Moss Stone Triple Cover Corner +tile.rpcov3c.netherbrick.name=Nether Brick Triple Cover Corner +tile.rpcov3c.netherrack.name=Netherrack Triple Cover Corner +tile.rpcov3c.obsidian.name=Obsidian Triple Cover Corner +tile.rpcov3c.planks.name=Wooden Plank Triple Cover Corner +tile.rpcov3c.planks1.name=Wooden Plank Triple Cover Corner +tile.rpcov3c.planks2.name=Wooden Plank Triple Cover Corner +tile.rpcov3c.planks3.name=Wooden Plank Triple Cover Corner +tile.rpcov3c.pumpkin.name=Pumpkin Triple Cover Corner +tile.rpcov3c.rplog.name=Rubberwood Triple Cover Corner +tile.rpcov3c.rubyBlock.name=Ruby Block Triple Cover Corner +tile.rpcov3c.sandstone.name=Sandstone Triple Cover Corner +tile.rpcov3c.sandstone1.name=Sandstone Triple Cover Corner +tile.rpcov3c.sandstone2.name=Sandstone Triple Cover Corner +tile.rpcov3c.sapphireBlock.name=Sapphire Block Triple Cover Corner +tile.rpcov3c.silverBlock.name=Silver Block Triple Cover Corner +tile.rpcov3c.slab.name=Polished Stone Triple Cover Corner +tile.rpcov3c.snow.name=Snow Triple Cover Corner +tile.rpcov3c.soul.name=Soul Sand Triple Cover Corner +tile.rpcov3c.stone.name=Stone Triple Cover Corner +tile.rpcov3c.stonebrick.name=Stone Brick Triple Cover Corner +tile.rpcov3c.stonebrick1.name=Stone Brick Triple Cover Corner +tile.rpcov3c.stonebrick2.name=Stone Brick Triple Cover Corner +tile.rpcov3c.stonebrick3.name=Stone Brick Triple Cover Corner +tile.rpcov3c.tinBlock.name=Tin Block Triple Cover Corner +tile.rpcov3c.tungstenBlock.name=Tungsten Block Triple Cover Corner +tile.rpcov3c.wood.name=Oak Wood Triple Cover Corner +tile.rpcov3c.wood1.name=Spruce Wood Triple Cover Corner +tile.rpcov3c.wood2.name=Birch Wood Triple Cover Corner +tile.rpcov3c.wood3.name=Jungle Wood Triple Cover Corner +tile.rpcov3c.wool.black.name=Black Wool Triple Cover Corner +tile.rpcov3c.wool.blue.name=Blue Wool Triple Cover Corner +tile.rpcov3c.wool.brown.name=Brown Wool Triple Cover Corner +tile.rpcov3c.wool.cyan.name=Cyan Wool Triple Cover Corner +tile.rpcov3c.wool.gray.name=Gray Wool Triple Cover Corner +tile.rpcov3c.wool.green.name=Green Wool Triple Cover Corner +tile.rpcov3c.wool.lightBlue.name=Light Blue Wool Triple Cover Corner +tile.rpcov3c.wool.lime.name=Lime Wool Triple Cover Corner +tile.rpcov3c.wool.magenta.name=Magenta Wool Triple Cover Corner +tile.rpcov3c.wool.orange.name=Orange Wool Triple Cover Corner +tile.rpcov3c.wool.pink.name=Pink Wool Triple Cover Corner +tile.rpcov3c.wool.purple.name=Purple Wool Triple Cover Corner +tile.rpcov3c.wool.red.name=Red Wool Triple Cover Corner +tile.rpcov3c.wool.silver.name=Light Gray Wool Triple Cover Corner +tile.rpcov3c.wool.white.name=White Wool Triple Cover Corner +tile.rpcov3c.wool.yellow.name=Yellow Wool Triple Cover Corner + +tile.rpcov3s.basalt.name=Basalt Triple Cover Strip +tile.rpcov3s.basaltBrick.name=Basalt Brick Triple Cover Strip +tile.rpcov3s.basaltCircle.name=Chiseled Basalt Brick Triple Cover Strip +tile.rpcov3s.basaltCobble.name=Basalt Cobblestone Triple Cover Strip +tile.rpcov3s.basaltPaver.name=Basalt Paver Triple Cover Strip +tile.rpcov3s.books.name=Bookshelf Triple Cover Strip +tile.rpcov3s.brick.name=Brick Triple Cover Strip +tile.rpcov3s.clay.name=Clay Triple Cover Strip +tile.rpcov3s.cobble.name=Cobblestone Triple Cover Strip +tile.rpcov3s.copperBlock.name=Copper Block Triple Cover Strip +tile.rpcov3s.diamond.name=Diamond Triple Cover Strip +tile.rpcov3s.dirt.name=Dirt Triple Cover Strip +tile.rpcov3s.glass.name=Glass Triple Cover Strip +tile.rpcov3s.gold.name=Gold Triple Cover Strip +tile.rpcov3s.greenSapphireBlock.name=Green Sapphire Block Triple Cover Strip +tile.rpcov3s.iron.name=Iron Triple Cover Strip +tile.rpcov3s.lapis.name=Lapis Lazuli Triple Cover Strip +tile.rpcov3s.marble.name=Marble Triple Cover Strip +tile.rpcov3s.marbleBrick.name=Marble Brick Triple Cover Strip +tile.rpcov3s.moss.name=Moss Stone Triple Cover Strip +tile.rpcov3s.netherbrick.name=Nether Brick Triple Cover Strip +tile.rpcov3s.netherrack.name=Netherrack Triple Cover Strip +tile.rpcov3s.obsidian.name=Obsidian Triple Cover Strip +tile.rpcov3s.planks.name=Wooden Plank Triple Cover Strip +tile.rpcov3s.planks1.name=Wooden Plank Triple Cover Strip +tile.rpcov3s.planks2.name=Wooden Plank Triple Cover Strip +tile.rpcov3s.planks3.name=Wooden Plank Triple Cover Strip +tile.rpcov3s.pumpkin.name=Pumpkin Triple Cover Strip +tile.rpcov3s.rplog.name=Rubberwood Triple Cover Strip +tile.rpcov3s.rubyBlock.name=Ruby Block Triple Cover Strip +tile.rpcov3s.sandstone.name=Sandstone Triple Cover Strip +tile.rpcov3s.sandstone1.name=Sandstone Triple Cover Strip +tile.rpcov3s.sandstone2.name=Sandstone Triple Cover Strip +tile.rpcov3s.sapphireBlock.name=Sapphire Block Triple Cover Strip +tile.rpcov3s.silverBlock.name=Silver Block Triple Cover Strip +tile.rpcov3s.slab.name=Polished Stone Triple Cover Strip +tile.rpcov3s.snow.name=Snow Triple Cover Strip +tile.rpcov3s.soul.name=Soul Sand Triple Cover Strip +tile.rpcov3s.stone.name=Stone Triple Cover Strip +tile.rpcov3s.stonebrick.name=Stone Brick Triple Cover Strip +tile.rpcov3s.stonebrick1.name=Stone Brick Triple Cover Strip +tile.rpcov3s.stonebrick2.name=Stone Brick Triple Cover Strip +tile.rpcov3s.stonebrick3.name=Stone Brick Triple Cover Strip +tile.rpcov3s.tinBlock.name=Tin Block Triple Cover Strip +tile.rpcov3s.tungstenBlock.name=Tungsten Block Triple Cover Strip +tile.rpcov3s.wood.name=Oak Wood Triple Cover Strip +tile.rpcov3s.wood1.name=Spruce Wood Triple Cover Strip +tile.rpcov3s.wood2.name=Birch Wood Triple Cover Strip +tile.rpcov3s.wood3.name=Jungle Wood Triple Cover Strip +tile.rpcov3s.wool.black.name=Black Wool Triple Cover Strip +tile.rpcov3s.wool.blue.name=Blue Wool Triple Cover Strip +tile.rpcov3s.wool.brown.name=Brown Wool Triple Cover Strip +tile.rpcov3s.wool.cyan.name=Cyan Wool Triple Cover Strip +tile.rpcov3s.wool.gray.name=Gray Wool Triple Cover Strip +tile.rpcov3s.wool.green.name=Green Wool Triple Cover Strip +tile.rpcov3s.wool.lightBlue.name=Light Blue Wool Triple Cover Strip +tile.rpcov3s.wool.lime.name=Lime Wool Triple Cover Strip +tile.rpcov3s.wool.magenta.name=Magenta Wool Triple Cover Strip +tile.rpcov3s.wool.orange.name=Orange Wool Triple Cover Strip +tile.rpcov3s.wool.pink.name=Pink Wool Triple Cover Strip +tile.rpcov3s.wool.purple.name=Purple Wool Triple Cover Strip +tile.rpcov3s.wool.red.name=Red Wool Triple Cover Strip +tile.rpcov3s.wool.silver.name=Light Gray Wool Triple Cover Strip +tile.rpcov3s.wool.white.name=White Wool Triple Cover Strip +tile.rpcov3s.wool.yellow.name=Yellow Wool Triple Cover Strip + +tile.rpcov5.basalt.name=Basalt Cover Slab +tile.rpcov5.basaltBrick.name=Basalt Brick Cover Slab +tile.rpcov5.basaltCircle.name=Chiseled Basalt Brick Cover Slab +tile.rpcov5.basaltCobble.name=Basalt Cobblestone Cover Slab +tile.rpcov5.basaltPaver.name=Basalt Paver Cover Slab +tile.rpcov5.books.name=Bookshelf Cover Slab +tile.rpcov5.brick.name=Brick Cover Slab +tile.rpcov5.clay.name=Clay Cover Slab +tile.rpcov5.cobble.name=Cobblestone Cover Slab +tile.rpcov5.copperBlock.name=Copper Block Cover Slab +tile.rpcov5.diamond.name=Diamond Cover Slab +tile.rpcov5.dirt.name=Dirt Cover Slab +tile.rpcov5.glass.name=Glass Cover Slab +tile.rpcov5.gold.name=Gold Cover Slab +tile.rpcov5.greenSapphireBlock.name=Green Sapphire Block Cover Slab +tile.rpcov5.iron.name=Iron Cover Slab +tile.rpcov5.lapis.name=Lapis Lazuli Cover Slab +tile.rpcov5.marble.name=Marble Cover Slab +tile.rpcov5.marbleBrick.name=Marble Brick Cover Slab +tile.rpcov5.moss.name=Moss Stone Cover Slab +tile.rpcov5.netherbrick.name=Nether Brick Cover Slab +tile.rpcov5.netherrack.name=Netherrack Cover Slab +tile.rpcov5.obsidian.name=Obsidian Cover Slab +tile.rpcov5.planks.name=Wooden Plank Cover Slab +tile.rpcov5.planks1.name=Wooden Plank Cover Slab +tile.rpcov5.planks2.name=Wooden Plank Cover Slab +tile.rpcov5.planks3.name=Wooden Plank Cover Slab +tile.rpcov5.pumpkin.name=Pumpkin Cover Slab +tile.rpcov5.rplog.name=Rubberwood Cover Slab +tile.rpcov5.rubyBlock.name=Ruby Block Cover Slab +tile.rpcov5.sandstone.name=Sandstone Cover Slab +tile.rpcov5.sandstone1.name=Sandstone Cover Slab +tile.rpcov5.sandstone2.name=Sandstone Cover Slab +tile.rpcov5.sapphireBlock.name=Sapphire Block Cover Slab +tile.rpcov5.silverBlock.name=Silver Block Cover Slab +tile.rpcov5.slab.name=Polished Stone Cover Slab +tile.rpcov5.snow.name=Snow Cover Slab +tile.rpcov5.soul.name=Soul Sand Cover Slab +tile.rpcov5.stone.name=Stone Cover Slab +tile.rpcov5.stonebrick.name=Stone Brick Cover Slab +tile.rpcov5.stonebrick1.name=Stone Brick Cover Slab +tile.rpcov5.stonebrick2.name=Stone Brick Cover Slab +tile.rpcov5.stonebrick3.name=Stone Brick Cover Slab +tile.rpcov5.tinBlock.name=Tin Block Cover Slab +tile.rpcov5.tungstenBlock.name=Tungsten Block Cover Slab +tile.rpcov5.wood.name=Oak Wood Cover Slab +tile.rpcov5.wood1.name=Spruce Wood Cover Slab +tile.rpcov5.wood2.name=Birch Wood Cover Slab +tile.rpcov5.wood3.name=Jungle Wood Cover Slab +tile.rpcov5.wool.black.name=Black Wool Cover Slab +tile.rpcov5.wool.blue.name=Blue Wool Cover Slab +tile.rpcov5.wool.brown.name=Brown Wool Cover Slab +tile.rpcov5.wool.cyan.name=Cyan Wool Cover Slab +tile.rpcov5.wool.gray.name=Gray Wool Cover Slab +tile.rpcov5.wool.green.name=Green Wool Cover Slab +tile.rpcov5.wool.lightBlue.name=Light Blue Wool Cover Slab +tile.rpcov5.wool.lime.name=Lime Wool Cover Slab +tile.rpcov5.wool.magenta.name=Magenta Wool Cover Slab +tile.rpcov5.wool.orange.name=Orange Wool Cover Slab +tile.rpcov5.wool.pink.name=Pink Wool Cover Slab +tile.rpcov5.wool.purple.name=Purple Wool Cover Slab +tile.rpcov5.wool.red.name=Red Wool Cover Slab +tile.rpcov5.wool.silver.name=Light Gray Wool Cover Slab +tile.rpcov5.wool.white.name=White Wool Cover Slab +tile.rpcov5.wool.yellow.name=Yellow Wool Cover Slab + +tile.rpcov5c.basalt.name=Basalt Cover Slab Corner +tile.rpcov5c.basaltBrick.name=Basalt Brick Cover Slab Corner +tile.rpcov5c.basaltCircle.name=Chiseled Basalt Brick Cover Slab Corner +tile.rpcov5c.basaltCobble.name=Basalt Cobblestone Cover Slab Corner +tile.rpcov5c.basaltPaver.name=Basalt Paver Cover Slab Corner +tile.rpcov5c.books.name=Bookshelf Cover Slab Corner +tile.rpcov5c.brick.name=Brick Cover Slab Corner +tile.rpcov5c.clay.name=Clay Cover Slab Corner +tile.rpcov5c.cobble.name=Cobblestone Cover Slab Corner +tile.rpcov5c.copperBlock.name=Copper Block Cover Slab Corner +tile.rpcov5c.diamond.name=Diamond Cover Slab Corner +tile.rpcov5c.dirt.name=Dirt Cover Slab Corner +tile.rpcov5c.glass.name=Glass Cover Slab Corner +tile.rpcov5c.gold.name=Gold Cover Slab Corner +tile.rpcov5c.greenSapphireBlock.name=Green Sapphire Block Cover Slab Corner +tile.rpcov5c.iron.name=Iron Cover Slab Corner +tile.rpcov5c.lapis.name=Lapis Lazuli Cover Slab Corner +tile.rpcov5c.marble.name=Marble Cover Slab Corner +tile.rpcov5c.marbleBrick.name=Marble Brick Cover Slab Corner +tile.rpcov5c.moss.name=Moss Stone Cover Slab Corner +tile.rpcov5c.netherbrick.name=Nether Brick Cover Slab Corner +tile.rpcov5c.netherrack.name=Netherrack Cover Slab Corner +tile.rpcov5c.obsidian.name=Obsidian Cover Slab Corner +tile.rpcov5c.planks.name=Wooden Plank Cover Slab Corner +tile.rpcov5c.planks1.name=Wooden Plank Cover Slab Corner +tile.rpcov5c.planks2.name=Wooden Plank Cover Slab Corner +tile.rpcov5c.planks3.name=Wooden Plank Cover Slab Corner +tile.rpcov5c.pumpkin.name=Pumpkin Cover Slab Corner +tile.rpcov5c.rplog.name=Rubberwood Cover Slab Corner +tile.rpcov5c.rubyBlock.name=Ruby Block Cover Slab Corner +tile.rpcov5c.sandstone.name=Sandstone Cover Slab Corner +tile.rpcov5c.sandstone1.name=Sandstone Cover Slab Corner +tile.rpcov5c.sandstone2.name=Sandstone Cover Slab Corner +tile.rpcov5c.sapphireBlock.name=Sapphire Block Cover Slab Corner +tile.rpcov5c.silverBlock.name=Silver Block Cover Slab Corner +tile.rpcov5c.slab.name=Polished Stone Cover Slab Corner +tile.rpcov5c.snow.name=Snow Cover Slab Corner +tile.rpcov5c.soul.name=Soul Sand Cover Slab Corner +tile.rpcov5c.stone.name=Stone Cover Slab Corner +tile.rpcov5c.stonebrick.name=Stone Brick Cover Slab Corner +tile.rpcov5c.stonebrick1.name=Stone Brick Cover Slab Corner +tile.rpcov5c.stonebrick2.name=Stone Brick Cover Slab Corner +tile.rpcov5c.stonebrick3.name=Stone Brick Cover Slab Corner +tile.rpcov5c.tinBlock.name=Tin Block Cover Slab Corner +tile.rpcov5c.tungstenBlock.name=Tungsten Block Cover Slab Corner +tile.rpcov5c.wood.name=Oak Wood Cover Slab Corner +tile.rpcov5c.wood1.name=Spruce Wood Cover Slab Corner +tile.rpcov5c.wood2.name=Birch Wood Cover Slab Corner +tile.rpcov5c.wood3.name=Jungle Wood Cover Slab Corner +tile.rpcov5c.wool.black.name=Black Wool Cover Slab Corner +tile.rpcov5c.wool.blue.name=Blue Wool Cover Slab Corner +tile.rpcov5c.wool.brown.name=Brown Wool Cover Slab Corner +tile.rpcov5c.wool.cyan.name=Cyan Wool Cover Slab Corner +tile.rpcov5c.wool.gray.name=Gray Wool Cover Slab Corner +tile.rpcov5c.wool.green.name=Green Wool Cover Slab Corner +tile.rpcov5c.wool.lightBlue.name=Light Blue Wool Cover Slab Corner +tile.rpcov5c.wool.lime.name=Lime Wool Cover Slab Corner +tile.rpcov5c.wool.magenta.name=Magenta Wool Cover Slab Corner +tile.rpcov5c.wool.orange.name=Orange Wool Cover Slab Corner +tile.rpcov5c.wool.pink.name=Pink Wool Cover Slab Corner +tile.rpcov5c.wool.purple.name=Purple Wool Cover Slab Corner +tile.rpcov5c.wool.red.name=Red Wool Cover Slab Corner +tile.rpcov5c.wool.silver.name=Light Gray Wool Cover Slab Corner +tile.rpcov5c.wool.white.name=White Wool Cover Slab Corner +tile.rpcov5c.wool.yellow.name=Yellow Wool Cover Slab Corner + +tile.rpcov5s.basalt.name=Basalt Cover Slab Strip +tile.rpcov5s.basaltBrick.name=Basalt Brick Cover Slab Strip +tile.rpcov5s.basaltCircle.name=Chiseled Basalt Brick Cover Slab Strip +tile.rpcov5s.basaltCobble.name=Basalt Cobblestone Cover Slab Strip +tile.rpcov5s.basaltPaver.name=Basalt Paver Cover Slab Strip +tile.rpcov5s.books.name=Bookshelf Cover Slab Strip +tile.rpcov5s.brick.name=Brick Cover Slab Strip +tile.rpcov5s.clay.name=Clay Cover Slab Strip +tile.rpcov5s.cobble.name=Cobblestone Cover Slab Strip +tile.rpcov5s.copperBlock.name=Copper Block Cover Slab Strip +tile.rpcov5s.diamond.name=Diamond Cover Slab Strip +tile.rpcov5s.dirt.name=Dirt Cover Slab Strip +tile.rpcov5s.glass.name=Glass Cover Slab Strip +tile.rpcov5s.gold.name=Gold Cover Slab Strip +tile.rpcov5s.greenSapphireBlock.name=Green Sapphire Block Cover Slab Strip +tile.rpcov5s.iron.name=Iron Cover Slab Strip +tile.rpcov5s.lapis.name=Lapis Lazuli Cover Slab Strip +tile.rpcov5s.marble.name=Marble Cover Slab Strip +tile.rpcov5s.marbleBrick.name=Marble Brick Cover Slab Strip +tile.rpcov5s.moss.name=Moss Stone Cover Slab Strip +tile.rpcov5s.netherbrick.name=Nether Brick Cover Slab Strip +tile.rpcov5s.netherrack.name=Netherrack Cover Slab Strip +tile.rpcov5s.obsidian.name=Obsidian Cover Slab Strip +tile.rpcov5s.planks.name=Wooden Plank Cover Slab Strip +tile.rpcov5s.planks1.name=Wooden Plank Cover Slab Strip +tile.rpcov5s.planks2.name=Wooden Plank Cover Slab Strip +tile.rpcov5s.planks3.name=Wooden Plank Cover Slab Strip +tile.rpcov5s.pumpkin.name=Pumpkin Cover Slab Strip +tile.rpcov5s.rplog.name=Rubberwood Cover Slab Strip +tile.rpcov5s.rubyBlock.name=Ruby Block Cover Slab Strip +tile.rpcov5s.sandstone.name=Sandstone Cover Slab Strip +tile.rpcov5s.sandstone1.name=Sandstone Cover Slab Strip +tile.rpcov5s.sandstone2.name=Sandstone Cover Slab Strip +tile.rpcov5s.sapphireBlock.name=Sapphire Block Cover Slab Strip +tile.rpcov5s.silverBlock.name=Silver Block Cover Slab Strip +tile.rpcov5s.slab.name=Polished Stone Cover Slab Strip +tile.rpcov5s.snow.name=Snow Cover Slab Strip +tile.rpcov5s.soul.name=Soul Sand Cover Slab Strip +tile.rpcov5s.stone.name=Stone Cover Slab Strip +tile.rpcov5s.stonebrick.name=Stone Brick Cover Slab Strip +tile.rpcov5s.stonebrick1.name=Stone Brick Cover Slab Strip +tile.rpcov5s.stonebrick2.name=Stone Brick Cover Slab Strip +tile.rpcov5s.stonebrick3.name=Stone Brick Cover Slab Strip +tile.rpcov5s.tinBlock.name=Tin Block Cover Slab Strip +tile.rpcov5s.tungstenBlock.name=Tungsten Block Cover Slab Strip +tile.rpcov5s.wood.name=Oak Wood Cover Slab Strip +tile.rpcov5s.wood1.name=Spruce Wood Cover Slab Strip +tile.rpcov5s.wood2.name=Birch Wood Cover Slab Strip +tile.rpcov5s.wood3.name=Jungle Wood Cover Slab Strip +tile.rpcov5s.wool.black.name=Black Wool Cover Slab Strip +tile.rpcov5s.wool.blue.name=Blue Wool Cover Slab Strip +tile.rpcov5s.wool.brown.name=Brown Wool Cover Slab Strip +tile.rpcov5s.wool.cyan.name=Cyan Wool Cover Slab Strip +tile.rpcov5s.wool.gray.name=Gray Wool Cover Slab Strip +tile.rpcov5s.wool.green.name=Green Wool Cover Slab Strip +tile.rpcov5s.wool.lightBlue.name=Light Blue Wool Cover Slab Strip +tile.rpcov5s.wool.lime.name=Lime Wool Cover Slab Strip +tile.rpcov5s.wool.magenta.name=Magenta Wool Cover Slab Strip +tile.rpcov5s.wool.orange.name=Orange Wool Cover Slab Strip +tile.rpcov5s.wool.pink.name=Pink Wool Cover Slab Strip +tile.rpcov5s.wool.purple.name=Purple Wool Cover Slab Strip +tile.rpcov5s.wool.red.name=Red Wool Cover Slab Strip +tile.rpcov5s.wool.silver.name=Light Gray Wool Cover Slab Strip +tile.rpcov5s.wool.white.name=White Wool Cover Slab Strip +tile.rpcov5s.wool.yellow.name=Yellow Wool Cover Slab Strip + +tile.rpcov6.basalt.name=Basalt Triple Panel +tile.rpcov6.basaltBrick.name=Basalt Brick Triple Panel +tile.rpcov6.basaltCircle.name=Chiseled Basalt Brick Triple Panel +tile.rpcov6.basaltCobble.name=Basalt Cobblestone Triple Panel +tile.rpcov6.basaltPaver.name=Basalt Paver Triple Panel +tile.rpcov6.books.name=Bookshelf Triple Panel +tile.rpcov6.brick.name=Brick Triple Panel +tile.rpcov6.clay.name=Clay Triple Panel +tile.rpcov6.cobble.name=Cobblestone Triple Panel +tile.rpcov6.copperBlock.name=Copper Block Triple Panel +tile.rpcov6.diamond.name=Diamond Triple Panel +tile.rpcov6.dirt.name=Dirt Triple Panel +tile.rpcov6.glass.name=Glass Triple Panel +tile.rpcov6.gold.name=Gold Triple Panel +tile.rpcov6.greenSapphireBlock.name=Green Sapphire Block Triple Panel +tile.rpcov6.iron.name=Iron Triple Panel +tile.rpcov6.lapis.name=Lapis Lazuli Triple Panel +tile.rpcov6.marble.name=Marble Triple Panel +tile.rpcov6.marbleBrick.name=Marble Brick Triple Panel +tile.rpcov6.moss.name=Moss Stone Triple Panel +tile.rpcov6.netherbrick.name=Nether Brick Triple Panel +tile.rpcov6.netherrack.name=Netherrack Triple Panel +tile.rpcov6.obsidian.name=Obsidian Triple Panel +tile.rpcov6.planks.name=Wooden Plank Triple Panel +tile.rpcov6.planks1.name=Wooden Plank Triple Panel +tile.rpcov6.planks2.name=Wooden Plank Triple Panel +tile.rpcov6.planks3.name=Wooden Plank Triple Panel +tile.rpcov6.pumpkin.name=Pumpkin Triple Panel +tile.rpcov6.rplog.name=Rubberwood Triple Panel +tile.rpcov6.rubyBlock.name=Ruby Block Triple Panel +tile.rpcov6.sandstone.name=Sandstone Triple Panel +tile.rpcov6.sandstone1.name=Sandstone Triple Panel +tile.rpcov6.sandstone2.name=Sandstone Triple Panel +tile.rpcov6.sapphireBlock.name=Sapphire Block Triple Panel +tile.rpcov6.silverBlock.name=Silver Block Triple Panel +tile.rpcov6.slab.name=Polished Stone Triple Panel +tile.rpcov6.snow.name=Snow Triple Panel +tile.rpcov6.soul.name=Soul Sand Triple Panel +tile.rpcov6.stone.name=Stone Triple Panel +tile.rpcov6.stonebrick.name=Stone Brick Triple Panel +tile.rpcov6.stonebrick1.name=Stone Brick Triple Panel +tile.rpcov6.stonebrick2.name=Stone Brick Triple Panel +tile.rpcov6.stonebrick3.name=Stone Brick Triple Panel +tile.rpcov6.tinBlock.name=Tin Block Triple Panel +tile.rpcov6.tungstenBlock.name=Tungsten Block Triple Panel +tile.rpcov6.wood.name=Oak Wood Triple Panel +tile.rpcov6.wood1.name=Spruce Wood Triple Panel +tile.rpcov6.wood2.name=Birch Wood Triple Panel +tile.rpcov6.wood3.name=Jungle Wood Triple Panel +tile.rpcov6.wool.black.name=Black Wool Triple Panel +tile.rpcov6.wool.blue.name=Blue Wool Triple Panel +tile.rpcov6.wool.brown.name=Brown Wool Triple Panel +tile.rpcov6.wool.cyan.name=Cyan Wool Triple Panel +tile.rpcov6.wool.gray.name=Gray Wool Triple Panel +tile.rpcov6.wool.green.name=Green Wool Triple Panel +tile.rpcov6.wool.lightBlue.name=Light Blue Wool Triple Panel +tile.rpcov6.wool.lime.name=Lime Wool Triple Panel +tile.rpcov6.wool.magenta.name=Magenta Wool Triple Panel +tile.rpcov6.wool.orange.name=Orange Wool Triple Panel +tile.rpcov6.wool.pink.name=Pink Wool Triple Panel +tile.rpcov6.wool.purple.name=Purple Wool Triple Panel +tile.rpcov6.wool.red.name=Red Wool Triple Panel +tile.rpcov6.wool.silver.name=Light Gray Wool Triple Panel +tile.rpcov6.wool.white.name=White Wool Triple Panel +tile.rpcov6.wool.yellow.name=Yellow Wool Triple Panel + +tile.rpcov6c.basalt.name=Basalt Triple Panel Corner +tile.rpcov6c.basaltBrick.name=Basalt Brick Triple Panel Corner +tile.rpcov6c.basaltCircle.name=Chiseled Basalt Brick Triple Panel Corner +tile.rpcov6c.basaltCobble.name=Basalt Cobblestone Triple Panel Corner +tile.rpcov6c.basaltPaver.name=Basalt Paver Triple Panel Corner +tile.rpcov6c.books.name=Bookshelf Triple Panel Corner +tile.rpcov6c.brick.name=Brick Triple Panel Corner +tile.rpcov6c.clay.name=Clay Triple Panel Corner +tile.rpcov6c.cobble.name=Cobblestone Triple Panel Corner +tile.rpcov6c.copperBlock.name=Copper Block Triple Panel Corner +tile.rpcov6c.diamond.name=Diamond Triple Panel Corner +tile.rpcov6c.dirt.name=Dirt Triple Panel Corner +tile.rpcov6c.glass.name=Glass Triple Panel Corner +tile.rpcov6c.gold.name=Gold Triple Panel Corner +tile.rpcov6c.greenSapphireBlock.name=Green Sapphire Block Triple Panel Corner +tile.rpcov6c.iron.name=Iron Triple Panel Corner +tile.rpcov6c.lapis.name=Lapis Lazuli Triple Panel Corner +tile.rpcov6c.marble.name=Marble Triple Panel Corner +tile.rpcov6c.marbleBrick.name=Marble Brick Triple Panel Corner +tile.rpcov6c.moss.name=Moss Stone Triple Panel Corner +tile.rpcov6c.netherbrick.name=Nether Brick Triple Panel Corner +tile.rpcov6c.netherrack.name=Netherrack Triple Panel Corner +tile.rpcov6c.obsidian.name=Obsidian Triple Panel Corner +tile.rpcov6c.planks.name=Wooden Plank Triple Panel Corner +tile.rpcov6c.planks1.name=Wooden Plank Triple Panel Corner +tile.rpcov6c.planks2.name=Wooden Plank Triple Panel Corner +tile.rpcov6c.planks3.name=Wooden Plank Triple Panel Corner +tile.rpcov6c.pumpkin.name=Pumpkin Triple Panel Corner +tile.rpcov6c.rplog.name=Rubberwood Triple Panel Corner +tile.rpcov6c.rubyBlock.name=Ruby Block Triple Panel Corner +tile.rpcov6c.sandstone.name=Sandstone Triple Panel Corner +tile.rpcov6c.sandstone1.name=Sandstone Triple Panel Corner +tile.rpcov6c.sandstone2.name=Sandstone Triple Panel Corner +tile.rpcov6c.sapphireBlock.name=Sapphire Block Triple Panel Corner +tile.rpcov6c.silverBlock.name=Silver Block Triple Panel Corner +tile.rpcov6c.slab.name=Polished Stone Triple Panel Corner +tile.rpcov6c.snow.name=Snow Triple Panel Corner +tile.rpcov6c.soul.name=Soul Sand Triple Panel Corner +tile.rpcov6c.stone.name=Stone Triple Panel Corner +tile.rpcov6c.stonebrick.name=Stone Brick Triple Panel Corner +tile.rpcov6c.stonebrick1.name=Stone Brick Triple Panel Corner +tile.rpcov6c.stonebrick2.name=Stone Brick Triple Panel Corner +tile.rpcov6c.stonebrick3.name=Stone Brick Triple Panel Corner +tile.rpcov6c.tinBlock.name=Tin Block Triple Panel Corner +tile.rpcov6c.tungstenBlock.name=Tungsten Block Triple Panel Corner +tile.rpcov6c.wood.name=Oak Wood Triple Panel Corner +tile.rpcov6c.wood1.name=Spruce Wood Triple Panel Corner +tile.rpcov6c.wood2.name=Birch Wood Triple Panel Corner +tile.rpcov6c.wood3.name=Jungle Wood Triple Panel Corner +tile.rpcov6c.wool.black.name=Black Wool Triple Panel Corner +tile.rpcov6c.wool.blue.name=Blue Wool Triple Panel Corner +tile.rpcov6c.wool.brown.name=Brown Wool Triple Panel Corner +tile.rpcov6c.wool.cyan.name=Cyan Wool Triple Panel Corner +tile.rpcov6c.wool.gray.name=Gray Wool Triple Panel Corner +tile.rpcov6c.wool.green.name=Green Wool Triple Panel Corner +tile.rpcov6c.wool.lightBlue.name=Light Blue Wool Triple Panel Corner +tile.rpcov6c.wool.lime.name=Lime Wool Triple Panel Corner +tile.rpcov6c.wool.magenta.name=Magenta Wool Triple Panel Corner +tile.rpcov6c.wool.orange.name=Orange Wool Triple Panel Corner +tile.rpcov6c.wool.pink.name=Pink Wool Triple Panel Corner +tile.rpcov6c.wool.purple.name=Purple Wool Triple Panel Corner +tile.rpcov6c.wool.red.name=Red Wool Triple Panel Corner +tile.rpcov6c.wool.silver.name=Light Gray Wool Triple Panel Corner +tile.rpcov6c.wool.white.name=White Wool Triple Panel Corner +tile.rpcov6c.wool.yellow.name=Yellow Wool Triple Panel Corner +tile.rpcov6s.basalt.name=Basalt Triple Panel Strip +tile.rpcov6s.basaltBrick.name=Basalt Brick Triple Panel Strip +tile.rpcov6s.basaltCircle.name=Chiseled Basalt Brick Triple Panel Strip +tile.rpcov6s.basaltCobble.name=Basalt Cobblestone Triple Panel Strip +tile.rpcov6s.basaltPaver.name=Basalt Paver Triple Panel Strip +tile.rpcov6s.books.name=Bookshelf Triple Panel Strip +tile.rpcov6s.brick.name=Brick Triple Panel Strip +tile.rpcov6s.clay.name=Clay Triple Panel Strip +tile.rpcov6s.cobble.name=Cobblestone Triple Panel Strip +tile.rpcov6s.copperBlock.name=Copper Block Triple Panel Strip +tile.rpcov6s.diamond.name=Diamond Triple Panel Strip +tile.rpcov6s.dirt.name=Dirt Triple Panel Strip +tile.rpcov6s.glass.name=Glass Triple Panel Strip +tile.rpcov6s.gold.name=Gold Triple Panel Strip +tile.rpcov6s.greenSapphireBlock.name=Green Sapphire Block Triple Panel Strip +tile.rpcov6s.iron.name=Iron Triple Panel Strip +tile.rpcov6s.lapis.name=Lapis Lazuli Triple Panel Strip +tile.rpcov6s.marble.name=Marble Triple Panel Strip +tile.rpcov6s.marbleBrick.name=Marble Brick Triple Panel Strip +tile.rpcov6s.moss.name=Moss Stone Triple Panel Strip +tile.rpcov6s.netherbrick.name=Nether Brick Triple Panel Strip +tile.rpcov6s.netherrack.name=Netherrack Triple Panel Strip +tile.rpcov6s.obsidian.name=Obsidian Triple Panel Strip +tile.rpcov6s.planks.name=Wooden Plank Triple Panel Strip +tile.rpcov6s.planks1.name=Wooden Plank Triple Panel Strip +tile.rpcov6s.planks2.name=Wooden Plank Triple Panel Strip +tile.rpcov6s.planks3.name=Wooden Plank Triple Panel Strip +tile.rpcov6s.pumpkin.name=Pumpkin Triple Panel Strip +tile.rpcov6s.rplog.name=Rubberwood Triple Panel Strip +tile.rpcov6s.rubyBlock.name=Ruby Block Triple Panel Strip +tile.rpcov6s.sandstone.name=Sandstone Triple Panel Strip +tile.rpcov6s.sandstone1.name=Sandstone Triple Panel Strip +tile.rpcov6s.sandstone2.name=Sandstone Triple Panel Strip +tile.rpcov6s.sapphireBlock.name=Sapphire Block Triple Panel Strip +tile.rpcov6s.silverBlock.name=Silver Block Triple Panel Strip +tile.rpcov6s.slab.name=Polished Stone Triple Panel Strip +tile.rpcov6s.snow.name=Snow Triple Panel Strip +tile.rpcov6s.soul.name=Soul Sand Triple Panel Strip +tile.rpcov6s.stone.name=Stone Triple Panel Strip +tile.rpcov6s.stonebrick.name=Stone Brick Triple Panel Strip +tile.rpcov6s.stonebrick1.name=Stone Brick Triple Panel Strip +tile.rpcov6s.stonebrick2.name=Stone Brick Triple Panel Strip +tile.rpcov6s.stonebrick3.name=Stone Brick Triple Panel Strip +tile.rpcov6s.tinBlock.name=Tin Block Triple Panel Strip +tile.rpcov6s.tungstenBlock.name=Tungsten Block Triple Panel Strip +tile.rpcov6s.wood.name=Oak Wood Triple Panel Strip +tile.rpcov6s.wood1.name=Spruce Wood Triple Panel Strip +tile.rpcov6s.wood2.name=Birch Wood Triple Panel Strip +tile.rpcov6s.wood3.name=Jungle Wood Triple Panel Strip +tile.rpcov6s.wool.black.name=Black Wool Triple Panel Strip +tile.rpcov6s.wool.blue.name=Blue Wool Triple Panel Strip +tile.rpcov6s.wool.brown.name=Brown Wool Triple Panel Strip +tile.rpcov6s.wool.cyan.name=Cyan Wool Triple Panel Strip +tile.rpcov6s.wool.gray.name=Gray Wool Triple Panel Strip +tile.rpcov6s.wool.green.name=Green Wool Triple Panel Strip +tile.rpcov6s.wool.lightBlue.name=Light Blue Wool Triple Panel Strip +tile.rpcov6s.wool.lime.name=Lime Wool Triple Panel Strip +tile.rpcov6s.wool.magenta.name=Magenta Wool Triple Panel Strip +tile.rpcov6s.wool.orange.name=Orange Wool Triple Panel Strip +tile.rpcov6s.wool.pink.name=Pink Wool Triple Panel Strip +tile.rpcov6s.wool.purple.name=Purple Wool Triple Panel Strip +tile.rpcov6s.wool.red.name=Red Wool Triple Panel Strip +tile.rpcov6s.wool.silver.name=Light Gray Wool Triple Panel Strip +tile.rpcov6s.wool.white.name=White Wool Triple Panel Strip +tile.rpcov6s.wool.yellow.name=Yellow Wool Triple Panel Strip + +tile.rpcov7.basalt.name=Basalt Anticover +tile.rpcov7.basaltBrick.name=Basalt Brick Anticover +tile.rpcov7.basaltCircle.name=Chiseled Basalt Brick Anticover +tile.rpcov7.basaltCobble.name=Basalt Cobblestone Anticover +tile.rpcov7.basaltPaver.name=Basalt Paver Anticover +tile.rpcov7.books.name=Bookshelf Anticover +tile.rpcov7.brick.name=Brick Anticover +tile.rpcov7.clay.name=Clay Anticover +tile.rpcov7.cobble.name=Cobblestone Anticover +tile.rpcov7.copperBlock.name=Copper Block Anticover +tile.rpcov7.diamond.name=Diamond Anticover +tile.rpcov7.dirt.name=Dirt Anticover +tile.rpcov7.glass.name=Glass Anticover +tile.rpcov7.gold.name=Gold Anticover +tile.rpcov7.greenSapphireBlock.name=Green Sapphire Block Anticover +tile.rpcov7.iron.name=Iron Anticover +tile.rpcov7.lapis.name=Lapis Lazuli Anticover +tile.rpcov7.marble.name=Marble Anticover +tile.rpcov7.marbleBrick.name=Marble Brick Anticover +tile.rpcov7.moss.name=Moss Stone Anticover +tile.rpcov7.netherbrick.name=Nether Brick Anticover +tile.rpcov7.netherrack.name=Netherrack Anticover +tile.rpcov7.obsidian.name=Obsidian Anticover +tile.rpcov7.planks.name=Wooden Plank Anticover +tile.rpcov7.planks1.name=Wooden Plank Anticover +tile.rpcov7.planks2.name=Wooden Plank Anticover +tile.rpcov7.planks3.name=Wooden Plank Anticover +tile.rpcov7.pumpkin.name=Pumpkin Anticover +tile.rpcov7.rplog.name=Rubberwood Anticover +tile.rpcov7.rubyBlock.name=Ruby Block Anticover +tile.rpcov7.sandstone.name=Sandstone Anticover +tile.rpcov7.sandstone1.name=Sandstone Anticover +tile.rpcov7.sandstone2.name=Sandstone Anticover +tile.rpcov7.sapphireBlock.name=Sapphire Block Anticover +tile.rpcov7.silverBlock.name=Silver Block Anticover +tile.rpcov7.slab.name=Polished Stone Anticover +tile.rpcov7.snow.name=Snow Anticover +tile.rpcov7.soul.name=Soul Sand Anticover +tile.rpcov7.stone.name=Stone Anticover +tile.rpcov7.stonebrick.name=Stone Brick Anticover +tile.rpcov7.stonebrick1.name=Stone Brick Anticover +tile.rpcov7.stonebrick2.name=Stone Brick Anticover +tile.rpcov7.stonebrick3.name=Stone Brick Anticover +tile.rpcov7.tinBlock.name=Tin Block Anticover +tile.rpcov7.tungstenBlock.name=Tungsten Block Anticover +tile.rpcov7.wood.name=Oak Wood Anticover +tile.rpcov7.wood1.name=Spruce Wood Anticover +tile.rpcov7.wood2.name=Birch Wood Anticover +tile.rpcov7.wood3.name=Jungle Wood Anticover +tile.rpcov7.wool.black.name=Black Wool Anticover +tile.rpcov7.wool.blue.name=Blue Wool Anticover +tile.rpcov7.wool.brown.name=Brown Wool Anticover +tile.rpcov7.wool.cyan.name=Cyan Wool Anticover +tile.rpcov7.wool.gray.name=Gray Wool Anticover +tile.rpcov7.wool.green.name=Green Wool Anticover +tile.rpcov7.wool.lightBlue.name=Light Blue Wool Anticover +tile.rpcov7.wool.lime.name=Lime Wool Anticover +tile.rpcov7.wool.magenta.name=Magenta Wool Anticover +tile.rpcov7.wool.orange.name=Orange Wool Anticover +tile.rpcov7.wool.pink.name=Pink Wool Anticover +tile.rpcov7.wool.purple.name=Purple Wool Anticover +tile.rpcov7.wool.red.name=Red Wool Anticover +tile.rpcov7.wool.silver.name=Light Gray Wool Anticover +tile.rpcov7.wool.white.name=White Wool Anticover +tile.rpcov7.wool.yellow.name=Yellow Wool Anticover + +tile.rpcov7c.basalt.name=Basalt Anticover Corner +tile.rpcov7c.basaltBrick.name=Basalt Brick Anticover Corner +tile.rpcov7c.basaltCircle.name=Chiseled Basalt Brick Anticover Corner +tile.rpcov7c.basaltCobble.name=Basalt Cobblestone Anticover Corner +tile.rpcov7c.basaltPaver.name=Basalt Paver Anticover Corner +tile.rpcov7c.books.name=Bookshelf Anticover Corner +tile.rpcov7c.brick.name=Brick Anticover Corner +tile.rpcov7c.clay.name=Clay Anticover Corner +tile.rpcov7c.cobble.name=Cobblestone Anticover Corner +tile.rpcov7c.copperBlock.name=Copper Block Anticover Corner +tile.rpcov7c.diamond.name=Diamond Anticover Corner +tile.rpcov7c.dirt.name=Dirt Anticover Corner +tile.rpcov7c.glass.name=Glass Anticover Corner +tile.rpcov7c.gold.name=Gold Anticover Corner +tile.rpcov7c.greenSapphireBlock.name=Green Sapphire Block Anticover Corner +tile.rpcov7c.iron.name=Iron Anticover Corner +tile.rpcov7c.lapis.name=Lapis Lazuli Anticover Corner +tile.rpcov7c.marble.name=Marble Anticover Corner +tile.rpcov7c.marbleBrick.name=Marble Brick Anticover Corner +tile.rpcov7c.moss.name=Moss Stone Anticover Corner +tile.rpcov7c.netherbrick.name=Nether Brick Anticover Corner +tile.rpcov7c.netherrack.name=Netherrack Anticover Corner +tile.rpcov7c.obsidian.name=Obsidian Anticover Corner +tile.rpcov7c.planks.name=Wooden Plank Anticover Corner +tile.rpcov7c.planks1.name=Wooden Plank Anticover Corner +tile.rpcov7c.planks2.name=Wooden Plank Anticover Corner +tile.rpcov7c.planks3.name=Wooden Plank Anticover Corner +tile.rpcov7c.pumpkin.name=Pumpkin Anticover Corner +tile.rpcov7c.rplog.name=Rubberwood Anticover Corner +tile.rpcov7c.rubyBlock.name=Ruby Block Anticover Corner +tile.rpcov7c.sandstone.name=Sandstone Anticover Corner +tile.rpcov7c.sandstone1.name=Sandstone Anticover Corner +tile.rpcov7c.sandstone2.name=Sandstone Anticover Corner +tile.rpcov7c.sapphireBlock.name=Sapphire Block Anticover Corner +tile.rpcov7c.silverBlock.name=Silver Block Anticover Corner +tile.rpcov7c.slab.name=Polished Stone Anticover Corner +tile.rpcov7c.snow.name=Snow Anticover Corner +tile.rpcov7c.soul.name=Soul Sand Anticover Corner +tile.rpcov7c.stone.name=Stone Anticover Corner +tile.rpcov7c.stonebrick.name=Stone Brick Anticover Corner +tile.rpcov7c.stonebrick1.name=Stone Brick Anticover Corner +tile.rpcov7c.stonebrick2.name=Stone Brick Anticover Corner +tile.rpcov7c.stonebrick3.name=Stone Brick Anticover Corner +tile.rpcov7c.tinBlock.name=Tin Block Anticover Corner +tile.rpcov7c.tungstenBlock.name=Tungsten Block Anticover Corner +tile.rpcov7c.wood.name=Oak Wood Anticover Corner +tile.rpcov7c.wood1.name=Spruce Wood Anticover Corner +tile.rpcov7c.wood2.name=Birch Wood Anticover Corner +tile.rpcov7c.wood3.name=Jungle Wood Anticover Corner +tile.rpcov7c.wool.black.name=Black Wool Anticover Corner +tile.rpcov7c.wool.blue.name=Blue Wool Anticover Corner +tile.rpcov7c.wool.brown.name=Brown Wool Anticover Corner +tile.rpcov7c.wool.cyan.name=Cyan Wool Anticover Corner +tile.rpcov7c.wool.gray.name=Gray Wool Anticover Corner +tile.rpcov7c.wool.green.name=Green Wool Anticover Corner +tile.rpcov7c.wool.lightBlue.name=Light Blue Wool Anticover Corner +tile.rpcov7c.wool.lime.name=Lime Wool Anticover Corner +tile.rpcov7c.wool.magenta.name=Magenta Wool Anticover Corner +tile.rpcov7c.wool.orange.name=Orange Wool Anticover Corner +tile.rpcov7c.wool.pink.name=Pink Wool Anticover Corner +tile.rpcov7c.wool.purple.name=Purple Wool Anticover Corner +tile.rpcov7c.wool.red.name=Red Wool Anticover Corner +tile.rpcov7c.wool.silver.name=Light Gray Wool Anticover Corner +tile.rpcov7c.wool.white.name=White Wool Anticover Corner +tile.rpcov7c.wool.yellow.name=Yellow Wool Anticover Corner +tile.rpcov7s.basalt.name=Basalt Anticover Strip +tile.rpcov7s.basaltBrick.name=Basalt Brick Anticover Strip +tile.rpcov7s.basaltCircle.name=Chiseled Basalt Brick Anticover Strip +tile.rpcov7s.basaltCobble.name=Basalt Cobblestone Anticover Strip +tile.rpcov7s.basaltPaver.name=Basalt Paver Anticover Strip +tile.rpcov7s.books.name=Bookshelf Anticover Strip +tile.rpcov7s.brick.name=Brick Anticover Strip +tile.rpcov7s.clay.name=Clay Anticover Strip +tile.rpcov7s.cobble.name=Cobblestone Anticover Strip +tile.rpcov7s.copperBlock.name=Copper Block Anticover Strip +tile.rpcov7s.diamond.name=Diamond Anticover Strip +tile.rpcov7s.dirt.name=Dirt Anticover Strip +tile.rpcov7s.glass.name=Glass Anticover Strip +tile.rpcov7s.gold.name=Gold Anticover Strip +tile.rpcov7s.greenSapphireBlock.name=Green Sapphire Block Anticover Strip +tile.rpcov7s.iron.name=Iron Anticover Strip +tile.rpcov7s.lapis.name=Lapis Lazuli Anticover Strip +tile.rpcov7s.marble.name=Marble Anticover Strip +tile.rpcov7s.marbleBrick.name=Marble Brick Anticover Strip +tile.rpcov7s.moss.name=Moss Stone Anticover Strip +tile.rpcov7s.netherbrick.name=Nether Brick Anticover Strip +tile.rpcov7s.netherrack.name=Netherrack Anticover Strip +tile.rpcov7s.obsidian.name=Obsidian Anticover Strip +tile.rpcov7s.planks.name=Wooden Plank Anticover Strip +tile.rpcov7s.planks1.name=Wooden Plank Anticover Strip +tile.rpcov7s.planks2.name=Wooden Plank Anticover Strip +tile.rpcov7s.planks3.name=Wooden Plank Anticover Strip +tile.rpcov7s.pumpkin.name=Pumpkin Anticover Strip +tile.rpcov7s.rplog.name=Rubberwood Anticover Strip +tile.rpcov7s.rubyBlock.name=Ruby Block Anticover Strip +tile.rpcov7s.sandstone.name=Sandstone Anticover Strip +tile.rpcov7s.sandstone1.name=Sandstone Anticover Strip +tile.rpcov7s.sandstone2.name=Sandstone Anticover Strip +tile.rpcov7s.sapphireBlock.name=Sapphire Block Anticover Strip +tile.rpcov7s.silverBlock.name=Silver Block Anticover Strip +tile.rpcov7s.slab.name=Polished Stone Anticover Strip +tile.rpcov7s.snow.name=Snow Anticover Strip +tile.rpcov7s.soul.name=Soul Sand Anticover Strip +tile.rpcov7s.stone.name=Stone Anticover Strip +tile.rpcov7s.stonebrick.name=Stone Brick Anticover Strip +tile.rpcov7s.stonebrick1.name=Stone Brick Anticover Strip +tile.rpcov7s.stonebrick2.name=Stone Brick Anticover Strip +tile.rpcov7s.stonebrick3.name=Stone Brick Anticover Strip +tile.rpcov7s.tinBlock.name=Tin Block Anticover Strip +tile.rpcov7s.tungstenBlock.name=Tungsten Block Anticover Strip +tile.rpcov7s.wood.name=Oak Wood Anticover Strip +tile.rpcov7s.wood1.name=Spruce Wood Anticover Strip +tile.rpcov7s.wood2.name=Birch Wood Anticover Strip +tile.rpcov7s.wood3.name=Jungle Wood Anticover Strip +tile.rpcov7s.wool.black.name=Black Wool Anticover Strip +tile.rpcov7s.wool.blue.name=Blue Wool Anticover Strip +tile.rpcov7s.wool.brown.name=Brown Wool Anticover Strip +tile.rpcov7s.wool.cyan.name=Cyan Wool Anticover Strip +tile.rpcov7s.wool.gray.name=Gray Wool Anticover Strip +tile.rpcov7s.wool.green.name=Green Wool Anticover Strip +tile.rpcov7s.wool.lightBlue.name=Light Blue Wool Anticover Strip +tile.rpcov7s.wool.lime.name=Lime Wool Anticover Strip +tile.rpcov7s.wool.magenta.name=Magenta Wool Anticover Strip +tile.rpcov7s.wool.orange.name=Orange Wool Anticover Strip +tile.rpcov7s.wool.pink.name=Pink Wool Anticover Strip +tile.rpcov7s.wool.purple.name=Purple Wool Anticover Strip +tile.rpcov7s.wool.red.name=Red Wool Anticover Strip +tile.rpcov7s.wool.silver.name=Light Gray Wool Anticover Strip +tile.rpcov7s.wool.white.name=White Wool Anticover Strip +tile.rpcov7s.wool.yellow.name=Yellow Wool Anticover Strip + +tile.rpcovc.basalt.name=Basalt Cover Corner +tile.rpcovc.basaltBrick.name=Basalt Brick Cover Corner +tile.rpcovc.basaltCircle.name=Chiseled Basalt Brick Cover Corner +tile.rpcovc.basaltCobble.name=Basalt Cobblestone Cover Corner +tile.rpcovc.basaltPaver.name=Basalt Paver Cover Corner +tile.rpcovc.books.name=Bookshelf Cover Corner +tile.rpcovc.brick.name=Brick Cover Corner +tile.rpcovc.clay.name=Clay Cover Corner +tile.rpcovc.cobble.name=Cobblestone Cover Corner +tile.rpcovc.copperBlock.name=Copper Block Cover Corner +tile.rpcovc.diamond.name=Diamond Cover Corner +tile.rpcovc.dirt.name=Dirt Cover Corner +tile.rpcovc.glass.name=Glass Cover Corner +tile.rpcovc.gold.name=Gold Cover Corner +tile.rpcovc.greenSapphireBlock.name=Green Sapphire Block Cover Corner +tile.rpcovc.iron.name=Iron Cover Corner +tile.rpcovc.lapis.name=Lapis Lazuli Cover Corner +tile.rpcovc.marble.name=Marble Cover Corner +tile.rpcovc.marbleBrick.name=Marble Brick Cover Corner +tile.rpcovc.moss.name=Moss Stone Cover Corner +tile.rpcovc.netherbrick.name=Nether Brick Cover Corner +tile.rpcovc.netherrack.name=Netherrack Cover Corner +tile.rpcovc.obsidian.name=Obsidian Cover Corner +tile.rpcovc.planks.name=Wooden Plank Cover Corner +tile.rpcovc.planks1.name=Wooden Plank Cover Corner +tile.rpcovc.planks2.name=Wooden Plank Cover Corner +tile.rpcovc.planks3.name=Wooden Plank Cover Corner +tile.rpcovc.pumpkin.name=Pumpkin Cover Corner +tile.rpcovc.rplog.name=Rubberwood Cover Corner +tile.rpcovc.rubyBlock.name=Ruby Block Cover Corner +tile.rpcovc.sandstone.name=Sandstone Cover Corner +tile.rpcovc.sandstone1.name=Sandstone Cover Corner +tile.rpcovc.sandstone2.name=Sandstone Cover Corner +tile.rpcovc.sapphireBlock.name=Sapphire Block Cover Corner +tile.rpcovc.silverBlock.name=Silver Block Cover Corner +tile.rpcovc.slab.name=Polished Stone Cover Corner +tile.rpcovc.snow.name=Snow Cover Corner +tile.rpcovc.soul.name=Soul Sand Cover Corner +tile.rpcovc.stone.name=Stone Cover Corner +tile.rpcovc.stonebrick.name=Stone Brick Cover Corner +tile.rpcovc.stonebrick1.name=Stone Brick Cover Corner +tile.rpcovc.stonebrick2.name=Stone Brick Cover Corner +tile.rpcovc.stonebrick3.name=Stone Brick Cover Corner +tile.rpcovc.tinBlock.name=Tin Block Cover Corner +tile.rpcovc.tungstenBlock.name=Tungsten Block Cover Corner +tile.rpcovc.wood.name=Oak Wood Cover Corner +tile.rpcovc.wood1.name=Spruce Wood Cover Corner +tile.rpcovc.wood2.name=Birch Wood Cover Corner +tile.rpcovc.wood3.name=Jungle Wood Cover Corner +tile.rpcovc.wool.black.name=Black Wool Cover Corner +tile.rpcovc.wool.blue.name=Blue Wool Cover Corner +tile.rpcovc.wool.brown.name=Brown Wool Cover Corner +tile.rpcovc.wool.cyan.name=Cyan Wool Cover Corner +tile.rpcovc.wool.gray.name=Gray Wool Cover Corner +tile.rpcovc.wool.green.name=Green Wool Cover Corner +tile.rpcovc.wool.lightBlue.name=Light Blue Wool Cover Corner +tile.rpcovc.wool.lime.name=Lime Wool Cover Corner +tile.rpcovc.wool.magenta.name=Magenta Wool Cover Corner +tile.rpcovc.wool.orange.name=Orange Wool Cover Corner +tile.rpcovc.wool.pink.name=Pink Wool Cover Corner +tile.rpcovc.wool.purple.name=Purple Wool Cover Corner +tile.rpcovc.wool.red.name=Red Wool Cover Corner +tile.rpcovc.wool.silver.name=Light Gray Wool Cover Corner +tile.rpcovc.wool.white.name=White Wool Cover Corner +tile.rpcovc.wool.yellow.name=Yellow Wool Cover Corner + +tile.rpcover.basalt.name=Basalt Cover +tile.rpcover.basaltBrick.name=Basalt Brick Cover +tile.rpcover.basaltCircle.name=Chiseled Basalt Brick Cover +tile.rpcover.basaltCobble.name=Basalt Cobblestone Cover +tile.rpcover.basaltPaver.name=Basalt Paver Cover +tile.rpcover.books.name=Bookshelf Cover +tile.rpcover.brick.name=Brick Cover +tile.rpcover.clay.name=Clay Cover +tile.rpcover.cobble.name=Cobblestone Cover +tile.rpcover.copperBlock.name=Copper Block Cover +tile.rpcover.diamond.name=Diamond Cover +tile.rpcover.dirt.name=Dirt Cover +tile.rpcover.glass.name=Glass Cover +tile.rpcover.gold.name=Gold Cover +tile.rpcover.greenSapphireBlock.name=Green Sapphire Block Cover +tile.rpcover.iron.name=Iron Cover +tile.rpcover.lapis.name=Lapis Lazuli Cover +tile.rpcover.marble.name=Marble Cover +tile.rpcover.marbleBrick.name=Marble Brick Cover +tile.rpcover.moss.name=Moss Stone Cover +tile.rpcover.netherbrick.name=Nether Brick Cover +tile.rpcover.netherrack.name=Netherrack Cover +tile.rpcover.obsidian.name=Obsidian Cover +tile.rpcover.planks.name=Wooden Plank Cover +tile.rpcover.planks1.name=Wooden Plank Cover +tile.rpcover.planks2.name=Wooden Plank Cover +tile.rpcover.planks3.name=Wooden Plank Cover +tile.rpcover.pumpkin.name=Pumpkin Cover +tile.rpcover.rplog.name=Rubberwood Cover +tile.rpcover.rubyBlock.name=Ruby Block Cover +tile.rpcover.sandstone.name=Sandstone Cover +tile.rpcover.sandstone1.name=Sandstone Cover +tile.rpcover.sandstone2.name=Sandstone Cover +tile.rpcover.sapphireBlock.name=Sapphire Block Cover +tile.rpcover.silverBlock.name=Silver Block Cover +tile.rpcover.slab.name=Polished Stone Cover +tile.rpcover.snow.name=Snow Cover +tile.rpcover.soul.name=Soul Sand Cover +tile.rpcover.stone.name=Stone Cover +tile.rpcover.stonebrick.name=Stone Brick Cover +tile.rpcover.stonebrick1.name=Stone Brick Cover +tile.rpcover.stonebrick2.name=Stone Brick Cover +tile.rpcover.stonebrick3.name=Stone Brick Cover +tile.rpcover.tinBlock.name=Tin Block Cover +tile.rpcover.tungstenBlock.name=Tungsten Block Cover +tile.rpcover.wood.name=Oak Wood Cover +tile.rpcover.wood1.name=Spruce Wood Cover +tile.rpcover.wood2.name=Birch Wood Cover +tile.rpcover.wood3.name=Jungle Wood Cover +tile.rpcover.wool.black.name=Black Wool Cover +tile.rpcover.wool.blue.name=Blue Wool Cover +tile.rpcover.wool.brown.name=Brown Wool Cover +tile.rpcover.wool.cyan.name=Cyan Wool Cover +tile.rpcover.wool.gray.name=Gray Wool Cover +tile.rpcover.wool.green.name=Green Wool Cover +tile.rpcover.wool.lightBlue.name=Light Blue Wool Cover +tile.rpcover.wool.lime.name=Lime Wool Cover +tile.rpcover.wool.magenta.name=Magenta Wool Cover +tile.rpcover.wool.orange.name=Orange Wool Cover +tile.rpcover.wool.pink.name=Pink Wool Cover +tile.rpcover.wool.purple.name=Purple Wool Cover +tile.rpcover.wool.red.name=Red Wool Cover +tile.rpcover.wool.silver.name=Light Gray Wool Cover +tile.rpcover.wool.white.name=White Wool Cover +tile.rpcover.wool.yellow.name=Yellow Wool Cover + +tile.rpcovs.basalt.name=Basalt Cover Strip +tile.rpcovs.basaltBrick.name=Basalt Brick Cover Strip +tile.rpcovs.basaltCircle.name=Chiseled Basalt Brick Cover Strip +tile.rpcovs.basaltCobble.name=Basalt Cobblestone Cover Strip +tile.rpcovs.basaltPaver.name=Basalt Paver Cover Strip +tile.rpcovs.books.name=Bookshelf Cover Strip +tile.rpcovs.brick.name=Brick Cover Strip +tile.rpcovs.clay.name=Clay Cover Strip +tile.rpcovs.cobble.name=Cobblestone Cover Strip +tile.rpcovs.copperBlock.name=Copper Block Cover Strip +tile.rpcovs.diamond.name=Diamond Cover Strip +tile.rpcovs.dirt.name=Dirt Cover Strip +tile.rpcovs.glass.name=Glass Cover Strip +tile.rpcovs.gold.name=Gold Cover Strip +tile.rpcovs.greenSapphireBlock.name=Green Sapphire Block Cover Strip +tile.rpcovs.iron.name=Iron Cover Strip +tile.rpcovs.lapis.name=Lapis Lazuli Cover Strip +tile.rpcovs.marble.name=Marble Cover Strip +tile.rpcovs.marbleBrick.name=Marble Brick Cover Strip +tile.rpcovs.moss.name=Moss Stone Cover Strip +tile.rpcovs.netherbrick.name=Nether Brick Cover Strip +tile.rpcovs.netherrack.name=Netherrack Cover Strip +tile.rpcovs.obsidian.name=Obsidian Cover Strip +tile.rpcovs.planks.name=Wooden Plank Cover Strip +tile.rpcovs.planks1.name=Wooden Plank Cover Strip +tile.rpcovs.planks2.name=Wooden Plank Cover Strip +tile.rpcovs.planks3.name=Wooden Plank Cover Strip +tile.rpcovs.pumpkin.name=Pumpkin Cover Strip +tile.rpcovs.rplog.name=Rubberwood Cover Strip +tile.rpcovs.rubyBlock.name=Ruby Block Cover Strip +tile.rpcovs.sandstone.name=Sandstone Cover Strip +tile.rpcovs.sandstone1.name=Sandstone Cover Strip +tile.rpcovs.sandstone2.name=Sandstone Cover Strip +tile.rpcovs.sapphireBlock.name=Sapphire Block Cover Strip +tile.rpcovs.silverBlock.name=Silver Block Cover Strip +tile.rpcovs.slab.name=Polished Stone Cover Strip +tile.rpcovs.snow.name=Snow Cover Strip +tile.rpcovs.soul.name=Soul Sand Cover Strip +tile.rpcovs.stone.name=Stone Cover Strip +tile.rpcovs.stonebrick.name=Stone Brick Cover Strip +tile.rpcovs.stonebrick1.name=Stone Brick Cover Strip +tile.rpcovs.stonebrick2.name=Stone Brick Cover Strip +tile.rpcovs.stonebrick3.name=Stone Brick Cover Strip +tile.rpcovs.tinBlock.name=Tin Block Cover Strip +tile.rpcovs.tungstenBlock.name=Tungsten Block Cover Strip +tile.rpcovs.wood.name=Oak Wood Cover Strip +tile.rpcovs.wood1.name=Spruce Wood Cover Strip +tile.rpcovs.wood2.name=Birch Wood Cover Strip +tile.rpcovs.wood3.name=Jungle Wood Cover Strip +tile.rpcovs.wool.black.name=Black Wool Cover Strip +tile.rpcovs.wool.blue.name=Blue Wool Cover Strip +tile.rpcovs.wool.brown.name=Brown Wool Cover Strip +tile.rpcovs.wool.cyan.name=Cyan Wool Cover Strip +tile.rpcovs.wool.gray.name=Gray Wool Cover Strip +tile.rpcovs.wool.green.name=Green Wool Cover Strip +tile.rpcovs.wool.lightBlue.name=Light Blue Wool Cover Strip +tile.rpcovs.wool.lime.name=Lime Wool Cover Strip +tile.rpcovs.wool.magenta.name=Magenta Wool Cover Strip +tile.rpcovs.wool.orange.name=Orange Wool Cover Strip +tile.rpcovs.wool.pink.name=Pink Wool Cover Strip +tile.rpcovs.wool.purple.name=Purple Wool Cover Strip +tile.rpcovs.wool.red.name=Red Wool Cover Strip +tile.rpcovs.wool.silver.name=Light Gray Wool Cover Strip +tile.rpcovs.wool.white.name=White Wool Cover Strip +tile.rpcovs.wool.yellow.name=Yellow Wool Cover Strip + +tile.rphcov3.basalt.name=Basalt Hollow Triple Cover +tile.rphcov3.basaltBrick.name=Basalt Brick Hollow Triple Cover +tile.rphcov3.basaltCircle.name=Chiseled Basalt Brick Hollow Triple Cover +tile.rphcov3.basaltCobble.name=Basalt Cobblestone Hollow Triple Cover +tile.rphcov3.basaltPaver.name=Basalt Paver Hollow Triple Cover +tile.rphcov3.books.name=Bookshelf Hollow Triple Cover +tile.rphcov3.brick.name=Brick Hollow Triple Cover +tile.rphcov3.clay.name=Clay Hollow Triple Cover +tile.rphcov3.cobble.name=Cobblestone Hollow Triple Cover +tile.rphcov3.copperBlock.name=Copper Block Hollow Triple Cover +tile.rphcov3.diamond.name=Diamond Hollow Triple Cover +tile.rphcov3.dirt.name=Dirt Hollow Triple Cover +tile.rphcov3.glass.name=Glass Hollow Triple Cover +tile.rphcov3.gold.name=Gold Hollow Triple Cover +tile.rphcov3.greenSapphireBlock.name=Green Sapphire Block Hollow Triple Cover +tile.rphcov3.iron.name=Iron Hollow Triple Cover +tile.rphcov3.lapis.name=Lapis Lazuli Hollow Triple Cover +tile.rphcov3.marble.name=Marble Hollow Triple Cover +tile.rphcov3.marbleBrick.name=Marble Brick Hollow Triple Cover +tile.rphcov3.moss.name=Moss Stone Hollow Triple Cover +tile.rphcov3.netherbrick.name=Nether Brick Hollow Triple Cover +tile.rphcov3.netherrack.name=Netherrack Hollow Triple Cover +tile.rphcov3.obsidian.name=Obsidian Hollow Triple Cover +tile.rphcov3.planks.name=Wooden Plank Hollow Triple Cover +tile.rphcov3.planks1.name=Wooden Plank Hollow Triple Cover +tile.rphcov3.planks2.name=Wooden Plank Hollow Triple Cover +tile.rphcov3.planks3.name=Wooden Plank Hollow Triple Cover +tile.rphcov3.pumpkin.name=Pumpkin Hollow Triple Cover +tile.rphcov3.rplog.name=Rubberwood Hollow Triple Cover +tile.rphcov3.rubyBlock.name=Ruby Block Hollow Triple Cover +tile.rphcov3.sandstone.name=Sandstone Hollow Triple Cover +tile.rphcov3.sandstone1.name=Sandstone Hollow Triple Cover +tile.rphcov3.sandstone2.name=Sandstone Hollow Triple Cover +tile.rphcov3.sapphireBlock.name=Sapphire Block Hollow Triple Cover +tile.rphcov3.silverBlock.name=Silver Block Hollow Triple Cover +tile.rphcov3.slab.name=Polished Stone Hollow Triple Cover +tile.rphcov3.snow.name=Snow Hollow Triple Cover +tile.rphcov3.soul.name=Soul Sand Hollow Triple Cover +tile.rphcov3.stone.name=Stone Hollow Triple Cover +tile.rphcov3.stonebrick.name=Stone Brick Hollow Triple Cover +tile.rphcov3.stonebrick1.name=Stone Brick Hollow Triple Cover +tile.rphcov3.stonebrick2.name=Stone Brick Hollow Triple Cover +tile.rphcov3.stonebrick3.name=Stone Brick Hollow Triple Cover +tile.rphcov3.tinBlock.name=Tin Block Hollow Triple Cover +tile.rphcov3.tungstenBlock.name=Tungsten Block Hollow Triple Cover +tile.rphcov3.wood.name=Oak Wood Hollow Triple Cover +tile.rphcov3.wood1.name=Spruce Wood Hollow Triple Cover +tile.rphcov3.wood2.name=Birch Wood Hollow Triple Cover +tile.rphcov3.wood3.name=Jungle Wood Hollow Triple Cover +tile.rphcov3.wool.black.name=Black Wool Hollow Triple Cover +tile.rphcov3.wool.blue.name=Blue Wool Hollow Triple Cover +tile.rphcov3.wool.brown.name=Brown Wool Hollow Triple Cover +tile.rphcov3.wool.cyan.name=Cyan Wool Hollow Triple Cover +tile.rphcov3.wool.gray.name=Gray Wool Hollow Triple Cover +tile.rphcov3.wool.green.name=Green Wool Hollow Triple Cover +tile.rphcov3.wool.lightBlue.name=Light Blue Wool Hollow Triple Cover +tile.rphcov3.wool.lime.name=Lime Wool Hollow Triple Cover +tile.rphcov3.wool.magenta.name=Magenta Wool Hollow Triple Cover +tile.rphcov3.wool.orange.name=Orange Wool Hollow Triple Cover +tile.rphcov3.wool.pink.name=Pink Wool Hollow Triple Cover +tile.rphcov3.wool.purple.name=Purple Wool Hollow Triple Cover +tile.rphcov3.wool.red.name=Red Wool Hollow Triple Cover +tile.rphcov3.wool.silver.name=Light Gray Wool Hollow Triple Cover +tile.rphcov3.wool.white.name=White Wool Hollow Triple Cover +tile.rphcov3.wool.yellow.name=Yellow Wool Hollow Triple Cover + +tile.rphcov5.basalt.name=Basalt Hollow Cover Slab +tile.rphcov5.basaltBrick.name=Basalt Brick Hollow Cover Slab +tile.rphcov5.basaltCircle.name=Chiseled Basalt Brick Hollow Cover Slab +tile.rphcov5.basaltCobble.name=Basalt Cobblestone Hollow Cover Slab +tile.rphcov5.basaltPaver.name=Basalt Paver Hollow Cover Slab +tile.rphcov5.books.name=Bookshelf Hollow Cover Slab +tile.rphcov5.brick.name=Brick Hollow Cover Slab +tile.rphcov5.clay.name=Clay Hollow Cover Slab +tile.rphcov5.cobble.name=Cobblestone Hollow Cover Slab +tile.rphcov5.copperBlock.name=Copper Block Hollow Cover Slab +tile.rphcov5.diamond.name=Diamond Hollow Cover Slab +tile.rphcov5.dirt.name=Dirt Hollow Cover Slab +tile.rphcov5.glass.name=Glass Hollow Cover Slab +tile.rphcov5.gold.name=Gold Hollow Cover Slab +tile.rphcov5.greenSapphireBlock.name=Green Sapphire Block Hollow Cover Slab +tile.rphcov5.iron.name=Iron Hollow Cover Slab +tile.rphcov5.lapis.name=Lapis Lazuli Hollow Cover Slab +tile.rphcov5.marble.name=Marble Hollow Cover Slab +tile.rphcov5.marbleBrick.name=Marble Brick Hollow Cover Slab +tile.rphcov5.moss.name=Moss Stone Hollow Cover Slab +tile.rphcov5.netherbrick.name=Nether Brick Hollow Cover Slab +tile.rphcov5.netherrack.name=Netherrack Hollow Cover Slab +tile.rphcov5.obsidian.name=Obsidian Hollow Cover Slab +tile.rphcov5.planks.name=Wooden Plank Hollow Cover Slab +tile.rphcov5.planks1.name=Wooden Plank Hollow Cover Slab +tile.rphcov5.planks2.name=Wooden Plank Hollow Cover Slab +tile.rphcov5.planks3.name=Wooden Plank Hollow Cover Slab +tile.rphcov5.pumpkin.name=Pumpkin Hollow Cover Slab +tile.rphcov5.rplog.name=Rubberwood Hollow Cover Slab +tile.rphcov5.rubyBlock.name=Ruby Block Hollow Cover Slab +tile.rphcov5.sandstone.name=Sandstone Hollow Cover Slab +tile.rphcov5.sandstone1.name=Sandstone Hollow Cover Slab +tile.rphcov5.sandstone2.name=Sandstone Hollow Cover Slab +tile.rphcov5.sapphireBlock.name=Sapphire Block Hollow Cover Slab +tile.rphcov5.silverBlock.name=Silver Block Hollow Cover Slab +tile.rphcov5.slab.name=Polished Stone Hollow Cover Slab +tile.rphcov5.snow.name=Snow Hollow Cover Slab +tile.rphcov5.soul.name=Soul Sand Hollow Cover Slab +tile.rphcov5.stone.name=Stone Hollow Cover Slab +tile.rphcov5.stonebrick.name=Stone Brick Hollow Cover Slab +tile.rphcov5.stonebrick1.name=Stone Brick Hollow Cover Slab +tile.rphcov5.stonebrick2.name=Stone Brick Hollow Cover Slab +tile.rphcov5.stonebrick3.name=Stone Brick Hollow Cover Slab +tile.rphcov5.tinBlock.name=Tin Block Hollow Cover Slab +tile.rphcov5.tungstenBlock.name=Tungsten Block Hollow Cover Slab +tile.rphcov5.wood.name=Oak Wood Hollow Cover Slab +tile.rphcov5.wood1.name=Spruce Wood Hollow Cover Slab +tile.rphcov5.wood2.name=Birch Wood Hollow Cover Slab +tile.rphcov5.wood3.name=Jungle Wood Hollow Cover Slab +tile.rphcov5.wool.black.name=Black Wool Hollow Cover Slab +tile.rphcov5.wool.blue.name=Blue Wool Hollow Cover Slab +tile.rphcov5.wool.brown.name=Brown Wool Hollow Cover Slab +tile.rphcov5.wool.cyan.name=Cyan Wool Hollow Cover Slab +tile.rphcov5.wool.gray.name=Gray Wool Hollow Cover Slab +tile.rphcov5.wool.green.name=Green Wool Hollow Cover Slab +tile.rphcov5.wool.lightBlue.name=Light Blue Wool Hollow Cover Slab +tile.rphcov5.wool.lime.name=Lime Wool Hollow Cover Slab +tile.rphcov5.wool.magenta.name=Magenta Wool Hollow Cover Slab +tile.rphcov5.wool.orange.name=Orange Wool Hollow Cover Slab +tile.rphcov5.wool.pink.name=Pink Wool Hollow Cover Slab +tile.rphcov5.wool.purple.name=Purple Wool Hollow Cover Slab +tile.rphcov5.wool.red.name=Red Wool Hollow Cover Slab +tile.rphcov5.wool.silver.name=Light Gray Wool Hollow Cover Slab +tile.rphcov5.wool.white.name=White Wool Hollow Cover Slab +tile.rphcov5.wool.yellow.name=Yellow Wool Hollow Cover Slab + +tile.rphcov6.basalt.name=Basalt Hollow Triple Panel +tile.rphcov6.basaltBrick.name=Basalt Brick Hollow Triple Panel +tile.rphcov6.basaltCircle.name=Chiseled Basalt Brick Hollow Triple Panel +tile.rphcov6.basaltCobble.name=Basalt Cobblestone Hollow Triple Panel +tile.rphcov6.basaltPaver.name=Basalt Paver Hollow Triple Panel +tile.rphcov6.books.name=Bookshelf Hollow Triple Panel +tile.rphcov6.brick.name=Brick Hollow Triple Panel +tile.rphcov6.clay.name=Clay Hollow Triple Panel +tile.rphcov6.cobble.name=Cobblestone Hollow Triple Panel +tile.rphcov6.copperBlock.name=Copper Block Hollow Triple Panel +tile.rphcov6.diamond.name=Diamond Hollow Triple Panel +tile.rphcov6.dirt.name=Dirt Hollow Triple Panel +tile.rphcov6.glass.name=Glass Hollow Triple Panel +tile.rphcov6.gold.name=Gold Hollow Triple Panel +tile.rphcov6.greenSapphireBlock.name=Green Sapphire Block Hollow Triple Panel +tile.rphcov6.iron.name=Iron Hollow Triple Panel +tile.rphcov6.lapis.name=Lapis Lazuli Hollow Triple Panel +tile.rphcov6.marble.name=Marble Hollow Triple Panel +tile.rphcov6.marbleBrick.name=Marble Brick Hollow Triple Panel +tile.rphcov6.moss.name=Moss Stone Hollow Triple Panel +tile.rphcov6.netherbrick.name=Nether Brick Hollow Triple Panel +tile.rphcov6.netherrack.name=Netherrack Hollow Triple Panel +tile.rphcov6.obsidian.name=Obsidian Hollow Triple Panel +tile.rphcov6.planks.name=Wooden Plank Hollow Triple Panel +tile.rphcov6.planks1.name=Wooden Plank Hollow Triple Panel +tile.rphcov6.planks2.name=Wooden Plank Hollow Triple Panel +tile.rphcov6.planks3.name=Wooden Plank Hollow Triple Panel +tile.rphcov6.pumpkin.name=Pumpkin Hollow Triple Panel +tile.rphcov6.rplog.name=Rubberwood Hollow Triple Panel +tile.rphcov6.rubyBlock.name=Ruby Block Hollow Triple Panel +tile.rphcov6.sandstone.name=Sandstone Hollow Triple Panel +tile.rphcov6.sandstone1.name=Sandstone Hollow Triple Panel +tile.rphcov6.sandstone2.name=Sandstone Hollow Triple Panel +tile.rphcov6.sapphireBlock.name=Sapphire Block Hollow Triple Panel +tile.rphcov6.silverBlock.name=Silver Block Hollow Triple Panel +tile.rphcov6.slab.name=Polished Stone Hollow Triple Panel +tile.rphcov6.snow.name=Snow Hollow Triple Panel +tile.rphcov6.soul.name=Soul Sand Hollow Triple Panel +tile.rphcov6.stone.name=Stone Hollow Triple Panel +tile.rphcov6.stonebrick.name=Stone Brick Hollow Triple Panel +tile.rphcov6.stonebrick1.name=Stone Brick Hollow Triple Panel +tile.rphcov6.stonebrick2.name=Stone Brick Hollow Triple Panel +tile.rphcov6.stonebrick3.name=Stone Brick Hollow Triple Panel +tile.rphcov6.tinBlock.name=Tin Block Hollow Triple Panel +tile.rphcov6.tungstenBlock.name=Tungsten Block Hollow Triple Panel +tile.rphcov6.wood.name=Oak Wood Hollow Triple Panel +tile.rphcov6.wood1.name=Spruce Wood Hollow Triple Panel +tile.rphcov6.wood2.name=Birch Wood Hollow Triple Panel +tile.rphcov6.wood3.name=Jungle Wood Hollow Triple Panel +tile.rphcov6.wool.black.name=Black Wool Hollow Triple Panel +tile.rphcov6.wool.blue.name=Blue Wool Hollow Triple Panel +tile.rphcov6.wool.brown.name=Brown Wool Hollow Triple Panel +tile.rphcov6.wool.cyan.name=Cyan Wool Hollow Triple Panel +tile.rphcov6.wool.gray.name=Gray Wool Hollow Triple Panel +tile.rphcov6.wool.green.name=Green Wool Hollow Triple Panel +tile.rphcov6.wool.lightBlue.name=Light Blue Wool Hollow Triple Panel +tile.rphcov6.wool.lime.name=Lime Wool Hollow Triple Panel +tile.rphcov6.wool.magenta.name=Magenta Wool Hollow Triple Panel +tile.rphcov6.wool.orange.name=Orange Wool Hollow Triple Panel +tile.rphcov6.wool.pink.name=Pink Wool Hollow Triple Panel +tile.rphcov6.wool.purple.name=Purple Wool Hollow Triple Panel +tile.rphcov6.wool.red.name=Red Wool Hollow Triple Panel +tile.rphcov6.wool.silver.name=Light Gray Wool Hollow Triple Panel +tile.rphcov6.wool.white.name=White Wool Hollow Triple Panel +tile.rphcov6.wool.yellow.name=Yellow Wool Hollow Triple Panel + +tile.rphcov7.basalt.name=Basalt Hollow Anticover +tile.rphcov7.basaltBrick.name=Basalt Brick Hollow Anticover +tile.rphcov7.basaltCircle.name=Chiseled Basalt Brick Hollow Anticover +tile.rphcov7.basaltCobble.name=Basalt Cobblestone Hollow Anticover +tile.rphcov7.basaltPaver.name=Basalt Paver Hollow Anticover +tile.rphcov7.books.name=Bookshelf Hollow Anticover +tile.rphcov7.brick.name=Brick Hollow Anticover +tile.rphcov7.clay.name=Clay Hollow Anticover +tile.rphcov7.cobble.name=Cobblestone Hollow Anticover +tile.rphcov7.copperBlock.name=Copper Block Hollow Anticover +tile.rphcov7.diamond.name=Diamond Hollow Anticover +tile.rphcov7.dirt.name=Dirt Hollow Anticover +tile.rphcov7.glass.name=Glass Hollow Anticover +tile.rphcov7.gold.name=Gold Hollow Anticover +tile.rphcov7.greenSapphireBlock.name=Green Sapphire Block Hollow Anticover +tile.rphcov7.iron.name=Iron Hollow Anticover +tile.rphcov7.lapis.name=Lapis Lazuli Hollow Anticover +tile.rphcov7.marble.name=Marble Hollow Anticover +tile.rphcov7.marbleBrick.name=Marble Brick Hollow Anticover +tile.rphcov7.moss.name=Moss Stone Hollow Anticover +tile.rphcov7.netherbrick.name=Nether Brick Hollow Anticover +tile.rphcov7.netherrack.name=Netherrack Hollow Anticover +tile.rphcov7.obsidian.name=Obsidian Hollow Anticover +tile.rphcov7.planks.name=Wooden Plank Hollow Anticover +tile.rphcov7.planks1.name=Wooden Plank Hollow Anticover +tile.rphcov7.planks2.name=Wooden Plank Hollow Anticover +tile.rphcov7.planks3.name=Wooden Plank Hollow Anticover +tile.rphcov7.pumpkin.name=Pumpkin Hollow Anticover +tile.rphcov7.rplog.name=Rubberwood Hollow Anticover +tile.rphcov7.rubyBlock.name=Ruby Block Hollow Anticover +tile.rphcov7.sandstone.name=Sandstone Hollow Anticover +tile.rphcov7.sandstone1.name=Sandstone Hollow Anticover +tile.rphcov7.sandstone2.name=Sandstone Hollow Anticover +tile.rphcov7.sapphireBlock.name=Sapphire Block Hollow Anticover +tile.rphcov7.silverBlock.name=Silver Block Hollow Anticover +tile.rphcov7.slab.name=Polished Stone Hollow Anticover +tile.rphcov7.snow.name=Snow Hollow Anticover +tile.rphcov7.soul.name=Soul Sand Hollow Anticover +tile.rphcov7.stone.name=Stone Hollow Anticover +tile.rphcov7.stonebrick.name=Stone Brick Hollow Anticover +tile.rphcov7.stonebrick1.name=Stone Brick Hollow Anticover +tile.rphcov7.stonebrick2.name=Stone Brick Hollow Anticover +tile.rphcov7.stonebrick3.name=Stone Brick Hollow Anticover +tile.rphcov7.tinBlock.name=Tin Block Hollow Anticover +tile.rphcov7.tungstenBlock.name=Tungsten Block Hollow Anticover +tile.rphcov7.wood.name=Oak Wood Hollow Anticover +tile.rphcov7.wood1.name=Spruce Wood Hollow Anticover +tile.rphcov7.wood2.name=Birch Wood Hollow Anticover +tile.rphcov7.wood3.name=Jungle Wood Hollow Anticover +tile.rphcov7.wool.black.name=Black Wool Hollow Anticover +tile.rphcov7.wool.blue.name=Blue Wool Hollow Anticover +tile.rphcov7.wool.brown.name=Brown Wool Hollow Anticover +tile.rphcov7.wool.cyan.name=Cyan Wool Hollow Anticover +tile.rphcov7.wool.gray.name=Gray Wool Hollow Anticover +tile.rphcov7.wool.green.name=Green Wool Hollow Anticover +tile.rphcov7.wool.lightBlue.name=Light Blue Wool Hollow Anticover +tile.rphcov7.wool.lime.name=Lime Wool Hollow Anticover +tile.rphcov7.wool.magenta.name=Magenta Wool Hollow Anticover +tile.rphcov7.wool.orange.name=Orange Wool Hollow Anticover +tile.rphcov7.wool.pink.name=Pink Wool Hollow Anticover +tile.rphcov7.wool.purple.name=Purple Wool Hollow Anticover +tile.rphcov7.wool.red.name=Red Wool Hollow Anticover +tile.rphcov7.wool.silver.name=Light Gray Wool Hollow Anticover +tile.rphcov7.wool.white.name=White Wool Hollow Anticover +tile.rphcov7.wool.yellow.name=Yellow Wool Hollow Anticover + +tile.rphcover.basalt.name=Hollow Basalt Cover +tile.rphcover.basaltBrick.name=Hollow Basalt Brick Cover +tile.rphcover.basaltCircle.name=Hollow Chiseled Basalt Brick Cover +tile.rphcover.basaltCobble.name=Hollow Basalt Cobblestone Cover +tile.rphcover.basaltPaver.name=Hollow Basalt Paver Cover +tile.rphcover.books.name=Hollow Bookshelf Cover +tile.rphcover.brick.name=Hollow Brick Cover +tile.rphcover.clay.name=Hollow Clay Cover +tile.rphcover.cobble.name=Hollow Cobblestone Cover +tile.rphcover.copperBlock.name=Hollow Copper Block Cover +tile.rphcover.diamond.name=Hollow Diamond Cover +tile.rphcover.dirt.name=Hollow Dirt Cover +tile.rphcover.glass.name=Hollow Glass Cover +tile.rphcover.gold.name=Hollow Gold Cover +tile.rphcover.greenSapphireBlock.name=Hollow Green Sapphire Block Cover +tile.rphcover.iron.name=Hollow Iron Cover +tile.rphcover.lapis.name=Hollow Lapis Lazuli Cover +tile.rphcover.marble.name=Hollow Marble Cover +tile.rphcover.marbleBrick.name=Hollow Marble Brick Cover +tile.rphcover.moss.name=Hollow Moss Stone Cover +tile.rphcover.netherbrick.name=Hollow Nether Brick Cover +tile.rphcover.netherrack.name=Hollow Netherrack Cover +tile.rphcover.obsidian.name=Hollow Obsidian Cover +tile.rphcover.planks.name=Hollow Wooden Plank Cover +tile.rphcover.planks1.name=Hollow Wooden Plank Cover +tile.rphcover.planks2.name=Hollow Wooden Plank Cover +tile.rphcover.planks3.name=Hollow Wooden Plank Cover +tile.rphcover.pumpkin.name=Hollow Pumpkin Cover +tile.rphcover.rplog.name=Hollow Rubberwood Cover +tile.rphcover.rubyBlock.name=Hollow Ruby Block Cover +tile.rphcover.sandstone.name=Hollow Sandstone Cover +tile.rphcover.sandstone1.name=Hollow Sandstone Cover +tile.rphcover.sandstone2.name=Hollow Sandstone Cover +tile.rphcover.sapphireBlock.name=Hollow Sapphire Block Cover +tile.rphcover.silverBlock.name=Hollow Silver Block Cover +tile.rphcover.slab.name=Hollow Polished Stone Cover +tile.rphcover.snow.name=Hollow Snow Cover +tile.rphcover.soul.name=Hollow Soul Sand Cover +tile.rphcover.stone.name=Hollow Stone Cover +tile.rphcover.stonebrick.name=Hollow Stone Brick Cover +tile.rphcover.stonebrick1.name=Hollow Stone Brick Cover +tile.rphcover.stonebrick2.name=Hollow Stone Brick Cover +tile.rphcover.stonebrick3.name=Hollow Stone Brick Cover +tile.rphcover.tinBlock.name=Hollow Tin Block Cover +tile.rphcover.tungstenBlock.name=Hollow Tungsten Block Cover +tile.rphcover.wood.name=Hollow Oak Wood Cover +tile.rphcover.wood1.name=Hollow Spruce Wood Cover +tile.rphcover.wood2.name=Hollow Birch Wood Cover +tile.rphcover.wood3.name=Hollow Jungle Wood Cover +tile.rphcover.wool.black.name=Hollow Black Wool Cover +tile.rphcover.wool.blue.name=Hollow Blue Wool Cover +tile.rphcover.wool.brown.name=Hollow Brown Wool Cover +tile.rphcover.wool.cyan.name=Hollow Cyan Wool Cover +tile.rphcover.wool.gray.name=Hollow Gray Wool Cover +tile.rphcover.wool.green.name=Hollow Green Wool Cover +tile.rphcover.wool.lightBlue.name=Hollow Light Blue Wool Cover +tile.rphcover.wool.lime.name=Hollow Lime Wool Cover +tile.rphcover.wool.magenta.name=Hollow Magenta Wool Cover +tile.rphcover.wool.orange.name=Hollow Orange Wool Cover +tile.rphcover.wool.pink.name=Hollow Pink Wool Cover +tile.rphcover.wool.purple.name=Hollow Purple Wool Cover +tile.rphcover.wool.red.name=Hollow Red Wool Cover +tile.rphcover.wool.silver.name=Hollow Light Gray Wool Cover +tile.rphcover.wool.white.name=Hollow White Wool Cover +tile.rphcover.wool.yellow.name=Hollow Yellow Wool Cover + +tile.rphpanel.basalt.name=Hollow Basalt Panel +tile.rphpanel.basaltBrick.name=Hollow Basalt Brick Panel +tile.rphpanel.basaltCircle.name=Hollow Chiseled Basalt Brick Panel +tile.rphpanel.basaltCobble.name=Hollow Basalt Cobblestone Panel +tile.rphpanel.basaltPaver.name=Hollow Basalt Paver Panel +tile.rphpanel.books.name=Hollow Bookshelf Panel +tile.rphpanel.brick.name=Hollow Brick Panel +tile.rphpanel.clay.name=Hollow Clay Panel +tile.rphpanel.cobble.name=Hollow Cobblestone Panel +tile.rphpanel.copperBlock.name=Hollow Copper Block Panel +tile.rphpanel.diamond.name=Hollow Diamond Panel +tile.rphpanel.dirt.name=Hollow Dirt Panel +tile.rphpanel.glass.name=Hollow Glass Panel +tile.rphpanel.gold.name=Hollow Gold Panel +tile.rphpanel.greenSapphireBlock.name=Hollow Green Sapphire Block Panel +tile.rphpanel.iron.name=Hollow Iron Panel +tile.rphpanel.lapis.name=Hollow Lapis Lazuli Panel +tile.rphpanel.marble.name=Hollow Marble Panel +tile.rphpanel.marbleBrick.name=Hollow Marble Brick Panel +tile.rphpanel.moss.name=Hollow Moss Stone Panel +tile.rphpanel.netherbrick.name=Hollow Nether Brick Panel +tile.rphpanel.netherrack.name=Hollow Netherrack Panel +tile.rphpanel.obsidian.name=Hollow Obsidian Panel +tile.rphpanel.planks.name=Hollow Wooden Plank Panel +tile.rphpanel.planks1.name=Hollow Wooden Plank Panel +tile.rphpanel.planks2.name=Hollow Wooden Plank Panel +tile.rphpanel.planks3.name=Hollow Wooden Plank Panel +tile.rphpanel.pumpkin.name=Hollow Pumpkin Panel +tile.rphpanel.rplog.name=Hollow Rubberwood Panel +tile.rphpanel.rubyBlock.name=Hollow Ruby Block Panel +tile.rphpanel.sandstone.name=Hollow Sandstone Panel +tile.rphpanel.sandstone1.name=Hollow Sandstone Panel +tile.rphpanel.sandstone2.name=Hollow Sandstone Panel +tile.rphpanel.sapphireBlock.name=Hollow Sapphire Block Panel +tile.rphpanel.silverBlock.name=Hollow Silver Block Panel +tile.rphpanel.slab.name=Hollow Polished Stone Panel +tile.rphpanel.snow.name=Hollow Snow Panel +tile.rphpanel.soul.name=Hollow Soul Sand Panel +tile.rphpanel.stone.name=Hollow Stone Panel +tile.rphpanel.stonebrick.name=Hollow Stone Brick Panel +tile.rphpanel.stonebrick1.name=Hollow Stone Brick Panel +tile.rphpanel.stonebrick2.name=Hollow Stone Brick Panel +tile.rphpanel.stonebrick3.name=Hollow Stone Brick Panel +tile.rphpanel.tinBlock.name=Hollow Tin Block Panel +tile.rphpanel.tungstenBlock.name=Hollow Tungsten Block Panel +tile.rphpanel.wood.name=Hollow Oak Wood Panel +tile.rphpanel.wood1.name=Hollow Spruce Wood Panel +tile.rphpanel.wood2.name=Hollow Birch Wood Panel +tile.rphpanel.wood3.name=Hollow Jungle Wood Panel +tile.rphpanel.wool.black.name=Hollow Black Wool Panel +tile.rphpanel.wool.blue.name=Hollow Blue Wool Panel +tile.rphpanel.wool.brown.name=Hollow Brown Wool Panel +tile.rphpanel.wool.cyan.name=Hollow Cyan Wool Panel +tile.rphpanel.wool.gray.name=Hollow Gray Wool Panel +tile.rphpanel.wool.green.name=Hollow Green Wool Panel +tile.rphpanel.wool.lightBlue.name=Hollow Light Blue Wool Panel +tile.rphpanel.wool.lime.name=Hollow Lime Wool Panel +tile.rphpanel.wool.magenta.name=Hollow Magenta Wool Panel +tile.rphpanel.wool.orange.name=Hollow Orange Wool Panel +tile.rphpanel.wool.pink.name=Hollow Pink Wool Panel +tile.rphpanel.wool.purple.name=Hollow Purple Wool Panel +tile.rphpanel.wool.red.name=Hollow Red Wool Panel +tile.rphpanel.wool.silver.name=Hollow Light Gray Wool Panel +tile.rphpanel.wool.white.name=Hollow White Wool Panel +tile.rphpanel.wool.yellow.name=Hollow Yellow Wool Panel + +tile.rphslab.basalt.name=Hollow Basalt Slab +tile.rphslab.basaltBrick.name=Hollow Basalt Brick Slab +tile.rphslab.basaltCircle.name=Hollow Chiseled Basalt Brick Slab +tile.rphslab.basaltCobble.name=Hollow Basalt Cobblestone Slab +tile.rphslab.basaltPaver.name=Hollow Basalt Paver Slab +tile.rphslab.books.name=Hollow Bookshelf Slab +tile.rphslab.brick.name=Hollow Brick Slab +tile.rphslab.clay.name=Hollow Clay Slab +tile.rphslab.cobble.name=Hollow Cobblestone Slab +tile.rphslab.copperBlock.name=Hollow Copper Block Slab +tile.rphslab.diamond.name=Hollow Diamond Slab +tile.rphslab.dirt.name=Hollow Dirt Slab +tile.rphslab.glass.name=Hollow Glass Slab +tile.rphslab.gold.name=Hollow Gold Slab +tile.rphslab.greenSapphireBlock.name=Hollow Green Sapphire Block Slab +tile.rphslab.iron.name=Hollow Iron Slab +tile.rphslab.lapis.name=Hollow Lapis Lazuli Slab +tile.rphslab.marble.name=Hollow Marble Slab +tile.rphslab.marbleBrick.name=Hollow Marble Brick Slab +tile.rphslab.moss.name=Hollow Moss Stone Slab +tile.rphslab.netherbrick.name=Hollow Nether Brick Slab +tile.rphslab.netherrack.name=Hollow Netherrack Slab +tile.rphslab.obsidian.name=Hollow Obsidian Slab +tile.rphslab.planks.name=Hollow Wooden Plank Slab +tile.rphslab.planks1.name=Hollow Wooden Plank Slab +tile.rphslab.planks2.name=Hollow Wooden Plank Slab +tile.rphslab.planks3.name=Hollow Wooden Plank Slab +tile.rphslab.pumpkin.name=Hollow Pumpkin Slab +tile.rphslab.rplog.name=Hollow Rubberwood Slab +tile.rphslab.rubyBlock.name=Hollow Ruby Block Slab +tile.rphslab.sandstone.name=Hollow Sandstone Slab +tile.rphslab.sandstone1.name=Hollow Sandstone Slab +tile.rphslab.sandstone2.name=Hollow Sandstone Slab +tile.rphslab.sapphireBlock.name=Hollow Sapphire Block Slab +tile.rphslab.silverBlock.name=Hollow Silver Block Slab +tile.rphslab.slab.name=Hollow Polished Stone Slab +tile.rphslab.snow.name=Hollow Snow Slab +tile.rphslab.soul.name=Hollow Soul Sand Slab +tile.rphslab.stone.name=Hollow Stone Slab +tile.rphslab.stonebrick.name=Hollow Stone Brick Slab +tile.rphslab.stonebrick1.name=Hollow Stone Brick Slab +tile.rphslab.stonebrick2.name=Hollow Stone Brick Slab +tile.rphslab.stonebrick3.name=Hollow Stone Brick Slab +tile.rphslab.tinBlock.name=Hollow Tin Block Slab +tile.rphslab.tungstenBlock.name=Hollow Tungsten Block Slab +tile.rphslab.wood.name=Hollow Oak Wood Slab +tile.rphslab.wood1.name=Hollow Spruce Wood Slab +tile.rphslab.wood2.name=Hollow Birch Wood Slab +tile.rphslab.wood3.name=Hollow Jungle Wood Slab +tile.rphslab.wool.black.name=Hollow Black Wool Slab +tile.rphslab.wool.blue.name=Hollow Blue Wool Slab +tile.rphslab.wool.brown.name=Hollow Brown Wool Slab +tile.rphslab.wool.cyan.name=Hollow Cyan Wool Slab +tile.rphslab.wool.gray.name=Hollow Gray Wool Slab +tile.rphslab.wool.green.name=Hollow Green Wool Slab +tile.rphslab.wool.lightBlue.name=Hollow Light Blue Wool Slab +tile.rphslab.wool.lime.name=Hollow Lime Wool Slab +tile.rphslab.wool.magenta.name=Hollow Magenta Wool Slab +tile.rphslab.wool.orange.name=Hollow Orange Wool Slab +tile.rphslab.wool.pink.name=Hollow Pink Wool Slab +tile.rphslab.wool.purple.name=Hollow Purple Wool Slab +tile.rphslab.wool.red.name=Hollow Red Wool Slab +tile.rphslab.wool.silver.name=Hollow Light Gray Wool Slab +tile.rphslab.wool.white.name=Hollow White Wool Slab +tile.rphslab.wool.yellow.name=Hollow Yellow Wool Slab + +tile.rppanc.basalt.name=Basalt Panel Corner +tile.rppanc.basaltBrick.name=Basalt Brick Panel Corner +tile.rppanc.basaltCircle.name=Chiseled Basalt Brick Panel Corner +tile.rppanc.basaltCobble.name=Basalt Cobblestone Panel Corner +tile.rppanc.basaltPaver.name=Basalt Paver Panel Corner +tile.rppanc.books.name=Bookshelf Panel Corner +tile.rppanc.brick.name=Brick Panel Corner +tile.rppanc.clay.name=Clay Panel Corner +tile.rppanc.cobble.name=Cobblestone Panel Corner +tile.rppanc.copperBlock.name=Copper Block Panel Corner +tile.rppanc.diamond.name=Diamond Panel Corner +tile.rppanc.dirt.name=Dirt Panel Corner +tile.rppanc.glass.name=Glass Panel Corner +tile.rppanc.gold.name=Gold Panel Corner +tile.rppanc.greenSapphireBlock.name=Green Sapphire Block Panel Corner +tile.rppanc.iron.name=Iron Panel Corner +tile.rppanc.lapis.name=Lapis Lazuli Panel Corner +tile.rppanc.marble.name=Marble Panel Corner +tile.rppanc.marbleBrick.name=Marble Brick Panel Corner +tile.rppanc.moss.name=Moss Stone Panel Corner +tile.rppanc.netherbrick.name=Nether Brick Panel Corner +tile.rppanc.netherrack.name=Netherrack Panel Corner +tile.rppanc.obsidian.name=Obsidian Panel Corner +tile.rppanc.planks.name=Wooden Plank Panel Corner +tile.rppanc.planks1.name=Wooden Plank Panel Corner +tile.rppanc.planks2.name=Wooden Plank Panel Corner +tile.rppanc.planks3.name=Wooden Plank Panel Corner +tile.rppanc.pumpkin.name=Pumpkin Panel Corner +tile.rppanc.rplog.name=Rubberwood Panel Corner +tile.rppanc.rubyBlock.name=Ruby Block Panel Corner +tile.rppanc.sandstone.name=Sandstone Panel Corner +tile.rppanc.sandstone1.name=Sandstone Panel Corner +tile.rppanc.sandstone2.name=Sandstone Panel Corner +tile.rppanc.sapphireBlock.name=Sapphire Block Panel Corner +tile.rppanc.silverBlock.name=Silver Block Panel Corner +tile.rppanc.slab.name=Polished Stone Panel Corner +tile.rppanc.snow.name=Snow Panel Corner +tile.rppanc.soul.name=Soul Sand Panel Corner +tile.rppanc.stone.name=Stone Panel Corner +tile.rppanc.stonebrick.name=Stone Brick Panel Corner +tile.rppanc.stonebrick1.name=Stone Brick Panel Corner +tile.rppanc.stonebrick2.name=Stone Brick Panel Corner +tile.rppanc.stonebrick3.name=Stone Brick Panel Corner +tile.rppanc.tinBlock.name=Tin Block Panel Corner +tile.rppanc.tungstenBlock.name=Tungsten Block Panel Corner +tile.rppanc.wood.name=Oak Wood Panel Corner +tile.rppanc.wood1.name=Spruce Wood Panel Corner +tile.rppanc.wood2.name=Birch Wood Panel Corner +tile.rppanc.wood3.name=Jungle Wood Panel Corner +tile.rppanc.wool.black.name=Black Wool Panel Corner +tile.rppanc.wool.blue.name=Blue Wool Panel Corner +tile.rppanc.wool.brown.name=Brown Wool Panel Corner +tile.rppanc.wool.cyan.name=Cyan Wool Panel Corner +tile.rppanc.wool.gray.name=Gray Wool Panel Corner +tile.rppanc.wool.green.name=Green Wool Panel Corner +tile.rppanc.wool.lightBlue.name=Light Blue Wool Panel Corner +tile.rppanc.wool.lime.name=Lime Wool Panel Corner +tile.rppanc.wool.magenta.name=Magenta Wool Panel Corner +tile.rppanc.wool.orange.name=Orange Wool Panel Corner +tile.rppanc.wool.pink.name=Pink Wool Panel Corner +tile.rppanc.wool.purple.name=Purple Wool Panel Corner +tile.rppanc.wool.red.name=Red Wool Panel Corner +tile.rppanc.wool.silver.name=Light Gray Wool Panel Corner +tile.rppanc.wool.white.name=White Wool Panel Corner +tile.rppanc.wool.yellow.name=Yellow Wool Panel Corner + +tile.rppanel.basalt.name=Basalt Panel +tile.rppanel.basaltBrick.name=Basalt Brick Panel +tile.rppanel.basaltCircle.name=Chiseled Basalt Brick Panel +tile.rppanel.basaltCobble.name=Basalt Cobblestone Panel +tile.rppanel.basaltPaver.name=Basalt Paver Panel +tile.rppanel.books.name=Bookshelf Panel +tile.rppanel.brick.name=Brick Panel +tile.rppanel.clay.name=Clay Panel +tile.rppanel.cobble.name=Cobblestone Panel +tile.rppanel.copperBlock.name=Copper Block Panel +tile.rppanel.diamond.name=Diamond Panel +tile.rppanel.dirt.name=Dirt Panel +tile.rppanel.glass.name=Glass Panel +tile.rppanel.gold.name=Gold Panel +tile.rppanel.greenSapphireBlock.name=Green Sapphire Block Panel +tile.rppanel.iron.name=Iron Panel +tile.rppanel.lapis.name=Lapis Lazuli Panel +tile.rppanel.marble.name=Marble Panel +tile.rppanel.marbleBrick.name=Marble Brick Panel +tile.rppanel.moss.name=Moss Stone Panel +tile.rppanel.netherbrick.name=Nether Brick Panel +tile.rppanel.netherrack.name=Netherrack Panel +tile.rppanel.obsidian.name=Obsidian Panel +tile.rppanel.planks.name=Wooden Plank Panel +tile.rppanel.planks1.name=Wooden Plank Panel +tile.rppanel.planks2.name=Wooden Plank Panel +tile.rppanel.planks3.name=Wooden Plank Panel +tile.rppanel.pumpkin.name=Pumpkin Panel +tile.rppanel.rplog.name=Rubberwood Panel +tile.rppanel.rubyBlock.name=Ruby Block Panel +tile.rppanel.sandstone.name=Sandstone Panel +tile.rppanel.sandstone1.name=Sandstone Panel +tile.rppanel.sandstone2.name=Sandstone Panel +tile.rppanel.sapphireBlock.name=Sapphire Block Panel +tile.rppanel.silverBlock.name=Silver Block Panel +tile.rppanel.slab.name=Polished Stone Panel +tile.rppanel.snow.name=Snow Panel +tile.rppanel.soul.name=Soul Sand Panel +tile.rppanel.stone.name=Stone Panel +tile.rppanel.stonebrick.name=Stone Brick Panel +tile.rppanel.stonebrick1.name=Stone Brick Panel +tile.rppanel.stonebrick2.name=Stone Brick Panel +tile.rppanel.stonebrick3.name=Stone Brick Panel +tile.rppanel.tinBlock.name=Tin Block Panel +tile.rppanel.tungstenBlock.name=Tungsten Block Panel +tile.rppanel.wood.name=Oak Wood Panel +tile.rppanel.wood1.name=Spruce Wood Panel +tile.rppanel.wood2.name=Birch Wood Panel +tile.rppanel.wood3.name=Jungle Wood Panel +tile.rppanel.wool.black.name=Black Wool Panel +tile.rppanel.wool.blue.name=Blue Wool Panel +tile.rppanel.wool.brown.name=Brown Wool Panel +tile.rppanel.wool.cyan.name=Cyan Wool Panel +tile.rppanel.wool.gray.name=Gray Wool Panel +tile.rppanel.wool.green.name=Green Wool Panel +tile.rppanel.wool.lightBlue.name=Light Blue Wool Panel +tile.rppanel.wool.lime.name=Lime Wool Panel +tile.rppanel.wool.magenta.name=Magenta Wool Panel +tile.rppanel.wool.orange.name=Orange Wool Panel +tile.rppanel.wool.pink.name=Pink Wool Panel +tile.rppanel.wool.purple.name=Purple Wool Panel +tile.rppanel.wool.red.name=Red Wool Panel +tile.rppanel.wool.silver.name=Light Gray Wool Panel +tile.rppanel.wool.white.name=White Wool Panel +tile.rppanel.wool.yellow.name=Yellow Wool Panel + +tile.rppans.basalt.name=Basalt Panel Strip +tile.rppans.basaltBrick.name=Basalt Brick Panel Strip +tile.rppans.basaltCircle.name=Chiseled Basalt Brick Panel Strip +tile.rppans.basaltCobble.name=Basalt Cobblestone Panel Strip +tile.rppans.basaltPaver.name=Basalt Paver Panel Strip +tile.rppans.books.name=Bookshelf Panel Strip +tile.rppans.brick.name=Brick Panel Strip +tile.rppans.clay.name=Clay Panel Strip +tile.rppans.cobble.name=Cobblestone Panel Strip +tile.rppans.copperBlock.name=Copper Block Panel Strip +tile.rppans.diamond.name=Diamond Panel Strip +tile.rppans.dirt.name=Dirt Panel Strip +tile.rppans.glass.name=Glass Panel Strip +tile.rppans.gold.name=Gold Panel Strip +tile.rppans.greenSapphireBlock.name=Green Sapphire Block Panel Strip +tile.rppans.iron.name=Iron Panel Strip +tile.rppans.lapis.name=Lapis Lazuli Panel Strip +tile.rppans.marble.name=Marble Panel Strip +tile.rppans.marbleBrick.name=Marble Brick Panel Strip +tile.rppans.moss.name=Moss Stone Panel Strip +tile.rppans.netherbrick.name=Nether Brick Panel Strip +tile.rppans.netherrack.name=Netherrack Panel Strip +tile.rppans.obsidian.name=Obsidian Panel Strip +tile.rppans.planks.name=Wooden Plank Panel Strip +tile.rppans.planks1.name=Wooden Plank Panel Strip +tile.rppans.planks2.name=Wooden Plank Panel Strip +tile.rppans.planks3.name=Wooden Plank Panel Strip +tile.rppans.pumpkin.name=Pumpkin Panel Strip +tile.rppans.rplog.name=Rubberwood Panel Strip +tile.rppans.rubyBlock.name=Ruby Block Panel Strip +tile.rppans.sandstone.name=Sandstone Panel Strip +tile.rppans.sandstone1.name=Sandstone Panel Strip +tile.rppans.sandstone2.name=Sandstone Panel Strip +tile.rppans.sapphireBlock.name=Sapphire Block Panel Strip +tile.rppans.silverBlock.name=Silver Block Panel Strip +tile.rppans.slab.name=Polished Stone Panel Strip +tile.rppans.snow.name=Snow Panel Strip +tile.rppans.soul.name=Soul Sand Panel Strip +tile.rppans.stone.name=Stone Panel Strip +tile.rppans.stonebrick.name=Stone Brick Panel Strip +tile.rppans.stonebrick1.name=Stone Brick Panel Strip +tile.rppans.stonebrick2.name=Stone Brick Panel Strip +tile.rppans.stonebrick3.name=Stone Brick Panel Strip +tile.rppans.tungstenBlock.name=Tungsten Block Panel Strip +tile.rppans.wood.name=Oak Wood Panel Strip +tile.rppans.wood1.name=Spruce Wood Panel Strip +tile.rppans.wood2.name=Birch Wood Panel Strip +tile.rppans.wood3.name=Jungle Wood Panel Strip +tile.rppans.wool.black.name=Black Wool Panel Strip +tile.rppans.wool.blue.name=Blue Wool Panel Strip +tile.rppans.wool.brown.name=Brown Wool Panel Strip +tile.rppans.wool.cyan.name=Cyan Wool Panel Strip +tile.rppans.wool.gray.name=Gray Wool Panel Strip +tile.rppans.wool.green.name=Green Wool Panel Strip +tile.rppans.wool.lightBlue.name=Light Blue Wool Panel Strip +tile.rppans.wool.lime.name=Lime Wool Panel Strip +tile.rppans.wool.magenta.name=Magenta Wool Panel Strip +tile.rppans.wool.orange.name=Orange Wool Panel Strip +tile.rppans.wool.pink.name=Pink Wool Panel Strip +tile.rppans.wool.purple.name=Purple Wool Panel Strip +tile.rppans.wool.red.name=Red Wool Panel Strip +tile.rppans.wool.silver.name=Light Gray Wool Panel Strip +tile.rppans.wool.white.name=White Wool Panel Strip +tile.rppans.wool.yellow.name=Yellow Wool Panel Strip + +tile.rppole1.basalt.name=Basalt Post +tile.rppole1.basaltBrick.name=Basalt Brick Post +tile.rppole1.basaltCircle.name=Chiseled Basalt Brick Post +tile.rppole1.basaltCobble.name=Basalt Cobblestone Post +tile.rppole1.basaltPaver.name=Basalt Paver Post +tile.rppole1.books.name=Bookshelf Post +tile.rppole1.brick.name=Brick Post +tile.rppole1.clay.name=Clay Post +tile.rppole1.cobble.name=Cobblestone Post +tile.rppole1.copperBlock.name=Copper Block Post +tile.rppole1.diamond.name=Diamond Post +tile.rppole1.dirt.name=Dirt Post +tile.rppole1.glass.name=Glass Post +tile.rppole1.gold.name=Gold Post +tile.rppole1.greenSapphireBlock.name=Green Sapphire Block Post +tile.rppole1.iron.name=Iron Post +tile.rppole1.lapis.name=Lapis Lazuli Post +tile.rppole1.marble.name=Marble Post +tile.rppole1.marbleBrick.name=Marble Brick Post +tile.rppole1.moss.name=Moss Stone Post +tile.rppole1.netherbrick.name=Nether Brick Post +tile.rppole1.netherrack.name=Netherrack Post +tile.rppole1.obsidian.name=Obsidian Post +tile.rppole1.planks.name=Wooden Plank Post +tile.rppole1.planks1.name=Wooden Plank Post +tile.rppole1.planks2.name=Wooden Plank Post +tile.rppole1.planks3.name=Wooden Plank Post +tile.rppole1.pumpkin.name=Pumpkin Post +tile.rppole1.rplog.name=Rubberwood Post +tile.rppole1.rubyBlock.name=Ruby Block Post +tile.rppole1.sandstone.name=Sandstone Post +tile.rppole1.sandstone1.name=Sandstone Post +tile.rppole1.sandstone2.name=Sandstone Post +tile.rppole1.sapphireBlock.name=Sapphire Block Post +tile.rppole1.silverBlock.name=Silver Block Post +tile.rppole1.slab.name=Polished Stone Post +tile.rppole1.snow.name=Snow Post +tile.rppole1.soul.name=Soul Sand Post +tile.rppole1.stone.name=Stone Post +tile.rppole1.stonebrick.name=Stone Brick Post +tile.rppole1.stonebrick1.name=Stone Brick Post +tile.rppole1.stonebrick2.name=Stone Brick Post +tile.rppole1.stonebrick3.name=Stone Brick Post +tile.rppole1.tungstenBlock.name=Tungsten Block Post +tile.rppole1.wood.name=Oak Wood Post +tile.rppole1.wood1.name=Spruce Wood Post +tile.rppole1.wood2.name=Birch Wood Post +tile.rppole1.wood3.name=Jungle Wood Post +tile.rppole1.wool.black.name=Black Wool Post +tile.rppole1.wool.blue.name=Blue Wool Post +tile.rppole1.wool.brown.name=Brown Wool Post +tile.rppole1.wool.cyan.name=Cyan Wool Post +tile.rppole1.wool.gray.name=Gray Wool Post +tile.rppole1.wool.green.name=Green Wool Post +tile.rppole1.wool.lightBlue.name=Light Blue Wool Post +tile.rppole1.wool.lime.name=Lime Wool Post +tile.rppole1.wool.magenta.name=Magenta Wool Post +tile.rppole1.wool.orange.name=Orange Wool Post +tile.rppole1.wool.pink.name=Pink Wool Post +tile.rppole1.wool.purple.name=Purple Wool Post +tile.rppole1.wool.red.name=Red Wool Post +tile.rppole1.wool.silver.name=Light Gray Wool Post +tile.rppole1.wool.white.name=White Wool Post +tile.rppole1.wool.yellow.name=Yellow Wool Post + +tile.rppole2.basalt.name=Basalt Pillar +tile.rppole2.basaltBrick.name=Basalt Brick Pillar +tile.rppole2.basaltCircle.name=Chiseled Basalt Brick Pillar +tile.rppole2.basaltCobble.name=Basalt Cobblestone Pillar +tile.rppole2.basaltPaver.name=Basalt Paver Pillar +tile.rppole2.books.name=Bookshelf Pillar +tile.rppole2.brick.name=Brick Pillar +tile.rppole2.clay.name=Clay Pillar +tile.rppole2.cobble.name=Cobblestone Pillar +tile.rppole2.copperBlock.name=Copper Block Pillar +tile.rppole2.diamond.name=Diamond Pillar +tile.rppole2.dirt.name=Dirt Pillar +tile.rppole2.glass.name=Glass Pillar +tile.rppole2.gold.name=Gold Pillar +tile.rppole2.greenSapphireBlock.name=Green Sapphire Block Pillar +tile.rppole2.iron.name=Iron Pillar +tile.rppole2.lapis.name=Lapis Lazuli Pillar +tile.rppole2.marble.name=Marble Pillar +tile.rppole2.marbleBrick.name=Marble Brick Pillar +tile.rppole2.moss.name=Moss Stone Pillar +tile.rppole2.netherbrick.name=Nether Brick Pillar +tile.rppole2.netherrack.name=Netherrack Pillar +tile.rppole2.obsidian.name=Obsidian Pillar +tile.rppole2.planks.name=Wooden Plank Pillar +tile.rppole2.planks1.name=Wooden Plank Pillar +tile.rppole2.planks2.name=Wooden Plank Pillar +tile.rppole2.planks3.name=Wooden Plank Pillar +tile.rppole2.pumpkin.name=Pumpkin Pillar +tile.rppole2.rplog.name=Rubberwood Pillar +tile.rppole2.rubyBlock.name=Ruby Block Pillar +tile.rppole2.sandstone.name=Sandstone Pillar +tile.rppole2.sandstone1.name=Sandstone Pillar +tile.rppole2.sandstone2.name=Sandstone Pillar +tile.rppole2.sapphireBlock.name=Sapphire Block Pillar +tile.rppole2.silverBlock.name=Silver Block Pillar +tile.rppole2.slab.name=Polished Stone Pillar +tile.rppole2.snow.name=Snow Pillar +tile.rppole2.soul.name=Soul Sand Pillar +tile.rppole2.stone.name=Stone Pillar +tile.rppole2.stonebrick.name=Stone Brick Pillar +tile.rppole2.stonebrick1.name=Stone Brick Pillar +tile.rppole2.stonebrick2.name=Stone Brick Pillar +tile.rppole2.stonebrick3.name=Stone Brick Pillar +tile.rppole2.tinBlock.name=Tin Block Pillar +tile.rppole2.tungstenBlock.name=Tungsten Block Pillar +tile.rppole2.wood.name=Oak Wood Pillar +tile.rppole2.wood1.name=Spruce Wood Pillar +tile.rppole2.wood2.name=Birch Wood Pillar +tile.rppole2.wood3.name=Jungle Wood Pillar +tile.rppole2.wool.black.name=Black Wool Pillar +tile.rppole2.wool.blue.name=Blue Wool Pillar +tile.rppole2.wool.brown.name=Brown Wool Pillar +tile.rppole2.wool.cyan.name=Cyan Wool Pillar +tile.rppole2.wool.gray.name=Gray Wool Pillar +tile.rppole2.wool.green.name=Green Wool Pillar +tile.rppole2.wool.lightBlue.name=Light Blue Wool Pillar +tile.rppole2.wool.lime.name=Lime Wool Pillar +tile.rppole2.wool.magenta.name=Magenta Wool Pillar +tile.rppole2.wool.orange.name=Orange Wool Pillar +tile.rppole2.wool.pink.name=Pink Wool Pillar +tile.rppole2.wool.purple.name=Purple Wool Pillar +tile.rppole2.wool.red.name=Red Wool Pillar +tile.rppole2.wool.silver.name=Light Gray Wool Pillar +tile.rppole2.wool.white.name=White Wool Pillar +tile.rppole2.wool.yellow.name=Yellow Wool Pillar + +tile.rppole3.basalt.name=Basalt Column +tile.rppole3.basaltBrick.name=Basalt Brick Column +tile.rppole3.basaltCircle.name=Chiseled Basalt Brick Column +tile.rppole3.basaltCobble.name=Basalt Cobblestone Column +tile.rppole3.basaltPaver.name=Basalt Paver Column +tile.rppole3.books.name=Bookshelf Column +tile.rppole3.brick.name=Brick Column +tile.rppole3.clay.name=Clay Column +tile.rppole3.cobble.name=Cobblestone Column +tile.rppole3.copperBlock.name=Copper Block Column +tile.rppole3.diamond.name=Diamond Column +tile.rppole3.dirt.name=Dirt Column +tile.rppole3.glass.name=Glass Column +tile.rppole3.gold.name=Gold Column +tile.rppole3.greenSapphireBlock.name=Green Sapphire Block Column +tile.rppole3.iron.name=Iron Column +tile.rppole3.lapis.name=Lapis Lazuli Column +tile.rppole3.marble.name=Marble Column +tile.rppole3.marbleBrick.name=Marble Brick Column +tile.rppole3.moss.name=Moss Stone Column +tile.rppole3.netherbrick.name=Nether Brick Column +tile.rppole3.netherrack.name=Netherrack Column +tile.rppole3.obsidian.name=Obsidian Column +tile.rppole3.planks.name=Wooden Plank Column +tile.rppole3.planks1.name=Wooden Plank Column +tile.rppole3.planks2.name=Wooden Plank Column +tile.rppole3.planks3.name=Wooden Plank Column +tile.rppole3.pumpkin.name=Pumpkin Column +tile.rppole3.rplog.name=Rubberwood Column +tile.rppole3.rubyBlock.name=Ruby Block Column +tile.rppole3.sandstone.name=Sandstone Column +tile.rppole3.sandstone1.name=Sandstone Column +tile.rppole3.sandstone2.name=Sandstone Column +tile.rppole3.sapphireBlock.name=Sapphire Block Column +tile.rppole3.silverBlock.name=Silver Block Column +tile.rppole3.slab.name=Polished Stone Column +tile.rppole3.snow.name=Snow Column +tile.rppole3.soul.name=Soul Sand Column +tile.rppole3.stone.name=Stone Column +tile.rppole3.stonebrick.name=Stone Brick Column +tile.rppole3.stonebrick1.name=Stone Brick Column +tile.rppole3.stonebrick2.name=Stone Brick Column +tile.rppole3.stonebrick3.name=Stone Brick Column +tile.rppole3.tinBlock.name=Tin Block Column +tile.rppole3.tungstenBlock.name=Tungsten Block Column +tile.rppole3.wood.name=Oak Wood Column +tile.rppole3.wood1.name=Spruce Wood Column +tile.rppole3.wood2.name=Birch Wood Column +tile.rppole3.wood3.name=Jungle Wood Column +tile.rppole3.wool.black.name=Black Wool Column +tile.rppole3.wool.blue.name=Blue Wool Column +tile.rppole3.wool.brown.name=Brown Wool Column +tile.rppole3.wool.cyan.name=Cyan Wool Column +tile.rppole3.wool.gray.name=Gray Wool Column +tile.rppole3.wool.green.name=Green Wool Column +tile.rppole3.wool.lightBlue.name=Light Blue Wool Column +tile.rppole3.wool.lime.name=Lime Wool Column +tile.rppole3.wool.magenta.name=Magenta Wool Column +tile.rppole3.wool.orange.name=Orange Wool Column +tile.rppole3.wool.pink.name=Pink Wool Column +tile.rppole3.wool.purple.name=Purple Wool Column +tile.rppole3.wool.red.name=Red Wool Column +tile.rppole3.wool.silver.name=Light Gray Wool Column +tile.rppole3.wool.white.name=White Wool Column +tile.rppole3.wool.yellow.name=Yellow Wool Column + +tile.rpslab.basalt.name=Basalt Slab +tile.rpslab.basaltBrick.name=Basalt Brick Slab +tile.rpslab.basaltCircle.name=Chiseled Basalt Brick Slab +tile.rpslab.basaltCobble.name=Basalt Cobblestone Slab +tile.rpslab.basaltPaver.name=Basalt Paver Slab +tile.rpslab.books.name=Bookshelf Slab +tile.rpslab.brick.name=Brick Slab +tile.rpslab.clay.name=Clay Slab +tile.rpslab.cobble.name=Cobblestone Slab +tile.rpslab.copperBlock.name=Copper Block Slab +tile.rpslab.diamond.name=Diamond Slab +tile.rpslab.dirt.name=Dirt Slab +tile.rpslab.glass.name=Glass Slab +tile.rpslab.gold.name=Gold Slab +tile.rpslab.greenSapphireBlock.name=Green Sapphire Block Slab +tile.rpslab.iron.name=Iron Slab +tile.rpslab.lapis.name=Lapis Lazuli Slab +tile.rpslab.marble.name=Marble Slab +tile.rpslab.marbleBrick.name=Marble Brick Slab +tile.rpslab.moss.name=Moss Stone Slab +tile.rpslab.netherbrick.name=Nether Brick Slab +tile.rpslab.netherrack.name=Netherrack Slab +tile.rpslab.obsidian.name=Obsidian Slab +tile.rpslab.planks.name=Wooden Plank Slab +tile.rpslab.planks1.name=Wooden Plank Slab +tile.rpslab.planks2.name=Wooden Plank Slab +tile.rpslab.planks3.name=Wooden Plank Slab +tile.rpslab.pumpkin.name=Pumpkin Slab +tile.rpslab.rplog.name=Rubberwood Slab +tile.rpslab.rubyBlock.name=Ruby Block Slab +tile.rpslab.sandstone.name=Sandstone Slab +tile.rpslab.sandstone1.name=Sandstone Slab +tile.rpslab.sandstone2.name=Sandstone Slab +tile.rpslab.sapphireBlock.name=Sapphire Block Slab +tile.rpslab.silverBlock.name=Silver Block Slab +tile.rpslab.slab.name=Polished Stone Slab +tile.rpslab.snow.name=Snow Slab +tile.rpslab.soul.name=Soul Sand Slab +tile.rpslab.stone.name=Stone Slab +tile.rpslab.stonebrick.name=Stone Brick Slab +tile.rpslab.stonebrick1.name=Stone Brick Slab +tile.rpslab.stonebrick2.name=Stone Brick Slab +tile.rpslab.stonebrick3.name=Stone Brick Slab +tile.rpslab.tinBlock.name=Tin Block Slab +tile.rpslab.tungstenBlock.name=Tungsten Block Slab +tile.rpslab.wood.name=Oak Wood Slab +tile.rpslab.wood1.name=Spruce Wood Slab +tile.rpslab.wood2.name=Birch Wood Slab +tile.rpslab.wood3.name=Jungle Wood Slab +tile.rpslab.wool.black.name=Black Wool Slab +tile.rpslab.wool.blue.name=Blue Wool Slab +tile.rpslab.wool.brown.name=Brown Wool Slab +tile.rpslab.wool.cyan.name=Cyan Wool Slab +tile.rpslab.wool.gray.name=Gray Wool Slab +tile.rpslab.wool.green.name=Green Wool Slab +tile.rpslab.wool.lightBlue.name=Light Blue Wool Slab +tile.rpslab.wool.lime.name=Lime Wool Slab +tile.rpslab.wool.magenta.name=Magenta Wool Slab +tile.rpslab.wool.orange.name=Orange Wool Slab +tile.rpslab.wool.pink.name=Pink Wool Slab +tile.rpslab.wool.purple.name=Purple Wool Slab +tile.rpslab.wool.red.name=Red Wool Slab +tile.rpslab.wool.silver.name=Light Gray Wool Slab +tile.rpslab.wool.white.name=White Wool Slab +tile.rpslab.wool.yellow.name=Yellow Wool Slab + +tile.rpslabc.basalt.name=Basalt Slab Corner +tile.rpslabc.basaltBrick.name=Basalt Brick Slab Corner +tile.rpslabc.basaltCircle.name=Chiseled Basalt Brick Slab Corner +tile.rpslabc.basaltCobble.name=Basalt Cobblestone Slab Corner +tile.rpslabc.basaltPaver.name=Basalt Paver Slab Corner +tile.rpslabc.books.name=Bookshelf Slab Corner +tile.rpslabc.brick.name=Brick Slab Corner +tile.rpslabc.clay.name=Clay Slab Corner +tile.rpslabc.cobble.name=Cobblestone Slab Corner +tile.rpslabc.copperBlock.name=Copper Block Slab Corner +tile.rpslabc.diamond.name=Diamond Slab Corner +tile.rpslabc.dirt.name=Dirt Slab Corner +tile.rpslabc.glass.name=Glass Slab Corner +tile.rpslabc.gold.name=Gold Slab Corner +tile.rpslabc.greenSapphireBlock.name=Green Sapphire Block Slab Corner +tile.rpslabc.iron.name=Iron Slab Corner +tile.rpslabc.lapis.name=Lapis Lazuli Slab Corner +tile.rpslabc.marble.name=Marble Slab Corner +tile.rpslabc.marbleBrick.name=Marble Brick Slab Corner +tile.rpslabc.moss.name=Moss Stone Slab Corner +tile.rpslabc.netherbrick.name=Nether Brick Slab Corner +tile.rpslabc.netherrack.name=Netherrack Slab Corner +tile.rpslabc.obsidian.name=Obsidian Slab Corner +tile.rpslabc.planks.name=Wooden Plank Slab Corner +tile.rpslabc.planks1.name=Wooden Plank Slab Corner +tile.rpslabc.planks2.name=Wooden Plank Slab Corner +tile.rpslabc.planks3.name=Wooden Plank Slab Corner +tile.rpslabc.pumpkin.name=Pumpkin Slab Corner +tile.rpslabc.rplog.name=Rubberwood Slab Corner +tile.rpslabc.rubyBlock.name=Ruby Block Slab Corner +tile.rpslabc.sandstone.name=Sandstone Slab Corner +tile.rpslabc.sandstone1.name=Sandstone Slab Corner +tile.rpslabc.sandstone2.name=Sandstone Slab Corner +tile.rpslabc.sapphireBlock.name=Sapphire Block Slab Corner +tile.rpslabc.silverBlock.name=Silver Block Slab Corner +tile.rpslabc.slab.name=Polished Stone Slab Corner +tile.rpslabc.snow.name=Snow Slab Corner +tile.rpslabc.soul.name=Soul Sand Slab Corner +tile.rpslabc.stone.name=Stone Slab Corner +tile.rpslabc.stonebrick.name=Stone Brick Slab Corner +tile.rpslabc.stonebrick1.name=Stone Brick Slab Corner +tile.rpslabc.stonebrick2.name=Stone Brick Slab Corner +tile.rpslabc.stonebrick3.name=Stone Brick Slab Corner +tile.rpslabc.tinBlock.name=Tin Block Slab Corner +tile.rpslabc.tungstenBlock.name=Tungsten Block Slab Corner +tile.rpslabc.wood.name=Oak Wood Slab Corner +tile.rpslabc.wood1.name=Spruce Wood Slab Corner +tile.rpslabc.wood2.name=Birch Wood Slab Corner +tile.rpslabc.wood3.name=Jungle Wood Slab Corner +tile.rpslabc.wool.black.name=Black Wool Slab Corner +tile.rpslabc.wool.blue.name=Blue Wool Slab Corner +tile.rpslabc.wool.brown.name=Brown Wool Slab Corner +tile.rpslabc.wool.cyan.name=Cyan Wool Slab Corner +tile.rpslabc.wool.gray.name=Gray Wool Slab Corner +tile.rpslabc.wool.green.name=Green Wool Slab Corner +tile.rpslabc.wool.lightBlue.name=Light Blue Wool Slab Corner +tile.rpslabc.wool.lime.name=Lime Wool Slab Corner +tile.rpslabc.wool.magenta.name=Magenta Wool Slab Corner +tile.rpslabc.wool.orange.name=Orange Wool Slab Corner +tile.rpslabc.wool.pink.name=Pink Wool Slab Corner +tile.rpslabc.wool.purple.name=Purple Wool Slab Corner +tile.rpslabc.wool.red.name=Red Wool Slab Corner +tile.rpslabc.wool.silver.name=Light Gray Wool Slab Corner +tile.rpslabc.wool.white.name=White Wool Slab Corner +tile.rpslabc.wool.yellow.name=Yellow Wool Slab Corner + +tile.rpslabs.basalt.name=Basalt Slab Strip +tile.rpslabs.basaltBrick.name=Basalt Brick Slab Strip +tile.rpslabs.basaltCircle.name=Chiseled Basalt Brick Slab Strip +tile.rpslabs.basaltCobble.name=Basalt Cobblestone Slab Strip +tile.rpslabs.basaltPaver.name=Basalt Paver Slab Strip +tile.rpslabs.books.name=Bookshelf Slab Strip +tile.rpslabs.brick.name=Brick Slab Strip +tile.rpslabs.clay.name=Clay Slab Strip +tile.rpslabs.cobble.name=Cobblestone Slab Strip +tile.rpslabs.copperBlock.name=Copper Block Slab Strip +tile.rpslabs.diamond.name=Diamond Slab Strip +tile.rpslabs.dirt.name=Dirt Slab Strip +tile.rpslabs.glass.name=Glass Slab Strip +tile.rpslabs.gold.name=Gold Slab Strip +tile.rpslabs.greenSapphireBlock.name=Green Sapphire Block Slab Strip +tile.rpslabs.iron.name=Iron Slab Strip +tile.rpslabs.lapis.name=Lapis Lazuli Slab Strip +tile.rpslabs.marble.name=Marble Slab Strip +tile.rpslabs.marbleBrick.name=Marble Brick Slab Strip +tile.rpslabs.moss.name=Moss Stone Slab Strip +tile.rpslabs.netherbrick.name=Nether Brick Slab Strip +tile.rpslabs.netherrack.name=Netherrack Slab Strip +tile.rpslabs.obsidian.name=Obsidian Slab Strip +tile.rpslabs.planks.name=Wooden Plank Slab Strip +tile.rpslabs.planks1.name=Wooden Plank Slab Strip +tile.rpslabs.planks2.name=Wooden Plank Slab Strip +tile.rpslabs.planks3.name=Wooden Plank Slab Strip +tile.rpslabs.pumpkin.name=Pumpkin Slab Strip +tile.rpslabs.rplog.name=Rubberwood Slab Strip +tile.rpslabs.rubyBlock.name=Ruby Block Slab Strip +tile.rpslabs.sandstone.name=Sandstone Slab Strip +tile.rpslabs.sandstone1.name=Sandstone Slab Strip +tile.rpslabs.sandstone2.name=Sandstone Slab Strip +tile.rpslabs.sapphireBlock.name=Sapphire Block Slab Strip +tile.rpslabs.silverBlock.name=Silver Block Slab Strip +tile.rpslabs.slab.name=Polished Stone Slab Strip +tile.rpslabs.snow.name=Snow Slab Strip +tile.rpslabs.soul.name=Soul Sand Slab Strip +tile.rpslabs.stone.name=Stone Slab Strip +tile.rpslabs.stonebrick.name=Stone Brick Slab Strip +tile.rpslabs.stonebrick1.name=Stone Brick Slab Strip +tile.rpslabs.stonebrick2.name=Stone Brick Slab Strip +tile.rpslabs.stonebrick3.name=Stone Brick Slab Strip +tile.rpslabs.tinBlock.name=Tin Block Slab Strip +tile.rpslabs.tungstenBlock.name=Tungsten Block Slab Strip +tile.rpslabs.wood.name=Oak Wood Slab Strip +tile.rpslabs.wood1.name=Spruce Wood Slab Strip +tile.rpslabs.wood2.name=Birch Wood Slab Strip +tile.rpslabs.wood3.name=Jungle Wood Slab Strip +tile.rpslabs.wool.black.name=Black Wool Slab Strip +tile.rpslabs.wool.blue.name=Blue Wool Slab Strip +tile.rpslabs.wool.brown.name=Brown Wool Slab Strip +tile.rpslabs.wool.cyan.name=Cyan Wool Slab Strip +tile.rpslabs.wool.gray.name=Gray Wool Slab Strip +tile.rpslabs.wool.green.name=Green Wool Slab Strip +tile.rpslabs.wool.lightBlue.name=Light Blue Wool Slab Strip +tile.rpslabs.wool.lime.name=Lime Wool Slab Strip +tile.rpslabs.wool.magenta.name=Magenta Wool Slab Strip +tile.rpslabs.wool.orange.name=Orange Wool Slab Strip +tile.rpslabs.wool.pink.name=Pink Wool Slab Strip +tile.rpslabs.wool.purple.name=Purple Wool Slab Strip +tile.rpslabs.wool.red.name=Red Wool Slab Strip +tile.rpslabs.wool.silver.name=Light Gray Wool Slab Strip +tile.rpslabs.wool.white.name=White Wool Slab Strip +tile.rpslabs.wool.yellow.name=Yellow Wool Slab Strip \ No newline at end of file diff --git a/src/main/resources/assets/rpcore/lang/ru_RU.lang b/src/main/resources/assets/rpcore/lang/ru_RU.lang new file mode 100644 index 0000000..7e9803e --- /dev/null +++ b/src/main/resources/assets/rpcore/lang/ru_RU.lang @@ -0,0 +1,2059 @@ +itemGroup.RPMicroblocks=RedPower - Микроблоки + +achievement.rpMakeSaw.desc=Сделать алмазную ножовку +achievement.rpMakeSaw=Это - ломтик, это - кусочек\! + +enchantment.damage.disjunction=Разобщение +enchantment.damage.vorpal=Вострота + +item.handsawDiamond.name=Алмазная ножовка +item.handsawGreenSapphire.name=Ножовка из зеленого сапфира +item.handsawIron.name=Железная ножовка +item.handsawRuby.name=Рубиновая ножовка +item.handsawSapphire.name=Сапфировая ножовка + +tile.rpcov3.basalt.name=Тройное покрытие из базальта +tile.rpcov3.basaltBrick.name=Тройное покрытие из базальтового кирпича +tile.rpcov3.basaltCircle.name=Тройное покрытие из резного базальтового кирпича +tile.rpcov3.basaltCobble.name=Тройное покрытие из базальтового булыжника +tile.rpcov3.basaltPaver.name=Тройное покрытие из базальтового асфальта +tile.rpcov3.books.name=Тройное покрытие из книжной полки +tile.rpcov3.brick.name=Тройное покрытие из кирпича +tile.rpcov3.clay.name=Тройное покрытие из глины +tile.rpcov3.cobble.name=Тройное покрытие из булыжника +tile.rpcov3.copperBlock.name=Тройное покрытие из блока меди +tile.rpcov3.diamond.name=Тройное покрытие из алмазного блока +tile.rpcov3.dirt.name=Тройное покрытие из земли +tile.rpcov3.emeraldBlock.name=Тройное покрытие из изумрудного блока +tile.rpcov3.glass.name=Тройное покрытие из стекла +tile.rpcov3.gold.name=Тройное покрытие из блока золота +tile.rpcov3.greenSapphireBlock.name=Тройное покрытие из блока зеленого сапфира +tile.rpcov3.iron.name=Тройное покрытие из блока железа +tile.rpcov3.lapis.name=Тройное покрытие из лазуритового блока +tile.rpcov3.marble.name=Тройное покрытие из мрамора +tile.rpcov3.marbleBrick.name=Тройное покрытие из мраморного кирпича +tile.rpcov3.moss.name=Тройное покрытие из булыжника со мхом +tile.rpcov3.netherbrick.name=Тройное покрытие из адского кирпича +tile.rpcov3.netherrack.name=Тройное покрытие из адского камня +tile.rpcov3.obsidian.name=Тройное покрытие из обсидиана +tile.rpcov3.planks.name=Тройное покрытие из досок +tile.rpcov3.planks1.name=Тройное покрытие из досок +tile.rpcov3.planks2.name=Тройное покрытие из досок +tile.rpcov3.planks3.name=Тройное покрытие из досок +tile.rpcov3.pumpkin.name=Тройное покрытие из тыквы +tile.rpcov3.rplog.name=Тройное покрытие из каучукового дерева +tile.rpcov3.rubyBlock.name=Тройное покрытие из лазуритового блока +tile.rpcov3.sandstone.name=Тройное покрытие из песчаника +tile.rpcov3.sandstone1.name=Тройное покрытие из песчаника +tile.rpcov3.sandstone2.name=Тройное покрытие из песчаника +tile.rpcov3.sapphireBlock.name=Тройное покрытие из сапфирового блока +tile.rpcov3.silverBlock.name=Рейка тройного покрытия из блока серебра +tile.rpcov3.slab.name=Тройное покрытие из каменных ступенек +tile.rpcov3.snow.name=Тройное покрытие из снега +tile.rpcov3.soul.name=Тройное покрытие из песка душ +tile.rpcov3.stone.name=Тройное покрытие из камня +tile.rpcov3.stonebrick.name=Тройное покрытие из каменного кирпича +tile.rpcov3.stonebrick1.name=Тройное покрытие из каменного кирпича +tile.rpcov3.stonebrick2.name=Тройное покрытие из каменного кирпича +tile.rpcov3.stonebrick3.name=Тройное покрытие из каменного кирпича +tile.rpcov3.tinBlock.name=Тройное покрытие из блока олова +tile.rpcov3.tungstenBlock.name=Тройное покрытие из блока вольфрама +tile.rpcov3.wood.name=Тройное покрытие из дерева +tile.rpcov3.wood1.name=Тройное покрытие из дерева +tile.rpcov3.wood2.name=Тройное покрытие из досок +tile.rpcov3.wood3.name=Тройное покрытие из дерева +tile.rpcov3.wool.black.name=Тройное покрытие из черной шерсти +tile.rpcov3.wool.blue.name=Тройное покрытие из синей шерсти +tile.rpcov3.wool.brown.name=Тройное покрытие из коричневой шерсти +tile.rpcov3.wool.cyan.name=Тройное покрытие из бирюзовой шерсти +tile.rpcov3.wool.gray.name=Тройное покрытие из серой шерсти +tile.rpcov3.wool.green.name=Тройное покрытие из зеленой шерсти +tile.rpcov3.wool.lightBlue.name=Тройное покрытие из голубой шерсти +tile.rpcov3.wool.lime.name=Тройное покрытие из лаймовой шерсти +tile.rpcov3.wool.magenta.name=Тройное покрытие из пурпурной шерсти +tile.rpcov3.wool.orange.name=Тройное покрытие из оранжевой шерсти +tile.rpcov3.wool.pink.name=Тройное покрытие из розовой шерсти +tile.rpcov3.wool.purple.name=Тройное покрытие из фиолетовой шерсти +tile.rpcov3.wool.red.name=Тройное покрытие из красной шерсти +tile.rpcov3.wool.silver.name=Тройное покрытие из светло-серой шерсти +tile.rpcov3.wool.white.name=Тройное покрытие из белой шерсти +tile.rpcov3.wool.yellow.name=Тройное покрытие из желтой шерсти +tile.rpcov3c.basalt.name=Угол тройного покрытия из базальта +tile.rpcov3c.basaltBrick.name=Угол тройного покрытия из базальтового кирпича +tile.rpcov3c.basaltCircle.name=Рейка покрытия из резного базальтового кирпича +tile.rpcov3c.basaltCobble.name=Угол тройного покрытия из базальтового булыжника +tile.rpcov3c.basaltPaver.name=Угол тройного покрытия из базальтового асфальта +tile.rpcov3c.books.name=Угол тройного покрытия из книжной полки +tile.rpcov3c.brick.name=Угол тройного покрытия из кирпича +tile.rpcov3c.clay.name=Угол тройного покрытия из глины +tile.rpcov3c.cobble.name=Угол тройного покрытия из булыжника +tile.rpcov3c.copperBlock.name=Угол тройного покрытия из блока меди +tile.rpcov3c.diamond.name=Угол тройного покрытия из алмазного блока +tile.rpcov3c.dirt.name=Угол тройного покрытия из земли +tile.rpcov3c.emeraldBlock.name=Угол тройного покрытия из изумрудного блока +tile.rpcov3c.glass.name=Угол тройного покрытия из стекла +tile.rpcov3c.gold.name=Угол тройного покрытия из блока золота +tile.rpcov3c.greenSapphireBlock.name=Угол тройного покрытия из блока зеленого сапфира +tile.rpcov3c.iron.name=Угол тройного покрытия из блока железа +tile.rpcov3c.lapis.name=Угол тройного покрытия из лазуритового блока +tile.rpcov3c.marble.name=Угол тройного покрытия из мрамора +tile.rpcov3c.marbleBrick.name=Угол тройного покрытия из мраморного кирпича +tile.rpcov3c.moss.name=Угол тройного покрытия из булыжника со мхом +tile.rpcov3c.netherbrick.name=Угол тройного покрытия из адского кирпича +tile.rpcov3c.netherrack.name=Угол тройного покрытия из адского камня +tile.rpcov3c.obsidian.name=Угол тройного покрытия из обсидиана +tile.rpcov3c.planks.name=Угол тройного покрытия из досок +tile.rpcov3c.planks1.name=Угол тройного покрытия из досок +tile.rpcov3c.planks2.name=Угол тройного покрытия из досок +tile.rpcov3c.planks3.name=Угол тройного покрытия из досок +tile.rpcov3c.pumpkin.name=Угол тройного покрытия из тыквы +tile.rpcov3c.rplog.name=Угол тройного покрытия из каучукового дерева +tile.rpcov3c.rubyBlock.name=Угол тройного покрытия из рубинового блока +tile.rpcov3c.sandstone.name=Угол тройной панели из песчаника +tile.rpcov3c.sandstone1.name=Угол тройного покрытия из песчаника +tile.rpcov3c.sandstone2.name=Угол тройного покрытия из песчаника +tile.rpcov3c.sapphireBlock.name=Угол тройного покрытия из сапфирового блока +tile.rpcov3c.silverBlock.name=Угол тройного покрытия из блока серебра +tile.rpcov3c.slab.name=Угол тройного покрытия из каменных ступенек +tile.rpcov3c.snow.name=Угол тройного покрытия из снега +tile.rpcov3c.soul.name=Угол тройного покрытия из песка душ +tile.rpcov3c.stone.name=Угол тройного покрытия из камня +tile.rpcov3c.stonebrick.name=Угол тройного покрытия из каменного кирпича +tile.rpcov3c.stonebrick1.name=Угол тройного покрытия из каменного кирпича +tile.rpcov3c.stonebrick2.name=Угол тройного покрытия из каменного кирпича +tile.rpcov3c.stonebrick3.name=Угол тройного покрытия из каменного кирпича +tile.rpcov3c.tinBlock.name=Угол тройного покрытия из блока олова +tile.rpcov3c.tungstenBlock.name=Угол тройного покрытия из блока вольфрама +tile.rpcov3c.wood.name=Угол тройного покрытия из дерева +tile.rpcov3c.wood1.name=Угол тройного покрытия из дерева +tile.rpcov3c.wood2.name=Угол тройного покрытия из дерева +tile.rpcov3c.wood3.name=Угол тройного покрытия из дерева +tile.rpcov3c.wool.black.name=Угол тройного покрытия из черной шерсти +tile.rpcov3c.wool.blue.name=Угол тройного покрытия из синей шерсти +tile.rpcov3c.wool.brown.name=Угол тройного покрытия из оранжевой шерсти +tile.rpcov3c.wool.cyan.name=Угол тройного покрытия из бирюзовой шерсти +tile.rpcov3c.wool.gray.name=Угол тройного покрытия из серой шерсти +tile.rpcov3c.wool.green.name=Угол тройного покрытия из зеленой шерсти +tile.rpcov3c.wool.lightBlue.name=Угол тройного покрытия из голубой шерсти +tile.rpcov3c.wool.lime.name=Угол тройного покрытия из лаймовой шерсти +tile.rpcov3c.wool.magenta.name=Угол тройного покрытия из пурпурной шерсти +tile.rpcov3c.wool.orange.name=Угол тройного покрытия из оранжевой шерсти +tile.rpcov3c.wool.pink.name=Угол тройного покрытия из розовой шерсти +tile.rpcov3c.wool.purple.name=Угол тройного покрытия из фиолетовой шерсти +tile.rpcov3c.wool.red.name=Угол тройного покрытия из красной шерсти +tile.rpcov3c.wool.silver.name=Угол тройного покрытия из светло-серой шерсти +tile.rpcov3c.wool.white.name=Угол тройного покрытия из белой шерсти +tile.rpcov3c.wool.yellow.name=Угол тройного покрытия из желтой шерсти +tile.rpcov3s.basalt.name=Рейка тройного покрытия из базальта +tile.rpcov3s.basaltBrick.name=Рейка тройного покрытия из базальтового кирпича +tile.rpcov3s.basaltCircle.name=Рейка тройного покрытия из резного базальтового кирпича +tile.rpcov3s.basaltCobble.name=Рейка тройного покрытия из базальтового булыжника +tile.rpcov3s.basaltPaver.name=Рейка тройного покрытия из базальтового асфальта +tile.rpcov3s.books.name=Рейка тройного покрытия из книжной полки +tile.rpcov3s.brick.name=Рейка тройного покрытия из кирпича +tile.rpcov3s.clay.name=Рейка тройного покрытия из глины +tile.rpcov3s.cobble.name=Рейка тройного покрытия из булыжника +tile.rpcov3s.copperBlock.name=Рейка тройного покрытия из блока меди +tile.rpcov3s.diamond.name=Рейка тройного покрытия из алмазного блока +tile.rpcov3s.dirt.name=Рейка тройного покрытия из земли +tile.rpcov3s.emeraldBlock.name=Рейка тройного покрытия из изумрудного блока +tile.rpcov3s.glass.name=Рейка тройного покрытия из стекла +tile.rpcov3s.gold.name=Рейка тройного покрытия из блока золота +tile.rpcov3s.greenSapphireBlock.name=Рейка тройного покрытия из блока зеленого сапфира +tile.rpcov3s.iron.name=Рейка тройного покрытия из блока железа +tile.rpcov3s.lapis.name=Рейка тройного покрытия из лазуритового блока +tile.rpcov3s.marble.name=Рейка тройного покрытия из мрамора +tile.rpcov3s.marbleBrick.name=Рейка тройного покрытия из мраморного кирпича +tile.rpcov3s.moss.name=Рейка тройного покрытия из булыжника со мхом +tile.rpcov3s.netherbrick.name=Рейка тройного покрытия из адского кирпича +tile.rpcov3s.netherrack.name=Рейка тройного покрытия из адского камня +tile.rpcov3s.obsidian.name=Рейка тройного покрытия из обсидиана +tile.rpcov3s.planks.name=Рейка тройного покрытия из досок +tile.rpcov3s.planks1.name=Рейка тройного покрытия из досок +tile.rpcov3s.planks2.name=Рейка тройного покрытия из досок +tile.rpcov3s.planks3.name=Рейка тройного покрытия из досок +tile.rpcov3s.pumpkin.name=Рейка тройного покрытия из тыквы +tile.rpcov3s.rplog.name=Рейка тройного покрытия из каучукового дерева +tile.rpcov3s.rubyBlock.name=Рейка тройного покрытия из рубинового блока +tile.rpcov3s.sandstone.name=Рейка тройного покрытия из песчаника +tile.rpcov3s.sandstone1.name=Рейка тройного покрытия из песчаника +tile.rpcov3s.sandstone2.name=Рейка тройного покрытия из песчаника +tile.rpcov3s.sapphireBlock.name=Рейка тройного покрытия из сапфирового блока +tile.rpcov3s.silverBlock.name=Рейка тройного покрытия из блока серебра +tile.rpcov3s.slab.name=Рейка тройного покрытия из каменных ступенек +tile.rpcov3s.snow.name=Рейка тройного покрытия из снега +tile.rpcov3s.soul.name=Рейка тройного покрытия из песка душ +tile.rpcov3s.stone.name=Рейка тройного покрытия из камня +tile.rpcov3s.stonebrick.name=Рейка тройного покрытия из каменного кирпича +tile.rpcov3s.stonebrick1.name=Рейка тройного покрытия из каменного кирпича +tile.rpcov3s.stonebrick2.name=Рейка тройного покрытия из каменного кирпича +tile.rpcov3s.stonebrick3.name=Рейка тройного покрытия из каменного кирпича +tile.rpcov3s.tinBlock.name=Рейка тройного покрытия из блока олова +tile.rpcov3s.tungstenBlock.name=Рейка тройного покрытия из блока вольфрама +tile.rpcov3s.wood.name=Рейка тройного покрытия из досок +tile.rpcov3s.wood1.name=Рейка тройного покрытия из дерева +tile.rpcov3s.wood2.name=Рейка тройного покрытия из дерева +tile.rpcov3s.wood3.name=Рейка тройного покрытия из дерева +tile.rpcov3s.wool.black.name=Рейка тройного покрытия из черной шерсти +tile.rpcov3s.wool.blue.name=Рейка тройного покрытия из синей шерсти +tile.rpcov3s.wool.brown.name=Рейка тройного покрытия из коричневой шерсти +tile.rpcov3s.wool.cyan.name=Рейка тройного покрытия из бирюзовой шерсти +tile.rpcov3s.wool.gray.name=Рейка тройного покрытия из серой шерсти +tile.rpcov3s.wool.green.name=Рейка тройного покрытия из зеленой шерсти +tile.rpcov3s.wool.lightBlue.name=Рейка тройного покрытия из голубой шерсти +tile.rpcov3s.wool.lime.name=Рейка тройного покрытия из лаймовой шерсти +tile.rpcov3s.wool.magenta.name=Рейка тройного покрытия из пурпурной шерсти +tile.rpcov3s.wool.orange.name=Рейка тройного покрытия из оранжевой шерсти +tile.rpcov3s.wool.pink.name=Рейка тройного покрытия из розовой шерсти +tile.rpcov3s.wool.purple.name=Рейка тройного покрытия из фиолетовой шерсти +tile.rpcov3s.wool.red.name=Рейка тройного покрытия из красной шерсти +tile.rpcov3s.wool.silver.name=Рейка тройного покрытия из светло-серой шерсти +tile.rpcov3s.wool.white.name=Рейка тройного покрытия из белой шерсти +tile.rpcov3s.wool.yellow.name=Рейка тройного покрытия из желтой шерсти +tile.rpcov5.basalt.name=Плиточное покрытие из базальта +tile.rpcov5.basaltBrick.name=Плиточное покрытие из базальтового кирпича +tile.rpcov5.basaltCircle.name=Плиточное покрытие из резного базальтового кирпича +tile.rpcov5.basaltCobble.name=Плиточное покрытие из базальтового булыжника +tile.rpcov5.basaltPaver.name=Плиточное покрытие из базальтового асфальта +tile.rpcov5.books.name=Плиточное покрытие из книжной полки +tile.rpcov5.brick.name=Плиточное покртыие из кирпича +tile.rpcov5.clay.name=Плиточное покрытие из глины +tile.rpcov5.cobble.name=Плиточное покрытие из булыжника +tile.rpcov5.copperBlock.name=Плиточное покрытие из блока меди +tile.rpcov5.diamond.name=Плиточное покрытие из алмазного блока +tile.rpcov5.dirt.name=плиточное покрытие из земли +tile.rpcov5.emeraldBlock.name=Плиточное покрытие из изумрудного блока +tile.rpcov5.glass.name=Плиточное покрытие из стекла +tile.rpcov5.gold.name=Плиточное покрытие из блока золота +tile.rpcov5.greenSapphireBlock.name=Плиточное покрытие из блока зеленого сапфира +tile.rpcov5.iron.name=Плиточное покрытие из блока железа +tile.rpcov5.lapis.name=Плиточное покрытие из лазуритового блока +tile.rpcov5.marble.name=Плиточное покрытие из мрамора +tile.rpcov5.marbleBrick.name=Плиточное покрытие из мраморного кирпича +tile.rpcov5.moss.name=Плиточное покрытие из булыжника со мхом +tile.rpcov5.netherbrick.name=Плиточное покрытие из адского кирпича +tile.rpcov5.netherrack.name=Плиточное покрытие из адского камня +tile.rpcov5.obsidian.name=Плиточное покрытие из обсидиана +tile.rpcov5.planks.name=Плиточное покрытие из досок +tile.rpcov5.planks1.name=Плиточное покрытие из досок +tile.rpcov5.planks2.name=Плиточное покрытие из досок +tile.rpcov5.planks3.name=Плиточное покрытие из досок +tile.rpcov5.pumpkin.name=Плиточное покрытие из тыквы +tile.rpcov5.rplog.name=Плиточное покрытие из каучукового дерева +tile.rpcov5.rubyBlock.name=Плиточное покрытие из рубинового блока +tile.rpcov5.sandstone.name=Плиточное покрытие из песчаника +tile.rpcov5.sandstone1.name=Плиточное покрытие из песчаника +tile.rpcov5.sandstone2.name=Плиточное покрытие из песчаника +tile.rpcov5.sapphireBlock.name=Плиточное покрытие из сапфирового блока +tile.rpcov5.silverBlock.name=Плиточное покрытие из блока серебра +tile.rpcov5.slab.name=Плиточное покрытие из каменных ступенек +tile.rpcov5.snow.name=Плиточное покрытие из снега +tile.rpcov5.soul.name=Плиточное покрытие из песка душ +tile.rpcov5.stone.name=Плиточное покрытие из камня +tile.rpcov5.stonebrick.name=Плиточное покрытие из каменного кирпича +tile.rpcov5.stonebrick1.name=Плиточное покрытие из каменного кирпича +tile.rpcov5.stonebrick2.name=Плиточное покрытие из каменного кирпича +tile.rpcov5.stonebrick3.name=Плиточное покрытие из каменного кирпича +tile.rpcov5.tinBlock.name=Плиточное покрытие из блока олова +tile.rpcov5.tungstenBlock.name=Плиточное покрытие из блока вольфрама +tile.rpcov5.wood.name=Плиточное покрытие из дерева +tile.rpcov5.wood1.name=Плиточное покрытие из дерева +tile.rpcov5.wood2.name=Плиточное покрытие из дерева +tile.rpcov5.wood3.name=Плиточное покрытие из дерева +tile.rpcov5.wool.black.name=Плиточное покрытие из черной шерсти +tile.rpcov5.wool.blue.name=Плиточное покрытие из синей шерсти +tile.rpcov5.wool.brown.name=плиточное покрытие из коричневой шерсти +tile.rpcov5.wool.cyan.name=Плиточное покрытие из бирюзовой шерсти +tile.rpcov5.wool.gray.name=Плиточное покрытие из серой шерсти +tile.rpcov5.wool.green.name=Плиточное покрытие из зеленой шерсти +tile.rpcov5.wool.lightBlue.name=Плиточное покрытие из голубой шерсти +tile.rpcov5.wool.lime.name=Плиточное покрытие из лаймовой шерсти +tile.rpcov5.wool.magenta.name=Плиточное покрытие из пурпурной шерсти +tile.rpcov5.wool.orange.name=Плиточное покрытие из оранжевой шерсти +tile.rpcov5.wool.pink.name=Плиточное покрытие из розовой шерсти +tile.rpcov5.wool.purple.name=Плиточное покрытие из фиолетовой шерсти +tile.rpcov5.wool.red.name=Плиточное покрытие из красной шерсти +tile.rpcov5.wool.silver.name=Плиточное покрытие из светло-серой шерсти +tile.rpcov5.wool.white.name=Плиточное покрытие из белой шерсти +tile.rpcov5.wool.yellow.name=Плиточное покрытие из желтой шерсти +tile.rpcov5c.basalt.name=Угол плиточного покрытия из базальта +tile.rpcov5c.basaltBrick.name=Угол плиточного покрытия из базальтового кирпича +tile.rpcov5c.basaltCircle.name=Угол плиточного покрытия из резного базальтового кирпича +tile.rpcov5c.basaltCobble.name=Угол плиточного покрытия из базальтового булыжника +tile.rpcov5c.basaltPaver.name=Угол плиточного покрытия из базальтового асфальта +tile.rpcov5c.books.name=Угол плиточного покрытия из книжной полки +tile.rpcov5c.brick.name=Угол плиточного покрытия из кирпича +tile.rpcov5c.clay.name=Угол плиточного покрытия из глины +tile.rpcov5c.cobble.name=Угол плиточного покрытия из булыжника +tile.rpcov5c.copperBlock.name=Угол плиточного покрытия из блока меди +tile.rpcov5c.diamond.name=Угол плиточного покрытия из алмазного блока +tile.rpcov5c.dirt.name=Угол плиточного покрытия из земли +tile.rpcov5c.emeraldBlock.name=Угол плиточного покрытия из изумрудного блока +tile.rpcov5c.glass.name=Угол плиточного покрытия из стекла +tile.rpcov5c.gold.name=Угол плиточного покрытия из блока золота +tile.rpcov5c.greenSapphireBlock.name=Угол плиточного покрытия из блока зеленого сапфира +tile.rpcov5c.iron.name=Угол плиточного покрытия из блока железа +tile.rpcov5c.lapis.name=Угол плиточного покрытия из лазуритового блока +tile.rpcov5c.marble.name=Угол плиточного покрытия из мрамора +tile.rpcov5c.marbleBrick.name=Угол плиточного покрытия из мраморного кирпича +tile.rpcov5c.moss.name=Угол плиточного покрытия из булыжника со мхом +tile.rpcov5c.netherbrick.name=Угол плиточного покрытия из адского кирпича +tile.rpcov5c.netherrack.name=Угол плиточного покрытия из адского камня +tile.rpcov5c.obsidian.name=Угол плиточного покрытия из обсидиана +tile.rpcov5c.planks.name=Угол плиточного покрытия из досок +tile.rpcov5c.planks1.name=Угол плиточного покрытия из досок +tile.rpcov5c.planks2.name=Угол плиточного покрытия из досок +tile.rpcov5c.planks3.name=Угол плиточного покрытия из досок +tile.rpcov5c.pumpkin.name=Угол плиточного покрытия из тыквы +tile.rpcov5c.rplog.name=Угол плиточного покрытия из каучукового дерева +tile.rpcov5c.rubyBlock.name=Угол плиточного покрытия из рубинового блока +tile.rpcov5c.sandstone.name=Угол плиточного покрытия из песчаника +tile.rpcov5c.sandstone1.name=Угол плиточного покрытия из песчаника +tile.rpcov5c.sandstone2.name=Угол плиточного покрытия из песчаника +tile.rpcov5c.sapphireBlock.name=Угол плиточного покрытия из сапфирового блока +tile.rpcov5c.silverBlock.name=Угол плиточного покрытия из блока серебра +tile.rpcov5c.slab.name=Угол плиточного покрытия из каменных ступенек +tile.rpcov5c.snow.name=Угол плиточного покрытия из снега +tile.rpcov5c.soul.name=Угол плиточного покрытия из песка душ +tile.rpcov5c.stone.name=Угол плиточного покрытия из камня +tile.rpcov5c.stonebrick.name=Угол плиточного покрытия из каменного кирпича +tile.rpcov5c.stonebrick1.name=Угол плиточного покрытия из каменного кирпича +tile.rpcov5c.stonebrick2.name=Угол плиточного покрытия из каменного кирпича +tile.rpcov5c.stonebrick3.name=Угол плиточного покрытия из каменного кирпича +tile.rpcov5c.tinBlock.name=Угол плиточного покрытия из блока олова +tile.rpcov5c.tungstenBlock.name=Угол плиточного покрытия из блока вольфрама +tile.rpcov5c.wood.name=Угол плиточного покрытия из дерева +tile.rpcov5c.wood1.name=Угол плиточного покрытия из дерева +tile.rpcov5c.wood2.name=Угол плиточного покрытия из дерева +tile.rpcov5c.wood3.name=Угол плиточного покрытия из дерева +tile.rpcov5c.wool.black.name=Угол плиточного покрытия из черной шерсти +tile.rpcov5c.wool.blue.name=Угол плиточного покрытия из синей шерсти +tile.rpcov5c.wool.brown.name=Угол плиточного покрытия из коричневой шерсти +tile.rpcov5c.wool.cyan.name=Угол плиточного покрытия из бирюзовой шерсти +tile.rpcov5c.wool.gray.name=Угол плиточного покрытия из серой шерсти +tile.rpcov5c.wool.green.name=Угол плиточного покрытия из зеленой шерсти +tile.rpcov5c.wool.lightBlue.name=Угол плиточного покрытия из голубой шерсти +tile.rpcov5c.wool.lime.name=Угол плиточного покрытия из лаймовой шерсти +tile.rpcov5c.wool.magenta.name=Угол плиточного покрытия из пурпурной шерсти +tile.rpcov5c.wool.orange.name=Угол плиточного покрытия из оранжевой шерсти +tile.rpcov5c.wool.pink.name=Угол плиточного покрытия из розовой шерсти +tile.rpcov5c.wool.purple.name=Угол плиточного покрытия из фиолетовой шерсти +tile.rpcov5c.wool.red.name=Угол плиточного покрытия из красной шерсти +tile.rpcov5c.wool.silver.name=Угол плиточного покрытия из светло-серой шерсти +tile.rpcov5c.wool.white.name=Угол плиточного покрытия из белой шерсти +tile.rpcov5c.wool.yellow.name=Угол плиточного покрытия из желтой шерсти +tile.rpcov5s.basalt.name=Рейка плиточного покрытия из базальта +tile.rpcov5s.basaltBrick.name=Рейка плиточного покрытия из базальтового кирпича +tile.rpcov5s.basaltCircle.name=Рейка плиточного покрытия из резного базальтового кирпича +tile.rpcov5s.basaltCobble.name=Рейка плиточного покрытия из базальтового булыжника +tile.rpcov5s.basaltPaver.name=Рейка плиточного покрытия из базальтового асфальта +tile.rpcov5s.books.name=Рейка плиточного покрытия из книжной полки +tile.rpcov5s.brick.name=Рейка плиточного покрытия из кирпича +tile.rpcov5s.clay.name=Рейка плиточного покрытия из глины +tile.rpcov5s.cobble.name=Рейка плиточного покрытия из булыжника +tile.rpcov5s.copperBlock.name=Рейка плиточного покрытия из блока меди +tile.rpcov5s.diamond.name=Рейка плиточного покрытия из алмазного блока +tile.rpcov5s.dirt.name=Рейка плиточного покрытия из земли +tile.rpcov5s.emeraldBlock.name=Рейка плиточного покрытия из изумрудного блока +tile.rpcov5s.glass.name=Рейка плиточного покрытия из стекла +tile.rpcov5s.gold.name=Рейка плиточного покрытия из блока золота +tile.rpcov5s.greenSapphireBlock.name=Рейка плиточного покрытия из блока зеленого сапфира +tile.rpcov5s.iron.name=Рейка плиточного покрытия из блока железа +tile.rpcov5s.lapis.name=Рейка плиточного покрытия из лазуритового блока +tile.rpcov5s.marble.name=Рейка плиточного покрытия из мрамора +tile.rpcov5s.marbleBrick.name=Рейка плиточного покрытия из мраморного кирпича +tile.rpcov5s.moss.name=Рейка плиточного покрытия из булыжника со мхом +tile.rpcov5s.netherbrick.name=Рейка плиточного покрытия из адского кирпича +tile.rpcov5s.netherrack.name=Рейка плиточного покрытия из адского кирпича +tile.rpcov5s.obsidian.name=Рейка плиточного покрытия из обсидиана +tile.rpcov5s.planks.name=Рейка плиточного покрытия из досок +tile.rpcov5s.planks1.name=Рейка плиточного покрытия из досок +tile.rpcov5s.planks2.name=Рейка плиточного покрытия из досок +tile.rpcov5s.planks3.name=Рейка плиточного покрытия из досок +tile.rpcov5s.pumpkin.name=Рейка плиточного покрытия из алмазного блока +tile.rpcov5s.rplog.name=Рейка плиточного покрытия из каучукового дерева +tile.rpcov5s.rubyBlock.name=Рейка плиточного покрытия из рубинового блока +tile.rpcov5s.sandstone.name=Рейка плиточного покрытия из песчаника +tile.rpcov5s.sandstone1.name=Рейка плиточного покрытия из песчаника +tile.rpcov5s.sandstone2.name=Рейка плиточного покрытия из песчаника +tile.rpcov5s.sapphireBlock.name=Рейка плиточного покрытия из сапфирового блока +tile.rpcov5s.silverBlock.name=Рейка плиточного покрытия из блока серебра +tile.rpcov5s.slab.name=Рейка плиточного покрытия из каменных ступенек +tile.rpcov5s.snow.name=Рейка плиточного покрытия из снега +tile.rpcov5s.soul.name=Рейка плиточного покрытия из песка душ +tile.rpcov5s.stone.name=Рейка плиточного покрытия из камня +tile.rpcov5s.stonebrick.name=Рейка плиточного покрытия из каменного кирпича +tile.rpcov5s.stonebrick1.name=Рейка плиточного покрытия из каменного кирпича +tile.rpcov5s.stonebrick2.name=Рейка плиточного покрытия из каменного кирпича +tile.rpcov5s.stonebrick3.name=Рейка плиточного покрытия из каменного кирпича +tile.rpcov5s.tinBlock.name=Рейка плиточного покрытия из блока олова +tile.rpcov5s.tungstenBlock.name=Рейка плиточного покрытия из блока вольфрама +tile.rpcov5s.wood.name=Рейка плиточного покрытия из дерева +tile.rpcov5s.wood1.name=Рейка плиточного покрытия из дерева +tile.rpcov5s.wood2.name=Рейка плиточного покрытия из дерева +tile.rpcov5s.wood3.name=Рейка плиточного покрытия из дерева +tile.rpcov5s.wool.black.name=Рейка плиточного покрытия из черной шерсти +tile.rpcov5s.wool.blue.name=Рейка плиточного покрытия из синей шерсти +tile.rpcov5s.wool.brown.name=Рейка плиточного покрытия из коричневой шерсти +tile.rpcov5s.wool.cyan.name=Рейка плиточного покрытия из бирюзовой шерсти +tile.rpcov5s.wool.gray.name=Рейка плиточного покрытия из светло-серой шерсти +tile.rpcov5s.wool.green.name=Рейка плиточного покрытия из зеленой шерсти +tile.rpcov5s.wool.lightBlue.name=Рейка плиточного покрытия из голубой шерсти +tile.rpcov5s.wool.lime.name=Рейка плиточного покрытия из лаймовой шерсти +tile.rpcov5s.wool.magenta.name=Рейка плиточного покрытия из пурпурной шерсти +tile.rpcov5s.wool.orange.name=Рейка плиточного покрытия из оранжевой шерсти +tile.rpcov5s.wool.pink.name=Рейка плиточного покрытия из розовой шерсти +tile.rpcov5s.wool.purple.name=Рейка плиточного покрытия из фиолетовой шерсти +tile.rpcov5s.wool.red.name=Рейка плиточного покрытия из красной шерсти +tile.rpcov5s.wool.silver.name=Рейка плиточного покрытия из светло-серой шерсти +tile.rpcov5s.wool.white.name=Рейка плиточного покрытия из белой шерсти +tile.rpcov5s.wool.yellow.name=Рейка плиточного покрытия из желтой шерсти +tile.rpcov6.basalt.name=Тройная панель из базальта +tile.rpcov6.basaltBrick.name=Тройная панель из базальтового кирпича +tile.rpcov6.basaltCircle.name=Тройная панель из резного базальтового кирпича +tile.rpcov6.basaltCobble.name=Тройная панель из базальтового булыжника +tile.rpcov6.basaltPaver.name=Тройная панель из базальтового асфальта +tile.rpcov6.books.name=Тройная панель из книжной полки +tile.rpcov6.brick.name=Тройная панель из кирпича +tile.rpcov6.clay.name=Тройная панель из глины +tile.rpcov6.cobble.name=Тройная панель из булыжника +tile.rpcov6.copperBlock.name=Тройная панель из блока меди +tile.rpcov6.diamond.name=Тройная панель из алмазного блока +tile.rpcov6.dirt.name=Тройная панель из земли +tile.rpcov6.emeraldBlock.name=Тройная панель из изумрудного блока +tile.rpcov6.glass.name=Тройная панель из стекла +tile.rpcov6.gold.name=Тройная панель из блока золота +tile.rpcov6.greenSapphireBlock.name=Тройная панель из блока зеленого сапфира +tile.rpcov6.iron.name=Тройная панель из блока железа +tile.rpcov6.lapis.name=Тройная панель из лазуритового блока +tile.rpcov6.marble.name=Тройная панель из мрамора +tile.rpcov6.marbleBrick.name=Тройная панель из мраморного кирпича +tile.rpcov6.moss.name=Тройная панель из булыжника со мхом +tile.rpcov6.netherbrick.name=Тройная панель из адского кирпича +tile.rpcov6.netherrack.name=Тройная панель из адского камня +tile.rpcov6.obsidian.name=Тройная панель из обсидиана +tile.rpcov6.planks.name=Тройная панель из досок +tile.rpcov6.planks1.name=Тройная панель из досок +tile.rpcov6.planks2.name=Тройная панель из досок +tile.rpcov6.planks3.name=Тройная панель из досок +tile.rpcov6.pumpkin.name=Тройная панель из тыквы +tile.rpcov6.rplog.name=Тройная панель из каучукового дерева +tile.rpcov6.rubyBlock.name=Тройная панель из рубинового блока +tile.rpcov6.sandstone.name=Тройная панель из песчаника +tile.rpcov6.sandstone1.name=Тройная панель из песчаника +tile.rpcov6.sandstone2.name=Тройная панель из песчаника +tile.rpcov6.sapphireBlock.name=Тройная панель из сапфирового блока +tile.rpcov6.silverBlock.name=Тройная панель из блока серебра +tile.rpcov6.slab.name=Тройная панель из каменных ступенек +tile.rpcov6.snow.name=Тройная панель из снега +tile.rpcov6.soul.name=Тройная панель из песка душ +tile.rpcov6.stone.name=Тройная панель из камня +tile.rpcov6.stonebrick.name=Тройная панель из каменного кирпича +tile.rpcov6.stonebrick1.name=Тройная панель из каменного кирпича +tile.rpcov6.stonebrick2.name=Тройная панель в оболочке из каменного кирпича +tile.rpcov6.stonebrick3.name=Тройная панель из каменного кирпича +tile.rpcov6.tinBlock.name=Тройная панель из блока олова +tile.rpcov6.tungstenBlock.name=Тройная панель из блока вольфрама +tile.rpcov6.wood.name=Тройная панель из дерева +tile.rpcov6.wood1.name=Тройная панель из дерева +tile.rpcov6.wood2.name=Тройная панель из дерева +tile.rpcov6.wood3.name=Тройная панель из дерева +tile.rpcov6.wool.black.name=Тройная панель из черной шерсти +tile.rpcov6.wool.blue.name=Тройная панель из синей шерсти +tile.rpcov6.wool.brown.name=Тройная панель из коричневой шерсти +tile.rpcov6.wool.cyan.name=Тройная панель из бирюзовой шерсти +tile.rpcov6.wool.gray.name=Тройная панель из серой шерсти +tile.rpcov6.wool.green.name=Тройная панель из зеленой шерсти +tile.rpcov6.wool.lightBlue.name=Тройная панель из голубой шерсти +tile.rpcov6.wool.lime.name=Тройная панель из лаймовой шерсти +tile.rpcov6.wool.magenta.name=Тройная панель из пурпурной шерсти +tile.rpcov6.wool.orange.name=Тройная панель из оранжевой шерсти +tile.rpcov6.wool.pink.name=Тройная панель из розовой шерсти +tile.rpcov6.wool.purple.name=Тройная панель из фиолетовой шерсти +tile.rpcov6.wool.red.name=Тройная панель из красной шерсти +tile.rpcov6.wool.silver.name=Тройная панель из светло-серой шерсти +tile.rpcov6.wool.white.name=Тройная панель из белой шерсти +tile.rpcov6.wool.yellow.name=Тройная панель из желтой шерсти +tile.rpcov6c.basalt.name=Угол тройной панели из базальта +tile.rpcov6c.basaltBrick.name=Угол тройной панели из базальтового кирпича +tile.rpcov6c.basaltCircle.name=Угол тройной панели из резного базальтового кирпича +tile.rpcov6c.basaltCobble.name=Угол тройной панели из базальтового булыжника +tile.rpcov6c.basaltPaver.name=Угол тройной панели зи базальтового асфальта +tile.rpcov6c.books.name=Угол тройной панели из книжной полки +tile.rpcov6c.brick.name=Угол тройной панели из кирпича +tile.rpcov6c.clay.name=Угол тройной панели из глины +tile.rpcov6c.cobble.name=Угол тройной панели из булыжника +tile.rpcov6c.copperBlock.name=Угол тройной панели из блока меди +tile.rpcov6c.diamond.name=Угол тройной панели из алмазного блока +tile.rpcov6c.dirt.name=Угол тройной панели из земли +tile.rpcov6c.emeraldBlock.name=Угол тройной панели из изумрудного блока +tile.rpcov6c.glass.name=Угол тройной панели из стекла +tile.rpcov6c.gold.name=Угол тройной панели из блока золота +tile.rpcov6c.greenSapphireBlock.name=Угол тройной панели из блока зеленого сапфира +tile.rpcov6c.iron.name=Угол тройной панели из блока железа +tile.rpcov6c.lapis.name=Угол тройной панели из лазуритового блока +tile.rpcov6c.marble.name=Угол тройной панели из мрамора +tile.rpcov6c.marbleBrick.name=Угол тройной панели из мраморного кирпича +tile.rpcov6c.moss.name=Угол тройной панели из булыжника со мхом +tile.rpcov6c.netherbrick.name=Угол тройной панели из адского кирпича +tile.rpcov6c.netherrack.name=Угол тройной панели из адского камня +tile.rpcov6c.obsidian.name=Угол тройной панели из обсидиана +tile.rpcov6c.planks.name=Угол тройной панели из досок +tile.rpcov6c.planks1.name=Угол тройной панели из досок +tile.rpcov6c.planks2.name=Угол тройной панели из досок +tile.rpcov6c.planks3.name=Угол тройной панели из досок +tile.rpcov6c.pumpkin.name=Угол тройной панели из тыквы +tile.rpcov6c.rplog.name=Угол тройной панели из каучукового дерева +tile.rpcov6c.rubyBlock.name=Угол тройной панели из рубинового блока +tile.rpcov6c.sandstone.name=Угол тройной панели из песчаника +tile.rpcov6c.sandstone1.name=Угол тройной панели из песчаника +tile.rpcov6c.sandstone2.name=Угол тройной панели из песчаника +tile.rpcov6c.sapphireBlock.name=Угол тройной панели из сапфирового блока +tile.rpcov6c.silverBlock.name=Угол тройной панели из блока серебра +tile.rpcov6c.slab.name=Угол тройной панели из каменных ступенек +tile.rpcov6c.snow.name=Угол тройной панели из дерева +tile.rpcov6c.soul.name=Угол тройной панели из песка душ +tile.rpcov6c.stone.name=Угол тройной панели из камня +tile.rpcov6c.stonebrick.name=Угол тройной панели из каменного кирпича +tile.rpcov6c.stonebrick1.name=Угол тройной панели из каменного кирпича +tile.rpcov6c.stonebrick2.name=Угол тройной панели из каменного кирпича +tile.rpcov6c.stonebrick3.name=Угол тройной панели из каменного кирпича +tile.rpcov6c.tinBlock.name=Угол тройной панели из блока олова +tile.rpcov6c.tungstenBlock.name=Угол тройной панели из блока вольфрама +tile.rpcov6c.wood.name=Угол тройной панели из дерева +tile.rpcov6c.wood1.name=Угол тройной панели из дерева +tile.rpcov6c.wood2.name=Угол тройной панели из дерева +tile.rpcov6c.wood3.name=Угол тройной панели из дерева +tile.rpcov6c.wool.black.name=Угол тройной панели из черной шерсти +tile.rpcov6c.wool.blue.name=Угол тройной панели из синей шерсти +tile.rpcov6c.wool.brown.name=Угол тройной панели из коричневой шерсти +tile.rpcov6c.wool.cyan.name=Угол тройной панели из бирюзовой шерсти +tile.rpcov6c.wool.gray.name=Угол тройной панели из серой шерсти +tile.rpcov6c.wool.green.name=Угол тройной панели из зеленой шерсти +tile.rpcov6c.wool.lightBlue.name=Угол тройной панели из голубой шерсти +tile.rpcov6c.wool.lime.name=Угол тройной панели из лаймовой шерст +tile.rpcov6c.wool.magenta.name=Угол тройной панели из пурпурной шерсти +tile.rpcov6c.wool.orange.name=Угол тройной панели из оранжевой шерсти +tile.rpcov6c.wool.pink.name=Угол тройной панели из розовой шерсти +tile.rpcov6c.wool.purple.name=Угол тройной панели из фиолетовой шерсти +tile.rpcov6c.wool.red.name=Угол тройной панели из красной шерсти +tile.rpcov6c.wool.silver.name=Угол тройной панели из светло-серой шерсти +tile.rpcov6c.wool.white.name=Угол тройной панели из желтой шерсти +tile.rpcov6c.wool.yellow.name=Угол тройной панели из желтой шерсти +tile.rpcov6s.basalt.name=Рейка тройной панели из базальта +tile.rpcov6s.basaltBrick.name=Рейка тройной панели из базальтового кирпича +tile.rpcov6s.basaltCircle.name=Рейка тройной панели из резного базальтового кирпича +tile.rpcov6s.basaltCobble.name=Рейка тройной панели из базальтового булыжника +tile.rpcov6s.basaltPaver.name=Рейка тройной панели из базальтового асфальта +tile.rpcov6s.books.name=Рейка тройной панели из книжной полки +tile.rpcov6s.brick.name=Рейка тройной панели из кирпича +tile.rpcov6s.clay.name=Рейка тройной панели из глины +tile.rpcov6s.cobble.name=Рейка тройной панели из булыжника +tile.rpcov6s.copperBlock.name=Рейка тройной панели из блока меди +tile.rpcov6s.diamond.name=Рейка тройной панели из алмазного блока +tile.rpcov6s.dirt.name=Рейка тройной панели из земли +tile.rpcov6s.emeraldBlock.name=Рейка тройной панели из изумрудного блока +tile.rpcov6s.glass.name=Рейка тройной панели из стекла +tile.rpcov6s.gold.name=Рейка тройной панели из блока золота +tile.rpcov6s.greenSapphireBlock.name=Рейка тройной панели из блока зеленого сапфира +tile.rpcov6s.iron.name=Рейка тройной панели из блока железа +tile.rpcov6s.lapis.name=Рейка тройной панели из лазуритового блока +tile.rpcov6s.marble.name=Рейка тройной панели из мрамора +tile.rpcov6s.marbleBrick.name=Рейка тройной панели из мраморного кирпича +tile.rpcov6s.moss.name=Рейка тройной панели из булыжника со мхом +tile.rpcov6s.netherbrick.name=Рейка тройной панели из адского кирпича +tile.rpcov6s.netherrack.name=Рейка тройной панели из адского камня +tile.rpcov6s.obsidian.name=Рейка тройной панели из обсидиана +tile.rpcov6s.planks.name=Рейка тройной панели из досок +tile.rpcov6s.planks1.name=Рейка тройной панели из досок +tile.rpcov6s.planks2.name=Рейка тройной панели из досок +tile.rpcov6s.planks3.name=Рейка тройной панели из досок +tile.rpcov6s.pumpkin.name=Рейка тройной панели из тыквы +tile.rpcov6s.rplog.name=Рейка тройной панели из каучукового дерева +tile.rpcov6s.rubyBlock.name=Рейка тройной панели из рубинового блока +tile.rpcov6s.sandstone.name=Рейка тройной панели из песчаника +tile.rpcov6s.sandstone1.name=Рейка тройной панели из песчаника +tile.rpcov6s.sandstone2.name=Рейка тройной панели из песчаника +tile.rpcov6s.sapphireBlock.name=Рейка тройной панели из сапфирового блока +tile.rpcov6s.silverBlock.name=Рейка тройной панели из блока серебра +tile.rpcov6s.slab.name=Рейка тройной панели из каменных ступенек +tile.rpcov6s.snow.name=Рейка тройной панели из снега +tile.rpcov6s.soul.name=Рейка тройной панели из песка душ +tile.rpcov6s.stone.name=Рейка тройной панели из камня +tile.rpcov6s.stonebrick.name=Рейка тройной панели из каменного кирпича +tile.rpcov6s.stonebrick1.name=Рейка тройной панели из каменного кирпича +tile.rpcov6s.stonebrick2.name=Рейка тройной панели из каменного кирпича +tile.rpcov6s.stonebrick3.name=Рейка тройной панели из каменного кирпича +tile.rpcov6s.tinBlock.name=Рейка тройной панели из блока олова +tile.rpcov6s.tungstenBlock.name=Рейка тройной панели из блока вольфрама +tile.rpcov6s.wood.name=Рейка тройной панели из дерева +tile.rpcov6s.wood1.name=Рейка тройной панели из дерева +tile.rpcov6s.wood2.name=Рейка тройной панели из дерева +tile.rpcov6s.wood3.name=Рейка тройной панели из дерева +tile.rpcov6s.wool.black.name=Рейка тройной панели из черной шерсти +tile.rpcov6s.wool.blue.name=Рейка тройной панели из синей шерсти +tile.rpcov6s.wool.brown.name=Рейка тройной панели из коричневой шерсти +tile.rpcov6s.wool.cyan.name=Рейка тройной панели из бирюзовой шерсти +tile.rpcov6s.wool.gray.name=Рейка тройной панели из серой шерсти +tile.rpcov6s.wool.green.name=Рейка тройной панели из зеленой шерсти +tile.rpcov6s.wool.lightBlue.name=Рейка тройной панели из голубой шерсти +tile.rpcov6s.wool.lime.name=Рейка тройной панели из лаймовой шерсти +tile.rpcov6s.wool.magenta.name=Рейка тройной панели из пурпурной шерсти +tile.rpcov6s.wool.orange.name=Рейка тройной панели из оранжевой шерсти +tile.rpcov6s.wool.pink.name=Рейка тройной панели из розовой шерсати +tile.rpcov6s.wool.purple.name=Рейка тройной панели из фиолетовой шерсти +tile.rpcov6s.wool.red.name=Рейка тройной панели из красной шерсти +tile.rpcov6s.wool.silver.name=Рейка тройной панели из светло-серой шерсти +tile.rpcov6s.wool.white.name=Рейка тройной панели из белой шерсти +tile.rpcov6s.wool.yellow.name=Рейка тройной панели из желтой шерсти +tile.rpcov7.basalt.name=Антипокрытие из базальта +tile.rpcov7.basaltBrick.name=Антипокрытие из базальтового кирпича +tile.rpcov7.basaltCircle.name=Антипокрытие из резного базальтового кирпича +tile.rpcov7.basaltCobble.name=Антипокрытие из базальтового булыжника +tile.rpcov7.basaltPaver.name=Антипокрытие из базальтового асфальта +tile.rpcov7.books.name=Антипокрытие из книжной полки +tile.rpcov7.brick.name=Антипокрытие из кирпича +tile.rpcov7.clay.name=Антипокрытие из глины +tile.rpcov7.cobble.name=Антипокрытие из булыжника +tile.rpcov7.copperBlock.name=Антипокрытие из блока меди +tile.rpcov7.diamond.name=Антипокрытие из алмазного блока +tile.rpcov7.dirt.name=Антипокрытие из земли +tile.rpcov7.emeraldBlock.name=Антипокрытие из изумрудного блока +tile.rpcov7.glass.name=Антипокрытие из стекла +tile.rpcov7.gold.name=Антипокрытие из блока золота +tile.rpcov7.greenSapphireBlock.name=Антипокрытие из сапфирового блока +tile.rpcov7.iron.name=Антипокрытие из блока железа +tile.rpcov7.lapis.name=Антипокрытие из лазуритового блока +tile.rpcov7.marble.name=Антипокрытие из мрамора +tile.rpcov7.marbleBrick.name=Антипокрытие из мраморного кирпича +tile.rpcov7.moss.name=Антипокрытие из булыжника со мхом +tile.rpcov7.netherbrick.name=Антипокрытие из адского кирпича +tile.rpcov7.netherrack.name=Антипокрытие из адского камня +tile.rpcov7.obsidian.name=Антипокрытие из обсидиана +tile.rpcov7.planks.name=Антипокрытие из досок +tile.rpcov7.planks1.name=Антипокрытие из досок +tile.rpcov7.planks2.name=Антипокрытие из досок +tile.rpcov7.planks3.name=Антипокрытие из досок +tile.rpcov7.pumpkin.name=Антипокрытие из тыквы +tile.rpcov7.rplog.name=Антипокрытие из каучукового дерева +tile.rpcov7.rubyBlock.name=Антипокрытие из рубинового блока +tile.rpcov7.sandstone.name=Антипокрытие из песчаника +tile.rpcov7.sandstone1.name=Антипокрытие из песчаника +tile.rpcov7.sandstone2.name=Антипокрытие из песчаника +tile.rpcov7.sapphireBlock.name=Антипокрытие из сапфирового блока +tile.rpcov7.silverBlock.name=Антипокрытие из блока серебра +tile.rpcov7.slab.name=Антипокрытие из каменных ступенек +tile.rpcov7.snow.name=Антипокрытие из снега +tile.rpcov7.soul.name=Антипокрытие из песка душ +tile.rpcov7.stone.name=Антипокрытие из камня +tile.rpcov7.stonebrick.name=Антипокрытие из каменного кирпича +tile.rpcov7.stonebrick1.name=Антипокрытие из каменного кирпича +tile.rpcov7.stonebrick2.name=Антипокрытие из каменного кирпича +tile.rpcov7.stonebrick3.name=Антипокрытие из каменного кирпича +tile.rpcov7.tinBlock.name=Антипокрытие из блока олова +tile.rpcov7.tungstenBlock.name=Антипокрытие из блока вольфрама +tile.rpcov7.wood.name=Антипокрытие из дерева +tile.rpcov7.wood1.name=Антипокрытие из дерева +tile.rpcov7.wood2.name=Антипокрытие из дерева +tile.rpcov7.wood3.name=Антипокрытие из досок +tile.rpcov7.wool.black.name=Антипокрытие из черной шерсти +tile.rpcov7.wool.blue.name=Антипокрытие из синей шерсти +tile.rpcov7.wool.brown.name=Антипокрытие из коричневого дерева +tile.rpcov7.wool.cyan.name=Антипокрытие из бирюзовой шерсти +tile.rpcov7.wool.gray.name=Антипокрытие из серой шерсти +tile.rpcov7.wool.green.name=Антипокрытие из зеленой шерсти +tile.rpcov7.wool.lightBlue.name=Антипокрытие из голубой шерсти +tile.rpcov7.wool.lime.name=Антипокрытие из лаймовой шерсти +tile.rpcov7.wool.magenta.name=Антипокрытие из пурпурной шерсти +tile.rpcov7.wool.orange.name=Антипокрытие из оранжевой шерсти +tile.rpcov7.wool.pink.name=Антипокрытие из розовой шерсти +tile.rpcov7.wool.purple.name=Антипокрытие из фиолетовой шерсти +tile.rpcov7.wool.red.name=Антипокрытие из красной шерсти +tile.rpcov7.wool.silver.name=Антипокрытие из светло-серой шерсти +tile.rpcov7.wool.white.name=Антипокрытие из белой шерсти +tile.rpcov7.wool.yellow.name=Антипокрытие из желтой шерсти +tile.rpcov7c.basalt.name=Угол антипокрытия из базальта +tile.rpcov7c.basaltBrick.name=Угол антипокрытия из базальтового кирпича +tile.rpcov7c.basaltCircle.name=Угол антипокрытия из резного базальтового кирпича +tile.rpcov7c.basaltCobble.name=Угол антипокрытия из базальтового булыжника +tile.rpcov7c.basaltPaver.name=Угол антипокрытия из базальтового асфальта +tile.rpcov7c.books.name=Угол антипокрытия из книжной полки +tile.rpcov7c.brick.name=Угол антипокрытия из кирпича +tile.rpcov7c.clay.name=Угол антипокрытия из глины +tile.rpcov7c.cobble.name=Угол антипокрытия из булыжника +tile.rpcov7c.copperBlock.name=Угол антипокрытия из блока меди +tile.rpcov7c.diamond.name=Угол антипокрытия из алмазного блока +tile.rpcov7c.dirt.name=Угол антипокрытия из земли +tile.rpcov7c.emeraldBlock.name=Угол антипокрытия из изумрудного блока +tile.rpcov7c.glass.name=Угол антипокрытия из кирпича +tile.rpcov7c.gold.name=Угол антипокрытия из блока золота +tile.rpcov7c.greenSapphireBlock.name=Угол антипокрытия из блока зеленого сапфира +tile.rpcov7c.iron.name=Угол антипокрытия из блока железа +tile.rpcov7c.lapis.name=Угол антипокрытия из лазуритового блока +tile.rpcov7c.marble.name=Угол антипокрытия из мрамора +tile.rpcov7c.marbleBrick.name=Угол антипокрытия из мраморного кирпича +tile.rpcov7c.moss.name=Угол антипокрытия из булыжника со мхом +tile.rpcov7c.netherbrick.name=Угол антипокрытия из адского кирпича +tile.rpcov7c.netherrack.name=Угол антипокрытия из адского камня +tile.rpcov7c.obsidian.name=Угол антипокрытия из обсидиана +tile.rpcov7c.planks.name=Угол антипокрытия из досок +tile.rpcov7c.planks1.name=Угол антипокрытия из досок +tile.rpcov7c.planks2.name=Угол антипокрытия из досок +tile.rpcov7c.planks3.name=Угол антипокрытия из досок +tile.rpcov7c.pumpkin.name=Угол антипокрытия из тыквы +tile.rpcov7c.rplog.name=Угол антипокрытия из каучукового дерева +tile.rpcov7c.rubyBlock.name=Угол антипокрытия из рубинового блока +tile.rpcov7c.sandstone.name=Угол антипокрытия из песчаника +tile.rpcov7c.sandstone1.name=Угол антипокрытия из песчаника +tile.rpcov7c.sandstone2.name=Угол антипокрытия из песчаника +tile.rpcov7c.sapphireBlock.name=Угол антипокрытия из сапфирового блока +tile.rpcov7c.silverBlock.name=Угол антипокрытия из блока серебра +tile.rpcov7c.slab.name=Угол антипокрытия из каменных ступенек +tile.rpcov7c.snow.name=Угол антипокрытия из снега +tile.rpcov7c.soul.name=Угол антипокрытия из песка душ +tile.rpcov7c.stone.name=Угол антипокрытия из камня +tile.rpcov7c.stonebrick.name=Угол антипокрытия из каменного кирпича +tile.rpcov7c.stonebrick1.name=Угол антипокрытия из каменного кирпича +tile.rpcov7c.stonebrick2.name=Угол антипокрытия из каменного кирпича +tile.rpcov7c.stonebrick3.name=Угол антипокрытия из каменного кирпича +tile.rpcov7c.tinBlock.name=Угол антипокрытия из блока олова +tile.rpcov7c.tungstenBlock.name=Угол антипокрытия из блока вольфрама +tile.rpcov7c.wood.name=Угол антипокрытия из дерева +tile.rpcov7c.wood1.name=Угол антипокрытия из дерева +tile.rpcov7c.wood2.name=Угол антипокрытия из дерева +tile.rpcov7c.wood3.name=Угол антипокрытия из дерева +tile.rpcov7c.wool.black.name=Угол антипокрытия из черной шерсти +tile.rpcov7c.wool.blue.name=Угол антипокрытия из синей шерсти +tile.rpcov7c.wool.brown.name=Угол антипокрытия из коричневой шерсти +tile.rpcov7c.wool.cyan.name=Угол антипокрытия из бирюзовой шерсти +tile.rpcov7c.wool.gray.name=Угол антипокрытие из серой шерсти +tile.rpcov7c.wool.green.name=Угол антипокрытия из зеленой шерсти +tile.rpcov7c.wool.lightBlue.name=Угол антипокрытия из голубой шерсти +tile.rpcov7c.wool.lime.name=Угол антипокрытия из лаймовой шерсти +tile.rpcov7c.wool.magenta.name=Угол антипокрытия из пурпурной шерсти +tile.rpcov7c.wool.orange.name=Угол антипокрытия из оранжевой шерсти +tile.rpcov7c.wool.pink.name=Угол антипокрытия из розовой шерсти +tile.rpcov7c.wool.purple.name=Угол антипокрытия из фиолетовой шерсти +tile.rpcov7c.wool.red.name=Угол антипокрытия из красной шерсти +tile.rpcov7c.wool.silver.name=Угол антипокрытия из светло-серой шерсти +tile.rpcov7c.wool.white.name=Угол антипокрытия из белой шерсти +tile.rpcov7c.wool.yellow.name=Угол антипокрытия из желтой шерсти +tile.rpcov7s.basalt.name=Рейка антипокрытия из базальта +tile.rpcov7s.basaltBrick.name=Рейка антипокрытия из базальтового кирпича +tile.rpcov7s.basaltCircle.name=Рейка антипокрытия из резного базальтового блока +tile.rpcov7s.basaltCobble.name=Рейка антипокрытия из базальтового булыжника +tile.rpcov7s.basaltPaver.name=Рейка антипокрытия из базальтового асфальта +tile.rpcov7s.books.name=Рейка антипокрытия из книжной полки +tile.rpcov7s.brick.name=Рейка антипокрытия из кирпича +tile.rpcov7s.clay.name=Рейка антипокрытия из глины +tile.rpcov7s.cobble.name=Рейка антипокрытия из булыжника +tile.rpcov7s.copperBlock.name=Рейка антипокрытия из блока меди +tile.rpcov7s.diamond.name=Рейка антипокрытия из алмазного блока +tile.rpcov7s.dirt.name=Рейка антипокрытия из земли +tile.rpcov7s.emeraldBlock.name=Рейка антипокрытия из изумрудного блока +tile.rpcov7s.glass.name=Рейка антипокрытия из кирпича +tile.rpcov7s.gold.name=Рейка антипокрытия из блока золота +tile.rpcov7s.greenSapphireBlock.name=Рейка антипокрытия из блока зеленого сапфира +tile.rpcov7s.iron.name=Рейка антипокрытия из блока железа +tile.rpcov7s.lapis.name=Рейка антипокрытия из лазуритового блока +tile.rpcov7s.marble.name=Рейка антипокрытия из мрамора +tile.rpcov7s.marbleBrick.name=Рейка антипокрытия из мраморного кирпича +tile.rpcov7s.moss.name=Рейка антипокрытия из булыжника со мхом +tile.rpcov7s.netherbrick.name=Рейка антипокрытия из адского кирпича +tile.rpcov7s.netherrack.name=Рейка антипокрытия из адского камня +tile.rpcov7s.obsidian.name=Рейка антипокрытия из стекла +tile.rpcov7s.planks.name=Рейка антипокрытия из досок +tile.rpcov7s.planks1.name=Рейка антипокрытия из досок +tile.rpcov7s.planks2.name=Рейка антипокрытия из досок +tile.rpcov7s.planks3.name=Рейка антипокрытия из досок +tile.rpcov7s.pumpkin.name=Рейка антипокрытия из тыквы +tile.rpcov7s.rplog.name=Рейка антипокрытия из каучукового дерева +tile.rpcov7s.rubyBlock.name=Рейка антипокрытия из рубинового блока +tile.rpcov7s.sandstone.name=Рейка антипокрытия из песчаника +tile.rpcov7s.sandstone1.name=Рейка антипокрытия из песчаника +tile.rpcov7s.sandstone2.name=Рейка антипокрытия из песчаника +tile.rpcov7s.sapphireBlock.name=Рейка антипокрытия из сапфирового блока +tile.rpcov7s.silverBlock.name=Рейка антипокрытия из блока серебра +tile.rpcov7s.slab.name=Рейка антипокрытия из каменных ступенек +tile.rpcov7s.snow.name=Рейка антипокрытия из снега +tile.rpcov7s.soul.name=Рейка антипокрытия из песка душ +tile.rpcov7s.stone.name=Рейка антипокрытия из камня +tile.rpcov7s.stonebrick.name=Рейка антипокрытия из каменного кирпича +tile.rpcov7s.stonebrick1.name=Рейка антипокрытия из каменного кирпича +tile.rpcov7s.stonebrick2.name=Рейка антипокрытия из каменного кирпича +tile.rpcov7s.stonebrick3.name=Рейка антипокрытия из каменного кирпича +tile.rpcov7s.tinBlock.nametinBlock.name=Рейка антипокрытия из блока олова +tile.rpcov7s.tungstenBlock.nametinBlock.name=Рейка антипокрытия из блока вольфрама +tile.rpcov7s.wood.name=Рейка антипокрытия из дерева +tile.rpcov7s.wood1.name=Рейка антипокрытия из дерева +tile.rpcov7s.wood2.name=Рейка антипокрытия из дерева +tile.rpcov7s.wood3.name=Рейка антипокрытия из дерева +tile.rpcov7s.wool.black.name=Рейка антипокрытия из черной шерсти +tile.rpcov7s.wool.blue.name=Рейка антипокрытия из синей шерсти +tile.rpcov7s.wool.brown.name=Рейка антипокрытия из коричневой шерсти +tile.rpcov7s.wool.cyan.name=Рейка антипокрытия из бирюзовой шерсти +tile.rpcov7s.wool.gray.name=Рейка антипокрытия из серой шерсти +tile.rpcov7s.wool.green.name=Рейка антипокрытия из зеленой шерсти +tile.rpcov7s.wool.lightBlue.name=Рейка антипокрытия из голубой шерсти +tile.rpcov7s.wool.lime.name=Рейка антипокрытия из лаймовой шерсти +tile.rpcov7s.wool.magenta.name=Рейка антипокрытия из пурпурной шерсти +tile.rpcov7s.wool.orange.name=Рейка антипокрытия из оранжевой шерсти +tile.rpcov7s.wool.pink.name=Рейка антипокрытия из розовой шерсти +tile.rpcov7s.wool.purple.name=Рейка антипокрытия из фиолетовой шерсти +tile.rpcov7s.wool.red.name=Рейка антипокрытия из красной шерсти +tile.rpcov7s.wool.silver.name=Рейка антипокрытия из светло-серой шерсти +tile.rpcov7s.wool.white.name=Рейка антипокрытия из белой шерсти +tile.rpcov7s.wool.yellow.name=Рейка антипокрытия из желтой шерсти +tile.rpcovc.basalt.name=Угол покрытия из базальта +tile.rpcovc.basaltBrick.name=Угол покрытия из базальтового кирпича +tile.rpcovc.basaltCircle.name=Угол покрытия из резного базальтового кирпича +tile.rpcovc.basaltCobble.name=Угол покрытия из базальтового булыжника +tile.rpcovc.basaltPaver.name=Угол покрытия из базальтового асфальта +tile.rpcovc.books.name=Угол покрытия из книжной полки +tile.rpcovc.brick.name=Угол покрытия из кирпича +tile.rpcovc.clay.name=Угол покрытия из глины +tile.rpcovc.cobble.name=Угол покрытия из булыжника +tile.rpcovc.copperBlock.name=Угол покрытия из блока меди +tile.rpcovc.diamond.name=Угол покрытия из алмазного блока +tile.rpcovc.dirt.name=Угол покрытия из земли +tile.rpcovc.emeraldBlock.name=Угол покрыти я из изумрудного блока +tile.rpcovc.glass.name=Угол покрытия из стекла +tile.rpcovc.gold.name=Угол покрытия из блока золота +tile.rpcovc.greenSapphireBlock.name=Угол покрытия из блока зеленого сапфира +tile.rpcovc.iron.name=Угол покрытия из блока железа +tile.rpcovc.lapis.name=Угол покрытия из лазуритового блока +tile.rpcovc.marble.name=Угол покрытия из мрамора +tile.rpcovc.marbleBrick.name=Угол покрытия из мраморного кирпича +tile.rpcovc.moss.name=Угол покрытия из булыжника со мхом +tile.rpcovc.netherbrick.name=Угол покрытия из адского кирпича +tile.rpcovc.netherrack.name=Угол покрытия из адского камня +tile.rpcovc.obsidian.name=Угол покрытия из обсидиана +tile.rpcovc.planks.name=Угол покрытия из досок +tile.rpcovc.planks1.name=Угол покрытия из досок +tile.rpcovc.planks2.name=Угол покрытия из досок +tile.rpcovc.planks3.name=Угол покрытия из досок +tile.rpcovc.pumpkin.name=Угол покрытия из тыквы +tile.rpcovc.rplog.name=Угол покрытия из каучукового дерева +tile.rpcovc.rubyBlock.name=Угол покрытия из рубинового блока +tile.rpcovc.sandstone.name=Угол покрытия из песчаника +tile.rpcovc.sandstone1.name=Угол покрытия из песчаника +tile.rpcovc.sandstone2.name=Угол покрытия из песчаника +tile.rpcovc.sapphireBlock.name=Угол покрытия из сапфирового блока +tile.rpcovc.silverBlock.name=Угол покрытия из блока серебра +tile.rpcovc.slab.name=Угол покрытия из каменных ступенек +tile.rpcovc.snow.name=Угол покрытия из снега +tile.rpcovc.soul.name=Угол покрытия из песка душ +tile.rpcovc.stone.name=Угол покрытия из камня +tile.rpcovc.stonebrick.name=Угол покрытия из каменного кирпича +tile.rpcovc.stonebrick1.name=Угол покрытия из каменного кирпича +tile.rpcovc.stonebrick2.name=Угол покрытия из каменного кирпича +tile.rpcovc.stonebrick3.name=Угол покрытия из каменного кирпича +tile.rpcovc.tinBlock.name=Угол покрытия из блока олова +tile.rpcovc.tungstenBlock.name=Угол покрытия из блока вольфрама +tile.rpcovc.wood.name=Угол покрытия из дерева +tile.rpcovc.wood1.name=Угол покрытия из дерева +tile.rpcovc.wood2.name=Угол покрытия из дерева +tile.rpcovc.wood3.name=Угол покрытия из дерева +tile.rpcovc.wool.black.name=Угол покрытия из черной шерсти +tile.rpcovc.wool.blue.name=Угол покрытия из синей шерсти +tile.rpcovc.wool.brown.name=Угол покрытия из коричневой шерсти +tile.rpcovc.wool.cyan.name=Угол покрытия из бирюзовой шерсти +tile.rpcovc.wool.gray.name=Угол покрытия из серой шерсти +tile.rpcovc.wool.green.name=Угол покрытия из зеленой шерсти +tile.rpcovc.wool.lightBlue.name=Угол покрытия из голубой шерсти +tile.rpcovc.wool.lime.name=Угол покрытия из лаймовой шерсти +tile.rpcovc.wool.magenta.name=Угол покрытия из пурпурной шерсти +tile.rpcovc.wool.orange.name=Угол покрытия из оранжевой шерсти +tile.rpcovc.wool.pink.name=Угол покрытия из розовой шерсти +tile.rpcovc.wool.purple.name=Угол покрытия из фиолетовой шерсти +tile.rpcovc.wool.red.name=Угол покрытия из красной шерсти +tile.rpcovc.wool.silver.name=Угол покрытия из светло-серой шерсти +tile.rpcovc.wool.white.name=Угол покрытия из белой шерсти +tile.rpcovc.wool.yellow.name=Угол покрытия из желтой шерсти +tile.rpcover.basalt.name=Покрытие из базальта +tile.rpcover.basaltBrick.name=Покрытие из базальтового кирпича +tile.rpcover.basaltCircle.name=Покрытие из резного базальтового кирпича +tile.rpcover.basaltCobble.name=Покрытие из базальтового булыжника +tile.rpcover.basaltPaver.name=Покрытие из базальтового асфальта +tile.rpcover.books.name=Покрытие из книжной полки +tile.rpcover.brick.name=Покрытие из кирпича +tile.rpcover.clay.name=Покрытие из глины +tile.rpcover.cobble.name=Покрытие из булыжника +tile.rpcover.copperBlock.name=Покрытие из блока меди +tile.rpcover.diamond.name=Покрытие из алмазного блока +tile.rpcover.dirt.name=Покрытие из земли +tile.rpcover.emeraldBlock.name=Покрытие из изумрудного блока +tile.rpcover.glass.name=Покрытие из стекла +tile.rpcover.gold.name=Покрытие из блока золота +tile.rpcover.greenSapphireBlock.name=Покрытие из блока серебра +tile.rpcover.iron.name=Покрытие из блока железа +tile.rpcover.lapis.name=Покрытие из лазуритового блока +tile.rpcover.marble.name=Покрытие из мрамора +tile.rpcover.marbleBrick.name=Покрытие из мраморного кирпича +tile.rpcover.moss.name=Покрытие из булыжника со мхом +tile.rpcover.netherbrick.name=Покрытие из адского кирпича +tile.rpcover.netherrack.name=Покрытие из адского камня +tile.rpcover.obsidian.name=Покрытие из обсидиана +tile.rpcover.planks.name=Покрытие из досок +tile.rpcover.planks1.name=Покрытие из досок +tile.rpcover.planks2.name=Покрытие из досок +tile.rpcover.planks3.name=Покрытие из досок +tile.rpcover.pumpkin.name=Покрытие из тыквы +tile.rpcover.rplog.name=Покрытие из каучукового дерева +tile.rpcover.rubyBlock.name=Покрытие из рубинового блока +tile.rpcover.sandstone.name=Покрытие из песчаника +tile.rpcover.sandstone1.name=Покрытие из песчаника +tile.rpcover.sandstone2.name=Покрытие из песчаника +tile.rpcover.sapphireBlock.name=Покрытие из сапфирового блока +tile.rpcover.silverBlock.name=Покрытие из блока серебра +tile.rpcover.slab.name=Покрытие из каменных ступенек +tile.rpcover.snow.name=Покрытие из снега +tile.rpcover.soul.name=Покрытие из песка душ +tile.rpcover.stone.name=Покрытие из камня +tile.rpcover.stonebrick.name=Покрытие из каменного кирпича +tile.rpcover.stonebrick1.name=Покрытие из каменного кирпича +tile.rpcover.stonebrick2.name=Покрытие из каменного кирпича +tile.rpcover.stonebrick3.name=Покрытие из каменного кирпича +tile.rpcover.tinBlock.name=Покрытие из блока олова +tile.rpcover.tungstenBlock.name=Покрытие из блока вольфрама +tile.rpcover.wood.name=Покрытие из дерева +tile.rpcover.wood1.name=Покрытие из дерева +tile.rpcover.wood2.name=Покрытие из дерева +tile.rpcover.wood3.name=Покрытие из дерева +tile.rpcover.wool.black.name=Покрытие из черной шерсти +tile.rpcover.wool.blue.name=Покрытие из синей шерсти +tile.rpcover.wool.brown.name=Покрытие из коричневой шерсти +tile.rpcover.wool.cyan.name=Покрытие из бирюзовой шерсти +tile.rpcover.wool.gray.name=Покрытие из серой шерсти +tile.rpcover.wool.green.name=Покрытие из зеленой шерсти +tile.rpcover.wool.lightBlue.name=Покрытие из голубой шерсти +tile.rpcover.wool.lime.name=Покрытие из лаймовой шерсти +tile.rpcover.wool.magenta.name=Покрытие из пурпурной шерсти +tile.rpcover.wool.orange.name=Покрытие из оранжевой шерсти +tile.rpcover.wool.pink.name=Покрытие из розовой шерсти +tile.rpcover.wool.purple.name=Покрытие из фиолетовой шерсти +tile.rpcover.wool.red.name=Покрытие из красной шерсти +tile.rpcover.wool.silver.name=Покрытие из светло-серой шерсти +tile.rpcover.wool.white.name=Покрытие из белой шерсти +tile.rpcover.wool.yellow.name=Покрытие из желтой шерсти +tile.rpcovs.basalt.name=Рейка покрытия из базальта +tile.rpcovs.basaltBrick.name=Рейка покрытия из базальтового кирпича +tile.rpcovs.basaltCircle.name=Рейка покрытия из резного базальтового кирпича +tile.rpcovs.basaltCobble.name=Рейка покрытия из базальтового булыжника +tile.rpcovs.basaltPaver.name=Рейка покрытия из базальтового асфальта +tile.rpcovs.books.name=Рейка покрытия из книжной полки +tile.rpcovs.brick.name=Рейка покрытия из кирпича +tile.rpcovs.clay.name=Рейка покрытия из глины +tile.rpcovs.cobble.name=Рейка покрытия из булыжника +tile.rpcovs.copperBlock.name=Рейка покрытия из блока меди +tile.rpcovs.diamond.name=Рейка покрытия из алмазного блока +tile.rpcovs.dirt.name=Рейка покрытия из земли +tile.rpcovs.emeraldBlock.name=Рейка покрытия из изумрудного блока +tile.rpcovs.glass.name=Рейка покрытия из стекла +tile.rpcovs.gold.name=Рейка покрытия из блока золота +tile.rpcovs.greenSapphireBlock.name=Рейка покрытия из блока зеленого сапфира +tile.rpcovs.iron.name=Рейка покрытия из блока железа +tile.rpcovs.lapis.name=Рейка покрытия из лазуритового блока +tile.rpcovs.marble.name=Рейка покрытия из мрамора +tile.rpcovs.marbleBrick.name=Рейка покрытия из мраморного кирпича +tile.rpcovs.moss.name=Рейка покрытия из булыжника со мхом +tile.rpcovs.netherbrick.name=Рейка покрытия из адского кирпича +tile.rpcovs.netherrack.name=Рейка покрытия из адского камня +tile.rpcovs.obsidian.name=Рейка покрытия из обсидиана +tile.rpcovs.planks.name=Рейка покрытия из досок +tile.rpcovs.planks1.name=Рейка покрытия из досок +tile.rpcovs.planks2.name=Рейка покрытия из досок +tile.rpcovs.planks3.name=Рейка покрытия из досок +tile.rpcovs.pumpkin.name=Рейка покрытия из тыквы +tile.rpcovs.rplog.name=Рейка покрытия из каучукового дерева +tile.rpcovs.rubyBlock.name=Рейка покрытия из рубинового блока +tile.rpcovs.sandstone.name=Рейка покрытия из песчаника +tile.rpcovs.sandstone1.name=Рейка покрытия из песчаника +tile.rpcovs.sandstone2.name=Рейка покрытия из песчаника +tile.rpcovs.sapphireBlock.name=Рейка покрытия из сапфирового блока +tile.rpcovs.silverBlock.name=Рейка покрытия из блока серебра +tile.rpcovs.slab.name=Рейка покрытия из каменных ступенек +tile.rpcovs.snow.name=Рейка покрытия из снега +tile.rpcovs.soul.name=Рейка покрытия из песка душ +tile.rpcovs.stone.name=Рейка покрытия из камня +tile.rpcovs.stonebrick.name=Рейка покрытия из каменного кирпича +tile.rpcovs.stonebrick1.name=Рейка покрытия из каменного кирпича +tile.rpcovs.stonebrick2.name=Рейка покрытия из каменного кирпича +tile.rpcovs.stonebrick3.name=Рейка покрытия из каменного кирпича +tile.rpcovs.tinBlock.name=Рейка покрытия из блока олова +tile.rpcovs.tungstenBlock.name=Рейка покрытия из блока вольфрама +tile.rpcovs.wood.name=Рейка покрытия из дерева +tile.rpcovs.wood1.name=Рейка покрытия из дерева +tile.rpcovs.wood2.name=Рейка покрытия из дерева +tile.rpcovs.wood3.name=Рейка покрытия из дерева +tile.rpcovs.wool.black.name=Рейка покрытия из черной шерсти +tile.rpcovs.wool.blue.name=Рейка покрытия из синей шерсти +tile.rpcovs.wool.brown.name=Рейка покрытия из коричневой шерсти +tile.rpcovs.wool.cyan.name=Рейка покрытия из бирюзовой шерсти +tile.rpcovs.wool.gray.name=Рейка покрытия из серой шерсти +tile.rpcovs.wool.green.name=Рейка покрытия из зеленой шерсти +tile.rpcovs.wool.lightBlue.name=Рейка покрытия из голубой шерсти +tile.rpcovs.wool.lime.name=Рейка покрытия из лаймовой шерсти +tile.rpcovs.wool.magenta.name=Рейка покрытия из пурпурной шерсти +tile.rpcovs.wool.orange.name=Рейка покрытия из оранжевой шерсти +tile.rpcovs.wool.pink.name=Рейка покрытия из розовой шерсти +tile.rpcovs.wool.purple.name=Рейка покрытия из фиолетовой шерсти +tile.rpcovs.wool.red.name=Рейка покрытия из красной шерсти +tile.rpcovs.wool.silver.name=Рейка покрытия из светло-серой шерсти +tile.rpcovs.wool.white.name=Рейка покрытия из белой шерсти +tile.rpcovs.wool.yellow.name=Рейка покрытия из желтой шерсти +tile.rphcov3.basalt.name=Полое тройное покрытие из базальта +tile.rphcov3.basaltBrick.name=Полое тройное покрытие из базальтового кирпича +tile.rphcov3.basaltCircle.name=Полое тройное покрытие из резного базальтового кирпича +tile.rphcov3.basaltCobble.name=Полое тройное покрытие из базальтового булыжника +tile.rphcov3.basaltPaver.name=Полое тройное покрытие из базальтового асфальта +tile.rphcov3.books.name=Полое тройное покрытие из книжной полки +tile.rphcov3.brick.name=Полое тройное покрытие из кирпича +tile.rphcov3.clay.name=Полое тройное покрытие из глины +tile.rphcov3.cobble.name=Полое тройное покрытие из булыжника +tile.rphcov3.copperBlock.name=Полое тройное покртыие из блока меди +tile.rphcov3.diamond.name=Полое тройное покрытие из алмазного блока +tile.rphcov3.dirt.name=Полое тройное покрытие из земли +tile.rphcov3.emeraldBlock.name=Полое тройное покрытие из изумрудного блока +tile.rphcov3.glass.name=Полое тройное покрытие из стекла +tile.rphcov3.gold.name=Полое тройное покрытие из блока золота +tile.rphcov3.greenSapphireBlock.name=Полое тройное покрытие из блока зеленого сапфира +tile.rphcov3.iron.name=Полое тройное покрытие из блока железа +tile.rphcov3.lapis.name=Полое тройное покрытие из лазуритового блока +tile.rphcov3.marble.name=Полое тройное покрытие из мрамора +tile.rphcov3.marbleBrick.name=Полое тройное покрытие из мраморонго кирпича +tile.rphcov3.moss.name=Полое тройное покрытие из булыжника со мхом +tile.rphcov3.netherbrick.name=Полое тройное покрытие из адского кирпича +tile.rphcov3.netherrack.name=Полое тройное покрытие из адского камня +tile.rphcov3.obsidian.name=Полое тройное покрытие из обсидиана +tile.rphcov3.planks.name=Полое тройное покрытие из досок +tile.rphcov3.planks1.name=Полое тройное покрытие из досок +tile.rphcov3.planks2.name=Полое тройное покрытие из досок +tile.rphcov3.planks3.name=Полое тройное покрытие из досок +tile.rphcov3.pumpkin.name=Полое тройное покрытие из тыквы +tile.rphcov3.rplog.name=Полое тройное покрытие из каучукового дерева +tile.rphcov3.rubyBlock.name=Полое тройное покрытие из рубинового блока +tile.rphcov3.sandstone.name=Полое тройное покрытие из песчаника +tile.rphcov3.sandstone1.name=Полое тройное покрытие из песчаника +tile.rphcov3.sandstone2.name=Полое тройное покрытие из песчаника +tile.rphcov3.sapphireBlock.name=Полое тройное покрытие из сапфирового блока +tile.rphcov3.silverBlock.name=Полое тройное покрытие из блока серебра +tile.rphcov3.slab.name=Полое тройное покрытие из каменных ступенек +tile.rphcov3.snow.name=Полое тройное покрытие из снега +tile.rphcov3.soul.name=Полое тройное покрытие из песка душ +tile.rphcov3.stone.name=Полое тройное покрытие из камня +tile.rphcov3.stonebrick.name=Полое тройное покрытие из каменного кирпича +tile.rphcov3.stonebrick1.name=Полое тройное покрытие из каменного кирпича +tile.rphcov3.stonebrick2.name=Полое тройное покрытие из каменного кирпича +tile.rphcov3.stonebrick3.name=Полое тройной покрытие из каменного кирпича +tile.rphcov3.tinBlock.name=Полое тройное покрытие из блока олова +tile.rphcov3.tungstenBlock.name=Полое тройное покрытие из блока вольфрама +tile.rphcov3.wood.name=Полое тройное покрытие из дерева +tile.rphcov3.wood1.name=Полое тройное покрытие из дерева +tile.rphcov3.wood2.name=Полое тройное покрытие из дерева +tile.rphcov3.wood3.name=Полое тройное покрытие из дерева +tile.rphcov3.wool.black.name=Полое тройное покрытие из черной шерсти +tile.rphcov3.wool.blue.name=Полое тройное покрытие из синей шерсти +tile.rphcov3.wool.brown.name=Полое тройное покрытие из коричневой шерсти +tile.rphcov3.wool.cyan.name=Полое тройное покрытие из бирюзовой шерсти +tile.rphcov3.wool.gray.name=Полое тройное покрытие из серой шерсти +tile.rphcov3.wool.green.name=Полое тройное покрытие из зеленой шерсти +tile.rphcov3.wool.lightBlue.name=Полое тройное покрытие из голубой шерсти +tile.rphcov3.wool.lime.name=Полое тройное покрытие из лаймовой шерсти +tile.rphcov3.wool.magenta.name=Полое тройное покрытие из пурпурной шерсти +tile.rphcov3.wool.orange.name=Полое тройное покрытие из оранжевой шерсти +tile.rphcov3.wool.pink.name=Полое тройное покрытие из розовой шерсти +tile.rphcov3.wool.purple.name=Полое тройное покрытие из фиолетовой шерсти +tile.rphcov3.wool.red.name=Полое тройное покрытие из красной шерсти +tile.rphcov3.wool.silver.name=Полое тройное покрытие из светло-серой шерсти +tile.rphcov3.wool.white.name=Полое тройное покрытие из белой шерсти +tile.rphcov3.wool.yellow.name=Полое тройное покрытие из желтой шерсти +tile.rphcov5.basalt.name=Полое плиточное покрытие из базальта +tile.rphcov5.basaltBrick.name=Полое плиточное покрытие из базальтового кирпича +tile.rphcov5.basaltCircle.name=Полое плиточное покрытие из резного базальтового кирпича +tile.rphcov5.basaltCobble.name=Полое плиточное покрытие из базальтового булыжника +tile.rphcov5.basaltPaver.name=Полое плиточное покрытие из базальтового асфальта +tile.rphcov5.books.name=Полое плиточное покрытие из книжной полки +tile.rphcov5.brick.name=Полое плиточное покрытие из кирпича +tile.rphcov5.clay.name=Полое плиточное покрытие из глины +tile.rphcov5.cobble.name=Полое плиточное покрытие из булыжника +tile.rphcov5.copperBlock.name=Полое плиточное покрытие из блока меди +tile.rphcov5.diamond.name=Полое плиточное покрытие из алмазного блока +tile.rphcov5.dirt.name=Полое плиточное покрытие из земли +tile.rphcov5.emeraldBlock.name=Полое плиточное покрытие из изумрудного блока +tile.rphcov5.glass.name=Полое плиточное покрытие из стекла +tile.rphcov5.gold.name=Полое плиточное покрытие из блока золота +tile.rphcov5.greenSapphireBlock.name=Полое плиточное покрытие из блока зеленого сапфира +tile.rphcov5.iron.name=Полое плиточноре покрытие из блока железа +tile.rphcov5.lapis.name=Полое плиточное покрытие из лазуритового блока +tile.rphcov5.marble.name=Полое плиточное покрытие из мрамора +tile.rphcov5.marbleBrick.name=Полое плиточное покрытие из мраморного кирпича +tile.rphcov5.moss.name=Полое плиточное покрытие из булыжника со мхом +tile.rphcov5.netherbrick.name=Полое плиточное покрытие из адского кирпича +tile.rphcov5.netherrack.name=Полое плиточное покрытие из адского камня +tile.rphcov5.obsidian.name=Полое плиточное покрытие из обсидиана +tile.rphcov5.planks.name=Полое плиточное покрытие из досок +tile.rphcov5.planks1.name=Полое плиточное покрытие из досок +tile.rphcov5.planks2.name=Полое плиточное покрытие из досок +tile.rphcov5.planks3.name=Полое плиточное покрытие из досок +tile.rphcov5.pumpkin.name=Полое плиточное покрытие из тыквы +tile.rphcov5.rplog.name=Полое плиточное покрытие из каучукового дерева +tile.rphcov5.rubyBlock.name=Полое плиточное покрытие из рубинового блока +tile.rphcov5.sandstone.name=Полое плиточное покрытие из песчаника +tile.rphcov5.sandstone1.name=Полое плиточное покрытие из песчаника +tile.rphcov5.sandstone2.name=Полое плиточное покрытие из песчаника +tile.rphcov5.sapphireBlock.name=Полое плиточное покрытие из сапфирового блока +tile.rphcov5.silverBlock.name=Полое плиточное покрытие из блока серебра +tile.rphcov5.slab.name=Полое плиточное покрытие из каменных ступенек +tile.rphcov5.snow.name=Полое плиточное покрытие из снега +tile.rphcov5.soul.name=Полое плиточное покрытие из песка душ +tile.rphcov5.stone.name=Полое плиточное покрытие из камня +tile.rphcov5.stonebrick.name=Полое плиточное покрытие из каменного кирпича +tile.rphcov5.stonebrick1.name=Полое плиточное покрытие из каменного кирпича +tile.rphcov5.stonebrick2.name=Полое плиточное покрытие из каменного кирпича +tile.rphcov5.stonebrick3.name=Полое плиточное покрытие из каменного кирпича +tile.rphcov5.tinBlock.name=Полое плиточное покрытие из блока олова +tile.rphcov5.tungstenBlock.name=Полое плиточное покрытие из блока вольфрама +tile.rphcov5.wood.name=Полое плиточное покрытие из дерева +tile.rphcov5.wood1.name=Полое плиточное покрытие из дерева +tile.rphcov5.wood2.name=Полая плиточное покрытие из дерева +tile.rphcov5.wood3.name=Полое плиточное покрытие из дерева +tile.rphcov5.wool.black.name=Полое плиточное покрытие из белой шерсти +tile.rphcov5.wool.blue.name=Полое плиточное покрытие из синей шерсти +tile.rphcov5.wool.brown.name=Полое плиточное покрытие из коричневой шерсти +tile.rphcov5.wool.cyan.name=Полое плиточное покрытие из бирюзовой шерсти +tile.rphcov5.wool.gray.name=Полое плиточное покрытие из серой шерсти +tile.rphcov5.wool.green.name=Полое плиточное покрытие из зеленой шерсти +tile.rphcov5.wool.lightBlue.name=Полое плиточное покрытие из голубой шерсти +tile.rphcov5.wool.lime.name=Полое плиточное покрытие из лаймовой шерсти +tile.rphcov5.wool.magenta.name=Полое плиточное покрытие из пурпурной шерсти +tile.rphcov5.wool.orange.name=Полое плиточное покрытие из оранжевой шерсти +tile.rphcov5.wool.pink.name=Полое плиточное покрытие из розовой шерсти +tile.rphcov5.wool.purple.name=Полое плиточное покрытие из фиолетовой шерсти +tile.rphcov5.wool.red.name=Полое плиточное покрытие из красной шерсти +tile.rphcov5.wool.silver.name=Полое плиточное покрытие из светло-серой шерсти +tile.rphcov5.wool.white.name=Полое плиточное покрытие из белой шерсти +tile.rphcov5.wool.yellow.name=Полое плиточное покрытие из желтой шерсти +tile.rphcov6.basalt.name=Полая тройная панель из базальта +tile.rphcov6.basaltBrick.name=Полая тройная панель из базальтового кирпича +tile.rphcov6.basaltCircle.name=Полая тройная панель из резного базальтового кирпича +tile.rphcov6.basaltCobble.name=Полая тройная панель из базальтового булыжника +tile.rphcov6.basaltPaver.name=Полая тройная панель из базальтового +tile.rphcov6.books.name=Полая тройная панель из книжной полки +tile.rphcov6.brick.name=Полая тройная панель из кирпича +tile.rphcov6.clay.name=Полая тройная панель из глины +tile.rphcov6.cobble.name=Полая тройная панель из булыжника +tile.rphcov6.copperBlock.name=Полая тройная панель из блока меди +tile.rphcov6.diamond.name=Полая тройная панель из алмазного блока +tile.rphcov6.dirt.name=Полая тройная панель из земли +tile.rphcov6.emeraldBlock.name=Полая тройная панель из изумрудного блока +tile.rphcov6.glass.name=Полая тройная панель из стекла +tile.rphcov6.gold.name=Полая тройная панель из блока золота +tile.rphcov6.greenSapphireBlock.name=Полая тройная панель из блока зеленого сапфира +tile.rphcov6.iron.name=Полая тройная панель из блока железа +tile.rphcov6.lapis.name=Полая тройная панель из лазуритового блока +tile.rphcov6.marble.name=Полая тройная панель из мрамора +tile.rphcov6.marbleBrick.name=Полая тройная панель из мраморного кирпича +tile.rphcov6.moss.name=Полая тройная панель из булыжника со мхом +tile.rphcov6.netherbrick.name=Полая тройная панель из адского кирпича +tile.rphcov6.netherrack.name=Полая тройная панель из адского камня +tile.rphcov6.obsidian.name=Полая тройная панель из обсидиана +tile.rphcov6.planks.name=Полая тройная панель из досок +tile.rphcov6.planks1.name=Полая тройная панель из досок +tile.rphcov6.planks2.name=Полая тройная панель из досок +tile.rphcov6.planks3.name=Полая тройная панель из досок +tile.rphcov6.pumpkin.name=Полая тройная панель из тыквы +tile.rphcov6.rplog.name=Полая тройная панель из каучукового дерева +tile.rphcov6.rubyBlock.name=Полая тройная панель из рубинового блока +tile.rphcov6.sandstone.name=Полая тройная панель из песчаника +tile.rphcov6.sandstone1.name=Полая тройная панель из песчаника +tile.rphcov6.sandstone2.name=Полая тройная панель из песчаника +tile.rphcov6.sapphireBlock.name=Полая тройная панель из сапфирового блока +tile.rphcov6.silverBlock.name=Полая тройная панель из блока серебра +tile.rphcov6.slab.name=Полая тройная панель из каменных ступенек +tile.rphcov6.snow.name=Полая тройная панель из снега +tile.rphcov6.soul.name=Полая тройная панель из песка душ +tile.rphcov6.stone.name=Полая тройная панель из камня +tile.rphcov6.stonebrick.name=Полая тройная панель из каменного кирпича +tile.rphcov6.stonebrick1.name=Полая тройная панель из каменного кирпича +tile.rphcov6.stonebrick2.name=Полая тройная панель из каменного кирпича +tile.rphcov6.stonebrick3.name=Полая тройная панель из каменного кирпича +tile.rphcov6.tinBlock.name=Полая тройная панель из блока олова +tile.rphcov6.tungstenBlock.name=Полая тройная панель из блока вольфрама +tile.rphcov6.wood.name=Полая тройная панель из дерева +tile.rphcov6.wood1.name=Полая тройная панель из дерева +tile.rphcov6.wood2.name=Полая тройная панель из дерева +tile.rphcov6.wood3.name=Полая тройная панель из дерева +tile.rphcov6.wool.black.name=Полая тройная панель из черной шерсти +tile.rphcov6.wool.blue.name=Полая тройная панель из синей шерсти +tile.rphcov6.wool.brown.name=Полая тройная панель из коричневой шерсти +tile.rphcov6.wool.cyan.name=Полая тройная панель из бирюзовой шерсти +tile.rphcov6.wool.gray.name=Полая тройная панель из серой шерсти +tile.rphcov6.wool.green.name=Полая тройная панель из зеленой шерсти +tile.rphcov6.wool.lightBlue.name=Полая тройная панель из голубой шерсти +tile.rphcov6.wool.lime.name=Полая тройная панель из лаймовой шерсти +tile.rphcov6.wool.magenta.name=Полая тройная панель из пурпурной шерсти +tile.rphcov6.wool.orange.name=Полая тройная панель из оранжевой шерсти +tile.rphcov6.wool.pink.name=Полая тройная панель из розовой шерсти +tile.rphcov6.wool.purple.name=Полая тройная панель из фиолетовой шерсти +tile.rphcov6.wool.red.name=Полая тройная панель из красной шерсти +tile.rphcov6.wool.silver.name=Полая тройная панель из светло-серой шерсти +tile.rphcov6.wool.white.name=Полая тройная панель из белой шерсти +tile.rphcov6.wool.yellow.name=Полая тройная панель из желтой шерсти +tile.rphcov7.basalt.name=Полое антипокрытие из базальта +tile.rphcov7.basaltBrick.name=Полое антипокрытие из базальтового кирпича +tile.rphcov7.basaltCircle.name=Полое антипокрытие из резного базальтового кирпича +tile.rphcov7.basaltCobble.name=Полое антипокрытие из базальтового булыжника +tile.rphcov7.basaltPaver.name=Полое антипокрытие из базальтового асфальта +tile.rphcov7.books.name=Полое антипокрытие из книжной полки +tile.rphcov7.brick.name=Полое антипокрытие из кирпича +tile.rphcov7.clay.name=Полое антипокрытие из глины +tile.rphcov7.cobble.name=Полое антипокрытие из булыжника +tile.rphcov7.copperBlock.name=Полое антипокрытие из блока меди +tile.rphcov7.diamond.name=Полое антипокрытие из алмазного блока +tile.rphcov7.dirt.name=Полое антипокрытие из земли +tile.rphcov7.emeraldBlock.name=Полое антипокрытие из изумрудного блока +tile.rphcov7.glass.name=Полое антипокрытие из стекла +tile.rphcov7.gold.name=Полое антипокрытие из блока золота +tile.rphcov7.greenSapphireBlock.name=Полое антипокрытие из блока зеленого сапфира +tile.rphcov7.iron.name=Полое антипокрытие из блока железа +tile.rphcov7.lapis.name=Полое антипокрытие из лазуритового блока +tile.rphcov7.marble.name=Полое антипокрытие из мрамора +tile.rphcov7.marbleBrick.name=Полое антипокрытие из мраморного кирпича +tile.rphcov7.moss.name=Полое антипокрытие из булыжника со мхом +tile.rphcov7.netherbrick.name=Полое антипокрытие из адского кирпича +tile.rphcov7.netherrack.name=Полое антипокрытие из адского камня +tile.rphcov7.obsidian.name=Полое антипокрытие из обсидиана +tile.rphcov7.planks.name=Полое антипокрытие из досок +tile.rphcov7.planks1.name=Полое антипокрытие из досок +tile.rphcov7.planks2.name=Полое антипокрытие из досок +tile.rphcov7.planks3.name=Полое антипокрытие из досок +tile.rphcov7.pumpkin.name=Полое антипокрытие из тыквы +tile.rphcov7.rplog.name=Полое антипокрытие из каучукового дерева +tile.rphcov7.rubyBlock.name=Полое антипокрытие из рубинового блока +tile.rphcov7.sandstone.name=Полое антипокрытие из песчаника +tile.rphcov7.sandstone1.name=Полое антипокрытие из песчаника +tile.rphcov7.sandstone2.name=Полое антипокрытие из песчаника +tile.rphcov7.sapphireBlock.name=Полое антипокрытие из сапфирового блока +tile.rphcov7.silverBlock.name=Полое антипокрытие из блока серебра +tile.rphcov7.slab.name=Полое антипокрытие из каменных ступенек +tile.rphcov7.snow.name=Полое антипокрытие из снега +tile.rphcov7.soul.name=Полое антипокрытие из песка душ +tile.rphcov7.stone.name=Полое антипокрытие из камня +tile.rphcov7.stonebrick.name=Полое антипокрытие из каменного кирпича +tile.rphcov7.stonebrick1.name=Полое антипокрытие из каменного кирпича +tile.rphcov7.stonebrick2.name=Полое антипокрытие из каменного кирпича +tile.rphcov7.stonebrick3.name=Полое антипокрытие из каменного кирпича +tile.rphcov7.tinBlock.name=Полое антипокрытие из блока олова +tile.rphcov7.tungstenBlock.name=Полое антипокрытие из блока вольфрама +tile.rphcov7.wood.name=Полое антипокрытие из дерева +tile.rphcov7.wood1.name=Полое антипокрытие из дерева +tile.rphcov7.wood2.name=Полое антипокрытие из дерева +tile.rphcov7.wood3.name=Полое антипокрытие из дерева +tile.rphcov7.wool.black.name=Полое антипокрытие из черной шерсти +tile.rphcov7.wool.blue.name=Полое антипокрытие из синей шерсти +tile.rphcov7.wool.brown.name=Полое антипокрытие из коричневой шерсти +tile.rphcov7.wool.cyan.name=Полое антипокрытие из бирюзовой шерсти +tile.rphcov7.wool.gray.name=Полое антипокрытие из серой шерсти +tile.rphcov7.wool.green.name=Полое антипокрытие из зеленой шерсти +tile.rphcov7.wool.lightBlue.name=Полое антипокрытие из голубой шерсти +tile.rphcov7.wool.lime.name=Полое антипокрытие из лаймовой шерсти +tile.rphcov7.wool.magenta.name=Полое антипокрытие из пурпурной шерсти +tile.rphcov7.wool.orange.name=Полое антипокрытие из оранжевой шерсти +tile.rphcov7.wool.pink.name=Полое антипокрытие из розовой шерсти +tile.rphcov7.wool.purple.name=Полое антипокрытие из фиолетовой шерсти +tile.rphcov7.wool.red.name=Полое антипокрытие из красной шерсти +tile.rphcov7.wool.silver.name=Полое антипокрытие из светло-серой шерсти +tile.rphcov7.wool.white.name=Полое антипокрытие из белой шерсти +tile.rphcov7.wool.yellow.name=Полое антипокрытие из желтой шерсти +tile.rphcover.basalt.name=Полое покрытие из базальта +tile.rphcover.basaltBrick.name=Полое покрытие из базальтового кирпича +tile.rphcover.basaltCircle.name=Полое покрытие из резного базальтового кирпича +tile.rphcover.basaltCobble.name=Полое покрытие из базальтового булыжника +tile.rphcover.basaltPaver.name=Полое покрытие из базальтового асфальта +tile.rphcover.books.name=Полое покрытие из книжной полки +tile.rphcover.brick.name=Полое покрытие из кирпича +tile.rphcover.clay.name=Полое покрытие из глины +tile.rphcover.cobble.name=Полое покрытие из булыжника +tile.rphcover.copperBlock.name=Полое покрытие из блока меди +tile.rphcover.diamond.name=Полое покрытие из алмазного блока +tile.rphcover.dirt.name=Полое покрытие из земли +tile.rphcover.emeraldBlock.name=Полое покрытие из изумрудного блока +tile.rphcover.glass.name=Полое покрытие из стекла +tile.rphcover.gold.name=Полое покрытие из блока золота +tile.rphcover.greenSapphireBlock.name=Полое покрытие из блока зеленого сапфира +tile.rphcover.iron.name=Полое покрытие из блока железа +tile.rphcover.lapis.name=Полое покрытие из лазуритового блока +tile.rphcover.marble.name=Полое покрытие из мрамора +tile.rphcover.marbleBrick.name=Полое покрытие из мраморного кирпича +tile.rphcover.moss.name=Полое покрытие из булыжника со мхом +tile.rphcover.netherbrick.name=Полое покрытие из адского кирпича +tile.rphcover.netherrack.name=Полое покрытие из адского камня +tile.rphcover.obsidian.name=Полое покрытие из обсидиана +tile.rphcover.planks.name=Полое покрытие из досок +tile.rphcover.planks1.name=Полое покрытие из досок +tile.rphcover.planks2.name=Полое покрытие из досок +tile.rphcover.planks3.name=Полое покрытие из досок +tile.rphcover.pumpkin.name=Полое покрытие из тыквы +tile.rphcover.rplog.name=Полое покрытие из каучукового дерева +tile.rphcover.rubyBlock.name=Полое покрытие из рубинового блока +tile.rphcover.sandstone.name=Полое покрытие из песчаника +tile.rphcover.sandstone1.name=Полое покрытие из песчаника +tile.rphcover.sandstone2.name=Полое покрытие из песчаника +tile.rphcover.sapphireBlock.name=Полое покрытие из сапфирового блока +tile.rphcover.silverBlock.name=Полое покрытие из блока серебра +tile.rphcover.slab.name=Полое покрытие из каменных ступенек +tile.rphcover.snow.name=Полое покрытие из снега +tile.rphcover.soul.name=Полое покрытие из песка душ +tile.rphcover.stone.name=Полое покрытие из камня +tile.rphcover.stonebrick.name=Полое покрытие из каменного кирпича +tile.rphcover.stonebrick1.name=Полое покрытие из каменного кирпича +tile.rphcover.stonebrick2.name=Полое покрытие из каменного кирпича +tile.rphcover.stonebrick3.name=Полое покрытие из каменного кирпича +tile.rphcover.tinBlock.name=Полое покрытие из блока олова +tile.rphcover.tungstenBlock.name=Полое покрытие из блока вольфрама +tile.rphcover.wood.name=Полое покрытие из дерева +tile.rphcover.wood1.name=Полое покрытие из дерева +tile.rphcover.wood2.name=Полое покрытие из дерева +tile.rphcover.wood3.name=Полое покрытие из дерева +tile.rphcover.wool.black.name=Полое покрытие из черной шерсти +tile.rphcover.wool.blue.name=Полое покрытие из синей шерсти +tile.rphcover.wool.brown.name=Полое покрытие из коричневой шерсти +tile.rphcover.wool.cyan.name=Полое покрытие из бирюзовой шерсти +tile.rphcover.wool.gray.name=Полое покрытие из серой шерсти +tile.rphcover.wool.green.name=Полое покрытие из зеленой шерсти +tile.rphcover.wool.lightBlue.name=Полое покрытие из голубой шерсти +tile.rphcover.wool.lime.name=Полое покрытие из лаймовой шерсти +tile.rphcover.wool.magenta.name=Полое покрытие из пурпурной шерсти +tile.rphcover.wool.orange.name=Полое покрытие из оранжевой шерсти +tile.rphcover.wool.pink.name=Полое покрытие из розовой шерсти +tile.rphcover.wool.purple.name=Полое покрытие из фиолетовой шерсти +tile.rphcover.wool.red.name=Полое покрытие из красной шерсти +tile.rphcover.wool.silver.name=Полое покрытие из светло-серой шерсти +tile.rphcover.wool.white.name=Полое покрытие из белой шерсти +tile.rphcover.wool.yellow.name=Полое покрытие из желтой шерсти +tile.rphpanel.basalt.name=Полая панель из базальта +tile.rphpanel.basaltBrick.name=Полая панель из базальтового кирпича +tile.rphpanel.basaltCircle.name=Полая панель из срезного базальтового кирпича +tile.rphpanel.basaltCobble.name=Полая панель из базальтового булыжника +tile.rphpanel.basaltPaver.name=Полая панель из базальтового асфальта +tile.rphpanel.books.name=Полая панель из книжной полки +tile.rphpanel.brick.name=Полая панель из кирпича +tile.rphpanel.clay.name=Полая панель из глины +tile.rphpanel.cobble.name=Полая панель из булыжника +tile.rphpanel.copperBlock.name=Полая панель из блока меди +tile.rphpanel.diamond.name=Полая панель из алмазного блока +tile.rphpanel.dirt.name=Полая панель из земли +tile.rphpanel.emeraldBlock.name=Полая панель из изумрудного блока +tile.rphpanel.glass.name=Полая панель из стекла +tile.rphpanel.gold.name=Полая панель из блока золота +tile.rphpanel.greenSapphireBlock.name=Полая панель из блока зеленого сапфира +tile.rphpanel.iron.name=Полая панель из блока железа +tile.rphpanel.lapis.name=Полая панель из лазуритового блока +tile.rphpanel.marble.name=Полая панель из мрамора +tile.rphpanel.marbleBrick.name=Полая панель из мраморного кирпича +tile.rphpanel.moss.name=Полая панель из булыжника со мхом +tile.rphpanel.netherbrick.name=Полая панель из адского кирпича +tile.rphpanel.netherrack.name=Полая панель из адского камня +tile.rphpanel.obsidian.name=Полая панель из обсидиана +tile.rphpanel.planks.name=Полая панель из досок +tile.rphpanel.planks1.name=Полая панель из досок +tile.rphpanel.planks2.name=Полая панель из досок +tile.rphpanel.planks3.name=Полая панель из досок +tile.rphpanel.pumpkin.name=Полая панель из тыквы +tile.rphpanel.rplog.name=Полая панель из каучукового дерева +tile.rphpanel.rubyBlock.name=Полая панель из рубинового блока +tile.rphpanel.sandstone.name=Полая панель из песчаника +tile.rphpanel.sandstone1.name=Полая панель из песчаника +tile.rphpanel.sandstone2.name=Полая панель из песчаника +tile.rphpanel.sapphireBlock.name=Полая панель из сапфирового блока +tile.rphpanel.silverBlock.name=Полая панель из блока серебра +tile.rphpanel.slab.name=Полая панель из каменных ступенек +tile.rphpanel.snow.name=Полая панель из снега +tile.rphpanel.soul.name=Полая панель из песка душ +tile.rphpanel.stone.name=Полая панель из камня +tile.rphpanel.stonebrick.name=Полая панель из каменного кирпича +tile.rphpanel.stonebrick1.name=Полая панель из каменного кирпича +tile.rphpanel.stonebrick2.name=Полая панель из каменного кирпича +tile.rphpanel.stonebrick3.name=Полая панель из каменного кирпича +tile.rphpanel.tinBlock.name=Полая панель из блока олова +tile.rphpanel.tungstenBlock.name=Полая панель из блока вольфрама +tile.rphpanel.wood.name=полая панель из дерева +tile.rphpanel.wood1.name=Полая панель из дерева +tile.rphpanel.wood2.name=Полая панель из дерева +tile.rphpanel.wood3.name=Полая панель из дерева +tile.rphpanel.wool.black.name=Полая панель из черной шерсти +tile.rphpanel.wool.blue.name=Полая панель из синей шерсти +tile.rphpanel.wool.brown.name=Полая панель из коричневой шерсти +tile.rphpanel.wool.cyan.name=Полая панель из бирюзовой шерсти +tile.rphpanel.wool.gray.name=Полая панель из серой шерсти +tile.rphpanel.wool.green.name=Полая панель из зеленой шерсти +tile.rphpanel.wool.lightBlue.name=Полая панель из голубой шести +tile.rphpanel.wool.lime.name=Полая панель из лаймовой шерсти +tile.rphpanel.wool.magenta.name=Полая панель из пурпурной шерсти +tile.rphpanel.wool.orange.name=Полая панель из оранжевой шерсти +tile.rphpanel.wool.pink.name=Полая панель из розовой шерсти +tile.rphpanel.wool.purple.name=Полая панель из фиолетовой шерсти +tile.rphpanel.wool.red.name=Полая панель из красной шерсти +tile.rphpanel.wool.silver.name=Полая панель из светло-серой шерсти +tile.rphpanel.wool.white.name=Полая панель из белой шерсти +tile.rphpanel.wool.yellow.name=Полая панель из желтой шерсти +tile.rphslab.basalt.name=Полая плита из базальта +tile.rphslab.basaltBrick.name=Полая плита из базальтового булыжника +tile.rphslab.basaltCircle.name=Полая плита из резного базальтового кирпича +tile.rphslab.basaltCobble.name=Полая плита из базальтового булыжника +tile.rphslab.basaltPaver.name=Полая плита из базальтового асфальта +tile.rphslab.books.name=Полая плита из книжной полки +tile.rphslab.brick.name=Полая плита из кирпича +tile.rphslab.clay.name=Полая плита из глины +tile.rphslab.cobble.name=Полая плита из булыжника +tile.rphslab.copperBlock.name=Полая плита из блока меди +tile.rphslab.diamond.name=Полая плита из алмазного блока +tile.rphslab.dirt.name=Полая плита из земли +tile.rphslab.emeraldBlock.name=Полая плита из изумрудного блока +tile.rphslab.glass.name=Полая плита из стекла +tile.rphslab.gold.name=Полая плита из блока золота +tile.rphslab.greenSapphireBlock.name=Полая плита из блока зеленого сапфира +tile.rphslab.iron.name=Полая плита из блока железа +tile.rphslab.lapis.name=Полая плита из лазуритового блока +tile.rphslab.marble.name=Полая плита из мрамора +tile.rphslab.marbleBrick.name=Полая плита из мраморного кирпича +tile.rphslab.moss.name=Полая плита из булыжника со мхом +tile.rphslab.netherbrick.name=Полая плита из адского кирпича +tile.rphslab.netherrack.name=Полая плита из адского камня +tile.rphslab.obsidian.name=Полая плита из обсидиана +tile.rphslab.planks.name=Полая плита из досок +tile.rphslab.planks1.name=Полая плита из досок +tile.rphslab.planks2.name=Полая плита из досок +tile.rphslab.planks3.name=Полая плита из досок +tile.rphslab.pumpkin.name=Полая плита из тыквы +tile.rphslab.rplog.name=Полая плита из каучукового дерева +tile.rphslab.rubyBlock.name=Полая плита из рубинового блока +tile.rphslab.sandstone.name=Полая плита из песчаника +tile.rphslab.sandstone1.name=Полая плита из песчаника +tile.rphslab.sandstone2.name=Полая плита из песчаника +tile.rphslab.sapphireBlock.name=Полая плита из сапфирового блока +tile.rphslab.silverBlock.name=\=Полая плита из блока серебра +tile.rphslab.slab.name=Полая плита из каменных ступенек +tile.rphslab.snow.name=Полая плита из снега +tile.rphslab.soul.name=Полая плита из песка душ +tile.rphslab.stone.name=Полая плита из камня +tile.rphslab.stonebrick.name=Полая плита из каменного кирпича +tile.rphslab.stonebrick1.name=Полая плита из каменного кирпича +tile.rphslab.stonebrick2.name=Полая плита из каменного кирпича +tile.rphslab.stonebrick3.name=Полая плита из каменного кирпича +tile.rphslab.tinBlock.name=Полая плита из блока олова +tile.rphslab.tungstenBlock.name=Полая плита из блока вольфрама +tile.rphslab.wood.name=Полая плита из дерева +tile.rphslab.wood1.name=Полая плита из дерева +tile.rphslab.wood2.name=Полая плита из дерева +tile.rphslab.wood3.name=Полая плита из дерева +tile.rphslab.wool.black.name=Полая плита из черной шерсти +tile.rphslab.wool.blue.name=Полая плита из синей шерсти +tile.rphslab.wool.brown.name=Полая плита из коричневой шерсти +tile.rphslab.wool.cyan.name=Полая плита из бирюзовой шерсти +tile.rphslab.wool.gray.name=Полая плита из серой шерсти +tile.rphslab.wool.green.name=Полая плита из желеной шерсти +tile.rphslab.wool.lightBlue.name=Полая плита из голубой шерсти +tile.rphslab.wool.lime.name=Полая плита из лаймовой шерсти +tile.rphslab.wool.magenta.name=Полая плита из пурпурной шерсти +tile.rphslab.wool.orange.name=Полая плита из оранжевой шерсти +tile.rphslab.wool.pink.name=Полая плита из розовой шерсти +tile.rphslab.wool.purple.name=Полая плита из фиолетовой шерсти +tile.rphslab.wool.red.name=Полая плита из красной шерсти +tile.rphslab.wool.silver.name=Полая плита из светло-серой шерсти +tile.rphslab.wool.white.name=Полая плита из белой шерсти +tile.rphslab.wool.yellow.name=Полая плита из желтой шерсти +tile.rppanc.basalt.name=Угол панели из базальта +tile.rppanc.basaltBrick.name=Угол панели из базальтового кирпича +tile.rppanc.basaltCircle.name=Угол панели из резного базальтового кирп +tile.rppanc.basaltCobble.name=Угол панели из базальтового булыжника +tile.rppanc.basaltPaver.name=Угол панели из базальтового асфальта +tile.rppanc.books.name=Угол панели из книжной полки +tile.rppanc.brick.name=Угол панели из кирпича +tile.rppanc.clay.name=Угол панели из глины +tile.rppanc.cobble.name=Угол панели из булыжника +tile.rppanc.copperBlock.name=Угол панели из блока меди +tile.rppanc.diamond.name=Угол панели из алмазного блока +tile.rppanc.dirt.name=Угол панели из земли +tile.rppanc.emeraldBlock.name=Угол панели из изумрудного блока +tile.rppanc.glass.name=Угол панели из стекла +tile.rppanc.gold.name=Угол панели из блока золота +tile.rppanc.greenSapphireBlock.name=Угол панели из блока зеленого сапфира +tile.rppanc.iron.name=Угол панели из блока железа +tile.rppanc.lapis.name=Угол панели из лазуритового блока +tile.rppanc.marble.name=Угол панели из мрамора +tile.rppanc.marbleBrick.name=Угол панели из мраморного кирпича +tile.rppanc.moss.name=Угол панели из булыжника со мхом +tile.rppanc.netherbrick.name=Угол панели из адского кирпича +tile.rppanc.netherrack.name=Угол панели из адского камня +tile.rppanc.obsidian.name=Угол панели из обсидиана +tile.rppanc.planks.name=Угол панели из досок +tile.rppanc.planks1.name=Угол панели из досок +tile.rppanc.planks2.name=Угол панели из досок +tile.rppanc.planks3.name=Угол панели из досок +tile.rppanc.pumpkin.name=Угол панели из тыквы +tile.rppanc.rplog.name=Угол панели из каучукового дерева +tile.rppanc.rubyBlock.name=Угол панели из рубинового блока +tile.rppanc.sandstone.name=Угол панели из песчаника +tile.rppanc.sandstone1.name=Угол панели из песчаника +tile.rppanc.sandstone2.name=Угол панели из песчаника +tile.rppanc.sapphireBlock.name=Угол панели из сапфирового блока +tile.rppanc.silverBlock.name=Угол панели из блока серебра +tile.rppanc.slab.name=Угол панели из каменных ступенек +tile.rppanc.snow.name=Угол панели из снега +tile.rppanc.soul.name=Угол панели из песка душ +tile.rppanc.stone.name=Угол панели из камня +tile.rppanc.stonebrick.name=Угол панели из каменного кирпича +tile.rppanc.stonebrick1.name=Угол панели из каменного кирпича +tile.rppanc.stonebrick2.name=Угол панели из каменного кирпича +tile.rppanc.stonebrick3.name=Угол панели из каменного кирпича +tile.rppanc.tinBlock.name=Угол панели из блока олова +tile.rppanc.tungstenBlock.name=Угол панели из блока вольфрама +tile.rppanc.wood.name=Угол панели из дерева +tile.rppanc.wood1.name=Угол панели из дерева +tile.rppanc.wood2.name=Угол панели из дерева +tile.rppanc.wood3.name=Угол панели из дерева +tile.rppanc.wool.black.name=Угол панели из черной шерсти +tile.rppanc.wool.blue.name=Угол панели из синей шерсти +tile.rppanc.wool.brown.name=Угол панели из коричневой шерсти +tile.rppanc.wool.cyan.name=Угол панели из бирюзовой шерсти +tile.rppanc.wool.gray.name=Угол панели из серой шерсти +tile.rppanc.wool.green.name=Угол панели из зеленой шерсти +tile.rppanc.wool.lightBlue.name=Угол панели из голубой шерсти +tile.rppanc.wool.lime.name=Угол панели из лаймовой шерсти +tile.rppanc.wool.magenta.name=Угол панели из пурпурной шерст +tile.rppanc.wool.orange.name=Угол панели из оранжевой шерсти +tile.rppanc.wool.pink.name=Угол панели из розовой шерсти +tile.rppanc.wool.purple.name=Угол панели из фиолетовой шерсти +tile.rppanc.wool.red.name=Угол панели из красной шерсти +tile.rppanc.wool.silver.name=Угол панели из светло-серой шерсти +tile.rppanc.wool.white.name=Угол панели из белой шерсти +tile.rppanc.wool.yellow.name=Угол панели из желтой шерсти +tile.rppanel.basalt.name=Панель из базальта +tile.rppanel.basaltBrick.name=Панель из базальтового кирпича +tile.rppanel.basaltCircle.name=Панель из резного базальтового кирпича +tile.rppanel.basaltCobble.name=Панель из базальтового булыжника +tile.rppanel.basaltPaver.name=Панель из базальтового асфальта +tile.rppanel.books.name=Панель из книжной полки +tile.rppanel.brick.name=Панель из кирпича +tile.rppanel.clay.name=Панель из глины +tile.rppanel.cobble.name=Панель из булыжника +tile.rppanel.copperBlock.name=Панель из блока меди +tile.rppanel.diamond.name=Панель из алмазного блока +tile.rppanel.dirt.name=Панель из земли +tile.rppanel.emeraldBlock.name=Панель из изумрудного блока +tile.rppanel.glass.name=Панель из стекла +tile.rppanel.gold.name=Панель из блока золота +tile.rppanel.greenSapphireBlock.name=Панель из зеленого сапфирового сапфира +tile.rppanel.iron.name=Панель из блока железа +tile.rppanel.lapis.name=Панель из лазуритового блока +tile.rppanel.marble.name=Панель из мрамора +tile.rppanel.marbleBrick.name=Панель из мраморного кирпича +tile.rppanel.moss.name=Панель из булыжника со мхом +tile.rppanel.netherbrick.name=Панель из адского кирпича +tile.rppanel.netherrack.name=Панель из адского камня +tile.rppanel.obsidian.name=Панель из обсидиана +tile.rppanel.planks.name=Панель из досок +tile.rppanel.planks1.name=Панель из досок +tile.rppanel.planks2.name=Панель из досок +tile.rppanel.planks3.name=Панель из досок +tile.rppanel.pumpkin.name=Панель из тыквы +tile.rppanel.rplog.name=Панель из каучукового дерева +tile.rppanel.rubyBlock.name=Панель из рубинового блока +tile.rppanel.sandstone.name=Панель из песчаника +tile.rppanel.sandstone1.name=Панель из песчаника +tile.rppanel.sandstone2.name=Панель из песчаника +tile.rppanel.sapphireBlock.name=Панель из сапфирового блока +tile.rppanel.silverBlock.name=Панель из блока серебра +tile.rppanel.slab.name=Панель из каменных ступенек +tile.rppanel.snow.name=Панель из снега +tile.rppanel.soul.name=Панель из песка душ +tile.rppanel.stone.name=Панель из камня +tile.rppanel.stonebrick.name=Панель из каменного кирпича +tile.rppanel.stonebrick1.name=Панель из каменного кирпича +tile.rppanel.stonebrick2.name=Панель из каменного кирпича +tile.rppanel.stonebrick3.name=Панель из каменного кирпича +tile.rppanel.tinBlock.name=Панель из блока олова +tile.rppanel.tungstenBlock.name=Панель из блока вольфрама +tile.rppanel.wood.name=Панель из дерева +tile.rppanel.wood1.name=Панель из дерева +tile.rppanel.wood2.name=Панель из дерева +tile.rppanel.wood3.name=Панель из дерева +tile.rppanel.wool.black.name=Панель из черной шерсти +tile.rppanel.wool.blue.name=Панель из синей шерсти +tile.rppanel.wool.brown.name=Панель из коричневой шерсти +tile.rppanel.wool.cyan.name=Панель из бирюзовой шерсти +tile.rppanel.wool.gray.name=Панель из серой шерсти +tile.rppanel.wool.green.name=Панель из зеленой шерсти +tile.rppanel.wool.lightBlue.name=Панель из голубой шерсти +tile.rppanel.wool.lime.name=Панель из лаймовой шерсти +tile.rppanel.wool.magenta.name=Панель из пурпурной шерсти +tile.rppanel.wool.orange.name=Панель из оранжевой шерсти +tile.rppanel.wool.pink.name=Панель из розовой шерсти +tile.rppanel.wool.purple.name=Панель из фиолетовой шерсти +tile.rppanel.wool.red.name=Панель из красной шерсти +tile.rppanel.wool.silver.name=Панель из светло-серой шерсти +tile.rppanel.wool.white.name=Панель из белой шерсти +tile.rppanel.wool.yellow.name=Панель из желтой шерсти +tile.rppans.basalt.name=Рейка панели из базальта +tile.rppans.basaltBrick.name=Рейка панели из базальтового кирпича +tile.rppans.basaltCircle.name=Рейка панели из резного базальтового кирпича +tile.rppans.basaltCobble.name=Рейка панели из базальтового булыжника +tile.rppans.basaltPaver.name=Рейка панели из базальтового кирпича +tile.rppans.books.name=Рейка панели из книжной полки +tile.rppans.brick.name=Рейка панели из кирпича +tile.rppans.clay.name=Рейка панели из глины +tile.rppans.cobble.name=Рейка панели из булыжника +tile.rppans.copperBlock.name=Рейка панели из блока меди +tile.rppans.diamond.name=Рейка панели из алмазного блока +tile.rppans.dirt.name=Рейка панели из земли +tile.rppans.emeraldBlock.name=Рейка панели изумрудного блока +tile.rppans.glass.name=Рейка панели из стекла +tile.rppans.gold.name=Рейка панели из блока золота +tile.rppans.greenSapphireBlock.name=Полое тройное покрытие из блока зеленого сапфира +tile.rppans.iron.name=Рейка панели из блока железа +tile.rppans.lapis.name=Рейка панели из лазуритового блока +tile.rppans.marble.name=Рейка панели из мрамора +tile.rppans.marbleBrick.name=Рейка панели из мраморного кирпича +tile.rppans.moss.name=Рейка панели из булыжника со мхом +tile.rppans.netherbrick.name=Рейка панели из адского кирпича +tile.rppans.netherrack.name=Рейка панели из адского камня +tile.rppans.obsidian.name=Рейка панели из обсидиана +tile.rppans.planks.name=Рейка панели из досок +tile.rppans.planks1.name=Рейка панели из досок +tile.rppans.planks2.name=Рейка панели из досок +tile.rppans.planks3.name=Рейка панели из досок +tile.rppans.pumpkin.name=Рейка панели из тыквы +tile.rppans.rplog.name=Рейка панели из каучукового дерева +tile.rppans.rubyBlock.name=Рейка панели из рубинового блока +tile.rppans.sandstone.name=Рейка панели из песчаника +tile.rppans.sandstone1.name=Рейка панели из песчаника +tile.rppans.sandstone2.name=Рейка панели из песчаника +tile.rppans.sapphireBlock.name=Рейка панели из сапфирового блока +tile.rppans.silverBlock.name=Рейка панели из блока серебра +tile.rppans.slab.name=Рейка панели из каменных ступенек +tile.rppans.snow.name=Рейка панели из снега +tile.rppans.soul.name=Рейка панели из песка душ +tile.rppans.stone.name=Рейка панели из камня +tile.rppans.stonebrick.name=Рейка панели из каменного кирпича +tile.rppans.stonebrick1.name=Рейка панели из каменного кирпича +tile.rppans.stonebrick2.name=Рейка панели из каменного кирпича +tile.rppans.stonebrick3.name=Рейка панели из каменного кирпича +tile.rppans.tinBlock.name=Рейка панели из блока олова +tile.rppans.tungstenBlock.name=Рейка панели из блока вольфрама +tile.rppans.wood.name=Рейка панели из дерева +tile.rppans.wood1.name=Рейка панели из дерева +tile.rppans.wood2.name=Рейка панели из дерева +tile.rppans.wood3.name=Рейка панели из досок +tile.rppans.wool.black.name=Рейка панели из черной шерсти +tile.rppans.wool.blue.name=Рейка панели из синей шерсти +tile.rppans.wool.brown.name=Рейка панели из коричневой шерсти +tile.rppans.wool.cyan.name=Рейка панели из бирюзовой шерсти +tile.rppans.wool.gray.name=Рейка панели из серой шерсти +tile.rppans.wool.green.name=Рейка панели из зеленой шерсти +tile.rppans.wool.lightBlue.name=Рейка панели из голубой шерсти +tile.rppans.wool.lime.name=Рейка панели из лаймовой шерсти +tile.rppans.wool.magenta.name=Рейка панели из пурпурной шерсти +tile.rppans.wool.orange.name=Рейка панели из оранжевой шерсти +tile.rppans.wool.pink.name=Рейка панели из розовой шерсти +tile.rppans.wool.purple.name=Рейка панели из фиолетовой шерсти +tile.rppans.wool.red.name=Рейка панели из красной шерсти +tile.rppans.wool.silver.name=Рейка панели из светло-серой шерсти +tile.rppans.wool.white.name=Рейка панели из белой шерсти +tile.rppans.wool.yellow.name=Рейка панели из желтой шерсти +tile.rppole1.basalt.name=Столб из базальта +tile.rppole1.basaltBrick.name=Столб из базальтового кирпича +tile.rppole1.basaltCircle.name=Столб из резного базальтового кирпича +tile.rppole1.basaltCobble.name=Столб из базальтового булыжника +tile.rppole1.basaltPaver.name=Столб из базальтового асфальта +tile.rppole1.books.name=Столб из книжной полки +tile.rppole1.brick.name=Столб из кирпича +tile.rppole1.clay.name=Столб из глины +tile.rppole1.cobble.name=Столб из булыжника +tile.rppole1.copperBlock.name=Столб из блока меди +tile.rppole1.diamond.name=Столб из алмазного блока +tile.rppole1.dirt.name=Столб из земли +tile.rppole1.emeraldBlock.name=Столб из изумрудного блока +tile.rppole1.glass.name=Столб из стекла +tile.rppole1.gold.name=Столб из блока золота +tile.rppole1.greenSapphireBlock.name=Столб из блока зеленого сапфира +tile.rppole1.iron.name=Столб из блока железа +tile.rppole1.lapis.name=Столб из лазуритового блока +tile.rppole1.marble.name=Столб из мрамора +tile.rppole1.marbleBrick.name=Столб из мраморного кирпича +tile.rppole1.moss.name=Столб из булыжника со мхом +tile.rppole1.netherbrick.name=Столб из адского кирпича +tile.rppole1.netherrack.name=Столб из адского камня +tile.rppole1.obsidian.name=Столб из обсидиана +tile.rppole1.planks.name=Столб из досок +tile.rppole1.planks1.name=Столб из досок +tile.rppole1.planks2.name=Столб из досок +tile.rppole1.planks3.name=Столб из досок +tile.rppole1.pumpkin.name=Столб из тыквы +tile.rppole1.rplog.name=Столб из каучукового дерева +tile.rppole1.rubyBlock.name=Столб из рубинового блока +tile.rppole1.sandstone.name=Столб из песчаника +tile.rppole1.sandstone1.name=Столб из песчаника +tile.rppole1.sandstone2.name=Столб из песчаника +tile.rppole1.sapphireBlock.name=Столб из сапфирового блока +tile.rppole1.silverBlock.name=Столб из блока серебра +tile.rppole1.slab.name=Столб из каменных ступенек +tile.rppole1.snow.name=Столб из снега +tile.rppole1.soul.name=Столб из песка душ +tile.rppole1.stone.name=Столб из камня +tile.rppole1.stonebrick.name=Столб из каменного кирпича +tile.rppole1.stonebrick1.name=Стоб из каменного кирпича +tile.rppole1.stonebrick2.name=Столб из каменного кирпича +tile.rppole1.stonebrick3.name=Столб из каменного кирпича +tile.rppole1.tinBlock.name=Столб из блока олова +tile.rppole1.tungstenBlock.name=Столб из блока вольфрама +tile.rppole1.wood.name=Стоб из дерева +tile.rppole1.wood1.name=Столб из дерева +tile.rppole1.wood2.name=Столб из дерева +tile.rppole1.wood3.name=Столб из дерева +tile.rppole1.wool.black.name=Столб из черной шерсти +tile.rppole1.wool.blue.name=Столб из синей шерсти +tile.rppole1.wool.brown.name=Столб из коричневой шерсти +tile.rppole1.wool.cyan.name=Столб из бирюзовой шерсти +tile.rppole1.wool.gray.name=Столб из серой шерсти +tile.rppole1.wool.green.name=Столб из зеленой шерсти +tile.rppole1.wool.lightBlue.name=Столб из голубой шерсти +tile.rppole1.wool.lime.name=Столб из лаймовой шерсти +tile.rppole1.wool.magenta.name=Столб из пурпурной шерсти +tile.rppole1.wool.orange.name=Столб из оранжевой шерсти +tile.rppole1.wool.pink.name=Столб из розовой шерсти +tile.rppole1.wool.purple.name=Столб из фиолетовой шерсти +tile.rppole1.wool.red.name=Столб из красной шерсти +tile.rppole1.wool.silver.name=Столб из светло-серой шерсти +tile.rppole1.wool.white.name=Столб из белой шерсти +tile.rppole1.wool.yellow.name=Столб из желтой шерсти +tile.rppole2.basalt.name=Опора из базальта +tile.rppole2.basaltBrick.name=Опора из базальтового кирпича +tile.rppole2.basaltCircle.name=Опора из резного базальтового кирпича +tile.rppole2.basaltCobble.name=Опора из базальтового булыжника +tile.rppole2.basaltPaver.name=Опора из базальтового асфальта +tile.rppole2.books.name=Опора из книжной полки +tile.rppole2.brick.name=Опора из кирпича +tile.rppole2.clay.name=Столб из глины +tile.rppole2.cobble.name=Опора из булыжника +tile.rppole2.copperBlock.name=Опора из блока меди +tile.rppole2.diamond.name=Опора из алмазного блока +tile.rppole2.dirt.name=Опора из земли +tile.rppole2.emeraldBlock.name=Опора из изумрудного блока +tile.rppole2.glass.name=Опора из стекла +tile.rppole2.gold.name=Опора из блока золота +tile.rppole2.greenSapphireBlock.name=Опора из блока зеленого сапфира +tile.rppole2.iron.name=Опора из блока железа +tile.rppole2.lapis.name=Опора из лазуритового блока +tile.rppole2.marble.name=Опора из мрамора +tile.rppole2.marbleBrick.name=Опора из мраморного кирпича +tile.rppole2.moss.name=Опора из булыжника со мхом +tile.rppole2.netherbrick.name=Опора из адского камня +tile.rppole2.netherrack.name=Опора из адского камня +tile.rppole2.obsidian.name=Опора из обсидиана +tile.rppole2.planks.name=Опора из досок +tile.rppole2.planks1.name=Опора из досок +tile.rppole2.planks2.name=Опора из досок +tile.rppole2.planks3.name=Опора из досок +tile.rppole2.pumpkin.name=Опора из тыквы +tile.rppole2.rplog.name=Опора из каучукового дерева +tile.rppole2.rubyBlock.name=Опора из рубинового блока +tile.rppole2.sandstone.name=Опора из песчаника +tile.rppole2.sandstone1.name=Опора из песчаника +tile.rppole2.sandstone2.name=Опора из песчаника +tile.rppole2.sapphireBlock.name=Опора из сапфирового блока +tile.rppole2.silverBlock.name=Опора из блока серебра +tile.rppole2.slab.name=Опора из каменных ступенек +tile.rppole2.snow.name=Опора из снега +tile.rppole2.soul.name=Опора из песка душ +tile.rppole2.stone.name=Опора из камня +tile.rppole2.stonebrick.name=Опора из каменного кирпича +tile.rppole2.stonebrick1.name=Опора из каменного кирпича +tile.rppole2.stonebrick2.name=Опора из каменного кирпича +tile.rppole2.stonebrick3.name=Опора из каменного кирпича +tile.rppole2.tinBlock.name=Опора из блока олова +tile.rppole2.tungstenBlock.name=Опора из блока вольфрама +tile.rppole2.wood.name=Опора из дерева +tile.rppole2.wood1.name=Опора из дерева +tile.rppole2.wood2.name=Опора из дерева +tile.rppole2.wood3.name=Опора из дерева +tile.rppole2.wool.black.name=Опора из черной шерсти +tile.rppole2.wool.blue.name=Опора из синей шерсти +tile.rppole2.wool.brown.name=Опора из коричневой шерсти +tile.rppole2.wool.cyan.name=Опора из бирюзовой шерсти +tile.rppole2.wool.gray.name=Опора из серой шерсти +tile.rppole2.wool.green.name=Опора из зеленой шерсти +tile.rppole2.wool.lightBlue.name=Опора из голубой шерсти +tile.rppole2.wool.lime.name=Опора из лаймовой шерсти +tile.rppole2.wool.magenta.name=Опора из пурпурной шерсти +tile.rppole2.wool.orange.name=Опора из оранжевой шерсти +tile.rppole2.wool.pink.name=Опора из розовой шерсти +tile.rppole2.wool.purple.name=Опораиз фиолетовой шерсти +tile.rppole2.wool.red.name=Опора из красной шерсти +tile.rppole2.wool.silver.name=Опора из светло-серой шерсти +tile.rppole2.wool.white.name=Опора из белой шерсти +tile.rppole2.wool.yellow.name=Опора из желтой шерсти +tile.rppole3.basalt.name=Колонна из базальта +tile.rppole3.basaltBrick.name=Колонна из базальтового кирпича +tile.rppole3.basaltCircle.name=Колонна из резного базальтового кирпича +tile.rppole3.basaltCobble.name=Колонна из базальтового булыжника +tile.rppole3.basaltPaver.name=Колонна из базальтового асфальта +tile.rppole3.books.name=Колонна из книжной полки +tile.rppole3.brick.name=Колонна из кирпича +tile.rppole3.clay.name=Колонна из глины +tile.rppole3.cobble.name=Колонна из булыжника +tile.rppole3.copperBlock.name=Колонна из блока меди +tile.rppole3.diamond.name=Колонна из алмазного блока +tile.rppole3.dirt.name=Колонна из земли +tile.rppole3.emeraldBlock.name=Колонна из изумрудного блока +tile.rppole3.glass.name=Колонна из стекла +tile.rppole3.gold.name=Колонна из блока золота +tile.rppole3.greenSapphireBlock.name=Колонна из зеле сапфирового блока +tile.rppole3.iron.name=Колонна из блока железа +tile.rppole3.lapis.name=Колонна из лазуритового блока +tile.rppole3.marble.name=Колонна из мрамора +tile.rppole3.marbleBrick.name=Колонна из мраморного кирпича +tile.rppole3.moss.name=Колонна из булыжника со мхом +tile.rppole3.netherbrick.name=Колонна из адского кирпича +tile.rppole3.netherrack.name=Колонна из адского камня +tile.rppole3.obsidian.name=Колонна из обсидиана +tile.rppole3.planks.name=Колонна из досок +tile.rppole3.planks1.name=Колонна из досок +tile.rppole3.planks2.name=Колонка из досок +tile.rppole3.planks3.name=Колонна из досок +tile.rppole3.pumpkin.name=Колонна из тыквы +tile.rppole3.rplog.name=Колонна из каучукового дерева +tile.rppole3.rubyBlock.name=Колонна из рубинового блока +tile.rppole3.sandstone.name=Колонна из песчаника +tile.rppole3.sandstone1.name=Колонна из песчаника +tile.rppole3.sandstone2.name=Колонна из песчаника +tile.rppole3.sapphireBlock.name=Колонна из сапфирового блока +tile.rppole3.silverBlock.name=Колонна из блока серебра +tile.rppole3.slab.name=Колонна из каменных ступенек +tile.rppole3.snow.name=Колонна из снега +tile.rppole3.soul.name=Колонна из песка душ +tile.rppole3.stone.name=Колонна из камня +tile.rppole3.stonebrick.name=Колонна из каменного кирпича +tile.rppole3.stonebrick1.name=Колонна из каменного кирпича +tile.rppole3.stonebrick2.name=Колонна из каменного кирпича +tile.rppole3.stonebrick3.name=Колонна из каменного кирпича +tile.rppole3.tinBlock.name=Колонна из блока олова +tile.rppole3.tungstenBlock.name=Колонна из блока вольфрама +tile.rppole3.wood.name=Колонна из дерева +tile.rppole3.wood1.name=Колонна из дерева +tile.rppole3.wood2.name=Колонна из дерева +tile.rppole3.wood3.name=Колонна из дерева +tile.rppole3.wool.black.name=Колонна из черной шерсти +tile.rppole3.wool.blue.name=Колонна из синей шерсти +tile.rppole3.wool.brown.name=Колонна из коричневой шерсти +tile.rppole3.wool.cyan.name=Колонная из бирюзовой шерсти +tile.rppole3.wool.gray.name=Колонна из серой шерсти +tile.rppole3.wool.green.name=Колонна из зеленой шерсти +tile.rppole3.wool.lightBlue.name=Колонна из голубой шерсти +tile.rppole3.wool.lime.name=Колонна из лаймовой шерсти +tile.rppole3.wool.magenta.name=Колонна из пурпурной шерсти +tile.rppole3.wool.orange.name=Колонна из оранжевой шерсти +tile.rppole3.wool.pink.name=Колонна из розовой шерсти +tile.rppole3.wool.purple.name=Колонна из фиолетовой шерсти +tile.rppole3.wool.red.name=Колонна из красной шерсти +tile.rppole3.wool.silver.name=Колонна из светло-серой шерсти +tile.rppole3.wool.white.name=Колонна из белой шерсти +tile.rppole3.wool.yellow.name=Колонна из желтой шерсти +tile.rpslab.basalt.name=Плита из базальта +tile.rpslab.basaltBrick.name=Плита из базальтового кирпича +tile.rpslab.basaltCircle.name=Плита из резного базальтового кирпича +tile.rpslab.basaltCobble.name=Плита из базальтового булыжника +tile.rpslab.basaltPaver.name=Плита из базальтового асфальта +tile.rpslab.books.name=Плита из книжной полки +tile.rpslab.brick.name=Плита из кирпича +tile.rpslab.clay.name=Плита из глины +tile.rpslab.cobble.name=Плита из булыжника +tile.rpslab.copperBlock.name=Плита из блока меди +tile.rpslab.diamond.name=Плита из алмазного блока +tile.rpslab.dirt.name=Плита из земли +tile.rpslab.emeraldBlock.name=Плита из изумрудного блока +tile.rpslab.glass.name=Плита из стекла +tile.rpslab.gold.name=Плита из блока золота +tile.rpslab.greenSapphireBlock.name=Плита из блока зеленого сапфира +tile.rpslab.iron.name=Плита из блока железа +tile.rpslab.lapis.name=Плита из лазуритовго блока +tile.rpslab.marble.name=Плита из мрамора +tile.rpslab.marbleBrick.name=Плита из мраморного кирпича +tile.rpslab.moss.name=Плита из булыжника со мхом +tile.rpslab.netherbrick.name=Плита из адского кирпича +tile.rpslab.netherrack.name=Плита из адского камня +tile.rpslab.obsidian.name=Плита из обсидиана +tile.rpslab.planks.name=Плита из досок +tile.rpslab.planks1.name=Плита из дерева +tile.rpslab.planks2.name=Плита из досок +tile.rpslab.planks3.name=Плита из досок +tile.rpslab.pumpkin.name=Плита из тыквы +tile.rpslab.rplog.name=Плита из каучукового дерева +tile.rpslab.rubyBlock.name=Плита из рубинового блока +tile.rpslab.sandstone.name=Плита из песчаника +tile.rpslab.sandstone1.name=Плита из песчаника +tile.rpslab.sandstone2.name=Плита из песчаника +tile.rpslab.sapphireBlock.name=Плита из сапфирового блока +tile.rpslab.silverBlock.name=Плита из блока серебра +tile.rpslab.slab.name=Плита из каменных ступенек +tile.rpslab.snow.name=Плита из снега +tile.rpslab.soul.name=Плита из песка душ +tile.rpslab.stone.name=Плита из камня +tile.rpslab.stonebrick.name=Плита из каменного кирпича +tile.rpslab.stonebrick1.name=Плита из каменного кирпича +tile.rpslab.stonebrick2.name=Плита из каменного кирпича +tile.rpslab.stonebrick3.name=Плита из каменного кирпича +tile.rpslab.tinBlock.name=Плита из блока олова +tile.rpslab.tungstenBlock.name=Плита из блока вольфрама +tile.rpslab.wood.name=Плита из дерева +tile.rpslab.wood1.name=Плита из дерева +tile.rpslab.wood2.name=Плита из дерева +tile.rpslab.wood3.name=Плита из дерева +tile.rpslab.wool.black.name=Плита из черной шерсти +tile.rpslab.wool.blue.name=Плита из синей шерсти +tile.rpslab.wool.brown.name=Плита из коричневой шерсти +tile.rpslab.wool.cyan.name=Плита из бирюзовой шерсти +tile.rpslab.wool.gray.name=Плита из серой шерсти +tile.rpslab.wool.green.name=Плита из зеленой шерсти +tile.rpslab.wool.lightBlue.name=Плита из голубой шерсти +tile.rpslab.wool.lime.name=Плита из лаймовой шерсти +tile.rpslab.wool.magenta.name=Плита из пурпурной шерсти +tile.rpslab.wool.orange.name=Плита из оранжевой шерсти +tile.rpslab.wool.pink.name=Плита из розовой шерсти +tile.rpslab.wool.purple.name=Плита из фиолетовой шерсти +tile.rpslab.wool.red.name=Плита из красной шерсти +tile.rpslab.wool.silver.name=Плита из светло-серой шерсти +tile.rpslab.wool.white.name=Плита из белой шерсти +tile.rpslab.wool.yellow.name=Плита из желтой шерсти +tile.rpslabc.basalt.name=Угол плиты из базальта +tile.rpslabc.basaltBrick.name=Угол плиты из базальтового кирпича +tile.rpslabc.basaltCircle.name=Угол плиты из резного базальтового кирпича +tile.rpslabc.basaltCobble.name=Угол плиты из базальтового булыжника +tile.rpslabc.basaltPaver.name=Угол плиты из базальтового асфальта +tile.rpslabc.books.name=Угол плиты из книжной полки +tile.rpslabc.brick.name=Угол плиты из кирпича +tile.rpslabc.clay.name=Угол плиты из глины +tile.rpslabc.cobble.name=Угол плиты из булыжника +tile.rpslabc.copperBlock.name=Угол плиты из блока меди +tile.rpslabc.diamond.name=Угол плиты из алмазного блока +tile.rpslabc.dirt.name=Угол плиты из земли +tile.rpslabc.emeraldBlock.name=Угол плиты из изумрудного блока +tile.rpslabc.glass.name=Угол плиты из стекла +tile.rpslabc.gold.name=Угол плиты из золотого блока +tile.rpslabc.greenSapphireBlock.name=Угол плиты из блока зеленого сапфира +tile.rpslabc.iron.name=Угол плиты из блока железа +tile.rpslabc.lapis.name=Угол плиты из лазуритового блока +tile.rpslabc.marble.name=Угол плиты из мрамора +tile.rpslabc.marbleBrick.name=Угол плиты из мраморного кирпича +tile.rpslabc.moss.name=Угол плиты из булыжника со мхом +tile.rpslabc.netherbrick.name=Угол плиты из адского кирпича +tile.rpslabc.netherrack.name=Угол плиты из адского камня +tile.rpslabc.obsidian.name=Угол плиты из обсидиана +tile.rpslabc.planks.name=Угол покрытия из досок +tile.rpslabc.planks1.name=Угол плиты из досок +tile.rpslabc.planks2.name=Угол плиты из досок +tile.rpslabc.planks3.name=Угол плиты из досок +tile.rpslabc.pumpkin.name=Угол плиты из тыквы +tile.rpslabc.rplog.name=Угол плиты из каучукового дерева +tile.rpslabc.rubyBlock.name=Угол плиты из рубинового блока +tile.rpslabc.sandstone.name=Угол плиты из песчаника +tile.rpslabc.sandstone1.name=Угол плиты из песчаника +tile.rpslabc.sandstone2.name=Угол плиты из песчаника +tile.rpslabc.sapphireBlock.name=Угол плиты из сапфирового блока +tile.rpslabc.silverBlock.name=Угол плиты из блока серебра +tile.rpslabc.slab.name=Угол плиты из каменных ступенек +tile.rpslabc.snow.name=Угол плиты из снега +tile.rpslabc.soul.name=Угол плиты из песка душ +tile.rpslabc.stone.name=Угол плиты из камня +tile.rpslabc.stonebrick.name=Угол плиты из каменного кирпича +tile.rpslabc.stonebrick1.name=Угол плиты из каменного кирпича +tile.rpslabc.stonebrick2.name=Угол плиты из каменного кирпича +tile.rpslabc.stonebrick3.name=Угол плиты из каменного кирпича +tile.rpslabc.tinBlock.name=Угол плиты из блока олова +tile.rpslabc.tungstenBlock.name=Угол плиты из блока вольфрама +tile.rpslabc.wood.name=Угол плиты из дерева +tile.rpslabc.wood1.name=Угол плиты из дерева +tile.rpslabc.wood2.name=Угол плиты из дерева +tile.rpslabc.wood3.name=Угол плиты из дерева +tile.rpslabc.wool.black.name=Угол плиты из черной шерсти +tile.rpslabc.wool.blue.name=Угол плиты из синей шерсти +tile.rpslabc.wool.brown.name=Угол плиты из коричневой шерсти +tile.rpslabc.wool.cyan.name=Угол плиты из бирюзовой шерсти +tile.rpslabc.wool.gray.name=Угол плиты из серой шерсти +tile.rpslabc.wool.green.name=Угол плиты из зеленой шерсти +tile.rpslabc.wool.lightBlue.name=Угол плиты из голубой шерсти +tile.rpslabc.wool.lime.name=Угол плиты из лаймовой шерсти +tile.rpslabc.wool.magenta.name=Угол плиты из пурпурной шерсти +tile.rpslabc.wool.orange.name=Угол плиты из оранжевой шерсти +tile.rpslabc.wool.pink.name=Угол плиты из розовой шерсти +tile.rpslabc.wool.purple.name=Угол плиты из фиолетовой шерсти +tile.rpslabc.wool.red.name=Угол плиты из красной шерсти +tile.rpslabc.wool.silver.name=Угол плиты из светло-серой шерсти +tile.rpslabc.wool.white.name=Угол плиты из белой шерсти +tile.rpslabc.wool.yellow.name=Угол плиты из желтой шерсти +tile.rpslabs.basalt.name=Рейка плиты из базальта +tile.rpslabs.basaltBrick.name=Рейка плиты из базальтового кирпича +tile.rpslabs.basaltCircle.name=Рейка плиты из резного базальтового кирпича +tile.rpslabs.basaltCobble.name=Рейка плиты из базальтового булыжника +tile.rpslabs.basaltPaver.name=Рейка плиты из базальтового асфальта +tile.rpslabs.books.name=Рейка плиты из книжной полки +tile.rpslabs.brick.name=Рейка плиты из кирпича +tile.rpslabs.clay.name=Рейка плиты из глины +tile.rpslabs.cobble.name=Рейка плиты из булыжника +tile.rpslabs.copperBlock.name=Рейка плиты из блока меди +tile.rpslabs.diamond.name=Рейка плиты из алмазного блока +tile.rpslabs.dirt.name=Рейка плиты из земли +tile.rpslabs.emeraldBlock.name=Рейка плиты из изумрудного блока +tile.rpslabs.glass.name=Рейка плиты из стекла +tile.rpslabs.gold.name=Рейка плиты из блока золота +tile.rpslabs.greenSapphireBlock.name=Рейка плиты из блока зеленого сапфира +tile.rpslabs.iron.name=Рейка плиты из блока железа +tile.rpslabs.lapis.name=Рейка плита из лазуритового блока +tile.rpslabs.marble.name=Рейка плиты из мрамора +tile.rpslabs.marbleBrick.name=Рейка плиты из мраморного кирпича +tile.rpslabs.moss.name=Рейка плиты из булыжника со мхом +tile.rpslabs.netherbrick.name=Рейка плиты из адского кирпича +tile.rpslabs.netherrack.name=Рейка плиты из адского камня +tile.rpslabs.obsidian.name=Рейка плиты из обсидиана +tile.rpslabs.planks.name=Рейка плиты из дерева +tile.rpslabs.planks1.name=Рейка плиты из досок +tile.rpslabs.planks2.name=Рейка плиты из досок +tile.rpslabs.planks3.name=Рейка плиты из досок +tile.rpslabs.pumpkin.name=Рейка плиты из тыквы +tile.rpslabs.rplog.name=Рейка плиты из каучукового дерева +tile.rpslabs.rubyBlock.name=Рейка плиты из рубинового блока +tile.rpslabs.sandstone.name=Рейка плиты из песчаника +tile.rpslabs.sandstone1.name=Рейка плиты из песчаника +tile.rpslabs.sandstone2.name=Рейка плиты из песчаника +tile.rpslabs.sapphireBlock.name=Рейка плиты сапфирового блока +tile.rpslabs.silverBlock.name=Рейка плиты из блока серебра +tile.rpslabs.slab.name=Рейка плиты из каменных ступенек +tile.rpslabs.snow.name=Рейка плиты из снега +tile.rpslabs.soul.name=Рейка плиты из песка душ +tile.rpslabs.stone.name=Рейка плиты из камня +tile.rpslabs.stonebrick.name=Рейка плиты из каменного кирпича +tile.rpslabs.stonebrick1.name=Рейка плиты из каменного кирпича +tile.rpslabs.stonebrick2.name=Рейка плиты из каменного кирпича +tile.rpslabs.stonebrick3.name=Рейка плиты из каменного кирпича +tile.rpslabs.tungstenBlock.name=Рейка плиты из блока вольфрама +tile.rpslabs.wood.name=Рейка плиты из дерева +tile.rpslabs.wood1.name=Рейка плиты из дерева +tile.rpslabs.wood2.name=Рейка плиты из дерева +tile.rpslabs.wood3.name=Рейка плиты из дерева +tile.rpslabs.wool.black.name=Рейка плиты из черной шерсти +tile.rpslabs.wool.blue.name=Рейка плиты из синей шерсти +tile.rpslabs.wool.brown.name=Рейка плиты из коричневой шерсти +tile.rpslabs.wool.cyan.name=Рейка плиты из бирюзовой шерсти +tile.rpslabs.wool.gray.name=Рейка плиты из серой шерсти +tile.rpslabs.wool.green.name=Рейка плиты из зеленой шерсти +tile.rpslabs.wool.lightBlue.name=Рейка плиты из голубой шерсти +tile.rpslabs.wool.lime.name=Рейка плиты из лаймовой шерсти +tile.rpslabs.wool.magenta.name=Рейка плиты из пурпурной шерсти +tile.rpslabs.wool.orange.name=Рейка плиты из оранжевой шерсти +tile.rpslabs.wool.pink.name=Рейка плиты из розовой шерсти +tile.rpslabs.wool.purple.name=Рейка плиты из фиолетовой шерсти +tile.rpslabs.wool.red.name=Рейка плиты из красной шерсти +tile.rpslabs.wool.silver.name=Рейка плиты из светло-серой шерсти +tile.rpslabs.wool.white.name=Рейка плиты из белой шерсти +tile.rpslabs.wool.yellow.name=Рейка плиты из желтой шерсти \ No newline at end of file diff --git a/src/main/resources/assets/rpcore/textures/blocks/missing.png b/src/main/resources/assets/rpcore/textures/blocks/missing.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/lang/en_US.lang b/src/main/resources/assets/rplighting/lang/en_US.lang new file mode 100644 index 0000000..4cd1e16 --- /dev/null +++ b/src/main/resources/assets/rplighting/lang/en_US.lang @@ -0,0 +1,103 @@ +itemGroup.RPLights=RedPower Lighting + +tile.rplamp.black.name=Black Lamp +tile.rplamp.blue.name=Blue Lamp +tile.rplamp.brown.name=Brown Lamp +tile.rplamp.cyan.name=Cyan Lamp +tile.rplamp.gray.name=Gray Lamp +tile.rplamp.green.name=Green Lamp +tile.rplamp.lightBlue.name=Light Blue Lamp +tile.rplamp.lime.name=Lime Lamp +tile.rplamp.magenta.name=Magenta Lamp +tile.rplamp.orange.name=Orange Lamp +tile.rplamp.pink.name=Pink Lamp +tile.rplamp.purple.name=Purple Lamp +tile.rplamp.red.name=Red Lamp +tile.rplamp.silver.name=Light Gray Lamp +tile.rplamp.white.name=White Lamp +tile.rplamp.yellow.name=Yellow Lamp + +tile.rpshlamp.black.name=Black Fixture +tile.rpshlamp.blue.name=Blue Fixture +tile.rpshlamp.brown.name=Brown Fixture +tile.rpshlamp.cyan.name=Cyan Fixture +tile.rpshlamp.gray.name=Gray Fixture +tile.rpshlamp.green.name=Green Fixture +tile.rpshlamp.lightBlue.name=Light Blue Fixture +tile.rpshlamp.lime.name=Lime Fixture +tile.rpshlamp.magenta.name=Magenta Fixture +tile.rpshlamp.orange.name=Orange Fixture +tile.rpshlamp.pink.name=Pink Fixture +tile.rpshlamp.purple.name=Purple Fixture +tile.rpshlamp.red.name=Red Fixture +tile.rpshlamp.silver.name=Light Gray Fixture +tile.rpshlamp.white.name=White Fixture +tile.rpshlamp.yellow.name=Yellow Fixture + +tile.rpilamp.black.name=Inverted Black Lamp +tile.rpilamp.blue.name=Inverted Blue Lamp +tile.rpilamp.brown.name=Inverted Brown Lamp +tile.rpilamp.cyan.name=Inverted Cyan Lamp +tile.rpilamp.gray.name=Inverted Gray Lamp +tile.rpilamp.green.name=Inverted Green Lamp +tile.rpilamp.lightBlue.name=Inverted Light Blue Lamp +tile.rpilamp.lime.name=Inverted Lime Lamp +tile.rpilamp.magenta.name=Inverted Magenta Lamp +tile.rpilamp.orange.name=Inverted Orange Lamp +tile.rpilamp.pink.name=Inverted Pink Lamp +tile.rpilamp.purple.name=Inverted Purple Lamp +tile.rpilamp.red.name=Inverted Red Lamp +tile.rpilamp.silver.name=Inverted Light Gray Lamp +tile.rpilamp.white.name=Inverted White Lamp +tile.rpilamp.yellow.name=Inverted Yellow Lamp + +tile.rpishlamp.black.name=Inverted Black Fixture +tile.rpishlamp.blue.name=Inverted Blue Fixture +tile.rpishlamp.brown.name=Inverted Brown Fixture +tile.rpishlamp.cyan.name=Inverted Cyan Fixture +tile.rpishlamp.gray.name=Inverted Gray Fixture +tile.rpishlamp.green.name=Inverted Green Fixture +tile.rpishlamp.lightBlue.name=Inverted Light Blue Fixture +tile.rpishlamp.lime.name=Inverted Lime Fixture +tile.rpishlamp.magenta.name=Inverted Magenta Fixture +tile.rpishlamp.orange.name=Inverted Orange Fixture +tile.rpishlamp.pink.name=Inverted Pink Fixture +tile.rpishlamp.purple.name=Inverted Purple Fixture +tile.rpishlamp.red.name=Inverted Red Fixture +tile.rpishlamp.silver.name=Inverted Light Gray Fixture +tile.rpishlamp.white.name=Inverted White Fixture +tile.rpishlamp.yellow.name=Inverted Yellow Fixture + +tile.rpshlamp2.black.name=Black Cage Lamp +tile.rpshlamp2.blue.name=Blue Cage Lamp +tile.rpshlamp2.brown.name=Brown Cage Lamp +tile.rpshlamp2.cyan.name=Cyan Cage Lamp +tile.rpshlamp2.gray.name=Gray Cage Lamp +tile.rpshlamp2.green.name=Green Cage Lamp +tile.rpshlamp2.lightBlue.name=Light Blue Cage Lamp +tile.rpshlamp2.lime.name=Lime Cage Lamp +tile.rpshlamp2.magenta.name=Magenta Cage Lamp +tile.rpshlamp2.orange.name=Orange Cage Lamp +tile.rpshlamp2.pink.name=Pink Cage Lamp +tile.rpshlamp2.purple.name=Purple Cage Lamp +tile.rpshlamp2.red.name=Red Cage Lamp +tile.rpshlamp2.silver.name=Light Gray Cage Lamp +tile.rpshlamp2.white.name=White Cage Lamp +tile.rpshlamp2.yellow.name=Yellow Cage Lamp + +tile.rpishlamp2.black.name=Inverted Black Cage Lamp +tile.rpishlamp2.blue.name=Inverted Blue Cage Lamp +tile.rpishlamp2.brown.name=Inverted Brown Cage Lamp +tile.rpishlamp2.cyan.name=Inverted Cyan Cage Lamp +tile.rpishlamp2.gray.name=Inverted Gray Cage Lamp +tile.rpishlamp2.green.name=Inverted Green Cage Lamp +tile.rpishlamp2.lightBlue.name=Inverted Light Blue Cage Lamp +tile.rpishlamp2.lime.name=Inverted Lime Cage Lamp +tile.rpishlamp2.magenta.name=Inverted Magenta Cage Lamp +tile.rpishlamp2.orange.name=Inverted Orange Cage Lamp +tile.rpishlamp2.pink.name=Inverted Pink Cage Lamp +tile.rpishlamp2.purple.name=Inverted Purple Cage Lamp +tile.rpishlamp2.red.name=Inverted Red Cage Lamp +tile.rpishlamp2.silver.name=Inverted Light Gray Cage Lamp +tile.rpishlamp2.white.name=Inverted White Cage Lamp +tile.rpishlamp2.yellow.name=Inverted Yellow Cage Lamp \ No newline at end of file diff --git a/src/main/resources/assets/rplighting/lang/ru_RU.lang b/src/main/resources/assets/rplighting/lang/ru_RU.lang new file mode 100644 index 0000000..19f207c --- /dev/null +++ b/src/main/resources/assets/rplighting/lang/ru_RU.lang @@ -0,0 +1,103 @@ +itemGroup.RPLights=RedPower - Освещение + +tile.rplamp.black.name=Чераня лампа +tile.rplamp.blue.name=Синяя лампа +tile.rplamp.brown.name=Коричневая лампа +tile.rplamp.cyan.name=Бирюзовая лампа +tile.rplamp.gray.name=Серая лампа +tile.rplamp.green.name=Зеленая лампа +tile.rplamp.lightBlue.name=Голубая лампа +tile.rplamp.lime.name=Лаймовая лампа +tile.rplamp.magenta.name=Сиреневая лампа +tile.rplamp.orange.name=Оранжевая лампа +tile.rplamp.pink.name=Розовая лампа +tile.rplamp.purple.name=Фиолетовая лампа +tile.rplamp.red.name=Красная лампа +tile.rplamp.silver.name=Светло-серая лампа +tile.rplamp.white.name=Белая лампа +tile.rplamp.yellow.name=Желтая лампа + +tile.rpshlamp.black.name=Черный светильник +tile.rpshlamp.blue.name=Синий светильник +tile.rpshlamp.brown.name=Коричневый светильник +tile.rpshlamp.cyan.name=Бирюзовый светильник +tile.rpshlamp.gray.name=Серый светильник +tile.rpshlamp.green.name=Зеленый светильник +tile.rpshlamp.lightBlue.name=Голубой светильник +tile.rpshlamp.lime.name=Лаймовый светильник +tile.rpshlamp.magenta.name=Сиреневый светильник +tile.rpshlamp.orange.name=Оранжевый светильник +tile.rpshlamp.pink.name=Розовый светильник +tile.rpshlamp.purple.name=Фиолетовый светильник +tile.rpshlamp.red.name=Красный светильник +tile.rpshlamp.silver.name=Светло-серый светильник +tile.rpshlamp.white.name=Белый светильник +tile.rpshlamp.yellow.name=Желтый светильник + +tile.rpilamp.black.name=Инвертированная черная лампа +tile.rpilamp.blue.name=Инвертированная синяя лампа +tile.rpilamp.brown.name=Инвертированная коричневая лампа +tile.rpilamp.cyan.name=Инвертированная бирюзовая лампа +tile.rpilamp.gray.name=Инвертированная серая лампа +tile.rpilamp.green.name=Инвертированная зеленая лампа +tile.rpilamp.lightBlue.name=Инвертированная голубая лампа +tile.rpilamp.lime.name=Инвертированная лаймовая лампа +tile.rpilamp.magenta.name=Инвертированная сиреневая лампа +tile.rpilamp.orange.name=Инвертированная оранжевая лампа +tile.rpilamp.pink.name=Инвертированная розовая лампа +tile.rpilamp.purple.name=Инвертированная фиолетовая лампа +tile.rpilamp.red.name=Инвертированная красная лампа +tile.rpilamp.silver.name=Инвертированная светло-серая лампа +tile.rpilamp.white.name=Инвертированная белая лампа +tile.rpilamp.yellow.name=Инвертированная желтая лампа + +tile.rpishlamp.black.name=Инвертированный черный светильник +tile.rpishlamp.blue.name=Инвертированный синий светильник +tile.rpishlamp.brown.name=Инвертированный коричневый светильник +tile.rpishlamp.cyan.name=Инвертированный бирюзовый светильник +tile.rpishlamp.gray.name=Инвертированный серый светильник +tile.rpishlamp.green.name=Инвертированный зеленый светильник +tile.rpishlamp.lightBlue.name=Инвертированный голубой светильник +tile.rpishlamp.lime.name=Инвертированный лаймовый светильник +tile.rpishlamp.magenta.name=Инвертированный сиреневый светильник +tile.rpishlamp.orange.name=Инвертированный оранжевый светильник +tile.rpishlamp.pink.name=Инвертированный розовый светильник +tile.rpishlamp.purple.name=Инвертированный фиолетовый светильник +tile.rpishlamp.red.name=Инвертированный красный светильник +tile.rpishlamp.silver.name=Инвертированный светло-серый светильник +tile.rpishlamp.white.name=Инвертированный белый светильник +tile.rpishlamp.yellow.name=Инвертированный желтый светильник + +tile.rpshlamp2.black.name=Черная лампа в клетке +tile.rpshlamp2.blue.name=Синяя лампа в клетке +tile.rpshlamp2.brown.name=Коричневая лампа в клетке +tile.rpshlamp2.cyan.name=Бирюзовая лампа в клетке +tile.rpshlamp2.gray.name=Серая лампа в клетке +tile.rpshlamp2.green.name=Зеленая лампа в клетке +tile.rpshlamp2.lightBlue.name=Голубая лампа в клетке +tile.rpshlamp2.lime.name=Лаймовая лампа в клетке +tile.rpshlamp2.magenta.name=Сиреневая лампа в клетке +tile.rpshlamp2.orange.name=Оранжевая лампа в клетке +tile.rpshlamp2.pink.name=Розовая лампа в клетке +tile.rpshlamp2.purple.name=Фиолетовая лампа в клетке +tile.rpshlamp2.red.name=Красная лампа в клетке +tile.rpshlamp2.silver.name=Светло-серая лампа в клетке +tile.rpshlamp2.white.name=Белая лампа в клетке +tile.rpshlamp2.yellow.name=Желтая лампа в клетке + +tile.rpishlamp2.black.name=Инвертированная черная лампа в клетке +tile.rpishlamp2.blue.name=Инвертированная синяя лампа в клетке +tile.rpishlamp2.brown.name=Инвертированная коричневая лампа в клетке +tile.rpishlamp2.cyan.name=Инвертированная бирюзовая лампа в клетке +tile.rpishlamp2.gray.name=Инвертированная серая лампа в клетке +tile.rpishlamp2.green.name=Инвертированная зеленая лампа в клетке +tile.rpishlamp2.lightBlue.name=Инвертированная голубая лампа в клетке +tile.rpishlamp2.lime.name=Инвертированная лаймовая лампа в клетке +tile.rpishlamp2.magenta.name=Инвертированная сиреневая лампа в клетке +tile.rpishlamp2.orange.name=Инвертированная оранжевая лампа в клетке +tile.rpishlamp2.pink.name=Инвертированная розовая лампа в клетке +tile.rpishlamp2.purple.name=Инвертированная фиолетовая лампа в клетке +tile.rpishlamp2.red.name=Инвертированная красная лампа в клетке +tile.rpishlamp2.silver.name=Инвертированная светло-серая лампа в клетке +tile.rpishlamp2.white.name=Инвертированная белая лампа в клетке +tile.rpishlamp2.yellow.name=Инвертированная желтая лампа в клетке \ No newline at end of file diff --git a/src/main/resources/assets/rplighting/models/shlamp.png b/src/main/resources/assets/rplighting/models/shlamp.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ca282ed3c90e61c3d12aa93fb32f29235531f3 GIT binary patch literal 2715 zcmeH|c~nzp7Qi1`4pmC&R4p7@v7=Q46*vit5+Df>*~7jk>fFOiTLm@*8BcPBrMW7f$`ofuMPd)9N{@t11_wKvz-0!~o?)~of zotN#3wpBZ*br1jmHG4Z7cK}cVAC-W2_k)VS_VonSI}u1{BmgwztL}s-1HgX3)yWeD z+941K6bdymGBP$cHZd_VH8nkd{``dt7tGAeU@(}uxw(afg{7q>91bVIQxOOR5{b03 zva+_ewz086p->kuUbMBfwX?Icx3_n2aBy^VbaHZXc6LUi(Jn47uCA_bZf@@G?j9Z< z-k$E>-rl~RZb3dCe*S*`{{GkiKTLo>27|$3vACcBTrd_F5*Qj9iVF?KhlSw6Lc_zu z@pybhL_{PmEHW}ODk|y{;SzyBh>nhqiHRW+iLtS?F5~QlKy1M$y+qduCyZ4m>7K^127VCaZ zO%1!2&8`KhtE*GUg9i`l>+2gqnwpxMn;$A@X=!a~ZEJ07YinEgI4ERyw1@nE8^B{r^@%w0r$+jQ`o_2n z2o3<0#r8HxPio*AL+az{rJ1Q4RYubML=%w}Vr5k8q^HIyFvB^&cN1YrFb0_3E=^3HL`tI<7jwl~b>3DBCH+$2OsGb3&>*^h6a-z;#T@dGW9c zUaEBl@aOd({Nkg=hJCj)qS-*?-#>oKw4}6r=XWQ5>szIAJNJ)+{Njt!pmY8Dic@=|H$n;`nQ3Y1BgZV_ob?Kwv4=c4Q4MSPB6FWaOj z2)4DpGbKb%g#X?=?#1iN_xn?|Wh+N>l?&DSKJ=O@#`THS!dREXS9#s4mSr^A-6uh7 zv*G!N98VDgxondC!XkYh^Y4`63llbS`IBDc=P-2_uH5B@_R*ClU&D4+ZevFWM0;r4 z;PBcpnE4LvfjV9!-R$m`2CNE*tJo!)52uj%pTZg#WZCic_kV(Qn|5``vMBy%XDB<* zZ+)+xELoZN9%y$(B_w#=VTVHy@^7uH)rea?e6fpV($@8eRY7h0_&PCG$J8S)@bqcs z8FZ2groCPt%RC!@EG>O^H|Py~LNz_yQLm=vL&b9?)=+KAV5x6GYoxNu-kr)6~H6%Gt86eNKhh$i26r@sDpU&&HnqB$wSl5pDET zwf=Kf_|1f@qVLM5U*lz{eq5d$)uf7)Q2o2nS{otPO shWY=Kd#fXVV&%R_4Ye2+wwoiTcAF5io zTrLFse#BxiM59rJ!x7wuZV?QI;HU3ipBFdY8(e!laJ${$`Cpfpusa+un-vIuz>jvj zjrDqs<#LJne1Yj~hVgie;b?@xV1RzVk8Y<+b1l5SzM|1+AesDw^Ye3vSnN*1+wB$~ zA0K#sf5&FC!D_X_V!6Pa9-B-i^x)yKUbhQPtK#C~0wNl{lggjrHN%SqW;#3?k(<4f zE<0(XQmMe{bV7t95iH2||H=oLl!wDFFvlnrOZY)Oh}%#I)9Fly*Z-8KIxLmn2=49S z7Mj#SzEFVOZifg4gR-#I`m61+EKpZwxYN<$CTjH>a=F~DM1LTFAz5UY3!6@L<>6kr zhYl&X2yQfYu%>BH)eNjQ8-&m2lkLvt2it=^Oqm&GvdGC8WmVZI-Q2aVu9cz zVVex^Y=3H-Y`0pp_hv)Ftjz6~N+qOHDV&|2LU=sa=+LlS6)W?eWnr9|VX|E#n3T)q zGQmX@3VC@*irEa|zPgg_vhv$Lb7!|IzPK9OrlYBpD<~42CpeeOBJuo;lap@{eA_(C znOS+Cxha)vl({OEi?sKAK96iRi;Suw9*@Ihq6hfL;DQde^}=*`mzk9dQd!NYczH?V z@$msh<1vK8VW&LFUB(J$EJ>SL+OtYZ+%^}+Gl@h3Pfu|?5Pbjp9tMK}LQxcar-S%O zKL+16pC?}!ABoLsh2_j5+g21aWj-O>CK!*65}M{P)#V zcjiuRRIAm(!1obF5yCLUcs#*qI6@E%;m7ZL{T{l#E;^nE*L6XDv(bR*D(Z7pM1IIN539%T@!&n^*C9a}^)&UJ>5ATbJ=R#-p)?a=8o@MN<*~ zIq2c{eiy$UcI5fztS!R`4kPriPxn^w>P8LqdL1eZr{bIxpUpfGe*2f?>vluZB$K>c zucBJ5LX9UAAb70#xR1gH>H1B+} z{eS0q@#~v486YM4gMql{!WKCb?{BY2`xLXlC({Z_mIc-C_r)n0JGnEVKi!*+x(r}} zhhYV#X+rTxNTzsEZ0$@johfF42NMg$r6nlO>j*g+o8LKkG&(kg#Pc;r4#_AKpxky_ z$aE&=V^geSAH`ypN9>PE$mcIX@wQ3U&RVS7Cg^&!b}oJz**J^~+#8z6<>CSSG3YcO zJ6RY9XlJ(ncv8kJC?cE9Ksk;r`^b*#=R0aAlG!#3BZsl+ygMjjqnSZEorW?D1C{t7 zYVnW3+va)l!gwTBsRXlVO527}hti3=+JvTQlU`5^P182FwrNxp6?LJA=u$xiM3mbCbm{W9ZO=>_AVB3| z9@@3P*)#i0M61<;?|F#h7*P~qFc_jA_7MajJo$gm?V;Q2qT@KQZ5yPYw=5W@2~|}f zJm16P+q+nCe&MBkie>u*%dKO)m_NdE>k!ZG?qg|g4^QrVm%49QoZZ2r*{=xox2RMq z5OF+Wc&+yrtKC0%-TBSGU$uYAhSQrZG`7%eHX)*D#LoYNsnV0|;z9ij>h(IrU^ry) zG?<;OgA`0_+^>B`P39o_VaQ^F$2m+Nn_-y)We}SiFbo4C2m%)0UdD4Z^k?7?zw35bYD~c+2 kF3PbB$mjA5XEGW51OF$87fPI7?*IS*07*qoM6N<$f+|t}Q2+n{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/11.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/11.png new file mode 100644 index 0000000000000000000000000000000000000000..8613809aa6202e3f61c59e89eef6aae274868593 GIT binary patch literal 528 zcmV+r0`L8aP)ti2j?G2RWSf1}nI8FZ`Nq!@a zf63=C{Q2TxwmpYsSzuYVE1h40sh+}gkFTCM7qD%g ziU5z$Y_-6A-*34A+)J3!rvps$Ew(l{!CZGD zh0jM-!pqM6{zutAEfQB0u+exduesXuvh)1Gxqy4U_t5oyG#anKO#lyU8_1DugH7i=J z7JSb`6h#Qb5Tnr;!@&?iFn}lDd;K1|y)HVgi*~yW>c2ieVLJ{?(}3`N586Q*4<{Mi zA7^lPys7H;XcISw8-H~zHPmVOG_LaNDDJGFUavz$(T{>l#Vj5RTdHES*pOyPLz-Rg zuc6s&LWJRu5+>nfnrSeT(4f(1K#a!YKZ8X&$75XVt>InnK@0~2+)2?S%(q!EcW}O& zf^FLnK@ce6qMZpdJ`L0oJ>OTNd7YI(0%o1%QmEEy5dD5%2^WEr2B*1ISe6CBBT)uZ zU={n|Kg*4H#|D+kGX!s&;(2hg zGndCIY_FhPmInM76i>#UG>AJB=KM6!^(P3&u~nQ|ohW8e!yg{r~^~07*qo IM6N<$f_7ocumAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/13.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/13.png new file mode 100644 index 0000000000000000000000000000000000000000..4e860b490df040cc8e34bd785e89aeec7d6e0d8f GIT binary patch literal 486 zcmV@P)mrV0 zL{Ws@F2pw2!uJEX{C?wXu->e(vTazF1=7!FGnnHsbX@~;Jr}A|#Qna8MpQ*3tfJ0O zZL6Xh@Z*sKN6*uq<0h@@Lq=M;PF}7vSwj>{*DZg1Oj@ zW8u_nA`C;YG+jurN+v;-OiAwBzmuGB9o=phY&M@uaG7&ijbkCu5j(KyWFmoOvv@Ihh7L(Cctq7i=^dNvE>T^m6BO zK_&qja9^v#wrwyv5(1aS&Yg)&&P1jG_p}XItrl1m?MSd1`$oKCXO(;;2BbscrU^FK z-j?99*hJ1_6Pebh0T=Ze45JA~w@u*O`9JbuvmpnZZ>&Stg#i5+1TMx_2UDGiOasnp zYtXa?SP=NKkJ?dnA}|d`7>b?N*CjbxT|u>41>>BfEe@h5ehj*8I#0SVIuh4$U|Y6a nn{!iiHbiV4T0@iMN~MA?+UQ58Yy%Fw00000NkvXXu0mjfM3my6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/15.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/15.png new file mode 100644 index 0000000000000000000000000000000000000000..16d9166d45f03b7538d280bdca8e3c80545798ef GIT binary patch literal 395 zcmV;60d)R}P)4X0rk1`Atv00#}0ddJVc2|xAOq76sjJn`A z+z=S$?kuqFG068lJ)jqg$DOL9*25sD)9GL|8iAygcvpq^R6hoHo9oF9k}@P){`gET@ z5rsklRmXwnd1$p-Xf&Fr*XnTH8XWpwu`4K7$|zYDOw$C{pXT$>4FjsGKsZ$gH6N`}d44lBpDgZQIh_ZFt-5ZJ5tDJRVSkJ9Mdm zrfCoy5-w&qe5zn<2KlivKQ{1+a&WM}4`Ep)OsM$lsREeB-oSUH%7#o?U;w;2wU1GsDSaGp9xJWdVx$KWx; zWBVs-_@6S}o#7tAf5^bI^Ne3F$qT^5&Q)W@{}5bjEczs0000< KMNUMnLSTYMiUs}v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/3.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b5850582fd6ef4b9d54660a6c52038c90eda87e1 GIT binary patch literal 609 zcmV-n0-pVeP)kc14u{K;x1M^c#u5>^!vRH7!NlvJT{N|eSyS0GU8m`9 zSbh6DLlX$So>{+d?Y;Io%;)nVEXznF5>QnYu~;0@NEC_^fy}=LLqSXjr!f@>!0-2i z^fxCa;BvcRwMt-eSccYkgXYe6tZ#kATKfxDH$P*gb%}cGBbL|Sqqh1E)y4%XE9WTJ zU!%D65)aaQa5|k}iNuV6+nwLo-2a7*y`O09{y=m48`ie;#~K@-_=EpE_V5CE?G#?G z7fe-Wg!BL5%O02}&Q+enA+< vyB)SMn@C%dtbAt+AKMJmh)KW(g8_d4W^4I1^c~eu00000NkvXXu0mjfcB34R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/4.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/4.png new file mode 100644 index 0000000000000000000000000000000000000000..c71c89f4aecf1312ae0f37ca1ae8aac1496f0138 GIT binary patch literal 561 zcmV-10?z%3P)r=wOWJC-GRWm}V2*Prgsbp!;iZ}S@at-lk(cE5HjPXs z1J-CZF`t?LIB$Y!jczB6H1C1cYc(O<2tR*?2mM{#-009W4Xj$Niv1RTi2*!bcOL$Q z@9(p?zSg`F?Mg)mR|{Kr9tQ0XJeUf+x=JCTs$k`ES%|0f`8L7)(-C}kmlXwGUM8U^ z3K$&;#oQEo)tTUKH;wai74e-NFv~i?kchpE8Use)K+8;ow7#Opf`eCJ^2PDdATyPXmRo}9!Hjq(BXW02FA*lUFavB{a> ziwhOU$8kg=TVT4biG9|0Z2Mwrn+hXMtEJ$SNB_m)qoZ#Khr?i!Bq7BQBFldax@|g7 zx-dEtHIaZ4S47*AB=enPJa!b3t%!g_p%8upY(<~PW$Qfl00000NkvXXu0mjfCo2Mi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/5.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1146176ca173cb7159ab832e265858ec70cdeaed GIT binary patch literal 600 zcmV-e0;m0nP)b>TP_lxPb^UPN!9fP6j=nqS@B zjZ``fRaGF&l8Nb8HJtr5jQJm%ar)aPoccP1lb;50;^QEWzaPNSxBZxrGcWB(%$*=!cV zb*rr00)MYNk#K_(36qn34?Scu83?CRVcYGL8UC=L0j4u1@3~kZa}Z_Q#@v^o7Uj8s z^09XVn0?dVkip)&6{J!r2+OkgKFXn;?PmDk(>0j5?JS09mP%}KNm;t_ZTrgf0t6p^ zz6eu*yKj~ePb44=!(b)KVaawKrkj1(S3dB#j|1Fw!-l455L6Pf8N4|d*!0U0{-o2UUhCKq``=su1~}9v%*+-E5nb37)LO6yWyD z24b;g5Y%lNZibtc>D?#pIM{Qm%mI#G)Dex!1@vQ(Qp;1-VgF`dnc$t*EsQJ_5s7p_ zq|+(Br`<56O@YzOjw>ccFX;@|W>z5_4nru4g5|OhE9H+t-KKg{!>A;QcpO@n#%U{x mDsPTS+fhV1A`FK@A^Zp7)z=_}A{_Vt0000dLh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/6.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/6.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2be5d33b286676901851d295468f6c1014f2eb GIT binary patch literal 604 zcmV-i0;BzjP)OiilC!U|}v>&2!m2&snS0->^I1 zce{1H)$3W`@9h2UvyX_!gBpLd$4)I(-aVtu8({&*9_3D&EhZ!P~|uysod{)$B>Us2<0&nGVlAo@(P^ zrG<<8ClL;ZAq-=f;UAq1d|zJ2xAq#oE_Lx`@jN~?SLKCg@ow%kUua$SyxPIN(gI?! z7(}r+%*u9nt7XC;e!*`VE7Hw&CwEKph(@Cj`9gt*oyvCjUu)bxGKXC<2a(HWd1og~ zXTOze+u=u(OSo~k4pmhlbY18DoXYl{o$!OBi?}{EYlf(0GOS_+_CMt(Q_C`a6Q%&K z9;zZ33PGgPX;!k^W@U$Mf;Z*!-7hyez$*u55C{Yys3c_5dV8mBQ@O=3DHBWqUOF(1 zzTRGlWO9%P?N3GTY*)5y-E&(K5VVc>#S4vgx$FS^1+(wk>6XFU$ScMoRE_ zdLSYZmG`mlXjh`NDKMHL+v|JF=#EUFT^NPi?S@bk1v_OScFT`J-KKg{!>A;oU=V@6 q0H>`eez~(x+V;ZJ<6+q4a^WX=I_oIr(=*=y00002%O;x6x{~xY(>2C_`!H`z143mStl$n?dBc zGWY`r->~PYZZ0r&Vp$fZ(<#L9bYkJX@)`EZure^D zL6Rg8S(dT*H|*a`Rnx>)Oe}tghCgJ^=OR%9}n!i@7q1TfJ^kcBWfAHCWU|lDJD!SbVh{+`3 zcFHqe+9a_8bkXI fL-(P}Fok^qk4EzeOk)G;00000NkvXXu0mjfDaq#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOff/8.png b/src/main/resources/assets/rplighting/textures/blocks/lampOff/8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7dcf4829ec847fc68739c2d2162697a3ded629 GIT binary patch literal 550 zcmV+>0@?kEP)L5QXd4dGy#iVzHBrxWV>h(ldt zzu%*(DwJi3q9~AOIn||FXt&$JaU9I&bBHwEY501*;&Qp*d_Mnec03)aVU5G#Kn=TQ zMV{+PSF067lI(QxJ=`#S?BJ@RX}%}Pd6JA8#8@tu5V2A?(%An~);8$5huH?_^ow#3 zGK#3MzQN6ta@8uA1Q#958H8a7(=;LYg#$Y^k7Mt3fH&nQSS1QU5VRrs^ukIn%GI}W z@dC4d-}f+`%^*C_)9F5XzQK2%8Rk7vDy9Y!%uOZ}2woB%vm5&{?R%J&`H@n>bzOYC zzeCve78w=mU&YG&pPxM|f>jGj8R-Cdk&N*e!rE+fF)Nq<^h{&Z(!?@Gbb~oSUhUE7 z2L$gn7qjPAWu+fhj`V%ButzttA>rYW8t`Fo@iUy<;MQ}e?0a-zu15_l3_?3DN#Ic*M%Yqr}hYph4`ey;N9l+^A0*qdf4knYlA}?x2>-CDJ58 zRaGd<5}VByMP4AwawPH|#Sy|NM6h0CwOWDr#nTh~$po(JKqYB{P8{Q6w?kJ3bhrF% zVHXALJjYp<;Vez@GcmYM6yZl0;`m{X@pueXRXa_-dV9mw>nko_UT`UHnt}g^75l?Z z#nEgwgDOh{JV=(6+D^VdKVv$bLTv;@+nl>s$5 z))|~gn7;2rWdb1hBeIMhYPT!Ty1p*zQC8r#Y zMo_VQq|N=E4Y}F5Rt`0p0e*XYgy(rsED2RUy1N+=$$)T=%m9z)bKKtCK&{t-2J%!| zx!yVE&LoR+uuo=yERy58P%C+)%_eQCH;rp6lgt3W-rr*|_yxso6Wl%(-%bM)SewiM zkM8c!@5=!GF&I!|+XQxq%m9z1#=YJ()MVnzJ`V@M42&4srZUN2hC|r44dplveoG<# z$|JkYda_|G$w)xnt*6s=99MQ8i0wXl*F8e2+wwoiTcAF5io zTrLFse#BxiM59rJ!x7wuZV?QI;HU3ipBFdY8(e!laJ${$`Cpfpusa+un-vIuz>jvj zjrDqs<#LJne1Yj~hVgie;b?@xV1RzVk8Y<+b1l5SzM|1+AesDw^Ye3vSnN*1+wB$~ zA0K#sf5&FC!D_X_V!6Pa9-B-i^x)yKUbhQPtK#C~0wNl{lggjrHN%SqW;#3?k(<4f zE<0(XQmMe{bV7t95iH2||H=oLl!wDFFvlnrOZY)Oh}%#I)9Fly*Z-8KIxLmn2=49S z7Mj#SzEFVOZifg4gR-#I`m61+EKpZwxYN<$CTjH>a=F~DM1LTFAz5UY3!6@L<>6kr zhYl&X2yQfYu%>BH)eNjQ8-&m2lkLvt2it=^Oqm&GvdGC8WmVZI-Q2aVu9cz zVVex^Y=3H-Y`0pp_hv)Ftjz6~N+qOHDV&|2LU=sa=+LlS6)W?eWnr9|VX|E#n3T)q zGQmX@3VC@*irEa|zPgg_vhv$Lb7!|IzPK9OrlYBpD<~42CpeeOBJuo;lap@{eA_(C znOS+Cxha)vl({OEi?sKAK96iRi;Suw9*@Ihq6hfL;DQde^}=*`mzk9dQd!NYczH?V z@$msh<1vK8VW&LFUB(J$EJ>SL+OtYZ+%^}+Gl@h3Pfu|?5Pbjp9tMK}LQxcar-S%O zKL+16pC?}!ABoLsh2_j5+g21aWj-O>CK!*65r|Do+8rkqwxsaqit*rhZqb7VE^Nd4TPNzeBXma zlL(((!Brsm*%17w3of+IeZiS0IIRi3YMoTY^nG#!AGKbr2-@v7Bu#e={HG=Ot@W#! ziCt1G7o-@g5c{HH@7D#rUJsHaJI2|DuX6Z%4u8{0&Xy*5rvlw>7cyTgjLWjK4WD{9 z*En1iJk%UyHl5Ldb@X>k};NCq!5Cjk&37ZMuHukZ5 z4bz$M;hNy(T|uK>hYW{Xrr92w?`$7UF*ZTg+tuulJl}^5HaAT(ompn=Jg@>bV=H*D zmZi@CcguoWtqS37v$=3Cb}rH;OxFW~TCWw}(|WD~uB!t4G3c~BwjCG+3g>+d@0ITV z?2f>3Dv(YmH2atxt!6s$shBncW6$nN=KNIQCnZ6-T!wg_hX;BPkMzgjZSy>NVLXyn tvx%S)n6y35*PUxRwhO1?7`Rj_;V(mQ53J#ErhEVZ002ovPDHLkV1i8|1kL~e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOn/10.png b/src/main/resources/assets/rplighting/textures/blocks/lampOn/10.png new file mode 100644 index 0000000000000000000000000000000000000000..83e980bf7fd935d671766b9dc640a8a4d50f1eb2 GIT binary patch literal 546 zcmV+-0^R+IP)#^JIQuGhDw%BMk z>H8iL4ny9-8D0F~2ENh3S98A5#%GrC$(#>d$9tnWH|H&HTbgJU(VR8O= z36?R6IOIK(1ID9~ic?r}NMYx%wsTl=IN>S|*l09}D2mkS|IX)g_*Cb&FiS%WheH)! z@BHqwXSG%%27`f$uZHus1uo%@!ZN=U2!eo+B@yw}u(X}tdk!CIfn_}B zW~D;(dOIpyyehfp9G13o=OSL20B5>Lp6?Ug?QLyS;PR!JQ|A;uR_E0@Y~iIT@Pw|r zLC9{4ICsvjDho{DLj%f5;T62#Ej*^2vWGP6Z0SqE51yKm0#O(Y4$2QoocOBd4_-)5~-%F(FxHvPJ?G9Sa7Cf&Bm)_UvHLTUvuv)F6QmKIX%S%ge3I$k}3E?(e7{)c? z@pr;2;f3%_c!Cjsq;L0xJHid&if~D|KrFV4d_E5m1nWvXHT6aKr00*&>}|*_K4K>2 z8A_!RgzvM#>p$YBkxH(~-~`2D5u)Acgyg@(ocu5(<~F44VS(l#TFquiW-((_Je;iO za6tw~a2yB1^SqG!Uvhtl(l{f7Lp?;d(NM&3ag=;JkQ|9m30-7!If#0_uE@WO2g~O5 zormHct+5N+wjuaPnEbn#q4(YwpM(Z`n46u2s8&}MaeP&gm?z#(mhxEj&xd4M7DQ!b z1-i`9o^`TR$=o+5Yq69EWU!4)W(I<9Ta(9o)m7^dD1Tcu4kWC0-3HkAM`a!4^g2kaPNpCYXPdc3r#=egz ziV%h&X0th_lPQ8=0$;xmM??G!e=z9x(d~9Y{&%|#uhD?x*bsm0!%7QYP6f}3+zL+_ z!D9^l|DYhxIuYC}u8sutdL0r)3nR{-30_x-&0<5EtqoUZ*_5EwYC*zqVTeg_vduOz zo6w-yY(i%9`PyKgq2-WBySU&+UbNiwFDPPgG#v!>GubQ zyj7e`Jy{9~E|7<0I}W7V>lyN{+HvJLnPM)G2Bp$FgttxdPVq)Emq%QxL9wU?d>ABe z)=s7;lPTu>mxqEv;SJJgc&5&-B$5eo2qs^s`20ZMPd*Q^Z5tnY5MTN*c-uTrUKo$0 uR;|LVxMth7?dZ%UtzAUntzg8KW#JbZgqhbDn*tdC0000VF>YWHyik?6&%L~rCACyAv~N}HLD_+q7$oN<*baA zlJc1`>qsy@2+QRX)HLTd{LA`beX|;^pcE7Ji$#PW2tajxZjCp>gOltD>-8E`R+Z{9 z7#8W*2njFDflfsMvm6LZ=dOE?fw?32z7NXtT$%5NCD?WE!lLa3Vwz>jd<9ls!ud7W(i-(U%bE6c*DwP#zX-1Df@Dcl7kz9A>jknR&1OS14h sxKFO4ZQBmtdB$T;VNEO*9*su$0~M00)UbaLFaQ7m07*qoM6N<$g1p|qK>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOn/14.png b/src/main/resources/assets/rplighting/textures/blocks/lampOn/14.png new file mode 100644 index 0000000000000000000000000000000000000000..7350b67e8e36fc6ee2820d7f51786574818a1b4e GIT binary patch literal 485 zcmV5%I4$ax_Q+0SqE11S61yCB%K-_w7^5?jeI?6g|`>ua@pgk7&2s@I4Pv z6d?>lj7DP&2SWtG03Lns^?T^{y4ZGIbUGa{f3wwsQ?J9aObE~SaJiJiOE!&X!Xx2< za8I}++-6g_AzTrMc^8CpLX=6NR;xio(L{&6GF4ugb2fl zBU1E}BLZi`u7>&o0JTG~=M*7DZM}&3iK@0~2Nt`F1C1<~Pa6oVz2Ox-mFW4tO!_NXjjqI8;2s%Ns#S=7zc1VUzVlaM43&Hq8*qWUWMJDi z1Rn{LlfO!(s$>>(GK;yu9Wp4FN)WEQEy?=W*T3wniw~Ekhh$n7L}zPDl4r?rx-M2@ zvzXiG0w;uGaTS7Zo5?EqKkhxnI00000NkvXXu0mjfPo&OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOn/15.png b/src/main/resources/assets/rplighting/textures/blocks/lampOn/15.png new file mode 100644 index 0000000000000000000000000000000000000000..16d9166d45f03b7538d280bdca8e3c80545798ef GIT binary patch literal 395 zcmV;60d)R}P)4X0rk1`Atv00#}0ddJVc2|xAOq76sjJn`A z+z=S$?kuqFG068lJ)jqg$DOL9*25sD)9GL|8iAygcvpq^R6hoHo9oF9%A_P)1RCD1>KVuc8Bjf>A^sis;clc&DmKoS1nmdef)A zx>dJti$bA*s%4?m>A<#aG@C6n>J8Ltby##?u9R_HKE_e0gkrG>u0Pn{hnda7Fmwp3 zYGD$dV6Cn3tUcpNUExuE!ctvgt}ZZBXLwK_Fbz+s?hbc!oUnuQ&;>G?3`D2Xmhk(R zcf4tDc-3Ccd_E6h+ih9wht~mkA*bg;bt@f_aTAF_3}KokM6FhnN4 z7rw^+pUNAXK|ZX^hYh@-9PI7xLX=8Jq%!@>Q+Y6ty@9Vunc<-_kU`Q71EP3% zDBWe{*&ky&5*|}%JmmqwY+yHZhD72k1ZSIzgFAa}GwdmQa4*!y>Gmn&acaOHgU1Yx z?YQu7<)MW81pg!hPqt4Gi|s&UvnK6x{%J=~iHq57HjHb!p)Srync?Th|TRIYDE`5!;DLI1-8A7qnJU$^eikRR91007*qo IM6N<$f_)1KIsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOn/3.png b/src/main/resources/assets/rplighting/textures/blocks/lampOn/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ed87620d8b6268570ca48881c58fb4b37ba2ad GIT binary patch literal 602 zcmV-g0;TclB5Jl(f{Ak`R$C9;KvaQ6MWO6n9b&xPNqnb2_m{5jYk-ch8Tn)f*=6b_qts;t_w|5 zA)+`!ZTJe?voG+bpU|9qq;ri%{2ulA9o*SY!%M2WfE}L0>Yrh2`!Q_WhRCvo zgxlE#) zFoR=ia0Ior3&SuVI3!%m@a9uVctGzSo=KRM*?qmYL}lj*^lB9%39pzm+GZKJwT&bol@Fz|+S;T2ccC=yK~YK&uItb~ zkMbRT-f_7a^FS)G+iV!ul)Z;ixkT_C{Vs~dB7~}{s8JxA^f5Tw98XRdhr}{X7`h?d oR#lC5uF%+JC?!S0g+c*80R=^qM;<)+XD`oDMcezt4u~;lp^uM>Zn8{`tk6VOYwfXP> zE*9Wy22Q8ocmj?_;PZ=mp25dQa5#Y0-QRI zZU(AhHX%WL?0dnod;j=?Jan5VM?^CRV`dDEa*J& z+wXg@6nK6PCQ~V*QmJV1L_Xgt*f`(Zcm`Z`f6 z?Qk&sf7_q1aTZt#ltZ%OaiX}rt;GUA`LTUxKelo18dwT!AAzyh4?=ER#KE2W#@XMw z+x6g1$1Cvg5R69E0QoV*>09hTVSa3J7WniOJU9R&ku@Tl&FFoCJ9dm%+LppZ({6)D zD*7J<@9%@*aG0c)I5JmgzcuMh-7=cDu2ur~{IbduMVv+Sb{sm{N#917&cu9=6#7kl)mC85VbkE2x z3Ca&sDuzCNZ(p^j)oP(1hDeeGaU5eb8e=#ZB8mnG`M%rhV!gYLwN3}^b{kUvWMu_@ z5WsO1DC~!D4+)QN`1~RSR|Nl(u=Ima|IX)>;2jfcTqAXhU-|44N-z1pdL5J`8yar@ zBP{>r^M}y*&CRa4nKYDU=V`;VnKvakpP6YkL2tL%I+0b1MK)OA6! zBw{l+b0#qNTV7dUHQ_yY#rM@JsMA@~#o4sI?92l1rpg};Z10#wQjP;^udeFiY}#|S zMVVoHV$zoY7oPKPy8@EkmSTZL`3{~@w)wqR-t&2D0(|t8pJi?!ABHI9Y>V0000=)U6o$_;c|%KEC>^-u%2kjA64InVRfa$dAxzEl^bH(VyVN?{YPEG%oT|&^GyLv- zlGrTl#kqjBzw-}gM>LyF^c)AC=V3e^V>ldP&>z5c`*7(0PPc>Y&NjB%ZP>OAo^RCa zFf9wJsz5kB2d9Y&&XybazEsCoI+LXuKBcbV1D*GaSMfHviPy=hoO_ih<9J~M`!hut zh5_MuI}-l0+QRP@8^2bX_({KiEZ6Z(URcBD)OC4bc-b4e>~P*fwOWN3k9VYU6g~^! zF9H0K-Ap-oHgBR_E<+4QBRM>+9EC56@nmit8`Ogs^!u2kY60B%2T!8Pi&40Om(;<- zIRmC?Lb$Fg^Gz#9GfS9`50~+L!NP-h$uH6A^`uHz*#F9#Qu&0=aR47u{)4ykz0*|rZq4d6#qATN@lst|UoC2g|uyD)R|eB&5CqNQQw#{_fxT;N`;fPDT6 z1n)Kvb7o&Td@8>%hFMv{aRc`W<^pfUROE7W0e={5^W1h=m=A}UL*;{69d{}J&6t90 zb`8R^OqnN|k%vPiZkr3^nZ20;Zj2%O;x6x{~xY(>2C_`!H`z143mStl$n?dBc zGWY`r->~PYZZ0r&Vp$fZ(<#L9bYkJX@)`EZure^D zL6Rg8S(dT*H|*a`Rnx>)Oe}tghCgJ^=OR%9}n!i@7q1TfJ^kcBWfAHCWU|lDJD!SbVh{+`3 zcFHqe+9a_8bkXI fL-(P}Fok^qk4EzeOk)G;00000NkvXXu0mjfDaq#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/lampOn/8.png b/src/main/resources/assets/rplighting/textures/blocks/lampOn/8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7dcf4829ec847fc68739c2d2162697a3ded629 GIT binary patch literal 550 zcmV+>0@?kEP)L5QXd4dGy#iVzHBrxWV>h(ldt zzu%*(DwJi3q9~AOIn||FXt&$JaU9I&bBHwEY501*;&Qp*d_Mnec03)aVU5G#Kn=TQ zMV{+PSF067lI(QxJ=`#S?BJ@RX}%}Pd6JA8#8@tu5V2A?(%An~);8$5huH?_^ow#3 zGK#3MzQN6ta@8uA1Q#958H8a7(=;LYg#$Y^k7Mt3fH&nQSS1QU5VRrs^ukIn%GI}W z@dC4d-}f+`%^*C_)9F5XzQK2%8Rk7vDy9Y!%uOZ}2woB%vm5&{?R%J&`H@n>bzOYC zzeCve78w=mU&YG&pPxM|f>jGj8R-Cdk&N*e!rE+fF)Nq<^h{&Z(!?@Gbb~oSUhUE7 z2L$gn7qjPAWu+fhj`V%ButzttA>rYW8t`Fo@iUy<;MQ}e?0a-zu15_l3_?3DN#Ic*M%Yqr}hYph4`ey;N9l+6P)Nkl#$Wf413)qSvZ|u9}QS`gxWVc1E!eI}cO(vP_R5qIpvNT0iRX84x*zXT0 zixPQWAk})D#E9Yu;l~HI+bxJ+uU7Db0Iusm(kz7}3FLHwXahO$93W*0DGErQL$XYP zH7<@JQ3RPUFdmN~RdurDuP?~wC**u)@v33ntZX$?N7Lz)m>PJGtRww#vfE)YnLzdg z(e_PpVNZJu&Er*bP-g|Z+$K{wS8|h8oY)LBOyBo;pIh+1GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))e2+wwoiTcAF5io zTrLFse#BxiM59rJ!x7wuZV?QI;HU3ipBFdY8(e!laJ${$`Cpfpusa+un-vIuz>jvj zjrDqs<#LJne1Yj~hVgie;b?@xV1RzVk8Y<+b1l5SzM|1+AesDw^Ye3vSnN*1+wB$~ zA0K#sf5&FC!D_X_V!6Pa9-B-i^x)yKUbhQPtK#C~0wNl{lggjrHN%SqW;#3?k(<4f zE<0(XQmMe{bV7t95iH2||H=oLl!wDFFvlnrOZY)Oh}%#I)9Fly*Z-8KIxLmn2=49S z7Mj#SzEFVOZifg4gR-#I`m61+EKpZwxYN<$CTjH>a=F~DM1LTFAz5UY3!6@L<>6kr zhYl&X2yQfYu%>BH)eNjQ8-&m2lkLvt2it=^Oqm&GvdGC8WmVZI-Q2aVu9cz zVVex^Y=3H-Y`0pp_hv)Ftjz6~N+qOHDV&|2LU=sa=+LlS6)W?eWnr9|VX|E#n3T)q zGQmX@3VC@*irEa|zPgg_vhv$Lb7!|IzPK9OrlYBpD<~42CpeeOBJuo;lap@{eA_(C znOS+Cxha)vl({OEi?sKAK96iRi;Suw9*@Ihq6hfL;DQde^}=*`mzk9dQd!NYczH?V z@$msh<1vK8VW&LFUB(J$EJ>SL+OtYZ+%^}+Gl@h3Pfu|?5Pbjp9tMK}LQxcar-S%O zKL+16pC?}!ABoLsh2_j5+g21aWj-O>CK!*65}M{P)#V zcjiuRRIAm(!1obF5yCLUcs#*qI6@E%;m7ZL{T{l#E;^nE*L6XDv(bR*D(Z7pM1IIN539%T@!&n^*C9a}^)&UJ>5ATbJ=R#-p)?a=8o@MN<*~ zIq2c{eiy$UcI5fztS!R`4kPriPxn^w>P8LqdL1eZr{bIxpUpfGe*2f?>vluZB$K>c zucBJ5LX9UAAb70#xR1gH>H1B+} z{eS0q@#~v486YM4gMql{!WKCb?{BY2`xLXlC({Z_mIc-C_r)n0JGnEVKi!*+x(r}} zhhYV#X+rTxNTzsEZ0$@johfF42NMg$r6nlO>j*g+o8LKkG&(kg#Pc;r4#_AKpxky_ z$aE&=V^geSAH`ypN9>PE$mcIX@wQ3U&RVS7Cg^&!b}oJz**J^~+#8z6<>CSSG3YcO zJ6RY9XlJ(ncv8kJC?cE9Ksk;r`^b*#=R0aAlG!#3BZsl+ygMjjqnSZEorW?D1C{t7 zYVnW3+va)l!gwTBsRXlVO527}hti3=+JvTQlU`5^P182FwrNxp6?LJA=u$xiM3mbCbm{W9ZO=>_AVB3| z9@@3P*)#i0M61<;?|F#h7*P~qFc_jA_7MajJo$gm?V;Q2qT@KQZ5yPYw=5W@2~|}f zJm16P+q+nCe&MBkie>u*%dKO)m_NdE>k!ZG?qg|g4^QrVm%49QoZZ2r*{=xox2RMq z5OF+Wc&+yrtKC0%-TBSGU$uYAhSQrZG`7%eHX)*D#LoYNsnV0|;z9ij>h(IrU^ry) zG?<;OgA`0_+^>B`P39o_VaQ^F$2m+Nn_-y)We}SiFbo4C2m%)0UdD4Z^k?7?zw35bYD~c+2 kF3PbB$mjA5XEGW51OF$87fPI7?*IS*07*qoM6N<$f+|t}Q2+n{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/11.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/11.png new file mode 100644 index 0000000000000000000000000000000000000000..8613809aa6202e3f61c59e89eef6aae274868593 GIT binary patch literal 528 zcmV+r0`L8aP)ti2j?G2RWSf1}nI8FZ`Nq!@a zf63=C{Q2TxwmpYsSzuYVE1h40sh+}gkFTCM7qD%g ziU5z$Y_-6A-*34A+)J3!rvps$Ew(l{!CZGD zh0jM-!pqM6{zutAEfQB0u+exduesXuvh)1Gxqy4U_t5oyG#anKO#lyU8_1DugH7i=J z7JSb`6h#Qb5Tnr;!@&?iFn}lDd;K1|y)HVgi*~yW>c2ieVLJ{?(}3`N586Q*4<{Mi zA7^lPys7H;XcISw8-H~zHPmVOG_LaNDDJGFUavz$(T{>l#Vj5RTdHES*pOyPLz-Rg zuc6s&LWJRu5+>nfnrSeT(4f(1K#a!YKZ8X&$75XVt>InnK@0~2+)2?S%(q!EcW}O& zf^FLnK@ce6qMZpdJ`L0oJ>OTNd7YI(0%o1%QmEEy5dD5%2^WEr2B*1ISe6CBBT)uZ zU={n|Kg*4H#|D+kGX!s&;(2hg zGndCIY_FhPmInM76i>#UG>AJB=KM6!^(P3&u~nQ|ohW8e!yg{r~^~07*qo IM6N<$f_7ocumAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/13.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/13.png new file mode 100644 index 0000000000000000000000000000000000000000..4e860b490df040cc8e34bd785e89aeec7d6e0d8f GIT binary patch literal 486 zcmV@P)mrV0 zL{Ws@F2pw2!uJEX{C?wXu->e(vTazF1=7!FGnnHsbX@~;Jr}A|#Qna8MpQ*3tfJ0O zZL6Xh@Z*sKN6*uq<0h@@Lq=M;PF}7vSwj>{*DZg1Oj@ zW8u_nA`C;YG+jurN+v;-OiAwBzmuGB9o=phY&M@uaG7&ijbkCu5j(KyWFmoOvv@Ihh7L(Cctq7i=^dNvE>T^m6BO zK_&qja9^v#wrwyv5(1aS&Yg)&&P1jG_p}XItrl1m?MSd1`$oKCXO(;;2BbscrU^FK z-j?99*hJ1_6Pebh0T=Ze45JA~w@u*O`9JbuvmpnZZ>&Stg#i5+1TMx_2UDGiOasnp zYtXa?SP=NKkJ?dnA}|d`7>b?N*CjbxT|u>41>>BfEe@h5ehj*8I#0SVIuh4$U|Y6a nn{!iiHbiV4T0@iMN~MA?+UQ58Yy%Fw00000NkvXXu0mjfM3my6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/15.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/15.png new file mode 100644 index 0000000000000000000000000000000000000000..16d9166d45f03b7538d280bdca8e3c80545798ef GIT binary patch literal 395 zcmV;60d)R}P)4X0rk1`Atv00#}0ddJVc2|xAOq76sjJn`A z+z=S$?kuqFG068lJ)jqg$DOL9*25sD)9GL|8iAygcvpq^R6hoHo9oF9k}@P){`gET@ z5rsklRmXwnd1$p-Xf&Fr*XnTH8XWpwu`4K7$|zYDOw$C{pXT$>4FjsGKsZ$gH6N`}d44lBpDgZQIh_ZFt-5ZJ5tDJRVSkJ9Mdm zrfCoy5-w&qe5zn<2KlivKQ{1+a&WM}4`Ep)OsM$lsREeB-oSUH%7#o?U;w;2wU1GsDSaGp9xJWdVx$KWx; zWBVs-_@6S}o#7tAf5^bI^Ne3F$qT^5&Q)W@{}5bjEczs0000< KMNUMnLSTYMiUs}v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/3.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b5850582fd6ef4b9d54660a6c52038c90eda87e1 GIT binary patch literal 609 zcmV-n0-pVeP)kc14u{K;x1M^c#u5>^!vRH7!NlvJT{N|eSyS0GU8m`9 zSbh6DLlX$So>{+d?Y;Io%;)nVEXznF5>QnYu~;0@NEC_^fy}=LLqSXjr!f@>!0-2i z^fxCa;BvcRwMt-eSccYkgXYe6tZ#kATKfxDH$P*gb%}cGBbL|Sqqh1E)y4%XE9WTJ zU!%D65)aaQa5|k}iNuV6+nwLo-2a7*y`O09{y=m48`ie;#~K@-_=EpE_V5CE?G#?G z7fe-Wg!BL5%O02}&Q+enA+< vyB)SMn@C%dtbAt+AKMJmh)KW(g8_d4W^4I1^c~eu00000NkvXXu0mjfcB34R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/4.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..c71c89f4aecf1312ae0f37ca1ae8aac1496f0138 GIT binary patch literal 561 zcmV-10?z%3P)r=wOWJC-GRWm}V2*Prgsbp!;iZ}S@at-lk(cE5HjPXs z1J-CZF`t?LIB$Y!jczB6H1C1cYc(O<2tR*?2mM{#-009W4Xj$Niv1RTi2*!bcOL$Q z@9(p?zSg`F?Mg)mR|{Kr9tQ0XJeUf+x=JCTs$k`ES%|0f`8L7)(-C}kmlXwGUM8U^ z3K$&;#oQEo)tTUKH;wai74e-NFv~i?kchpE8Use)K+8;ow7#Opf`eCJ^2PDdATyPXmRo}9!Hjq(BXW02FA*lUFavB{a> ziwhOU$8kg=TVT4biG9|0Z2Mwrn+hXMtEJ$SNB_m)qoZ#Khr?i!Bq7BQBFldax@|g7 zx-dEtHIaZ4S47*AB=enPJa!b3t%!g_p%8upY(<~PW$Qfl00000NkvXXu0mjfCo2Mi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/5.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1146176ca173cb7159ab832e265858ec70cdeaed GIT binary patch literal 600 zcmV-e0;m0nP)b>TP_lxPb^UPN!9fP6j=nqS@B zjZ``fRaGF&l8Nb8HJtr5jQJm%ar)aPoccP1lb;50;^QEWzaPNSxBZxrGcWB(%$*=!cV zb*rr00)MYNk#K_(36qn34?Scu83?CRVcYGL8UC=L0j4u1@3~kZa}Z_Q#@v^o7Uj8s z^09XVn0?dVkip)&6{J!r2+OkgKFXn;?PmDk(>0j5?JS09mP%}KNm;t_ZTrgf0t6p^ zz6eu*yKj~ePb44=!(b)KVaawKrkj1(S3dB#j|1Fw!-l455L6Pf8N4|d*!0U0{-o2UUhCKq``=su1~}9v%*+-E5nb37)LO6yWyD z24b;g5Y%lNZibtc>D?#pIM{Qm%mI#G)Dex!1@vQ(Qp;1-VgF`dnc$t*EsQJ_5s7p_ zq|+(Br`<56O@YzOjw>ccFX;@|W>z5_4nru4g5|OhE9H+t-KKg{!>A;QcpO@n#%U{x mDsPTS+fhV1A`FK@A^Zp7)z=_}A{_Vt0000dLh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/6.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/6.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2be5d33b286676901851d295468f6c1014f2eb GIT binary patch literal 604 zcmV-i0;BzjP)OiilC!U|}v>&2!m2&snS0->^I1 zce{1H)$3W`@9h2UvyX_!gBpLd$4)I(-aVtu8({&*9_3D&EhZ!P~|uysod{)$B>Us2<0&nGVlAo@(P^ zrG<<8ClL;ZAq-=f;UAq1d|zJ2xAq#oE_Lx`@jN~?SLKCg@ow%kUua$SyxPIN(gI?! z7(}r+%*u9nt7XC;e!*`VE7Hw&CwEKph(@Cj`9gt*oyvCjUu)bxGKXC<2a(HWd1og~ zXTOze+u=u(OSo~k4pmhlbY18DoXYl{o$!OBi?}{EYlf(0GOS_+_CMt(Q_C`a6Q%&K z9;zZ33PGgPX;!k^W@U$Mf;Z*!-7hyez$*u55C{Yys3c_5dV8mBQ@O=3DHBWqUOF(1 zzTRGlWO9%P?N3GTY*)5y-E&(K5VVc>#S4vgx$FS^1+(wk>6XFU$ScMoRE_ zdLSYZmG`mlXjh`NDKMHL+v|JF=#EUFT^NPi?S@bk1v_OScFT`J-KKg{!>A;oU=V@6 q0H>`eez~(x+V;ZJ<6+q4a^WX=I_oIr(=*=y00002%O;x6x{~xY(>2C_`!H`z143mStl$n?dBc zGWY`r->~PYZZ0r&Vp$fZ(<#L9bYkJX@)`EZure^D zL6Rg8S(dT*H|*a`Rnx>)Oe}tghCgJ^=OR%9}n!i@7q1TfJ^kcBWfAHCWU|lDJD!SbVh{+`3 zcFHqe+9a_8bkXI fL-(P}Fok^qk4EzeOk)G;00000NkvXXu0mjfDaq#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line1/8.png b/src/main/resources/assets/rplighting/textures/blocks/out/line1/8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7dcf4829ec847fc68739c2d2162697a3ded629 GIT binary patch literal 550 zcmV+>0@?kEP)L5QXd4dGy#iVzHBrxWV>h(ldt zzu%*(DwJi3q9~AOIn||FXt&$JaU9I&bBHwEY501*;&Qp*d_Mnec03)aVU5G#Kn=TQ zMV{+PSF067lI(QxJ=`#S?BJ@RX}%}Pd6JA8#8@tu5V2A?(%An~);8$5huH?_^ow#3 zGK#3MzQN6ta@8uA1Q#958H8a7(=;LYg#$Y^k7Mt3fH&nQSS1QU5VRrs^ukIn%GI}W z@dC4d-}f+`%^*C_)9F5XzQK2%8Rk7vDy9Y!%uOZ}2woB%vm5&{?R%J&`H@n>bzOYC zzeCve78w=mU&YG&pPxM|f>jGj8R-Cdk&N*e!rE+fF)Nq<^h{&Z(!?@Gbb~oSUhUE7 z2L$gn7qjPAWu+fhj`V%ButzttA>rYW8t`Fo@iUy<;MQ}e?0a-zu15_l3_?3DN#Ic*M%Yqr}hYph4`ey;N9l+^A0*qdf4knYlA}?x2>-CDJ58 zRaGd<5}VByMP4AwawPH|#Sy|NM6h0CwOWDr#nTh~$po(JKqYB{P8{Q6w?kJ3bhrF% zVHXALJjYp<;Vez@GcmYM6yZl0;`m{X@pueXRXa_-dV9mw>nko_UT`UHnt}g^75l?Z z#nEgwgDOh{JV=(6+D^VdKVv$bLTv;@+nl>s$5 z))|~gn7;2rWdb1hBeIMhYPT!Ty1p*zQC8r#Y zMo_VQq|N=E4Y}F5Rt`0p0e*XYgy(rsED2RUy1N+=$$)T=%m9z)bKKtCK&{t-2J%!| zx!yVE&LoR+uuo=yERy58P%C+)%_eQCH;rp6lgt3W-rr*|_yxso6Wl%(-%bM)SewiM zkM8c!@5=!GF&I!|+XQxq%m9z1#=YJ()MVnzJ`V@M42&4srZUN2hC|r44dplveoG<# z$|JkYda_|G$w)xnt*6s=99MQ8i0wXl*F8GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))e2+wwoiTcAF5io zTrLFse#BxiM59rJ!x7wuZV?QI;HU3ipBFdY8(e!laJ${$`Cpfpusa+un-vIuz>jvj zjrDqs<#LJne1Yj~hVgie;b?@xV1RzVk8Y<+b1l5SzM|1+AesDw^Ye3vSnN*1+wB$~ zA0K#sf5&FC!D_X_V!6Pa9-B-i^x)yKUbhQPtK#C~0wNl{lggjrHN%SqW;#3?k(<4f zE<0(XQmMe{bV7t95iH2||H=oLl!wDFFvlnrOZY)Oh}%#I)9Fly*Z-8KIxLmn2=49S z7Mj#SzEFVOZifg4gR-#I`m61+EKpZwxYN<$CTjH>a=F~DM1LTFAz5UY3!6@L<>6kr zhYl&X2yQfYu%>BH)eNjQ8-&m2lkLvt2it=^Oqm&GvdGC8WmVZI-Q2aVu9cz zVVex^Y=3H-Y`0pp_hv)Ftjz6~N+qOHDV&|2LU=sa=+LlS6)W?eWnr9|VX|E#n3T)q zGQmX@3VC@*irEa|zPgg_vhv$Lb7!|IzPK9OrlYBpD<~42CpeeOBJuo;lap@{eA_(C znOS+Cxha)vl({OEi?sKAK96iRi;Suw9*@Ihq6hfL;DQde^}=*`mzk9dQd!NYczH?V z@$msh<1vK8VW&LFUB(J$EJ>SL+OtYZ+%^}+Gl@h3Pfu|?5Pbjp9tMK}LQxcar-S%O zKL+16pC?}!ABoLsh2_j5+g21aWj-O>CK!*65r|Do+8rkqwxsaqit*rhZqb7VE^Nd4TPNzeBXma zlL(((!Brsm*%17w3of+IeZiS0IIRi3YMoTY^nG#!AGKbr2-@v7Bu#e={HG=Ot@W#! ziCt1G7o-@g5c{HH@7D#rUJsHaJI2|DuX6Z%4u8{0&Xy*5rvlw>7cyTgjLWjK4WD{9 z*En1iJk%UyHl5Ldb@X>k};NCq!5Cjk&37ZMuHukZ5 z4bz$M;hNy(T|uK>hYW{Xrr92w?`$7UF*ZTg+tuulJl}^5HaAT(ompn=Jg@>bV=H*D zmZi@CcguoWtqS37v$=3Cb}rH;OxFW~TCWw}(|WD~uB!t4G3c~BwjCG+3g>+d@0ITV z?2f>3Dv(YmH2atxt!6s$shBncW6$nN=KNIQCnZ6-T!wg_hX;BPkMzgjZSy>NVLXyn tvx%S)n6y35*PUxRwhO1?7`Rj_;V(mQ53J#ErhEVZ002ovPDHLkV1i8|1kL~e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line2/10.png b/src/main/resources/assets/rplighting/textures/blocks/out/line2/10.png new file mode 100644 index 0000000000000000000000000000000000000000..83e980bf7fd935d671766b9dc640a8a4d50f1eb2 GIT binary patch literal 546 zcmV+-0^R+IP)#^JIQuGhDw%BMk z>H8iL4ny9-8D0F~2ENh3S98A5#%GrC$(#>d$9tnWH|H&HTbgJU(VR8O= z36?R6IOIK(1ID9~ic?r}NMYx%wsTl=IN>S|*l09}D2mkS|IX)g_*Cb&FiS%WheH)! z@BHqwXSG%%27`f$uZHus1uo%@!ZN=U2!eo+B@yw}u(X}tdk!CIfn_}B zW~D;(dOIpyyehfp9G13o=OSL20B5>Lp6?Ug?QLyS;PR!JQ|A;uR_E0@Y~iIT@Pw|r zLC9{4ICsvjDho{DLj%f5;T62#Ej*^2vWGP6Z0SqE51yKm0#O(Y4$2QoocOBd4_-)5~-%F(FxHvPJ?G9Sa7Cf&Bm)_UvHLTUvuv)F6QmKIX%S%ge3I$k}3E?(e7{)c? z@pr;2;f3%_c!Cjsq;L0xJHid&if~D|KrFV4d_E5m1nWvXHT6aKr00*&>}|*_K4K>2 z8A_!RgzvM#>p$YBkxH(~-~`2D5u)Acgyg@(ocu5(<~F44VS(l#TFquiW-((_Je;iO za6tw~a2yB1^SqG!Uvhtl(l{f7Lp?;d(NM&3ag=;JkQ|9m30-7!If#0_uE@WO2g~O5 zormHct+5N+wjuaPnEbn#q4(YwpM(Z`n46u2s8&}MaeP&gm?z#(mhxEj&xd4M7DQ!b z1-i`9o^`TR$=o+5Yq69EWU!4)W(I<9Ta(9o)m7^dD1Tcu4kWC0-3HkAM`a!4^g2kaPNpCYXPdc3r#=egz ziV%h&X0th_lPQ8=0$;xmM??G!e=z9x(d~9Y{&%|#uhD?x*bsm0!%7QYP6f}3+zL+_ z!D9^l|DYhxIuYC}u8sutdL0r)3nR{-30_x-&0<5EtqoUZ*_5EwYC*zqVTeg_vduOz zo6w-yY(i%9`PyKgq2-WBySU&+UbNiwFDPPgG#v!>GubQ zyj7e`Jy{9~E|7<0I}W7V>lyN{+HvJLnPM)G2Bp$FgttxdPVq)Emq%QxL9wU?d>ABe z)=s7;lPTu>mxqEv;SJJgc&5&-B$5eo2qs^s`20ZMPd*Q^Z5tnY5MTN*c-uTrUKo$0 uR;|LVxMth7?dZ%UtzAUntzg8KW#JbZgqhbDn*tdC0000VF>YWHyik?6&%L~rCACyAv~N}HLD_+q7$oN<*baA zlJc1`>qsy@2+QRX)HLTd{LA`beX|;^pcE7Ji$#PW2tajxZjCp>gOltD>-8E`R+Z{9 z7#8W*2njFDflfsMvm6LZ=dOE?fw?32z7NXtT$%5NCD?WE!lLa3Vwz>jd<9ls!ud7W(i-(U%bE6c*DwP#zX-1Df@Dcl7kz9A>jknR&1OS14h sxKFO4ZQBmtdB$T;VNEO*9*su$0~M00)UbaLFaQ7m07*qoM6N<$g1p|qK>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line2/14.png b/src/main/resources/assets/rplighting/textures/blocks/out/line2/14.png new file mode 100644 index 0000000000000000000000000000000000000000..7350b67e8e36fc6ee2820d7f51786574818a1b4e GIT binary patch literal 485 zcmV5%I4$ax_Q+0SqE11S61yCB%K-_w7^5?jeI?6g|`>ua@pgk7&2s@I4Pv z6d?>lj7DP&2SWtG03Lns^?T^{y4ZGIbUGa{f3wwsQ?J9aObE~SaJiJiOE!&X!Xx2< za8I}++-6g_AzTrMc^8CpLX=6NR;xio(L{&6GF4ugb2fl zBU1E}BLZi`u7>&o0JTG~=M*7DZM}&3iK@0~2Nt`F1C1<~Pa6oVz2Ox-mFW4tO!_NXjjqI8;2s%Ns#S=7zc1VUzVlaM43&Hq8*qWUWMJDi z1Rn{LlfO!(s$>>(GK;yu9Wp4FN)WEQEy?=W*T3wniw~Ekhh$n7L}zPDl4r?rx-M2@ zvzXiG0w;uGaTS7Zo5?EqKkhxnI00000NkvXXu0mjfPo&OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line2/15.png b/src/main/resources/assets/rplighting/textures/blocks/out/line2/15.png new file mode 100644 index 0000000000000000000000000000000000000000..16d9166d45f03b7538d280bdca8e3c80545798ef GIT binary patch literal 395 zcmV;60d)R}P)4X0rk1`Atv00#}0ddJVc2|xAOq76sjJn`A z+z=S$?kuqFG068lJ)jqg$DOL9*25sD)9GL|8iAygcvpq^R6hoHo9oF9%A_P)1RCD1>KVuc8Bjf>A^sis;clc&DmKoS1nmdef)A zx>dJti$bA*s%4?m>A<#aG@C6n>J8Ltby##?u9R_HKE_e0gkrG>u0Pn{hnda7Fmwp3 zYGD$dV6Cn3tUcpNUExuE!ctvgt}ZZBXLwK_Fbz+s?hbc!oUnuQ&;>G?3`D2Xmhk(R zcf4tDc-3Ccd_E6h+ih9wht~mkA*bg;bt@f_aTAF_3}KokM6FhnN4 z7rw^+pUNAXK|ZX^hYh@-9PI7xLX=8Jq%!@>Q+Y6ty@9Vunc<-_kU`Q71EP3% zDBWe{*&ky&5*|}%JmmqwY+yHZhD72k1ZSIzgFAa}GwdmQa4*!y>Gmn&acaOHgU1Yx z?YQu7<)MW81pg!hPqt4Gi|s&UvnK6x{%J=~iHq57HjHb!p)Srync?Th|TRIYDE`5!;DLI1-8A7qnJU$^eikRR91007*qo IM6N<$f_)1KIsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line2/3.png b/src/main/resources/assets/rplighting/textures/blocks/out/line2/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ed87620d8b6268570ca48881c58fb4b37ba2ad GIT binary patch literal 602 zcmV-g0;TclB5Jl(f{Ak`R$C9;KvaQ6MWO6n9b&xPNqnb2_m{5jYk-ch8Tn)f*=6b_qts;t_w|5 zA)+`!ZTJe?voG+bpU|9qq;ri%{2ulA9o*SY!%M2WfE}L0>Yrh2`!Q_WhRCvo zgxlE#) zFoR=ia0Ior3&SuVI3!%m@a9uVctGzSo=KRM*?qmYL}lj*^lB9%39pzm+GZKJwT&bol@Fz|+S;T2ccC=yK~YK&uItb~ zkMbRT-f_7a^FS)G+iV!ul)Z;ixkT_C{Vs~dB7~}{s8JxA^f5Tw98XRdhr}{X7`h?d oR#lC5uF%+JC?!S0g+c*80R=^qM;<)+XD`oDMcezt4u~;lp^uM>Zn8{`tk6VOYwfXP> zE*9Wy22Q8ocmj?_;PZ=mp25dQa5#Y0-QRI zZU(AhHX%WL?0dnod;j=?Jan5VM?^CRV`dDEa*J& z+wXg@6nK6PCQ~V*QmJV1L_Xgt*f`(Zcm`Z`f6 z?Qk&sf7_q1aTZt#ltZ%OaiX}rt;GUA`LTUxKelo18dwT!AAzyh4?=ER#KE2W#@XMw z+x6g1$1Cvg5R69E0QoV*>09hTVSa3J7WniOJU9R&ku@Tl&FFoCJ9dm%+LppZ({6)D zD*7J<@9%@*aG0c)I5JmgzcuMh-7=cDu2ur~{IbduMVv+Sb{sm{N#917&cu9=6#7kl)mC85VbkE2x z3Ca&sDuzCNZ(p^j)oP(1hDeeGaU5eb8e=#ZB8mnG`M%rhV!gYLwN3}^b{kUvWMu_@ z5WsO1DC~!D4+)QN`1~RSR|Nl(u=Ima|IX)>;2jfcTqAXhU-|44N-z1pdL5J`8yar@ zBP{>r^M}y*&CRa4nKYDU=V`;VnKvakpP6YkL2tL%I+0b1MK)OA6! zBw{l+b0#qNTV7dUHQ_yY#rM@JsMA@~#o4sI?92l1rpg};Z10#wQjP;^udeFiY}#|S zMVVoHV$zoY7oPKPy8@EkmSTZL`3{~@w)wqR-t&2D0(|t8pJi?!ABHI9Y>V0000=)U6o$_;c|%KEC>^-u%2kjA64InVRfa$dAxzEl^bH(VyVN?{YPEG%oT|&^GyLv- zlGrTl#kqjBzw-}gM>LyF^c)AC=V3e^V>ldP&>z5c`*7(0PPc>Y&NjB%ZP>OAo^RCa zFf9wJsz5kB2d9Y&&XybazEsCoI+LXuKBcbV1D*GaSMfHviPy=hoO_ih<9J~M`!hut zh5_MuI}-l0+QRP@8^2bX_({KiEZ6Z(URcBD)OC4bc-b4e>~P*fwOWN3k9VYU6g~^! zF9H0K-Ap-oHgBR_E<+4QBRM>+9EC56@nmit8`Ogs^!u2kY60B%2T!8Pi&40Om(;<- zIRmC?Lb$Fg^Gz#9GfS9`50~+L!NP-h$uH6A^`uHz*#F9#Qu&0=aR47u{)4ykz0*|rZq4d6#qATN@lst|UoC2g|uyD)R|eB&5CqNQQw#{_fxT;N`;fPDT6 z1n)Kvb7o&Td@8>%hFMv{aRc`W<^pfUROE7W0e={5^W1h=m=A}UL*;{69d{}J&6t90 zb`8R^OqnN|k%vPiZkr3^nZ20;Zj2%O;x6x{~xY(>2C_`!H`z143mStl$n?dBc zGWY`r->~PYZZ0r&Vp$fZ(<#L9bYkJX@)`EZure^D zL6Rg8S(dT*H|*a`Rnx>)Oe}tghCgJ^=OR%9}n!i@7q1TfJ^kcBWfAHCWU|lDJD!SbVh{+`3 zcFHqe+9a_8bkXI fL-(P}Fok^qk4EzeOk)G;00000NkvXXu0mjfDaq#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line2/8.png b/src/main/resources/assets/rplighting/textures/blocks/out/line2/8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7dcf4829ec847fc68739c2d2162697a3ded629 GIT binary patch literal 550 zcmV+>0@?kEP)L5QXd4dGy#iVzHBrxWV>h(ldt zzu%*(DwJi3q9~AOIn||FXt&$JaU9I&bBHwEY501*;&Qp*d_Mnec03)aVU5G#Kn=TQ zMV{+PSF067lI(QxJ=`#S?BJ@RX}%}Pd6JA8#8@tu5V2A?(%An~);8$5huH?_^ow#3 zGK#3MzQN6ta@8uA1Q#958H8a7(=;LYg#$Y^k7Mt3fH&nQSS1QU5VRrs^ukIn%GI}W z@dC4d-}f+`%^*C_)9F5XzQK2%8Rk7vDy9Y!%uOZ}2woB%vm5&{?R%J&`H@n>bzOYC zzeCve78w=mU&YG&pPxM|f>jGj8R-Cdk&N*e!rE+fF)Nq<^h{&Z(!?@Gbb~oSUhUE7 z2L$gn7qjPAWu+fhj`V%ButzttA>rYW8t`Fo@iUy<;MQ}e?0a-zu15_l3_?3DN#Ic*M%Yqr}hYph4`ey;N9l+6P)Nkl#$Wf413)qSvZ|u9}QS`gxWVc1E!eI}cO(vP_R5qIpvNT0iRX84x*zXT0 zixPQWAk})D#E9Yu;l~HI+bxJ+uU7Db0Iusm(kz7}3FLHwXahO$93W*0DGErQL$XYP zH7<@JQ3RPUFdmN~RdurDuP?~wC**u)@v33ntZX$?N7Lz)m>PJGtRww#vfE)YnLzdg z(e_PpVNZJu&Er*bP-g|Z+$K{wS8|h8oY)LBOyBo;pIh+11!c2Y zi@9$s7PGqn0Q5{Iqei2lR;#6EvuR>quh&(p)l@2#luRbITrPtEO63KT+wHcg)9JiK z92fvv3i7E^3za|-})oGP4&tcjJ&WmPH_yAx_6zY&MISgls=HTUb72h3wl zn+#h3z;Hw&5hW4{1Mw23vX95(_9dCK>2w+dxKXB(_fd9ZOpG&?a5?fV~SR*mA$&(?+r*Iz|Cf(@p$|Kd;*JE Vv=JkP*W3UA002ovPDHLkV1kBJxvl^J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line3/1.png b/src/main/resources/assets/rplighting/textures/blocks/out/line3/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6818122bf8ad23eb7813744861b3b7987e63bf9 GIT binary patch literal 352 zcmV-m0iXVfP)V4t(eQ$sbMA zH2hPNu~w3?R?kBeMX0I@l$I!p0(qX}cqB-Y1W_Cz2m)A^r4A7A*X@RRo^hQfT*eEA zVL<=cqw6}fO$*=i)B&`l3p`C%jN^ERdk&vEG;IsU7+m*V9U#V@c=O1c&ktBMw+&d$ zP*Mu#%~1#BS+>AG%?o^QrW_Upwr#5ej)Y)1%VR&_jASq^Qym~)`_U}He7f|IV!Pd{ z1H>9n%WLyHv-(#vL7JwBKVob)8+E{bAE4o@V)YXy8Noroaf~nwVHk!wKztJ4^ZBY= yIL<3}_KthzGPY=b;jpgj>VQ8=GS*5mR_PmH;`Z&3+q07Z0000GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))2$7oA6u`L>xwe--}lW0gb<{=6iJd`yWJpO$I3;|wI7pLD(t$hx!^}MVZ|MV Wdyabs-RJ%Q0000ks5fdPhj0ivwa6|-PGCX1t6sb976d_{591~A zZoDMkjpriIb84D~`o5=WnrNP94*VmBy|OH?0T9TtOuDXimGLEE-bUDwxuG))=ucs!`8 nDlQqoaUA*Ewk>5@_6zU@*`0Srs8xa600000NkvXXu0mjfrj3qe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line3/4.png b/src/main/resources/assets/rplighting/textures/blocks/out/line3/4.png new file mode 100644 index 0000000000000000000000000000000000000000..caa7f73266c2d1b476680378bb54e39a40cc0c83 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ydl>XLn`8yPO#={RSy2!z7S9_KeMzxdC_fJTg%?KJ2c!^n<#}k_i)>oVYkORW5wDU6y%hme4cH z1PPg*i&L`s_B?%TQE;FC+-s*8r8QfD0!vIE)@A*)*_dlxr1{}q@H$HYrvqQ7edo0l zKeFRWIuB5V#q%u9MNeYZ@2~MUx)rd_GGWU)`OJsMKUzmhH?MoGaa~3LV%d@j0w0;5 X$od&yaXDiMbT@;itDnm{r-UW|4QyCo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line3/5.png b/src/main/resources/assets/rplighting/textures/blocks/out/line3/5.png new file mode 100644 index 0000000000000000000000000000000000000000..11e4e58b78270c2877d0ba4c9989fcd4db4cdbeb GIT binary patch literal 304 zcmV-00nh%4P)4~ zvJ8pvJ6a-v$N>9yG zXItFxiSx+s_ykem4Hr{Zel^WGIQxvjx6fP*4=($r^)K|gxb_RfIm=~J0yrAo&Pp`9 zYd-yIW_mGe<^1iQ7mhl8`8F?s*H+>BnbOZJYfYaiSn|CUzNC3)`{HiahJ9YO*SE6Q abTCi!u=tqdFQW)_0)wZkpUXO@geCx3hD6u^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplighting/textures/blocks/out/line3/7.png b/src/main/resources/assets/rplighting/textures/blocks/out/line3/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9613c251adedd2eed3972000fdc780262039a5c7 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr*0NC*9_1P~d5+HP_#( zb(rs#-ud=_d(Yn(rIv=xGtMME-+Q7@b}!>|nK{J@OIyOO zCp_nz67GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))GAr*1SC$_Es@6VaWAb9=N m|H-}Xyb`7fR~il`F))<&rO%V~L3W#(NP^p0r1A-u3Iw2xe0qISe0@9=iN);m@y+oQw2}MMj zG%2A6K02XD2_=x^9^UR9soWJHTOxZf!+fq`s?%n05EB5!HfU^ z0u~_vEj4(v_9}Kf|K@G0L*3QA4uZn z&oi)+#z*^+2F=U`7G_~Fa&6;l0N^avhW%p_Fts%s;=#F`L-Tj1H>d_K-cv0wsb_bS z`KSBfD$fhL8_8b|z8eIM=tVydU)Y}SJwO;G@(i&CF$&&8vrgr5XHhHa>O9F(Qm^#y z&}sNG^lIo$@?Z8p+A*H2U3&aoac=f#b15;4mtp2jaBVTGZ)fah#NYOII;SI*OJin( z(569wg|=6efBycJ9u*Z8MM!f1z_2sh-E5{36Z(_B90hM`D3WD)6shP--(xSc>K8ca zEEh*2g&qgDeC&FksVf8s7vIa&)hZhCkmp)kUw<|BEDDaoSSR9_$52-F%-(L~+nKsw zEh~WVPoH>3F_@>$&d%zCWc89TVml24Xaa%-UY<&h$!tv5Ze#kSzD&BlNz)RfXqv4& zgGx((cC~)_QYjc}Yk?O^rR(qSSHMR^L~w9%!Q{E#^gBjia8V=ckt6HkmQr#2)HF1n zq_e=EcDDhw=g-BgC9e*AQi)GXOS_F3B=n38b`l@-FMEX);`Xs?C#pN5drfDpJiwbb zZ;~Gt06?Db4`(@1D!(S~cUmxQ`?4|mn#s2?{#?Nc6HM2lCpaqjHWz0HuO_CZ{O`2b zD)fa?*S5ERtwN6!9Ef`ZBUo$_jQ{ou!NL|!w4MrEu?i890Ps6aCVlIWwkC_PL%yFUiT4*>bY8T)TiQ-y7X+0+~G%+dLu=Md7u z6#xJ_=If*@RZ?yx=q1|d4y^(s>FWu{#GNpfqLElC26i^Nd~;P_d<~i$seZ%6#AN>8 zcq!8jfp@g#cFxc932HZf#=Sc##1O*72@4BP3Sw{E zlO2_6{;1`pUXm@!98I}Aek---HQ^)EDDK_Ef@EExcUppRV4b$fpqH}JvY<;K{b<% zATG-JR6Um$-75s4p=a{F75)v@L+d^YU1z%iT(9}~K0LgUqbHEs!^e}N3miv;GNb5aDhN_k3IdTayTlw$KGgTIm<(y5eV2R z*@}Vu-2kv|{%wvmkBUQ=54YB+J-9C@hjiV$Wi7?4gR-o9=mJLu@6mm?&R+0QbgCs$ zrqYEmMptdcx&=7ycNkl$PM;3qSfDY>O8)G%T%)J)jZYuJe<7q1JE{6V7<3y+y|<7* zDux!Ka>xqncwUXpFE~{2o=9yvCjc`1s*R7~fC2_IKwMnhN5_mbS*L+E96s$ac|d7L z7@Y|&U9adexQ8G#JP>pObBM=2CkZ*mhGF00w$Z$O=~BpH!m<=Pl6Vn;ZNBETgKQ*B z&V_v%Bt2T1^QoWC8F>ybCj&q;KGM z)Sl1P)vW2*00Fxy4$BazxJ5P0BCG^o#rfiA&g9};pO7JMENp0W^hlyA4UR&$>KCqLqo}qI}Nk$UCS)W;U4nJ>x4%v zGf5!A9y^qW`Cr3l^L*zG*sR*4Y(q#d9sKBx&7b1{kuCU`|6R9&qe#)*y3Y?Beq}UU zSBQg=`rz=dyQcWys&}}2+3ln6jiN9vC z{$zL2limum){-THy$qcp+lS{6arSsG_Rr=aGMSNlw7pNcRf5=Z4QMsCbK#%w^SC}{;N)0}YD!s4ZOcJSCHNCaAx%oQ~;#57?ynX{TlwE(;ozyAP5f1?h?-_r} ziXTCfKs<3V)38fgn|p*=S!J&jl>~>`*yPB3n^&)ts=sVd1dp9{H_K|?V+I|4F&4%b zmzM(blIiPm95IygSL-RF8ABsGH)v>R?qGNssdX&LKBH2$EnL37zWaHhl3S|#B`up! zpyA|7EbM*R*S(jBu}8O0F5ln&JXES0bRax8(fBxq@_6Gui*~w=pG6NIWYfBjrNV3> z2KS+C_*W?kh3e`_z4d`0R{5QRIsyXP*uDPc48EqNnQ+!h-U+R}0_XnfHF7_r8*5ux z?=~BUQo!Ge?58pHU4AmDyHd=l6xKX=-4OnF2 z3f$GWL5x+g!V05fV`DRM6o0t)QY^-~cO4?U_-+tP&jSN`VD4K! zJ}0MLRhxT#enEkTxANYvy6ii=XC4^6<6vlQ1-fL7+7;W>;2a`iJ{UCqLQ)D?+UL(v- z-!21N+j9mx%azVJ)l3>ZejEh~8bB>1L?tLF=)I>1n5Nt2L}&rTQgGP}rHeGj(D3l9 z-rk2l7d^kvx|>&+_U|5ti>%&F?~6)HV?Q_>y>Wb3(7?(nz9nMjnln75n#^!hT-L$? zk6IsF+|AK*($jD1wEG7f|6G{KUBA<{_(1OZaaSUD1f>`RxTW_oobt}h73W_EA-hRN zf~@U-3Uoeb>#OHp@XYRv~zX;9ivtEx)5S~p#Lya7-6AH1 zu>(xurKP2=3Oj6aIWs*%f{JbQvlOiWDqMCwTv?*bMzl8HVj ztt=~IH1m5ATxhuMLCXF3P71^P6YSVn)ZKEJzCKGcT_cS{1@|Kuz7fw}05VWyHpnI>k@)t$%!NY&-_m~A_03UE1_j;wG z*m-=AAs8WLS^Ml|K)nh9H}26iE1juJHDV9RcY^$)r^{QnznlF)vAD*2n~DNbu&xsr z0_;`24oZo#mx-O5gM+acOkqF3e2b7~yO#7qG+>B$dejk(yOf}Li9Tw60jDb~ygS1R z0X8`rbo*u7aR!cimxISC+ZH^8ADx1dtw1N8|HDI(5j~3vQ*gAEV1>vaWj~UO+DX8d z=bi2)lQZJvfhqvzeH#cLM)AsI_j7P?w1FoXRxq#$-s4GHecP381rf-JXn^n`Wk2+A zzwVrA^i@%pPacWpV~A2u8C>n7OGZc+b732-C1)B#RY)^Lif7NBA?hrLM@I#H{rx+( z{5l+K=yqDk&|n&r8PC4QzTVAdYe}<#4<@;I8n1CF{p9ne8u^BdjEtXAD18IfPtC+c zmHfdf2U!nL6uKY~Kte*o8WwJKG2BMXZ?#;tmZa9ce{>R@a%L%IA+uNV?d6d>D86g! zRufUQ6{>tCww!=@-LnreJ9Z#X6S)-lRVDwb$2$s7w*+eLof3Qfz}DsFRTNuWTh8w8 zrcfIPPUI9{lse5rXqRLe8IycYJ1Y#TYoRj7yvmNs^=|gc^8(YFDt*Pky`?o=Z91={ z15LOx&*b8+umEZ4#o{myUtC&x-CH>nzON0WwY|DYTdvBN;7_V6Dbc=mXk~1i|J!65 zJl_}yUjTFO$H6<-6F@ku;c&*1nKPjn28Dvj%-N8LAHU(p$|T?$Nk)6L^B+l~9u-u^B}2{NBy z9gVxgs}D6RANRi4OJ!jQK*dvd>x~zfHy_1PBrTGq4LAi}@So~}0%ywZFRbSe0 zN~P)u3)U@Rm)~0CL(BG8mScyzG9%R#e3`l{!F|QbJgTWZ!l_;q0!5s)zZR2<8X7FT zyWW*_y^dDT{ixpt;tfQsDALYSBE0H+2fQH%ms%#;ROQ~WKUvIra4b6X@#l%481H#$?ZX8A*P_W3EDaO@#U|~fj zOsCx<^P;#z=KA>&(?ebeO)?iRJZs*Q;?$`eu^d+#&@gr-hnAeRJ}wtCt#M#g&YO{-6vtsy7;LI#aViB$ZB%1Re!Yh8F-7lVP&u@8RQ< z8?hfSN|X3i47Z9ekMM5CcElmi+5Nfd_KAxIcJ~D{*%;EeAEwQX6^>a3pk|YvONmsF z^rIU+++vATd*|ko2yXz>W};H6j!2*G>bFOJ#1r2Q9@1{cqh*_xU3gP#IU%uzlB&MK zT@0N+VC^F8qL9=jyB#i-^@bhjZ%%^lF0QaPS+EDyDQzAyg;mU(Pvg8qh?MOU2E+Ht z_)Ojhzj54hh-XNf^*?4aO`o6u8DO!8lY!rwXJRQ&o>wY-D=6U$jqHeK$*-tzn;X0( zy-JB_7Mf3d^fEHxxl>E}M3qy)Pz}vQl|PG6O=tuBaH26W#s6oM6;#;Vbbl)Jr1ta8 zov?(Fs%%LG>%DJS^L=)?jVQX&^jcTGiyZz?vKgMTDk9hKVHUDf(5ej z_eQv~(~W+8P!9!PDtxyR4B+Ob_;V=!b|A%JQ&K;6e+vm3-`Y*kdH(R>wihn;+y!?l zXWyz=T_~Y%@IG_o@91VsfdBozj~+>hWRo$XIBh+`Qb;TEG|Uis>{M_Ttqsip5H1Qt zL(Cx))i3PZh1I(KCaxba+|cHiF=8w6S+FKAk6#`ZuLF`pI^uv&4INBG{>AQW%$Eqn z=##(Wyy|h<$^TxHhZC7EuzmV<+W~u~ABv%DFB~c7-PUO*{c_8~!{qkg>$M30dN%&t zq`L$R2PtWJ0{NHWMf3nIjT>ZPb_2RlXv?HlJo?YYw?pgnDEX4#p?eH>xxe~q{6kC+ zy%Ub&Ky}zwJbNH|d0tFk&Wr+qzgu5hQ*|k{m6w~F+XIvHW5dne0fq&y>nsTg=Ap%x zD&KH_{T^oKK@Les2q5hvAB^budPvHfc#t1}scmyJ61x-K=PkDy%AeJFA849QoUQj= zJ{Ynkm+J>c=p7MZa`6&Ch17`&w(!nHtq`jQa2xTE&-k0X8`DcK7>taurtT`2`t1Nl zMmFYc1F#i$2I1Se6WC7y{&%#MVdJ;Jp7Zsy_=yc1ZG|5In~J^ zaANkhmL{6WuBN74Jd5hj$rr(Ke^11!cD5k}BktH)${$x|XPw>LG#))-qNcPJ{!TvJ zb{`!b{ajafrCsfLJJEJyTN5(|Iq)NK+fmx~G$3OftEd3L^X=P=-e5(>^*OY;gM0FY zRA!e}TJ7IzjWyJnZRGZEWa&pUWsa|+AH@DIP-7oPt<{rcP0(4F6+3t9VY8Pm0Z8)41*uRL?6q1efaRjcU z)qglek#@II^qitf;j$mcl}T>emG?HTiuIw<8p(Q3m!4_e3NPb%7uh$6QIB)tGuilD zv*t0x-ZpJ@!R4YFN87)fUVBel(Hh}r9QTy@7xwn+jNoVwe9{Xul#vFKpMK>!=KDdK*`EU+6qVlQvF2 zP4l-=Yne9%8u1DZx?TEW^DSZG`(1yZrIt;s-Kjpi`k6E}PN)8c0MkO!5it+(vi4W~ zW*l!o9zs#;V2={zAo*NAj)p2MNbeP;G;cV zA>&%dfB=r&C7L1JX1A7S|0zUG7pbZFu=}3qQIRa=MdK|6yyYm~j!^4$YWP<7rVT?I z%e*Miu?o}bVFW##V$3q3nO+0L*r$&KF|w6hjV4mzBu!Bb#HXWugOA{v@v2RUXKrRV zo~Ojwn=|bCA=b4}a?7@iKWUpEr^NL6sv4m@MpvBj_UxTsht{&|1iL>SApjvc)*%@x zmgg^I3G{3l-+r=G+G5PnkY>yJU@oBKz+ySoD&=e^QiwlwBh+Gqj}$b4cS@I4ikl*#Rz^sa+my0Oxwi%3kRJ0Nn+J1 z({;EgqmB4UGMd~IqL=hr4JbDzdP3*;wSf1}PaMJs+p-$Ao9EnIaT%adgY6ezP6qYR zAmPM9wW#QVK;C*Mz-I?syhIru!vVm40(|_`z@^(jObkQ~#t88LkDu}wF04}WWp&B( z0yvAo6R=Up|JCKcjpoh%pU(d=*#CyB|2L3~lPUj9scS5`$lHK_;{nJa8)FFW`BZH=DSg z3+$VAXsM5{q}9X+^6z&-0(bZd^SpivoPuH%DiHZ|%(qxgR+S V^auO{bAA8-002ovPDHLkV1lXEaqj>C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/1.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0d0f8d6eed640c2a064c62bf94f495eb59d04d GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar-fh6A}`B_$$hpHl(p} zaB}_)4-NgRudmOaHaUmEqgX=vaJ{q`$Lthl2eW3A*GA4aQYsmj2&Py^#!0AMv@kiu Zz;JLDYmD^<_f(*f44$rjF6*2Ung9VJBeVbj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/10.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/10.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/100.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/100.png new file mode 100644 index 0000000000000000000000000000000000000000..36e55cb7cf5979b5db4fe1159e2d53472ea60a5c GIT binary patch literal 524 zcmV+n0`vWeP) zyLbXA#`Vn3{PWL0vt}?DNW0w*8NTUss#dSp_53f+@Uz?PWWV2sY`tFVx!rC<{?%%w z@faWqfRjLMJRWP+n-e4beqWPjvzfG7Eh!WVdg24XGjNX0W+UlzS{_b~e4H7{<#N*L zbmTGkezA5D08=akfc1JktsINRG?+lxJO^Nt$waEvsytc1ZnvvBzYI{=wUEhVlqx+tR*S_#{qNS#f5g4EEMcPzK%p7{wOUQi zkB#K>c?EI8!t&O#APzr?wBa@QG{;gdmvtKScx5Xz8Vx@#m?V=)6_9&3X4or0DwUF@ zIZ|}&DX0czH+M8Zi$o&fcf&K_Qp|}T4^{3@e_5~>6rg8%&t|ipnF7!cmA-5nh(&TV z8dcFoqmhp9(k9}A*>E`Y0(%ju%E!*O@oj-%LrXA-L?XIaSHS|!=W{P^XpwM$9*@U$ zADGB;xl{(s{cvBLuwF#xbjXKBd&OeW(>{z-27jNZd%o@oAKKrijQs#Vp>pYvr#R98 O0000A}WBBgVWCrQL2zu~^g<9|E4hIkwxaWHK3f3>oZhrQ7YwFLNdTt^Kj~(|l54f&~Pye!s7g3Hh4Ri)a1K8gNyFFRxBaM8D%uTljMzFfn@!&?NK&bk ze71h}U7Mj-fpj{pSg2!9r)VI%zEcBgkxVB2YI7!d3fK@m|@5K&PJUl36a5w#FR6l{bv*4JE-{@{xH z1S#?{Ci9zQ7yp42$7QNV?r_B*@L@bBkuPY2T0P96yJ{L5{~`B(~eF zefRr)B){2gteybG07z0uOs7+0{d(?XI2_uc#bP0yPDe_ml6}bm5ES^tZnu+cHY?vR zoZMeJDHICQ>-FT(o!Ra-#(Oe&6;S zeSn67N~I!qZwHY}zTIxiZv{X)HSGP+np&;)ssM+53%Oj*q|&ojwOXw#|EwVV$J{Tf z5;dj(6xaZ0G#YYs=A>9G8i+R*l@AI)9eEDYM)2UTZdR*Rn+838R)$uq6~={n7*~=&&K#&m9l&B9%&oyAc$yDegRs2bOOauPV3~5YRIu`FuVo zGXVO5>7Sxw7Kh{UxcpQzCzFYdZ=natQ8ONogTcW>SXmsj5VuhS8wz5vnEYV^x<=u0 zxeVq;E)ogQlgXsr2PU#!uT8;|0-W9#Z)`BpCq43M&|bM*4zf?{Ou_pn>YuNF!l&{6 aDHAUfD|rkkcK=5J0000e&=9mYwDm7s z@8|4&@f$RpU*CK0o_p@OdriOJmsYD4Fnp8AM6Fh<>G!`l!_RiRmECR^u+?g%-_2$d z@GqB3jmH2{0GtG3qtQsKUWAPFdOb~=PN&jrHYK0W>lYsYo`G|$*K0|oQgU@-3QVy80M_kxwQ@8Xm7CK&1K7OVM8L-5u~aG*d9&wEr=xd< zK0t#(u~?Mb-$dx*Z!{Y6WD}rH40oUQTrQXQ3{cp$kWQzSIz2m9^Z8u;Up9&Vh`X?D zz(yH>LNx%Y)vBBw8_DHz3gU!?<)Z~44nK*s;Wc=*hf=Ae)1b$5t3$nB_v3;|B9Tx5 zxp!lRy#geYNu>okc5SCXH7L8eqXAmP<8i+mo&lF)LVi3{xjfmkU@s^@&lJgIGML8>YlHA!iVX^5bdhdKyU5QX!GPdS5fl+c1rZgs;143Y5K$L`h=Pl_^ah%H=&sNU z$S$`qnP-x7;upwbJbrU#-g)PpIl*8skaoKrGJMnN)T~~w+xbykz|U^Cll^`lvh{jx z=XSdd`B$rz#bbaN08Rq2@px=icfpbL`+ZBA&1TYSwWLre*ohAS&%il0n~kK?X?X}f z$&*?xmy=GXBfm}px%(W*wc6L?zFB`p4@BYSS%+06o5e3TxlX;lgUJ?)v8=7 zV7J?~yMR7GgF&fOlK-!X(8b?uHsyyVK%E%wZWORmsk|^iVb?+?lQHV_>{u-p3-jM< z68{nRo3;TPV*m=(0I1b!@>^TT=ko^QgoWjIWkDQ%5^2M0aG@XNa@nRqj|&B9G#Y+f zFi9qpCLs52%&<3rR4Qe(K*#=S8&rd`n>!kyMIw>#yWtsd8T;}!9;*CN5LmDm6rg8{ zWV2b%%mC3Jf zUKeOSpL=mbi-ZI8csy?Vz(khIr7>Xchx_7$^&&c_Lq0UxD;A5M_FhG*^L0=7 d(B3~~>=~8&bhtYjWt0E_002ovPDHLkV1k5Y`Pcve literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/105.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/105.png new file mode 100644 index 0000000000000000000000000000000000000000..61f54d295e3b86d0c3e0de1384c7b75ebe0cd443 GIT binary patch literal 537 zcmV+!0_OdRP){)M~XS1}N-D$mMcIm6<)O)oNw_AIgINh`Uyn zurUUp&<%h_qaimMEEbCf;)R9fM`b}CehL{QXz)dY)oRtY!Hg>fX|-BmT`)R`K*PP7f%eA z%ViKZa*=R=o=hg~KCqGXdTk88E9m)s@xlfXz0)I~8{?JB2zvQuh;GUUS7asx7*2nzYoQF zy|(vuyA9#1)ynb-NQ?lGL}EN1Th(1~BK>~fHqB-;X|-BXC=~1s27y=LfX!wj>2z9t z1s~*DBbUobr_+%K{l5Mf$QOey`Fs6%CT5Xe(NR@QS)>ln@lEBtybmg zERb%uYij|0z=ncSsU&|68<7j%Y&PXiF{G2j+E-OlsZ?GS;IL~UlgXHLdUmQ7i-qC; z6z3arFSHHRm;zX+20^V>lN)UzpU)eKGZvLUlz=>NHqwUo;8K6e<+4qK9v4c|Xf*t| zP?Ah0*mVZ2`00000NkvXXu0mjf&&v4N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/107.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/107.png new file mode 100644 index 0000000000000000000000000000000000000000..191ed915c3633e5699c73599eea84acc26634781 GIT binary patch literal 531 zcmV+u0_^>XP)hk7Uo0_k)*QYw}73kHE#;DGIRE7@#Tp3J%Y zwNWS(q}S`oOSpcs@h2pvScHHW3rHf^V?GVqE0@b&_Gz9f`2IxQ^L0=7G`>G&;tMWd VerY)BFDU>3002ovPDHLkV1hUE^u7Q9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/108.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/108.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf8f8886da8d9adbef20c4d2fb29a14db62eba8 GIT binary patch literal 537 zcmV+!0_OdRP)5XMi|&`M+rr z--!EG+klNR0EKD*wA*d@p)FJ@6$A0Y!t$N6APzr?v=KD;tyLS1hE0PWw+hnjcEh+} zlFQ{xK<@pRVQ&EWd|o0=0v)?oK&nC6&m9fWBAd;I-3Sc06qg9&p~_DMfdzX(0eYtQ zQmGV}836rIiK>W2aw?UQC;dO4&ux6KH4z_u&t|hAa1fEIe)~v-O?1&AnM}$DO?-1% zpv`6z#EmTy4$w21jO_yxiK56DF!$?y@xlfXz0)IK8|~F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/109.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/109.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5052f15f1dd4623bbaa3d1b08b447833370f99 GIT binary patch literal 534 zcmV+x0_pvUP)#}2u1OP8B~5~bV5bO*h@ygsiW=|_BFZ767Q%}tSj5sVaB0#9(gjjp zaov4|$vhKx@jbX=eBIgE-#jz3>n4+l^!xpo;ae`3X6<&{zAwc&evZeZoKB~h?RGo+ z9u9|?f4kjUJcft~;3N>6&*zr)=&ocu9^0YSY9+m1Pb!s)eeod>2)tvz-%CE9mmltx zJgJpRB^e9`^7Fj@qjq-|CRt1X8;wTtT?107lm!zA&F44H#1@N%G@DKNt$V}a(Dod4 zpawy$R+GQygW%%tcDwT7wKH^L*n7~JMx*hcfDZc-3Wb89QnRPpY&PcqsucXExsg&r zV+5#>4S`mxCEs+jTrQi4Z!DDWm4Z0@9HflUgI~I+*XuS7YTT$ur_%}Jf+U;G%G+ya z`+m&On?Np?Gc43G)X4_2pF2IE7nw{Z+>JoMrnu`c9WH45)_NYKxP8e zLngA)EDk4=NqN-uY&Ns;-RMDlpOj!aorVU7CX&_PJ`O??o%@hTB;=zWe5WE1uGj0( z+}K6JfqFWfw)?GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/110.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/110.png new file mode 100644 index 0000000000000000000000000000000000000000..3e60b139cc341a714c4ac901df67ce0da6ac3346 GIT binary patch literal 534 zcmV+x0_pvUP)&Lv&#GBn3=QsQA#ka7<_~hJ~GiT1+>t?f=42Q!+fUVbSi*C1T-{fFu&j<f_p&&W~NEG zTn@^NfO+UdSInX~olcu+i^am$x6wi{a^~}SFgTbWG2OEfQ=61Uc z<|Zx@0PNXp*6srviK569+$+KLeeuQy6FumeuY>XG^?Hzfoo5Q3K2iUC{S&^9r%#!9 Y0J^b%23RzZfB*mh07*qoM6N<$f*?Tqy8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/111.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/111.png new file mode 100644 index 0000000000000000000000000000000000000000..c47fb9b980f6122cb494aaf6343b845595e72086 GIT binary patch literal 513 zcmV+c0{;DpP)4pRnCx$I zyLdv1@!Z*&H*em|db8O~hQndP@U7QtwQjeo-~Zw~exfLnT;sd}ju#WwHFU4X}p1o`NF;=NmWHcJd zYkdANb{7LvECGN`CKI_g0hvrjg9(JqdknT(t)$&<%gLO_3yfA@yfi|0s6F0F)I6%*4v$_vVBn(4kz}(OG z#R}_0v`&kBZnRgg*B$NiIAw78MD6pnPx#y}pEC9fe~f~Zarz3L00000NkvXXu0mjf DlO672 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/112.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/112.png new file mode 100644 index 0000000000000000000000000000000000000000..4fc5fa1921211d59297fbeef69997de3687f0d8a GIT binary patch literal 508 zcmVbtkGyR^!pz!;AgYh$acH^GuG?1ESF24FBS{M6ObqY zMSyh6WHS1lOeR_zjYe{R9!RUzlG$wLoALDuC=3Pzxpu&hi$J0-UP6HaAS8cwc`B8X z`FyU#geT~9I`ZZKrBX?Hy`H4gX?b^>P(luAB9Txf!{N}|VLiYHeLIr zu6Zt()3va}6pKaej%`)IgzHE1a`6V>mqSXEHV=Sfa&@a`svQv*X7Q#641@0GHE)+VllaKMBD*3FjQ*IW>afm zu}Jei4^Rvqa?CFGHzbAT9s@zs}>!19X@RfjM&dS}B1Qo;B!9Gd zCXjoYCiCGXVphkXg z8#bFw%?pKsu0<`TTrTT$WGe$4M(2&~jz;3m0*l3>Y&IKj81?wRe#C$-(8nZXP)|3V4)y__z5DSA{L^E2th9i~s3nL~1LATqLUkWIf%hK=nC6md>gA$;GHKfU8(v*xwqhN=9 zhY$YzQ4lJS#`;zX8jXgn^ZC5(MT#kvN>&})rhpFP^IX~SNIdD`LZKk*^*S_+JXXjb zD1Zg|G>OJx<3vh9bt5x}_ zMNw}AzEUccGVe%Z&0(rnDiu?SLIS&3c{fOQO{##N002zYAF|K3%v1|lX^HS;b zy();u<1$quW`F~i+B|ZtR?Bjz!FFh(w=kQ{ta)=ie5XWF6iKhwGs#qih*|I!4 zpLLWx{=Z5luU4x`E|)Wl5PHj@iQa-&LU3*L!0-9H-^ZDPw@=hRU;l*no&o+u VbmyWBB+38)002ovPDHLkV1k7*`RD)u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/115.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/115.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f622620ef95bcaeb53cf57513970171c6904eb GIT binary patch literal 526 zcmV+p0`dKcP)}5Fqz2`pnInQ&>y{_NyOS|3P33B7{*rL&B*!Mr2<7czk$acH^GuG?1ESJl$ zUMv=dCm=Bbk^rfe$z<$1nM^D<8ja*E;-uAT$!s-8j^PRpwjpoBG~iA2Jb42Q#Dhkb_+{#+{v z6-Z*0JpFRRrmG>kk}$nPkC1^G0I z#$n@L36So+BD+v1$kDztRph{h9{4dK_0H`{JRT2~{kTq4VXam(T%}TxXDxzyBk+}y z$)tHl8fy+yy<9GvN)!@vErOL_7sGDB=AOtQHL=dkaA}ZoS6cHgr)P*3T;Krrz&=a(4-@aEk z&F|<;YPC3i&Y3g+%b7D?r_+%}qp=g@27`e{wOZBhe{~)|%jHs5tJR;eSS(~Vo4NIL zI@Njt5CtGfA#BNHQoqCDP;>o$UoHcl)a!K_kH?OTuTwyx+wID$cOW0$p?sNmGr=B! zp(9UjgPz3WahXge3QRbFX0s{p=0HB5mv*}?i9|vk%psJpel-81(Wolv^?J?@`yM{{ z^JxH3fi%|FhOttq=sKNF>z;3ba=DzcV_Ox_VSG-Ed^{4*rZAJq$b3F`4I>}gY^{vF0%Bg+f8@O&*2BMPO~^*C26CY|;}7D2DYW_`}ZL%kg?H6aY3Wl}^JH z4u|E;05Jm`psD0)wVLLr!M1CnwJ;iuw0ZbtaD3mFR;#6|U*yNQz5yNp*>E0l~^bK?Ly?L_|d_L=h1V5w#FR6l^U04(SiBOP?a$ zeTBLCP25dP?uvPy-PzgszwE9X4u{h1c8`MGbUL+YwOaQ7U!CK#+wEk(-~ThV+pVnE z>o8xfR#s2Y#2S#K5VTw_XaCu3X1U2^B449UI-QOz7K;GJKQJIM8ja+qJCP?Bkv|%b z8m!SUe&*!%)JZ0jk>zq}jfv2p*Xzk|-B77iWH1;=Hk*|@-2@Zn_c~6cQpRLF9tSzB zJ9IF3)&{VE8uM?8*lad!UMLi7EvAji<+7n8+Zf<5I+scxjl_c%7K=sMY&O9#^6^9d zhyh)ok4YGZjB7=Qy4MQrQmG{8kylpas0$wWV}j}z)tO8t1F}D^OU*YL4XdlwYVu1# zVQ&pQQaYVB?NDRRX3(qEs(jZx3<=~S<K4s!BU9Wci TuQbdz00000NkvXXu0mjfFwODq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/118.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/118.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c0e694be95b2add870d89fe275907ed8d79aec GIT binary patch literal 532 zcmV+v0_**WP)4o)Oy)Pqy-~9%#=kRnKF&FJt{V&n(&=;#jM!u{F>5xP_Wdl+@w44-Ww+b?*EXAt ztX8YwFPBTp$7o^=2$IOOY&L7(>2zwb@pvp35hv|-Tjuk57{)gsATS&b<&Qg&2X`vZ zYPV{f(eV02z8ai-k4DLW6F%D|cE@E|;a>?@K0=k$d$)f`6$ElF6hY8I4AP z4(ARY{CU&@Pyh}8pZbkP!~A?cZ)Y)WR4SEhIp-Yko9^U1S1X= z;s*%m0(?Y5IB5J;ALyPdu#3f_oSiyDMU1?lfxjl8B4i?w2$TJFoh$!(y>5BcYE^!! zsGzq7eo`uxGVVabrJfhM>Knt*>x8 zzeD$yy$t7n|L5Fu&v~Bb-0KE|fpj{ZJtH=mOw5|irmg?wIX>I%R(8AHpSIa-WVKoa zf4N**K1LBMK#)YbWwTjZr_-s$#^bS^Mx3|(Jf$A`{P5hE{X;Ku}1giIt7p|c;?iSn=4>y}roR^?HffZhuD zPN`JNxC0HJ!*s7yDsrJy03illsQkJ}HYVLf6B0sj=xJA2|HM%fC`%|k_L^oYmf zGSx!d0S;WLc*I(*mc__{b`a51n9XJ;-dqpgYf>y0lU}c9sOZXcw)*cW?%hNJ{;q@M z^>dWmyjra$xm?aDQqWTlB6GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/120.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/120.png new file mode 100644 index 0000000000000000000000000000000000000000..a47af43919c41973e7b91546442e7f3ca1ed9b2b GIT binary patch literal 532 zcmV+v0_**WP)MQx%M-J4Jl2!RU)5yZbBA}V4aiijH#bs>l-xX7h1(0zxy3wnTd zy~5o2%)RHNR*UiH%$fPl_d9b=(Cv1m*=%kZvEguNR;$(Q`(0kZ&uX=j^?LoKEtgA~ z&*$Es&1RO50b&3INu*mUm9p<>G_u%WFpyQSCyho!CXyB(=z=Y9xs`Sx_-6>c$o0Y|4;Ri+> zDa5xJfC7Dn#Nd!|u0GVAR%qvPIeAnGup&mDpMhHwR2gJ68ugvsx+Yp&sZ=blR4U1} zHi5kXxK8nS+_XatpJKWfi$(dP^kIl07b%}E5^Lg+nUFv-U7xksb?5Bi=$~W*pqr!0 zq?tz~5|JMY#2ujEO#z72>vfBfgKR%UCt*Au+we}b_)?R?;jpyZZDU1OwsRKxkhpad z3AnosliUBRf4a7-}P#tht<+x=#qG1z^g?)kbWylJ~n8T$+G Wlytt(@dhRU0000$Zs(K z1^SqTamYB;HPpRUXy@~JxmO9WB1c{Dz#kJ-F)|j5g~|T7rrKPsR;{jFF3YpBfxQ9v zNr^1t8aGG%N=jWCs(ygvn%L<{fMExdKHZ5$SX~MwzJqaVx#Vt(!=~-*uSW zd>th>uTrT7{0+^U{VWHM?0;c#fae!nlvU`y)tx{SwT560g!z|rk?Wq&7-|NjCx zQ+o)uEr5dWy1rA3$Kx`YOsp{G3pATeIo=HU_ce<(qy3-2nY&I(wDgjpbi1R&gV}k0X21OzfkL<=ZR)4u%wzy)k zC`Sqkdn@3OVzHQMhZ=j5K`#^v@~D0oV#r0xkBekuQY3mp0KuT%YO+J;?0oN2vK0W$ zQKi!$g~MSPY9a0b32$p(tyVK1Jwvu{qLVNhjjVa-z1O5rC?u^`%P50-s-r&CwUfAU z6LGk^4wKjQ$hdi>Qb|&&lu4wZlkA)5BseA*W1|P|%+3C5oH6+RMBVdsPxz~Sf6CYg XG*NotZ@^r&00000NkvXXu0mjfY*zMb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/123.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/123.png new file mode 100644 index 0000000000000000000000000000000000000000..974c59ae21e0f6b8177c9b9541482e2b105fbb2f GIT binary patch literal 526 zcmV+p0`dKcP)6XZstkwv{;xBq`Q$7j7>%Vx9rGghmWEEbC} zpU>xpCn#bCNCJc{ole_-JRVzaI2_8_?MbuQl<9OD$oK~ZB>Mfn93MD2J92WN@#yvq zK*3KP-)kh3Ntw-NR+tC{+U>TS9y%!&i_-0OC6!9ai*7&(^H&|m<8irGC4<2r*kRq_ zgTcA7q5^5mZ*^0xR2Bpu_k)QTcczJ`|YCmu1P=^{M=02tOg-R#*}6L(;itpIFZDxHQY z8jZ?W3vmb7@UhJ`8V$>V!FFh(w=kJZtaJNN^NITB>!0xV`1zEHFY@Al3>8(; QRR91007*qoM6N<$f`2~nw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/124.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/124.png new file mode 100644 index 0000000000000000000000000000000000000000..c915265118a02d6035b5cb6eccd8db60f9b27d77 GIT binary patch literal 532 zcmV+v0_**WP)#Z6p$DU26C&w-|kqR zHGXQaM?uyP8mUxD=JUA~CPINurz5`)_?&BXJQClOJ)h6ZYPAXtBaapG zdkUz6e40e#u<=>hk?y@ByHF^|4<$hrIdGu|eoRRH5OETZ#{;t;*Gv!BYBj@EDi!&v zB&fFno++73ns=nJ<}mE#a@ka(khqAvT6}kr7!#ZH1OQ-I@Aa@}XYc!&Gs{*0HZPS< zU#WsvEGFk#h&#Z6CoMp(*=$-447NiPy@ly?YR&tohrcK&8jVV~+cj0NGM!J6zZUmy zA_;%jQF8M(N^V}YT9s@zYZfW!Er%w03tkDq*yw@Z^RwT@nS#S7>YuNF!n<+!l!+JB W4S38^uyEc00000g36Tf(YUhL_|dlL=h1}L_G*13Lf(4KTwzMLARh|hi?4~ z(|m?@$sULC=g!W4AG5Qr*Xv2E)!GVjqtVEsUa#BtzdFaydcBs-X7gvPRx4R77GXV~ z&#j&S!~jTA2wOUxw(od6w%l+yl(pNDX0s{N=`@h>4GKu~`+d39!WXwI9~zGu>;cI7 zK_i(=%4{|>U?Kpt+iiK)f?}~K-ELP>sgztEI8(wJ(0Dv9cS<_FlE7P$(EXwoL&Y#^+4Y@km@NdoGug<#HJsMjk8Vw-kVae40e# zuyLyFNcUcmozLgxMoCabj=InTe@#d|+;b9(#R9XxuBjfbR;yN5E|=v=Nl|YAo+*(? zn0KVH<}mD~Qpr@Jkiafhehm`WbfOCA2?Z3xdas8)JA2~x%(4N%=B3i<3sn$}M&(F> zm;nyFD*(AhqhUGJU^_I?TbN8H*1Tgqe6B!|NJKiFj!A|UAg0n=+?qrZe%4WP^>vj@ zUZqlzOeSL%0rZwb6TJnmgy7off#36Y|Gmx>{CuMR`T8gPJ$^oA;uDjteE0j(8b1I4 N002ovPDHLkV1gD#@zDSP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/126.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/126.png new file mode 100644 index 0000000000000000000000000000000000000000..a4eeb01fabec85ac4fae8f5c52ad1cfe6a5965dc GIT binary patch literal 523 zcmV+m0`&cfP)w3MOv|6nlkQy z{GdoClQNsltT6};+U>SHYeBJCly0{xsZ>f{G)4(AP2=&n+$h0dFbH;7clhAXyB47W zX~cIL*J?G3v)Qbzy=kscC>T4oO#u_e=S;if5qxN2E|-(#av26j{&Sn(Q9u{uGb9Fw zja!Y8?!6*ApU=yclAwwlbzuhnn2^dKW3gCZ_Qy5Ve6?D&x^lTJXNS)2hc)m_iA2J@ zBaN8Nu$M|DQ;9-wa^TF$uZv{Iq)g0&0*Yb1*Ug@twaa5?maPG7UMiD@DH@H+SQ~K% z*zmEc$z(ESk%r!K7^1h}l>m;78Td7S_TTGF!Oth^pRa$y-|_P)gD-!qes8@cVRQfh N002ovPDHLkV1k5s^wt0X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/127.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/127.png new file mode 100644 index 0000000000000000000000000000000000000000..42f50ac06a5a7c2b2702a935f9b51bebb3582d7c GIT binary patch literal 509 zcmVh-#e$73lJ3i6>jO2}!N&1U6Z31+jIx5IjX5B}^GgbJjQKWg6T zbSy8I%eMBVwOXxa?ASI1Ocz%EvPT_iguU1TNz0K@vEn;koA65N<&YXF;*%A{dRr_&N@Bklkj4#!%r*RvWJ zZ2KWP3(MuwhKJu51*K9c8I4A!3RW6%E1ku&n@GXkb(HLnN5;)-wOUdtmCPayon=2n zXTd2UI5uYB*4){j;!MHi6LrtmJ>k>1e9FWRK1_m|No<3&00000NkvXXu0mjfay;Ra literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/128.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/128.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2e08e25acfc2bfbea1d274c21588e05ed0d7d0 GIT binary patch literal 459 zcmV;+0W|)JP)dOc}6CAvSg*Ug0170}3Z7hj0gSD1u-iHkKB7io8Z1WRljRJ&7b3P(&P7i^W2LjTzuvRT-c#X#4$M=JUD4ajd5v zk4Jws_C}+T?)Q4VkO3%cS|KMJeHd)FTh*oAZcDS-R1maSE|)(VKrOma{BRHQ`EBAV z(r7fK)9J{2DOMI3_6h(ZLBul#tyW750E8JV$Rqw-amvOsU=zezt>y=3v)L%!!C;`E zc5k`?TR#T~!4Kj@w-%b1c#;?QL4aRUd{53>))8~Gef80|(SuLX*XV;x{SD4GEA3&j zo7tIfzxig?Efxz&(=;%AWm&2vNuuk2agNXFbdvM={HGm{$KZdz-)lSuhyvgw5M!U` zxlE^1>G%6GnM`yoioz!X#OfKC10zt}lYF~J`MTQsi<8>3leepl$76pH764$&-9ngpm1o3+-&q=u-R->mpG0kiXsI;i}`&1s{zz%H;Pb& zCi`ZyDeZP!&+t)NRbbdF0Eh%2o-t^(S{@K)upkcqr+ZK~o&kph*6VdYIP3LV=?(@1 z1+}{A24ed;KnQ*i2dc0zFnCKEEK_8GnL>r9ZaOhiQT2Sld)>`(}VG0JxsMB+9 zr!&?KIzS@(>NtB5%~>5&vuc9PMZnc$7?00000NkvXX Hu0mjfR@~KI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/13.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/13.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/130.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/130.png new file mode 100644 index 0000000000000000000000000000000000000000..cd272c0752850d91fa24e6b8e405beee1ab70911 GIT binary patch literal 463 zcmV;=0WkiFP)BnN0Ltuh%{hB2KTs3;@T^7bhRjPTs3dzTJ~tuK2oQJRbW*ARqu~nrcwJ zUe~OqgtOc2D%ozg^ZxY5Q3q^UmdRW7H!}(d!j7u>e69+_Rg?sBN>v4P7`FX>FSFT9 zqA1d=$K%nL#@%o@)canq7b<{-OA92k$w$F8xSR|9q%*oDV zY#K~}K)%cC?3-xD@|qgT0k#)`g8L_G&)1%C8TU^a`~VLnc?{16c;)~A002ovPDHLk FV1oSy)7bz3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/131.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/131.png new file mode 100644 index 0000000000000000000000000000000000000000..3279c8a04ef78a035c9a8e46b12a2ce78754ec3d GIT binary patch literal 459 zcmV;+0W|)JP)v6Y2GOG9HiBuU0F65For~U;&K8j~6HJ&raSdSN~eMu1BMhFN6gESemAqSgX~v zsxiTLyIlp_?RGvNeH?v&mSve%A_)c@A`Ywhe6GO83~*Xi1}F?#p64=~&7{-mXw}2v z;9FyFFc|256h$EeP}sDCR5toB*lxF~ORLqAMx&u1Xt7u<{xlHxBxm=i{_Encje5N< z?RML@#y<9a$srH+3IHNO#4`rXW>Z1v9cHi~kNBs1P&S?cn;=%JRX;eJ%|_|Qajc-$ zH@5*>KL-fG58|AES(uo3k{Bj#iI!jrNFbsOM!(+=dNg0wr#wu-AQ^S;oa)?+-3B+n zLDuDQ_99xaJf>#l12z`{gWD%+&)1%C*>0aQ_5%qxdne8Vs~Z3S002ovPDHLkV1g5H B$a??) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/132.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/132.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b0e9abddbb1fc4a169ccba4009a09fbedf6b4a GIT binary patch literal 467 zcmV;^0WAKBP)>-T6h@`bPf z09&nA8d$AXwW=}U>~uN`w%hG|Jo-5L0ByZqYbAnUKoWjf&F6CkHfDg+sxm-f(DwVi z%w{ubx7%9vcs%;nxEl_Kdf)AKLk6I5X^B)e`Y_mTx2g+Msn_cYf)s1lx;%!Tl4p=W9>6X!lPU`v#4SZ$M{-l?(s?002ov JPDHLkV1me#)Ik6M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/133.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/133.png new file mode 100644 index 0000000000000000000000000000000000000000..26e9ce9802ef34b417bdac9578e8bf28afb01498 GIT binary patch literal 469 zcmV;`0V@89P)iEQ#wu-R<1E_5Y|A|;^~v)Syo21qO3B$je% zRI62KG#WlNaZieG_b6W%pk4`J#DU_Of_lB~2~ma${IGwx2UX)0aEN2MTvplSw_dMR zZnxW2Qp=led|smaIiL{yP@Lkeg;q>foERp$L`ukqBq*W{Mz7cVGeqP{L~>`JAEscC zOgcR$I-Rj@&;c&8&yTY&q8amJYRF%(xd;^8KT&(W_Js4ef6CwoE%$JvmO&}A00000 LNkvXXu0mjfC2q`^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/134.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/134.png new file mode 100644 index 0000000000000000000000000000000000000000..ecda82a3de4b261909338b4342d43a395586b458 GIT binary patch literal 470 zcmV;{0V)28P)en{U3Eb!nPPk|co2#9w`5aiI(U9*qC$(BFi0}7%&Bp*y z0D{NkQH}2`%Vazr%SX}4Xf%>;w=2u#(q9A!?-^JCBazBquTDOTH(x5=zK6r1FN6gE z*nB?M#B#Z;RgDS0-EJ$`cDwcY=;P=Ew8dhfl}LgCmx#k^I-M%8F$0`dl>rKaw%hGw zGMPxL)zYem!@;-4S-;=c^G>G|G601`yGUiD4};BSqq;DaYPG5$Xfd13{xuL+kc)d! z|8w=$Mx|1bX0sWzmKPZI3IO8o^&;XKgL=KL$t1!I7UU6sFF0l68E{DDD2kLe{jJw) zr5newf?D5914e!i5Q0C5bGfrHG4Uj^OiYQEpbtnOqAfrbX zoOSNpGiQFTOOiw;lSu%4tJO*|7!1_@7w7mn9*=T5odQHrB%d!%>h*fy-|co94k1h8cCzsfFG7U%3d{irB=g6!llRiqzLu`v!{N{;0s#S7 zEEXDAsZ=zpDZ$2ZtYq8m*2mKyM;)+bS*Do?LIIcXqiQyrDX}SooKjT*9fmE>bD2)3 z(rUFd>wdrYrE%8p_w~HpZifnB;m|IU+2o^Ov)O20m`bfyQxbYHpU-bS5cec!_o(*! zVy%p7wJObK)0f6M__@Rohk7M|5hu+v1&u~SNvIuVs2~pimwQk(UIB+Nmdj<8O?~V2 zTIF`TT_v@;nFeb89?%H>(46z13Tq~oAeM zCp(j|X)pmU@?BhK-$Zj3*VItFV0#fLxPPMdeC-JrasQOTFEFik$$n+f`2YX_07*qo IM6N<$f*{D#$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/136.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/136.png new file mode 100644 index 0000000000000000000000000000000000000000..6e36f10a70ad29949049ea2180d098f75f067cee GIT binary patch literal 466 zcmV;@0WJQCP)o&%;r`| zF*kd&Gv9pkXWeqSl<9OD2)5mBr!pK4RsZMb_?*vYxm+%RbUGaoSCdw&71)cSP=5pv z1;ALAr3&ZOY9*7&M84dEjK^b1l0>%Ktq%kU?HQN>!I8}0x8Und(4W8O(P-ooAprog zUa!@$UaxCbV}kDWdJ1+p9K1jManu3YX0y>uIKhA*?68{8=L&4h0H;)CK!-s)9*;7c z%_NRv&3ZbWd}-Vb1_QnC_xm9OP`I=}G8=su;M1&07*qo IM6N<$f+oY*-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/137.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/137.png new file mode 100644 index 0000000000000000000000000000000000000000..e3588bcd060d58371f65c60888ebd10d0851625f GIT binary patch literal 469 zcmV;`0V@89P)X#H zF=I~7pFe+c+;X{;>2w+xu{_V!hQp!y|MDC^$Kz2>r&C~Y9E-RIiJ~Zo?{+)Q#{f|P zf``LFjqlZJC6mcSzTCZx$7AVsyOL#@zX%ZCGq3wqmeI!1pru* zB$`;QR<)`z!MEFO1>0;kJ|BG?eSnsxsa7Hh23#TztNDDcz{U)4T2%%p4BB?PmDy}2 ztyW8`?)Q7&8fSySK+ij!PRIZh4(%e9jXn(4>$U2_ROvG~*A{n^ROqf`HS z@o!JR-?dszn$4!35u=5&z_3>U5J^BhW6)?cJRr<#qNVTClvPX5|aE7XgFYCu+~vo^aW2pEC9X10Q*jEPV(|00000 LNkvXXu0mjfo|4hU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/138.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/138.png new file mode 100644 index 0000000000000000000000000000000000000000..ad38200685a22f1ec65a101965bd45c66130009a GIT binary patch literal 470 zcmV;{0V)28P)Ar2vu-w<$#^^tfNi~AEBgJuuK)QtKBv=3&gXN0Mx!C(N>Z!U0(+Ka>JK1M z0*uGwQNeybpUY@8l5h7U!{JbpB$3r>J^v);7H`_?efnJte1R07z}(M5D(mrIR=6AHM59aYomREbR)P-~Y%T%?_fOQGuRY-+?w>OF1?sDLydCPHNB{r; M07*qoM6N<$f@PG}4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/139.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/139.png new file mode 100644 index 0000000000000000000000000000000000000000..8767a265705280dbbf4247b6e71ed3789525155f GIT binary patch literal 469 zcmV;`0V@89P)lY?x=eTSU z&zO_^`ST~oEfx!zPN#w4OVd- zK3|~MVAv}Fh}T>^V^FWx73BSv3^P~|hyTkxC>zg!OAt$?lG3KX zEX$N`uh&yh>zir7*6#sA@CR|uISUh$lOUFfDbW&40SQF3#pw6@f0pQyFOum~T&7@= zj5;%?I+L+!FaZ+zF0Qi|(VWFKH7h3AUIYy8pQt@wd%{J#f6CYo1=WAIp-DIf00000 LNkvXXu0mjfLxRg( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/14.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/14.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/140.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/140.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8bfdf88d8795476bc175e0511a4be33c6fabc8 GIT binary patch literal 342 zcmV-c0jd6pP)69=0lg!|$h)>$j7i ze|!0Gk|c=?!ysvzD);y0)Tgd%4R>NSDwnG4i3 zjqr#e9W5XcxS}Y0d%+^b6SsR|d*?tk0R|DDK)f{Zp4<)bo%4UWNOV3sbK8nl;fMHa oUC&wx6vS7Q*Oyn=BEHJN4Wa?IMy~$1kpKVy07*qoM6N<$f)FQ^TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/141.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/141.png new file mode 100644 index 0000000000000000000000000000000000000000..c9cbac84dd99ed79b110a39d085a01f299e40ca0 GIT binary patch literal 355 zcmV-p0i6DcP)$>u`ZHHKv#rvM;S^NPckpv*&2-tTGhSeY~2I~|k zq0lOpw@DRV0jG6(#d^e$juwyzT$W|7J#Uf1iQB!fz3V_F0R|DCK)5vFp8Oc%f6o8U zMN;RZGqf;Xt?N-Mo`Ud->h;wtY!O~%;2XHtxPeOxq)Gq)002ovPDHLkV1kyG Bn3n(m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/142.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/142.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9dba5ee35f94e08b192db150482d719e65f972 GIT binary patch literal 354 zcmV-o0iFJdP)o|^M;eK|&rz}h1U;#ISq9~+Vp6Bw801Zr%M3O@YwfVj^nt*wr#=px~}REAc-ab2}i)bGZ>aZEC%ZpkRVva@-`_E zBw(dGT(yV!IP?)qw1HNU{Rd7JV8UJ3NuK9QEX(36PSd0u{(+B&tqS1q?LI}^L%vS? zbRUu=i44OaX__kca{@kfT`LC*_!(4HrPa!^)OQ3hFv~Jc1{EyAgix;uY|mVvrfGyn z4C!bAiNF;_;oA!qDW1693)?#fstGWN_yppmiTC7Xi2phNKNpG4S7&Zpu`2u!->vIa mD}jReit_sM3R}ci8TbX$S-rryXzz0X00007xl5QI-5$pfWJnL6%}B8))%$U^+d22mIZ3ZS6?3CV>UL<0>{8r~rfl1JI_t#rm` zNHIQpeLFidx-;wbS{93i18PZbJkIB{TrQV~IGs+;_u+8R{QwdrpvXqR z`*1jva=9%1eqWl+rhZQ*6WQM15QR4}$pfXcOdUHRs3`s*;vZhcLO~0)u}}~!ZX-6@2x)wWJV+j8;x}YAd({-j z-8;K;=FD-{EtgA~&1MM@+itgt@p!E3fA<_er_)K!=kr}0kH^IKe!tiI01_o2$VI@u z+wDp=o0WFEEtN_|zlX!2>~=d}jMXc!02fF~KRNk$aq|A`XiUl^ab~gs*i^bx0kRZuqGD<>~X0z!H zL?H#@IQE021Tb0vKvF7|RH7M%sTjz=P^;B$O$-eKRG~U6u=Y@biFXIdW?%Cb&Hdm z%$+%N=HyoyG@$0CJHP-0!82MS;W1_`LcezI{A8c^7-auHk&1lK!#wy z-%GREl%Gpczu(vQLZP7Vtb7}Zje|dqIbd6_*IGwf?gI80RTbbc zY{-wINPORy;c%#m(xZ*XV@0pm%PN3{!bYQ^#?@*yS*=!?S6oqGh-^p_8wG$Q%ia&@L6@N&fpoQ947zkLT5gTm++vFYgL41_EewUq?QMWiw zax?ebbB;4+v)RaUxpY8nx7#UZvze~{?KAu&Ng`>QKE&yCa^4SzgYE~AC;>$_0-gth zfs{%m>GgWjXf*Ua2m;yf_t`MkOo1)1fu?WsEMi{dd|5wUjeNZu`Fu07TCK7{z#%vu zkJ9OM7;+^Rz^nG9d9c0(*by=_1_Xi1*VzHF&`LU3e#DEwTBWye0Y%Tna`hf z8u3db0YYlOu{R6R7H^ec0omLG6mT~3`&7a06}8vbUg11$uQK=rO$&YQE*S-K00000 LNkvXXu0mjf{BF@_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/148.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/148.png new file mode 100644 index 0000000000000000000000000000000000000000..d8eaf39309bcf9ad268298995dbc43c38fb29734 GIT binary patch literal 471 zcmV;|0Vw{7P)7xl5QI-5$pfWJnL2bx5k?@uLWmy=8@a#|6hK1(5|RrVL<0>H4e!8%U>$NsBm36sXY8_>h$wZq`bGm|WSXBii z3>)%?!=Y3v6&a02swi)5JRU0sgMq6678+ZvmIl{sHf6P1IbLnZe2bz;?NqDPzYI>f zpf0~Y`~AL?I<>cgacrVq36O;^m?85#PYLnPbQE^GUHx~EU9Z<=KA+zoBuI+IqLQGd z)9EM)6Zu;iu-R;~gQNs7+5&*2R;#HM8yKMyAhLbmzYj4V7+?z1S%I~O5<+}Pd_JH1MnnqWa5zY_ z+0+AJ80x%GDCnG#wSkx%{Bh_2ZL`_vVe7hDtuzm_>2&Jz+21{+Dgzt_4f=z@KuV>O zj7B46l$17^Of>raewqO&9BeciYFw>Wll6L?(rPBN7e$fE34-9ygHQJ;;xh7m8NV)p z&ThAxa-Cf49(3R8V6OnsLKnz@6^lg$L_6JK*lxE~KeQ{AiYyk3+lvH9E|*gfy0ls? zZy>*t25}twi=+S`T7m$iTrMj`GYnHPkiSr`*KbWs8b;8C?u>-Vg9#?yy-0TFlXsni z=;h#R#wn=nQR_{#GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/150.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/150.png new file mode 100644 index 0000000000000000000000000000000000000000..70c444d029eea5a59973346bfdd56fad18bf86cd GIT binary patch literal 463 zcmV;=0WkiFP)ziVsA5;R6E)#z0LB6a<4w#6%Ne6aQg9#80X96xQsty1||9 zuIavY@1@%<77Lk9ryi(nHXB74hC2SY&+$1Pk8(Pl9^!B~cV87o>qtVa< z{eEBP`FvjIjI52s?2wPc2W;#0S`S;-<#MTYluag+q@KC{!>TGEVc3vA91bN20vV6T zswizOiXug?*Yg#?!ohmIuEABSRavc8o>vQ*e}ln5?G%f}zYM-w@R>pY~BG1xEtwxs^IpC+Viz1oW|`_2EVHVdd#8bTa^F+002ovPDHLk FV1f@s)5QP) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/151.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/151.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae93217ae59217567f232e39ecc7a2d81acec90 GIT binary patch literal 466 zcmV;@0WJQCP)z4n7bWANasP!3osFKtV8=L`5AjoKJ%u$pqi%4g zd#bB$-MVzU<#H*r*(?KM+wE2{nM`#3FVFEg9*=T5ogN~NO2rqijS*Xv~!z(Qf8(NN=RwVJHg>&&cXGG~LqK*uSU%YPnxyJr#iBInEca{+U9 zI-QK`#3J{k=az?hB|sK)!OV=MQc0a>cDkdm)oN)YWLGK`Su7U!7YUMlKCdL076gHk zoUaOL5JgdPk(2;N3jj!b-&e=YFigcjWY_EUdlS=!0lLtg71($v!Ni9b$?kmmu2aao z6k;Hxc1CVuq6Kf2Faol92Poifr1Mn4?Gv@H5QGmg$pfWJnL3?9Q1J&v1VQ`<1sg5YLP4~!5gToUG`>R~B#*N38`ztBjVac} zJ!fZT=k5uM#lj|&Ng}9iw_C+%G*bTWUf}0^KHKGTxf`d`De?bsIOskBhyW;Zk=SfD z)^4}0*=$-am$P24XPHb!HE#rn94YVuF`LcoJ3N?$lzmPOxRI`H5QGmg$pfWJnL3?9Q1J&v1VQ`<1sg5YLP4~!5gToUG`>R~B#*N38`ztBjVac} zJ!fZT=k5uM#lj|&Ng}9iw_C+%G*bTWUf}0^KHKGTxf`d`De?bsIOskBhyW;Zk=SfD z)^4}0*=$-am$P24XPHb!HE#rn94YVuF`LcoJ3N?$lzmqj&CVl{>!F+hs SgeNZm000015QR61$vdS?olYUB_=6&XApV1bjTUO5AX?anjW$9W-ysj;qfGLhWNy616my3= zJ9FmD+1W6g&1^Ip#f;c`y_O9I1Nr~*0-xjYXs6TZrX3E4*#B;~Q$7ZW00@$ZtyU{* zHk($j*DaIDSf|smR4S#I7XpNj7WZfjEk3?Li0$`#t zl}bfjDNZJnx<+Rw0J?ghTrNvx1Y<^G-ELRZ^ZC4P>T+u%5nU{1J^zeAcNn2K@yi9e zxk$eAP)10A&;<~`3EvB65sBzQ66k~uY#ihGC{Ek+A_mt_)Ss_E;Y+)I%Gf8d<9s$r S8lL|E00006P)Nkl15QR6t@02oiI)$L(4~hta_zwy;TBwDBXkjBZ+6ZZUhdhXnGVwcPZthJ?G0yeu z?wK=ZXTy9xxAAzK2(Zm&qZkf{%Kz;P{G3iFJD<-t<9IwK{_ppD?I$1+0U#TR^?Gfs zR?8ZVhGnx^>vp@APN#+WL5Rqa0tblcbZT!;!QP*Py*`HM`{nvwtJQ3~-A2U{1jJx4 z(1B8^WSLAxRmmL03kbmuhlBQm1^R$(wOXl)SDj2I!cjGw%_5w^=f{J%yluEs6*raY z5F`6D+}q_E79Q;5no%zTq+lGG1x#x;n{G`b|Jakw1gPLa|s>1u9`=wOW-r z4yRHnU8AcL0aYESR4S5*Ve|;r>-E%Hp-|9G#iuqh(aoaQ%XbS@M-h&L#|P-qq(Ond?2hR~B#*N3H?S8?OtJ3Y zxx1a&xxFx(&1^IpT?N>By;ckc1Lgnr1%8glqn%Etn{hZCuKw?KJMAYZq5^yIQTGI+Tn1x`oG)l6pv9v1po=eR;!gY zn@y|N>z2u6tkdaODwPuEi4?*|1`c48$;93sgS|fmdwmG;`{n#ytyXQb*~Dg71+ad< zuY_W;Xz6rXUGXHM1qH$O`@Q190&`Gpxm>D?cO8$%!eKR?P9u(=&*vIj3{codsMTsV z91g|AyMS-ETjAMk_UcRwsFKU&l-z2ytW+w+8Qti%SS)mgp!jyX{iDHWxVNvf;Wyz< zU0hVUQyAJFXCYx9XAgT7fC|FlUF}Arp#r^LPYJLji8G4PLUHiR1-iLNzVlFi zPK3Bn6!Dwzy>J#$LH5QI+>lXps)I-NpL@drf&LHq{=8!gmALA0|?WN)s<6zk%g zv$L~v_k`JOW~0&QBEZ(`wPG+BDF1ga@N+yK?Q}ZbjKkq@@qf45={^C82mrZAtX3;) zHk($j*DaIDSf|smR4OIR3n3y$3LGFNlZm}P277x7_L2y84)?71_H5(3xQsP~}x7)4oY&LswCIztMayb>ZS}iM;O3{oSbXzPII>S(MyWRfv zATDnc?$pIir8~sP_VF;7aZxV?M6{uzPpD8g~@_yXNr zB;R=?V6P)Nkl15QR6t@02oiI)$L(4~hta_zwy;TBwDBXmJ~{(MCw)JLExpl!@OVbK^}+G0yeu z?3puXcf))>xAAzK2(Zm&qZkf{%Ky~`evZeZold8laX1_j|988c>Iq0h07xORUazgy zYFVSvuxvJK-EP;?>9jE42oX6}-~ch5PVMa}*!y#^*T)clzg)g+wVFjy6gNu{5QD)$ z8%m{;WilCcC9@GPAOzd*_o@dA%mLeKwNe-FI+;v_qiQyr#W;DfSZHi1z+oSuUa#9| zG?EhU0>0gDh39g)#F`YqlF#S0x!rDCxm=EC^q|{vxzrklk~^Kwj|ZRO-p-dGN8wIg z+*G?vpU|O@;6hXh=*D0XVPXaQU{JBUh6pKZ5pc6(`t5uoD z=2R-BV{~;QpsNFwN<}g;j2Xdty`G#e6bd@2>suR}=w>nN`FjMqqX@^ruP@Nei{y76 z$ruR{zChw9;rGH-#3njO0iE!H8^<_4ip%!8Si$cn>d)7o@OAut%ET7~G<-IQq85Mv O00005d*5QI<4&l9C{nKFG|0Exm97NP;k6c`B*g2KWQqOmC4xa18l`8L_hL6Ty<$KKrR z?D)W4?XoNq^E}(KEG6@OyWM1cKA$CDuUEknkO%=q zfS1cfif>Ow*3=+jy?Zn^&vQFXlhhz^3MjA<$FTt4pN(zX)&V&P>FeiS6h)4FMSyGo zhr>ZKvjZZks&ab}f#nPsgJeM3h0Fo%f&xZF(eZc`qOR+tCJJyEHUP+H44qv^(14in zRtjLDYZ!)Z&NNL041kPEYPuf;f$jVL#{)KC-tYG-AT?C^#Q2~!)C&QfnCo;pNmd|- zAVmeEjpOKWNs|1&Na{LkRiY-VC%!L2KzH9Lb)K%fZ`oTjmB^W>o&Df%)G_M1{u8sh zNGj96>!^5n_)?+Q-B;mE^yT}ZR~sMv`Bw_IPgI|;K4Cw$Pnq}t-x7niQvs4B00000 LNkvXXu0mjf8t=OQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/160.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/160.png new file mode 100644 index 0000000000000000000000000000000000000000..45e953f8848a02c4a9363e58301305924507d39f GIT binary patch literal 504 zcmVY@Kn}rE^kfhfMa6?42#Saz_?ATlMFde$K|Scjit(Pn(mq&HJwf|91a~|Y_(bmI-QPu|KlnCoX=-mE|;4)olcJbhr>bm1Vu!E zK@thB_xnA@<1tF55}M7XtdGZ|ok$^m?FvkQAhBF71ImXlb&qe2PmNZqh3$50A4E6= zOu3e2Nm8*`M7P_;d_I>LMJAJph!{ToQS5_>JbgBs39->=NE@Tk2!p`@>-8G-dR;1F zJEm2sfDW4$sL0b7iv@bU9zqWauRbLro6Sb{=!>HQs!*Lt?A=m#h(@D$(us*g0{wm; zZ(1mm$;e(lpT}~!lpNawo|MgI;rII;NTpJU$K#$jMLr&t%!dfD=VyJQn^-6m5C{Z3 z@fXdl)oOng&=8*HCbH~cFzAW%hIYH%uKoC69KzwSv`O=B4w9L93RNl<5qa0<@-}D~*A(Qw8E4x>GsZ@lq;|WFWHKp< ukw`>_inDOdlM38V)I4AFgsY@Kn}rE%*h}sii!t85EKzb@GXl9iU^{hf_l)47cT*SBL9&;sZ6!Z z#@#iCa>t(Tn(CS!HJMB>7z`X>Y`I(t+U>S{|I1VSIh{^8pU*dOJRTkY_xru%6C@D= z2AN23z1!_D8jVma7SU)lWPLas>_QUpYb!7Tf{CS42~a+Kt9$%td}%bBO>8zB`yj$W zVB}hsB}Iio0i8|xHLTYRecv2>lf#2_UAel@e7K?e}B%vCr7XtSDtWR_&=JR<30s&8a ztCdu%)jtI^gr~U^DLWVpdg8pH?RI-1pb<2XSLRM+aWoqB#A&d@L|zN8io=phrSPKL zp`uEqBHm=PS%g9%X_MyN93(UIBr2E7Lh`Q79bLI!_e1pQw4h<_TZJ{gjDcNSIYVC~xlZ00000NkvXXu0mjfxn0~i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/162.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/162.png new file mode 100644 index 0000000000000000000000000000000000000000..35d24db578a41d3a4fd22752aa583ea58ef27c89 GIT binary patch literal 507 zcmV`Y86nKxUs#rvj|k>(a(>I7GkS$7;1gtyYtY z*p6vcDxkuq1u`=Gd_G6F+r{gh!n02a$$Gt(JL=-7fGlKZ5PP@O4I+^U9&}(l9!Ia& z!;2Kk_G)sSdMo zcg>;Pv8TJHx~50XW;2XNBNrH3uh)WZw=3WO@)Up0=QFO?>s_2qC)fYO;UM`0NrZqw zCK6ol_j^nx6O_wkv|24$ACE_;kVO1C3QT}tVx>|6Q~+P<5#JgYjdr_@-EQX`M7Riy zT+6bgs8lMU*Xv=iSV)W{)9F-5Og{Zl?1P0oeLkN{Vzb$lHpb&IhQlE?n++O`hA3h? zrd3fuhfND)vVlh1H!elau!C-(l zO_a@MWv@^uV6|FFjpG4N%H?th27@l7(`h6U316HfR73Sbz@A_9iQdFwv4~J8e+bdXA=q%azd s%206@Zu3Ne_lcV4Yo72eyib|<0hPyC${;{|rvLx|07*qoM6N<$f^skAng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/164.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/164.png new file mode 100644 index 0000000000000000000000000000000000000000..5119ef9e8db5cd4f6498e73bdc8b5832a3e8c26a GIT binary patch literal 508 zcmVsSKi`s8|Sspol1f-*Tv+h(Q!oPz!BrYy$p?RQVJ6CzG8Q z_Tt?o#dz!6d9&}$zEzXS1cSlA0mhcgrJ&tz%lAK?;?L=H!ufpu6UXDx@qfSH3!k8f z2rx(@!S!yp!)P=@u~vd^kI2@wi?_;%Ep;oI& zMQq2kDizRS(*hNF`g}e|x7)?bjl!c(iO71rmOc97sDLU|XA*n2)DVs8XqjH`#0!p->3-I!^Qc93(UI6e^d?BJ!-==WWn1t|`cUGtRb&W{iz8Nv&23 yi9|vY!{M+D6=&g+Cl$D#sCmBT317nfl!sSKi`s8|Sspol1f-*Tv+h(Q!o@GP{ku?hGmQsqzNpG7Db zRK#|4t5N|S)-6zxr_bkebh}-=-5GfH86vV?uVs(EI4YnD)tSWJP2&cUNCXcmF&>Yj z*X!X$38m9%*~{f}SS%KjV|(zelrxzO{C>X!$z&3-Sj-cr2&-ZBBEX(Ml)9Uk&*u>c z1Uzv|ajVtpUj;OTr@4tNI~WXl;=Cctvd#iDf(G)++(afvqft+s20KjTweYGqEU8oq zPs%`6RH;%b|is45FZdT4-Zq6Yx)@%Ad$TdD%B% zFW#Lg-tFG(%-fkavuZM#U@#asK-+S;6tvrIS^x7>{G3iFoX_X0I3ACV|NVY1{sc*c zfJQnJ-0yZfj7B3Ai$ydV4cQ+K2Ro2NTg=l3>R$#FgtxgJnRYN3^w`;M7D*k;;^Jr zDQtB)%&1bSh&I`57NJl`%A|N#2g%GliOS`&kg)G>dS&~#Cn3+xINKtcF*eL}YPDKO yBoY!B4u@r^I1874l7ah)n&)et@Fm<&nfL*komjLF)jU-I0000-BD&PAAv@!{H!!21$f~ zNdg&M@ArF5CKHs)Wwcr?Ss#x_r;tSaItomJL13j)0aO5=>Ji^ME;`!nHg>z6a}dKt zVB}hsB}JuD3B6tqi^W26B$-a9LSpdrN3jnU^7Q$9F2H89DQ%3$V+@BwY&IJ-8Vymz zc1)|HfDW4$$jH-|%O(2#KHi=bUII!;w%e`j(HEBjvXGrc?A=lih{a-f)`iJr5`)12 zubL>E&B|V(P{3-nk{ZW@FU_3GwgMp2v73@DLWhv`|`XY+qQoRXao)9m3e_Ij>qG^JPmf4$ZO$Maab~$j7X%S zTCFDD>R;xn7dw@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/168.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/168.png new file mode 100644 index 0000000000000000000000000000000000000000..45ee499cf9a7458257106a890979162e5cff3d4e GIT binary patch literal 510 zcmVgijULjg!B1))sDxb<9ol~OFWGr z0zfANX*}?-ZKNCN`Um zU5MrYFmx@;!naN=6bk5cI+)F7;v>j-JQffWPkj{oU?Qter&E0DZ48G)^!t6R zRx8wMHN0sMwqsfq22|LzKtxub&*$iNyLi_LFFqw8>-AdNp)L*vL?Jqp*t?}}5Q#+a zs1xJyIC{OF&`+n+c(_%_<#Jdo7LsFYz)G1+27bTaVaa3?u~^LGCkWY)y#TQ1CtcAU zn9t`C2n0O-XB}IuR{t1K5LR;sl6Ei{^!PcU?RNVMKp`j~N9GP>ax@zC_$jbMM2>}{ z;?%@w{h_f@9-0Mh4CaE~N~_y7O^07*qoM6N<$f-c73 Ak^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/169.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/169.png new file mode 100644 index 0000000000000000000000000000000000000000..07118c647bb16b3d958cdb1a1371aae96ad7a57c GIT binary patch literal 511 zcmVgijULjg!B1))sDxb<9ol~OFWGr z0zfANX*}?-ZKNCN`Um zU5MrYFmx@;!naN=6bk5cI+)F7;v>j-JQffWPkj{oU?Qter&E0DZ48G)^!t6R zRx8wMHN0sMwqsfq22|LzKtxub&*$iNyLi_LFFqw8>-AdNp)L*vL?Jqp*t?}}5Q#+a zs1xJyIC{OF&`+n+c(_%_<#Jdo7LsFYz)G1+27bTaVaa3?u~^LGCkUC6y#TQ1CtcAU zn9t`C2n0O-t!7!RR{t1K5LR;sl6Ei{^!PcU?RNVMKp`j~N9GP>ax@zC_$jbMM2>}{ z;2Afy(8wfN<`d2FJ%U0r}sovn`@oV}s0~ zR;z_XA|Z+4a9Ea#yKosN4BS`LTwimAFU@_GX+L(0Qe}pjoHhUe002ovPDHLkV1hfR BZrE5JgvUk`twK=`wvTfaJoG5pshiC@>PX5EPb?kQ?NJ#wEANIdYN>Z<5(8Bq=7d z9{&9K^RsJCr<2XHY!cKimy5)HznA@f^nfu)2E-JklWEW?C}2etB}pPgRaHq%6yPvy z0Fciby1TBR0kJiUsRCG-x?ZnE0rKNG7BB!ZDygXtK@ixwu75nB5#u(SjR2L18t!W& z-|#_es22hzvDe{nkgPyRAVmeMwQcKgyWQ^hMN-!}s}eO?J@I`J0;c;$sq;)-e)};u zQ;D33I@u5Yjk?D1c>EJHxkxJ0zw4-YS$wI`>+Y*?Ci?RI(5sCP{{9mM^Czm$SD&yS c^QTOF0>Y<@9z%2b@Bjb+07*qoM6N<$g7VqJW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/170.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/170.png new file mode 100644 index 0000000000000000000000000000000000000000..9868c88776771550f209407fb493e689d11bccc1 GIT binary patch literal 513 zcmV+c0{;DpP)h2aUi&p#UfkzSK3|ZWW$y6zcUlR;!hr zh~^+Ll=yW<#elnTF-L*m{lfi5@lNehAW=f?}@Or%ti^t=LL?UN?lCT<9F9huQL1%OW zv)L?sKHr)DQDe*H@?QlMgxTCcmhJcZ&-|RwdcFQ7pb!+0BXa{891e%i{1n(BBFDl} zaaj_H1lC$eR#YmLM4NOvjX)rP5ACOT7Z=IwJc)|MqL6SC-}TAS@=ikjZ`Ros(X6py zCaBS9AQp>BU@#bzrQ$A};-mui6E)A*JmFJwKV{kvASG1%qsf`y00000NkvXXu0mjf DqM76^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/171.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/171.png new file mode 100644 index 0000000000000000000000000000000000000000..289c19612a04791428220468bc5a3190aeed73e3 GIT binary patch literal 510 zcmV$mOcAVNDubvfDi(quC?bmBTSNto7(_t@wa~`KCg4xxKk_FhdnW9S z_g+(syLX&9bLQ-fnoK4b3D+r961MQ+U2rXfztwY&KRQ znhn6v?e%*2)`|Ii9_@A;v)N311R0OV0%GE+k76H8WcBHEicg(ftJS29;c$q4zmL^w zg=)2m7Y)L8Osm3x3Y!*)$m;X?9Gy-FuR7t$s{~}dUQ0XF#m0arL}wCv@2MMv!(lw= z#8@nbZnrD+Q>hg0Jqp=u7K_C~ax4v4DV?&n zxg7j{zstYXEGw1D9|H=)YR*8?4g>-&KVN9O-Tnel2nxt2a|SXw5{bC{6xb#rpM_7w zVM!*FLXnKh<+5m#$z%`=2JxZ&6z}RFnVBb0sZhDH!hrg^PfqTc za5wI*DQ5TX?97=nXXdK$c#M9(Z!`K9i-lOT*_8Kxaf*-Q@rcvubkPongYA2_+eti) zAOb)q18F>Ow_6N{L*(;$)M_<3@ArEvkwAP~42*-uz(Sz_C=Wi>HQsI&o^KTD^*Yw; zwN;2_12A;E-7da$VlJ0MtJT7EIu##5Mx&8{n0V@=*as6?eKMKgLnl|ORcT`|7@*hd zVYytQQmNoYgRmXbsxY9!rUfFh`fN5syWPgCPI&St0a>k9(hha8F(3-jnZ(|^>I$Jy z2=_WM8jYgU=?MK~GKsrug-j-c`Ft)pmIhzCYATh2*Xy-eJRV0R5^?znLN;VC0POi) zS9S(wvsw6jK9~Pdvn!X&e+(!Ht2qNn+wb?g{G8Bcv-t&}5EPIja|SXw91gqu6xb#r z$HGx@SrUnaP$Z*LsU+H@(`f_(0X%3w#k;sjX6Ff1EEWZXbLTWD7|#Ucf3wb(h-Qrq zGJ_h824b<8BnE>)St{%@sa3=T)Zt0DEClPh*oZ&Hw-a07*qoM6N<$ Efb%7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/173.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/173.png new file mode 100644 index 0000000000000000000000000000000000000000..91b45e7437234f38d7baa15daa20606ae2868005 GIT binary patch literal 515 zcmV+e0{s1nP)g^PfqTc za5wI*DQ5TX?3pt&XXdK$c#M9(Z!`K9i-lOT*_8KxIK{{Dc*N;+x@d>P!S=n|?F3IF zi4f39AdTnkc8lR~hw~KEbn9JqRYPB$(PQ^!((P$(j22Xty`(PlmPbL$5=-_I#Ds2n~1N3@5 zESF1EDiyqF61HPnl?te^X@QK)KAX+ZZnyEO1D-reNLH(rv_oBN6_ADO3}WwHb%jtU zgnJzrjYiSwbfo-bGKsrug-j-c`Ft)hmIhxsYbuq3*Xy-eJRV0R5^?!S!b(}a5U}TW zo!JS@X0!15d@lb+W6S08Uj-C|*_=R@?f3g#eokn!+58ev2nxuNIe`oghr=#E1-6OE zv2avemP8_fM=c;LDwRs2O*)-MAP~TV_EWrzi)415M8#rJNH}*+gX80wg#2&T*%HyL zv0)~t(P$tRi%DQG7?h>rE}Y|}0_PPq*VkO(b8}v0+7BNEQ$)?a0d)WX002ovPDHLk FV1mjx>S6!@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/174.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/174.png new file mode 100644 index 0000000000000000000000000000000000000000..36517d987a2346c872ab99a3758d49105469de83 GIT binary patch literal 514 zcmV+d0{#7oP)!t z>oW}_R=My#0*F52Kb3SF-56F;J+ZB2g@c;k-07*qoM6N<$ Ef@4hQ?EnA( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/175.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/175.png new file mode 100644 index 0000000000000000000000000000000000000000..5b765ed96c20ea7f3f20f40705c41308f939232b GIT binary patch literal 511 zcmVC}zZm-wFw=T@*^Jur*n9XLABguF?77~M}KZ<>@kf%?lQ+(*+TCFB+42MJX`+cld zD^#mhJZloRV_Fpjbl9{&MxH*O&(Z00@S+PIy-G;d>$S8)Uu+7`ML5RFD%d6G~m)e8Z8e%B{E zfw^1`e!t(9-)d~7Qu$LrLwK4KNZElvz?J6>ZMWNB0vbUBd1X!@izAVUD^G)MCh}T% zRUDRNGAR>7N~MyJa1!72O2fD(A^$hyY?)}r*f0~+ zY&H>($E7e73dvA$7A|q3!1+YY^EFTSGMrDD@dIo$R?q@JMr;58002ovPDHLkV1j&s B;|c%( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/176.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/176.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd6e4bf8c04c380f69c8725770b68cc025c3ddb GIT binary patch literal 510 zcmV-D;fF&qxj@At7< ztx&7g@MV#396hQipu>6uGP3)8K1a9P#k)oJdaHzFyW^u?ioEM#X9XMgl5M59qW zS%ry20=-^ORHf5tnCb?(Tn>xHLTYRe*eR3A!0-1vU>FAC@wg{W5-O#7A>hoTf0I1P4~$YbGA zaamHSlt`qaN~I#+WV2a>!(kbd=3QMRz4Ih0m&-!JP2_3NFus$J|Lb+OP1I|wnVHmT zwUA6Er7#kS$Wn0^F7rfz`-hZU6uP07*qoM6N<$f@zcG Avj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/177.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/177.png new file mode 100644 index 0000000000000000000000000000000000000000..594a2ae3a0f253f535f39af8093095fdc9a1dcf3 GIT binary patch literal 512 zcmV+b0{{JqP))vhd}qC{~a2!bM_2)-q#poky}Di{~KapR`oPxL?fC#N}6 zZfX*{nB-F$D z0MN-m8qeG97NgM!#bObSMnlf~{oY9=5Z?|1?VvHRR4T!^S9rTs_*U2Ww5{1}Vzb#e zg=j7SP1iI{eB3D%3I%jJ9n5Ak@eyP^9t(($r#^~(Fp<@#(BuD@3DF zJlctgL;}5DPgteXX_)E?xm*s5#X@o%4Ol6Y$siC2xXdsN#N% zz}{ z;JpzCwOS3!< zI0#I+mSy4XMj@NcqSJRXaUB!j^~NQ^)AQS5_(%sv{8@T{{|Divv?*XyCv>0mye zqg*cIOOvo2)2dWJg-r`&WcJBqf>x`AS55YGrG#X$SV%k6#ZduS$j%`4es`%53Sfl}IFDsSBjjX-ub6iLo_crerb+kH_OcEEYpJ96qs=gq5;-Az;rBI-}b$ zlgYsA^`6)twQs3Z`m2C~Fq_+vW&3=-6FVogTCIKwC*x0P42th&Q2r{Pn&^p&=^=K6cE2tc)3ydRvvt6tJmvTtyXp+ znghVlwJZy7w+gvj4y{%TlgUJU1Q`y80%GE+k76H8WcBfQjAvc7TCGYO{eBZv{obPx3We~X z6Qj{6I-QQNN+y%A)D<$B3}&;LPMf{}@mZR&xiEw%_kR^K(M$_4*fpLQp`C%pJ(&a5#MCr@#&oITntJ z%aTYWgd!Q0N+r=IolYYV2;f8eDc;3JGCNP8VzDS7ocp^zDH!hrUgecrla*LcJC)xNLWi|^*it#M7 zZ{NIm-Ze#0*euItL9J;TiQR4|`9GZDXBP z2q*$<+g6INPe#_%AYr|FG&W6Bd%0Ys27yyRfsHth1^D)C?D>3lKn_Csa@z~T(2>sw zkPRS;BFW4Sh&Y{2ZVw``oB?By3`o0>IiOuoz=$Z?@ApDfmZj800S?0k0Qroev+D>N z5HsFP0W5S4g22tW-EIX8fQ(9Ny1!npZB$b^7|sG>#QO9yb-9$>WS}*5YXK>N}Z?cbR&RhX{Hi66ScD+ z{Ea$Bp67pJW*13i`ga`_@8(Wa=yms1I1_#Oeqh}6?Snu6Ou_Pr>hskn?8ovc6JIGC VhdwTk2Ymnl002ovPDHLkV1h3axqkov literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/180.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/180.png new file mode 100644 index 0000000000000000000000000000000000000000..12e8316043c78c638480550a862a6ded157df54b GIT binary patch literal 514 zcmV+d0{#7oP)!#7iK#1ab(TVonB8QB*t#f}n^ff^S(=P{be#DyRp&c<~bOCvwV96X$HWM@&4SD~Ur})_K_c$C5XR+Ju9N(MGM)C=g z2mymkB)DF$*XZ~A$mMdVR;#k!Znt(JiTJh^m;k}Vd_IrZt-{N-!neA_heoYd!*aQ_ zHzFJaMy_R9c)L-^X0vEEn;4JB5+liAFc1=xPk$8qU?F!OjYfFZyH+X{X`|Qcq0{ML zKA)ppF5^>^upQH?D4@fp1u}B?$z+07tA$rh_H?C$WU*LCJM_h&fGlKZ5qrP8R0sxx zxYvb|NCfS6TT~?y30Ud^>2w;?=~QZL556>WGMR+O<8dGsiy<5ipTtQ*rBp8j?D<`@ zyAv~+47^_NN&Hc(E0s!r3TOy-b0<=^&*wXd^MqEb)h_{!pn*IxcOr{Jq0mX320KjT zvGAxkEb(|;BvMhaSQKwksTBNvKOS_P=A9iRGxH=W6beGZN#tqJFs@0+|7M(R6U`VK zW+v6^bws04DGUSxGE|&}<2+H|zM|&(nk#$^_f;l-0Gbn08Xy9|<^TWy07*qoM6N<$ Eg5^Eo3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/181.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/181.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5678eefce4d92585b4a9671a0dda041491bc04 GIT binary patch literal 514 zcmV+d0{#7oP)N`M;<&rx%(-XI%vHnT5Z!Lq0mf#tnV`{V$n(EE#h?9tkHg_`7Q5Zf@x9q>B%dIO z5HQF@g753~8vTABxm*s_YE|C1+pS$lB0g;eCO|MTpU)$9tMGEI@U1TKp;4>Vuv{+f zg9rzKk!x8N-fk4K*({pPCdT8j#7Ht241~nw(;vk?Sjf{yqY<9@bmI z;i$MQ@pv4M+CVBQ7K`FdDwTrY@5h6V)4a2bWOklJg+f6{xQUzwN6U8-@_)0=wuxqq z4KtJK^*W-_s1ybQ0a+^U!f~D`a9>e#ea#gF$D z0MN-m8t?1%8vTABxm*s_YE|yr?bc2t5Ko(danKl;&*u@lRd~Ku_*R$r&{nI}uv{+f zLNo_}p=((dUT+k#*({pPCdT8j_y{r>3U!0Yv%_#ZU8QmOREfP%1^JCL+}KHrI-6I!iSzW@}10&-;TKqiMmp%Xs^c8JKa za8z8Dcs!1kZikGD#iD4FN~PfU`=w2acXpA?&J(CmC%I-=32BnAQjSt{sP$+~4 zT^Nl<(dl$VRWg}`rLK_4WH6h}q{jB(OEafZDR{kJ2jcNKB9X{hoFr63^+Ld&-!;2C zF`Lc8=kuM#*E+XcF8?W@Aw12UNZEeB|18cMTCdl?1T=yM^2*$aEDndmXK@YW>dcZ;S_&PrxVWS^UXLOkGB82-A?cfk_Z8l z1TwhZZnqc?hsfvisMTt+-tYHTA&L046zBwlz(Sz_<5A)LUg7gW;m!Qk>vgQxYwI9} zjX=xocDquP%jM8&wJ@DdB}bCcXe1;WPk$8qU?ESROeO-XR;$v+U@$EPQWN+y%Cm&s%>pUVxe(9@8ptbi0$Ci1L|l0qY%`J9!mHx2BoYac zNJXVmNxVs?(+CEG(k9KjIY@fuNmMKrg@pJ1?7d7Q*Cgb=9%su$J;s`uphlyCcswqJ up-@PMinDNy69vvEs-LfZ!q?$^%8XwRzfc(b=JLP*0000z%_f{c^__Y-11cSgrp#bAv;q_MG{Z8S<{MPGrtk-Mn zAcl=V%k6f%Qk2W(&}y|XolYf3lF?`+BpOeD6#HNyPoGRC0<2c6(#BvgK(E)sa=ApM zQV~ULN4F{p=&){qj68ido1xuq<6C*~scwX1wOYv@eX%JZ3)xx3-XA;);cyrqW??KA zL#NZhmr0aNCS@;^$zVR8OO55hn<*`oO2Oyz*}^akM59qxo+LjeDb))Bdw%jN7ciU6 z!teLH@*7iKxm^BJKtp(%6G+*CK){vf4Q)1?GXagDfxI#&kj0Tm#FeMPHWPU*yebY$ zB9Xwe*$x$zN+t0oolYYd3`(0c@9H4wnI}=PSQHZ8`=j?fja-wE`+A%$6ZIHtW`Y`x z2IBF!6ox_}87j`gB~BDLpQwJm`Uzi#^C>fa0kc$54Yl#a0000007*qoM6N<$g85zK A`v3p{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/186.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/186.png new file mode 100644 index 0000000000000000000000000000000000000000..62b928c1574320c76c362a51b3d319d4cd42534b GIT binary patch literal 511 zcmVaXLio)Sv4As(ChVV!Q6a4muNH^vi^rt{5c#BI3AB@W53_q{%^Ni!81rA z1WXdh;C{2&U@#aUm&>7At;&A4+gXJq;%X@{2?l}rd>*k|g{NzUmm7sgz1C_qtX3=Q zAcl>=$nA7GQk2bR(QGy`nM@={lHqVDBnD4^6#HNyPaluR0<2Uj(ni1EN4ML>VzEHE zToy%a$FwR6=&)&lj68ihoubuh;Y(fOU0n#ta=Dam^u?xtEM#X9d%wF>2nK_A)rFBr z1nqVkADSqUNXWNzI*r+ECN-7^&sthCnS{sVu|+HvLpU6E4w`4(I>?002ovPDHLkV1l0+ BGPvGuw-}8^C=?2)*Xy$0@Aq~giTJe@=mdknVzCJ0PT}cB;pJB0(fT$T4Qw_W z`yhscK+Em*dQz0n=h1GrF`LaKN0RY)EF>CFe-!&*Ay1!9rvj|iYSPAVI7GkS$7;1g zwOSQLY)7{$3h1zIfs8zTKA)r0>EKKG@UE_eWW8R?9({2rAPd=9#NO|H3XwB@Z?QPU8Pd_Q$Ry_nj1*j!C=sn=M9;r`Aa|}Xdti54PmH!a$k?LZK57y%}h|U z*+e3dkiu{{EJMXvILC96S3lwNa6e_n4*-%>nPc~dJOBUy07*qoM6N<$g3gcT AS^xk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/188.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/188.png new file mode 100644 index 0000000000000000000000000000000000000000..4c78297c8bc7051ff97c74d0d3db3a3f1016b7ff GIT binary patch literal 505 zcmVvgQxYpW2= z2B7J7yIo1j<#K4XT9{6!;v>jtG!hUUPkj{oU?QteCKCy)R;$v+U@$k9azCb9P?k3u*c#;2JWi^b6C zbntBgC6h@x%VaW`&*ze3X~0UUR0=+y&t`^UAR3Lj`~)EzvKIjM{AE^j24=Ha`2BvD z|JAEdE|>opP!Lvg29kCl5ODcQ;__2qn~1y?UKNKWkw^$d zGAflyqD?xTMlcw}i|MC$HwQ`2Jb{YEqJZ$;pS_o9$*W+x7sK;0%GpNyMARdoP vVki`nq2erD#|Z=H6V=aGKjCY0K4sc3xGGTh8x(kY00000NkvXXu0mjf@`&R5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/189.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/189.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9a658de12d0522105c85ba4c95d2d6b203c4fb GIT binary patch literal 510 zcmV-E}7 zM6(g-a=YEG1m$u$v|24pr&IBfWHcHHiN;eO#XcCw?32kvfYoYM+87K5==FM7E|;iO zDpC>K(XC1aR9Lq_MrNPQW@xwD_*Nc#sv99$tyXeIU2GMQh3pJs?++e@a5#*2GcXp5 zq0{N$%OpxBlX8~HWH6u4CC1W#nNq0~d_JGe48uS)8g=8xvbDm;WlDAk5|jvg|-0;PUf^Hk-|vfI?6}UYQff;7BCm@>5`&h`bhF6^A8} zNZ{G4q@q%(B-*6YX#|5oJehuqcXg2T%#)~CED8zl{n2}#M(#<-b3M+Mh9bL5+@ZnpQwJm`Uzi}^C{DQ0b9;d?3prJbpQYW07*qoM6N<$g1uwq AlmGw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/19.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/19.png new file mode 100644 index 0000000000000000000000000000000000000000..ec57e79335ee3fc97ccd96e9468def29ebda3e50 GIT binary patch literal 433 zcmV;i0Z#sjP)Gh^={;D}aTmK@f-nJ#>3 b`IL!o46u%-@TakW00000NkvXXu0mjfnN`2D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/190.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/190.png new file mode 100644 index 0000000000000000000000000000000000000000..e69b125c94b5d038177a137a36292e3561af02ab GIT binary patch literal 509 zcmV45Ff};z1AuMMM#Ni>ROxgD9xrdQcEAUIP9^PWg%aNoA|U zY}{RQ=$+Y~?&|8A9yOUvFc=IRM&EL|6l=9wvi=vR_&J?UIG@i~?RY#o{&%~b#M1~O z0CX~t#{G7?#b`7_p-@1*UYGrTzqbtUjGiC9qbjNgKoA5dD51tJMnC zYE>Aq9o?!hpu)NZBC`5?K1Zk1!I$#kpl$?Yy1b#X8t3elOw-XDDmkw^q@R$@FJ zN4ML>hXs^MrQ|G|&0?`wNRF)mE2YzE`2Bu|8HRyaEaveOglx!O0NC@pRnZ-o%jFOV z1U&wyTZKxc^2dOJu$nuNw1dH*$IlxwP4gFkLQp_nnLCil(P-4;r@#&oc`dvu4ofnb zglV-yM&)u@w8>;L2!%q@CdIotNP6Z8R4SDOa zBoYZp42Q!qRGfv&IAP#^qWbyjCwyt{r%d|+1!z=*yHe_500000NkvXXu0mjf-RbAT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/191.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/191.png new file mode 100644 index 0000000000000000000000000000000000000000..cef7fd7b3383849840abe8f833e8c0aabbe3f61e GIT binary patch literal 506 zcmVF z(Od+k+Qu@43^`)oE7V7*?KHb$cn27>|C>osb% znpDJgOsi4>6*eu9k=YlE1-jiXzSJ$=)s2vBHXAvkF0Km5LUsnR_s3g>Xf%pf9hgWY z(ChW^p^4Jzw4CK~IV_h;iE%Vwrc5S-Kp@~U%d!xU$9;a1eCrriF9huQO=t81^Z7i2 z!JyA?YizYz{i}e2Fq;?1vO}Se&(9mOZTpviLQp_nnHR|5SS;rAQ(%{fycS*+hb5It zNr|keQmKeG*=!c!a9G-;cvlC>%sh$8<+6}`YN2==6pVWk^4yHGBcd5&!%R@C)j~3v wl)y+NB16SlxWq{X-Y06FuX)0k=6%YvAE^CRc(=3$s{jB107*qoM6N<$f-WB7nE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/192.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/192.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee21516b199466b1692e37ef76728f55312390b GIT binary patch literal 455 zcmV;&0XY7NP)K|%0@fC;bec4?0L7w zV%&3Q-kUdXcgYeBB$V*X#Pz7M!MZ@+#ne#0>UMR!=Yre z*;LGCv#T-j$1sO4u~w^H5i}YN%_T=w1vm`bZnu-sXe8_PT8hQu6+x*~QiA1jDW}uv zqQD(brBad4Khypjq1|q)idTCwyH6Q+=2Ogu0?>6J|2%X7X*Q-fhbl$(wB@Mg+f6BOTw&v9*h!@ zM5bRrw`Q{`@0nj;{Cum`x|qnkegRTHEExCk!q0<=N8pn91>C-83*2lrH!oIfqB98- xVa6nYNfQAe8$}StSJ{7}?)kbWoDBad6F)`zMY-yCmL>oI002ovPDHLkV1hDM&Hw-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/193.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/193.png new file mode 100644 index 0000000000000000000000000000000000000000..c54abc3c606100417d0f8b2ef39847a93c93f552 GIT binary patch literal 466 zcmV;@0WJQCP)DFL-FLnLn4Bx7f}$@fFy_H5<^hXOLNhihdxgqp|9|{ z^R=6wO+Abo_uHABZ+2IBo=1ztq6ExEQN)-`COlqRC-8GP9O!g9l`tF*>A5Dz_x;lR ze!u7S07O^-lWCeV)c1Tor}tYy-ENovE0Wp_W9C3jC_n^6!!YRnM$mLR%{C~aBmk(w za=D~>y_vMj42&}y|uIT+ql5hvYFl0v{!}@BqqEB%}rfISp2xSgX)GZ^AX0u7A z6hW_g9UK-w5jOP&aMJJh>819Yi(VfL26>3+S6=|Duab=Pk%e9dCu;$hL|=g0_b7>* z&F138%0g5jAw(!6BoK=sf&kla1i|bo>rYfYU-g8G(4R7J1}C;iU_?@!`Tzg`07*qo IM6N<$f}sG>Qvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/194.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/194.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2970a91f5bddf3e909cd7c7f630b0173468f4b GIT binary patch literal 464 zcmV;>0WbcEP)0Ma>GKtv zn^n%(M<|9fx4Uz*b9-X3SWpy24PbA*UNgqyF|U{M1b&L5pyTn_fbaYCd@E?VTsHQz zEaQ9tBus$KJkJ^GI}Ag5y%RJT4EVn)Qiox!6sQdakf6{o40^Z`G?`4Q1L|lH04fm2 zF|}H)29hK>YZLwm^r1`a_xooAuIqBF-YP4A!(clc4m6w1C{0tcZTpPCaU3StY&KMu zXcZki^&-3!`ox76u$=v`cK5pD!0 zBd6Ev@ruKso(X~=;8W52qjViJuv)F?TU>K7q|fJbj#-w)YCu#eKv0(qKicg!{YVn@ zs>e~o1PDT=p70^%d!9$1k^sKw@!@cIG7iR->#xQT2S)6Rtyl%D^us<4P1=`tMNy0000HXCwXw*u_>zRz$Rhu2Ga0zXNTP?lvC*tShiw}Q6YZDl`- zBF+au!UWiiEhx}g^sl%}53e<)INKn{lH0a?*&}=r#4=AHT0I0xn zxg^6dD)2n7)+YQB=tGw{7z}CzqtS?C*@7+^!#Vqe=SU>Q&#aIu4z7>QxF7&2e>Xc-fTAM^zIMvZpTR|hV=D%P4AMh)oQUC5akLG)Fs1@cDqeK zk_5f#anvvYf{>{v;55s!=u;BF7d<{6j|&sgubu#@U$PkP!wWr*n!E)JiJpMzi)7*H zbhpS3Th}^rsA*0SKQ=yPCL;L;wH)07*qo IM6N<$g2X-0%>V!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/196.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/196.png new file mode 100644 index 0000000000000000000000000000000000000000..dd10834460ad01e1957b5abacfe4596c65b13620 GIT binary patch literal 468 zcmV;_0W1EAP)z7ii9G|3RF}SE^G@40gYu#mUu`A3TOaXwq!Spr&Id46Xd!s|5ruoFsy|FwV?nK6t>%Kx^D;yf}l8{iW&i+ z0`vKtTCG+Mo6Y8;P52|whc3}^oC|`%V8F3ztE>PHgDp){S}Yb6MGj2*k7Zf(EpEB@|61@ok5xR&n+d~^k|ZfT_>zS`5{6+Ai3S}G2kQ6x^dJpH z5pD!0<5q0j=Jj0y>X~3NneeIT{ZriV3~aYsPC_xHFPBStl7yydvKkN-3J}yK!;em< zL#8A_uX-FcOn@L{>Ipb)I2_Vz^KY2+_-HgLO+>$X0;ImlVz>`4^f+pY7BD1w0;ca# z7RGUWb+8H(l}RuW%rFUsRTEJF*-!++VwCkKs-CZU!d2)`8TbXbsYr92r6{}r0000< KMNUMnLSTa4QpULe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/197.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/197.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0c2753efd4010d08198ee441ef86ab78894ffa GIT binary patch literal 468 zcmV;_0W1EAP)4qH5ZzY$Q@r+2O7ATcq)4cqJbB0=2?0sGh(f>*5IyKcMG{CZ%_X^c=pX1G=}+ii znC_dhG1=6^bK}m;+c$4##d^J_`Fvgh_V)WdV=|fWdM!`jC(ANApU)NezE96hL7UB{ zvY#Xg=K~;N0&J#f%2404*^J)r1UZhw|5cGX3~Ql4Z76^Qh3$5m?i+%p(`j))85IIR z1s011wOXwTw%cv3P52|whc3~!?HYmWx*RLF$_n5x*y1>*<#I`<(}{Y$UX7sN?=!*S zaG*TTFACK4n5IeJ;+A{=uZ8h=%ql)*P7nkXMbX8BFS+?6(dl%EM1zjUBMk-vdXNU9 z2seV0kz-jFuQ&|qnP4;;@u}$jL)`ET>~=ePlh=r1NMEg195W1q)qto_fS@iJessHC zG9(Fl)#IpP0t6vbPk55@hr=PgH2;Q4k9(eXF%kXh36T0Ki{U=J(Br5nTELL#37Eb| zSr~@l)xj!ER3^bhFvBDimQ6$fWJ3`Mi&55}sCvHY374TiW#AW@WlI`1|CPf40000< KMNUMnLSTY_=hV;u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/198.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/198.png new file mode 100644 index 0000000000000000000000000000000000000000..d93a2f3837a0ef06c58158cbafdb8341881f4c20 GIT binary patch literal 466 zcmV;@0WJQCP)e3BW2sKPh85jscLL^H>q(}rLlnh}3l!8Q-vcQ&K=+d=+(7j84 z;o*C#L*kU-aPae;@11QCMG=KzSOMl%s}*B1necdRoxsoWc%(efD{vf#p6>+3aa@_t zvW(XQ5McpK9u5bF`kqdw^m;F7Fc|QEMN*q#EF7o_1&DyyY&PkkA;|arVuLa&0)Q&a zW-~Gjqk<$!YHcDPfj)GLwr$r0hQlG(%B`{kBn-9veoyoHoYFL z2zJJ)^!t4tUnJn31zgwVUD5lyB;gJ$mrHg8GORBa3wo3%(r&le4TK5@DC(AxhiRJh zBSp}wUI&K-P=rl=0i29RBl`TyMX!&?<4cI>S6=|DUy_XUk%e9dr)U9}L|=g0mr3Gw zyS;j`iV#&u2ocH%3B+=UAiy>pL9n>W`V&>pS3Th}^rsA*0hy9a&YdHXqyPW_07*qo IM6N<$f=N=%umAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/199.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/199.png new file mode 100644 index 0000000000000000000000000000000000000000..2e34539654210d9b321b70128b5afacb60ba293f GIT binary patch literal 461 zcmV;;0W$uHP)b;@5WIxsDQ@$JbS^9us9aIFz!nlRGzd$Uu#pfH&|pNcgqzSnN0AStNt+*}Pm?cf zZdTmcK0+}*`*wGBc6=x1^Eo9+QUmtZ>osFM9`kxDPvCJp9_f5O*Dx3i==nj=VzH?0 z7e&GO07#esn}@@Jq24Ex3B5cD3W9*YRgr3jRVz>%3LrtDZQJzJ5EMm`Zcs&y08oK6 zP06yX8kWoD)tK-{U=CBF@B3E-ylJI=CRkh5tI!zGSQb9MB2CTGY<0Zo~G WlHJZrE5JgvUk`twK=`wvTV95m%$fB_&D2ye85EKYY77e0sX?%Y%b~TXr zzCV&r2$20bGzUQ-ncV>qr_)KA`34bKdcYVY17Zr&$u#H`6tE(Sq9_ugq9~*$3UC-U zkvtHvhVHH_Xh8h&I#U1(Q#YH9C_w&hw-Yb`GAgO559{^XmSy?l!Tn*J=XnBDB5Js= zjeNrgt)X5Bn8aR5l1Nq{O^~93)h?IIhzrB;_eE0IIjdwfSv_%m5dx;WMyc~mT|Q*b z%~Yb%M4jvg|3+OSP18RylZ&J>-Mfy8x5c*#z3#4x(L`6i8yLqL_~7n8Q80g^`h4{X dyD@*t#1~a>i*?1yl#u`c002ovPDHLkV1oQw!h-++ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/200.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/200.png new file mode 100644 index 0000000000000000000000000000000000000000..b22b103b7c9d3881dc1693cf2933560efd0fdf65 GIT binary patch literal 463 zcmV;=0WkiFP)mV^LM3Li z88w^DS}d2#i!tGkz#O{7e!qV~;5ZKFs-v<3I1IM^eoyoHoVMF7bvm63f^N6V1e?u< z@;pB)P`}5vZTh$uJo|qmjK^bE@zM}9nM^26)3XP!a`RJy+wC@eJqSvYge=RV$2-9w z{1J3UO|RGE70sZY2|Ul^u9*EUm(807=Ny3(##i9MW6k&lf%Ky6)LT%&Qkb>bnHPeR!egfhkA8A<+wP`ko|kx7%Gk zSfz=|B$x#MGCHT0{DH~~t=M=ZOV2-W}q002ovPDHLk FV1m9T%Z>m5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/201.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/201.png new file mode 100644 index 0000000000000000000000000000000000000000..bc324e1513397f1f56d0525491904542fd97c78d GIT binary patch literal 468 zcmV;_0W1EAP)Ar=6ln|KpjuJ-KN)D!M*?2LJ$P(;!6fQ91dx-*_<+XstJ0NWYaY1{Z7zwxg^`R>HbDA z2`7S`aVniohsPfYxMu<1_jyuh*mJ+Fveuz2EPjLPWp%0$6>KWTcNQ^g1|23%Dfu0^Gg_ zNnEej7cW*3q6!HiLKz`}SPl^c*oGqr7FSt+qU!moCtQa9l!0F?f=Scn@|gYr0000< KMNUMnLSTZzSI*-A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/202.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/202.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0a98b7d343dd122d1e94c09ee9341f6c40862c GIT binary patch literal 468 zcmV;_0W1EAP)*ibK$^7qgY;?g z3!9r&&e-Qr3}mXq6#_s7 z7K;Tn8jT7zn@z1v_#@DVF41wE8bQC`=UBN_Rse^=w%_k*xm;2dMbv7wY6R_en+bNi z9UTsblLB=;wr$hHjo{w@YhgSdvx+xq>})opBuP#l++PcNl*OiL($lS=Fbt{F>ClTb z5Jk8VoQzxPcDuZONkBalj7B3q6}{hG37&!NcFRd9hV<2HMX!>u*=({J5ETj#)Fs0Y z%d+TOlAu>Tjv6LF5Hj@yoaVYNef$lR9v=(_Clk@Ho&c$zvKa2e3q6jSq6G|zo`C5~ zWnmo0X9ue=QJDl2!3>j7ST+#_kPSs3EJj&>qU!moCtQa9l!0FjYfdhh^DS-w0000< KMNUMnLSTY7#m8>| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/204.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/204.png new file mode 100644 index 0000000000000000000000000000000000000000..f12bd72adc43252c3327d08b0a162d248eaa8109 GIT binary patch literal 465 zcmV;?0WSWDP)eTiFIE|<0a zq9`~Y00|Rd^KdvY)OQ$$^dkve*X94JNF9b%D^ME>AVFcP)uIn^L$ldTA5cY&08oL& zVnNMjvxe1bb-FgS&$Rzq@O__EJl_clf`IZoKYM`dg5&LWn@BWhyWNuGIP}mET!b6J z$?x}q`u#qyZxT??1e3{xPet#a(sj&0nx>qDVn~nUn4Tn|Wm&8SL|OrYreyeG+csH} z1ihMZ)Gz^pkZC61w9#lpFS2L&V#YnsJDZ4p%>+n&mBnx$UYK#z=oT;}W&)<~Q5I%d zc6G3{iOM9H2xgds!m5cVfNUrNp&n)PiK^$To^TcBQwDwky>&_Eo?ez500000NkvXX Hu0mjfpYGI^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/205.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/205.png new file mode 100644 index 0000000000000000000000000000000000000000..db0a8181c751240c32ca4e1fc4c23e0c798618bf GIT binary patch literal 463 zcmV;=0WkiFP)U z@8iT|tc&Nw`TxIp|IHtB#F^?J?leV^A`c>+I0QBYZy4S1eM-{PL)IBx78 zk4Mf2K*9vr%=4U~zN09jUr8_=4*9<-Qiox!6sQdakf6{o4Ehjv6a+zaKphPNKn3RW zIknsE29hMXY7_nl^r1@}39u2_};XpNif;rR$i1G)?LKQE)M&FPBS>S(e3WKvXF}P?ropI-L$#k_5f# zanvvYf{>{vyh!=3>(c9kU|;n3cs#zCh<^11NPUyVa35aianw{TU`X@?Oy9FC-0gNZ z2dgqsnFJHT43kh;HxUJp4MiZVMp=KN>iMcCT!;RYfj^%yOpSRw!^Z#s002ovPDHLk FV1hje&)on3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/206.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/206.png new file mode 100644 index 0000000000000000000000000000000000000000..3df5b46b176a80154eac7f3297298bd804c6111d GIT binary patch literal 462 zcmV;<0WtoGP)K?P%EHj@Z ziL56mA_AP;@Am@pJsywos|A|Pru;V~vl&P0z)ToWgv4U8h*x!o;c#d-NFyUam_ita z$mjDJ#BqGpCi7A3!?oCGG_C|%t(Mf%t%?ICOtsx^hbW4$UawKDR<8s+&l7>=a*5;d zcyVBk$M=1FpF{hvg?_&;E}k9~Mxzn7+wCO-9v2fYl}dohVYOPJR;%Gn2S^f6ggd`H zD%9(B8J{)iUIco*p6trr-!+MMU_PIVBa&%-GMS)|Qz)0q;)X)j0gJ9>=259s@S{c8 zt6L{W1X!d^cLANW+iiTFb8+jPPUjLL`*j!4>X#-neP-d-$+0c)lDG?a`w~suY&JJ9 zmJQK_#1N^>kVs62NCIus5e4m4cAuzuzUB$1;XY;J51w95L04hug8%>k07*qoM6N<$ Ef;SMze*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/207.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/207.png new file mode 100644 index 0000000000000000000000000000000000000000..29cea80ca59bcf15b0457cd5938d2c7f0d1216f4 GIT binary patch literal 455 zcmV;&0XY7NP)b;@5JjEjEZoHfLW0T_1qC1^1T+XFBn%S5LeKyrAmJu%prgnI(xlA|(x=H4Ci_OL zv6oN`Yj)=U`SW+zo6qMGhG8z)Td&s|gTX-8M|B=Qr_)I;mrE|X-L8Ci&k{vZZa_h7Cvn`o1p~`@yBBhS7M{lxFcw_TAIs_stRxzw&U?A)9F-pyPZ@jl{)eF`)b;MBlP=yRq<|WMx&7&4u_iu92brki$xLdMYh|mRI62aH3kCWMCeRS zyBW%jeY>H{a=WZYDCXTY%Ir1IB&4aPwf&5x6970kImS@dtn!Q0P4kuEYQU002ovPDHLkV1kaK$bbL< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/208.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/208.png new file mode 100644 index 0000000000000000000000000000000000000000..0771a348109adb5871c535b49adf4dce11cebc0d GIT binary patch literal 468 zcmV;_0W1EAP)wj^M&*^lM^Z9(!j>ltg-tYGsj{%|p zI0?jTPi0GHwInOXnlUhkk9=|WGM!Fkx7*2TwUWVLAdAI9w%cu1EC9d=sMqV#@Au_9 z1!%Y1n)u=F^lYFO4@*Zi&_<(?e5L^elED7!niNHmG#U*V4u|Te5UnZ$6i$*vy4|jV zl*?sh(Q37%QmLqqe{WAtYPFgcfMLb}l;?uefZ~Ib_p~~+`5C3>m(*S#e^*)(S5O@S z5qrI!tk-L;WE9y0SSppYZ}u><>KN=5z*Hp>id1J0tMPcO)o8`P0RVzQLI*^H;^o>W z)SJ!bpJB4=RsgD*1Es6gs?tX=`UW^ZC&4xPE#N3#MPubQ(8i`QZ^0npI2;Z#nM`Cp zpG&9HQ4qB7N8D$TiD*tAokW-*o=@A4QwI4bYR}i6uy6UNjQs#m1$}gz0aQ%@0000< KMNUMnLSTY%zSML8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/209.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/209.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae466467c53d19d9e64e563003f9a312183bfe3 GIT binary patch literal 466 zcmV;@0WJQCP)ak|YTX-)6H>o6Tl={uk%?Ih{^&KA-=z6@GX>`GkuUCErqikHb~{f1=joS}#*U$00j#Se!Uj8c*v8|rvQdgZ0RVzUq7PB=R*Frc z*=+t=CL6Z`z-A6QU9DDCJ`JPe0O$847^7bTj>~nFoJ@n>*f!=ZSR@>W!$BsKiNtX% zolZwV=!L)HzKX1g=Je4?LZrE5JgvUa-(!9UFH}_E|9P+Hy}X)mJC96fv{w`K@>EU+#=`jNjAJmX0td+F`i}i z@1H;4yQZoto9Fo=sI_e?ktB)a|8Rz%aUAV5O%i?I+r!}?neSm3WZg84~=c=TC=isT{|ELA^n&miXun8AV4;N z?RG1f*#Qy9QFZsPc*NL2IZN0y;5QQ52FD zxPCT5iV8-%Uat$k!?~4%7-8V{|r|a9S0HQ}TmB^W>o&Df% z)G^Ak{1dadNGj96>!^5LeW}pv?yGPn`ttq2IL5#SfBuDn$0w@KSD&ySk58HS1UUqf U-92L~Z2$lO07*qoM6N<$f_mS-;{X5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/210.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/210.png new file mode 100644 index 0000000000000000000000000000000000000000..8df36041f9362449569572156727fff6fa0160da GIT binary patch literal 463 zcmV;=0WkiFP)& zdy*{5?kTI@d-b~8B}pQy)hY;b+wE3ku~_K(U!CLUd_K$Na``h(r&I8KI2^Q|07L;u zQb^byW@~1(CL?1l6j;JX{&2T4pU-8#-%FaNG8&C!v)RaQw=2j30D^*6t0lwXP`+}2 zZnvwAZ|+9F4b0kqGGMUJGUO*uY>_4wfQ4~qL-Inoqta*qSRTbdydcBr@zpo&* zT1{1SIvuIk>zd=gmq#bfW>X1JSSSDmMsat__L}dJ&7aY|lczkMAAVLwq7EMd69mL?Z0$kv*MGm5ovS696E%NcezhHVRBgkK_2) zWwPT|0N5;n(~U+$ZuW92mP#%^Odf{R4rcs$B%Hk0LYDZO4# zLGZ%A;=YQ)L`(YUG@=CaeA#}TDkwiud%pIB{U|?W;v2u0e*3+n9pnH2002ovPDHLk FV1iQ3%lH5Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/211.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/211.png new file mode 100644 index 0000000000000000000000000000000000000000..8998257172d1d0b7a931b4cc8f457963c5441acb GIT binary patch literal 464 zcmV;>0WbcEP)jDR?frQh$%PY%#- zw>9z8-RZZ1T0ANpY@m%sBl*e$2qb~~_cbYsB55|8G8_)o4-uuR0y?~0E~VS;DoC|j zRTW8+NUc^=AOF2SJ83i;N`S&b0Vptvdr-EI{Elq?M8V6WleZ_QCnXU_AA%3-M<)>_G|!jq$Ekw+6Se1SPuREoQ^vjl-F10=6agIS00000NkvXX Hu0mjfQD4e> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/213.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/213.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2ae88a8079c71c1724c0e9c9e82c479c027816 GIT binary patch literal 464 zcmV;>0WbcEP)|T;$+`Vz;|Nr@S*Ck0JtJNw9a+}RYW3gE1`d^*n=X5&B`F#E}j>lv0z2EP(o&ZDv zNK#1H9%gH1wI(BD%@tU}M}8|ina}64+wCMxQyGm$634M@x7(a703ax6Hk&dW4(0vP zNw?e8#+Q=QZv(Y@R65u|n@lG1TD}$1z&)c^CJqJz z$+AqDOd|WswW(66=-lj4Wb6d$6~J7j5s9#~NA`3&RW?TPPXK`6BH;t3*(fj}z1?pA zx=eQ53ILlWaJpWvt9%S&Zh(vTBsfNY1QM6KX{?+E-q>v{MsSfx91aJW&1SM(E~VG& zDF|NpSKL>Tn`lWNoko;ko-f<4Qw7B*YR}i6uph;zO#A>J(|bF98wpYX0000iHB(>?AGsJgnNFv&+wEkvTFGEAki}vl+wC?Z3jih-$x`+a%3 zbJA|NHSwX~^lYFOk4gs{Xrs|c9;0g@3GCzOniR*eG#U*V4u|T8h*DJn9Zu6!y4|jV zl*?sR(Q37%QmLqqf8q*KtJRbMg_#0SUfqobyt`X@x$Ke6&yUOb?P8zbD-Ach2t*=#|T;$ZfECa{`vRcS+`g$WHy@xMr^%at4$^oUH{8-e2&MXoKB}d?Ql2*``vD*`4}Jy zK#)Ytd^%e(s})%@){KD#eB_s+lks>g+wE4C%cTqk1DVg~ve|61W&r?3LcLy>e!nlT z4^GfDV5wBnbK}Fvx?`|c08^DhDAFAtR&g9_H;&@p006-tp#!2p5#i_r z^=7mAYnbf16@YFQK;>L}TSP(8i`QZ^0lD*zfm}B#BI? zQ|WX%3W65?i2E!u5iRJWQwS5p^J)8e${_zl?fKdh_AUREu^(AoeH|dd{j&f7002ov JPDHLkV1hwJ)vf>l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/216.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/216.png new file mode 100644 index 0000000000000000000000000000000000000000..1f057971ed40bb82aa003e72fd46e91f337eebe5 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl7krcg{Wc+!+%^kt~6f ztfCmNN$^@Qw;nW`O{vvt8iaYJQc34zr1o>-1#^r>y%M<2Zns;_#(X}XYc~8@EEZa# z?FI>NE|S}OKsl7ch@q5-sgR}jAb&|9uyX?O!Sg&d8G|u1)5d%WE|5#_i;1a>9J+gv ztaSITL%^YSyRDtzFx|2xrzX1cU0^1eG11C)<5WTZiQ4CDpRkMkQwG1DQGI~C>JDiD O0000V#<#H*r*(?S2Hk*xNJRa-%U!LRVbUMl9a=DA+@tFGF@AsMyAW;G~ zNd$guhf!gNtQc#ez&3Wfovc2x}}9u5Z?3au535 zYPIxxI2=l&(UA3eo#dm;(Fbf)JV%NBeqXB9suYVwCHskRjtQ@E3^A>$0vv{|-EM0_ zrBadL)k(M8mCUhwfe^lkVSj z2sqSiHgyslW?I&AVxlkK2WClFTGw*zTKnD=ko+HNDzQdr=!W22w(0& zzZ;E)e)s!*snu$-TCL)IlsWoy-0D*64%N#WUPM8RM%(5kN) zCm+!s1>U0djR)0gRf@%;CShJSo7Fa`NbeBh1#65(y%PA&ZZ;dO#(F#+t1A4NOeU(z zra{4*i{#H9*aV0s{WFS?#rGh6Ng%K_iMSqyp_+`rn3))3x&@!eWlS{Lex52wKT&(W_Jn<;pECFbG2Va2ZuE6Q00000 LNkvXXu0mjf*tFTE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/219.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/219.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2e00b2914038457374580208c19b023327ff27 GIT binary patch literal 467 zcmV;^0WAKBP)& zXVk^BdfKX2uU~b$`Ft)>6s5r4YPC{~$77B6@*F>h!$D4`(@pI6`_%V#yVZOEi4w3$ zBJkH%j0!8VX2e8+ZEQ9hSu7UPZnrh=c01|!`|{%+Wj33oh(U?~bh}+mKF9cW5Bl9~ zHuZZj7)ZTdm*sMqVFoDHIAy_8a4PAv|B!5OY*jfWxr0S}jc| zm&+2oI_Y#eG8&DfSS(7lT22&(9z^1_Y#XYIyw`V7xFHR#0hQpzD{fbqf ziaZouc~Gm>q*N-&dt8Wlxm->Q=*Zb2#0%CKjd~^Uon5cj+Ku&OGSP1M6NaIxvT4xp z>LU5G2Q~pBs_^C`j*unyAbUw5ur-Oe9t44!jKP?h8e{edK9I}o?QRe$x_OaIx_{Rp zps3Mk=p-m+T6W~bL|?uS%%n3WnruH$6=a{NJzsmmKC(|4`~e>LfvHveB$5CC002ov JPDHLkV1g!Z(TM>c3qmLe!JcFf?8RYiq&eR{2$Ko=X$;RrfC$H%f;_@J7s>?b**zz6w2rGS$F~x z5l{qpJRViNxksI;LBe_T?EGf4@u$;CH3&Kd6!;KDk#E{&@1FeOaOi+EzP~vC){@L- zvyQw+fb6ffc|M;jvpXPSzu&8wZxDf{2aH29Af_OlOoL590V|?ty}umfxPMQ<@QK>|L b@F^4DVEB$#_k06N00000NkvXXu0mjfV(rFG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/220.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/220.png new file mode 100644 index 0000000000000000000000000000000000000000..a179c1a0c44e1c538bbbb5f0d9992ef891cd5cae GIT binary patch literal 468 zcmV;_0W1EAP)-t}u*`~6-vn~n7QeO-^oqm0L6d3|saMNy6zrE zr{CRfSHCBdiL~2oNs=UsN13A!*r@oDCXYrVX*QcutyY!nEd}QgLc|_oT2%!&3|p_) z(||^!A>v9h7z|`Kn@O!!lQ0Ywl}bg=_;0;l|0%F3(0}mcRPv|0m!A}@-zlcksaE}P zcdCjw6kU1HYPF&$)x*t z9RiX%osLd|WTs^;XD0gcePAY)G0|lEajKyBMD6+76ZTPj%HS6<{CSB{xr90Z0000< KMNUMnLSTZo)YW$Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/221.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/221.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8a479f21fc64004c788c0064b384198237e20e GIT binary patch literal 469 zcmV;`0V@89P)3Ze`mf-XdmLC8XMBLs2bM##ns=spL<0FFy$wzY~ndW6k>R z?&K?3li(wnUwP1MHl~6QyY|Lk~nX1B{`FyUb ztQ#b}x=4QSfpvhAl?zMh@M)NG9FC z>kx3L-EM0qI83*!$VcO6K!<2AplTTg7ZP)AheN$ItnEmdoXG7pK!H^L;oRG#)^r z1RN3w{JkZk!jh~QYpTEw_WQl8*K6tb`??;FM;VXD^8V;#xm;$5L52VfheHjnJ~??U zIQ{N+yZRl5p|sm=*=#mxJjxt>z(&QlBzZI%Nu$w_a=ENz9|<^z5F+*v)2b@KVc2@T zo(9zGbrDyP!C)ZM=~OC}iZq)|MX6NMGyYpF7QYH?3iKa5JC*$D9^^X#>sNxwWTI7H z5*4T-4n;Q}v|25x)oOB0k}$7WEb5+$^p1SIV2{zLR|4PJ-EODV*hf*M?ch%w$J(Mz zgMv2~$)7!-9a>>E>6i*xdJpoK1OnR=hz~&!sL2?NnVB)>TkwHgW`F%Nm6fEs7s;gi zcO3$fI-QPAf@G#;EvF{>@_k??l`+v|`*Eru|3vNi+7tGXf6Cwoo&$SFZ60_p00000 LNkvXXu0mjfT*1|_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/223.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/223.png new file mode 100644 index 0000000000000000000000000000000000000000..8b29d0a83e4532dcb76d131b478d350e41af5dd1 GIT binary patch literal 473 zcmV;~0Ve*5P)ZW}x$oU>r}+R9 zC18_8;KueaD(oR!j5SkWH@4fYESF2^^?JJQ_j?(QM)LY#B#z@8F~|{s!C;`t?~g{F zOGdvtosNEw$75-=TC!TLvV4>o`hbm!FX`doa410#NVQs3vbPlMLkJNu#I&jka2U33 zx2p-B=ZTn-^!t4Y!%%9qnlu^>MWs^FJ^qWL=ud&20{#0>MkRlld-+Mh`ki7jnP}Ay zb0_EYn*yI{eC0v2*_3*{u1T0zE|)c?BE2IYFNiT3^-AD6yV-2C8u4s4(`xuLpU<^L zI}Hk6T_kt*fOcqw6+>weQz6UlLGhA6U}F;T!S{VN8G|u1H^yQME|AOY&lgi!Idt

6SdFRK4BNdrwo1piyeI_3Nq@p P00000NkvXXu0mjfdb!wr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/224.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/224.png new file mode 100644 index 0000000000000000000000000000000000000000..818ae0b67cdaa4295a8656f831c804789c6ae729 GIT binary patch literal 367 zcmV-#0g(QQP) zqG%pYk|d!hidf?AIFLx+AUau=*)#fMP=`)Yq6u_H`X4yX039C3k*caO~Ypxh+$cl z>#ucmt}^tW#5ip_%{y N002ovPDHLkV1i&fn_d6_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/225.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/225.png new file mode 100644 index 0000000000000000000000000000000000000000..21b4e92579e25615773d64fe70058c34970d8efc GIT binary patch literal 380 zcmV-?0fYXDP)B$N`dy;8=s8@TB}Y!gH$0p? zZ0Ff=%rs3j41)u3%d#-Ku4DVk&){<$2c746i+$gn{kCoF4WS>Ac^zco$FGx3fsiH06j>4DUJgFiOTbpC#>N= aW#AvdsIHDdynhG)0000^NunsCAPCrE?WS>Ac^zco$FGx3fsiH06j>4DUJgFiOTbpC#>N= aW#AvhRI!pi)WXXE0000!19}(!RNXzy6-!P^E{pVaU84D2eS_#^S!U1Zk3k(eMTsWR8R>uEI0JNe97n3Eiiv&SZNzn5 znZrNuezQ3PC_K$Ck@=&?NB)~1%JZD&d8VQ$n0tKyov!Pcg9L03+P39rP1Eoh24Yy2 zB|AeF5=0y#dv>5}mI3Pfp5%##)>S;k!QYuKl08s=aDJA=BeIa^g#{Eh$#%=4VZ zP=zEBK~&EIZqKqnZQGI@F-k`Z5CT`0rESk!Bt3B%mOcd;C<|Z^`ULdSxIr#whxqO6 zbv02GQ4j=dKNd-xug=_U#jU~)@xOJwYQ{^Y90YE_0k+!)iITLmG)R0TL1IUJrPj|PWL@i07W zkNxa1!!S_SbtizErisxs4ck|K29IsqXy5lstm}IEUY3RZ0VLrBAmJE>p?w!f5($#S zU~L5;q9`KY_u0xR;t04&1*Zf6D!6jgZ3v)`K_9wAHxS=$-@=3A3ZQV?wv=TV6Z1UV z6UT964*$SwvAF^`Jl+j`eHywSHn51@KZ;PxyFRM$1hh*3IPKq7E?p4;|Li=-77vGf!~P)-0L z^aS+MxIr#wMSL}TT}==K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/230.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/230.png new file mode 100644 index 0000000000000000000000000000000000000000..0791c381282ed32ace9fa1968693c178f35bbbda GIT binary patch literal 378 zcmV-=0fqjFP)p?w!f5($#S zU~L5;q9`KY_u0xR;t04&1*Zf6D!6jgZ3v)`K_9wAHxS=$-@=3A3ZQV?wv=TV6Z1UV z6UT964*$SwvAF^`{FrAVbEEIWewinV~%Fk5Rm72Z2v5hIA6`&ZN;s^ium8UUbS*sWqn2E`pOk{p|3LV Y3y_|%m7J*>O8@`>07*qoM6N<$g6kZl761SM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/231.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/231.png new file mode 100644 index 0000000000000000000000000000000000000000..3b49080ff3c6cf2f425c8917b8d5fcdbb91b8102 GIT binary patch literal 366 zcmV-!0g?WRP)?)hHNE^I0CMyz!Lya!Ih(KLxA}h^r1_11M%(lEj&1`02A)}o{FMiVqI68ah_-9 z@DIEmHdg?LfAd3R?)3Mvzvf11n$kFqlw}!nj~C$6G!1jGfSo~I*PN}YDtyaptfyEju@q*1qgvF%hI;zEs~zN3`?Ja43q^h2z>&2Y1|-}vqSuJ z_PUxViYN#Iwr`6h&R1vdw&GS{hxlz>uUhd|Szl4PzH)_K=&KAo0jG4c(A$qWWB>pF M07*qoM6N<$g6>V98vp55&fC6daF7S^wh&Jf6>|+4ucVY}@92FUul)fQSeXgb1Q2vhPjPn6fNoouUa#^FKHq;bjOqL|o&vZZOZYWQZ@6DH))mr?c6% ztyd>dlPQf1)f4N1YZNtV>aOd6PQc?Icw{dEkH` zH$6gQTq^WxB#i zkhLqsnGe@kYoZ2U+vj$}oeM96*DI>mSFf;(*Q*S^0dk9zVAu|I*8l(j07*qoM6N<$ Eg52Y`ZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/25.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/25.png new file mode 100644 index 0000000000000000000000000000000000000000..02dc2eb1ff8d8bbdcd8a25660bd26dc7fd23f3a8 GIT binary patch literal 422 zcmV;X0a^ZuP)u^j-yP|^e2X4i2mR2cdZAIC;>?d!E(9u--p9N@;ujg zyWRXjh=^W+B`%kXe7-w5olbH-pGDkE@$FtULS*D1A^_X%R_1R`nx@f$^?EIJU29ye zR!Rb~)#Hz&4~n^cu~^8*%*pk7^|zqR`cBi-DftX=(rJ%e^Z3GPgnJPwcz&YxeC-K`cz(*@2kQ)*<}<~J Q4*&oF07*qoM6N<$f)UNb#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/26.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/26.png new file mode 100644 index 0000000000000000000000000000000000000000..a391fcd54debdceb6efc26d1fc02b589ed6173c4 GIT binary patch literal 422 zcmV;X0a^ZuP)-ZoE#~AhxFcSjm zA&eI3dc7*adcBU8$mH8tvn=z3N`MiTSS%Jwf}xVf7*CN^IkjzxLiDH`ydG;eT)|+U_$MJ>J2=^jV@c2aS`Pvf>@%WU%7aU}p;6YzC Q4*&oF07*qoM6N<$f)e?~Qvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/27.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/27.png new file mode 100644 index 0000000000000000000000000000000000000000..98543da3cf2c7b5599d29721fbac6c4b42f8a08d GIT binary patch literal 404 zcmV;F0c-w=P)Bp2!g&yz{mVZziG=Em}S?t57*V%>)n|~`X4XgvG2Qizu$ji+cxieSr*{~L_~lfL=Z)heXr}GbZ>lZQGi09OWH+2cNPcq~gF60C}DZ`FgzyA&z4+41=tv(@8`SRzCg&)B%~( z!!R_j;KMu~4|@ukY29g>+DwQ^1~`mbRaLTyh-;kI4W?<54Dp3BB?DCSbT*r&@#+L> zGNqBBdSX3rjiN?P-E|$%33&VikL*QYo@Z$vn{FH3`T=Ibfsdd!Nb9=FW>FO05NZ0_ z)-21cpa@`u2F~ZRh+rt_`(CCEG3^j>uZ^g-Af})I|%m^+N1XnI}=?x8Eh3a&hWbrJ!x_(~0?)I9d zIg6rjfNvNE!R>Yv`(K>LXW#epIF3KDuB)?NmPO(LMWg^u0s;SYtg7ma_CfC`Ir0yNO31k2$m& z$GpDnesVkHXakjv)mjWcr^DG-GnmxZ33d2xhu-mr%zDR87vFRmJ`mB{DI+=Tb z5Za+EOVI(bSf^=f#$%76LndUZIEZK@fr%QHUrCkwoypfRHCC$)gwPnYMfbv)#4r!(_7S%s>DC z@2=^(&K{4)AlMtnQ6kGS$^X?Eejbm9UDx%`Se7MN-)=XlCjb!uHYp_d&&0Z}ZJMU` za=FMp4Trhskn?8o*g6W?x|o79JrRq6l$002ov JPDHLkV1hjozeE54 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/3.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..0da9245eeececb4c23d3c374bb901a50e7b90277 GIT binary patch literal 285 zcmV+&0pk9NP)U}MuPs}%ZJVv@ngO-rI2`jl`&#R3 zaJlc>p64l|>pB~T!KP{Q=kq+h9{`CHpm<%EL+^pMZEYM!+xIJkyG*NFo0H#*&px jK|G>7zC6N;c$9$`FgDg(&H{m900000NkvXXu0mjf)mnAE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/30.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/30.png new file mode 100644 index 0000000000000000000000000000000000000000..7947eddfe61a5b7aca3d793aaee9923f7444cd0d GIT binary patch literal 415 zcmV;Q0bu@#P)6LndUZIEZK@fr%QHUrCkwoypfRHCC$)gwPnYMfbv)#4r!(_7S%s>DC z@2=^(&K{4)AlMtnQ6kGS$^X?Eejbm9UDx%`Se7MN-)=XlCjb!uHYp_d&&0Z}ZJMU` za=FMp4Tr z-&k_fG$I2Q!!Z1KfJtOP(5lomlnr$-0E7&C0ia=?X8};teEkZPB#AVW@Av!fi^K;# zHoZhjpEb1r;FG%t7@-rYsuCYCi*=soP9EQA-tYI}F{%Ut1CdddrG&4STogrMZg7#5 z=J|YfjBp)Lz&L8(Txy+(y16~RZG+y6fWh{O>hskn?8o*g6WQZ#+i}aaNzJW;-+b)h{Ci8RVBni5%Gxz)5 z1HQ-OAxP6y?0<0qpW`^pd7gjb^?G^hZQCRsP(%vgBoOdV$GWafk|buDCh?PyWtnY; zwG7muP7{2Xui#xQpvW)`@{iSKUI9Q?g2FJA?tR~jCHVP#O3}7$Z9Mt}%%RmthNgB< z>WsB4i}?)Rq&O__2?OS(Dv5L;&=pQc15p%76J;$7+?na%&gcq@ZJI{nU@_10j|PZ@ zWs_NzxIeV<2`bA{;LeLJioz4uyGTlN97oFt)hS9bj@lKMSSzAB sug7;y(0k!AxIR&RzWRh+T%R)d2GIkgT3Kp5OaK4?07*qoM6N<$f}WqWOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/32.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/32.png new file mode 100644 index 0000000000000000000000000000000000000000..3c7d80a2b2bbe5be96770387a4f68a44114810f6 GIT binary patch literal 423 zcmV;Y0a*TtP)DGaP1$7Aw5g@T31_lsA6eL833<$)KB~k{a$=e&A+djh~sz$l|unQ@Isbl)NEOncz^z9a8Dlm z(VzoOG6UcD>0|(%PA5gTER`6*;iUxDe!X6m`uTjOQ|r2>ObqxI7#&5^G==`8iQR5D zp9WAc0`SKq3wicnyWLWw<2XXsbtPQa6=4{XCuqWVQ52NHo&dgXi#T-&fEw0t6Si&B zT!0m1&kR7>^E|QHY*qkpV2LQr3@XqbnC#7C1N2NB0yq^GB6Njh=PQYfgwu7z!DXaB_sdR4{~`| z&axdC9v9BO=XcL%QB{>JioyVLZQBykG^O}xpTN&B4Dxch+{NK=F#dO4NBaSg5CM{X z-xKujvMlBIi=fCwd>EoqzzGIO@;sMc*W&4`kn8nYk?JrA0A9$ljEa5Vm+#O23huQB ze+2qKk*;95T++!P+VA&9-+HU001n$NaPOzn$;cm%M>@4>8j7TVZ-Lp7^gK^GPeMjf zq)r1V6#WVzf384O9?WJlDh$I=I*wytKA+1tj>!|K!uM{sqX_jx@OfLrsWt&}Si?;O zK|pf>RcKo&faJwuAzjxU5lkkN(J*n#L;&fWfLxnkyWNgVHm(sY`f#v`Z#NUq=d&>* z4+n|+g5z~vld&JyAxe_O7;#;NGSMCq^t{<@$h_5RWysd|kplaP^7G{a;7rbu-d1OP9r*J~=CPN(wi`KI8W zJ@iMw2a0qBQ54b1AlmQuhHu>}DL{v93+(-JxfuEL`AnzQbxn~J@GUSql9S0qI!{6d zL7+|pDHMVDeXxb7dN7~Qsc^AaNXKyuESF1}BnkBdMffhuk|NX-!N>n1PPGY;!y0bF z_kEfRsDf>!0FuKnl&^GV?(ySj}+KXl%Fp@VIB5U2L1p( W=7hpBAY-Wj0000>UZf0 zNlAv6b56Ra_f98KRh8WBb_S3;9*=}HO({OwC-5^2gS=cWcX2wMjQ?%h(tZFWM1bV^ zd?x7MWm(G47eSGW_%KAJfD;UmY`0taF&2Nl3YjE{BGq9K0KAZ885Mh;C*Pj03hvoM ze*}D>NLR34ujynE)pc$7)~%8PblA4Q-n*_d@=epwsfWXXA}QcoV0I*@)2Vcxgj_5Z z>NJo-(XSBldjz8Df$#fNIG@j@<2VME%cYE>h->0!ZfspV5uIQdD*A)`5W~%91c35-AI1U;t%^5-AD;0|GIyAfaT*R{o_Qj97u0g~tQ znV`QPk4O3WBq(wbZ-%H8aDoAn?RG0a#^TwtkV%p#QXK{Xz&|#d4HZwPQ~CP%r{Gq5 z@JFBz6zK|9s}=1GqM|5_zV%i~0UWkl;NJVbH}Y-U(ymoiQ6vR?3e1kA=Xuh35Hbh? zwHrvG2*ht=TZqbo`Fu`=zVA!NaSViED5EGMPf&#S!{I;?>WSc62>CPOYlKYzB`Cy6 zEEWrz3#dZdN&zGvMkBi_tEV*j*Su5RVWkfAwkb+nv!|z_1ciFuOkKa73J&8S6GLAm4RQo W|Af^(?`Nj~0000pV5uIQiiVGIxw(AT>?XtM9PvfFn|~$B1JGTphOHTQKPW1m4E36xx8!6 zvQ08P4i4Y*yXUhgib7^tW&pY4@kmILgyOw*0*|iiWZ(BUQP;KceL9_JJpd9SK(cLH zg8rW8x%_w%6uF2uLsSYl!2rp2yOr-l@#nLUQ4}ds9R>lwKhiX%;^}lMUmyP!+-eX0 z2=sv>UBPO#qMbohmZj0R-YO}8!*&bY`}uq}@=epwu7|^cA}QcgV0I)u&y&uBkn{Om z?FLdP`V~Tc4?t8N%w{tx41z#9j$>f4Sjf$0L!Lkt-uL@GMW`o&pDW|n0Gj|xP>7T8 zeV^t6s?fGl0LjbcQcfn55rONvqhaEfi2%|$0l7B8ZnqnmY#bw4^x z`d(F){Cp7X`^ZBghkH;hJy5H|9k^(*jW=GPtZD~9S>3QC? z8%UuD#P6dm#Hk04<4~dNy3#NV4eRwpE>l z9u5-wLdTn?p~n7f5KjgAL!PBAq%Qh5rznmvZM?QpbQa_qGVu*5;3r#qC}Olm4E36xx7oy zvQ08P4i4Y*yXUjm?RK&(O9RLqk4HjL6cq2R6L?%M7uomyP1JR5e79{&>j97u0g~tQ znV`RKw_Ex4Bq(wbZ-%H8aDoAn)oLYQhvN5VA+sz~q&f@&fPXBPODgt#U%otE72IkM z{s{DeB3(g}B(yV#s;V;j)>|b7aM*5vd+)l=$Tv+xyB-b)ill%~f!UFqOeWHK5OOw~ zsog*dMZZGGuK|e4gCGc~FbqTKIF5lRisWLkAWxtQ@0-nrBGePX&p+em0Gj|xP>7S5 zPNy^%P=&UY0!WVISh}t|BJezKG)&ww5kNX8AlD{Xuh%1!jbj9hJ{)Y~hq#(}I-QIe zxjRVQ7aZU3_hjt%K$51ZG2*%kWuiSK=sC}GGIl#(mf@CSDI Vhj>W!#<>6h002ovPDHLkV1mFZx{3e* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/4.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..84f1834cd0cbb404db2fd5975dfe46f7107113f9 GIT binary patch literal 286 zcmV+(0pb3MP)a?cHr{wr#U@T{9qd9EW3`XaCpo z8hq~iw&!^grfITa7_95MEDoIK>G=SPcmV{j>vCYd@4JoTXl>i3IKYD_gnwed0Ds-@MiJylQ-B$YAnFYN7jEDx7=$B&2#F~W2=Jz2nxu%&?ltnV}?;1-| kG6r!(IldfWMI2?|1@({CTf>xntN;K207*qoM6N<$f~drM-~a#s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/40.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/40.png new file mode 100644 index 0000000000000000000000000000000000000000..c06dfaf0dbe577a328fc05618e1ea20e46349e34 GIT binary patch literal 427 zcmV;c0aX5pP)}rzp!(`+vP&X+HoGB0#cj zTY~z1I-TU75EQwH4?`RjaDoAnIF99SUo3k>Q8bXM&sxJ=6u{we3*38M*IK@+DmpdKbBd&ZZ-Lp7T&-5}rzhBKHp6Kk zg`)4dkjpngaqz&lZ7N)^*U~Ty4X*3TAPD5w{9c6bWSd~3PyG}?^3 z93<`wj$bYpGWMf)I}Af@#8nl8iQ^$b&%51@%=3L;ldbL}1>+~m&zGODit$qh{s9pl Vhl#XQ@#Fvi002ovPDHLkV1gv!z~TS^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/41.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/41.png new file mode 100644 index 0000000000000000000000000000000000000000..af637bb7b0c5037f86216aac7a633a8cfc6e2e6a GIT binary patch literal 426 zcmV;b0agBqP)$+rFmVwo3MZWLT$E%{x4){JC4jiGL3EuCE) U04Vx()&Kwi07*qoM6N<$f}p{?I{*Lx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/42.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/42.png new file mode 100644 index 0000000000000000000000000000000000000000..7346e0c50d707fec7bcf623e2ae08350a9174e8a GIT binary patch literal 425 zcmV;a0apHrP)ZrE5IiOR3NJvZ+@wq4f`%r-6qZ4vArvk^E)Ylv3JMF$g&QPfE0Rk;A%Dn&F3g5S zcVHLe#e27NGkbfYsw$afnFi#J$0H$05{l3E3H;n{H+jF`AL4X6Y5&`{rTqX%hycm! z^-55`%d(WeLQv!)J`8bGzzGIO(lnJneX;DZ+wDeD6&eA+3;X?^if!AL&7k0sJ@iMw z2Z~e$zVFk?Agb$H^Q~GX1?ce90(4qF@n3}Rq9`arJrOL2MdL-x2#~`XZeqP& z(_BCmY>x^c+4DSUn&ymPwOY-Fi7gWWq;mptrv!PP&zh`VBUseo;3j?!O}tz#+KfCM zB=&`l9}Wj<>~~KRMUgh*s*16R(;vf#<{FKvxw-ktN&QM+&A-l%Fp@VH4A*4EzJk2#PF5 S>1R9u0000ZrE5Ii}4M><}BqO|E!P|(mB3d>k>LntV)C=f^p3KtfZ3mQw7-Oz<6^8iSQ0LlCP zPEeoAvXs9P# z>(X986~-PFK(g=q(lpH(fn`~ z(?#OB;P~-)BxB!ux5F^hR$NsvnmAn&%pAutnYY{RG}-DoQZT)ue0})}tC(J8;14~l Vh{%26@azBp002ovPDHLkV1geR#CZS! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/45.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/45.png new file mode 100644 index 0000000000000000000000000000000000000000..5c326befdbcd5462aa3597b7bb6b9b67d9d4ad26 GIT binary patch literal 425 zcmV;a0apHrP)ZrE5Ii|~M><~MB5k@9F5J-B6bM^#LnvH;Tv)bbK|z5)E@)7Y-Oz<6j z9oWUNu-wkg?Cq%}N$7Am7(lKl3Puz~9G|UIcr;BzZQDM?`Fu9MtE%Gl07#es$?NsX z(BI=Yraz@PN|9`a*ej5P03`eUo_@Px>ag8zdr}<+0U$qiyB!zXwoUn6!6SRr z=?d2CHSY|fG))cPx>Z(y4i7De_qwi)d|8&fYo6yES%I8_up>F2&*`fpa9y|G4Wv*6 z;_nWKeGe9k1s6JwLzZP3@H~%v-=~jPMV}q;emb2vLOm1w+!?X!kieSU3ULz4<&x(D zs$jcU0LiP>il)=)h+sCGjfP1qGXbPa0&<50$K!F-WaAjYq7R2O@ojQz;^lHNX5{H0 zi7#|K%Q9~4`-`F=2#gWeRrF094hcMmVaUzfY&M2$eH|+pUQxNea)osauQKotNid2( TPx;?500000NkvXXu0mjf*igDy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/46.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/46.png new file mode 100644 index 0000000000000000000000000000000000000000..d64c447aefcc8cdae4995a841466f4d309c8afe6 GIT binary patch literal 426 zcmV;b0agBqP)f#}|8O6)#~Yo^ z?xMwWVBC50-Y_fn`@PKb+yHV-(-1bB4aH~Y1b(`%lYQSm#PN7E-p}VVod-Zd1V~=5 zSAzarmZkg?f+81jGeo6;6AX}KStfsnVmTm55=E-RAOQG}?RHDW^Z8uXcLk5^VLk#r zP^2q}qKGIPCM z`j`m$_9`f<87vkHD)fC{I*wx?3_}^mv3#H0itxPK?I=P$5&R6@AQ@e40_Wvch%e!J z9_CSFw)4fcB=S+Cc|it8%W5bY&_=QK@eu&dR|kgcC11@;x?>&sVIhkccSf9(>9 U^etEX5dZ)H07*qoM6N<$g2jNmfB*mh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/47.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/47.png new file mode 100644 index 0000000000000000000000000000000000000000..80f6fd92c247b04cd7f7d8a16cce3a302eed62eb GIT binary patch literal 424 zcmV;Z0ayNsP)ZrE5IjZs3NPRT=~7U*p^1zO3y|Cp3JNS2$d)WqP#_S68_UR6B)af~{2>pz+-$t) z?rays!g4z|v$rS8vXtBH)&O#C+Y;96HN|J^1RldM$Z;GWqU$>2`*b?ddH^IufaLXh zCFt*m!$JNEL6M7iGsH;&Cm0|pibDRVVyTd2*+ircV;~GenIwsPdlm9s0q^_$o+8u}!S{_3yV?ZK%YPwGA_xMS z3#fwaNdY8BQ6yd0y(92E?{1jbG7&&JCm`1**zI%_!0000j)KcXn&V#jf4_ZrE5IiMOo{^3|5=DwM=~B3GW4Qqr2rRjAT(|&HShj?qps;LF(4bg$Z9 zEqmyXf)5m#3Z~O3?+l`{EG^%rRaSrw_brI`!{K1%>$>J$ce@=&Rv@P!>_`rWLvkJz z1wo*911S{!Dn;Kd5Oohc&*Q?$WI~SPSO~+A=JPrIbVYd2vWz3tGr@Z+7m~4SpWv%2 z#7X$R&vOA)u&ot9auh}6y6zRhU@*8ECb7%}kS+U#|Rd4IHZX$T@#PT zqctOU2T6RPA^ywpo_g;PZcoF=krRmUa$Rr>SOQ$8`<0Kwi0mIWg(6&_B~rQolYmRYN#-5_`@gi z$(p8VWUX4Qs*P|>6}VfVP-GW#r{iQY@hTwZFcwgO)r%s6X0xf4=P)Fr(MTGNh9pTM z)9F;Y-ELF^)SJ-ncDq$}{;~37k(e7vEttDC*Bcj&MCSL0ze-~THT`~HuWvja`^>H` zN4FtJdF6xU&!TA$)&(}TS5a&-B`~o3%lQJtCNFe|K002ovPDHLk FV1g2J(g^?n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/50.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/50.png new file mode 100644 index 0000000000000000000000000000000000000000..3f241e5e7e7c3c4cb98ee1b6735d6b7ca51810bd GIT binary patch literal 431 zcmV;g0Z{&lP)Zavpt zdCw%n@#^*6^Uk^NKDFI$X|vfFKyJ6&G1luf$9wA(9(7$)(=<1+-|vm@-m@&@2=z?xI_em)>yY5< zzYr(kx-QQJRKa$y0FoDr1=+TJMc_Ej)i8-=CV+HFK<x( z`Fu8J~mG2*(4zKO#jf#)cSxOu+s8?yCvtYCOW<@(AM)-k-w Zz#n#(hLtB&M6Cb-002ovPDHLkV1lm2&Ncu5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/51.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/51.png new file mode 100644 index 0000000000000000000000000000000000000000..eeac6d41076c5b51e4281251e030c9e02a04ea63 GIT binary patch literal 430 zcmV;f0a5;mP)ZrE5IiMOenKC~Wtwy;C}^xmkxgM4BpTwvg)JAzmMpuVKv)zsRuCu>B~Qp7@}Lc~ z_M$tmi(z58otxR)Q^(_xw%e@%+}jmKopY^O@HJAYlR| ztEyt??}x*I-k%glDU!_)I|Y&ufFz0{dTWb6o)s;Z%Z^lsK>)~)&1S>JP^x2=Dv-o+H#V!D}lQlCf)_;Okn5 zlbBAYJQq*}+noYP_B@Y9qtSrCw(Y?%iDf2$bV)#NpJ2D!4Vr8mBUtp|kS2brOB2ho zG-l-PAc-$@JV_F6>`zOwSS*YY*Hv^)><ATBme*a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/52.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/52.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5b1f77ec0cce195d3537586c191cd694aff381 GIT binary patch literal 431 zcmV;g0Z{&lP)b;@5IiMOo{`RdBow7hm%;@NN@FN2W62FrxB$68AR)VOVHvrgL9%e;E<7QB$b&YX z4STvXPz-DKZs%t9_EeT-wApMdAh+M|8LQQblECN6lk|g2c(P%`kkN*m8 z*+YL6e4xlw5QZV245B>GE#Ib9R)7xoEr|EJuC4sxaNtwRvgF7LDHF&VwS~ z_w{KYg(48Yb+!<74?NG~!pUSpj^kJef`DeT8T}|lza8+s+wC|)JrjIi7Uv!M1oO)p zZelzh^ISj`Y-ZrE5IiMOo{^3|5=Gi{DJW>HG={>mk=)o66d(!oERYK~RxH!Fi=U7`1Jmi07K;V_v_<${uh$%*o(aC&#btv&!LnV$ zO?aNia{*Pb-6??N*=$C(Z4U?>#~BQhSY`r9mjvYY3GzH2G}*XDu;{}fO?+vacs`$v z8M!-1;tL($?RMPQw`PdKFf>M7SJ5@GKP2!R$1%^sd_Fg1>-$(i|B1@;l_#vD|CE70 X|1^jn=pPkW00000NkvXXu0mjf$4$M- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/54.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/54.png new file mode 100644 index 0000000000000000000000000000000000000000..be6abeecb7322fa60ef794301c2f4c34f7d53483 GIT binary patch literal 430 zcmV;f0a5;mP)to~(nO0C5ercWT3Cbx3mZWq2kFjFxPQ10n#&uV zWjE2{IdOL9?R&GcYP;RiYPGU}Tv?Wk`Fzgt(LRNrx~}PRx!lEmzqkG$k4N4QfP@K< zJfF`D^Lw+|(C3TdC`ED@qE;XY0Z5k1C4Dr-U$2UiB+;ZMECN6l7K;TJd!9#c&sPQa z?4dsjK2T&Tm`o;oGKhA&o#orK$_miowgvHiI-RWi;c(zni=yDj3gi}q9ZA=9$$3&V z8jbX6AcZ0jzc;oJbq{>s=fWTe$Z;GC-9PW{eHhQOk$Y{AYBrW+a_4A*PSL?*9aDKIHZXKb!}o* zRo09=93=6Dj^}yKjs0#&X0w?!;-(7S#P*QDbDE~yyeNt++2%f0(0-!weB}w7Xg_7( YAEPCQ)Y?cCQvd(}07*qoM6N<$f~^k1DgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/55.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/55.png new file mode 100644 index 0000000000000000000000000000000000000000..6afc292f6a79d93b2cac4c592a29a6012768873e GIT binary patch literal 429 zcmV;e0aE^nP)b;@5IiMOe&RloKR}m)f(Av3Yzl;tXn?{676q~;%PuGomJ1py2o#AfJRyI`gEpRp zJ>4Bp3~Tmo=Vs^jR9Tjkrl|$ws;XinNy72bK82st=|t!A`7Y|Zw*EIw!}|e{FaeUs z}lEL6&7VCR^7C7IQen#7}iG@o+d; zGxBhdq%SzW*=*R@@0MgfpIakts?a97LxP?civ^oEnM^F%<~~;7K2dqT@`O#ePZ{_J XuBnMjoGLIX00000NkvXXu0mjfcILY8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/56.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/56.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9a3b005541ed69fedca60c31c8eb89389a6131 GIT binary patch literal 425 zcmV;a0apHrP)$52pU-D9_N#Y0j$>oQbrs6Q;gF!`BuU8F)oNwP*4L4O;T7fU%U4*(@G1lUNY9B} T;VK3100000NkvXXu0mjfFvGpU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/57.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/57.png new file mode 100644 index 0000000000000000000000000000000000000000..21a779c67ba5161b48ba7e47cfab877323990cc9 GIT binary patch literal 424 zcmV;Z0ayNsP)ZrE5Ii|~M><|W;UW)6LE(lDC=gh3V^dIoTp*AvC@2t!!i^QnZe02a`9mIbVK!cL z2X-+mEVpyBb9D2S7puNM5g3 zg8E*TrTi6wA{X&yh@%2dFhG)Jnfw`w<$ySjM^Y6U0l+`@`#lxgwk_L-f@kf)AAvql zq$*gi*R(T;>blnYR$CXb6HpZnsZ?$Vl;6&BZrE5IiOR3NJvZ{D2e`G&B)*VF3~icHsggIMWW;h`9mIbVK!cL z2X-+mEVpyBb9>@^KFh=5paHqEED1@HP<*vc;L&xR?EC&Hs;bhy@Ao^c2S7puNVaWD zP~T6dll&EeA{X&yh@%2dFhG)Jnfw`w<$(QuKa#4@2mt<(rYRLWjw6eQf@kf)AAvql zq$&u4fOZDa<#N&bR$CevmcQL@v};im6iES}0<$A&+qT>e1e?uf+zq5q z^tll7<6Tf3J#bx@3fJqkGz>$7=Xo-UBJu>P@Sf*6MW`o&<>H^wcoQ>%?V}JUv0ANY zE}#l+j|w2!_kC%a=8V9ytl2Pe%R~U_oPgXZ!SQ&UnXDZnSk&QQ6TcoNHcg|=$jd?E zzTo)vdL?7O2a?@xr;WI(Vl;6&BU5VTJB6<(0?9&iN(4b6$9hyaO(P^3siff6YS1qC8XL4yt@I*Bq*xIf&3e4Z6+ z*^m^&!r~pzj@P0rOL;gPEFgEeTnPL9p5m)@0*_%Bj97u0h0Io zonXG7&u9531Vt|5%@DN$PB1`H6ovd%#ZqCr-D*-376HIN@;s+v-}hxRDtOi&{1NB_ zMW%u{j%jBQRaIs6ZMI4Z;PA8s?!E7OE8n&)?b^n;oB#j- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/6.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/6.png new file mode 100644 index 0000000000000000000000000000000000000000..502a9cf602589a61d31ab14119a30077c1d41031 GIT binary patch literal 460 zcmV;-0Ws%MtS<@P?tk{xYSkwK5dl~( zm+F|$=k>7L?WzLyxm-?(R;!iwr$3H5U?Y30)lve2Eem$a!VhKbb~`H7(P7xAk2-N8 z>+yJuN~=^VN*RYcK+=q9#T#oQ@@$b7lNxnBJ-EK(JaVCO|RF}>l=+mKC|^j321~F zko=wy6bc1Nr_(x2$Pa_Usr5|^hoe*~iMW(}CPW_zGMS8$gg$=`lGSB*UMvZrE5IiM$M><|$MR`IB7c}l{3Is@QunP(h1u_z{3krngf(FU58@l)j`9mIbVK&~= z-C-Bw#e27NvvYgma5%`_Zf5|wBVi+q;5C?ZF>` zK2W49h@yy222owtM&Ej?qyP@vEpYGW^V!IET}P+3ZA+09@GUSqlCJB@%}C(;zB&!0 zQ1taC5Wg>udPC%|rP?qJyWaApaq7Mg~`2O;5;^lHNX5{H0 zabIw}X&N&2b98&V-5MjVt57D|LxP^uG^MLruh)ibeIF^XpC~_He!@EJrwsf7bzO>^ TPEN*N00000NkvXXu0mjf*?qmG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/61.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/61.png new file mode 100644 index 0000000000000000000000000000000000000000..6e87eb61fdf695f2582ccc1d493fc6a5bf7fe61a GIT binary patch literal 423 zcmV;Y0a*TtP)ZrE5IiM$M><|Wktd{ZLF3L)AY;jmP2mDWfk3iw;lcvBaAO7GhAuoIf5?M2%*KoE zz%Is%_ipEA_V(1_aG)&93?Nrk6(f#gj?eZf{IqRLUDrLt`FuA1U$0l*4}gRTki6Y) z4E?((3i?%wqZG+uh=T%22tbmiDgE@t)MK~X4Wv2@0zej$B;n%ud`{(E!6SRr z=?Ye>6`u^E}3O zh`)Lu4n0^b7F_6g9$A)UV7Xko)FAtv&k@tWhQ`hNkHzHAkXtjlZ|Txi#{CE#P^r~CN@oD%*fM05?|=} z>2%`8e!MCQ!_XLUUB%GE@sPlC6h-v;rf9uh8?yC%tYG{^<@w4J)-is{z#o9&j1t)R RO#uJ^002ovPDHLkV1g=m#D4$) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/62.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/62.png new file mode 100644 index 0000000000000000000000000000000000000000..c71359c3c11264ae6a459944a6949888d6101630 GIT binary patch literal 421 zcmV;W0b2fvP)&D=XSfv`~ChDP19)qyRM`C07!@c$#EPB z>UW;!@=pkgT*QYVE($oo07;T0@^>nh6T&cDNL6SA058OGOvScs%W78etUdT6&k=$%H@;DK=uDhHDQYiX- z7xLpxP+UCNZnspp+wG)b7#cj!lR*%WCs2j&EXycDJrVrOi#T;naGck06OQB1TtF4t zUKBv`e!rKdX+98Gmh~`9+%geBIwv4^O>ntf9!%D*5iII(u!&!@iNi2xGxBnfxGy+< zyU5actwfM-yop*aCX1W0L;6cnHoC`bqj3Iw7^gMvUO(H&2?Kiq?S%!)-eNs7sm zwRb!_UTZ~Bi2MDn0J)}V2yq-!{IpNQ&ooV9p69n{+gADCbsg;oKtcpaj^jv>zw$;{$3iuY79m&JtATA5R@p#-$11S`N__+Xa z^T4)kDs){}=(?`J^E`1rpUD#x;XBJRicn7kKkFh+-4k5aHQa>bI5Zbfg|;^ZknH=u zFbv~`z%Uy%f*Y z+40Srx3lVUxlmo#8W6kPZj3z7dHpX>;qiDpXrAXC#&M)+nzYz344e;ugb5HtA|UVQ z^O=6%6kV@Z{+6Gl7}iyR1Oy<-vWyPzihdT7s;brkTWAEpb`uIdUlqBo%Op+H>{^6B z3VoOow%aS$DkN1hKR5Z3$sPQLF`nx;&I$|eC~*!y0v z8zdo;A%bj^z_x7)f`Ip!0CLO|koU4IcLZo_XX3LV0lKc^opT%Ce+9&ov;{Gz}w35?=qyQ+V8NH@e^N8;s*f(==(ZVHh|c00|Qyh(ti% zi=v><7e#el^SAsY#jq|4Bp?9E`Fy6YS4AH)$>nlc3ap_K0P9UC*gY$99EVA+*XyQ5 z_@mH=DRE7L>QHhzowPluWCh}MRaGpz?|aQSe8UUun`W~Dupr@mmWwq_Q?4wPf*>I4 zNzs14=N}}lnHWV8_lRVWpl3)9!;mb?(ttRKT-W9KU;<%n+m<}fqd1P42$fBOZ>8vW z#?Oq+APJES5oDVLwr!K|`@F{lkYk>Jyk}XqAwXLj6CVu;&~+X6{Pw`a%^->N^{m4S zdp@1R;jo;{dYl&%%>fb|k4H8Wt-uo*c};-(OOWf`yk?NfN%?{}K#*}?UCrQ7Xh#4eW$?*~A_1PEdy zAn$cu)5nvduIu<)4oNYrs{#oKKyo^r=<`|8`$AF_#acjzK>+AUD0q2PwApN!q^c^X zMfju8hb>VjL3JqE@ApOyDp`Rz-L@^uo~Fq#4&U$sdE0DO02XX`UF2dtpU+%bDs8u0 z@*WfgLBIzjZkTvD9Johp1_^qG5`+4HL60;~tR=67&qo+wGP-&oh8Hh~hZr`CtNJy<9G|Uau+7b0$J%o8VI^ z`kC=P!x4m;iF@KOpaQT{{G5%Q5k~=dg46VQu8F@p2eMRN^$`#gOUuEDIAZ>+-{_l0B00000 LNkvXXu0mjfoeQ^o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/68.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/68.png new file mode 100644 index 0000000000000000000000000000000000000000..0938d1a551d5452a92a3b36e57cb08d23da051e1 GIT binary patch literal 414 zcmV;P0b%}$P)x-n)n7r-1SmC zS7&zLym`*5^Z86wRcS!1?|Vj;WxW2kPvLRD-)Wxb9j@0a-EKE6Hcb=n2SCCE2x223 z?@iOt*NdXA>-bv^NinRe0tpB}lBOwrzbg7%NXoKY3v8hg0NW%Kygw^)U6)Dfy56-2 ze-!#KC2mPj9ZI4o(sEGA3dHHQZCUm>j+$}!h8M`2X0rmY{3=C13$W&S&XuK75CmjB zDRLZ#4@g`yF^*&I5t~sBJwtLBhGbcm2E;++c^=OP6A0@t4CMPhB}u|WsB97-hTO-3 z-5?2(3=w3T1h#F{@p$AM6F`pn2jsmdiX8#k+L`!hNPx@b!act|FmX3XB7HmS@WNh( z>2Nr#e`Y(*tBK|S2~MXI8-`ZkiHy9az`UYzedP*oVP0k656+V__o-#}#rGRvyP;BN1%u;(y5xdT}0k;;xrs z{CK<0n>Ws?s;cO8I%z=da=9?FEaUrs`xGwYIMOst8}xlo!!T&IuIqR|01_rZ5gP${ zKA+F@{-mgB8h)3Lq#5pu0x1YUlBOwrJS%#eNsh5CmjdmIl;8wBPSJA50*u*Xxx$&!Z$smPdyXDWUAt-2|fC>tlNEE4aiijKJ92h-#g|Lrq;4u^vrkH?$X?RL?8yWQ%30ErS1WFz38 zSg}}?>2xZUN=3Teu1qEq*=#mG8KYO=0$?_q$;-Www+ADycKkMXA|@dxJC@63p9n+* zU_PJg!E83Gi|uw>6)?|aGD@^qEc|}zWAFhR*&B_95^&gMA&xEfeOeXGW;3#Cs4#5! z!zc2|y5H|3Yo$_2ZG>y8z}*6cBK!N}+5d1j^eP}e{nY{$SiLGDsMTs(c@9I;@Asuz zt;%Y(lF?`+tyU|l0qRZYcfDRKJOAz`o)Si$EttDC*Be)jMCKnWkt|q2O{de*>l+LP zKC`Qf5>N;iK=Owr$mMd9OeVFNkRKijyVe&mY>q;q;2Y=5B9%%hNx0``BROC0&hz=a z9)^hiaP1zd@I`dN%M3IP1nG1->WfIhZmG@urgC@R#k^M-D z=dQE6Z{EC}RhP?!s;V-8SlhOYnrNP9BQ}mB?*~A_1PEdy zAoKJ2Oz%&Mnx^4@IV8z2t_ma|0LkHSppR!oZwpCTmTLkX1_7WiLczVjL3SwF@At+URI&nb`g*;x>|q!TK zkoTa-_kBJfal^zc%eY2tMmE$8$!VIB=XnMY2T>S?+#gIJtX3&MACuw;N5HLvB8B*VBUkbnRrS(ef3qoU`T8eU-EG@BKGZs)~Bvw;M09J6641)fODYYNOKD$iG*@EYb*27Ul+WrqO&To5+^0000< KMNUMnLSTXzo4wKi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/72.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/72.png new file mode 100644 index 0000000000000000000000000000000000000000..a23dc6be39b69e562a591a1b6514300afcefb7cc GIT binary patch literal 419 zcmV;U0bKrxP)nl! zN`yZOb=VSh5@d&xKd z!+}0$f*=U^fW!?G(=_E8u^A-q>tD%n9FymH1`r2P7>3**Odza}$Ah9MqSNWbMBYj{ z1c+g6Gs9^lA(AG7Y@5LMecJE$yv78OW8Z+xi=uD{P?lrjUrhqEZOb*ku3QtHMiS|I zufq#}zMb7}x7>{0&Wnk50|}BOVZ%@gJdu_+6xdHxp07M%9rjZOegN^PhY=O5aLRUDy0Cha?%sMS%naAW74dXeRiYQI_SBU=57`ST90BJs&lWTt6*d|(yB+}Qt z4lmsKc0A8pZf4!ii-~3f3BoXBGf@gWk(SpKm`_xmuRP&3%%=?e0OlHqP$eRqJpcdz M07*qoM6N<$g3$rDlK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/74.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/74.png new file mode 100644 index 0000000000000000000000000000000000000000..9788eb7a7f44cc0dbfc4bed06409e950af978f49 GIT binary patch literal 417 zcmV;S0bc%zP)VWo)J2!br6%qQ$W><7(yW*NDU zY;n9gbMKim$GPfyz0&1!F@RXpG>pUH!0Uhe6dt$RjqdlmgK->bnkFMQ32oIVeV-3V+%R#!-*b=H43f9ipX4M-$n!h{h=V8$L!J*N5Z1PBX}jH0mSs%jJt>C( zG2~unID;faGDMJV6Rg*3ilT^fOaM9dACULc>EsZgEyu)1LjrVN$31^MFwq$#k*?1= zy!e_AZ#J9d&*AWc)A0ki^7WaJG6_7#=uD_2;DeU*Vy}Q}j(VlACmg>4TfLP!6jNNX>cOy0o1D^*#!UPE7 zARzPO@kl>PQP*|6mP?Wh*GSbYj`p>(ww0Yj}Zu+iX??bPESDvsA`zZszj~9u2nzhE800000 LNkvXXu0mjf6YH_~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/76.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/76.png new file mode 100644 index 0000000000000000000000000000000000000000..baca827c3008b447402bbcdcd112d1664bbe3992 GIT binary patch literal 416 zcmV;R0bl-!P)Z|m%=7Q5Q|`nREmg=Tp*2QKH>i1K4{K2$B4Uo zS3Fl|cHg{t&Z_J6N>x>9K&)+B#_4q8^}l@zk7=6d`FvWq-|zHzJha$2j=UcL2@@cQ zjexw@bxq$&QPVX1Er+BS){givVp|CjK=fK;QS=^XtYo(HbO?zMge> z;l3#HJa73k>v3L8GzUnKBncaaR^W+@yr#gsqH=xZ3a?>aW#9)ruZW1ARa+eZ0000< KMNUMnLSTaWi@6a1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/77.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/77.png new file mode 100644 index 0000000000000000000000000000000000000000..22ce00a3773b3c9da037d0b9dbe73ca87e2fbadf GIT binary patch literal 416 zcmV;R0bl-!P)ZrE5Ii}4M>^g>>n^1m7nVRm2qC$#Dcm3)YIYJZpS2fo?9)# zAB8?liAxexhmynLpzT2=D-frvs$$uF-)qL<8(v`FG@BKG1qtsHuwE_~t}KvfVIpUxEP~Uo z(vJz&APJES5oDVLuIo||1iZ%tkYoMPtJpPxb@OeBQG)#clp`g*5!!Tr$s;Zn4 z;g3Qcw!|d~PKS~#%ZxRsWCh}MUDqso7zV>Q{KE^Z+h(%@upr@61LNUv;FIN~IF9K< z$Aci?4H7p@%=4UUMDlv2=xy~UIY|=oJkJ2)Alhs;+#gIJtX>AoJt#=n$YR$HZq%0`z^)HNQVG(P<=+zU*~) z@ufFMQ8eGovYlrW?FJI0Y06iNQs9ZSyrIB;qVjy@2`^zkW#AX)or$!nvLDg_0000< KMNUMnLSTaEJi96Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/79.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/79.png new file mode 100644 index 0000000000000000000000000000000000000000..44a034d31e6c7832f99b581fadaa2dd0600f38af GIT binary patch literal 416 zcmV;R0bl-!P)!d&e0+5ttNu&wBH1_-bRKSEq0GOLlQ0v2S95c!Bc=TF? zKMH-g5=|0RhmtJItUah?1>*GOa$(tB*ICBl8(v`FHJcTH1qn9|tlRCDD@&!-YDF6z zkD`bVNZc|p&vWh($!{}7ud`pt>-Cy~Ah3Wqi01P-&j%9-YtuBeSS+Y03ML9(lt-}n zQ~Igl4U!Pa5J9#}5QZTwmrLGb0?2XyfV}T^JC6Wuc_uy^5}<8c?)m+RiQXWIbaU3> z#fLteB+2w=%yFJfbO%U~rYReSR^W+@yrsasqH=xZ3Y&1RGVlZ24~p}{-$axE0000< KMNUMnLSTYv>${); literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/8.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/8.png new file mode 100644 index 0000000000000000000000000000000000000000..be64909d28c4bdf09d78798f73d1da390143dc97 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar-fh6A}`B_$$hpHl(p} zaB}_)4-NgRudmOaHaUmEMVevLPj}A$|K&X&C74CVF=Vpb^qVH$ g=4ry$Yrw#8K!9t{p2qk|Kyw*9UHx3vIVCg!0QyZUPyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/80.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/80.png new file mode 100644 index 0000000000000000000000000000000000000000..67ec91b17ceee04cb91b737f60b1549c68581b77 GIT binary patch literal 420 zcmV;V0bBlwP)fc0gTyrxqbTAYk^G|+eXBpoyWNf~%hG^2hL O0000IjCd>;&fftEc<%BYR2IkULbFp%?iMRg4and)+9-IXW1zX zL$V$eIgZ0WNL({9iX!e2#Xm~XxB8R3+wI7*EDeZ*$oGAo4<-=Swry#<-BKLKO!PUy zBtQ(guL-L`5+WHQ$TkUV+om80IL8E#W1fJ#r)jz(KwB#l?+poXxm>vCmpdk|21%qZ zXB}SH)9HAgH=oRMoM#iw0TS%@dp=sU0#9V*H3jAsmFp{4cnR|=1HaELhAJx(omS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/82.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/82.png new file mode 100644 index 0000000000000000000000000000000000000000..ab76e282eef5262dde4fd5c769ff0cf2723a2e53 GIT binary patch literal 421 zcmV;W0b2fvP)$tmG%WjkK5NF|8(v`FG@BKG1qsiST&zV=aAm2q z*=)$UQ{=iXACS0aVw$GhBa(lVqHpylIf^2397hAjMXdcCGB%b4hM zf=K{1Q2H{#8YCf-A%bj^V6|FN7>2yZ1dwC?0eLUW(jq`xmWlrj3D9*N_xz!36RklK z>C0J%7hlt1-}mP~vmEEyM00=yaU8RmXa%0g$ZHDBD=ODluJ97(RR(?mgSdtr-r~+l P00000NkvXXu0mjf=ft|@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/83.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/83.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e952f7afa14c8edc1c7a59e9d2cd8f92f9aacf GIT binary patch literal 419 zcmV;U0bKrxP)0XiV`%Ka_ zjnyLjQRu^zxFkV!C`pn;%Rwb85T_4^1IzBZPBRYQ@B(?$Y*qjkYf7DfdE>0A>zaz9Fo0UqG>pUHz~g`G6du>>m2S7&0>d!SIF3f`a=Gw&03=L+ zA{GMjUR4#nKPft&&-^W$l00x1YUvfuCN<5|($M3U$Ee1Hyv0MI9)VD+eIy(hr7#RBO;aZN zoM00`4O)7gun3Y6Nr)iZCU9MsqA21yCV(9K56F9#WeWndwJ`BsNPw>ExaXHUCN6>` z()Fyv3wH{W@B8zg(c?UuXa`7;BncaaR^W+5-cVp)QMtZyg>~3h8TbVz!iH#l=0yPDMAP-3(3HO5(#C9l7R^np)666ShAH*=s)y>Ub)vk zWSe9-4A1uY-f>pP!hr@y1pA^+~&EK*~4#PMpkb(dtd7jh9v!b_=q%6zn038Mapie@<>!Tvy_nBnB z-_KfvKMH-=5_J-s4kgRw(wKuvRv=DSRmHN;=d)oPzTpMtZL?VcSbmhE&k-0mn+=~V zC&h70&VwS)^LT^Q4HL60;~udXB;V>!a*`zEIF13-K@^4|=Yt7^^>jK>6h*XNubF5y z!X{Y#EBzWV3z85?h#=c0a9x)civ`ay0p!?!K;F08?Ti3z%}l%%5}<8c?)l}0iL)Sy zbUo|v!X3jD1i|!Y^f*r@+5r-zY04QuEAT`jZz!;@s9ayU!aD4$4EzEcG>4}cD+U|@ O0000j7jpX16So#V1hkVe)H(|ux z%@xnxo!x!&<~gg{wxyhR0jy6h6Z+&^V43E|&{kuU9SB_dTBnK*9tF z;vgXN-EK#(4~hkbnRrMN!b(qoS9Iq^|2Z!4et)u-t@#r+Y=d?=#7E zyR}M$KMHl25|<>%4kc-tYI{)03dHICe$TSc=d)%U*6;%RrrE3jEI&%o=LC#pS#oB{ zv|g{txl`nM9$%2SW@46QTq6#HTJSeKFiq~>Ul3|<_NI(FRG)?LCQPJ~AvfuBg1aoKvz+g39UYj}Zu(`;4%mT#r#eFVlV%Q&-S z3d4|`J4LSR@&$=&CMHS3HR3QxzSOVeD2m8&91Vzr$oGBj4<-=Sx~?e*0@`l3Otcwc z5^VmIevYsjNr>uWQTPBUX(%j#WLXvxjYC0$YzetQrl7*IEE*&v8cH7_ckqEGyh#S_ zCn+Ag%y=Ry1&{yjQ}|5NM32YA!7vOoj-wIl`=0j$AYlRo zu@R8@<#M5?Qq;CB|H~mshH+6K0Rc$zJSUn7zGjqVxg^kG5CHlj6twfyb|^{H)L4T`Rv=C{O~bOgt}~3oKfJ)YZ8j?a%g3vt_ZP+E@p$CSl4-Zw z(dSGM1OXqAxMAYqaNruT`T1)cB=7fo@;uJ~;vkBmi2H*Hg!Oj2Q5?sVWf>D8vrXWw zew40fIE^Gk(nOGL6ZpPQ+wGRum;iF@8<6?wbaDt#mSf^yO#h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/89.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/89.png new file mode 100644 index 0000000000000000000000000000000000000000..196dd5be2a9755981d5ed1536e177b9c109dee03 GIT binary patch literal 415 zcmV;Q0bu@#P)JFd$o9DYJd8wgTT=kwVjKv|ZFe>Dlvwk_BE{$iVGHIhi*_By<9 zmfP`tf4!M)JFh014J3%7h_4o0?_syHzdbcNs?h)6i7e-k|arpW`ge-=ks|#79j6bX~_ae>^a8(?}wH-Rtn; zYrgEd?(%2W?Yx+1HjrSy-?N!01)fODYYNOKD$iG*@EYb*27UnYVu}zZYilI{0000< KMNUMnLSTYB#k(~C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/91.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/91.png new file mode 100644 index 0000000000000000000000000000000000000000..b37defb8fd54fba2678661af1d2b0449037c1e20 GIT binary patch literal 412 zcmV;N0b~A&P)#cfAzP z)tTKlZ=SQNX&NfaQUhXr-!sxQ<@LXP3Xl8!PV+qPaJ^pXcDre@X_|OH01_rZ5E}t` zuj`r~N>SH!{4Iy17}iyR1Oy;Sl7wg>_*qaC#adtsjR4ptp`cq1ACE^Ssj6z%BK%S4 z!<4usL3JpJqDad@B`Xl8+qPxd<2Y)@;Tv8cZ<@^t!1Dg8=Yw;vjNem*;~CgmoAO@;r~?IA$VLHVF_z?t8&* zkc3Ev2(nEA%d*J#eaZrE5Ii|~M>^g>kq4xtabXE03n5E1gu)HN5~4u3paLO8V+D!ErJs;L_(2lU<-`^*lt2WyByx{_e@e%mDM8r zQRu^zxFtb#D2d}(+k;A0AWk<;!?MS5)QrP7yuiL`HY)%N622B-&GVcqOQkRj>2ryD zp2r6yu9=u53HONP=dW>)97Pd1j-vr_5c$5(^T7nd+V?#LK|pDmG7&191kO&;$E%|E z1=b)5kqi-Jn*^@w((!oYJtlx0^AE`T<#MqI(3WN5Uqb>6!@xbi?Q9dRK@#cPS%(+y zi=xBfu>P6tIIkv}10*<|PHY%jfhRKZnga8R%Jr2iyoGs{fghD@id+BR5<>t0002ov JPDHLkV1i~?wekP} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/93.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/93.png new file mode 100644 index 0000000000000000000000000000000000000000..f48ca720449e1f76e828003ae49011648a866e80 GIT binary patch literal 414 zcmV;P0b%}$P)!o_Jq^QP#JaBId;la&fFKe9 zdB5Fm^i+zDGynhAbpoX_W_fDVHI&^Mu=oDYX#$RyY6)oBs_ zDD+`V)JaesO42kn_Mnm#h|`b9gJrjEYZ!-bc!7P}Y*qjkBz(=ldODrBvQ*mbcC?@4 zK@ji(i5n(nS;jpg`S~&qlH)ig&+`l*4x%WEcs`gwSnIl`&1OS+o-+|D+XVZU((f70 zAPJES5oFs0zVFj^yX8G5fE@b|$a_%~4guP7O#Ev|fTn4<=g&9SL}!phx<2dh!hct^ zUayxwqmT1qqCG%@BuQxXp|}-zA|r1ou&=0GU%A3M?5hm?0*T&>n!Y@d&Hw-a07*qo IM6N<$g6}K35C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/94.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/94.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6866ae61806e735a0e2d3ec3f1e37c25c3a70f GIT binary patch literal 414 zcmV;P0b%}$P)LP4t!@ArEqxm+%r7U7RV zAGX9b393U$6h+1!RI&nbx@j7g-S@p=9KPWN_HDCS0a%dmrGYiibFM6vf*_zz9pCMC zd_dxciE$irk4S#}83)N>7?R^S1`r3);c(#jU;<&iUa#c)J|#)QM5t^NI4_FcUlqM+ zYz9e)WQZW!CU9Msj>jYKF#+V*e?Z=gqSz3it&NG#h6K3XZrt<76B9RsB+}Qj4llm- zVbAlHKeHa^#YB661gF!9%|t8kL`L3FU|&(WzH)`vu&*-k3qEO!hX5HSH~;_u07*qo IM6N<$f|FXaD*ylh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/95.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/95.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba0c79c05fb2ee89595c175cf96cc790aa678c7 GIT binary patch literal 405 zcmV;G0c!q$)njd7ddB00|Kwh(v(j>$(;% z!w_B9(KjFBVpw+t9AJPXO;aHx!LLMFmV1FC6awJ52?d=ze7#2$o z#5j(rM!c_E!2MaT+8h;vs@; zoxrjz;dvhI5dq}re}LbMqBs$tt&@qLh6EVLk$V36VB%?zSo(3+;l;N+Y}@w!XO82% zo2U;EBMd__46VQu9(hH9ent8E@)bTpzskTLGTV&CbeXg(00000NkvXXu0mjfmzl2) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/96.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/96.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2a6d3c7eee2084381688ff4df93dbc578307cd GIT binary patch literal 513 zcmV+c0{;DpP)dVlH3a5&VY#bP0yPDe_mlAibga15+tx7$fJo0aE~C*N0|6bc3D^?LH+ zf4>{M^?@lC0Kf)=fmTi=5*kb(Y~FmZ*=#2DdR?Lhu;1_Nokt&_!Jty9$cLW@UHt8K zTOLgU)QREl)5O$jwG#srwk_mxIi*U^mep#tQva9n^B-{|h9zv20Vq@hpwVc^&4nk$ zVo^b?u&{hEEQrHTB5gPgUd>0fTGeULW7t$^wOVdmFiEG=Dj@fE%&=F0OeUkWK*yqf zH7MJ;qXAl^QYp6^jscg6>)-KEOL@$^?I!gnEUy@ zSYe%r)@hN?jrPjrvZH+-rwsl+QTu%D6F#@UPZ|3G?q+Vjh>iW*00000NkvXXu0mjf D!n*Ae literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/97.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/97.png new file mode 100644 index 0000000000000000000000000000000000000000..b91a3697fbee32cf693ceff9bcabf67955e0761f GIT binary patch literal 534 zcmV+x0_pvUP)aR$73kA+pT{0 z`+W%CY&M!tK%xYIBofolFer2?#jsD zYa@k1L3+KO{5Kc!YUA0)Kl4e6DHb9i27`fCP9zfY`}(8+HNOI~*=#2DdR?9@QNQ2U zGeaM+p`cQ!$U|@ux!~<~TfSRGNGFH07fVp9)lLd<*tL+$IIaN|4E9Bzk$0PW%k2A=%9x5AY(DO8MRJ3OG!BHhw%*`Ehkp!Cp{+o+*;g z=e;r|pdTtx6|=Y;kH^)t$z-DAyR{d=$Qh5v-e7McRo(V+5jD}khgdA8ixmkrbGcl4 zb3=;+0DCf-)O}zg>-Aa{JX+H8eR0Nm6CLQ7&x7{L<+7K3o~H`lKT-F5-4i~K_fMI4 Y14mzS%+^Kg-v9sr07*qoM6N<$g4XEyB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic1/98.png b/src/main/resources/assets/rplogic/textures/blocks/logic1/98.png new file mode 100644 index 0000000000000000000000000000000000000000..107d5983c01960c5cbafe4c80e9ff43ce2cfd256 GIT binary patch literal 536 zcmV+z0_XjSP)i4a+%L6dQ0svUA*VD?eSWJTngw2};0BkauNVQs(-?l)v+toWm zAE3dYR4U1zLn3tXH=9lQYXP8640m@nrc$YVGC*P1LMD?@s`TtwEfx#)e^?OyBW~ET zgpD!)g=zrQYBjkyHImQg6~qY(%O?v!9DWjM!)tJ3Kg#8@PJ zrU3LqC8{D8$LQ(_|1Up4gL=+W7RMf&3M3f++7J`U^jc|?iH7W85QXE{L zB3-`1-2O&)@h@C4uK(GYXP$Xx){Mtv>GgU6!?##0)LN~Up6|sOevZeZoKB~J?RGmo z4~Ij*zuj&%9s@)Ha1w~kW;3n&Ic#J!8fnsUxs-0VE9G)oPkaD)2F|hH?2WT*;R;%*;k_cV=olZxdZ35JZ;qI^fuGi~l1}N-W$mjD)ot_=5^?I%Te>RE# zh`X_Ez(yH>LNx%I&8B<`87Y-Y3gU!?<&y;<4nK*s;Wc=$qSb0Ood!MLSsmK#wjUQv zGMS7D$h{jg>=huJ%}OkMrjC8JfK-FBn>!kyMLM1KyWtsdnfz${c&PFva%RC^P=KE4 zy-+B4W(q(*RH7hG+ beahGyhRb+wxI~FE00000NkvXXu0mjfHX{0H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/0.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2a20406a2e130e35fef34bcbd3462e7fefaf6b GIT binary patch literal 271 zcmV+q0r38bP)Ja8)FFW`BZH=DSg z3+$VAXsM5{q}9X+^6z&-0(bZd^SpivoPuH%DiHZ|%(qxgR+S V^auO{bAA8-002ovPDHLkV1lXEaqj>C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/1.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e63a39e46c65add47346b439b12312e1e32a2a1d GIT binary patch literal 464 zcmV;>0WbcEP)OzMZ7lI2xLwPH9N>i8ee@pC?(<#M?w4u^wuyImdmJ|2&y`hLGx zK0rhTC_)5_#X>%woy=x4{kCyD9?ScallgqEf(UpAR)F;O=oGD1OGcxSe7Sq+_xmbD z9r5LIDVxovEI@${^?F@LNWET9zOMq4$wZpXrq*k8}G4#sQPnYE@RNmAXNM?w{^XMG)TYc3O|3NFAyJRG7p;rBd;s zAwuf7pc~)RSqP6cK7&T1p{kuuM^2}c678rgbp!K7Q79kxD$s7XHK^@&>yH!Ag}~Sz zVpfO83H`Z9MzC%c7~2S4m^&392rF0@`;P-ohAcvk3HcC1+aWmn@K)ZUbdk(@c-J|y zmj~zHK7bKf`x>bBuQ!iB?q@p)SjGAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/100.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/100.png new file mode 100644 index 0000000000000000000000000000000000000000..ed83cb6144bd8876627f493e15f9be3f109ed741 GIT binary patch literal 403 zcmV;E0c`$>P)ZrE5Jfj}k}IW6oz^IYE08E$xG^-QKte)-#s#9GqH+qCK0!{ByKM4C`ecDbDL%6d zGk^XJv#xDhUscr%`1-y#oK7dRf5kZ-*Xz~aZnqigy7nLL-WNqN^N-_b@cccQhad8~`?RIPXVFa*dS!R}GRU=q?0yJPO16?hW zBy%PJHEEhoK0$;=z#zgM(9$3u1yK~O_GC50-dnfU+!002ovPDHLkV1n_%vb6vJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/101.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/101.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4509a9d9020d2968d43c0fffbcbbaf24af1413 GIT binary patch literal 398 zcmV;90df9`P)5d*5QHzk&y_kYRthSRTu{(p8oNM3vIGqUqM>r-6fSv!JW1Z=l5eFU2P8@{UO4a0 z&JKI7ZChX0^#Ys?!(ccbj~4&RbNt+HH$P3&0_XGDf4F;pI-M5hm&?WS0VGDi;q`ho z=sC+W|M^Xjrm4NFNX>||0v!mDR8{5Q-JQ?#+|JY>#DV~HU1yT%9>=joje(M)C@e?$ z_~V!ZHadFuU&iRiiW>#6C;`b7uVP)~J_tfbV=hJBp%k`&V4xF${x^<2b?bc(jjjZ)I6d{Flqc;{ha2fV1y= zhtAvW);_-p*6X#uD@nz$R|RqikW^J=@8Qm}EOVa<#F!9()9K`rslHmR+^P+f>~=ek zQ9Sbr^Z^?cEi60%=~xu#9DjoZm9BsZtA)C*T{0E-`@L7?9dg;30$3D)WRh=t)nG|h zOxw0UGmt#2B%+8QO}*Vz8_8iYo6zBNmez2wI@IW#xl^^B1tl5 z0$v}3Z8n>$PY|IKFo<{uv^2;^L6Ri1J(&&hwbFi_yVShnJ}nOJz)R<002ovPDHLkV1ic{v#0<7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/103.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/103.png new file mode 100644 index 0000000000000000000000000000000000000000..4ead638ac858e25e632374b474cea2248c6601a8 GIT binary patch literal 395 zcmV;60d)R}P)7cF^XqC zjy_3CpRd%lBkBt3z(k}B8CU`f3`miXU}1=|Ffp+(<{Mu0v-Ic@T6K8%F!uAa z@wvY5{pE7m0N?F)GgMV&_OCd{V_6n|zuz}#+tz=+I$ziI#y?Gy#REu;0Ovf<2Axl* zlmB{i{%|}|MB8{p6BLMfe;%4Fbso9rh1yDX4M8t&gZkmD4zK^ z`hbm!-|x;6kd8%x&fzymP-zO7uv+N4&LmT@EK94(JLIxE1+XXp$s|Abs=<=1nCtcW zGXu%PN+OB~($vRs+_i{$BY?Fi3bQ1u8bR6R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/105.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/105.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5e63a78df587a2aa41e87c0b9945ea8303c24d GIT binary patch literal 401 zcmV;C0dD?@P)VZGO@SN&Bz0Ze%OY5w=k8O17!v|;KA&AO)mN*PTeX3b-EQYG zif2B7K47Eb`*ZLFq+?N_bNmewRJsBttQL;Pqf4e@Q50U4cgSUD3SdzHl1aYrRf8p2 zF_+8bX9kjol|&Q~q^WmZXBHOr5gzRG8(7pk0j&G|-YvZrE5JgvUk}IW6iPC~nP#MXE3mTio6i7&xprNp6s9e!da)O*BciH5P^qs{dO7WRx znECT(n00O2`ns+cz}NS^;dDBg{VUG#n5N0k^Sr?MeD<%8&X;Am@L#W2iwBSx0nTw8 z4La}ld;j+2e3oVQt|S%1-W13oKvGqef7v*n=ehY*AjEZrE5JgvUk}IW6X{80FpfZvR7jA$C3M5OG?1lo-P*J&|667IO7WRx znECT(n043d)t^qM1@LuUXDG|k>|b$?$2g9Dnx+NL=d*u(biS&pg?|_ZiwBSx0nXd) zX3+U?IQX|G=hHN`cO|J9c2*#V07+ff{$=C*@pv?!3WQh?fTn3oGS!nLF{?IEl4Y62 zD4zK^`hbm!@6XN>kd8%x&fzymP-zO7uv)lWE+(0ZMNwE)-XWJ=DS$-*NGAEdR}GeA z#k6hvGXw87{=+?({rt8BqKF_(z3=-uju&&`soYV@o<0U9utfvy%wk~tH= z!1nw7>=Q(21PmhF0WA&kqbTxm9Iy6dHN@YR1h5O+?biDLcabDB+;#dz1wHFegevAC whVny@xZCZlov{Cfg8M6~>#Hjq;{GawFG*&VYHvyF5d*5QHzk&y^CTwUxq^ktir=zzr0ZELpM}3PeLi=*SkOLB>7#7a6 zv$N|xcfDTy>2#Wbv$kywWm#JMi|2R@!{EnpoZ);v`ww^TtE!rv_kC}CfQSijc)Q&U zdQa2Te|`(Zactj8QZeG>KnDUM$K%nzyE~s{nVqRXh?xMW>)I?+eYe|LR2w+S^V~S% zGapAEs8P|o2TQ;@5eIq?e?tV9=70&Sh0En)mZ^9+9IPteh%2rfpdtd6NnZA$-^thlqO;KOA$B^MMlh6V~GOP1`$g+)U}MG8tzkdx#tn|vcZvOuB~k6DJ9 zH*bbncez~r@pzm8U(+;(vMkO173X*i!{EnpoZ)mj`44yRtE!s$yRNf%0ErRc?EBuJ zbDF09^P6C|+u6I4R17;QkVAl^u5179?tGSI=2L+XGXikEUQII9H=B)FwSkhu;b1X} zXFiTTV56dU50-#*EDCfEzd?dZQ^17P!ufnQ$y6+g!m9EPx$H^-EDAs}$;)0fSdtZU zyWM_f@b>Kd%cC><`s6GSMFeT;ZQHI|M740oM=Q9;l86QPP}h@t!t tByP7`YbWe~reJwRb$xY(LoBZ{_ySc$npuJ|oW%eD002ovPDHLkV1hImwvGS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/11.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/11.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/110.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/110.png new file mode 100644 index 0000000000000000000000000000000000000000..de2bd769086cbeec6c0fe6a612de5db43d996249 GIT binary patch literal 401 zcmV;C0dD?@P)5e0425rhpDSb3m8e4|kTNi2AuMD-iWG?~86p;@OzDu3C+L&(UEF@IPI`e>9S*)2 z`}o-ShQr}tyWMU8d~Mr0s;YAPS6tw6y2&&;f#hK&5k&-P>Rs2_>vOQ#W3ZQ}Z;N^-fOWIkxFuQD2-2Pa4H(NnCyOM>oC%=P zYPGug1Q9v`gNS!PON0C*No=uLO!j0l#NU<#unY6~-24A`kt8$Tb^1jGJ?l@zDsDrJ v<;Nf~O;c|t?th?Qd_{GAb%kS$uQK=q|1X+@w0yLZ00000NkvXXu0mjf%q6w; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/111.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/111.png new file mode 100644 index 0000000000000000000000000000000000000000..18a022429161b5bdd4dcfbb26e486b5ac454c4f7 GIT binary patch literal 394 zcmV;50d@X~P)fr;~qo4}QPjn@nniMn&(QECK0Q6zCj&g9MePfC;OGwrx!^73;dTs=PxkyHNm(0+3AdeXklU$%^Uw z{$~b~hm}MW5u~YKuh&hBs5b&wtEw_fvZ}p4JFh(f8ZefDZWc+BITP^q;{0y6TYQ2D zjetRfJD{aOejLX>Ns`T;Y=-#Tk^pugiX!X(-$jzlaM$S<74)n>5vo{*7|IVpVwPpr oPT2oS!TlB0_0<&)aetM;7yPrFus-eGLjV8(07*qoM6N<$g7(?3^#A|> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/112.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/112.png new file mode 100644 index 0000000000000000000000000000000000000000..32df1d479217818756c1eea08757f74fb7f7f5da GIT binary patch literal 386 zcmV-|0e$|7P)9tEv;7AZF5U>~!BqW=FK@bcIg;~iroXfAt+Z&d$=|gmu0bd0ErRcT-Vj0^W}2! zr#I)5B(ZlTsTlU5Kn?+trfK}gi}P8QnNI~m>nni zM#ZmpX9-BhqCn^H8ziVS1x#2ibX{kXsaTe!RplLW*@FUD6o6!spL^9{Nmk4_jz2TV z^W2}$XOk(3C?ZHxpXd3|BI=C**6a0ZmSj~UNP7Y_U@QYYERrO1CV)z5nm&Aj2#tV2 zggc<6K|TtiC_3!PVTivi31AoamGuAbB1vYr>)|5lPlPHSLk#7IAdxxHPT2oW!SfZ> g_0<&)@qCrRH`^JHwkj5sX8-^I07*qoM6N<$f;^e7(f|Me literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/113.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/113.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ec07717f932211e3ce1ddd191bfba6a9b91b52 GIT binary patch literal 400 zcmV;B0dM|^P)5e0427?nwy)H+b5~G@Y)A|Y8TeVk5Ghh5SQw%#nV7O<I?O$<$$Mt%(X_{s@91iyS7_4pEnSUHdj|Y%A0nW?i z;?TJ$3VVABmSvg0D@nz$HwAJCknDCldszkBY&PywffzFaFbsoBruurlcB?i}QdO15 zD4zKQ`hbm!@6W*#kd8%x&ha-$Q0WSouv+N4&LvZ^X&SG}JLIwp1+XXp$t2(Rs=<=1 znB(#IGlQ}$ElCoWDTyc|NK-$b&t_p|AK}41zkx-)6Tn*6wOf)^jh?k9Km*1y(8VH2 zGG_u%ljr%(Cy3Aq7(~1SS{me|AWhT7o-Bs=+mZlwfnQ1g|1Oeb#=9OblKw=j;x@!s uehdRsy1K6Y`Fx%MU)#2Z$CJ{@d+l@ctlB_Hp63>$ zc;@5i12!tYJv&Q4Iu->whucZ?{{MDTyc|NK@~+Zq*{{jR4l7D9nP)~J_tfbV=hJBp%k`&V4xF${x^<2b?bc(j*?U}afO{Flqc;{ha2fV1y= zht8YL#$F$TrD^K#N>VZGRe>A=Bvn<}^CH-GyLF!m#F!9()9K`rslHmR+^P+f>~=ek zQ9Sbr^Z^?c-=2aeARUVWo#StipwbmEVYN`#wM(Yre!ussyhAQKQvizskWBJzuNo}L zifP;SX9ii8*>bsbnUaVif;9E6>&(K!KEl0yeglhoCxA82bGIa`8bR6iX&m$GE-9;0xoll;E8yAg2HT002ovPDHLkV1fa#ybb^W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/116.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/116.png new file mode 100644 index 0000000000000000000000000000000000000000..ec24eb4cd673a0680255df9f600d375c689d15f2 GIT binary patch literal 404 zcmV;F0c-w=P)ZrE5Jfj}k}J7QofedW&JqO$g@FbamXIvjjSGv0ii#AJK0!{ByKM3%`pyE0Qha6^ zX8!ycX5Hy@@=eoBfUj*^LtWQq|B7=w#&Pu5>ve*|;o#rhz2EJ26Mx_L77rjX0-VDz z7|O_JkQOi0wE>@;Cw!tWU41gVpeUSq$moD zQ9Sc;^Z^?cy<1rV(y=JeIs66*Dop_sRtv}D(Iiu`sw%6>JLIwp1+XXp$t2Hv)nG|h z%;j?VnZb6u^-&c0*C*#+9-RfEh#*b9>pJ`X{O}!vMZFQgT9&0*l2wf$?FrC;u?%#v zNRrH%04k+vdh-b)Gy(<@?tqpC`6!6vc(EsoA^x@`fL&Oxob~_jB1vYr>-38Xde)x^ yRosRc$`3&zbD*8D|A~V671j0C6%H}K%HR`@b(Z|Hs?qBJ0000ZrE5Jfj}k}IW6oz^G?9g+(dE&w-nfrNwv4F#g1a^(~*IYCa6yKM4C`ecDbDL%6d zGk^XJv#x0xUzX(z`1-y#oK7dRf5kZ-x7*E+<2XZARsO@>`}6rc^It9(iwBSx0nY37 zYS4MV-}}#Rf+R`oT}dj2ofOC+KvEQie|LBOa5$Jx1wzaSK-;z^nd)&In^hYq$+FC1 z6wiDdeZWRV?>3fzbSw&V4!=QyN>jju)k0m@CYg%I1Ae-}wI!(FFeRM4~jM5tmK vVkkcZiOhj^!v1FpmRD5QS64X1@+yNbi}{%;0lD6{00000NkvXXu0mjfiK6dK|}Q)dot+va}e* zGapAEuu;*w2TMRY76m$o-ylJyDPY2Cq3b%6OvSpctt#)3%dQl_q5ve5yzEtjC0Q|j z-~Y^@C<-4%k$-!3{`JXOAc_dm)W>nO?=O$vF<8_a0jyP3nI&1(=vjLLG+-6^}|6L@>40kjm{#chb8 u{17BE2ighypD9>gQC(kM;SkHK3_bywjG6g^8^5Xm0000ZuF3`Hl2lEbB4l!6Y4f`Wow8YqxfLV|{3wG9>3rl8ytkOD{(ir&(6+7raF4#O>y>|+CW{A<7y-`P?Pkz9 z%QFA@O^_ssy(>w@u!{mY1W1~u@$c@z=Xq{E6$r5+0K+htWU9w;Y*uZczIF7p(QEvpWo=zvTB&!-h+7qAwV;SgfktCTj0aQxU zbnyuyGy(<@?tqpC`6!5@XtyW3A^x@`fL-8M(*M7UB$?r^hl`{?5vo{*7|IVpB6Faf nu>X~U?G@Ga)fEo0y~^MVmk^vLCokB*00000NkvXXu0mjf^S8A@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/12.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/12.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/120.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/120.png new file mode 100644 index 0000000000000000000000000000000000000000..ae505d003aa3b947a830d23dc049aa1f9642810b GIT binary patch literal 389 zcmV;00eb$4P)Bmh5WM!a{iV9+Dr;*=5C{?k2m%TM0z*hZ;7}wlNNj)N{YAfH%WSg8a*w8BI5_rZ zXC`~5X&Nfa@&N1&!@$V0jMu;F3?9p}(7LXtnCJQMJxvqW10Z1nY@!g*@8}%IG4*|K z4@onuR)K5?q)Sm0bTdzsrl}>>I1q?jjW7&}%!R6|I<<#<41AziD-ijf=h59fvkm=E ztg-?Wx)xB-bsc?ghkrJJWE{tbuvr0EfGCQ%tF}ZuF40LiyzLf5|lxfoXig})Q-_tZnJpd9Rz#$3&yGQ3Zj=Ar9 zcS)OJbqe%ApA_Vn?8IEy6J5j~C*qs!r`8AA%1QTLmiL^E`fgBC%or zQ>&r?g+~i0=(>)t+vWFX5|VKo@4^-ZU;&~ilCIW5UDx8jZQI=$tmS$Bn*lnZ3;ZTY zBA0yMmm&}cK_G!*z0o6oZ(zDeLm|KgWwx@he$s=x^tC~2VexK|R3f@T3HDG0VtnJ0 z%}WRn#4$kK!va)5x`t?jbRnJ%iK@XMq5Hpsq%&`4T{8iZj<{9fLOc$MRe%g&MP=JM lQE+^s`h4{XTO6M<@B<@pocAe#SkV9g002ovPDHLkV1gB`tJ(kn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/122.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/122.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb091f8c098ed4e8455d61c9200e111d3a8db25 GIT binary patch literal 388 zcmV-~0ek+5P)7}mgxUTC%;BJ~GiJ~ZE{VR{~*|v@MeLszLT@UAFStK6;5COm?5)pQf&S{$RIF7DJ zn_+bf^g=_sR8_^V7ven69jJ{1fYP-Q$1#7t5I0S8Di8h;bRgL>Q2Id-@cR>q4Es-| z3Iini5|A(q1HavhKb}cI=6Sv|TNnTZktB(9wG!I475#nRAMPNnEX!XH&ZRHAr}n=00oL{X=A<8gFEA&=0f7#ASp$30~73-E&_}*imYD(03&<@ zbq@*O^eEKTL~Eoo@oY$x4J4rZzk{SRZ)Y9Uzitcwq$6%wI1~LLu?*k=q$q8hCk*^2 is?S%SunqqyBYptfzMN;Mg7?Y*0000ZuF40LiyzLf5|lxfoXig})Q-_tZnJpd9Rz#$3&yGQ3Zj=Ar9 zcS)OJbqe%ApA_Vn?8IEy6J5j~C*qs!r`8AA%1QTLmiL^E`fgBC%or zQ>&r?g+~i0=(>)t+vWFX5|VKo@4^-ZU;&~ilCIW5UDx8jZQI=$tmS$Bn*lnZ3;ZTY zBA0yMmm&}cK_G!*z0o6oZ(zDeLm|KgWwx@he$s=x^tC~2VexK|R3f@T3HIm&VtnJ0 z%}WRn#4$kK!veZPx`t?jbRnJ%iK>AGbpLmdbmr}>LppqeNJreNa3LOt#411ru%fbU mohUdyQGLGpge{Iw8TbLABA>o~;}OmP0000TPkbV6Svhpw3AuL%f7ViehB+?BfyweF{ zzB%OcQUZcl259eCpgYnnL?7f7;@Xgy8Z6NL-$AmO_p^?4d_!a-?o~`7E{DV`AOozJ nY+t7emRHoSuU%n}*2RY5|VkIZ_E}2U;&aOk*v0awr!>UzV8ovD6K5ZUk^U%p1-bO zx^R|dawrT#2?B8xMPew%Zxf4zLVyFx3^EPE_(6AWjei=85^owwB_bP?V2)b=G1fR_ z{SpEg;Tx!PlmHVUT}`w`Iup;DMAe{?kp16A(w?`y4(Yf`5NV5B70yJzNvr~RfKpVp mjS~g_6V>OdPuRkL%D@j3)}Y4=QjQA%0000ZrE5ZuH`zLd^g%Cu>bC@7F9pg>T8prAoWP|#5!S(LQ-gnyBDY&@&%Wx+%##&?|e zW@kow)HDs3Ww`;)hG7t7StjdWb%dW~S$JL7L(KEM`JSdp>H&}l0S-|J*gZPOam;<+ zyGz;(t5cu{3hh!91;3t%(=>IY78?SUYY~Paf4mS^Rdr|&`4D`d*eX!@p6Bt~6NwG` zpIQ|KDBN2>LDzMBzFmHQCLtNe@h)sp02UyMBI#-^)O9WX+qT`D!CIc@zZrbeBVTV| zI&qRDa>@67DFSg21QIA#RfKHNPzZ2AnL+mTLx}Z45AG5yX)P??4U$SkHz>g#sz8iy zT(Wry0fN{EsC!s|3P{%wZICX+qajf>uz>FW4wBBiopsFwL^|SDg$r>%Bvt`3fEAT( m>qNo+iR$y!Cv35Q%D^|xBcM0IFxcb(0000Bmh5Zv~){iV9P%Gz2I1cC$sf`Ed6zz`A;I21{P#P%op7yXXyn@#q*+@q-&4vxLq znaLh?UB`7@AAr4Sngm5r$of|u;jwKS@B4m=bzKkN%d$v401_dD8;5LO zLVzIr0QDUf&>hk>L>r_F@oY#`4J@Ghzk{SRZ)aUI0g;ZlRpCPPhr}vC2C$;CZJj9a juc%&My}}m$RR(?lk%yy>{*YNI00000NkvXXu0mjfem$&~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/128.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/128.png new file mode 100644 index 0000000000000000000000000000000000000000..a2103eede97a9f13bee4318e706ed523574042db GIT binary patch literal 403 zcmV;E0c`$>P)ZrE5WK`mzLYLq$`mvyXpk&KVaXCuAgDl4&>$pJ&`}{pl(hLoevx-#Jzu4ANW%IjZs20zm@(LB$)7{_t-Jq!ca10Z1n9HJ1=dvuPX zh%T3ly(G=BS_N_-kS=+i(}%gEBuOl(#)?4XYMf3dB6Fa!EO+f89|IpK)(S+v=XvyH z?%9U^Ppq;66mBh`plw_FTrPhv07>8XH(|2^umI=tnY(HWRaLS7rfF7Zu$E=nHG`K2 zL$3?opA5xu%$JVGBNu@<2m%fitMB{dx-Nxb$PJkQ7lavPZ;!u(Sf3BqZ^vctg(H{zz^!3pQa$i;>Q30002ovPDHLkV1m9ws`CH< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/129.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/129.png new file mode 100644 index 0000000000000000000000000000000000000000..e9dc930f3bcfbf636221f280c05c034c9dfd2803 GIT binary patch literal 399 zcmV;A0dW3_P)CiezrGkS&;?{?jr zee>R9)?BYws;X)OoDIXk$n%`nzv>KrmSv%JT@NwO^X7Y+CawoS!UQ-(A)xo@oFobL zeQz&GGptsD90;UKS(bD@8OpNEl4@)SM6N~{hV=1bsIKcnd&tMY2a2@{Qhj1WE{u4uvr0EfGCQ%tG3WI4f}7~c5?=6MN#}_fKKQF zziFECCC~G?2*g1UaG+Ry-zV2~DUM@q$OO0`%vv_qPxD~E9mlb?uy{8}A`#u71bZ?k zCdM}|>AaW#LF@yRJuG~iN0u%j>L6{1M?)fNU;*9#9VD4~J?oJEbyEN$8F8(`hPWRR ttpFLoipbV=tYH5{<@w4J*4RH~;0LAYpR3@EWL5wG002ovPDHLkV1jY-vS0uJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/13.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/13.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/130.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/130.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c8c2232b1fed6f618afdff9b3e509d62d942a9 GIT binary patch literal 402 zcmV;D0d4+?P)Bjw5Pa#i{iV8dl@*u@3<)6!5)wcVP!JFpLIMJZ!XUBziT*{uV|%md(uJd`n0xSU z-|Wn=&ooU#Wm)ckynY}W-n~!L#PtA3m;jq71oSgH$8k)3 z-*1Pc8P-jKYzU-FQ55uYF_fn1MyjzR5V;yb5YYRxp{lA*?I9lnA1KxeM84xV^!jMn zhW<~ivH}zyEuf(5I=bEtzdacy8OQN1Y*qjkAPht9sx8!Y&HmfA-R;3zp69F8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/131.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/131.png new file mode 100644 index 0000000000000000000000000000000000000000..632928f68b886e55e4212706d9e01c6e50b5fdf4 GIT binary patch literal 403 zcmV;E0c`$>P)ZrE5WK`mzT_@l$`mvyXe=Q_frJDU2r4Wn+#n<<=%|n)O4@uPzsNf_o>lg;V4@V` zJI;HvGow9oxm@UcKCghYzV8`%p7Z)wox#sM&$KMdE~aT(eUIbF^#Dki0EZ|9^d6m) zB%!YB>?LW2)hdt!fpjU$l8y&MS(aH+jTM2&)d<6o-kuCqRkdpm`55>>u~s1RPp1>T zJQ%j2{}ZdM0EJr%C}`W3p0Af*9}SZX!*CNeD*y`+MG<$^7V5fY|4q}Z&S0%5ir)-A z%sqWxLFPbdn(`&j^SB7aK@f1DSbg6o*L5k5V{XUctg(H{z&DmoqkCJv28{p!002ovPDHLkV1lo?tUdq$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/132.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/132.png new file mode 100644 index 0000000000000000000000000000000000000000..517bc428ea8aa4a570c7e2a3bf1a0ff67e3b2f39 GIT binary patch literal 396 zcmV;70dxL|P)5Cpx2Xr*XjBZ3xoRzk3}%}?Yn@*NvzVRiKyQjF)} z?Ck8a$5d5Cd7kfpyRPdPNs{pT7ti1`O%u)Ye2Q@#cjsXkm=8dN1#k%>p!dieMG>`a zy9P-ztg8dL5J;9R%jnZQP#njrsK!n}>}vSFPh>7s6vb(I=#N1iAZrI=-*FuJHji9} z{wJlf0}ziTfY3AzeJ#O13n0?>{av%!0aSn>2so=Qp)5FLWsee&9oD6Zx{+%W&xS}B;CQp~&a z-rnrYuxFa4p|UJ@z}YYij4aD|{j1L4XIU0n*YyQpM++$Ex{hA9%Wsc{Nyc%!37Zvw1qj2CyJ`z{U9B5EAR;qLzqlFYoGbx3zzmx*M=wF(>JaY(d+ sD2mvM$kuhN;P^!4`N|X4I6h_I2YCXYI@m-@@Bjb+07*qoM6N<$f)1&)od5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/134.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/134.png new file mode 100644 index 0000000000000000000000000000000000000000..4f02fb88c2f86424186a72a9f04c35dc93008747 GIT binary patch literal 398 zcmV;90df9`P)Bmh5WMuY{iV9+nqVq0wIm1x2?-zwCD z^mPT93#DnwNxtuM5Qu{yU_-Hft5_6d0wf4C$Rr5shq<$7e3MwTcr!>M5!Ijsd;AL^ z#u-W4FD8HyM+0S#7GNTzi;3DuYvS3Eh#JRnxca|?Br~sP9nxLbWg;1It-_jk91^V{ sj$>{`Wa~IqaD1ZjeB}vi9G^1q18HZY3L#BLlK=n!07*qoM6N<$g2fH5+W-In literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/136.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/136.png new file mode 100644 index 0000000000000000000000000000000000000000..87e39d0a081f1d8d2e317a606f7bf96d910b1a06 GIT binary patch literal 404 zcmV;F0c-w=P)%5LJ-tKv{JON5kU((D5c${ZmA=e9 z+tB}sRaSt)qXiVSZA+i)v9o_pD$*+^s+)~Vew{= zL?XID3HIm&VtnJ0&Wi~U#4$kG!veZPx`e2M+(JAX5>W#S=>G2@$;|6nhjjP`k&L)j yv4waX60HCkz>3J$b*$j{MCJL)6V^CBW#9*mg`ihZwtwva0000%5LJ-tKv{JON5kU((D$W5*hILaQ2Lh>*=Q%xJ3?)gjk!tJ+M6QPK`}F=~s4UCV_TY~}9|+b8ME>=9rPl|; zZRl^(Dl0(Xu>}OQZA&j}^4p_fl3^Hb%w`2(0fHdls=9@$s<{8AX?AC5Ez7cB4=l?f z+qNkTLyF^=lN`t4AP{?=$A)74HuvX9Gu*Y8jG2W4+{bB+baWqi&XaOo9T};$QZYG`$iKxLKq58jrBr~sP9n$eDK_nxt zRct06heRuY2WUlP>o`_$yrOb_&V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/138.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/138.png new file mode 100644 index 0000000000000000000000000000000000000000..d923a5cf0ae7ebcc8872718feb088f710a6c6284 GIT binary patch literal 400 zcmV;B0dM|^P)P-ktaM zW@m;y(=-j0Ww`^+hGAf2S;p&Mbp}7nve3G&rO}qj^ka}tN<)P7>3+cTd3=r{kLtqJA<`6&wn$pEQ@U0 zrYMRiNfN%~x-J)i*!O)76sssgHfYEMxFF0R^E{7>Q2c2gwo9-iwXk?MNFov4pagp| z7beCxF6q3O06`oBlsznbn@5%|A?hHv5YL80)W8C||2s%B^Lo}H{p+RxL^9%9#TMdm uNVEcE04pL}*Rg`*6P4#HPgvvllz|^e(V$!e5iZF90000%5LJ-tKv{JON5kU((Dm_g>cF3X1e4|BI&`dlHkuy`{_ zA`#u71bcJ>F}`t0=fwmF;uxUpVFBGCT|(4BZXuoxiKu}EbpLmdWajm(LppqeNJd<% y*g`xGiB^CNU`1r>I#zIeqVjy@32PjmGVlWpHKVhJCrn8I0000GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/140.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/140.png new file mode 100644 index 0000000000000000000000000000000000000000..af6a509264e0950bf035f8e78350798855abec4b GIT binary patch literal 401 zcmV;C0dD?@P)+5UB&$VqURaGs(*)R->R31paf^b+X&- zq^|2Z$%+wY2X2%WXFAqN)BJNcH)hx?2l5Eu=*`5F!Fp+_-7RfC0 z41r2<9Iuwi1XX}R_&WgE?BgH^g4Ld^hIng90K4$KaoYdCi)1$aU8i4M(6jv$zKeN? vzI`7gG6&l6`(HS?zM^)0?F#$2zRKVWCqkMg4izf~00000NkvXXu0mjfg>JAm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/141.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/141.png new file mode 100644 index 0000000000000000000000000000000000000000..ace619b1455ce54da29d73d52c46db559b453dd3 GIT binary patch literal 399 zcmV;A0dW3_P)5e0425r-wy%`6bJw5_*+3Z>82DLWh!iOjEDVT+DN{Ny@&tX7zKh$>lIbO+>TodJ z93LM$zOHE+Ih{@maMt&|qAW{|fAJiTaU5lurn|UauZ!=?<)VCmhzf8B5%}+I+e#RQ zaz3BuBr8Uo9oT`vs$^LvAMQb-D4IomECc`*tE!SXj%B~!Yy5PNdWI7O;TWI!IQl^C zcsz=@jV65kfJk+F_kTkKm+F8CTMKnvOOhm7u_y|y$~WQ`R}N4y0+va>?bQZLvT?eu z`<+3Wrn1}Z3*NphD-zKMn`;3&momSy(M zo5!qc+g9qjUVy!>>l8&%X#6YB@tCGbuGi~LjN`a?ABI8m0VGPmCW*jbpU-EB<5-%e znGabp;;g_n3|1vgQ+aoHvfJ%uQXdNfK*h2w<#0Gi6h#_8+`aCh1VVBwAAcNuz*be2 zhT&wa9xy6kFSS$g_9A5Wo#&XzlE|<%% z2gl=4f*_E$XD6>uP7_f?lDXdZy?%dr{K+ArUI}2$vP>g~tr|VsoB%VJh@qQ7GRdq- zz_9&(zZoVYR053fXMkjrkAg4^H*>Nv@z#(4W`SQx|Njn>$@FL4A0+z|zKYpIU%n3x r;sfpY{Vx=(uc%#LyTU%!R~dW(GFhD?k#}#X00000NkvXXu0mjf*9@-O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/143.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/143.png new file mode 100644 index 0000000000000000000000000000000000000000..5663074e4cf3b8d55a10480c06a5e4606fe77f60 GIT binary patch literal 401 zcmV;C0dD?@P)+5UB&$VqURaGs(*)R->IelOeYR&AO^96_?FpH3$cw~-HbFQ4Ba;$8(%&9Y1*$yN=L?Fp~}6B+1gk<2ph z5U3Q#@oJe&Pz4x-zXOoXJ`RE)SnbJbh_{vmunX_*PW%6Nk<6yQ>-38YdbWSUcQFsq vx9@{Q=0H1s{|g7#SJbYrU11;BR~dW(G{Kn_Bjw5Jg|RZGWk@x|&qrAP5A8#eg6oApwIR7!-;XNWP$7(tmmFnPlh#wyC%byuEYh z&g?wXwymwIY6s4SVG!hbF7Yp(;jt`>UDx$4=6T+IPtzoPfQSfi2obpNUDw$l2y9)~ zTap$dZVvQ7p;gi}wKwx%!!X=LUF-w^6^o*)d@f^d}2d<=b{R+go; z<{}ASKOj1)$8>tkz}m~N%sWkfQbzBv`A{1cL-F9qUf|t zDkuUB!rcMLY99xl=biTCG{k#L0@#Jui;@2ST_m;X?mGSAf}ZuCa9wOebnUw!kvY(g n+yBnN@rvs8)hq1cc$L97)gG9Ab;P2T00000NkvXXu0mjfCbPBv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/145.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/145.png new file mode 100644 index 0000000000000000000000000000000000000000..b67db9441cc225c1d595bc94771ad30cc2311ec0 GIT binary patch literal 392 zcmV;30eAk1P)Bjw5Jg|RZGWk@x|&qrAP5A8#eg6oApwIR7!-;XNWP$7(tmmFnPlh#wyC%byuEYh z&g?wXwymwIY6s4SVG!hbF7Yp(;jt`>UDx$4=6T+IPtzoPfQSfi2obpNUDw$l2y9)~ zTap$dZVvQ7p;gi}wKwx%!!X=LUF-w^6^o*)d@f^d}2d<=b{R+go; z<{}ASKOj$*OGvvC{+MNvrni)Z***VS&@b{EUC9Ny=77Ct~k1UQ5U+~>aUZ4d;uX_`Gr zixGDRdZ5rMX`0%bd9Yy^?xHRZ0)UETS=u;`t?&C1Kh2|@;RHcA%4a@?K2WQw%3AXz z312@TQeB_j{}92YIAFrsLff`BNfN1;=ebnn9dV5p2dF3k%OszB)xnaioM9M#XYlcA z?Ax=E`2J#qh$Bck^=X=R9vmX>MF7<-%OsMl)#zFG1n7W?4D_-{YMEyU3@nPG%QC5; z2rvkD2Oz6`9C)60*^|o$*OGvvC{+MNvrni)Z***VS&@b{EUC9Ny=77Ct~k1UQ5U+~>aUZ4d;uX_`Gr zixGDRdZ5rMX`0%bd9Yy^?xHRZ0)UETS=u;`t?&C1Kh2|@;RHcA%4a@?K2WQw%3AXz z312@TQeB_j{}92YIAFrsLff`BNfN1;=ebnn9dV5p2dF3k%OszB)xnaioM9M#XYlcA z?Ax=E`2J#qh$Bck^=X+T}ymvCL|Lv-!CAdxxHj@$pi!TE~n g_0=ov;(V3CH{H3Nr#`OD?EnA(07*qoM6N<$g1WS?4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/148.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/148.png new file mode 100644 index 0000000000000000000000000000000000000000..aea049aa0a3c99692375cce5bd42710a031e50fb GIT binary patch literal 394 zcmV;50d@X~P)ubl)HBBRz%Vh=5`o32bMWOL8p5rl1lg#sc6W8l?^*xTG@&O_$z#&B7zqf5GVHiqP zRZEf;BQ6f?z+hFfER%P4Cs7nFqCQpvfQskyS&}4?~cixmM*Haf>?#s2BmuByW4Q!IEs8uIqkh zVD^Y+5l4`0>ccR|+mn-*2PdzOKN0sTfa>XV(nzvZgJgRGY`{bYx?3c(%sT`s#c{k_ zCKFTv2I21jWV4ThAP9DQvK!*9B?0Wh^TBEV|1Of*^mm~?)UpcEX%U_p66Nf0VGPmA&J0$@B3b&D3Z(N zvKCo0;;O(74Av#fGP$}ZiQ{-B^|2uUbgZgM(lnJY3^jhbXFWp+gydL0{y64<6z1LOGfZxrmW is9j&X!anv_8GHkJADsb|ZQoP?0000GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/150.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/150.png new file mode 100644 index 0000000000000000000000000000000000000000..d28d53ca8ae88b2805a5d3e1759a47c6a01c43d5 GIT binary patch literal 389 zcmV;00eb$4P)B#DG!sPV(y>lsQQB**gc$1w+NbzO_N z2QB#g29fUe?EeP|Dpdgv+X!9PNt&kGu_y}d$~)v14+>zh1SC_upVf?|*m8zp`1Qc# z5lteBNHW*2*Q>leJ9&9@^7`}>QLhBB=6SA>V(SK}?Flf0i5PlVB$LcD38;zV_^?by zs00|{?*Pdr9|b`W9QNd3;;khC>;j*X`Tt!clj-lezex5ad=;ySzI-1P;sfLO^KTUF juc%#LyTU&9R~dW(hq9f~lYjiI00000NkvXXu0mjf(Co2x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/151.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/151.png new file mode 100644 index 0000000000000000000000000000000000000000..3d541e909ce414015d124b390c6aed44096d09e5 GIT binary patch literal 393 zcmV;40e1e0P)uJ?L@H)kCRO=HT;s_BDoVgI$;V!Gup}#|@B7~w zSaY!-=3e6GcZ7%|NILa#95)^uBJM>1)$8>tkz}m~N%sWkfQbzBv`A{1cL-F9qUf|t zDkuUB!rcMLY99xl=biTCG{jp=0@#Ijb0_`(yGUx&-F5oK1wHFO;kwv{=-PKdB6FY} nxBs1k;}zBGt5?{?@hXEaiW-^2*f{TP00000NkvXXu0mjf1^uyl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/152.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/152.png new file mode 100644 index 0000000000000000000000000000000000000000..03e23b1041326e646431702d391847e43a5366bb GIT binary patch literal 400 zcmV;B0dM|^P)+5UB&((D;=ks|6&ThAx;&?o2{EO#!48tJfINn9y_p|S=>y!@=Q2`Di0{{Jby-FO% za=BclBr8Uo9N2-us_gfB`EU=CB*`S|V%x}+00005e0425rhpDS}$PzNSJ85med7BV0qMG6Z8%EH7%hm1TypQP{N_OoPqfm9t%3^(@i z@xj+MO(S((FTmOLdR3HVsqwEo$ItC{lWCgnVjRcC`!Ece4ALRM zgZEb_yJx5I?Zs&#ibyio`@Wy^;y9Kd2y{P`0M^6dppjzh#>}=Szzim0=w^{jGS4Jn z*nYp?ERzu`0Y>;cK(fh4K^TUcJ=vIeZ%F{Vz^7#Xe;3JQ`n&Egl6?tZ#cZN4-v@>G pz&QT=3kB;dYS-7Uu#fds2H&Faod60MLYe>o002ovPDHLkV1lebuqXfk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/154.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/154.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f5a23429b385dd46c9921ddeeb802156abd5d4 GIT binary patch literal 401 zcmV;C0dD?@P)b<85JZ1Mk}J`sPK%X-3L^>^G`1VNKte)-hQe|~MMVmioFFI3T{d|ujq{C(QjFLB z%+Ag(`@`XIuyuQB*gMdHpelKu+edh?<#O4J#ux|yD%N#vS(e#+KKJ+;9{mg_2*MGc`2_kv zZL`^!g^4G8{eVbyy~n>Hf=hS6gw?`+zqj>z?G?+i^s0O#t~hdliU?RH`L=9)VN02o2)9GaIFTq})f-M#co6TmvA1;7uQ4}6YRyD}l6QBVT8R%${WSMse zZ_mM2tJP?kB+5UB&s9|=Wm(R^+4Xu=7vZREqjUQxTgc7=T`uQK=oPf?j1qN-z{00000NkvXXu0mjf7cjMq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/156.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/156.png new file mode 100644 index 0000000000000000000000000000000000000000..9f16696d6fe177beb1066e0b3134e8206635ae0f GIT binary patch literal 398 zcmV;90df9`P)5e0425rhpDQEk8q|R)pbQLI5*8SckRrjtfLJnRN(V-spik0war;>^y+EoC2gA+r z@v-CUnx>Jes%GG$T*I7al74S-`DF^`2Z0W;1DA4-`lp8IF99f zK2J$jj5s;41A|pL9*^?j9wbSUNz}(o08p_g3Q5ycqA1e%=^phACkVnZKJ#((fm&IX zBJN2OzJ5TYy1o0qA%aVFz=W-Zx~}DLIB3Nz%d{%rh+AAaK*b1HCVAPb4VGl%bY1s5 zgZEb_n`fu-?Zqh(N04mlm&;}1!6D*a1yDVmP8vzJYLIMCfDM?)Kv#=omU)LjrTu=t zS|$@z0S4jk0A#bj-EJie!_}UwhInsD0J{(bf%gCJBAHEp*Xb7*^lblx?_wIFZ{G)r syWLLP@%x`SSYA=PzIKIuEUz;72JnBIR>dPh%m4rY07*qoM6N<$f_YT5)Bpeg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/157.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/157.png new file mode 100644 index 0000000000000000000000000000000000000000..d5399567ada890da5042b556b0f8081fc9d1eeeb GIT binary patch literal 397 zcmV;80doF{P)bC8l|8DmSw3``9|Dg-~bgPV439GUTv@>8>jF4 z-x<8WI$1qCjc+ebi8z8}Q$L^2L5sLo0aW+$Svj9PCLj#CuBu*o7#HwEuq>$!z+&PQSRIXZt677xNH(`#wla r(^T8>`(HS?y`pw~?F#$2y~^Ml?gO2J0&+}F00000NkvXXu0mjfzkRRS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/158.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/158.png new file mode 100644 index 0000000000000000000000000000000000000000..f64f72ca6281f0dac33b3f3e4ba2f76387992723 GIT binary patch literal 399 zcmV;A0dW3_P)7xl5QHzk&y^CTHA+E+kqZ|zwi_srkdUCEu-s6&A_b+NAWxEa+2q@3oHHg$F<$$a zot<6w!r^eR?RGl=XHC;MR;!iAzj%Si<#MsE>u%zFJ`cXzwsk&0#05Bn2;%qS@n~t9 z+HSY&lT?h@JJ5lkDn(J)d$_a3V$qAn7zh9=uGeeJ^W0{$na7WC?`Jqc5RUlFC(s9K zo6W{7Jb1$AH;7c%d;A+BxO4|hSS{@Lds{A-Ua_hwugW*#iX#W8h=661uY1*CNfxKB z>)#p39#Ix?1W8jrolf@l9PH&W*z40z#JvlkT9&0pl2r|o_5^6aLTof< zTwh;1ey(X6sj6xL&icMroK7c=fAJiT>-8$rG~LBGj*IVM7?ckXQ2`Di0{^{jTZy7b z&gb)-WW|WH13NHSmBZm6FB>Ou9M7UY76O2ZMNvqarV@ss#@9!uXE;F+j`5j~qYu=| zvXu8{rwMOQKauM8?*E1eF4X}OwifETmMqJ(;_-OYs(d4EapeFNBVd{2+g@$3Bpave zy5AXy+sKD|(D?ZsA>s&p ugT(!QukHB#FC5%nQMWSO7qt}SN(0000iE5XDLQ=PT9KRo2#$AP^)cKoC%nATR`hz@acmzTvjNNglVm*QR1_cZZob@4eei z#&L9g-v>c%Sr&_?X>9$gF5%}m4tJhs5M9@~_vgeFMG@q;ZL@j;5Cb5&@4JQeG=9D$ z2EvyA~L1X=;}B@Dyh>biE*GzB@NwQYO%fJsb2Z&g*+lx3L} z0i5T#{Tr-eByS9W1|j>jS>K-SXTGTxi4PY^6qyDS_DlkpGflo<27nQ002ovPDHLkV1hP|ornMc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/160.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/160.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3ab1b11017984b03d909eedfe35b04de351e11 GIT binary patch literal 407 zcmV;I0cie-P)ZCgf~ro8@DXYezQBTdt^i(wd6-+kY6Jpd9Wz#$3&y+`LL zil}Lt<&reRx+stXfpp2Tj6TdAB}uZ7YODxEu7>aXMCL$6QS917J_bHetQCm-I(}{~f?0Fssiq&;pavX=kFyw|zfD6J5vbV=yLafh+>$h#&OD!zk z43bDhHz>g#sz8iyT+(?l0fN{DD0^5ycSx5Ib&yMldqW~>EX(5V{|=JOyqZrE5In_6zLd^gB$^a7DQJ+8MS+9_6bM%!C}6!d*h$J^nzC&MJ;INpWL3cv!yam-z{g{EoPf7f-ZJy<)R&%YUb zmd4>gahja;12Wdmx8xm3DI1YFJcaUV}^{hiWe1k|v zT&u7lZihrGK-#b(vUMFR*j`b&zH)^%wpSVW2D)&fiqsGQ$^ZZW07*qoM6N<$f<^tU ArT_o{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/162.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/162.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8df930006f3e38800e899e72ea7ef03a64d122 GIT binary patch literal 405 zcmV;G0c!qSx+;4w`T&GWpAaU56Q!!U3?01_s^CJF)lj?Qr$ zQ`dF&kTk<;708A_y5xCI@8*uuG_|A}D*}?QH z*L5k1B1)2k5Ba{&MIa7>fCI&PI-P7S8ZrS62s6k~^zvZn_0iDr@U!9@|D+ZcZw5&u zq8pUp{q4yxF}`s~=fwmFVjG~m!veZPx`e2Mv?1;diKu}EbpLmdWajm(L;CaL9YiwX zT7?a9J0w~GGJqA4t?O99_KM2&l`E{Vy~@BhR+BH1I1c_$UmRYbb2yu zL;n-2tN?{u3n*yYmR@g%-<}PV48w32HY)%N5JeGp)fO(73;S=HX0-=vMN#}_;5ZJs zu1j$oQ<|oH$n!id0&x%o94Owt@7r25WC9!zW{{!i^dtYnJXjm}C$+G6H%KB8-Jk?( zG6yEcHxB8%m;ga+1C%u^e3?gBHPnmSvVyV?`ixHKHgYG6$;bdbd6JW6%eJwE~gv`#yb{ zdu~I2lU7*)0=F$7pzAvNye5BN0g`bXZ_H)|U;$326IazOoX=c zycr~sh-y%RJt~11??}>qF#(L&8Yp|Tfa;JgCTb(CiF-pLY8=Pm>i-Us%)Fj;@dQLN z;#!3@aXTbh0sahH5!pJ96>P7lTwl4u8r!Q3`~c$?qMG3?G8g~=002ovPDHLkV1iLF Bub}_{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/165.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/165.png new file mode 100644 index 0000000000000000000000000000000000000000..d47f65c36ad277029a732a6d7b6ead291e21f52b GIT binary patch literal 407 zcmV;I0cie-P)G@zN%Q8!AaL6P0=llFmuvFdqhXS99B<5K1z-VArxRDzEu7D1?!Rr@)frkVisIJ; z*LBJBJc{F((lq6yAP6`J#K+^24aNFx?&<3aG6ycm1V|8OkcDB$vLXM&+}WhhDz z-VBmRL^UYE9)AJEct?`5e0425rhpDQEk8q|R)pbQLI5*8SckRrjtfLJnRN(V-spik0war;>^y+EoC2gA+r z@v-CUnx>Jes%GG$T*I7al74S-`DF^`2Z0W;1DA4-`lp8IF99f zK2J$jj5s;41A|pL9*^?j9wbSUNz}(o08p_g3Q5ycqA1e%=^phACkVnZKJ#((fm&IX zBJN2OzJ5TYy1o0qA%aVFz=W-Zx~}DLIB3Nz%d{%rh+AAaK*b1HCVAPb4VGl%bY1s5 zgZEb_n`fu-?Zqh(N04mlm&;}1?RGoaZnwH0DuC+gbkaz&RfBAM0&KuU2D(}#v&=gL z-0b)J)iRl&3NQ$N2Oyh$Y=&XD+LP4~?=1;n7lI(r{{LMhv+3_T{o;b2?Vs>nOhfeT t`yi2t(~jT&%)#=C+V!<7>|=SA!8fxyoZJh4%9{WH002ovPDHLkV1f#>yl4Ob literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/167.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/167.png new file mode 100644 index 0000000000000000000000000000000000000000..47fa23f074a557d34a4a48c5ec3f940d0a46e3e1 GIT binary patch literal 401 zcmV;C0dD?@P)Tof< zTwh;1ey(X6sj6xL&icMroK7c=fAJiT>-8$rG~LBGj*IVM7?ckXQ2`Di0{^{jTZy7b z&gb)-WW|WH13NHSmBZm6FB>Ou9M7UY76O2ZMNvqarV@ss#@9!uXE;F+j`5j~qYu=| zvXu8{rwMOQKauM8?*E1eF4X}OwifETmMqJ(;_-OYs(d4EapeFNBVd{2+g@$3Bpave zy5AXy+sKD|(D?ZsA>s&R*~jK?w_EMWYKZri1h5N15NQAZE|S^wcb$H5LC^M2_%7xl v`u2U0$i!*K?|2vJ-ENcjuIrQ!5K#dRAp-xou4{>+ zNUEwDldKqVbYKStt8zFT7-G?mR}BkwOx-kzNjaRkYx-nOlNe|>VY-ENhSdlf+Scsyz(*{VUdJpndgA_HA4 zl3C^%0&e#E{bHF+Pz4x-zXOoXJ`RE)SnSDSi1(HRunX&z)BgWmB(v%7I{o5;p6#FT yU5rEY?fW2+Ina*Z|HQ%kirV$HE9_%_mBBaZ?whQrZ+(UU0000P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/169.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/169.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf1a4ce4420a87305a13a20b3ba8850004d2043 GIT binary patch literal 401 zcmV;C0dD?@P)5e0425rhUny(nu8BHi3W$M$0mwoIB&0~m!hl$qGSPuCPtYgnySV*anO-1OhlAnf z`1siIb?5V0s;ZiRv$ky&MNw${i|2R@!ywn|^(OkhpL|~~7v%#)RDeT>z<;mnT7n>u zmY%QElCrOe-EAIDut;#pz78edsF#?uJp7&~lCD}Ml z)BMgLO;cH~*J{%&;s}yWz3aNMjoogieB7%5s(GGkB-yHcxO=fZ0XASF16?eVS>_$W z=eIxxPRaLV7b$(bb zPvXnH5hBi-q{UcI1sYI5LL3EImPt$txbO%-cmWl!4@Nu)TLk!H=p&TKnWQL+?DL@_ z&vWlLZB-N~dq^;jqqKkzkj(RZWwt1Q1<)&GZVO%4*|IF{FbrOd*6OtewthRalo336chpyl-ZTd`ets5e0425rhpQ~fkHK;?TfHE*J1X#j=goKnV3@8gzrgUKB3Hl^`7q_1)(+i~PaALR| zA0Iou?sPgyRaFykc0QjKhr>bRUp&W8-}f>M!%bYT*U9_ka#21&Lj=!X(S9o zsq1=7vSP&1fgKpEN}8tf?(QUtqEXbxL;z5+C<=+=ST>uD#t(O|XE;F+j`5j~qYu=| zvJ`O-n(+AzBGv8L|Aq)I)d3T>7LLcGBuSzb^E}t8yd!RL;Q$pQV4383uQphcjnlU6 z?+o_)y{y-3d3$#9`s9>|BS<#&uIu#s%i|A+hR*{7`_2o`&?7~-uZ0qnwRwbK6oT_m&V?>hbBf}ZW4@Lh~U w^zHi~al74WJAVHY2lFdx*VnGFkNH&wUqYjt|KtgMXaE2J07*qoM6N<$g2#@yJOBUy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/171.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/171.png new file mode 100644 index 0000000000000000000000000000000000000000..edd7e6a5b0e66993f9867a2e74390e359f341e57 GIT binary patch literal 404 zcmV;F0c-w=P)hkRcKh5-bc6OC}~3M!uk5(tmM#T$w&Xsty;! zi+z2s2#9aZYS&YTI1`Z(=(JnNRH(*ABPXv z&gZkdKRYdWd-{oVw|Ds!I0zy>`s9OuO<8xy6M7SS$g_6yJKa!BT8F zm&@gM28Y8z!Z1{sCJ{v>+0?JstB704hkKCEZxB(h1h5{DM~xI)H$2;(02?rofi4!w zB=b%JYLX;bERzu`0fX>&fMk=8ttg5Xd$Jhfy(IzcLJ$P%|KCM2nf|Wh7ZrH6f5KNW y4bhkHgTl>bqjr4%GX=L-)UK~xVIQ|w8GHdn3z+dMDBZ#U0000*;x7yU-k{`vUd_v zyxYCmnKy4{XVrW@$7C`|fVS;+D~O^<*1!A|Kc~|P=kqy%Znukiy^emrpRgYe2k|FJ zA_O!Zk4J&oSF2TIG8r@)4eWM18)TAkwF->EfF!i{dOZ}2MXXjUo4`eafN&34cez}~ z^R+^|-M%Q1V1E?rV1TQD|D(|eFFN?^M&VJfv)Rm^nNmdoGf^tDEtgB|_j?Qm11uH` zX<)P2#CSZ$dcBr)v)N!c9E!gvAWJrzwM{FPN_f>7c?--molYfN7>4-PY8dpc&$+if z;9;#+LoS!Y-Ic>~Y?iC-et Vjpma1e;5D&002ovPDHLkV1gya)|LPO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/173.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/173.png new file mode 100644 index 0000000000000000000000000000000000000000..777f96d4533dd13a7284b97555854e7f1c40b26b GIT binary patch literal 484 zcmVgGMU6c+jhGZ^!t5T|MFA(9FIqwPNx`xAV9TRMYr3H+4uXs z_!CSb31~bV4g#|;m&-_{QmEBxh@!{_88WU`fiV~`3GJOu2l;#+>-E|axQHbn+(Xt~ zEEe%}t2%sQtxzc7MKkgi$TXc!g{{}?;YVFc(6?T> zw>{utrBXpAlfm7U!o5bRR1#&BPc`*=9ih6AVER!7)k^|0@v3ICnJ9VJbu*ydZp)s| zO!lRN8;yqevWaJd#6)ECJWrgc>ho5?_kHPVHe4# aO#A{936S(Cspp>n0000_(H)4Dkvfrii(AeSlQSF?q{S;o1ZzEGqB6v zD-E|t@DU;){6p5A z%jNKNZP08sFG?iXAHzBr;49$&Xf(pJ1i#-HJjgnq&)u0VRTVH3r83)UwZh?Wz+f=I za=Fw7)@n73$75_Z8(p{CEr!FP`l|x6BoYbNv}`tu7s<$5V5aGGs@ZzI9zH}3gI?vF zd)EUV7K=qBlS$mh4DJQ_d|s7(nk!XPsZ?+$b_UarDyUuwn2A?4o6S_oo3JyW)oS5K z22w;kS`GXC-Ub;mu2z9D7%&O#yvFlYXQot9Kqg8h+h()D;c&oc zG{SnlmIgMPO-!d#1VJEc7={>+$Ko#vm?e|R*rpYWMLcUp-U6BC^SQ7M1_S)4YYF<) zEBCesJgio$$Y!&+ODWuIl*?sN_NE=Fre3cjR96yAKdPX5NkArE)nc&_B`>;e26Q?d zeCq%@GugY|HyRD`WfLz3iHXS8YPH0Ps-RNveP8}rmOB%YfHfs=fGeAp%jNK)S=oo= zAlYj)B_v_wvlO!aJ4iIRv(5>ObOJWm9dTEMZK5mRfV1$W6Xf&xm~7Wi6eORhdA{Ze dyGTA|;ulf4qH5MAiU&ndn1($bdF($dmWyc9u=ikL(23k4HVK@stwBq0Yc;>nB0{KM(Ifn7F{ z(!K-Rzf6h6n}kC>ET>av)QEWc58w(8CIh}8#Isv_Q7C4Z>%B=LqlLAlK`*}QFpak zrF&MZNKjfNatohiCu)M_bc%lem}!e_tV)8TMP!1sOnxKPyXb`$pP zb}Rk>l1Ks=ce|ZH?<D2twrHTSDK`Pi5iv`7TOhFLP zd_I>3HX02Y4u`Z_tz?a&h{7-we^G!e56tk!OxbLfN~ID#@)@@Prtx?zY`tEOe$=T1 zee;UF=>dLLt5tg9z^gMw*9^yTL>c5mjqAD;sS^p#<#M6|>Lme~a8;AZM6U0Z)gYkV zZp$9dNcP3S^?F@=(Zr)cLL#s=n@w?os?SSBp6AIKW!W_XmalQ9hF31~bV4hs99&*yP}Zcr>1vE6Q6kWI$bDX<0$lF;62weTz|mdm9};3Gsp_=l`J zo6X`*RMhMBlM)H`$FL3t_zJim334;yai?&kH?y=)9K(td>Hg3 z=lpj);9;Rq(1XjE!L=Zl%c-(YbEaxar4p{hPM<^~p(?0e37CmjHJMEG`d);c0gXlj zKSDrflHE#hxm;FXHt}STNW^T_YE_-63MPhHt)_dH<g&>tmg=G7Fsv!DA?en!y d*hlm!6TfZVjQe|eSoQz_002ovPDHLkV1oRN-v}BtjkmB6kojWt<%DKIj2|777JCO5jz@;98K&O(qk)zGqRx zfJUQ%Zwa6?lO1JWE|=ApO*|PSCL&w4T2&{if{CG4tLd3#xig^&SX1-{xUy-*;hFz9e9S-4SBta^b3dwf;R6+EK i+UIMZu#4zZCVl~45s(Qio&0400000iw~5QW{e&ClwVv1?Z(1_mSs7!XV#F|Z&81~w+7ijlQHsK3L>chXVYNz~zD`?!1e z-ivMezPD}LdO>cQCW)%5WPMg=_}RA2?)&aV(=_(u&DbBX27$|xOFpi^0zz0C)dA>7S7=S{c6);yq*LAimOFImMmqS`z*MA-`i7DtUib9&= zIF=%SlO&OUgH;)+Hv&L|BD=I%zs<{W=9|_c@$MoiMW(@oy)~}_%$X+FF9E=a&_LZI z;n$pmx|--3d6@XJxS&e9FWXUwfC~3J&P)zjG>2%az6)?+(ImVA55{V$0OyX1ayah511_NblHk)`6H4M5F zMclg{@GzUr;!6VG%n{xN>2z9^Q9jk=^LbpH7!8g_qpE`HH36A;Rm0&>ukTwDF`!zl z;!&9B%w$&*TqqROmrXnvBqkzTsZ>%Ys(L*)D3{Cn&$9fP&;+b0d;?tBv{)>LTVZ7% z!h__l(UuT~mCsVh`tKmo;Lmy@kfL^bs@ydW%-pwh#1+iER>2w+&vgR$Y(r7f&YVCF#KjP=1 zPqAFP9&j_C&+EpEIl-$So6RaS(kGi@v4}wYjETqN%7W}Q0W0yU#^bSG-EKg)6Df2KyuKvv5uH>059X?j%7nnGDhPr+z000000NkvXXu0mjfF!$)@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/182.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/182.png new file mode 100644 index 0000000000000000000000000000000000000000..006bcc7fdf7215a006bc1d3620aae7c245d3f7f8 GIT binary patch literal 489 zcmVW}C5+$JVa5yOJKA+Fy=FFg2EMmLex*(g3t5aYN79^p))oS5RR4kWEm%vAefbb7l zcQ%{FwWz4q>%U4Q*dN0>7~m`5|6nlC67EI8rL5EG)ScNaJgJoUpDdAAd!gKs@1AGQ58%KwOUR8S(ZN&O2C?;H^7xmOD2vSA{yRuC__Ll)rx6GN8|;s`ufjFamv6yY_!NRvDixCL`>BHH6SdFR fK4Blxr%e0+QZ$fR;PGq700000NkvXXu0mjfe;M6^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/183.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/183.png new file mode 100644 index 0000000000000000000000000000000000000000..925a0c003f41f03ec6670f276291f61e7ac24b43 GIT binary patch literal 485 zcmVqH+8CXAzj)O`GWkz$((^* z_Ff4o&YiupvuDoC&YJmrj`4UL0ezdzM$zl_)czG`_&FYr2*WUfR;z`FD}zp_6Y=l& zdyOYZq6Bmv4hMx@7YYU3UK*52C2Y4_cgQBAbqcJ*f+X~}+il#5iq&f668MM^5dJ3X z&gF8r5fzO__NImfpkkw_q$&Eiegyai^OOeUJG+wI~<{5R;$%Ch^k;NP_NhZpJn+op#-ccegm{@S}K*oyJTe_;)CR_ z(UuU0mCsU`_1{6F!=Lp`CWBB2*kFIeeHE^WzI+SL!lw|V)9Hw8KTZ|IpQwGl_6hrl bKV{+1b3&RlNfAOqAZdb4IPe?MLcCKHPQ?=x5er4d!sf8L=86>8h5V5Gfk1x8 zWZu9odnX~qyWN|edGls=RxK6_noK4sz_#1%1cSjq*1!A|K5-mVk|Zf~yIuNGC*=En z%6>Q;#2)~O5WpBkkwEXO)hc~5LA_q5{eEwPbTX_)fi`G>1omF9M_){`Uaw688z}<7 zK1AK+a+yAupxtgCl?b3e3UwgBR)GH?2&9B>#yev^pPMsXswhAvNJX~QYDHlf(r`GW z<#H(vY_(c69*=3W*~q%xZfP_ciN7cS%iWoxmvcqAT#ibm65aDZZULF5)2U?Z_xtq9 zJ_vf`bL>qIa9FF=_rFxazREEc6^G}s<-TZL(&Enfq(@Wcd#LLnvF_7er!C#s*X fe!@1gPZ{_H0v(Lj@@WpsxOs7-xPnRkRkO@+eZLwHT6h+kQ z^=LkyO9NfkrQvW$tJO-@Fbt{R?~A`E0L#s(qNg)OnM{U?#UkDE8MlB;Iq;1zq*1N?LxhweG>;zZFUqg*bFvMaVhO|4d=P#sBdHk%a{P%i|?gsYlNCUSj` ztOfzCR!jD92H7hI*XwohMH3GO2}H=|d7d~y)$_TcMx!BTlx5F^5TK^?4PZsna=9Gc zaS7-{dXUUD>Jrk>@=*%1{yRu8*t1?J6zH0>qrvuw+bT>GZTT9Qg$E|c=kp2Kwx1|S jKT-XB^%J&{e#*cv@nKQGqW;UB)G#Z6K+h(&-bh}+$|MD~Z9FIo?K@dW-*~E`IL%ZD$ z+4uXs`V%Bk0vZp8gTnsj^Le}pL9tlGcDr>!HW^o^z#1$_LVK&#!l#fdmrIwxM~Hy% z4_S9Mo5iaT)a&(=5()Olunq?J3b-E(23o?m;8`%8PTiR;RTVH3r83)MvA}M(L$BAv zd_LC(Rw@+?heNDZD_z&?HTwO&`l|x6+@2deUKqsVabz+X+{vD|z)a)uShICH9XyE- zgYM;=|E>o-EEEcQa2YeW7UXg{RrVtCsissa;Y#fENhA`gg6frknRr!`$waU3LD(74 zXf*I81av0ZjRcp=W%XqfPX>uZ%vP;d)rqQLVyM+>x@TGbOeg_sirxTMHZ7S<;$0N5 z579w#*Jw+K!pdhU%=+&j(csT|I-N!!1Z=QB;=T&kL|?uIXW>H#QmIr(w(qA3qEFO5 gU;Bi8M4vM83qcW(h)R|D4*&oF07*qoM6N<$f^=otHUIzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/187.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/187.png new file mode 100644 index 0000000000000000000000000000000000000000..254dd8c47870f1e7394da8fd28afab8c5064c091 GIT binary patch literal 492 zcmVGB_5 z<_+wzcM?*(+ugaDH*aQV&1^QqXfz6ew)J|g=ytoh{^e)*IUEk~eLsX|vx#qWj&{2p zvhQ{~^(RQ81T^mVdxhQS^Le}qL9tlGX0r)`Y%;Ea0&B1!3GJ;`3m-zVTrPtIEtcR;nE-;k0X=G;8xDO1!fwL$C|Cv>EK6{ zFz6^N_dyT%vrs7DP6DrD2G@dIE~m<##F1)Br4l@Iroo9sLRC<`5-=05YBHJV_1%ja z1~eKCd`bYFN%k!Ja=EO&Y~slvk%-x<)v7vC6-*4ZT20R^%bf`&U`^2*;L4^YlS#Zu zR`ww}NWnGQ5~8s3SqiiMJ4iIRvz|_;;R^v9?2fprB50y3--5I7E(EDmDkR(WQw7l{ iYM-xt!Y-munfL`UM3a``djNp|0000%jJ@2wOU;N@-z7Cc01Yc_W{&uHTgD&(r7dS z_RVHPe*h#TfN{Is5_X@-WaL>1a=DzWRx1}|lVNoVtib{#u-EH#c~_FzY~~X92oM1N zA?i-0Qu3q(l}hDTi2(XzPzM5h1^DlFyDZ^L@u(P$M()g(N(IOSsmL~+PG!AbOS|2c z$z;L?7K=sc^?EX&&$%uZ3+Z$^^rr%_yl93`MI;iDWHKqQy2mXb(_k=Qwq~;_wYYes|p5%*QNCi?O%Fbmg85Rb8W6z_I#cJ|Gik5!Y&goeXm0C~*-i1Peo|&N4Y8|BrpgszD;DW6H|3MH)3SW#z#&|q7XF63;fJl&vXtUXj*6TG5 z1_PQ-r&7Rry-r~m(qgfYHI8HQeP8@V0a#u+!Y3n>$&l;1bl^R@fJjjkNwi+CM?Y-G zr8i!&H#NXvxm=cmdv!t&jAF4U$}Z28sHs+~6tf*Z*=$x+K)nzk5?VDHjih}a?1T&L zcAIX`l{ka!iS4yoO?*+rqd@`@qBR-~ae}J53q{RlQ~r^bJrhEJoYEb@ilRA=L)V-F z>X05J(?*>_8d^S5LDYW-2?l%C^Z7hoadZ^e9&uZRDWWZ31G8|$1i4%;A=~y71?eZM hpRazxHquWS_yyLNlR|gX5T^hD002ovPDHLkV1in~&5gs5QLrI$4Yl)+O$X%6i5_MAgDm1pg|NAbW}(uO4__c-XhQ8<6CKo?MswmFzk6} zXXb3v_q}b~)&sR^ngmr<$@=WD$sWt z-(QRn@vTidjP+EY1qCG3QIKVs)O3Igj{t-lQ1S6rxWKn{@1^L!V!D1Zgv6*AXC*LAimOFImMSHoIe*FPCBi7EIkib9&= zIF?NiCrKjz2J5$Zv|k6Td6I!bK!Y;7vRSX@;cWUmpnI`+caT&f(@?@YlOX1sCO0o3 zAc!zPea8aRk**=SL7pN0c1TnW7MT9;L81_zb)@4PB0b`+iZjIUkhluS04pln-6smd iE2`I5uds{oDuWv%-P)P3+Ym%Ns%Iu@0iRv zu*=>XLW*;D@9fN(Gqba1Hk-+4GztN>&1OS%yIrn-`5AnU$D;&65JI!rly7q??RGn4 z-|zSI2S7ps7!QX7VfXobULKX8SS-qRyLCY}8CIvj8Z1Bpd#lxwcO_Xamo9;i5CPyH zqV8-qD-TLguh)N-2%tX(bs)f3fd9c@z!JU`cZ%tB>dtJbRDev7ifoI;LUy~I^m;v+ z&*yAlrBadMa44(QitBp4mVUoae<}dWlVvTGDeQp?Z zb!NDCJ-}h1P>@#*yfG(otH|YYRCcd6s4107auG8OP9zdk0rez6CS28IGU4@oXb=J# zjRyB{2HB+sm&;}PqKUr-2}HAt55Kh})=oU~DMa&SQkq8=5AtDl}qQSvMgo2Ah3+Yr!r*5TNhb|pD6uR|4T<<%0 zkC#a4@a0|Z-TUsld-tp~O({u|0^r+jw}Lp1W&JD8!sm24QJ&`oL{UWF)+G%FgM$BX zI7mDI5+Q)|csvS}-E21LkqO%EHtlvheMlw4sud`Q0!ZNR_xtqDB=Php4rANAk%C%lWfD`kbc;YL$AET z);+*xtJRW?YwLn;7>!0ll-;opYCO-QjQxnQZCg}8y$~Q1u4+D?%k_P55DxTuJ+ToC zvU|3D--Bn_awb57%@H?M=q8%-6)+2LOi-)U3bM^OQBZ!O>iMcCY@+;> ZfnODxmh|&=YQg{j002ovPDHLkV1hj}*7yJb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/192.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/192.png new file mode 100644 index 0000000000000000000000000000000000000000..70c9718bca3fe0eae57c3eaa370695984876a8a3 GIT binary patch literal 485 zcmV4qH5MAiU&ndn1($bbvX=!OGUW%ac1Brr|C<-RQ2#SaYMa6@ckdqgW{=@0KflW7& z(!x(4s<*oQ|R@2^m(CZFc_rlaU6?3 zfFzOt#{GUT(EqhsjULVw*|tr)-7X2zWLOgg+Mt0Xu=o3YdSw->)hZz{kxBrVhp4+! zsn9*E=yW#qO2~xqfTrMe!A_{_l7K?>6 zu-$IcXf&erdM)c_v!UT|DE^`VSst0;otg6aJeA93dg4890Zfz0MA$sfqc8SBP@zzu zX0!R*102@tb;@zz)tRCjMzvZMWsnawjYfm6*$y8hfC{LW1Yp8dO{Y`2zBgtfxA9S65sE%8MYPX-Bzz~(rPI6>9-r6SjLWskDVnUDmiDSHE0(X?W*NYBiQK4b?e zxkg<=7Fs?^0qehm1cN#2mSsuJXs|irri!GArhE;|!V4!Tl}ahurk^OtK2iOA^%FLc beagTOi}Q-=Z~dMM00000NkvXXu0mjfOOoAU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/193.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/193.png new file mode 100644 index 0000000000000000000000000000000000000000..cd70e6e2e7b202ec0aaf8edbc6dac56ec9d018a5 GIT binary patch literal 490 zcmV1;37akxF1<} zI-SOyxTw`?CnXZ>k6|4=;5y*G-|uS)Z{pxa*2!ezf3u~k11ixf)#md#w%aYb-7aRc znKrOoE@LnlV7XlCx>~K!>-98W9gyWg6kbIs8jT{AO5suVyag(aMk7^gx7+xT93G0r zVkj1izdhi`TrP(vId~Z{xE5qG8Fh9vXX>U+;!nM(Y0^ES@;ryL?RKe?dGY2@DsJq g*FIqv;ipXe0Ltf%oURy+p8x;=07*qoM6N<$f`ED5V*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/194.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/194.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4c1643636372c60504dac7209e80a2244773ff GIT binary patch literal 491 zcmVk-|u~>R;zeEGpN_=KKpvT zR)2ydNh>JDrY}@FWT@WgQNO-kB{`6)+Q}GTUS_!D_WatJT7I zJk|yl3I%k#UCd@PUFY*T+U>Ubs{*pTn`3+nLZJ}i@i;!@pSQqF{eEAwH5v`Ph#Cfk z!(rrdx!)e}Fr7~0Qv%=25jKKkGO5ZapK7w%EG|wA?qp8_s-Su$U?yJGU@*|@`w}7s zR4NrbN>)0P>`H?3`MmnFi3fv3B4#TVi|RyGujdA(Qc3qL%bf`&U`@dr;L4^&A`#q5 zR`ww{NZvKt5`wVuSqiiMJ4iIRvmT4Zv}QKg9dTEM*F;yo1!v)22%^!bPqyo)3W876 hK41HUT?C&p@dI#4jz|uiQ+WUY002ovPDHLkV1o2_*m?i} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/195.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/195.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd963560bab7ab742ca6ebeb33644dc1dde5390 GIT binary patch literal 492 zcmV}u3mXvvHa3ClQ>6>((x%8?d6_q` zm%Wpa;@$4e&b)auJ8P!XDTc#g0JN>wYelEi(e*Ds!_VPxfaiGuG#U*&oEx-St$=;E z+o?Z65+$Hh3cX%W{Z#>3Ud<`K1<_~}sZjOSbAo3{cUe$O!*6aI{ zAO_Uyb=}jMWLFYgDwWiiO*|ST5;0q)Qc)+Wf{CD7t?EC^a%VybSX1~0xUy;ScpUGd zfPDxLl7Ef1gfOgpmcp$64iXLStS6I6ctXGiyCd$Z@SEt$x8N*%3PB=~2*`H*R6+QO i+UIMZu#50hCVl{~J(2pw{<_!z00006oRB6>QiPBYNSa_11mB2P5ML5i1)D3%igH$qxkb9Vc@J z_Ga&ukmB6EJ3Djc%tKMZfctK@t0jC1_JYx9@o(wA*b= zCKGL7u~A5xj`fnK{A=dz3h1l%rqDbG+VRT#H;u) zC>o6-pU?mHfQQ*^7LO8md1`PiNT<`P>_%)<<9Qyg#7-X)PzBX10W#)wR)PzKg8H(FM}tHnW-FCS>O@s<7Y5~WS@$fZ*;_-Muw(F+~!cWvb gU;Bhzgr73;179YNcR*dzApigX07*qoM6N<$f}0lEPXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/197.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/197.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1bbe32761264c1a03372279fc3883c42464785 GIT binary patch literal 493 zcmVFE zd&s)e=`>!2pjNA$lt{2YhIKH&Rlt3}-`5hp1kZxWWa6LMQdI#nQ7W^|=W}egTXef! z%w{ufV7XkzU@*XPxzu&FTA|nLslO^9%k8b_JD`ETn_gVco{Lc7GyFRRrVtCsisgU;7aWDApuoTy%I1JuWCFV>-9ZI zCI-~&b$ki|ok?~h!KG43ec8m5K_U^eRVo#AqAHjOs@1CQS(ZB!O2C@JH^7xmi^t=5 z69w!;c#!;Sv?YXL<+BuK{dbUPaA!T4Ou`caHrO3;SB2k1SH1;j;avz4i9|rQ>!%9B jPt-nN`-EMDpEB_So*I%V!5w^500000NkvXXu0mjfqyyS{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/198.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/198.png new file mode 100644 index 0000000000000000000000000000000000000000..4a48c5efb2af3deb75f2cca0fec49d803bdc9c79 GIT binary patch literal 493 zcmVl*{G45()Olunq>e3b^ldI$FY);88Ff4!tv5sw!Y6N@cdmWP;Udg;uMD z@p!BaEEEdpcDtC(X1dPjbF|xS^;ZRCd65jCf>0=gcs!0*`R6S#Q@`KWY>h?(wXm?*cvXYJK(FsZ zh!{|*RB$6%=}fW<3C`#9>dPkX4HAi%tynCo6II=v8k9;U-LourCX|3R1#f^Wn-+;g za4A{Yhu|Q2*Jw)!!pdhU%=+&j(csQ{EEdz6*~0*M*QOT}YQAO^OtO{EnA- z1AEy!2`S#~-t5eqH?y;5I-O!T90ow!dc9V3IvrjA@-zG#4hMLi7eJ%Yz_&R?tJMnF zce|bX6C_ar8u$CX!tS%#EFOg*pU-2n+4w;=8CPF{HCT{@_GYt*cOh9U7JdR30RqB3 zWZmg>8V^EHtJRK5B-kIrIvC(8;D5j0*Al)2cY?`e;-A@4RRJ?mDznY!b8NR;bh};5 zW;1PIxm?CzFu-!T)OEF5q1WrFzbYWhlVtc5M59rpQYk#kp0~hEqtQsSwcBl6pBoK| z#bPKHi@!bKVJ?@$s|4Pd6Wj_inT#sC7aP?S3I$w546e?M5>N%zD*-d{s>b87Uf+iV zF`!z>XeyOiKksieMa;?W?Hh}kNYiaJphOa#?xRsUI*I}=L4n!-20l}(Gs<9HDT z>_d2v{A;u&gkj~g6lVQ*kZ5pcJ(*0x69P8a9dTEM-$Ylw1!v(+2oi}zK(_0r3c^p+ hK41HUU4)-9@dJWzm4^f$1VsgPp`tDX7lMdT6v3s7K1E-n4|3`^?FqS- zF6JipWHOmdk}#c4Z8#ieKy9^J37t+y?SH($=X5&R`Fs}k`@J<94Ym9q4u?#Ax7&#i z5Rm{yh+s0An1wqVjYj(Sw%6;~SGcwDcq~B#q605L`n-@pwOX}qx2t}u)shf>#21T& zt=H?U00mYkl}c(MHJeTK2ZMoCDi!tf`MiBx+IG9Gd;1wP(Pp!m zYB)it-|zo8AYmLZi1Ko|lp91KzK5GAyxne9FBA%LCE7-F#3$Xq11p5Aqi?CCDV zH;}r68$(R(r(hx>mdoYL{xc4)pQt}yf5IuQpECFc#iNodTO3QE00000NkvXXu0mjf Da(vC_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/20.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/20.png new file mode 100644 index 0000000000000000000000000000000000000000..d947b5faa16c4e9873de808974c968a6ce82105f GIT binary patch literal 392 zcmV;30eAk1P)Zt~5JjDAk}IX#E@j%ZNE8%E6i^_jK%$^Q6clt+ND(D%E|FX8Ih=i?46(h5QhaRB zdj9z5E@kjGE)8DK_U>&I@0MIA{}v8#bIJNB(4HHpcR$v m-V+7k6V>OdPuNBHl))F$AeidpTwiwp00004qH5MAiU&ndn1($Yd{X(_an`@#Mv$|8P2QV3$p# z^zgEq*_nB7W@puGHlrj-GJtKf*$4)MfvkV|DSVE{Bb`pC47%MeeO)Q)_xl<9e!mxg z07)bPjEBQPp!d~km7XpY)$4WIZnq{#lVLRqv_S(&VDI&M^v)`l%cUW(kx2m9hp4+; zF4H5cXt&#EB?9P=LLCUO72tm~8c7MCtl*y4G)>K!E>#qO2~xqfSS)C_+tF}1r1^X< z4QwwOYx#Uau*RWAPUS$l|)LG|h1wDwRs~%#64NFij>CVT+=OzF7@|Uiln* z(*qpVYBlmak8Um$-7zYaiYSA8s0o6AZrP4t_(28KO9C+As;1MaDEZ**2@P)PduF5x16CqcR$D9<*lxGz_xqU7 z=hDDht%lKPgw<*#YZOHo3C9wbI=EV`iZ7dZGDu9sYV~?uoXG0)TA|Ts$UkMdGa(76DR~22*|cmni)Sr?eMkt<807*qoM6N<$f?agregFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/202.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/202.png new file mode 100644 index 0000000000000000000000000000000000000000..a931cd43231524ffd215f5e9ea61a8291679e388 GIT binary patch literal 487 zcmVQ9hF31~bXj|#gl6bg8}G$@ry*zI;M$R^|J6j*}=Noa4k+jtQbtJTUS@DU;){6p5A z%jNJODjJQ(S&0PuV^{|Rdv4TGNL zoO{;;9u|v5B$G*8#|&--`FviLeVPkZQ!bZrBX$PUk1D8M37CmjHJwgX$*Zt4pxJEV zM+oRlvU>@xR4VGrCY}uviI}ZctEm%J!NgFn*Y%%e`7@yetSNc}T-mf#Dupjmz&=C= z$z7u@Aqp#>r7-KigG7Tr>zPajfe^64{)qc3ToZly7Mz7|AxNjwA=$p4Du_N&`+V&a d_7Q!`#4lOlk3t=D4Nd?6002ovPDHLkV1ivx&N%=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/203.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/203.png new file mode 100644 index 0000000000000000000000000000000000000000..54458405f6af1811b184b0b590ad040f2d3ac4a1 GIT binary patch literal 489 zcmV)&1UngM1uV>tb+lr0{)LiBQ4=Y6x_)=pU=ZHTdFD`6Qz=EwOV1n-(xTs zV7Xjs1MBrV#^W(In~ko%?_)R|s=q2=mQ*UGO-m+|$mjET6h__xnWodJvh{jB{FqA( z`jnOXum?OWm&-_})3`|(+zN`tqAGh6N2;k-tMJW*2Gfr!s9qD0iB~n7%~Z*=)Xjia ztA%d~pfi)b%f42tsV|#&Hb_iFHqZ0aiK<`{Xfzu7&$8T^&;+b0egj& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/204.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/204.png new file mode 100644 index 0000000000000000000000000000000000000000..bbca529806ec7362e527a2e64ccf11ada33e876d GIT binary patch literal 485 zcmV6oRB6>QiX&-s-Q&>d?Q+jFBE*Bf+Av}s94yDm5oJ;+l72cejt$Vn9Mn_ z%ib#?#ksq8cIM2P*;zB2&15thg#g=Tvmv_OF4w>O3_i!>QGy@{q1kN8k2#ZeyB)Ic z_j~#SARz&ahr@xe`+PnxpGr_H7G=BLx*(ejt5aYN79fGW)oRI?k}Q`?m%vAe0Pqh{ zcQ%`q4<)GA>n9}w=#N1i2=Eo)e=r!Zgm1;WVmh6=Gg~SZAQPk_+hVbh-EJqnUQg!p zIU881RAe|D%4)UZx?ZoP-|y3(3cwPN$Jw-4EGC&uMjkE!IvshvGz@yu zbL?FYa9Ai5B#}tS^|_H-MJ|`4vO9H#no_AGH)=;P{GbBrNq|has>x(RB`?a3fJURi zJ)A*yufgSVnZ9V^$smCU*{anlouKON%1EtN<3GysXMzN%DS87~(X?bTDUX^JeTWW{ zyGC0=6jnY;LDqi<2?l@G)9Ey8MuYtk_f@zi`tmI>3(rcBN~J=weLpIQK2iI8?GyG9 beagTu?h%h2`*A;p00000NkvXXu0mjfmXg-F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/205.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/205.png new file mode 100644 index 0000000000000000000000000000000000000000..9f886abf314ce99f10f10fc8f1a52a3428cf0c06 GIT binary patch literal 488 zcmVP)XLW*;D@9fN(Gqba1Hk-+4GztN>^?FToyIrn-`5Al;hl3oC#}Jy$rhJ)GX}8-U z`);?RKL8REz_{P<3A@kd^YW$y#bQx5n~e*y$*?*F)?fh=*jufZd??9sxpWD9ga`ot z5Ors>S$S20dcFRuL;(FUr~?7M0{jmK1D5cqcveiOQ+H-dr2=GvRAgH$7P8%LrPu4p zd_HFbE0u~2heKJdR$PN1kbb{Ue<}b=JRWD$VzHQHG8wr$H@pR88jr`!*6DQQTa_T_ zU03W~4{%s06eN*I$kmyVYeg=Xqp}+%gPKyQB!M|$F#Mnb>Pdi1xT?uyLM4wEh5?O6 zgL^oG>_vmiP)wfWL<{kSf)7+sL@X2)3mdVru}I){A%BoIMVgd>e8-BW~%g^w0I-L*%K?to@3qR%polYlY zKO7F~Pmn|jXgnT|3cD{93V0KOQmKU9Zs&q*GOkX6HCT{@_IA6CPa#>YRxW{$5CP#I zvhG|ihgTtJG#Y0m66}v*9Sral@P9ZQY6;(hXTfYXb7!_xRlrP?%52N!68rrg{eB;d z#X=ictyVD_jj&#?b=_<>7z_sLuL{VLNF=mr@pv5BY!>&IMsIvp?%x-uH{ zAm`k>9`LYOEFzgq;yPw{cUe$CuRV9zY&VXjK zi7z3bGs*5GxKgR8FPnHaNF-vmTCJu|R0R`5y2yL61QB#P9ekThc%B!r z9}WlgCrF|MG#-yfh257*CA(gKMsI-Bp05hV3h2Rtm7%SflwxJek?3W~*|Dti=1s;O41@Xdt=(~l~sUJ00qS2df>RLT9d(SUZl zjZX=nGs&K0U#r#BmrXnyBoZ-OqtQ?&s)9+N*=*`R%W`Kz30PD72Dq|mnM?++l9hdk z4^nuIwuCsWe3rtj{|*uj?yTo>IRrw$2D>BfstB9t%D3PwybD1#n~lhJ{Zv8xiQ4CD fpRkMgQzm`^9Y>YjaS)GQ00000NkvXXu0mjfvKHBi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/208.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/208.png new file mode 100644 index 0000000000000000000000000000000000000000..001015dd059ee2d9abf1a130b22f01b37d40c333 GIT binary patch literal 481 zcmV<70UrK|P){@SvnwHo z+L`U??yBzTF|*kWqtPe=+BTbwqTB82`j?;K=XgBgbUH=QY&KCUmC$atBli7%ul@v+ zXaX7!hl9fI3xxs_i3G~!GPc{T3$kQfodRpHU=rF}trjww43^8KBk&PPK=_BOJD1Dh z@zS7Pub-7jus?=%Fu+&9|G{8@Ckg(#GPsv@I-R;RTdFD`6Qz=Eu~=ZY+o9L%VLqR0 z11psZhQlFNtCg61(*RRz^+0y6QcCX#nJ)N2C zL4w0DR9`mnY>=3UY}IO2ov7;P+Mrge=|9WzXF?OOruYqTWz$lr6kdgueTWZ|yGC0= z99BL{A?v?`M1w!;oIuvh2KyuKt8h*9@P)SO_{K*ezEJRi3W|t@q8AGrv9hr=zmadrKb*`N*k$hx zA;r17J9lQznb}!0o6Rs9jY6PpyR8`SIdUnLUkk6|4Q@D=bp7z}VP!S5FaH?mHrQ}@r7stU+NsbpI$7T9jL==FM- z&*$2}N~MC~aER4vrE3rb==b~TuL_vuK^WeIiA_tV(|D9KZ-GqX@mSe9oesXusRn(? z%Dw9Wf9CUfJWJr!nZdOno6V{+%BPxAsf56sXmC6pR~1yR3CP5&noK5oeXpX10gXmO z_jG2mPYEuU%j(M}{u(4EB3rduRVS+YxHPEMYIrI7XCL88H*bxz=|u(QGbi2EvB6Mgv>oP`%jkW3~+vVA{Q5PhQd`PwJ! cBl?tyA14Nmtt;p92><{907*qoM6N<$f+lm_<^TWy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/21.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/21.png new file mode 100644 index 0000000000000000000000000000000000000000..cf92432db5d965b5908b4e1bcdf2e0cbb4474e08 GIT binary patch literal 392 zcmV;30eAk1P)Zt~5JjDAk}IW4mojZyBnk>73Mdd%AW_gD3JN+Zq!lG?F0r@Rb2$4(8e)4BrTEw$ z#@~Ow$ENRl+qSI-V$(DUs;ZLluROzN+cvxJyN9M}?Aw#EX_|WRWmzO2Kq3SL*L4-> zoQ)sPMu=GJCOwStP@n+?B*amWWtqhE02dws2oq58`C`O_utb1AhB`uttl1Prk$u0Z z$n)I$r=^MlWe*9)ag-A90g`#1@5~kjumEa>%q^koI$M^d9frY+QCeNsKOTIUM|-)! znv*SxLN>*5EJ+Y2Ng}twcy)3)Pzczd%#djk~VsO#H1$RL$$j$m#z!5`nPSk_(H)4Dkvfrii(AeSlQSF?q{S;o1ZzEGqB6v zD+4F-dO`l|x6JV}N($;75*G8sI}p0~hElgUK0b-P`Bh!2Ba z{Zb1M5002ovPDHLkV1kv4;XnWY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/211.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/211.png new file mode 100644 index 0000000000000000000000000000000000000000..88d7b37ef9f00b46a7ad2ce21b8e66a7e08924b9 GIT binary patch literal 491 zcmVwbrWSz}s!9QE7Dj*Z3l5M$MVz=9& z-|u6wSZD*Q)hb4#5!UOquAb*%Fc_%6DqxmJVR#iLHZ7CM;7QKB1u{)06J_gmyZAAe z8uTeE_dyT%vrs7DSpsij2DgG-E~m=g#gS^tP)=@2>+0E zr&1~0o*PuF)uR##_Q$Xe2KWm2-|O{oC&AAb2G_EV$76S9OH~DAqExcYW;1Ly8+1Ay zOs7+AV5w9>zu(7VvCwt7T%z0Us=q2=mJf4^9|4<|OeXOud)@+>hQpz|3WWl$&Wr{}qfu2s^_qZ8ysFV?q}TT?i5O6; z)$k-tbY`*}2`(0k>dPh`4H6TPtz0gv6IH!l8dNG3{byPJOlShu6utqjY+5W9!@aPw z58**_*Jw)!!^&qVWc_!LXz*v96Uds`V1LAY6|RZCd<)LPqa=vO;{n;epDGAHQTu%D e6ZR2)%ET`lDUSWoLY^=H0000cuaI-R;ZTdFc(CQ@a##bSZ&c8gxG zhxvT24Xjiu7!HS6tyU_7AV9z0S9@i^DDUPR-vTx*olfIJ&YS`>jmKln*6DQcBYHZ0 zisae#fS37vUN2tE8D0h1Y*v|(KG~E?B?O|UO*|e~7G$phn2DpBOeQ+MFEOG+qtU>l z^nk_;_9psrxvaKq;>jX05VKXQRW%~3=PQF+t)~Ah%ijqNz?z~Hpk&h$i3IMY1ok1i zNN$X_geWY1mcp$6E)o^~u5$x#Bs&}Iuei^`HPNSU!CiQe0Lf%BMBBGh2GJ*KpRaww dKB7;V_yr4Gk_$aUrr-bo002ovPDHLkV1gTM+2{ZO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/214.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/214.png new file mode 100644 index 0000000000000000000000000000000000000000..74195143753aa642b25894b97037fc05d93a8240 GIT binary patch literal 488 zcmVP)tB9`pVR4tAP7QewOS|^i|BMZA^YKQ zP=A6XN+0E zXR}${UKlhQjb9}a?2lm`4Dc23e>fcCPJ$mU4X$OK&1UY*mZ}PviBg$uxm;qu-=p8} zW3gCh1FO|4Mxznd>$R?%%?5+PK>bw#SzgUKz6ESrCX>ON?0E~!G?`2^TesWAqo`rf zy(r?|^?-+kLIEEV_+-xTEXd_@s_aEh-$*vn+omlz=rwZ-6VCmP{t`E(+L( z=peakv?WAg<+BuK{dbUP@MoP97zhCy?2ovw!Zp#CZ^2pk6oOPL6_V}yse^9g?q%RDsC=0000C&di7vvvK<_zqz z_ew}{?(ChNJ#%Ju)+`naOeT{E=-Y0$ihjSZ_OCd@&*^kR7={tF+ijFeC3L&pi2ran zXgom@C7|ky1Q-s78m|h-@@g*eEnw5K*(}~<&0Aom>2#{udc7Wg#Lq(? zV!3ub;AXK{)Qv}TfhR#epI2qi;-i{MrGh~Gj7cVws)Fj3fSGtzv)N3q?@NMspw(*W zn!zM{k#)6N)mS$1Y>-IAZ1s9wgQyDT3XMiX|5=tl6H36E;x|CcrlnFTyh~R0AwEd% z8f^)2Soti4S^pg*I{aDZ1cpMu2KyuKt8h*9ajGExMD6pnPuNHN aDHFd+P?f!Pn9R-q0000KN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/216.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/216.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7ce536fc3ce84fa3289c55fdbb7a8cf4975be9 GIT binary patch literal 483 zcmV<90UZ8`P)4qH5MAiU&ndn1($Yd{u@qX09*Ph@5hI9SBw!L$P=a_+R6KYIIeGEuKb+1R*mM&q zJ-lpoc4pq2*;%z%END8NrU2V+w-fljFY8}^3ZLWgNT<^&1;=sd^GeZhI852&I2L~Z zNhAS`hr>aj|LgTSJzXklHk-8H?~@=+hBZ;34H`%SyX(62#wyn9bwXewl>jggQFpak zrAJoL@AuD21kfLaIuKwgzyW;GWm{e4d=?QbhrnAQfz@)rz7hq96!pxm-#E zJDm6Y!UyoVoDK)oaY6Rs)@Ls9b1Ob8eZ2J#PQ zBzxfCcDpUUXyVx*AraWR-L5!6)%UfcUau#6lx5C@BtT8s8^DUDS(ZgF%!)o_2PwHm zT|yRGK1u=Wzk>vWIqT(eS!zau%@H?MBuzBsYhV^~oS;-HrDU6aq9FT3_4CzF*hKaz Z13!26jWJ82rf~oO002ovPDHLkV1f>`&_w_M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/217.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/217.png new file mode 100644 index 0000000000000000000000000000000000000000..9868b8663dd4c17a03d97a7caa6a58bcc45a91aa GIT binary patch literal 489 zcmV6V&Y9U+Gn>sY8jS*AY_r)Yy4|j>f8`ne9FIqMo)N~xTx3bXC)Hsk6|4=;5y*|`#~O|e+Sjl`dYoOyIX_eww|Ue#nWQ75mW!~=~+ z1K&cxWRl&>;c~gGxoqOuAd!e_)oN9f=n5u+TCJwvEX$nOB@zjIiUal` zJV^dE+7iOB_E`#5{~aU-+*wbhQt*U;4R%M|b>TPBwQs>$_!5F-G8wS#=Bb156SdFR fK4BN(r%e0+w(5}M*ZA|-00000NkvXXu0mjfq~_($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/218.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/218.png new file mode 100644 index 0000000000000000000000000000000000000000..3baf23f6d151ae9d226a44e6f9930cd0479f5205 GIT binary patch literal 487 zcmV6oRB6>QiX&-s-Q&>d?PA|FBE*Bf+Av}s94yDm5qhP?Ls~zKM=@wOy(Te zo4r>;igWkw?97=nv$JM8oyu@H3;?$EdQEgX9j<@*8GH_hgLs}7K%>!+Z*wNCRx4oN z?RNABKtci-_xn9z|FhYwd?-OapO?*M;|JMfSbYW7U;z@?o6V+tD#>E8@DsQQ5CHBW z>Q1NA@~#B6TJ5An0R1tj0|BlA?EC#bOZZY86_d%tKeMG$0Wv`1Pe?RI50 zo3VlAa#;q0fh?CxuB+8bdc7X~sQ@g|Xp~KhL?V((rR3ql@D`A1G#W8myWN)8OT(a8 zEGETb@wW#!%;j=CxIQ;>tH@+BRCcFiP*W%r$^XTCH-AvfP;<0cr~009G_D9*@hTWvWJL}10k~O2j?uff8{3g2cEienuN{~n-0wfWLg!3J3D*Mnb}!0o6Rs9jRIh7v)L%R-L9^G1ho0tAG+ z$+|O{3|@txUay~(NU%SKb?|`efZv0`Kuh=%JPW4NslR7SRR>g}RjMr(3+#3~^m;wa z=W}gfrBcCgIK*nT(sjLFqu=jqzB(XFEEdzIMWa!q(`npa8odQ7jmKkE>vTGJx-xnw z9*?6`D*g6=oB4cRH?AWFw}NaotIl4;KHU_HMchdILCBd$7j&-#RN_@lCKGk?C`vrg zXf*IC1WYE`og6Ng%bLq3o(&R-s8+33HHofZBB<4B`pvT3nNR}O6utqjY+53bz)2ji z58*-buhEtehPBU9sQT|9G2qU6DwTpK1Z=Q7;;sw7iLQMM&ceG8B$LU2Z8uLHgrBH= gzV->b2tQ@w2Z|k(aBCn}%K!iX07*qoM6N<$f)4=M*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/22.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/22.png new file mode 100644 index 0000000000000000000000000000000000000000..3222be528ec1ad109fe885ad11c86355495ec39e GIT binary patch literal 388 zcmV-~0ek+5P)Zt~5JjDAl4EVRW!khz6ck7lP#~y4qM$((6m(Qb5hZOdvA4)MoPDDVvAu~>d~DCo zeE<17HhtgQwrxESo2E%nRh6uNY&rimtY3jw7Ws!UUi4YK6*Hxf< z3SXa%5OLNby^QrxpaBIW#8HrCnZ)!07ajo!6HxK?V#I^6MSwqsK0=9{DT<=VUT!M# zJokRnRz-obhXms|N(=Y^$vn?@W{Uz?0KG!yw$OE*Ez8ml!{Ehet*+}I4?fJJz20EW z$reQ+MR6QU62wW8$iKm=iqsn+pg@@+`}`(keK!wB5iMyhE#3{1O5`?_utycdoGEhs z5(10}4b(j?paSV?qHE+~;%`HuYG{Gm{~aU(;jF7C5b21!Dh?CFA#oMp0j;QPH%}CV iPgI|;K4BN(QwCp8;G40Zq|w~~0000Y^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/220.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/220.png new file mode 100644 index 0000000000000000000000000000000000000000..d555e1b4a284e98d7c70b44ec88fd08ecb11a0a6 GIT binary patch literal 483 zcmV<90UZ8`P)Q69< zCZO?fI4JCYKA%TC9!IHE!fv+$R?%%?5+PK>bw#vpfsKhcK~enM?*Rvga+3X)>88TesWAm-sL!kw~Ci zF8}s`hlN4`F$ui6Ft`)sayeB-`BdY19&W`>A10s*s@DW$;#EzjQ@y@-VPZhD+0=hJ zGueX#S1J|tWfRW^iHXQotJTzrs=luc>h-$rS(ZB!nt(M$Z-6VCmP{t`Dy-~7bdZ8; zv?WAg<+BvB{yRuCxUZNTIsr8uhH-K)n65mOa!%BP4_Izoe3piP2n5h%BIERaeRsb z_8~k-{x#YX!m#pL3bXz@NHn;!&I$B{fDLv>+*RQ>(Uot(S@;ryL?RK8?fR*L@DsJq g*FIqv;ipXe0MgKq@^qt_od5s;07*qoM6N<$f{P;LmH+?% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/222.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/222.png new file mode 100644 index 0000000000000000000000000000000000000000..4d323ed70524f55085051616b3c5064efc0df565 GIT binary patch literal 491 zcmV@28~9;XWwi# z>Q9hF325Byb_)BSN~I7Ag^DYlz6ESrJRZk~{PPx=X)qXQwq~=57g58Y za5#*7KL6VT9;VZ2d`jS(Il)$tOeR$sAm&4VW!Gr8cKowN41kA*%8V-kgeP2Sv zfNHghC&@}@lHEvfp-@m?Ht}eXNW^TVQc0bt>h;o~TrTULWw|q<1gt4|16T@fPKH; zt3N>!C7|(eI4JBso6RB`jiOK}V7uM=K{gpzUx77Pkc9SDtA%7TiRE(XCvXuUAlyUN zold85dtp$o*H20$*dN0>7~m@4|6nk{odiEz8eGddolgBTTdFExCQ4jOSbB1R@CX-QRFJhybVzG#;h{3&-LjtOxdL>{cUe#nW(d+w? zAOa%VybSX1~0xUy;ScpUGd zfPDxLl7Ef1gfOgpmcp$64iXLStaAcAAz*{u5qDMiO?2g3a27s=AdyG}WV?Q{adI|(V??cLn$dv9iE&15pcU@!=PvE_29Xt&$C{*`C=*zI=M@Am=J>vepYV>Fx1 zKzy^=Xg)y_C17y7-74&RCX>OF5ae<>tX3<3lNICYJFo!@k}%$AH1H-Q^ZDEta1kIN z+@GvFl}h1J2&&cUL5T$WV^{|_xDNQ;>-DsRPr2zA1ou3$Wlh5bjNt`((pbNTJ0xI#SMx&7)-@7Dn zL#Bfy6~Im+PB~=TnRxu9uL@d^VC83 jirVXIuds{oRVID_mpi^00000NkvXXu0mjfC(q?Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/225.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/225.png new file mode 100644 index 0000000000000000000000000000000000000000..017fb92619ccc5e0149a341aa50207c915e509b5 GIT binary patch literal 485 zcmV*UWf38YE*3T-1Z*r4*i<2;N*B_lNRz@MkS_mla?gd? z%&vqKXJ_`#opaB9j5D9lF_}zapl!3+CXzE z=ks|y2tljWI!lpYeH`Y&3$_COkH=$8;Ztxcn9XLOvsr{fzyjMNZmWojXv;U?EW8PU>$)-7wx23UK2h_0%@ekf be9FWRB9xbR|J6fH00000NkvXXu0mjf1g_R) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/226.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/226.png new file mode 100644 index 0000000000000000000000000000000000000000..02a42b1888e05bfa74a19c00e4a54bb76f5918b1 GIT binary patch literal 489 zcmV-AqH66}v*9o*nM;P+rK&=NickAmrR>i*eM)d7`gm1>K{0^98ty3EKc?wh-kH@Ok>2&Zdac+8( zmG7h8jzR;%eZ%kpPJ30PC~1h}$k$z&4OQUd!B z9VB;*wuC6GeU?Jie+P*Hf7a9KG_FLQ4faRecj21o+qd8>+z3G`l?vJR^VC7~irVXI fudt8kRVID_Vpx;<_n0ap00000NkvXXu0mjfFqG=^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/227.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/227.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3b57ac9f9235c6d6cf22615e50cab4a11bb8c3 GIT binary patch literal 481 zcmV<70UrK|P)<*6#PIB6cHhc9v0V#5U{aG;8KN@=|Z{`X;KE#E)`1Oee5vhH%Z zj3*)RegC3Fg8lJW2LoIM{GU#zTEds$Ua(v)?U^Z66)+Q}GTUae!QpVgcs#~>z19Y{ zS}g=YfZcAVYZ!)@OeX5D3doYpX0>UVOa`S=2``e7x4=yE`CPLNheP~`ok4H1a&LRU z!&kGq8jS`*u``%{R6+Ghz)ZZV#bTjKKE;Uv-ELR+bSBxO z?3>M|`m%`^gG3@`Yq#6#L{;!^(CKvapJll-p#-cceFI$Cw0u5~SINpgqzB1fqbVT` zBcG)(>%W6UgFEZRViB00000NkvXXu0mjf{s`J= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/228.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/228.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbb9d7ec770ed22e4d11085fab93c55ce792745 GIT binary patch literal 492 zcmVC>bPq|1Mp z%p2It-bqODTyJ*vy*IP7YPnp}bUIA{vF&y%7z_ro{*|Zjb2uC*ilPKMoeq7eQ|k44 ziTG}}lY9UqLV)0YzZdBLl}d$Pn83De3W6X$q{Xnt4s<{RB#3vrU3zDd^?Dr(m`D%+ z<|gVcl}hx?1g%!M60Aba^E?W}kcPt{ ztyU{(V58BX$z(#C%|=$=_h~d5NxnD$i)C5Tv`i*L#bS|OSrNAYrP*vIYW;qnzB!IV z*=&~T_4;oQuvx8EW#e9*&;z4fE{n6vGbL_nwHo;xe`6Bl!3Eq40hDl6^Z8tyd~gyD zwA*dEJy((pvL}u^jw88f;?W?12x`q{Qv3;B5tB-Ujwsn!vy(!K4II;69?%h is-LfZ!Y0yB8TbKjQj~pfE2R?v00004qH5KY@(sHcFRK~#|Vfr2q4LPR7`MT3W2f>7|{p@sBRdhD(A)=3 zx`~t?UUoA(^XAR$tPzGG1woJlZ2SFQFq_R}{mak5=X5$znx;97$7A|3u4y`*=In>V zLHq%b2my@8<58gYmSxd16SUiHisLv7QpvDp3Y0+sB(P5=6Z&A1?RJ|b(2*km^h4C$ zXf)`F35LVrMTr3VW1tQM=nC-f`@WQLX52GYt5tTUN)-jj1gXfj*=#6D5^`Oa*6X!2 z(6()w&*!w;?PQIjh&;~|e^CIIa=9!`E0s!Auh;2?GvXGIX|Y&HHpg-3o9zfPO_RFa z?r#rp*lM-p;MTaJJ4UnF6lD(_1T~#bha$GW@jv{a0_ueTnQ&FhryZ!C)Z&C`+FSAwW&V8^DUDRVo#F<*evKagefW zR3#LlIv&8 bK4stsu11(I58qgR00000NkvXXu0mjfJ_+J_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/23.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/23.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc004ab1ef9060e87da32e9929e2c13386b5b79 GIT binary patch literal 388 zcmV-~0ek+5P)Zt~5JjC$vd7vkW!khz6ck7lP#~y4qM$((6m(QbD@xkEL~fCDIQvE#VtW&%_-lI@ z|M~NGZ2G>pZQFVvHcgYDsw!Fk$}{|I+h+HD_s}$ry}THkrl}WSmPPUbBtk%NT~~qb zx%mESgov|V(qgQK0u3l2A&!D9%Os`+TzCW^OhCoQ*@y>WivWKNeS{J@b18}<`*v56 z=ehSyTNMS$9ukb>C@tUvB=bB!m@Num0rU!)+d|iMwk%6K41*V=wYsiPS};T_X<@e;X22Lkm>@caR8#v#y>%q$BRCI7|$O#8rR?w4$=zJW&un iQGLGpgk6MB8GHj2M4t#XaPr;&0000})Kb*`N z*k$hxA;r17cXnpZnb}!0o6Rs9jY6PpyBHH6SdFR fK4Blxr%e0+UQCn!z#HLz00000NkvXXu0mjfU(w&4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/231.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/231.png new file mode 100644 index 0000000000000000000000000000000000000000..9d296ed6b61d634376886e894091c074c3010c41 GIT binary patch literal 481 zcmV<70UrK|P)oab{ubN|mdmBxGo`8mW};MP+iW&C91a+d$5^k| z+Q3$;g&+v9+wF7>!w{3nMB`NfSzaW=mw-(x7K?Zlo43GB^Z8t}4TnSgh@XevWuvO-jRr#TGbWqOstT%C0%qb>Efx#CzE26_fo`{}HiJp_ zD0Z{i)L1t0VvtD0Z0&YigQyDL4LY5U{Mo0iMv@FrQ=hx8!XYcwUK zVdS$EX8m`N=x}G96Br8t8|;p_tHL(Xm2bdV_z;48KA({7#;Jnz6E)A*JYg5gn*4j3R8uUDs4U?MT*qY9Z-o@sWzX_vDs|U z?RGJn&9s5#av6ic0L$f4SI_g%>-98W9gyW!6g~xPS~8i$o4oTBs5BalRIS}^<6Gj~ z6pcnvEEa!zz@OP{7Vna9Z%*(aNT<{4?DEX0n?j)gPvXoW0bS6&5>SapH6D-k_&y|w z8|w8sZqJP-lk7?2rBX?A*~FtkA`#Upm5L_O)!l_bwOZA0mgUZb60oN532 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/233.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/233.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d0d003240257711c44cf8be28730bf471c4a1a GIT binary patch literal 484 zcmV5>lxYs?{od-;aV!GOm#VV=y2I?frfqxm*t0?KVnaBSt{jhpf9$ zDB#JtMyJ!cD3M@)9M-`ATLJ%F*Tu60e+ljd%jGgUGo`8mW};MP+iW%nf&k<380+;~ z8`x|%F`Z7a+wFAqJP(t}MEz9(SzaW=S-_^{^Lf0=p0~hE^Z8t}4TnQ~i=9E~bQ<+~ z{kI1^ESJl87l&Kt3U`8Hv8c)(#6~r>S`D7q=|cjlpn4@>CSKKIvC!-L6ek9ByItMW znPiW$Z!{X}%O+k75{a0t)oQ5|Rl&JIyWQ4*mSxX`60oM^4RB@CGMNnCBrE%n9Hi(P zO$kXD`7DK5{~aV6>{;gohC;vw+aqqPh?;22H{dLM2thWRjmftCR6+8In&)etu#MzX aCVl{_I+!#{YQ(ev0000@P)_(H)4DkvgC6uns3h!C)`NMWjwGHpH~W$OIH$((^* z_TCUuoV$BxXXc!loi+3M9OLmg1ll&6jiT4<>H3$S;pccf;&eKN&}y|%EEdt}bVBz1 zey{!nlV}1O4~K)o?(_LPVzC%Xr4qK=tqZbbT%7`IuwW9}+wC^e=`>cWl_T&GNtKMdfd9kc5N{IvC3qIhW;1tYOH~DAqExaimrLw+JM{Z~ zEEWrGV6|GsXf(olz1B4d0t^NN^;ZSV5|77S(=wS1-i493K&HuLqHNu67vExM(1)zt zyB_ecP$(dgNZ`?&;YpCo3Vvvx)ml zqs~nBBKAt9qP}e6uR&rWvejxeb)u?=D}#EyuKz5{p9xLCnxZ$rl}$?~lem=<*oWvK zxofl~L}BH#6tez1NHqAf&I!B`b~e}_abJaNqA%Zqvv4N~QmIr(w(qA3qEFO5U;Bi8 cM4vM81L^*hx7Bq51ONa407*qoM6N<$g6|*X-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/235.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/235.png new file mode 100644 index 0000000000000000000000000000000000000000..7e10fda5a855aac8f7ced943924eff2df30dc6a4 GIT binary patch literal 478 zcmV<40U`d0P)HdtyaTuI84}2r<3{< zBvAqy&*!tk>?@TDGMNnO^*X{Zv_U2rSF6An3`j!zU@$a^;3mygQ_1d19QdI#nQ7W_Tb~{8-gvn%r?RKjT zY_(dL&*wNC4!QmsQ!5I8sfc(Lf+}2Gfr!s9p(}iC48+tyIaEI5D8t>*=1(Bzu;9 zv)NQ%Ht}kZNW^UIc3YjO3f>($osRyqEO#c9fHkFWfGeBk`##f{A1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/236.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/236.png new file mode 100644 index 0000000000000000000000000000000000000000..c9953994fc2f19a316d912761f9830fab8f0b8f8 GIT binary patch literal 452 zcmV;#0XzPQP))9<6xKj%r3$oGSjUau!V{?DBS$Pt)a zEQ%uex<5I#+im&q>w3Me;CH{C&1ULPeH?iJG6k5C03`a`os(Lvrr^LEcciTfsBks~ zBOp)GXfzt~=|N!_s;XB{wpy+J6<8MxShVqYEH54u1c54m00mb?v=&({vWfoe4;R`&#Gs6AhM!dWXmW$X`e3xb_#gA_#o0000#Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/237.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/237.png new file mode 100644 index 0000000000000000000000000000000000000000..429352b4d426046d8e06b01ae0ccc090f3e400bb GIT binary patch literal 460 zcmV;-0W=5r{(t_N*>y>h$b3F8fW7s4t(Z(E`u;D@@i-ojayp$VaX1_b>)mdr@c(|J*=#1m;ZXMby$WOw2r^ZIUhkZ~*-z6{UT&R4Q6xX^TEx|| z1O)-J3kHLMJl{AC>~uQv=)Z#?Q1Yi2Su7SBPk$VBKr#owL?Dv=q2{E~Xejy1gMXB* z4(M>c1QVc6%4oG(^5lh@&8B>N@`t;U)oS(Uz@}itGN#k1+5=9t>`u;D@@i?E)a=BbeaXOuH>%-xo@c9 zWFKd_CYFs664@bGk2o8UEk+#_uc%#LyTVx%uQK=rAT5U`=&%bZ00000NkvXXu0mjf D@Yl%= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/239.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/239.png new file mode 100644 index 0000000000000000000000000000000000000000..1117adfcc62223e85cd802620b2f37702370971b GIT binary patch literal 450 zcmV;z0X_bSP)5QWqB!2)>!<1#x%kRSxaf=CE72;!!QCL1@_g&U!pyg;GbF8cso_c5mT8yuU& zxR~Vr%sF%B=X&e)TJk(^7-vOMs4W%?{onKR_?*vYsj8~ePN!32e>fb}AA>{*IK&a# zY&No5t*(1O?DzYbAkp8v2MK~e!5_}JBW+bch3hF8 z0eO-}zu%WH2MWVbRlPd0?RNXGz`9_-wxww*xdZvWuL>YQ!A%jZMOKTtqSj4YE!8*wHTfSjYOQN*q`0wOv9 ss}ZvS*nCt$`-$4~wI^J+_EX0G0PI1L&MWV-0RR9107*qoM6N<$f}JPNvj6}9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/24.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/24.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e0b0b51944c0b8b25819814904503e84a29312 GIT binary patch literal 387 zcmV-}0et?6P)NklBmh5JfkAZGWk*uClh41c4wyfFPhCL0||1fkR=C*#1QSqTjLQOfs;$uT8~$yF1L@ zxpUvF>HFTcZR>&9G);o4s$~5u&+xNto89-_L(??&(>&NTO}+TCERqi(5dwnix(am9 z#qWavBF=hAi?N;xG@yWlI0~{Xlb9B8;Sqo^0TtHV#DlO!fIo&lLW!KY6h)E!I#lF& z?tRl%MS-%11mieL3-|!ZJkNJ#ivm~xy+Y=;&~=?H%hC?R;KgXIuItN#*GFUD4tzWt zTNH&{isM+4AWo7*{tedmrz@9&Lcj%OhD?)KUvAf#Z<hskn>>_;1;0KIGnD)VllsNzZ002ovPDHLkV1k#!u>k-8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/240.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/240.png new file mode 100644 index 0000000000000000000000000000000000000000..a731eb427bed29fbf9b13d96b4ed249467130427 GIT binary patch literal 458 zcmV;*0X6=KP)510HiEJ&EC`AUYN4`P2o{1YLU0i*_dD_%`H&aS3vV*3 zq_~dz=FWY0?##I5aw*g4v<7P1?N%`u40QaD=lD6F&r(&D;&?ntnx;DPU6y67emESI z4-ioSiV(qKv5=1^C$rg1zik|iM)LmXWIms(AOhZj6(GGmI7O$^k>PMCU+!Ldy`BnD zM|{0r%Wk);3s9g#6h%5h%CbzpF9MUvMB44P)|<_yyk3O*{l4bo*asG|Mh6x#i5tXl z&}y|L&vUKe1flVG{Of>(aljhL(B zn~P)w>t=zmjnIX;Qvrgof_1U~IKV1dgd7v{A%?a?aQ5M?yhiOJnf36lb7apA=ifl+ z4z3R|v>$?ngc!$hZT~d~*H6@*uRY-q*H0Pz0IpVtWL2ts=Kufz07*qoM6N<$g8InO A^Z)<= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/241.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/241.png new file mode 100644 index 0000000000000000000000000000000000000000..b331dac8b8425de0ace752214962cc6005e6ae11 GIT binary patch literal 463 zcmV;=0WkiFP)A=WAP9;EGzTMz2f>37f>0E}V-9_azD6Hp>NjQ5 zO-c`cHak1}&p-d}y7hW3%jL2LV!Pc=F`Z6z{4dY(xm+$%mZjo&Jj!r5)RFn=bgIP< zhlAz=NR)sei6BW5d3$gY$Fa_BoX_X-!Tp^m6AEyom(I~iYvsZ#=suz*#ue-zLfUidjiRGH|@_QBcvx3Y=aMKbCBUFXOi zTdsNozB+O%6MgwU*ocXpPN&v?O+oXC+Viz1?4$XV!8f;Cj4^-9@DTt2002ovPDHLk FV1kcu)nEVs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/242.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/242.png new file mode 100644 index 0000000000000000000000000000000000000000..f71795c20d2419f7e5b8c330138212172489f4dc GIT binary patch literal 455 zcmV;&0XY7NP)(i zL;@5cg86)I?@z&|)2YVZ4u?Z~dki+4%_N9Gbl?R@uMa_JG#WM-4Ak#-yAq<0c%J9B z*=&je6xg9!t*V98>2%Z|kH=Q8*VQkV%l2{=>h*fcCvXldVvQYG#3XJIqgJU@Y`I*j zh7*KFqtUMe62<|OD6dv4xj_Wtb16jO-EOBkV;sr>Doo-4vWJEUspEp(7*l5Vrn}DcW3-r5QR4}$v;Y$GG!W@G=g9wC?W`gqJmnecn1+I1Q8)9f~7@%MgB&9$mG5k=GaqG zyxYCm**9-Y&xCl-^bx_Xg}fJX0w?HA;=YYfTY)lAT$~c8w>`Tce`B?eP;v~ zN|vUnZ8n=C0fD#2VAX0>BT1c3NAvM`Z1s9w3d-fOePv^>*ONbib086ERAUp1sDX@F zrBbowa;X?fAR3KEe+qCI1uVW~$*a{$Y9OKdb1CG+yWLK4j)FodfQ3aAknE;Gg6pWD z8vn%E_!;iBC-;C#RB5$Zb~>Gu=vU>gJ6KPWL@H1(f@ZTRqqf^^ew~0S7{>7+^Ei3j z(9J{g1h3|Xag11ns}li6c)+Xp90f?li#W%LauZ|OF}QmkjvIT8!b5WD@muH0J~GF> z2V!;P<|fASW3UkuYqeV8`~?NqE$Z#-Ega*zmBBBD?2H>exx}*o0000)5f2OBX?K5fl*wK~X^+RMbIm5JZHc2#yYYioS*qa_e{68}ch1 z&Y%1@CnqN-NtjF~HW&;tptf8tg?78G_CH?Wb37jHbUF#U-OlRux?2AC`+cUq-EPGP zh)94UL@*wY%|gzG!=e7Y?RLBN{updD8c7g==)en*zQesxsZ^}f>8RgqHYN1-5bWbA z*nB>>)oPU$pm4sBi^ZZ^NR38A{eHi1<#JgL^7*{IUW8h$mhuVg1B+N=H6}5L8^ov; z3I&@^r>fxupwtuDz~I+~yjU#c1`$^O40lm@v)QQ5R&Xc>s4$2F$Q~LZq>c+# ze(Ow0000wf_4B`ecYK20-{<)VH_}s@?x=&8$=*}g@-7-*=$rl-yF&TDh%QPvWJEUspEpx_@~Z9c+80z zTyDYDYBf6?4kG$ddFl?vXS133xR*e+T2)Z%^*SCWV3oJ0pzR^%b$Fc6pNr%KUybd2 zJO^zfb>Z$LKoDN=RlJXb_p1Z4NI5PPLriU_;OswNLJamEnTzDs)4R@*z2-uE1F1W> yF~rn<3MLX_sZ`4BKjYy3iTd;PC!FH`DT5zsD3OBE3A*_J0000o{b$!L77Lk9rxg&}Y&MF~Xr$wRd5+Kde3r}QqBtIp((CnfWPUoGD)GbN zp!on2B_K#5n9t`Tt|7D8Oy@SnaV&3-PSP}0LI_F)79i={-7CT{l<{~huMbWJgMkw9 z|Ni7;yXZN@EMQga9|ar@FZ>)MDoyld`=Iy!t*oPRkxaUO*J;^D z(HVOKzB+PC6MgwU*ocWi5LC`zQBZ%P_I&LL`=~!<@B=WkjGqg@>q-Cs002ovPDHLk FV1k8A(S`s3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/247.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/247.png new file mode 100644 index 0000000000000000000000000000000000000000..87031ad5e2fa32315079fc7ee8dbe9ebf91897e6 GIT binary patch literal 456 zcmV;(0XP1MP)~y~{>O9toK7b>pU;Y_s$?)2=*aisaA?%``@Ql3 zA}T-;B1qFz#I-WCLb zA)C#nDL{b^K@jK&X*e9p$E%b1d@j9SPwVY=TfT4OXf)D%9Q(i`*66?@CUJup4mzEV zWLc&)oFFut&3+w_Fb8HL^~==-N1aF=gP;u3WQ;(L2b9&`Zxhy*cRJE%_QBcvxAGBM$?v2}moiwTu?d18*a(UUf}p7Iv`|qC!9oxbf+AS@9r=xX$c<;hec7j^ z7}qy@ckb-$ZkSG|HXIH!fLpCrLbu!1_+MS%=X5&R`Fs}k`@J=rO^tjX4u=fC+wD{j z5Rm{Rg3Aa&pbMQ;y5sMTuL>-Fp_+*`ZdmJmGR zi^am$>vdKDf)3?!StCWQR?EIG0!flswOSQlC=~4VBGl=0luuwESi~9~Si~f55W_*K zRI=G@CJrYE4F-c>2PBLGCQ)84mvVy$-9N*fL=fI?x8jS%q8!QrDoovJOQ2q_E2zz8lO89a3)^CQh&fLk zCvyuiD8U~D6H;qD|r5Ked(|BnN4dwUEvnM_0oK~&%gie4XrP^;Cf*Xt>6x7#8jhJ3kP z+GexK5|E%nxm?yrQLEKbJRApNtjowmDE5&;d3rT;@xhie6d)RLMecSNfc1*ra^-1sGuAFZt~5JjDAk}IW4mojZyB#JGND4;-4fkZ)rC@AQtkXDqmxkPS}b2z+N4Y9q6QhaRB z&V2v*J2qX{*`{ec5F5u)P?n{vf8`lI>$=))+dR~DZ9mMtO_Icm&+{z#01_b}xGal6 z_Y{8Z1Q2o7BE5|DP@n+?B*amWrm4jA0v8?u2oq3Y%}G26TLk!H=p&TKnW89)?B}i` z%QEjbZB-N~dq^-0gS3DTkWABbW40)O1<)&GZVPSO+M+0I-}hdO)~c%d@!;jb*w-EJ zPsZkXE=6%1OA^HA^I854R#l|l2muAk4B6Y`m5}vf?v5f_(p*}+86=g+Z75-nDu_8# zPs6JnP!Y;z6488#bXq>t%9?l~G0000f$1Vsg(g^F4T7J`Tn6v5IWr^q!t$REE+{>MH; zig~;5-`UyO+1)UmPAy5245+PEE1}!%s{M}__?%8BJD<3Aa&pcNMGSzsMTuL>-E%cx7!kWeF*mc z6l}3r*m}Lr3Q)LQ$>nlcEu>bfrT%a@v}&~~2ZchxUamr&PDl9!_JKvLu^N*Y#0_H9 zN~My`W;4}rg3w?v_;EnOIAHMeN?tCPa)St~e}ubKc)Q)IUMv>nP!3RG5C@PwG(<=p z7p%rVbtdNXdCf^Pxcmm!Xf*72Jc{T?<*7RupU>xVfqMzm>vaXS*=*9|1gt_}Y!5N7 z!{dbhTqGy>Y91Kdh+Vil2@r%Ad=>BGfU_rynBzieh_US$oIMxEgS|!OBDwYWu5)D1 zxsbkr*d5$7#MpieCK6($QpxN;6tMR|Qz~_8E+vRc*4u^v^n@x@UACJdOe81l- zA3!1kf+T|JbZQoIHXe`l?_7Db^?E&fz6;iFw?)MK z^&!}DxwOq@lO-VVm251R%Nj{)wOXn=91g8ot!iE<6znM>>U28tCvXlVB8|#yVi7fv zQMFVm*?c}%3?&c^27@03IE(@oKN5n~Y9%$0kocGjB7u0f+bLcw7Nt-MU||sj@8Kpj z4H8^O1=aW`&c=K`uRW;;U%$pR8Vx(0PD=Dvx$6$r7mI~dpk4&^dR<0sx7)OxfGQk| z<3Z+e^61c?i{uGjjpKM{Vim4V1Q_7~ui|qQa5TJ#bDStOF_s;J-p9A{8kvja(&M{M z%ifaC_#24Tk(-(r%a6fEOsrHYne%59Tt88NzW#(`Tt8*-4T&L+x&B4X9e7i^KcDpJB zkN9e}lI?bz7l5EcwOZAYq9jS==PEE7jik|NC|@d--97r$3C!#H9D|}N!%cY zgG!|$i^W1YoFFtD4sQ-f7za!ii$z(l*Xjllx_`L`6+w8v-z!fe9I69Un8ZO8MLsk{ zNF5h+;~SoZZ-tvvpFzD|mpG24-EPb2bkagQDofqK{BpTe7r0k}R;#5!?RGnVoPaI_ z#`X|1o;ptG&qcBV>t=zmjnIX;Qvrf7!n)Xh9AK3!!Wt9uA%?a?aQ5M?yhrXLnf36l zb7Zdt=ifl+j#?jLXg>rC39(kI<@TR*aQ{T@`Pvf>asQOTFXJhSLr?xD;s5{u07*qo IM6N<$g5z@7S^xk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/253.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/253.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8da61f097420ad3e6c27a6b0a60b1cbd24a634 GIT binary patch literal 469 zcmV;`0V@89P)d=sEe6lbRoD9M1-ISE?wjlxke6B@l~j% z$B@OJp02L`_4`-1%d$*nvsnSe*6X!mI2`KuU!LQ0KA+`sxhM{YgLJ!H9ho1G$3lF+ z-)laALlv9cK4Dbi4sEK6|n_9=rO>@JTG?Y4in00000 LNkvXXu0mjfwfNIL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/254.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/254.png new file mode 100644 index 0000000000000000000000000000000000000000..8d71000cfc9b1a217afc670b96e1fa463a0fcbbe GIT binary patch literal 467 zcmV;^0WAKBP)qt?r*VA}1nMkwQ)VNx$%FC5#Fc_#mj&mRpX>?!{i>QH&T&-4< z#bTj3lt45dkAD^5FbY_#R4S6^xvGJL!sn9n#Jk;2^UP7G3SeOo1?6(tn+6H4qk?YC z$+Hns_IM8(jfO-~B%Mx2PN$O=+EtnB2G*C$rK&)^613ZGHEO%v`s)OA`E>VsJjg6h z9XIsnN3sIz#&N!{1RNt&Vd|6sBP?NEEJnfCl>jfo8YA*1hO$F&_u@+4*jp5SB$FQg z>s;A~yYp`#R7b5hF_a&IjhI-k*9+$_D7by1_I&LLhq!&p;0Ln0iY*R)tY-iK002ov JPDHLkV1gFg)8POB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/255.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/255.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e95e1b1f8c99995f34db10c88dfcbaad395c44 GIT binary patch literal 468 zcmV;_0W1EAP)At-`N7db_)k%Lrx6{_hm zWbvnas;htf{@vx$G?m$GRsgZ}daW1^hdTb3=lGn@XSrN1io@X`-ELP${*T9FA->=5 zH6K8t1O!P0Ns`Fhlau*;uKzZU$7A_+_p(?lln?^1zyc(_JUB(G)soR@r1O5iuS8#0 z0&yi-E|;>|Y>ET~ULTz_8Vwyu>h*d$pH8RJY&KOvwOWo^z;)E~z=kcc#@v57_0 zKt`-yuS=F?8bb+0lgZ>)0S=>p#Y&|jtJO-?KtlEBlJms7-A>~i1%;{r78X%ZE|L`P%;My6Lw_EUC0I2xjAMiw(xbO@gYbWc(}7@Y%M_?)&bcX&U=&9&MVYUVK>=$p?@K0l{@$1v+Qr zA35r8lO71lh72Vsc-e++em5?Qk;iX!`SsL1o& z`=_Of0%Z>g#&MJq@Bxx}p6|>S1+V~Wh0HCX>pEMOr5%RBi&0u#*EbK|o{fD!@cC+N zQ53Q%j$=uJI7t$@4aSd`TP_C*0UMMVGEHLqG7smPf0|2)ca5YHISnPuxdn(>v&r>K z2rwcvQ0J6@iAYxyT_aBue`^v|LkXPzZzB;1dmZUqB}Cfdu8Pydut{76ct9yC+szXN j;S<&8t54WP_>{pFy|tVwl9ZkR00000NkvXXu0mjf0dbv3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/27.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/27.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea5b6c01ac6a6e3ac743bf28d7bce9e531a5ff1 GIT binary patch literal 389 zcmV;00eb$4P)5gs5QLrI$4ZwnZCWG>3M2|B5L6&h&>#v5Ix3`yk~S}qx47r<@oluk_9aR&*xvJw zXXb3v_q}b~)&sR^ngmr<$@tek!)MzzyYIV)rfKY_xwmPWdi7;lWIupJ2q>=WD$qHN zmxBNz*4m_pF`f#vpn!xr3bHJdnjYZ7BLLwBR9N#M8H5%A`51hJ5?Rv}MUnkFROET? z{iaq$fwG4L<2Z^1a)4x>=bNxa0W1KokhvDRuCrxX+F=;H8rJH%{>k9w(b(4m@6W~- zMIlXb9Lpw%lO&OUgHaV}HbOvyGDG(E^i9b4VeZZ*Ea_e>-drS=$Z05H&Pfonrpe7q z2nZq!Q0G|SbfjyDZjfh)zg-elg9T3i_aadU?>f@)4Ut}PSH&4(cu8CZWPlZw?d}r= j;S<&8t54WP_>{pFf*GHI?V4Cz00000NkvXXu0mjfFbu5= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/28.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/28.png new file mode 100644 index 0000000000000000000000000000000000000000..be9e22740defed2b19eea511eb448c4758af2d49 GIT binary patch literal 394 zcmV;50d@X~P)Zt~5JjDAk}IW4mojZyB#JGND4;-4fkZ)rC@AQtkXDqmdx_j4=WuwV46(h5QhaRB zdj9Yf&;j&wEAHS#d=w;@qA&nF|*{~aU(;jAN_z9G^PcU2rFhC|{izyn%Q o+3r125I#|TzWRh+gijfK0WfKuGtq)JIRF3v07*qoM6N<$f@>D48~^|S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/29.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/29.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7179ff7726933b7ffc4944c53adae3cf7fdbd8 GIT binary patch literal 390 zcmV;10eSw3P)Zt~5JjDAk}IXl4brAXqM$&cfC51U5(N#SprE5dT2a#OC31^BhqG^#A+|SBiodpp zneRV;$ENRl+qSI-V$(DUs;ZLpuRO!gwrzIbcMna|*o%3zX_|WRWmzO2Kq3SL*L4-> zp2F*m03yy>q?fTC3N)aAgg6SaER&dC;KCySVFD_wIf(~hivWKNeS{J@Qxrv!{k*Bj z^W6KUt%?F=4++L`los#-l6ju*%oYW(0D6VYZK3NrTb89AhQW)`T3y#a9$da}q2Hn? zq$rMKNrE^@68Se+uTCx(3IPSm?8;_6n}_4fH_fHRyFpTk+=deNA1_9TIaB2NB?K4| z8mN0(cz-q`T}^b2JWTv;NL0=1$;j>h4ibTI){*}9WQ0gZ+*NUy7!HZ601s$IWxIKz kAbg_weDw*t2%j?e0`$J1ia4GGDF6Tf07*qoM6N<$f*$y$;s5{u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/3.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/3.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2bf2264e6218f2c659c236580a6b1198f53971 GIT binary patch literal 462 zcmV;<0WtoGP)&snTITb44aD+1S0qWI>wkHUpY!=Fm&-*_mZijTtSjHgB!bmyCE^;gSS1Q6u<)L6*9MluIp@BmUb8hFGg#1UH^D+{jNg4MNvpn z9LI7A;v`Ar-(Y=vGWPY+*!O261%-eFWp-t=Ud-K@^m0J&(&Eh^sYI%wggvSt=1h|7 zmk?k?XrS(C0ToDB6I~-u6Mq{LRYMC@|96lGgtM-mK%^t?syIyyhs0HY2ehKH-Fu=S je4_e%^$EKOpECFYt{R{EOtgcz00000NkvXXu0mjfb<3Yx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/31.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/31.png new file mode 100644 index 0000000000000000000000000000000000000000..9e55d97cfc12f538e231a2cc08b9dac641ed8a97 GIT binary patch literal 376 zcmV-;0f+vHP)Zt~5JjEjphy%HNEA>Ys6e8iK@=2pR7epe?Or0c*mHRIjWT5HO_XBR_AvhQ|KG72 z$IY!he1&klG6q@0stZ|fQ5G-;z2Btz#oT>m?CE`B}wAHo-E3;48EyU zVW8+Sz&y_)0UrQa*Y(A0VE_t&R=});VHkW}*M6F&AcwTJZGSwteRn}`RaJ5+O;afX zILk8mH(2kcmWBer1x2>BSwG#|b>^GaBJpLAlp@_=!k$h5bLNuuO8_t;Hc+_re+P*~JnQNSKsw@<#bshVB$fdlAVq20I$;n$QGLGpgl)u6nRozl Wexp%h6cJ1S0000iE5XDLQ=PT9KRaRgsFeK!HARz$+0R;&HLl6iY3WMYuZu^^LxZS-r6_4GW+j;Zm z-E1(9qv`wJ0kLIS1WnV(`q#aH&v6{)JWmH**O~X{z+_qG#J6pe`v4LlAh_?lK=&km zz63(VS(CIF>!m;g3P^~fAkTA&X#pD!0q`%N;_EdK5BwGZ{si>lOXN&a9LMJ4M@3nd z&TrbPC{T8vV4i1b0Usb)*Y&|{Q2+~|SIF!ZhG8&uU7Kl|oEWXOZF~2CN>riWs;VR@ zNfNmPahj&`Z?N8OHxosXDT+c03IPeqY|CbSd%B;)Fud;4;=>@RM5>{LJ*pt)Op@)F z5MYFFpzdjb>PS};Z6hxee;X22Lkm>@caRA9v#y>%q$6&txJ>ki#8!X@w4$=@d!oR9 iqWXOG3ES|WGWZ7fD3|e+V&Uxo00005gs5QLrI$4Zwn1x*SXq!Xe*LV_z!P=Q22gD5Djy9z0yq|F26Ih^}eT4MVWr5J4Q zd1q(m)@B$6+jX4>V)Hx;>bjQouX~2ix~_KHHV0xmoP5MDsV`?C=b!WIGk82Sh$awaKB68m~p zQB{@qo3<(nlszPvrb$}B2T0E6^Nrb}02V;6khv}NeQ!^vlO4y=i_u!sG(R3ti7NDa zJRT+Ka5%^%h_ft{e}gqmQya&zEz4303IPeq?8;{SFn9YoilY54E#3^0N~9V}*jw`; z#GFZT{SpF<2o2OdEqs}Kk*+4XM(!s5HYBQs7O4L3AQ1>>9qFG}1rX_oyDD}Q!y$1M s-~p|uZ1ap#QVP2d;p0O z5FCa(Q=PN+WnIhjWCBTT#K-)6{-H~o4`bN$s{&q=B&Ev{x_kS-Ef$**)olgmo zU2$K`JX>*C(BIlU+8)e9{PL$%Y zyW^R+Z=Ppe*LBh~%?iYZVNjH1sq0^Pj?XkrGSBl0bzRHTy^}OeSMk&7r1=06B_Mb{ zpB1*J@a4fN5oas1%UBl$7BE0U90ggHY0NJ0u_6Fr0xDh~oq78b6szB?RaIc@A;Ix@)E4jol5rfb%vJ@k0D6VYZ=r2lIUEks_x&nHYgJYKc<}CS z<>LZzce3B_wP?HDY7)drlIXv|y4&p}iXzGLTrX4t3XB=D&u>E3H+QqNvDs{vTw1&u zB$LQ(C}EE(h&fZ_`=taJ5gKTFT0jNT%|zeG#l+u+#MICNxBojx1j1Q2Pav`p_f;$= whC|{jzyn$_*?yiX2%o4uUwgtn!lw+r02vFO^#`zdb^rhX07*qoM6N<$f@RjPT>t<8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/36.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/36.png new file mode 100644 index 0000000000000000000000000000000000000000..672c59695b33036a76fb089c893086f16f9e7df3 GIT binary patch literal 403 zcmV;E0c`$>P)xPUDvYyb6DY!Tp(p^s1^XOeci zo&CJ3D2l@SOCS9X01Kd3$lMnCzPD9X**`Re%SyqO#q4q9A;t`h4{Xy9l2$_y$#RoI13`AHV`-(&iGmMb0tdn`p?gPL$$# zcgHht-#lhr*LBh~%?iZEaa0@*2VMWlbNpN`7n!DMg}Scg-Q7x-Wvlq0Q}{U(K*ZUK>@wCxfdveZ5Jy3t=NhvMe5?pSn1Bj#cj`gdBETOS>9qD{Zh-}1t y6^n`CkoXGlfL2VlpQj4KCu+~vp0JPbDT6PD;Gb@4K! z0)ofmQDJ)$Kd%H3akeBY#yTmmfB_QXC@6|TV^+XNKmg(ks1P?(58@U9{y6%GC2}Td zxm?P}RmFO}4t}#%Re`a`1pED7TfhfMhGDodTNS_p=oK=*g}(2lu4~!tc0r8R+P3}i z;PPFCeygg|q%=+S62z<3O8*VkEX!oESV&oxT2Ki{FlJvi>$|&?*GDHW4^EOKneNi! z%^;aXs-cAa+mlmb&LsJMDFH^r2HKt$sE%|q(Km83@wXu{HS?L%>i-TBfq2%D{(S8n zA{%jE#bjbUB)$SXpcRwt-%|zg6Se1SPuNHNl))GIg`jsh$rLyM00009WOtn?#bbBJ zJ8#}R&${FBD1F}tAT|txqHSAU|GMY+EXyL7%Oyb9b#ir&QWQlHpQcIg14xvB;5^R? z+mrZtBY=prC0Q}nRe=QzkPt^fS(X~J0zLu)5MMxrxF_`>ZV}**qmNi3XOcFXjeOix zR8~=dXs01V!voD+V-95mrPJwX%m3kU$klhd zo$>)9DnJn;n9t`Tt{~ItRR66VjYjh2?qxQcsUQO0ffXQKt|ZWGHf1;*YQNX(sStg{ z*Xy;UX_^z7}L>Hrl6aZoH4eQ1b~Ixbj^ zf9gy`lsP_wMx!B>N=4f3wj7T~CE8J0>ITMFtChOIy$ZBiEe$HmGJl+aRbC#PZVxf5 z!{dbhTqGmdYHa82(djlq7v@d{2*L`siuG~udUZe+A;*M#h@tHeoc;Tg^TFOCcah9` zc-J|y=YsQZAan=UhZx!q!9+r=*Xz0c=N#NVQG34jghSjuW$+DMOOk518h%9p0000< KMNUMnLSTY#cGuki literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/40.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/40.png new file mode 100644 index 0000000000000000000000000000000000000000..25526db3033816577675c6344bf3431bca63814e GIT binary patch literal 384 zcmV-`0e}99P)iE5XCp?pRZI`*9236sU<<2ARz$+0R;&HLl6iY3WMYuZu^^LxZS-r74LR;n0fQ& z-L4tO(e{1sf!MMvf~IL?{VUJ#a~y{~&(lNKb@u()*euJu__l454u zixDEuTBOZbF9jMx-f55RZ^6u zsU$&syWQm9U{yuxjSx_v%&u(Kx2OA=Z<@=94;M)#(hVi-=>#!nid?^h03$*JbbEqWXOG e3A+fNGWZ6AotE%GE#YDS00006L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/41.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/41.png new file mode 100644 index 0000000000000000000000000000000000000000..83f609423d9249f2cddf0e70ead45cc97525ef43 GIT binary patch literal 397 zcmV;80doF{P)6j*z5J`;dngSmq%l>Ec4>avdDb^i4YK6 z*Hxf<65pPT5OLNdEylVl(0~FG;wZ@TTw+?lg+~Cw3#fR1HsV3pBETO*AE89fBqd2= zUpEzHS$e-|tD->JLxOP}r3HL|WS-|6vqb?cfL^aNr%HhE0^W5rNx^;Qi)VU342sQ z%$X$DFCoB)&_LbO0xFQMCb~xMCjK@gswRpess8UE5eR1;>2Vwjk&d{lVmC1y5?4V{ r6w->ycJGOT@QLd4)hFyCe9GV(`>>j{aDcs700000NkvXXu0mjfgA1}R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/42.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/42.png new file mode 100644 index 0000000000000000000000000000000000000000..ea08ca55140b0b007a0d9216e98a2480ac23c8a6 GIT binary patch literal 397 zcmV;80doF{P)OzhSZNCyL_tAEg%oYMZ7z{p55(D%K4x;Hk@b1%NGtK0{W2m!%u z+XT8N@#Vn?5ob-(VywFY4JaTXj)I~nB&G#icmyE4fQr{gBOZh;0{k)b5lZAtQj#S0 z`J$q#D(^RKRTLq$BRC*i8(F#8pt1 rrL>~5-Fu=Se4_e%^$EKOpECFYC%~I6OGdYF00000NkvXXu0mjfU?Z>G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/43.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/43.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5c5ff4448f0b5dc2f589b11d0143664452d165 GIT binary patch literal 396 zcmV;70dxL|P)OzhcBL(75CsJt71C-;+FT;H$T^(-MjB#!6Qy_< z4>Qki9%Iw@y*(a}9*9lTBxu`K*1z%$kIUs^w{7!qI2`QDqp^9Od+}viBp*N`1O(T0 z73e#KZ%;;u*lUp<#=0xefC3WYC@6|TVtRlJj{t-TsCa)i;z8IVz#l^&p+xo+B}rmm zuPUml^1f-SqCnY0f^i(B1$=;Hp6460MFA{;ULkW^IGs+mX&O5WgBPQ=4SW{^}Or=f&*{sP48 zDRTW10*nX^)OT9IM5L>Uu93TmzYU41iK0kO|96lGgtLzHIF5x#N8DAhn-~s>tDr1P qX+>qbd7>b^qI!Mx3cCoeGWZ7U6`q7StP>vq0000Bjg5QaCswy#uI*9236sl5b&ARz$+0R;&Hb2)JWhr%GSeTlwBpJU56$-uJLrsBWd z9cKUe=f7Fg_q}b~_5fnH+f7ham8^f|8Ghz@w#%{{&@_$xG!HgOl0$qPN680}2m!%q zngqJ%;`d4b5of)m#aK558c;w&90h5bN=ys5I1m6o0TtGq!~?%YfIo&le2JX7bUvT$ z*Qz4V^TRi7RTL<@PjJ0nr3HL|WEh4!vqb?cfLo9)pgPjkMAyj8#NUQQ)dWEx)&CtN0{*NcJq$x3(h+x6Y$p0c;ws3p rOj=RdZk{OcpQt`xeZnsMrwo1o;n$lvsktbK00000NkvXXu0mjfgUqX$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/45.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/45.png new file mode 100644 index 0000000000000000000000000000000000000000..ac87e983589ff457f36f6ee3196154239560fc8e GIT binary patch literal 398 zcmV;90df9`P)Ozh7HNxZ5CsJt6;ib2wz))Zk#jhF6AiJwiBddl z&(1u*c{?_z)5-RI?}6AfO@g*8c;w&90f&DNK7wq;Sqo^0TtHVi3eee0Dla9gc3PZlq8A$ z*i=+i<^86uiUMU13C3}h7VrU*d7iJ#76q^XdWFnw;dngSrfKXj3|@@Zx~}{2;OXAj z=MArq#@2N$MQNH!62w`S$-lv>iqsn+pg@@+dwKXKWPLL?dl4;ZE-hXSl1k(@l(0t? z#GEN|{SpF<2o2OdEuaGFYNBi8ZsKo4qH3ZjlH30sBm&{ABR!5|A<_|dRqQ5)L*gnZ s%TiiV*>0XF2%o4vUwy(Z!lw+r09pB-{YBBqY5)KL07*qoM6N<$f=_R!b^rhX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/46.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/46.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbdf68805a6a9dab23390c77c86110fe7c34193 GIT binary patch literal 398 zcmV;90df9`P)OzhSZNCyw8a*5R7fjI+Py?>k#jhFqYN?LL@6G& zXFYG;yd9ga>+Ioh*n!yjd=}JoE$d(R44-+P?XoO8v~6pz=H8}hx{HtFDE9#*LO^hu zCV}or{9Fkj;;czpjCE6>0R<$)QIKVs#I%5m9Rct!pu(C5@xX5p;E$mXUm|CcqA0Q- ztBRs1cE4$>qCnYwg45|FE#Lzr!!X>KEec=(^a`2V!tr>tRaM!(?{_g;YntZAgX?z{ z`Yp>+lHxd)OAseXBL4>K+mo@ckH)?~8!0FRBq*~hoAqMuwxpL8dY2Y&21zAS4JGWU z1TkllT)%_>BYXpOPYYB>x|--3xtaLekf@p<2&DSIgG9ieb)<)3C`3Bqu8Pe>e@I*f sd7euvD%-s$3j8Ok&sU$Y3;!vDFNOM_b{r-#>;M1&07*qoM6N<$f{)p&rT_o{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/47.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/47.png new file mode 100644 index 0000000000000000000000000000000000000000..3c57b38db5c4faee7a182f67eefea5b73ffb7a70 GIT binary patch literal 392 zcmV;30eAk1P)~*w4F) zvMjxC+Nvl}_K@IwK1&Pu0Le5>4`z!3SOC33=C;uHy{+roo=zt(Mr&=`{&;ZxzJ-3P zs*<8KO(hB9!{H$R2J6kqScDv{ez!v5pU2r*}hT)%_> zBSHgpPYds_Mx?8Wu93TmzYU41iK0ku|96lGgtLzHIF5x#N8DAhn-~s>tDqqb md7>bEqWXOG3A+fNGWY^YUZTxDPoh!)0000iE5XDLQ=PT9KRaRgsFeK!HARz$+0R;&HLl6iY3WMYuZu^^LxZS-r6~pe%&AfT< z-EJ_Bqv`wJ33AJ_NHk3&>tA&NpW`^pd7e&mU1#2(1CwQ$li#*Y>IpyufaJdK61u1H z^Cb`<&f28IST6>e&;W!y4DvjeoDQ(V0U-PWSbV((;(;%bz@GpeK1I$n#c^ytepr-c z>HMZrg@K~`0P{SH1bhHwUDpS*g#jo8S^={q48vgRx;E1^IXR@YZF~113_}w|ktvG8 zR8=KSNs>qrz-gMwzrm`E)EfbyL6HHw-ELAu@!Qi~29mTEi4PY^DKZTv?3n~GXPRuk z1OOv^19guCrbAs#w2iz>{Oyt`8zeCO--|@Tzw1y(H$ZyDZ5Ee_{w1*)-~m#Uwp}L- k{3oiZrE5Jfj}k}J7Omof!S3K~lYQ6M1!1u_*#6f~9#3OXvJ$fes{BDcsnHoTFBEbBxm zzS$km{QdKH*7SXE+qT_+*f0!&qCnYwg7f(-E#Lzr<2c@!Eec=(^a`2VLf3V+sw#Uroi;IAtLys5 zgCGcO7=|{_b6b|B6h%=aNf0MVBDcZ!%iP<~1=j53Kp~(&nIVhgSY#vr-Q2B39}6^> z7H0Bj5 zI^wR1)kJ?tTm^VQD=OQ~69xVg)#s~E*oFU;!8Z~zoMsrqx)A^X002ovPDHLkV1mN) BtsMXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/5.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/5.png new file mode 100644 index 0000000000000000000000000000000000000000..259dd6d0d91605f0209cdd480bfd3a888913441f GIT binary patch literal 466 zcmV;@0WJQCP)C?W^}g9_0_6csAC5JZHc1hUMcU*T``LtZ_vePNQ) z#dXY`H}~DSGvijPmCWb!0^s)hy&?=l9sjFy{G@3rS(Yg-mx~OCLmm0PUatlId_HSE zKtu%~DFn;qQp8ncu~_K0jnnB=zTBh4ajb#}%* zxS$)~@GSgr54tALpwsC{qtTGTU?547XrUdIrEXw;v)QN%+^ayp-`Ajy$76n+fGz~a z_7F3kI!@@%MY00xW`VH{--WqT0fI2Xy4ZglV3jQV8WYMx^lkg#?EPC=M&Tlvb^oq& zWbgOH?G5(^b07*qo IM6N<$f;6<+0RR91 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/50.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/50.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4b7883ffe058983602ba79b33350a39d38346e GIT binary patch literal 398 zcmV;90df9`P)5gs5QLrI$4Zwn1x*SXq!Xe*LV_z!P=Q22gD5Djy9z0yq|F26Ih^}eT4MVWr5J4Q z?T%;X)@B$6+jX4>V)Hx;>bjQouROzNU01tpn}@b-?aQOFd7gXm%jF{Z01_b}xGal6 z_Y}T886o1VMS2~IVT%BN41I(WIa8D*iG97Q zsH)2QO3w0JW}Dv{ez!rqz( zA?8ex>z5E@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/51.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/51.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9cf12fc765a82cca1fcec701278fc239aae3f7 GIT binary patch literal 403 zcmV;E0c`$>P)~BI|ATeK*ig$5fA(p0sa{J@Fj94DT*Td zvZ^SGV)vW2Dhia{C%9g((gHp}G7Q6w*`fdzK(COwEu2m#TUC|4TrRs9tu;;a<3SJv zHVi|X=eaG*Qj(6xqg;YGNfP-tSij7@{aj(qgA^135|kOTIF3a&^54zfmh`bg@6zJU zAgM&Ep@cn^Am&Vx>z5E-PBRR4F72>7#(boz!!N8DAh xndlFRs{jvZMPZrE5JgvUk}IWimokN$6mF0#M1h0^6bLGiC}=Df6m+g=T)NFAa*Lc};y2QeWt}L+ zXLrXlfBt;$x?vck>$(+)jpL}O>sr^p@*JPbK4tI?_)47XB73eC00000NkvXXu0mjfxBjud literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/53.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/53.png new file mode 100644 index 0000000000000000000000000000000000000000..6c632c22fb8d452673fb4eea3223d4716a147769 GIT binary patch literal 407 zcmV;I0cie-P)~=dX%Cbz8Al_^?`fsqBBJ)NGC@^No*6X#rJUDrMbn@=*<|10MTw1&t zB$LQ(C}IEh BwO9ZE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/54.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/54.png new file mode 100644 index 0000000000000000000000000000000000000000..071647134f3a2367332f470c1ffec424ca4ee3cc GIT binary patch literal 405 zcmV;G0c!q*C(BIlU+8)?Y0PL$%A z-SN!ZH*aTM*LBji?Fz(Br<00L0iBFNY3Z;joGRI7C^6%`7IoeM=8rv`o3SqXsxd69}l7^ zlI?aY`~6;uqR^rwNi+%KEX(vZ_`W_ld3kj5_U!aPC7{5VAxqO#lSqDdcT3Uc3d^O% zn?W*(oQ4wC+ycbxDf0bN0*nX^v^6bYBGS!7-^j(p--g80&;qCbJ4gh=Sw}io36YJs zuVOJV91>pv9?*)(_VZLh_(bjb+7tE>K4tI?DafE7^RsOOS^@JV^nEXNUCTI*K@Mqc+x~cvB#ESH zDu=^Cs;bhWEX(u~!2A7P{|#1SWZozM1%?b*p6BxV?Bwmm$-8^lijZV?k$5*qMv-nX zVNWN3IaB2Or2rTa8)$nZ&>iY#qHpA8;%`G@Y>+_re+P*~JnK+LH$XPxK8wx7cu0H( rcz_h6?cY-d@e{S@YfspZ_$d?L?j56cwa)dA00000NkvXXu0mjfOG>O+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/56.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/56.png new file mode 100644 index 0000000000000000000000000000000000000000..1a564df4d74e7d272847274200e2faba74780520 GIT binary patch literal 391 zcmV;20eJq2P)iE5XDLQ=PT9KHNjM1DljA$f*>IQ1OWvJ0z(i8914Tv8*clXWVmIoO~qq(=XTz_ zc{l3~!(h6uyMWj{&w{$HW&P`($7kPna~#J7ZQGjnXV0W*dWo;=D)#{-LO^iaHi7O* z{Cx3*h_fbXG1gOo1{9DGM?scl64L@UE(E~6fQqkIPdsp21o-38hbxgYNl_G;j~^99 zQCxo0Rz-oby9CoTNelP@$+9dDW{Uz?0KGzHx6t>!sjAA1<9LbDTGKRl52!>H`Yp>+ zl5V$~T!J`B68Se+<2W{97@9oKrJxXypv<;x*0-noIS7LDE-gL`l1ii+O4y?cV$LMl zehC3axCZK;7O0MNHPJTmH1W3~Q8m8rOZ9&TiGVxnNT+Xzbi{2Hr-|;6*a~o)R#diq lPZYRMRG+UtVH@sK2H#A`nlv+58&?1T002ovPDHLkV1lHWrbqw) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/57.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/57.png new file mode 100644 index 0000000000000000000000000000000000000000..94968be37cac0aa0237d787d3b04eda4a5af6bc5 GIT binary patch literal 406 zcmV;H0crk;P)UYL)Azk?+jawD<2VYcs*?4uJj2gC&vsds4VtF0Pxr>AX}XD@PAAC+kO%?6 z^Z6{$J%uk1Mu<3Tkv3yp6=*;K32_u;Stc=U;9^4n`~+0IJ{s}B9}(b>VGds+XNq>a zoqfKjI2;a}|8!JQpzJ=uFbpyRK0q=})0Nqx02aWkkhvptU1!U(w8!Id6JxZxu75mu zH@EiV0&DJUQ4~@X$FU?qoFs{S4c7gBZ=)!(d7eu{A)r8+A^ZF$WPLL?>lk4euDOhO zb&*se-B7}wuK+P;id?^h03&<@b640Jj-MWxIKzz<;9peDw*t@SigH0`T0PaYTD{wEzGB07*qoM6N<$f@!U* AQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/58.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/58.png new file mode 100644 index 0000000000000000000000000000000000000000..41f506f2e7acb109e4de016831ff746970cf149d GIT binary patch literal 407 zcmV;I0cie-P)ZrE5JgvUk}IWi7l|eXO$r)ImgNEo2`G@Mj6^|$C@9>yqM@YCC31_LW5b(h@Ul*n z;4*GvErXHC*#tcwB-C?Fw@f+R^KrUhKA2!MY971nIT1HVOpKZZVhiJVE= z?RNHaR*_}d>Njmw6ezn-&~=@(fDe#dE|)vAMFA{;ULkW^sO#DmMPb{vUBzgvEX$h* z+ec$xXS_cfo9DSC?e}}R1o82Blz)Tua5&f~ifo#uQcws;P-e*9o_+{fUpBXM7>3JT zTD%)1l}I&|utycdoJn&15(13y4b(j?P#x)NqHE-0;%`HuYJwn;>i-TB0e{w!PTvse zh`TBl6a67^72r0lsBHJ1DDa=CK3{#pF8rqqz5%NOo_$&M@xK57002ovPDHLkV1ir` Bu&Mw6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/59.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/59.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f843b474883af8811dee4405a6338e57809bf8 GIT binary patch literal 405 zcmV;G0c!q15QR6tHw(B);Umo#cEz2WXl`F794dt5py`9*=q-K%xW$ zr)g5yp2W{90YscF$%?Vg3M^oNgg6S;>$S$LfRBIx#1~K@?m<0>TLk#y=p&ZMnWQvL z<>RViyWIxAS*xnR*kgim9JK{}faGvE+?cHjU;*?BncqU!b+X&-WEh4ZMr(Cl|9Eiu zu0p?MS!z<2WqJwXqA2v=V9oPfk|dGMW}^j_fCOXqWwXA!J9&L_^780pxm?b7Y4K)| zOd{1#!v5{qDKTe~e7}?cBVq$>PYYB>x|!%3Ih**~keHgqVxiUl9V7zrtRtPiA+izo zRm>*FL*gsIZCWwe{ykL?KT&(W_Jn=JPZ@jxPbH$d-LgGN00000NkvXXu0mjf2_3hH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/6.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/6.png new file mode 100644 index 0000000000000000000000000000000000000000..a79e5621ee157947ac0fdfe229147540b1dc7db1 GIT binary patch literal 467 zcmV;^0WAKBP)K16 z9K;8RNPr?lFq_TH!jnxV6a9NT7!2%Rc(mzsDnSII11~`Odn18*y>9(}U;R#}BO&^T zuU0GDZns$h3an5rm(@aQx7+HEMkA}$YU&pX1^aVryWOtx3G4%lSYrhyF^C()sFg}3 zTPzl;;RK=KaQNkbgmJ)NKA*SsdM!7IK>Q33QFy=Kt6nS?!6P`lkO9w%Uxx96bkA?9^> zoY1$6lGX#v|V0GJy9i_ce2G;mwQ(8r?>mm+79!Z0+qZx%&S zT>fdR!a&hofN7ef1#|#pS(XQ}g#joSy#i*p(D%Kms>+Pxc=6F%(=>MteBU=g5STpA zO<9(b6h)B)0h}a>+y-kL$7d`B1%L!a28^KF5B;~NdmH@ISXz7-B&A3-n6T#-0Om}R zt(O2Gge#!#X@TlcR}pO?PZ56`5@kaRRR4F7aJaJ$b*>U19dVn*DWW?hHUl)E6{T&* l2?O_u>hsknY@7R(u`gpgo8~)~L002ovPDHLkV1mS`p_2dr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/61.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/61.png new file mode 100644 index 0000000000000000000000000000000000000000..17ac50de3ccf8e87bfbacd9b2931094ba46d42e2 GIT binary patch literal 399 zcmV;A0dW3_P)5gs5QLrI$4Yl)3Yru&NC;6NApr$~>Q17dIbA_PM}-to(&mBk9L{~KEHS=BDduc1 zyW`opwdwobo=&G7hz-LaXqraWzw!(}%d*&YU3WMhkM`x!*euI-@oAbQA3!1m1m}4c z=$^vYCnH3hwMZ{x-4tj*0SR#w0czZVDf!`v)A44C$M9vgNQDhHS z6=hlOzG{|0N4BwH>Q3IPSm3>is>Z~5=$Zfk>YnoEl}gQOC<4JGWY zc@SdG6uEv00Y>-+>Yf%p&Amuh6I~-W6Mq{LRYMEh{_h|W@Mj(AA6Eqs>4>{3HWU3J taTVYJt*C4_PZao1RG+UtVHf^W249q_pBmi6_ZrE5JgvUk}IW4mokN$6f~ABM1h0^6v$K{QMf@A6m+g=T)NFAa*Lc};y2NdWt}L+ zcz1`HzyE*Fy5sREZQHJb+&GRJhr>bFzv>)6=kr-Em&+=erjd7dCuy3l@~6{D>j^*< zfaE;S8n&nL^9leEXKS*{SQiGCumFTS46-cKoL%6@3V;X;U?Fa!9)uDJ{Bh_ADRQQ1 zx7*3bl|@k$t8XS%85nv9FbsoAzz0C4X}U368Gu5d6);~y*L6}=mGphT$|0?;>mLuc z+pR=VBzc}oS(e(g-|w{u;3P@(-(Zd7c&X(=1)#x@0i)>U-pT8Olc&x1%9(Fgi^Q8j zGK$;=6ZUV9PJubo)XhZS$i>9phQ!z)f!qHbBog7QL;d-x9UvQV zpT%NgI3zv;JV1)k_Un{E_(bjb+7tF8e9FWZ!F8Z7J>0_400000NkvXXu0mjfo7=Xw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/63.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/63.png new file mode 100644 index 0000000000000000000000000000000000000000..27d1de3ec85df06780c68f60dd2f826125860e9f GIT binary patch literal 399 zcmV;A0dW3_P)AEfevGe(?XqraHzw#WPWm#lh*8r!}Nj}`86h#rluh*;Q14xvB;5^R? zo3rujMgS3O+hm6^ZVD`5fP^>-%Cgj$9pED%0C55;#6778aftwb9CgGJS+i-k+sWrm z#qoFy{#mK2z}RDgX_~YIe1PO~x!jqp3Sa@$3YlL*-}h42wT$B!#3-$8+aC{-B#|^t z<#0GiRaLqv%Q8)Zc)#E4Z7}9}zU6YD60pITAtUMa*~#0BlXv%^BWwOyE+yVIl1bz= zlrZNOAZE=b-!CP=h}b}zQvxO;-Awe2+)VtfNlXnTaQeTEL?G^Uq;r)JS&REBHWT9} t@fF|!rI>6#PZh*Z)Sju)F{O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/64.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/64.png new file mode 100644 index 0000000000000000000000000000000000000000..71a598552c50edb432aa94b76508eca1c021156d GIT binary patch literal 392 zcmV;30eAk1P)iE5XDLQ=PT9KHNjM1DljA$f*>IQ1OWvJ0z(i8914Tv8*clXWVmIoO~t$2ott^{ z=CSJy!(h6uyMWj{&w{$HW&JD9<7eM@a~#J7ZQGjnXV0W*dWo;=D)|5sAt1PIn?Uyz ze!h4@#95298SAM)0}4opqae#NiD?5H7XsiWpyKP*6A#=G0seT*;Y#F8Q4~ey<3~kN z6qo;WR8gSpF2OWSG6Ft8vMkGk*`fdzz^stjBlLZ5s;V;MI9_6m)-=uCgCGb@7=|X# zb5oY36y0t&NrE^@68Rdesz|*N0t%EFvN(<?~-zI6ZhA`x)!x_SbUUU6H+X`*{cYz2H7Mp4;z mo+xmis6JnP!ZzHe488&Hp_=81GV!(m00001mpmk?k?XrQiX0ToDB6I~-$6Mq{LRTD*#oc`}15eR2pJ%LC^ z+*Prf7!HZ6fSaKemF?zS`+buv*C(BIlU+8)?Y0PL$$# zcgHht-#ljB>2#8|ZC4=Hb)BNBDqa7|bNo!xB=bD4&@_#FxO>^{cB}X>44MxhQ38VF zI4W#U;n$S_BFqC5=W9>cNBES%H^u#;@}|I?RR91007*qoM6N<$f~2{u(*OVf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/68.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/68.png new file mode 100644 index 0000000000000000000000000000000000000000..67f2a691de6283a1c94aaac3f8132fff777192ad GIT binary patch literal 392 zcmV;30eAk1P)3CpRd%lW7IXML#9Mx$iMVZGqCgG-lCmuQ$BXkxl9*2gLaYeDP)ErUoGv1fXdelT7y{Ni1p%lw?_E zIm*W$#~iTH@%`CZ0n&*m(0lkBB&ak6IIIyamy1cJV^I{=m2b!uR|;TJ0+K1dpH;?E ztem!Oe?0JR<3HSk#n10ZB8o_o>wVwPW9)W2A4QSvhY`S<=eb3S)s1BB36Q}=3|%df zB=b%JhVA$J`AiU@5nx2P16ms7BQuWU)t;NFoOt!ps1iORK|e_vk*kwD1u8DIYq9KgH(JKs_9X( z__kC1``7Q^-EOs7$!s<&fm%@%is5jm<9|HI&*gHF>-DNQ9*@%Pc6H?YbUKylhr>bn z01*|S2oWroOA%L*`FyV5Hjc+*`Ek#(SS(Z!0q?*HkiKsukR*wWMk9HDankSiRfsy` zd7jI5yDbY)phK(G(h*Xx*OQM|C)4Rv+U>U1>-D;P-NwOSp!qoVfkmv*fkjN>1~D8o zn@!2GOlvqnXfm1nIUr#iFj=eBWV6|*8${^-R&gqV@P5D7dZW=$hw1;asBXnWzRDd9?U|sA#4mcUI2stL?Lkw+);OxU&d5_XXGV9@8=g2e{ja5Wd;kCd07*qoM6N<$ Ef@R;+qW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/70.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/70.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1dbd5125ecef08e02b89613faa01512e46070a GIT binary patch literal 402 zcmV;D0d4+?P)2#U_U)#2ZvMkO173X*i!{EnpoZ);v`ww^TtE!s$`@Xk$0ErRcyxndF zozpb+pWg&=9NW8+R17;QkVAmvcs%-dcjvP#GoK2Cm=S=wu1zx4ce|ZgwSkg6&n-sr z%*W9OY*h5_!4i;;MS;%YH%L%v3Yf53xLhtKnTm(Q!K(5Ox$H^-EDAs}$;)0fSdtaf zG|kTp-kzO*d30u9pPU7vh#*b9>$)j!zu)`KW@Gzd1h5uGVU}c7BUpO^G+-aNs>%HL4-!YAi^Ec(jXt1+wFF>C#xa;wj_XEh@!~)|96ojGu(ChMFl5e0425rhpQ|J48q^_EB4x|lVL&XIn9_lfC+L&(UEF?_4!uCD4hLV1 zeSBl zI&ZgI`}`(Yuh;&rBo)IB3gi$VDa+E{!<}VW<~|jOF(Lp}Rk>uUFPBTVY6B&^-Ogha z&wK)Xz(z$251xQ@EDCgvzd?dZSHOhT!ufo5$yChq+^g~qx$H~ZAk#TkR*xs|L-D6X1we4iwb(ypNLfq wLyYCeAd!jFPTc=U!Sssi`sxbDm|kV@1;Of^2{#)W@&Et;07*qoM6N<$f*3lu`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/72.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/72.png new file mode 100644 index 0000000000000000000000000000000000000000..3797b9698c34cc66e9d31337a78e495a2ecd5dec GIT binary patch literal 391 zcmV;20eJq2P)3CpRd%lbJm~^Ohn4Sz>vTK15zX;STZ0MCMFife8a1LmL5Gqs}2tz#(sV_ zKG$`fzuj&d;2Va)P?n|Hzv3K^Wm){=@z|hg8vps~d{tE&|1?b&4P)AQk1QrpipMO& z%$qmEtUDf$zG<2n@SV?RLs^z)|B7=wE|-hHUavD84hR48=zLXGGygCQ77rjX0-WPG z8g$-lHvaX=`7}-KT}dj2ofOC+KvLJWUp+XV=ehY*AjFISoK7c`O!Xv5%&HBP6h&b% zif2BKK47Eb+q1I-q+?N_bNCGsRGI=NtQOj~HOW-m@Ap=fcgSTI3SdzHl1aYpRf8p2 zFAWgmR`>BofdTsHjHv(99yPa8*Rqeywd+iC(fUyj8u}G54 znSjr4f-K7>pCCdbU=ZOBXlam-f;f&Bd$JhfZ%YE$g?D#n{r|g2k{Rwg{i1@N^(R6V x(-1@XAxLBnv=jC}Q*e7lb$xY(L)>0v@CB&rlsO0&IHLdn002ovPDHLkV1kqktsejY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/74.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/74.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9534d765da1cfc5446e3d14b0f2e76dede62e0 GIT binary patch literal 407 zcmV;I0cie-P)KF89)c~GOOHpr6TrG&uicWYY6NRffCh|Z zpp!+CWX=SjX0=)kK0$;|z#!rs(9$3u1@rlQvL}-v{~C@3f}ZcKrMWXWz^AR1S$NI}U7a+2I-lW(L)7D$xhG0QOX z=FKqc&gZjlnq~%kUDp{7hlAO_;vA1*82mVnGaQdc|KaX^RaG9LHwW21<6joy91g z`8fK3jf&nqSOU_qD9}0l1_>%n0TWgWr_;$KQ*poFTUFj6mt843K#PTYGFI-2Pe}3&eH2?qr07*qoM6N<$g6>bU{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/76.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/76.png new file mode 100644 index 0000000000000000000000000000000000000000..aaca0322632139924a7dadc6e1abe7decc833548 GIT binary patch literal 393 zcmV;40e1e0P)3CpRd%lBkCH|fhmy~7&3%pfdL5#DOoZ^EKE!+jC{k3ewH3RpjC&54`V++ z8=t$~ZoaPT1@N_PYbc7s>|b$?$2g9Dnx+MsrtzPz&X;Am@b`Uh@chqkWBKrR}GeA#XKI5 zpBbD^C%@b6Or|8Fh#*b9>$**gs5b&w&*!sQl2wf$?FrC;u?%#xNRrH%04k+vI{O3> z8Ucd{cR)*neAXaE^%d3i)fEo0zRKVU_Ii?!EEOvo00000NkvXXu0mjf2JW%j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/77.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/77.png new file mode 100644 index 0000000000000000000000000000000000000000..082d8a29f447d19fc5c6620ef6f2030c13a9441e GIT binary patch literal 406 zcmV;H0crk;P)YV`A?RM*yWL2YQ?FrC;u?%#w zNRrH%0MukzcJm1$bOHtu?|_yD`LwlIEGBz08RBnC0@#HlNxc7m7fCYXU8i4E(6jzT ztl~DrSbhu=SF4q`6Zbz-aDPR0eRYLn++Stz1@r!tyhybe)&Kwi07*qoM6N<$g2K(R At^fc4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/78.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/78.png new file mode 100644 index 0000000000000000000000000000000000000000..7d74b5a627681b6e601d2aeb21e89fbcf9326a6b GIT binary patch literal 405 zcmV;G0c!qbC+DbuXODrSVWKOT=0;A`8~kmtGCzv3K^VHo`NdYz!ED*x{8eNhw>f8X~O4jju)k0m@CYg$d!@;WZ4!P`10W1nYGRe2SYOo|L zrfHg=86-*Km&>JpeRlrk$yp$Z2-4KMuCwop$L|;{>Wu)_EX&N2tZD>lPk;uDWuUV~ zl4Q;VP-(l}jy^$zM!+D#9njJspSD)3)of2@L;P(?0J{)Hk@f%YB1vYr>-38Xde)x^ zRg6On<%b|~y;P$(vlJi(r1@6zowIqU*kCJw!n_Vl#$ zny%}lX_^Dz8^=*mmZjRi;tU?^y2`d~2i$Hq`7rlVRn@^i&$Gq@AW;H1mt|4#9LKSI zeiMXYsP9Z-G1y%J9Rx_~x|VlyCrOg1j|FTT2!OutRWhpkzOR;TKuMNm8pC+Z$Dj|e zp`w@vO@MS*DB#)t1`?=L1(+~fXxmmLqhe7MS{3ggr@bfu3j-h-$>&}1u2 zq-iRy>&n}+k=G}qfl!1XPJNoDON&si1YphcTrHAW?d8!3_XOa8VKLClB2hBV2!NU> zigq7CLM6Z;>>c3JKt9^?Jnyn6mm&VPBmj27aUAXc-$kNKd)Lt~RG?@630uWJL|eWM tBnCmC?b!Vv6r8UpuP?8#jq_Coz5u6MoC4)CVQT;Y002ovPDHLkV1ftetP%hK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/8.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/8.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/80.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/80.png new file mode 100644 index 0000000000000000000000000000000000000000..c909c0c44db39861b420d6ac68b18bca2d78820f GIT binary patch literal 379 zcmV->0fhdEP)7fULoZ?~KIR3OBG0F2{klBpiYv01f&l045XM)AzY(Fbf) z{C;Q&Wm#HP-XWL0D1b!)NGAE*s|HK5Vy0>OnStbC zB@smgY3j?eTv|lE5x`m$g;|nSjUep_(15WF^s-2j%$WcxrD?kR1Q8kmg9vv(OM`qA zL{W6vlgki)TN1!7@GI&6-$jzlaM!~{(w_)b>_ZIYhaizT&`#L@LBaWo>iX&mhd5tl Z@C1njjtyP#|9b!c002ovPDHLkV1iL{sjL71 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/81.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/81.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c70c1b5400d079585a89e38d16d9d35499ba8b GIT binary patch literal 392 zcmV;30eAk1P)ZuF3`IxTBv(qCIyFi`heSa^!)~)%AR!?^LxE_hsAwoTK~9ppO!6%K%>ao~d^{NY z``dV2+qS-{stxcB!(g~xuV(*>b3B%1@$0&7P}jA8eRTeIyKVf_G+8`=#0YTC^K8&L z%QFA=ChAwW`=rGGg&pXa&xR3OBL0CZhvlBpiYv01f&lA;iZKr+euUNu;f71Q_q z&kQ6FD~Tu~NK+rj(R+9DAMU|_eglhoBY^dMKAR<3)gaZL01X(+Ko5%~$(#v5O`4{6 zpCCdbU=ZOBXlam-f+&g(dvX}!Z%YE$1%4&{|GP+%8SZ+xNct0@iu({l`5{PT4zv^Y mzfrKiqPo7i!Xfro8GHeTh>$wL+&H`d0000;p(cYD$V%SB290DZg^Vz>VIG?7e`BWgpiU4$7XOgKNMUh#xfs!oCEJpFn z$I%CDRD6GSmVk6D3Um&?L4rzCz=YL8(=;ZTibYXaRo)?&-6?=Y0Z1l!+p7jkvSRwa z|Cxd0VI>ho1ZnESFzi}Hy%E5g=eb#uRqeywd+iC(fUyj8w@8xAnSjr4f;f&BpCCdb zU=ZOBXlam-g2Umk+mqc8e_Im3F5KLm_5bf8NoKg~^ot65)}IJfEJFiX&mhuB_a@CB3`kqU_AH}C)e002ovPDHLkV1gvLut)#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/83.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/83.png new file mode 100644 index 0000000000000000000000000000000000000000..030d5645f5aa6bcbffd6947281fe8e2fecabbe7a GIT binary patch literal 396 zcmV;70dxL|P)ZuF3`Hl|Bv(qCIyFi`heWZ(HtaS_frNwv4F#g1q9O$)C&)>1mr0(bzZoD=ijN0l ze}5Z~YnsNFWw`>rzV8j!>(%UEagN74&wg2!6{@Q8FAvV=dA{`nnJ3P3W++g>$Tk`>c+ z-Omgp4=af%B1lsohQWJx@E`8pe|`gtdLw}Kd_J2cS=9*Ao&XIP%RqOFB*~l!pi-Kq zH=iIvBVZ8W4rpnRkAf(Qc6+iL;%`d=*oAj@XZ`=XNRk=uI{l)8p7kd}6}KUV@ZuF3`IxTBv(qCIyFi`heWXj4bbcsNJvP~P#_wrt!OAYK~9ppO!6%K%>ao~d^{NY z``dV2*LA+G>kaUY<7l{CE@uCVb3B%1@$0&7&@_#IeRTeMy>9%s+s)zuBu0R9o@ay3 z=kwXWJvpBwiM=aH#jtk;atM%ARpnn!&SzO>J{1VDApm{fn`ElTacov?pd`<8i%~rD zar6Nj72ltoB_JJ(0-eKekf72OFk!XOwyjB~Vp*0}m3PQx4+>yW0Fp`G_o~5?te9aK zerDj^$$z*9v!CCVKok+AsZY~%Xc6^B0BcbcW=U2xg0v?<1I9AY!y-vCX9B2{rs>@$ zh|mZaM7RT58swuOilW1w9ESMYk^pvrUrGP}E|O%1yB;o*{zRzaKEzOd2ojkC?S%br k6zs34uCK0ei2YRtUoe4?WGvmFIsgCw07*qoM6N<$g0cgu^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/85.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/85.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bd746ff5f487e079134131b7bfaa2095785698 GIT binary patch literal 393 zcmV;40e1e0P)1C@lV!=lGfD*)PkoLDMw;_0jpVEH~%lI9fh{#0WT?rpch^ z>-Fm2o}9m2F7~b>H6yMHbRa-dRh54^IiDnnovA^H4FTx7&Lq?Qd_G&$7$`~8)N+)M zKaM$IqvQLtvjU_OQK0AWKS)q%3UF8>+-^6MOvgOWtt;=4D;^ZUq68#Uyq{IZQmmZ& z{r=;DcPIbh9xQ%-M-ov)l3X8#Va+3lhI#S0UuEzGE(Ma2Hk{Nq00000NkvXXu0mjf#CWSc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/86.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/86.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd64bb88e6e0a23a00423cca57e8a3aff0ac837 GIT binary patch literal 395 zcmV;60d)R}P)ZuF3`Hl|Bv(qCIyFi`w-N;f4ZF=!AR!?^LxHxTq9O$)C&)>1mr0(bzZoD=ijN0l ze}5Z~YunaWRkZ@X>-B25TrOt+igP^XdG^b)tWejre|d1eD2kPT97l@>kQf2ZX_^c= zr)lb6ADurQkM^!46~o>X$RR*dmZg6_IG<&i`BWgpiU4$7XOgKN$FW(pfs#DWEk^Oo z$I%CDRD64KmVk6D3Um&?L4rzCz=YL8(=;ZTis$p$s`3uG>`nnJ3P3W++g>$Tk`>eU z{m%@%JNOTGZ}#)s5{M##H1%N^b}gdb2w**(PG(6~HAuB5Km*1y(A^?QGG_u%lO)N_ zCy3Ap7(}=OS{me|Ac~^hp6rJB+mZlw;oaR?|NkzMWQMy=zo?*R{fSV;ZHS@#5F|1O p+6nt#DcD|7U0+?{5ZkK^z5qLzlVP=CbkhI;002ovPDHLkV1lOmsP6y( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/87.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/87.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd24dd285a62d12c922cc0de8c779045d6418df GIT binary patch literal 396 zcmV;70dxL|P)vjnUYaiI6`H$-r04w$f7xLht~nTmOyTUEXhSKK*3MFcF9yzNzkC0U%l z?|)|C-NApjdyAjn5h9KtY3jGzZQ;Qo;@$*M&9clQ$*KlPdjd3IA_Ltmk}UHMflBA| zc{vj#XaWo(+yN~O_HhtJ(QZ$6L;P(?0K4$+?yUcR7fCk5U8i4M(6j!D(8V&u(0&LK qnFH;F{jVHsuc)rCu5gI$RR&)<9F>lRBn&A40000yr~8N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/88.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/88.png new file mode 100644 index 0000000000000000000000000000000000000000..8da7c7e33a263d7cff333a3f7fb763a4492fded9 GIT binary patch literal 396 zcmV;70dxL|P)XehZvVC;L{CiV+tFIuH=4s>;8+JD((povA>Gl>q3v&MZ^?csyEE8#qbR)HvcZ zA4eakQPI1DC19P11HFg8A%aVDz=YMp<#I90RLt|-s`8Dv;?4moB4C;1ZLbQ{V z|1*QPC+A-toW<8iXG9!9($sIa+rooG#Jvfinq`?ql2r|o_5^6aL|D7fCk5U8i4M(6j!D(8V&u(0&LK qnFH;F{jVHsuc)rCu5gI$RR&)?V3ku>V$|FK0000ZuF3`Hl|Bv(qCIyFi`w-N;f4ZF=!AR!?^LxHxTq9O$)C&)>1mr0(bzZoD=ijN0l ze}5Z~YunaWRkZ@X>-B25TrOt+igP^XdG^b)tWejr|8V!dD2kPT97l@>kQf2ZX_^c= zr)laxzX^`VqrEFh#jrO8atM%=W$EADozJq&d@2xPMF6_4Gs#qsQ5>%Q3Cae~krZLG>JfF{2m3PQxcM4!p0Fp`G_Nu{>teC#< ze`fIZ{>*<5x{ynoy?M~YLIGAfCh|Zpu0tqWX=SjCP|W; zPY|IIFo&1J=qQMwWSKRf^c002ovPDHLkV1n7Ct(^b> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/9.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/9.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/90.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/90.png new file mode 100644 index 0000000000000000000000000000000000000000..5c58e2222963cbe48f958ade9e62f28bbac13dad GIT binary patch literal 392 zcmV;30eAk1P)5g+41_no&y_kgNv?PK%x|LhCO>c z9=xvWI$ziI2AqxKXt-Q17XQj~{LJ(0mu1XIW-vY7k;W0Q$Z+$#jq7*rLWjNuKAHqkQ~v z%mEu6y?d|%q!Uq~=kPyBP-zNqSR=G;Ym(`BKA){C?~p4V6u_bcBvZVfRmM`RoM9M# zJa~I{{^ikGe0_43h$52Y`t^EU^T;8h-UwhVioznr>c-646Ci_$7aZ3`^5= zJrhJ|1Q-$SfR+aND2SryuqOu-e_Im3F7PRt|KCND%y8GkMbeiDRjek4@VZGsz43_lDe+_ySwvgnwn1qLTm^?-}fe&>Tw*KRU0VDvdm%>&wLzx zz(z&y9xMUrSQO|SeuD&+rho~ng|6#NG8K!Wu&TU6E_+Y_ivo~L^1fFMmSn|Tuh*X$ zygfVr^61RIJ~<0S5kZ>zFbszlQEvpW=6PXyM j{T0>q)fEo0zsleXMEjb3L|ZuF3`Hl|Bv(qCIyFi`hqML7Hb4Uf64FZ0Y_X!*ii#~LIYCa6yG-&NeKIVGQhYoZ z`}^B?T-SBJX_^)A^?h$B%hK#$agN6{O@5x|6^_TFe|Pu3s;ZTL7zT?6kQf2ZaU2ag zr)laxz6g>ev3Dh@7ho1ZnD*%f-JvIsfwD{OjYlMZFQgn&-J$l2wf$?FrC;u?%#xNRrH%04nYG z`^6`S&ZuF3`Hl|3GqqM+Djp@9MkX(ebV&^A<5q@d&kIZ5s^$+Pq~10+iE@nG!l zZ{u-Y*ZHPtHo$kg-3(<}n*A%z@mQ9{uj{(O^?LOm?$K9Owee5WWbptJBfvS&vq9%9 z%lzjzL6Ri)t|S%1-WA9pKvLJWe|Hc5d_J2`1ww2HK;QQ!nd)&In^hYqxm+$5qj=`y z=mRz?dUvt}q+?N_bNCGsRGI=NtQOj~HOW*gio&Y$4!P_>0W1nYGRga1HCU1rGYrGe z3?vULi6|mSQy<6i&?4%M0M@$h|mZa zM7RT58swuOilW1w9ESMYk^pw$<>ajYe-}wI!(FFeRM4~jM5y9E#87?+5}5<-g#B+6 j?60Vwhu10)Thg^2202T!xndEJ+8Z60*8HV9! z29k%BL=+LEsZZ17-=3X+d365u>D!{-2w=_g+$_ne2C4Q0Xuwzox?3bk=1c%;k|eqL z1Q8kmg9vv(OM`qAL{YTclid)1TN1!7@GI&6-$jzlaM!~{(w_)b+=dv+4?!Yxpq;S) lm4fXR)%DdC4zaz;;1llUnx`ztai0JH002ovPDHLkV1ifvrIY{w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/95.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/95.png new file mode 100644 index 0000000000000000000000000000000000000000..8c294a77ba6b1e3445fd54b42f3e368b970dd5e3 GIT binary patch literal 375 zcmV--0f_#IP)BXs3`N=Yizplk0)YVx2oe$!FbIM{p_oAO1^bfy%iB(q%O0?0;?hTHZ*NOqFbsoh z+x7x{^E?}>sxtdmT)<=BcXu4e1zp#uT`;5+lI5ZJR;oG)>*-H$fc7 z_O2uq!=4J{5Flxq#=QqGF3U3Wseq3Q0T{>8BvU<#BC~1(C3&7(jN+M3Kp(JC(FJdo zfOIShboReNf=W}sgw;ad_a>Q&Wm#HP-XWKLD1b!)NGAE-s|HK5Vy0>OnStbCB@smg zY3j?eJX%D(5x`m$g;|nSjUep_(15WF^sz{i%$WcxB}sDn1Q8kmgYb7iOM`qAgkkvD zlgAK$TN1!7@GI&6-$jy4f7ks*(x32EoI~{G`yi1y(2n2#MZx`w>iX&m`?z0a@CEE? VoYYAb5XJxi002ovPDHLkV1hNkl9vp(s3lo}z_1t)BqSuPL69}8P#7fNa4x?lj~kY|oOpC7?dxml zxZCaK+qT^S-~E0!R8?j6uQkeJl`OjD9>$=|gr)jcy0ErRcoafn~bCzZP z^yYk;ruMER6~k@{Rsy7T$$>$;u+U)Obp;K^L1UX&M%jXiX&mhq%AW;0yCDk?Ib!X-xnC002ovPDHLkV1hlCwv7M) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/logic2/99.png b/src/main/resources/assets/rplogic/textures/blocks/logic2/99.png new file mode 100644 index 0000000000000000000000000000000000000000..db09d08b910050ac93359e28445eb2be68d4471c GIT binary patch literal 403 zcmV;E0c`$>P)ZrE5Jfj}k}IW6oz^IYE08E$xG^-QKte)-#s#9GqH+qCK0!{ByKM4C`ecDbDL%6d zGk^XJv#xDhUscr%`1-y#oK7dRf5kZ-*Xz~aZnqigy7n&*&KE^7^N-_b@c7c zF^XqCjy_Q5>%Q3Cae~krZLG>%=6r;@(#J|N&zeiKr+e8UNu;f z71MRy&kVfV_z!n)_Ve2kh$4bC^Wss^d{1Zcom2D(}# zN#;xdYSJ{Fe1Zs#fI);iprt`R3Zf`l?a6A0zby%17v9~S_5bf8NoKg~^ot65)}IJf xOhXLihaizT&`#L@Ou_Ps>iX&mhge=^@CE)vl;^b#cr*Y2002ovPDHLkV1mBawEX}8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/0.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2a20406a2e130e35fef34bcbd3462e7fefaf6b GIT binary patch literal 271 zcmV+q0r38bP)Ja8)FFW`BZH=DSg z3+$VAXsM5{q}9X+^6z&-0(bZd^SpivoPuH%DiHZ|%(qxgR+S V^auO{bAA8-002ovPDHLkV1lXEaqj>C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/1.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/1.png new file mode 100644 index 0000000000000000000000000000000000000000..e27a02f68312d00dde80e1546233ccdaef4861d0 GIT binary patch literal 346 zcmV-g0j2(lP)+V%K&0Lff{w ze(p|^B$2wVbeA(6=XxALt5*!30=1T)~2fAVdO7JP_j7D6@F!r?<=^FPnlidE)AWDzRB sZdX_XARDm6svx|gyuQ4`7U5L}z6_klr5O~s)c^nh07*qoM6N<$f}<~$TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/10.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/10.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/11.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/11.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/12.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/12.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/13.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/13.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/14.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/14.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/15.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/15.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/16.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/16.png new file mode 100644 index 0000000000000000000000000000000000000000..3590cad1ec395f1f8a8bd5a3504ddf885b708c2d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J3L(+Ln>}1CnO~N@K=;GZCJ$? z5+43Pen-K>|9^jf|8HOV>dODu*Vi{2cJK-@pKQGHz=UB*!_0$%9e4k4HfZ^uo_c~U zSwLEaZ4&d!gP9B`#LU`u{Vx*g{y+Q0+h6AoZun)demKtH>^TE&9rmE+%M25O9k*>X zQ28@`;tGc37Hy#eMGB@BybL#4HcLt#j%mEkFyZrszx_GZ9(?P?9T<-sn!tA@gk>9V pnl;e+<|{Ln>}1CnO~N@K=;GZCJ$? z5+43Pen-K>|9^jf|8HOV>dODu*Vi{2cJK-@pKQGHz=UDRfwQJR?2Vg$*Ne4%_`ind zW&%%A^AU$41yc)NhMPhn6941}1CnO~N@K=;GZCJ$? z5+43Pen-K>|9^jf|8HOV>dODu*Vi{2cJK-@pKQGHz=UDRfg?BG?Vp|fp}1CnO~N@K=;GZCJ$? z5+43Pen-K>|9^jf|8HOV>dODu*Vi{2cJK-@pKQGHz=UCmga7qE`{%B`UT=Q=!T&Wp zHxqc0nvXaXDVSRDGTcncefsPEW#upR0SSNV`P#1jx0L+WbW_1_f{X{RAG3qs*H2u3 z<;7}B9)UbMGCuERiFK(<4~{c*z* a7lzHBvQ*O^Sk3`Dn!(f6&t;ucLK6Up7+Yrm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/2.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/2.png new file mode 100644 index 0000000000000000000000000000000000000000..a05485ce73b111de82d1cf90ea8a98f50449bd20 GIT binary patch literal 347 zcmV-h0i^zkP)ZuF5Zffrq@tnV16%iqynoB+jr-yM9;^W46} zhZEsHU*a&VQ2`4CNUEx`pQnN>%WPSeI6!eB0Ccly8dvfAB*C-VAdpXh50yBMqrWf= zgRd68tSAcWy3Y61sw+UksRcA}iq_MxT>($w&Zh=T%=7#jB90D?%;Ih;d$B^j6Oc8X z%o9;-0P+FB73oz5{sE_k%3kOnUtRzJ002ovPDHLkV1f^!m_`5q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/20.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/20.png new file mode 100644 index 0000000000000000000000000000000000000000..229d4cce7e46f9cc57111f8b3232f241f0ed8002 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar-fh6A}`B_$$hpCR}L< zWS+qL;?0{s`%_O(`yakO?(hE>7nKdzHaaFL>^%6Im7yp@;6(XriD^LH44$rjF6*2U FngEx+B})JR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/21.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/21.png new file mode 100644 index 0000000000000000000000000000000000000000..dddddf414e4dc5b379c5e531d2f49c109a76e750 GIT binary patch literal 233 zcmVb3S$hjvYOVp?UwlV<>7CEnM-xv$GGo0kdW< zgnI$x8j$As^Om8gX>aTOUsO~+nhtOo(A?Asj;4Kkj{xI;8#u&4fkw0e`FSPaI9|A5 j88E@j0!J4##4#`c`Fve>*Jq%=00000NkvXXu0mjfMt^8J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/22.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/22.png new file mode 100644 index 0000000000000000000000000000000000000000..681cbb69f127765499b40e2ac084ba5039da5209 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln>}1CnO~N@K=;GZBS!d z6Sec>|Et>N|Lk}C|MUN>H2;A&z0ze1R?IXjJ@^0DF0nUkF&6cI|8M>EpXY=`3dg2d zYop8l&o?c$D`W1Hwe3zk@UQlGz!jaS9gphM)8)&U)6T|ld}lggs&Mx6b6w}a%lEGR z-oIi+jfw07qXj!x3d{KZ{wBwG?7vw-M>A7z2J@%SUIz;I6dW{4Xqw5|rGAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/4.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/5.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/5.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/6.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/6.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/7.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/7.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/8.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/8.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/blocks/sensors/9.png b/src/main/resources/assets/rplogic/textures/blocks/sensors/9.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64e274d4cee9d40a75e73962bd6e9b3d1c0b0e GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3Z5>GAr-fhPi$NN-=8y$LGb#k m|C4*&c_mB}t~4A>Vqhr0rT6n>zd<}uErX}4pUXO@geCy=wi_7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/gui/countergui.png b/src/main/resources/assets/rplogic/textures/gui/countergui.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfd9071d80f103fdd1bfff536c52d9b3f6ab824 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn`1yx4R3& ze;|u_m7cCAkmfA#h%9Dc;1&j9Muu5)B!GhKC7!;n?6=wE7zOlXYM%jhGXD2;aSW-r z_4e99-opw!4uRIMLLw(Q-e5kq=y;eUgYwh8(&_>y;#2;tVJJH-Y!;tAv;Kx%!_1|E zJ9zA`NG4DDx9_uLgXQw@M&GDxLBWgF`ad~i{&OGZe_yndNr1rtaseQwK;t-GG7{mVUNrKFy~Pr^I)iMPrBJN=Z)0pw&B1_1_YF{oz})J3np z-aCE%Ls!R{Gq%rbjx;uWwr|K;yOUSL;8;h;iLSlxXXl+~d|J!_47s5L{`8qYk5pdF S>2z2T0#LT=By}Z;C1rt33 zJwr2>%=KS^rm}guIEGmGpPjHVtHnW}OgPWDI0{UtOiYOsYmf8qsky&= zS!Tuk-XkWyO)N|yk<+Fu)13dRQtm#J!Mh_0#|!OLcdZM)y)8yb>eVi_>!m-{w&i~Q zuTisD#P#PcRu$L4H$pb|40!fPYI6(NUN)Ji;<-J)a7qHVhl%gwR^CGP4|+O_R%zv% y@FdUY_~HIR!sC#^AKQu^ozwNq|1Ep=GM{t${v~YR!%e_oWAJqKb6Mw<&;$T5Ri*_1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/bundle.png b/src/main/resources/assets/rplogic/textures/items/bundle.png new file mode 100644 index 0000000000000000000000000000000000000000..804c1f49fe677a8943480054eca19af7b5723bf5 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rfPY*IEGmGFP*S4t2sc#LH}-)l?d0{I|~E6q%>k%_-={_ZsFS{8I$c; zaM7^2dCH>*frCr+_#|U~Y0LiN{n;M$F|(hZYo0ao*T|umdo_Td7_E0Wl_EL(VuT7y3X3Bdui?> zjex)@c?sr0(^T!3WzOQs^+;FY+9|G368pS+%dQz7pVn!-VCCpyaoi9t!o$W98v4Df h>EeNSOM`|F%=Nq~^IRp)O96wH!PC{xWt~$(69DNcqapwR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/cathode.png b/src/main/resources/assets/rplogic/textures/items/cathode.png new file mode 100644 index 0000000000000000000000000000000000000000..663b68f6dae8bb7989db8c375f69c380bed49e50 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rb>FcIEGmGpPg{ft2IENjXxy+;wtfs;0KG$1ZPRR3Y0flJG!)Z6lgYa z2S&MQbZDEu`&3vpbH<FDtjMPsXaUGtpuAlYp+?;h=T+2jV1)DFM z1m6FCrBv4T?)^(we`-35yEoO`U%qP9j(q<|7JQCOj6u^>ZS7Z-6j!=!%l$0YP^iXU zIdA*q8OuCNV>i2)9VtAsdU@uqhK|>}WPC5%ORODx!+c#fft>-444xzf6)qtuxGiN%PkI12ociJ87?)qdvxJ6bB(eb+Mjs;$$n Q0)`}mr>mdKI;Vst0NkmhKL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/chip.png b/src/main/resources/assets/rplogic/textures/items/chip.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0afa86e3f9ec8f515907d43f67cb78c112b79f GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rfPb+IEGmGFP*S4t2sc#;cv488@sr=aaoz5xvPLHi}^vTRTiC#C1boC z3I${4uoQmD{$;&=?{vG_F1}vIGJ^MPpU29HuYNv#!TINs|IS`^nD@LPXRhLIMzwRF zc`lp0bqixu1G>sJut9-Cp-XATvYnEVOxKfQudB@CV-K+8ySIO$3g@h4k**pOmT7kG z$h-f2LaHREy#1%!A31E!J5N$EDVJT?@Vv4?kY_{3B8@FpxkXlut5#ju_O>WcfJJ0s zL+P*K+#4l>6d?9$7a#g-^>=xNbHn+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/plate.png b/src/main/resources/assets/rplogic/textures/items/plate.png new file mode 100644 index 0000000000000000000000000000000000000000..b6aa450f8cd9d484159e17c683350355fa01de52 GIT binary patch literal 497 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Ci1L_t(IPrZ@5Yr;?%#c%0jDYz&UtWau8 zJ49=#eMBK$DhXMP(ikZi>m;J$A~2xp}ji9P3lF200^vUM|#vWTVN|JcS4wd8;u64)hdR=AwQE%)8tkZWpxV*>2|v) zm&=GpgS?HJ$bOJ!T-SvtitBITh2(NM4o;_2WV2ar+K}!D{1Em;zl;X+`TU}h;4eYH nD1=`7$Dm)bEdLJtXEF8$2Q2g`MnD(l00000NkvXXu0mjfM##%c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/pointer.png b/src/main/resources/assets/rplogic/textures/items/pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..7e25601dab480e6a0ddcb10d19fa9afcef500756 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rYd^6IEGmG@11ZqtJy)MwYLA=-7N}SYwb(awHg<7Jn$=&4KZ*kcyCoQ z-Af^F(}mdDIs1GpzsAkFa^Z`5StuSPj&);ci~#vn47#&J&irwpw#Nn=Rvif&Qa+zqq=OGR;2AcGzG;!!;F8 zJC%9Q6Sqbw_9ctBHtL+N@VzXO8Y$Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF009h1L_t(IPtDLVYlA=(2k;{yS-WJm(2%8+ zkkStB0ma2b1d)K?qJyB|qLY(@laq^!lZ&I@@b%u2yDGLc%~1N_aU9<7|IQ=-zp^X? z?CbXS5^x+x7>42Y5CQwXml)SHP2uvSd>=A}0^us4vn60`2)wSzG9*b7IkD?HzQ%DZ zA!YEL!TpLrp6AQoaU2IQ1YsD4Gx)}!!k}&2P*s&2-k zL;QyDODxJT41UnEEIASJk8oNT5=GJP;j}bOyAS?x5%K{TjOL&5Rp3wn0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00B5jL_t(IPo>bmYJ*S|2Jmd1I+aRranfgS z5xZ28iV^~DQpwOEigXB>iW%GlB}-_AW+qT0CC~mh~WLXATmZ2yLT-WVH8sNBCRTUQ> zAMWt-e2dTbAyiexa=C0F45VqwMOt^W*IioFlXaA)e=PXhS-qqA0fjisLvuI2w(b8>xI= y6lnnzLZ;K{#iB?jK%vLGR21n2{+cTR41NGU>nWE{9-Qp}00000#LT=By}Z;C1rt33 zJwr2>%=KS^iVk?XIEGmGpPgXHcUXbPwOGfG;nbv#R^6bqww{=VnYP@*+{)%leyv!x zZq~NU_Epn#PCxkWWAvxq;}yE>bO5O9EtjEdBWN2r|gf% b5^dbY+xP>!x0J8|{lehs>gTe~DWM4fq>Oy9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rplogic/textures/items/wire.png b/src/main/resources/assets/rplogic/textures/items/wire.png new file mode 100644 index 0000000000000000000000000000000000000000..d11dc8f2afb7556977a5d1640cc4543b64cb3f6b GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ihg;zIEGmGpPjI=t2scxRX(R|e+IW=&gzK`N*!|()H@<>MRX=C6*IdP zk(u~X-mj?L=h37MvzKt}G_ZMc*3#JS>p#!SQv#Ns|E>IBla9&x&wqs&j~Ch;j=dfj zIj!FNnu0>(XPe~~eJ|4&XMA6o=RHZq(qE>n@%*-2&C^D0`|L$p6Fovh3-3=o^4X>- zWtLjjtTyRy?iYRsJ=vv~&nS^3DZ+BlHR-n5)zY(*-WG-)=zF|@!-+9)-}_?8wvW}^ z9$kwPIK!rw3q&}4`BLjYYgz36qftx(LZ>(F*r521;a-dCvdkjoI!868f8sIhlQg>I k*sotK{cHK*Xy7Y`mB~NP-Fw#}3Je7XPgg&ebxsLQ0O1Cl-v9sr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/lang/en_US.lang b/src/main/resources/assets/rpmachine/lang/en_US.lang new file mode 100644 index 0000000..0019eac --- /dev/null +++ b/src/main/resources/assets/rpmachine/lang/en_US.lang @@ -0,0 +1,70 @@ +itemGroup.RPMachines=RedPower Machinery + +achievement.rpBreaker.desc=Build a block breaker +achievement.rpBreaker=OM NOM NOM\! +achievement.rpDeploy.desc=Build a deployer +achievement.rpDeploy=Steve in a Box +achievement.rpFrames.desc=Build a Frame Motor +achievement.rpFrames=I Like to Move it, Move it. +achievement.rpIngotBlue.desc=Smelt a blue alloy ingot +achievement.rpIngotBlue=Now in Blueberry\! +achievement.rpPump.desc=Build a Pump +achievement.rpPump=I Drink Your Milkshake\! +achievement.rpTranspose.desc=Build a transposer +achievement.rpTranspose=Dual Cyclonic Action\! + +tile.rpdeploy.name=Deployer +tile.rpeject.name=Ejector +tile.rpfilter.name=Filter +tile.rpframe.name=Support Frame +tile.rpgrate.name=Grate +tile.rpibutton.name=Iron Button +tile.rpignite.name=Igniter +tile.rpitemdet.name=Item Detector +tile.rpkgen.name=Kinetic Generator +tile.rpmanager.name=Manager +tile.rpmotor.name=Frame Motor +tile.rpmtube.name=Magtube +tile.rppipe.name=Fluid Pipe +tile.rppump.name=Pump +tile.rpassemble.name=Assembler +tile.rpbafurnace.name=Blulectric Alloy Furnace +tile.rpbatbox.name=Battery Box +tile.rpbfurnace.name=Blulectric Furnace +tile.rpbreaker.name=Block Breaker +tile.rpbuffer.name=Buffer +tile.rpcharge.name=Charging Bench +tile.rpregulate.name=Regulator +tile.rprelay.name=Relay +tile.rpretriever.name=Retriever +tile.rprstube.name=Redstone Tube +tile.rprtframe.name=Redstone Tube Frame +tile.rprtube.name=Restriction Tube +tile.rpsolar.name=Solar Panel +tile.rpsorter.name=Sorting Machine +tile.rpsortron.name=Sortron +tile.rptframe.name=Tube Frame +tile.rpthermo.name=Thermopile +tile.rptransformer.name=Voltage Transformer +tile.rptranspose.name=Transposer +tile.rptube.name=Pneumatic Tube +tile.rpaccel.name=Accelerator + +item.btbattery.name=BT Battery +item.btmotor.name=Blulectric Motor +item.coppercoil.name=Copper Coil +item.finecopper.name=Fine Copper Wire +item.fineiron.name=Fine Iron Wire +item.voltmeter.name=Voltmeter +item.waferBlue.name=Blue-Doped Wafer +item.waferRed.name=Red-Doped Wafer +item.waferSilicon.name=Silicon Wafer +item.bouleSilicon.name=Silicon Boule +item.windmillWood.name=Wooden Windmill +item.windSailWood.name=Wooden Sail +item.windTurbineWood.name=Wooden Wind Turbine +item.woolcard.name=Wool Card +item.sonicDriver.name=Sonic Screwdriver +item.drawplateDiamond.name=Diamond Drawplate + +gui.windturbine=Wind Turbine \ No newline at end of file diff --git a/src/main/resources/assets/rpmachine/lang/ru_RU.lang b/src/main/resources/assets/rpmachine/lang/ru_RU.lang new file mode 100644 index 0000000..4836e3f --- /dev/null +++ b/src/main/resources/assets/rpmachine/lang/ru_RU.lang @@ -0,0 +1,70 @@ +itemGroup.RPMachines=RedPower - Оборудование + +achievement.rpBreaker.desc=Сделать разрушитель блоков +achievement.rpBreaker=АМ НЯМ НЯМ\! +achievement.rpDeploy.desc=Сделать установших +achievement.rpDeploy=Стив в коробке +achievement.rpFrames.desc=Сделать двигатель каркасов +achievement.rpFrames=Я люблю дигать, двигать. +achievement.rpIngotBlue.desc=Выплавить слиток синего сплава +achievement.rpIngotBlue=Теперь в чернике\! +achievement.rpPump.desc=Сделать помпу +achievement.rpPump=Я пью твой молочный коктейль\! +achievement.rpTranspose.desc=Сделать транспортировщик +achievement.rpTranspose=Двойное зацикливание\! + +tile.rpdeploy.name=Установщик +tile.rpeject.name=Выталкиватель +tile.rpfilter.name=Фильтр +tile.rpframe.name=Несущий каркас +tile.rpgrate.name=Колосник +tile.rpibutton.name=Железная кнопка +tile.rpignite.name=Поджигатель +tile.rpitemdet.name=Датчик предметов +tile.rpkgen.name=Кинетический генератор +tile.rpmanager.name=Менеджер +tile.rpmotor.name=Двигатель каркасов +tile.rpmtube.name=Скоростная труба +tile.rppipe.name=Труба для жидкостей +tile.rppump.name=Помпа +tile.rpassemble.name=Сборщик +tile.rpbafurnace.name=Блулектрическая плавильная печь +tile.rpbatbox.name=Аккумулятор +tile.rpbfurnace.name=Блулектрическая печь +tile.rpbreaker.name=Разрушитель блоков +tile.rpbuffer.name=Буфер +tile.rpcharge.name=Подзарядочный стол +tile.rpregulate.name=Регулятор +tile.rprelay.name=Реле +tile.rpretriever.name=Поисковик +tile.rprstube.name=Редстоун-труба +tile.rprtframe.name=Несущий каркас с редстоун-трубой +tile.rprtube.name=Ограничивающая труба +tile.rpsolar.name=Солнечная панель +tile.rpsorter.name=Сортировочная машина +tile.rpsortron.name=Сортирон +tile.rptframe.name=Несущий каркас с трубой +tile.rpthermo.name=Термоэлемент +tile.rptransformer.name=Трансформатор напряжения +tile.rptranspose.name=Транспортировщик +tile.rptube.name=Пневматическая труба +tile.rpaccel.name=Ускоритель + +item.btbattery.name=Батарейка +item.btmotor.name=Блутрический мотор +item.coppercoil.name=Медная катушка +item.finecopper.name=Высококачественный медный провод +item.fineiron.name=Высококачественный железный провод +item.voltmeter.name=Вольтметр +item.waferBlue.name=Синий чип +item.waferRed.name=Красный чип +item.waferSilicon.name=Кремниевый чип +item.bouleSilicon.name=Кремниевый монокристалл +item.windmillWood.name=Деревянная мельница +item.windSailWood.name=Деревянные паруса +item.windTurbineWood.name=Деревянная ветротурбина +item.woolcard.name=Чесалка +item.sonicDriver.name=Ультразвуковая отвертка +item.drawplateDiamond.name=Алмазная волока + +gui.windturbine=Ветротурбина \ No newline at end of file diff --git a/src/main/resources/assets/rpmachine/models/accel.obj b/src/main/resources/assets/rpmachine/models/accel.obj new file mode 100644 index 0000000..0b490a1 --- /dev/null +++ b/src/main/resources/assets/rpmachine/models/accel.obj @@ -0,0 +1,292 @@ +# 40 Vertices +v 0.625000 1.000000 0.000000 +v 0.625000 0.000000 0.000000 +v 0.625000 0.000000 1.000000 +v 0.625000 1.000000 1.000000 +v 0.375000 1.000000 1.000000 +v 0.375000 0.000000 1.000000 +v 0.375000 0.000000 0.000000 +v 0.375000 1.000000 0.000000 +v 1.000000 1.000000 0.625000 +v 1.000000 0.000000 0.625000 +v 0.000000 0.000000 0.625000 +v 0.000000 1.000000 0.625000 +v 0.000000 1.000000 0.375000 +v 0.000000 0.000000 0.375000 +v 1.000000 0.000000 0.375000 +v 1.000000 1.000000 0.375000 +v 1.000000 0.250000 1.000000 +v 0.000000 0.250000 1.000000 +v 0.000000 0.250000 0.000000 +v 1.000000 0.250000 0.000000 +v 1.000000 0.750000 0.000000 +v 0.000000 0.750000 0.000000 +v 0.000000 0.750000 1.000000 +v 1.000000 0.750000 1.000000 +v 0.750000 0.250000 0.250000 +v 0.750000 0.000000 0.250000 +v 0.250000 0.000000 0.250000 +v 0.250000 0.250000 0.250000 +v 0.250000 0.250000 0.750000 +v 0.250000 0.000000 0.750000 +v 0.750000 0.000000 0.750000 +v 0.750000 0.250000 0.750000 +v 0.750000 1.000000 0.250000 +v 0.750000 0.750000 0.250000 +v 0.250000 0.750000 0.250000 +v 0.250000 1.000000 0.250000 +v 0.250000 1.000000 0.750000 +v 0.250000 0.750000 0.750000 +v 0.750000 0.750000 0.750000 +v 0.750000 1.000000 0.750000 + +# 192 Texture Coordinates +vtc 0.250000 0.937500 0.600000 0.600000 0.600000 +vtc 0.250000 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.937500 0.600000 0.600000 0.600000 +vtc 0.250000 0.937500 0.600000 0.600000 0.600000 +vtc 0.250000 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.937500 0.600000 0.600000 0.600000 +vtc 0.250000 0.937500 0.800000 0.800000 0.800000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.312500 0.875000 0.800000 0.800000 0.800000 +vtc 0.312500 0.937500 0.800000 0.800000 0.800000 +vtc 0.250000 0.937500 0.800000 0.800000 0.800000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.312500 0.875000 0.800000 0.800000 0.800000 +vtc 0.312500 0.937500 0.800000 0.800000 0.800000 +vtc 0.000000 0.937500 1.000000 1.000000 1.000000 +vtc 0.000000 0.875000 1.000000 1.000000 1.000000 +vtc 0.062500 0.875000 1.000000 1.000000 1.000000 +vtc 0.062500 0.937500 1.000000 1.000000 1.000000 +vtc 0.000000 0.937500 1.000000 1.000000 1.000000 +vtc 0.000000 0.875000 1.000000 1.000000 1.000000 +vtc 0.062500 0.875000 1.000000 1.000000 1.000000 +vtc 0.062500 0.937500 1.000000 1.000000 1.000000 +vtc 0.140625 0.937500 0.800000 0.800000 0.800000 +vtc 0.171875 0.937500 0.800000 0.800000 0.800000 +vtc 0.171875 0.875000 0.800000 0.800000 0.800000 +vtc 0.140625 0.875000 0.800000 0.800000 0.800000 +vtc 0.140625 0.937500 0.800000 0.800000 0.800000 +vtc 0.171875 0.937500 0.800000 0.800000 0.800000 +vtc 0.171875 0.875000 0.800000 0.800000 0.800000 +vtc 0.140625 0.875000 0.800000 0.800000 0.800000 +vtc 0.140625 0.937500 0.600000 0.600000 0.600000 +vtc 0.171875 0.937500 0.600000 0.600000 0.600000 +vtc 0.171875 0.875000 0.600000 0.600000 0.600000 +vtc 0.140625 0.875000 0.600000 0.600000 0.600000 +vtc 0.140625 0.937500 0.600000 0.600000 0.600000 +vtc 0.171875 0.937500 0.600000 0.600000 0.600000 +vtc 0.171875 0.875000 0.600000 0.600000 0.600000 +vtc 0.140625 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.937500 1.000000 1.000000 1.000000 +vtc 0.062500 0.875000 1.000000 1.000000 1.000000 +vtc 0.125000 0.875000 1.000000 1.000000 1.000000 +vtc 0.125000 0.937500 1.000000 1.000000 1.000000 +vtc 0.062500 0.937500 1.000000 1.000000 1.000000 +vtc 0.062500 0.875000 1.000000 1.000000 1.000000 +vtc 0.125000 0.875000 1.000000 1.000000 1.000000 +vtc 0.125000 0.937500 1.000000 1.000000 1.000000 +vtc 0.203125 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.937500 1.000000 1.000000 1.000000 +vtc 0.234375 0.875000 1.000000 1.000000 1.000000 +vtc 0.203125 0.875000 1.000000 1.000000 1.000000 +vtc 0.328125 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.890625 0.600000 0.600000 0.600000 +vtc 0.359375 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.890625 0.800000 0.800000 0.800000 +vtc 0.328125 0.875000 0.800000 0.800000 0.800000 +vtc 0.359375 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.875000 0.600000 0.600000 0.600000 +vtc 0.359375 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.890625 0.600000 0.600000 0.600000 +vtc 0.328125 0.875000 0.600000 0.600000 0.600000 +vtc 0.015625 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.703125 0.600000 0.600000 0.600000 +vtc 0.046875 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.703125 0.800000 0.800000 0.800000 +vtc 0.015625 0.687500 0.800000 0.800000 0.800000 +vtc 0.046875 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.687500 0.600000 0.600000 0.600000 +vtc 0.046875 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.703125 0.600000 0.600000 0.600000 +vtc 0.015625 0.687500 0.600000 0.600000 0.600000 +vtc 0.328125 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.937500 0.600000 0.600000 0.600000 +vtc 0.359375 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.937500 0.800000 0.800000 0.800000 +vtc 0.328125 0.921875 0.800000 0.800000 0.800000 +vtc 0.359375 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.921875 0.600000 0.600000 0.600000 +vtc 0.359375 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.937500 0.600000 0.600000 0.600000 +vtc 0.328125 0.921875 0.600000 0.600000 0.600000 +vtc 0.015625 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.750000 0.600000 0.600000 0.600000 +vtc 0.046875 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.750000 0.800000 0.800000 0.800000 +vtc 0.015625 0.734375 0.800000 0.800000 0.800000 +vtc 0.046875 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.734375 0.600000 0.600000 0.600000 +vtc 0.046875 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.750000 0.600000 0.600000 0.600000 +vtc 0.015625 0.734375 0.600000 0.600000 0.600000 + +# 4 Groups +g 0 +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 9/9 10/10 11/11 12/12 +f 13/13 14/14 15/15 16/16 +g 1_1 +f 17/17 18/18 19/19 20/20 +f 21/21 22/22 23/23 24/24 +f 21/25 20/26 19/27 22/28 +f 23/29 18/30 17/31 24/32 +f 22/33 19/34 18/35 23/36 +f 24/37 17/38 20/39 21/40 +g 1_2 +f 17/41 18/42 19/43 20/44 +f 21/45 22/46 23/47 24/48 +f 21/49 20/50 19/51 22/52 +f 23/53 18/54 17/55 24/56 +f 22/57 19/58 18/59 23/60 +f 24/61 17/62 20/63 21/64 +g 2_1 +f 25/65 26/66 27/67 28/68 +f 29/69 30/70 31/71 32/72 +f 28/73 27/74 30/75 29/76 +f 32/77 31/78 26/79 25/80 +f 30/81 29/82 32/83 31/84 +f 26/85 25/86 28/87 27/88 +f 31/89 32/90 25/91 26/92 +f 27/93 28/94 29/95 30/96 +g 2_2 +f 25/97 26/98 27/99 28/100 +f 29/101 30/102 31/103 32/104 +f 28/105 27/106 30/107 29/108 +f 32/109 31/110 26/111 25/112 +f 30/113 29/114 32/115 31/116 +f 26/117 25/118 28/119 27/120 +f 31/121 32/122 25/123 26/124 +f 27/125 28/126 29/127 30/128 +g 3_1 +f 33/129 34/130 35/131 36/132 +f 37/133 38/134 39/135 40/136 +f 36/137 35/138 38/139 37/140 +f 40/141 39/142 34/143 33/144 +f 38/145 37/146 40/147 39/148 +f 34/149 33/150 36/151 35/152 +f 39/153 40/154 33/155 34/156 +f 35/157 36/158 37/159 38/160 +g 3_2 +f 33/161 34/162 35/163 36/164 +f 37/165 38/166 39/167 40/168 +f 36/169 35/170 38/171 37/172 +f 40/173 39/174 34/175 33/176 +f 38/177 37/178 40/179 39/180 +f 34/181 33/182 36/183 35/184 +f 39/185 40/186 33/187 34/188 +f 35/189 36/190 37/191 38/192 diff --git a/src/main/resources/assets/rpmachine/models/machine1.png b/src/main/resources/assets/rpmachine/models/machine1.png new file mode 100644 index 0000000000000000000000000000000000000000..d69e2acab1b6241f96eb83c563fbb162bbad8d0e GIT binary patch literal 8169 zcmeHsXH-*LxAsl|K{$XV66q>nC_+?Fq=SM8NRVbIfuKm2(4_?kC@Mt|X$n%Lij*7? z1f&E+q!T(CN{|{rNJ80-@0KofLj@>&f2lK=3H_W{Nfa~qA z3nXGX9e1$E>aC-%#X7>ybx2If`XUN?u*B=FW#(<{X7BBL$I}jQzvG1QmciJ0pOTX~ zFLU9trW1Z00ECToG&M~8tQXVf+)%SVUz?N8y_l$5uC9!440_z|PSz=glv|dbYk%SD z8ngKgb6F`OzVhkAD^3s3ay{p94b3W!3l@+3=x71i>(0}wlM_FZ$wJD?V24nI-2=Lm zYUC8W#D!!otS1qluzGEE>`}WsiL2?GwaG@5u5Yu4!!jRAK!N>Tf71KGXF9$&a}*diB}=XZud)Fv@7zxK5&W3}zkv$&8nQAN zsF}B98FLc?0oLoq;AQ!L>N8kzSpFlhodeYH_U*Xgt~SXBYV8j!EO^|Ys}ESFX9j7u z?^g#uWTma_9uj>tn2?^X?XNIxf*QN}CiGkc&5V=t|FP&N^m5UW9daO6TqN=3P3G z^r4MJf1gOx<15I+w7518%+#0-Z4F$V&06NoN%*0oSV|L(idxK~@GS5KO#D2dxbZm< zqf}z)ea|s$J0F8*0bo5TF+!brSz(@%1&-O>Ys%qC2*aSpBY~GN`|CTAa;k-SNk(J4 zeBq4A5Q#N4&2?WwgLPB{x#XC?L|NO!M$Y6@7*T9{pBzK5x&X&JHG>ICV?KbMBfJ?y?~AcR~7@u@WIQgX!rzGH;ELCK8RtCVLa|;%oT*MfNTg##FvX@#bw| z7wdowT~;1JqMJ?Q;nNL9FVUT#Za!{c31}<)Y+_`h{pyuvM*U|8lS>{z4gWH5g_(vY zXe#))o(-PscBP7tFl`2p&~&P~et);z_1wfXga;v!tHP%$$W95C z9~~u0e70-!%}I?RrCYrs7fTy5Ll&$KxEVK;L(^icA^W_FYoo#k4_o>LGc9Sdi3)1f zFpWz9P{Jb|v$~;1IY;WBZjI^1j6U-Pie3-Z>Ao7!|HJ;(RlWkkv`Mdr=u1(7V|%rV z46O6hrOU#(LpvWR&&;@LFDB^2x$aeE2zxse%~gGsLp~z>#;^}!A6>YSZ@K8?ov)OJ z@y)BwsQ43CI>&WzX3w)FYF3heU=L|mMXB1|)iP4=^Qmw0@)gl4hjHx~?^x)1qyOQD zHs~K)oR!B<-$Ecj&_J<7QTB_k zy?k6)T=s*_`nrQx%L!4B&;wd{N^GpBzb(gnfdDlBnHh*tKtRb(&D5o-S=0AO_3!3Y zsWc;;!C+puakCL6e8uq7a3TV(-8a`%=N(WoDXuaakRT(U*Sq>7TA#xYPOm55WQPwc z@z6)981_?50+C;@u%&F}OoH1aygb$Q){c-GDd!D+grz3Hl4uc$571 z55=dMb@e-QM6_c{c<$2rPv1I&evZB-eW_7r=L!GWD}eJyu~J zm}^)2G|^_SE(^zP;qFw99#7gSe_vC+VF`hxQ|?IbVz&McMIoqL0PZZa6xquI3-)Y; z!qOq7=YY1lEiwIFFYF^-g7>ql`*aTEh$XdDT-+E3>$3JyCWLbCv{Jqgm#UYq$I(el z1|W957zG0<&1bPOW0|&Y3=3>$=(X{PK)eF+GizIyc-C6KfTB0$aKJA0nhq*cQx#U7 zkn?RQFw2kicOT$J@+lU=*m0dBkSXN-*5wWQuxY&>tNZI~r>I++DxFqf@c8jXc_Qc* zukb+CH+Dahj$5;<&+L^j+2{cM2|l-+ov-&U571vc2DMeMN>L?n95`e_jepA*R$YY`h$q5o zSD$d_y93JUUs!Y%RiWed#(=*}kHM6zEUf_VBjKb*6&eIFlNPBJg}CG_RjbOaS%_m5 z<%o_MvzqLm{5Z`UK6+-{*{~Tu1gmH(y$feS8TIg@nWuhlX_xZNuC!!ENzWJ4YhcS& z61a2h?7xak@MkD=(8%1K_qnMF>4p}|I;#Ga4gop&!DaX@ea6KF2{J-sqe`7c)j!TK z<>uad&Jo(Eje=$_is(+s^M~5q={CZBAIU8nYWM^tA9^b%`ZXlLerEp6ILQ<+|0Wgf3t;Tjf?fCT)Et4d+72{n8s--21}CKLEVVNl55~Hh>RjnD*V&#w%Cz0Hvp1nvdE{FzNir z_hb`LEZYN~_dKYDy)gW4giF;2O)LP9wYsf@LaN#QBs=53dpI!{?0PK2vBefs} zg>_n%{7*d9v(JE3oIK$I2ml7JL)u39ZGJG>;m7>Nqi~)>Ss!D?sz~ZxJ9N8jP8!mqsR~^_Sx}Pj=3#Es1h?U7WCXRh<`_b}(FPc?=$rWtjBX z>fqsq|DOH=z$L0gy|ZC8PeAe0$->PBaJnDnsJkntIylpQQ5BGwFZQcotNeKAcXOa< zjIAu-L}pIecmIo@{z!DsPPN5BhXYfKNWQ@>)*m9cAt8HOCG>IypG-|_b~FA^F~~X4 z5%}78sW2fq8q279Dc112KkE_nqrm8cf>afjXu31rJ325USMe#NV4F?CYei+6DMa=T zr%m=osxK^H^!-bhg&_>Hq-E`imldme{3EMIE60u$q)`X9{3?zR*t@a&NGsqTc8#@! z<9RBs7e3;dyd6`7%E}8QyR*PS9#esYT0S06-t$|MIA$$F4c^2yK0p}O&!1Zw`JjSL zyxD?)zcDFW=pt^4VM%Jojj;5GY*b^8c7Jw5M$|yw@thn4zLkJg#p{j3`L!`|s0=kr z|Cc#?b=DhSu5tJY`+XmKU%wnP8&>cvcDL4+8a9cjkI?qt{4k-z21%5|%YX-szJ56~ zt-KQ{b)R?CE{>?8%aJZV23y}2Y@B||K@%kqPC5wXOj zC4voS<_ZIf0?g=(l5xp9i^B_N<6}fBSobe3Hzo6+*!4($yv26R$#F_28>S7fd;81W z;i@Co++Q{u_igrSXi-knwn{(5oL%!av&g@k$#LR=^3QY*lP}U$(PgwDA52g2g`Zc| zuWzmCQPs9}ru{3tnP|-#Rmi2PS+L#BbB6XzvV|dO&G38rRaK>IX4j?%1YMFrQZ4}< zpi?zPpq!B!;S8`lWy(5mrQnddlZJ7x$Cn*B#z_Z4?EgQ!1pAcmkGyXdfkDegvZU0S z#ng~1whf2WRP*r`qhktxoJ->3496J)-}a>Iomo#Ufc!hm7%#Qy(QVgt=i?ldSuo9!uU=y^sxcZUv3orO z*YBp&&Ob{N%AsJP;ZIWNIRjg)8R$%Ta%whypY)m|teCz@sL-rHD zb8veXRnHtCA}&v@n_GOkyxvWWC8)1&S`LtguBI_9LehS|Y3<7%QTeTh5}^?(eckD0 zb!2FjP-K^T=F=;;K3yNKdgz#&bVKEm*HhOAyUDYql=gOowe{7iHQI|s)u&xuOSjHl z=HWYel52fkYt&ZsBITo!Qs7lVK`S;K^P;>kpSeKh@u8W~x0lM55kVqWC7dztmZVOY zo?7hntn~Ni%egNb6E&5dWlSH9($3ikJxh{e=n0?eeWIp_s6bDXz0Pha24s;~Q-md~ z$M&0)dRbn3NC#aD6dWiwHT1D%5nOniyJ91ypC0x8@#UHj26%w%W_pD*k;m1H?ZoM}ym%QCY@awvTc zCc8DNi`W{qUCdkYwnk5kb3o9AC!ZUoM|!_H(*1Nu8 zSH3lLlK4>g^Z_)j^g~7Ntlfj;n|7DPOf0N4#Z0x9-d9zts)|)!DgCjx3Vq86E<9s9 zD%aUi&7eDA&h^aYL+8F2%a*Jdpe7Mh@4U}s2oT&Pce^J;{0ecwSi(yN?b*fcmAXap zwQ(+7CDSRPtqAR)%@#r2@XW8dIw0yu*y>(EB^Zo5DF(TQ98yDujO*0Ee3lS!jKLHal+A6dlIW7+V}BAp}zr6`8K0k?+r5>Sq@@12^cMh&M(I zD=?n;vQuJ(AblCN7S3F_yu91UwS{V+=e?~y!pf?)gyUN@IpTpOz?$X@>t4m{_fQKz zD98THjYY%X2rDDi(Fz&bcI58l$x|` zXSjyGUasYl*Q)Xps)X@B!x5le{URo0`xT4Oo`cg5Pi4R!9@FH#fJ;jtHcktQaJiHWASf`T4$;O6H^oCKGO<&X*%_wKD*`}gF7e(=k# zjW7Do^DgG})CDNY8vTfrhp-!3Sfofz^!;r0vJzPoI2ph83ci93$%=mzvL4m9w#3R| z&lvE{bKIKg<_lThU~$&bdo$8}RnEiy<=Le8eXTT2pJ(Mu5+Q10;oJ1}rAHZ7LfL)D zS^tE@+kvF=9kIl40l+)~oub#2$kN|!t}Q#OU3m)TxFNtg{_5@I-=bFf@q94Wy^#v7 z8b#M!)bUE52wxUbU>+1!yGYg-Wa6F!uKb?MMDIgZGL6e1hPBJmlY6X5LH@t7tKB*R zP=L$Mgsod@8IRCAT>`bM#s2e?U{xg}9b#v4byng;XJ@BR6E?8qbyv*oPYSzI=+`+F z1XYcoNkP%ww1c|Nz<0db!UtcuCXePbpUn6a82;6m%TP`#?QXNkk`XWASFP*6@U1L= zH$y;Cb2)!G8eMr_ALjo>rGcf=-7f4i%8WCu9Mg|?`Vp^&(szx!F7w$?o;72F2fGGg z1y*-i-Vw->3Q6ZQ5$Qq}N_Axn&!X?`%Jc2iF3wev{f-nAZ`PY8)%n!*#ITAv4OpJ-e6YQ&OWA1bhzLbS*YTv`Z zrB}0hUpmdri*@Dme7KR*J4grqtb=uaix5HVT z7hFc_h3l|sTp?>p8H&O&D<-%oXZO718JSo-&n_FZD!S5EuG4iBLaffOqEA}`PDB{- zx2kccx#=_a3$t&_T<2}gRho}3kMoB9cw^7llU_2i;@6XT^Wdw+h{MRG5#7bOv+rDW z>JkI0NqW|iN^F3BgI6k5sRzR`p1JyFDenBU^rzkZZQ>a=#oi8*Q9L{Cl(7iU?P69f z#3mxK?`}?q%8=|=!TPq76>&#Zj}AM+>G1|#J+@E!DAaxw-}nSS>f0wE_1=_a^OF<{ zi86PZ@$7ImDyQfA(DxgaKF?^&0+VM1ou-=~_)hA>+}dr)elNHEAxl4cKIIbPNM@e9 zLiPdvl08bT#*qc*wesxBFtggcO-*jT@@vs)0`BrhThk(sK|Halp#C9;0c%=mJxq&n z{`BASh$s#{Pt?wbe?g^+i|Dh)DqrL)=aws-dYnve5s}7^WJwlI*}@JL#A_GSPD~>% zDYV+cwnvNcdsy0LbVXnHRrq?0uhIR2*np~fMf&C?pP?$2BJI#wxVp-P;un*8J=`6w zt^})+Z`mUs+o@loT3zdvrFm6&bE(GHcR$-{T$`BvI_ZT>Z*E(kd^LR`MNzg3 z=7N`6>7+YYNA^?;-&ABwtWFNkOw$`zgHX?V1O@l|Cbl?k8Qd(KqQ}kAQ9(9!saam5 zB}$Q=C)W(zi*!CWdRITv52%_`y(~kG+}~ zKE{t0%3bi?`eHS1=);O7%f&`s1&AMZ#;vQr$;1qj;l ztwmjHX0;`=@dlSVQ`R&C$#KG-1!vIy+!SzRSy=6@&aX$>Ho1=|`*l_v{4}NjI+ioY zT|of|UiRn0amzEBW3n`Zt7&^o%-q(i#UwY?0-Rk5ULPb1Fc=F5eSnb7T;1)a9j!Gt za@(7beZ=Fygp804j99DJ!sdxB1}Kabzjb?29)Aco2x@_hXVjIg^Wh-dWbB(4OT>FU z$z4-DLtWE->t>Hvr>YK`n%I4y;a6{dBh`Ql=Y}kB0gkaB<1W#j-9Ou zJgs!XZzaWTKw~zZX?(|2bdeEYaE}vk+OeBLFGq|i#zg_Qn1yO)EXyrb51^D)1JAkC zNsRUM8_LY;rGNDPAGE_*>z9{gfP2EO>?>8qRc1{8@0BW?{2Xx4s{R+dmDAw#X7d2mx0vRzyls z%Z?~0Aw;$yO9EI45G;!^gb*QYVGA)p79iW)v_1F!>FK{)@1Of)&NuVTcjlY-dEe)G z=b5at9Im3ErsCgrtjcNZ`uF%P|QS zG022{))t2>Y>>AOBLP6i*6rli=aYkZg^P)wG4oG(tL_UmQ~Tk*S^;2nI>V&w_*OHk z^DTio#C{H^KFIN4TTn1BVqJA33F5mhnl5B6Fj~^c8Ta#M&5lt|Bk2BPaPggYyOOHT z?H}i#I(hp$HcCzcIu%dMGazZ|;%*GaGUqxpBl!#<7rJ&0^1OkK7(;bs$HU#-hY)-5 zVtF7L(-PPc_w-V1Y+WEJrD<9s;vz3!zO0dk4}|-AgDeh*6UUz*)wi}v21;E*tP%I# zGnrQ(K7X!_jEZV6g2VkyOa>nI^(_|nT*6=;zmgihFs=UELjICljb_SR+NR{jh*7M( z2d}b1aY;kn4VOr4U?hhVj#p7^a?l8aalpFEx}`R#4dH&ioZyQj&oMEtzU?R34TZ+%GZ@2qq&3=!cIS z@wEti#M}??H!FnwY$vPpPDXpp!Q#DUmV-p9Ww0PlcziP=p$y~CGq5l!wL526`cjlg-2$jHc4?Dk^? zo$hJ6ue-nBwZ7b+i&Ghz9hvpr@$SnPjR~|8kPkI2t^QJYfas$vSwFv*=l1S+$A{jY z#$m7#WwN<97d8_UUSMoPiwq8?AHqh0kmN?!+V`{@oW)hd=E_3n0GIa=V*XTKA9v+N zjiH`dWae$^c&;i(k$VHl9i3Y1BvMDBAp8wgmk^dby8^$qn1$HnEh0AOhY`$1zL)2U zJ`zf(^udONI1%f(a|r_0c+$q0_|1U9&;fow;|U4PMTlH0o#~{V$E*0+JKRA?C=}KX z$}MIiRMYe-5f`Gu$u7F=jiPT3joQY zRA#qC_b$#gxA9k+cs~`}mibORB)H)OKJwgwfq@S#fU?qmEi|+tpR;3j=`?5Vm%>!+ zy@0ueu*fCcK2sADu`*-!M~*~R?Te(J^o2Fjf`I~=oz_ci5M$qjMMhYU2DLeC3$-+w zqrhF%c{Z&vV<{FH4UXN3(cwo1aGG;Sj@Jq$r7UtP@h!^GXn*|As>smf7jN_h8n>%? z*O56jfK#ItIJ$Ve4eCV9fMZmdYe0FrULXs*@5npIK;ULMNIE=?XoPka6M`2dae3FlFee%bTiE#Xw@@oRwxFe)uCeiWcu!A zAJzuzCVn!HSilOwFG1A;iN%3r?+)Kt)ZWN^f^t~{eh9L%I!mteX^k&JtQb+E^P8=} zvHjhZ$I{l6Xp-Au!G=g%aDK(EF%A8wWnE=KNU}PS2Zr0whOe8rnA$OP^(!>1@OvCl zG?izym8|#_XKC6Us;7;zzs-9XR8;mszkWZwj| zfchYFNgj`%q&WA(8+|a{h^_;txz{SF2{nUrmsc&}Dh=D`v$YMA6I%7Z%boYurU z1~E*swk7%MkK-8kM#)S~uvQsOnQ3t!=(*-03_OwN9xh_|Tp1S5GX!YqkC$wB?zHeB zv^-}EMchNddHy;92_73BjU7%};g%UWN*qY|Np@+24-3KXV79bvBn5OqJdu_{BcLn2 zsb9GvUw89UkT999ADz$V?NNB!yYly}&nDwAVN&#$&{Og-+84r(F{Gwd??JypPXt=BST`F&K=bz4!PLQz>+iR-Iz zPQfov+(f0fw_{SP)MiK6P$eGo>pQj-6VgL*%|v)ZzVs*j`+x`RW_s$lUp;;GhX&;X zQeDW1m28+j+_v!q*bqJc@>u^!wv=)P=d%;4Q{Go*vv~q2Jk-j4Z$L)=055d;_^U zdBuOvZgZWZnmsjNy!LnA1v9<9rJv*M%&E^F9!-Q4xrj|_31lxNvq#Th*G0OL#0RcI zIT$nry&`_fa#9ap_?CU>_dHPMeHND&+6&gKV ztOCrh1($?S_w1F}ihO<~y?^tC>j$9__kD)Q>-hZT41`P)Tg-3;cvV0vEKDq_9?4cO zy!$X)!o_a3_M-&7U2D_trs~6`yS9IV@Rfxrg;@5&9ot`0j6r+frx2x*Zxxkwp$83U zr$`;4uj=~=>z2E<2|dCtWrZeAWay8dX(f?@KD=-79=E9O!|`ZUp1fU2-@G-LafDuH z>2QRLG~FtX;%c%JR+ijL@bZ6VZJmpL*3S5iXP0c@XS_i|H0BcDc6veOF=DlnZ1IEm zJ0K3d?LzD-y(h(7C3c2_vxn@wYO}zKicE=Invb6pg|WsrdI!=v97N(@*%IApVEi+O znU%ZN_mi(J6vZ5V^#K1SMb@X0Xm?R+eM;H-=s)8h&!@$(LEL7(Gpgg>G5c-)4L%qe z#i`zkOXTGdq6e4TVKxQUtteSBM4=P_`*Zwa6G_d|r=1-5vcU=Pf>P;#T0^Go_BHiGzc&N?;;5s3k@fY~oQ& zuU9#@6k`$eT_c-!4y|?;)E-L2D(W5ApH}Z%^64OJpUpw*c*zy0(PJ`isWD&XR9rLq z6@Ey>kguUr`8?+vbRL7Pr+zjJVjK+7?d@Dsnv#uUkd4i|JQ)ZFKJ56xfKk4$PPI)^<+DvsoIQI9-YPs$`KU^n@YgJin_(`l29o*?P=rpjeXYzTrzf?4VG$c9p~8Er4Ua*yZzV@n4@c+qwH89 zS<&SREmZt0y)%4m$>>_}J+h*wEMAok*SaiXz_+6%q_-OBVTadW4bbE8k^((R_fnC6 zo?l+Gs0ykzAspt>o(zvljE@d7K8JdHd+&ip?#Wnr=99oY@2Wj1PP*U7>x#sSk>#4T zgj-@8rTnO*9D{0er6EdAy9}k48#~B7+O2rucPZ4|0H~1Qp>Dm14kq+aPr16{(ltwp zimK}qtr4u!PPI6J85{;>Ym$7cO@R!#+su}(p7k}e4S4NG_(K1~7Ctbgb+~B^U~F@) zm$IsWm2n3xY)q+2XOh5dqa{rXVEHDQR z_dY%a{(}WhMJWiHt{=~^{{f5t%fb8q%K^Oke=Y}1OAZ7Rc=lE;oFEjvfbMZJ? Jd*Z_Ne*q2dmq!2q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/models/pump1.obj b/src/main/resources/assets/rpmachine/models/pump1.obj new file mode 100644 index 0000000..dcb92e0 --- /dev/null +++ b/src/main/resources/assets/rpmachine/models/pump1.obj @@ -0,0 +1,170 @@ +# 36 Vertices +v 1.000000 0.250000 0.000000 +v 0.000000 0.250000 0.000000 +v 0.000000 0.250000 1.000000 +v 1.000000 0.250000 1.000000 +v 0.875000 1.000000 0.000000 +v 0.875000 0.000000 0.000000 +v 0.875000 0.000000 1.000000 +v 0.875000 1.000000 1.000000 +v 0.375000 1.000000 1.000000 +v 0.375000 0.000000 1.000000 +v 0.375000 0.000000 0.000000 +v 0.375000 1.000000 0.000000 +v 1.000000 0.500000 1.000000 +v 0.000000 0.500000 1.000000 +v 0.000000 0.500000 0.000000 +v 1.000000 0.500000 0.000000 +v 1.000000 0.750000 0.000000 +v 0.000000 0.750000 0.000000 +v 0.000000 0.750000 1.000000 +v 1.000000 0.750000 1.000000 +v 1.000000 1.125000 0.375000 +v 1.000000 0.125000 0.375000 +v 0.000000 0.125000 0.375000 +v 0.000000 1.125000 0.375000 +v 0.000000 1.125000 0.625000 +v 0.000000 0.125000 0.625000 +v 1.000000 0.125000 0.625000 +v 1.000000 1.125000 0.625000 +v 1.000000 0.000000 1.000000 +v 0.000000 0.000000 1.000000 +v 0.000000 0.000000 0.000000 +v 1.000000 0.000000 0.000000 +v 1.000000 1.000000 0.000000 +v 0.000000 1.000000 0.000000 +v 0.000000 1.000000 1.000000 +v 1.000000 1.000000 1.000000 + +# 100 Texture Coordinates +vtc 0.437500 0.875000 1.000000 1.000000 1.000000 +vtc 0.437500 0.812500 1.000000 1.000000 1.000000 +vtc 0.500000 0.812500 1.000000 1.000000 1.000000 +vtc 0.500000 0.875000 1.000000 1.000000 1.000000 +vtc 0.312500 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.812500 0.600000 0.600000 0.600000 +vtc 0.375000 0.812500 0.600000 0.600000 0.600000 +vtc 0.375000 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.875000 0.600000 0.600000 0.600000 +vtc 0.312500 0.812500 0.600000 0.600000 0.600000 +vtc 0.375000 0.812500 0.600000 0.600000 0.600000 +vtc 0.375000 0.875000 0.600000 0.600000 0.600000 +vtc 0.500000 0.875000 0.500000 0.500000 0.500000 +vtc 0.500000 0.812500 0.500000 0.500000 0.500000 +vtc 0.562500 0.812500 0.500000 0.500000 0.500000 +vtc 0.562500 0.875000 0.500000 0.500000 0.500000 +vtc 0.500000 0.875000 1.000000 1.000000 1.000000 +vtc 0.500000 0.812500 1.000000 1.000000 1.000000 +vtc 0.562500 0.812500 1.000000 1.000000 1.000000 +vtc 0.562500 0.875000 1.000000 1.000000 1.000000 +vtc 0.500000 0.875000 0.800000 0.800000 0.800000 +vtc 0.562500 0.875000 0.800000 0.800000 0.800000 +vtc 0.562500 0.812500 0.800000 0.800000 0.800000 +vtc 0.500000 0.812500 0.800000 0.800000 0.800000 +vtc 0.500000 0.812500 0.800000 0.800000 0.800000 +vtc 0.562500 0.812500 0.800000 0.800000 0.800000 +vtc 0.562500 0.875000 0.800000 0.800000 0.800000 +vtc 0.500000 0.875000 0.800000 0.800000 0.800000 +vtc 0.375000 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.875000 1.000000 1.000000 1.000000 +vtc 0.375000 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.875000 1.000000 1.000000 1.000000 +vtc 0.187500 0.875000 0.800000 0.800000 0.800000 +vtc 0.187500 0.812500 0.800000 0.800000 0.800000 +vtc 0.125000 0.812500 0.800000 0.800000 0.800000 +vtc 0.125000 0.875000 0.800000 0.800000 0.800000 +vtc 0.125000 0.875000 0.800000 0.800000 0.800000 +vtc 0.125000 0.812500 0.800000 0.800000 0.800000 +vtc 0.187500 0.812500 0.800000 0.800000 0.800000 +vtc 0.187500 0.875000 0.800000 0.800000 0.800000 +vtc 0.000000 0.875000 0.600000 0.600000 0.600000 +vtc 0.000000 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.875000 0.600000 0.600000 0.600000 +vtc 0.375000 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.875000 1.000000 1.000000 1.000000 +vtc 0.375000 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.875000 1.000000 1.000000 1.000000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.250000 0.812500 0.800000 0.800000 0.800000 +vtc 0.187500 0.812500 0.800000 0.800000 0.800000 +vtc 0.187500 0.875000 0.800000 0.800000 0.800000 +vtc 0.187500 0.875000 0.800000 0.800000 0.800000 +vtc 0.187500 0.812500 0.800000 0.800000 0.800000 +vtc 0.250000 0.812500 0.800000 0.800000 0.800000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.000000 0.875000 0.600000 0.600000 0.600000 +vtc 0.000000 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.875000 0.600000 0.600000 0.600000 +vtc 0.375000 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.375000 0.500000 0.500000 0.500000 +vtc 0.437500 0.437500 0.500000 0.500000 0.500000 +vtc 0.375000 0.875000 1.000000 1.000000 1.000000 +vtc 0.375000 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.812500 1.000000 1.000000 1.000000 +vtc 0.437500 0.875000 1.000000 1.000000 1.000000 +vtc 0.312500 0.875000 0.800000 0.800000 0.800000 +vtc 0.312500 0.812500 0.800000 0.800000 0.800000 +vtc 0.250000 0.812500 0.800000 0.800000 0.800000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.250000 0.875000 0.800000 0.800000 0.800000 +vtc 0.250000 0.812500 0.800000 0.800000 0.800000 +vtc 0.312500 0.812500 0.800000 0.800000 0.800000 +vtc 0.312500 0.875000 0.800000 0.800000 0.800000 +vtc 0.000000 0.875000 0.600000 0.600000 0.600000 +vtc 0.000000 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.875000 0.600000 0.600000 0.600000 +vtc 0.062500 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.812500 0.600000 0.600000 0.600000 +vtc 0.125000 0.875000 0.600000 0.600000 0.600000 + +# 2 Groups +g 0 +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 9/9 10/10 11/11 12/12 +f 13/13 14/14 15/15 16/16 +f 17/17 18/18 19/19 20/20 +f 21/21 22/22 23/23 24/24 +f 25/25 26/26 27/27 28/28 +g 1_1 +f 29/29 30/30 31/31 32/32 +f 33/33 34/34 35/35 36/36 +f 33/37 32/38 31/39 34/40 +f 35/41 30/42 29/43 36/44 +f 34/45 31/46 30/47 35/48 +f 36/49 29/50 32/51 33/52 +g 1_2 +f 29/53 30/54 31/55 32/56 +f 33/57 34/58 35/59 36/60 +f 33/61 32/62 31/63 34/64 +f 35/65 30/66 29/67 36/68 +f 34/69 31/70 30/71 35/72 +f 36/73 29/74 32/75 33/76 +g 1_3 +f 29/77 30/78 31/79 32/80 +f 33/81 34/82 35/83 36/84 +f 33/85 32/86 31/87 34/88 +f 35/89 30/90 29/91 36/92 +f 34/93 31/94 30/95 35/96 +f 36/97 29/98 32/99 33/100 diff --git a/src/main/resources/assets/rpmachine/models/pump2.obj b/src/main/resources/assets/rpmachine/models/pump2.obj new file mode 100644 index 0000000..3263e14 --- /dev/null +++ b/src/main/resources/assets/rpmachine/models/pump2.obj @@ -0,0 +1,44 @@ +# 8 Vertices +v 0.187500 0.312500 0.812500 +v 0.000000 0.312500 0.812500 +v 0.000000 0.312500 0.187500 +v 0.187500 0.312500 0.187500 +v 0.187500 0.937500 0.187500 +v 0.000000 0.937500 0.187500 +v 0.000000 0.937500 0.812500 +v 0.187500 0.937500 0.812500 + +# 24 Texture Coordinates +vtc 0.636719 0.824219 0.500000 0.500000 0.500000 +vtc 0.636719 0.812500 0.500000 0.500000 0.500000 +vtc 0.675781 0.812500 0.500000 0.500000 0.500000 +vtc 0.675781 0.824219 0.500000 0.500000 0.500000 +vtc 0.636719 0.824219 1.000000 1.000000 1.000000 +vtc 0.636719 0.812500 1.000000 1.000000 1.000000 +vtc 0.675781 0.812500 1.000000 1.000000 1.000000 +vtc 0.675781 0.824219 1.000000 1.000000 1.000000 +vtc 0.636719 0.824219 0.800000 0.800000 0.800000 +vtc 0.675781 0.824219 0.800000 0.800000 0.800000 +vtc 0.675781 0.812500 0.800000 0.800000 0.800000 +vtc 0.636719 0.812500 0.800000 0.800000 0.800000 +vtc 0.636719 0.812500 0.800000 0.800000 0.800000 +vtc 0.675781 0.812500 0.800000 0.800000 0.800000 +vtc 0.675781 0.824219 0.800000 0.800000 0.800000 +vtc 0.636719 0.824219 0.800000 0.800000 0.800000 +vtc 0.574219 0.863281 0.600000 0.600000 0.600000 +vtc 0.574219 0.824219 0.600000 0.600000 0.600000 +vtc 0.613281 0.824219 0.600000 0.600000 0.600000 +vtc 0.613281 0.863281 0.600000 0.600000 0.600000 +vtc 0.574219 0.863281 0.600000 0.600000 0.600000 +vtc 0.574219 0.824219 0.600000 0.600000 0.600000 +vtc 0.613281 0.824219 0.600000 0.600000 0.600000 +vtc 0.613281 0.863281 0.600000 0.600000 0.600000 + +# 1 Groups +g 0 +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 5/9 4/10 3/11 6/12 +f 7/13 2/14 1/15 8/16 +f 6/17 3/18 2/19 7/20 +f 8/21 1/22 4/23 5/24 diff --git a/src/main/resources/assets/rpmachine/models/transform.obj b/src/main/resources/assets/rpmachine/models/transform.obj new file mode 100644 index 0000000..df43828 --- /dev/null +++ b/src/main/resources/assets/rpmachine/models/transform.obj @@ -0,0 +1,107 @@ +v 0.000000 2.000000 16.000000 +v 6.000000 16.000000 16.000000 +v 0.000000 2.000000 0.000000 +v 6.000000 16.000000 0.000000 +v 16.000000 2.000000 16.000000 +v 6.000000 2.000000 0.000000 +v 16.000000 2.000000 0.000000 +v 6.000000 2.000000 16.000000 +v 0.000000 0.000000 16.000000 +v 0.000000 0.000000 0.000000 +v 16.000000 0.000000 16.000000 +v 16.000000 0.000000 0.000000 +v 1.000000 2.000000 14.000000 +v 1.000000 2.000000 2.000000 +v 15.000000 2.000000 14.000000 +v 15.000000 2.000000 2.000000 +v 1.000000 14.000000 14.000000 +v 1.000000 14.000000 2.000000 +v 15.000000 14.000000 14.000000 +v 15.000000 14.000000 2.000000 +v 16.000000 16.000000 0.000000 +v 16.000000 16.000000 16.000000 +v 0.000000 16.000000 0.000000 +v 0.000000 16.000000 16.000000 +v 10.000000 16.000000 16.000000 +v 10.000000 16.000000 0.000000 +v 10.000000 2.000000 0.000000 +v 10.000000 2.000000 16.000000 +v 0.000000 2.000000 12.000000 +v 0.000000 2.000000 4.000000 +v 0.000000 5.000000 12.000000 +v 0.000000 5.000000 4.000000 +v 16.000000 2.000000 12.000000 +v 16.000000 2.000000 4.000000 +v 16.000000 5.000000 12.000000 +v 16.000000 5.000000 4.000000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.882812 +vt 0.500000 0.882812 +vt 0.500000 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.937500 +vt 0.000000 0.937500 +vt 0.000000 0.875000 +vt 0.375000 0.937500 +vt 0.375000 0.882812 +vt 0.500000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.937500 +vt 0.625000 0.937500 +vt 0.625000 0.875000 +vt 0.757812 0.878906 +vt 0.804688 0.878906 +vt 0.804688 0.933594 +vt 0.757812 0.933594 +vt 0.878906 0.929688 +vt 0.878906 0.882812 +vt 0.933594 0.882812 +vt 0.933594 0.929688 +vt 0.816406 0.929688 +vt 0.816406 0.882812 +vt 0.871094 0.882812 +vt 0.871094 0.929688 +vt 0.679688 0.882812 +vt 0.679688 0.929688 +vt 0.632812 0.929688 +vt 0.632812 0.882812 +vt 0.695312 0.929688 +vt 0.695312 0.882812 +vt 0.742188 0.882812 +vt 0.742188 0.929688 +vt 0.312500 0.937500 +vt 0.312500 0.875000 +vt 0.375000 0.886719 +vt 0.312500 0.886719 +vt 0.375000 0.875000 +vt 0.312500 0.890625 +vt 0.375000 0.890625 +vt 0.375000 0.902344 +vt 0.312500 0.902344 +vt 0.312500 0.906250 +vt 0.375000 0.906250 + +g 0 +f 24/1 9/2 11/3 22/4 +f 25/5 28/6 27/7 26/8 +f 9/9 24/10 23/11 10/12 +f 8/6 2/5 4/13 6/14 +f 3/15 1/16 5/17 7/8 +f 22/10 11/9 12/18 21/19 +f 11/20 9/21 10/16 12/17 +f 19/22 20/23 18/24 17/25 +f 20/26 16/27 14/28 18/29 +f 17/30 13/31 15/32 19/33 +f 13/34 17/35 18/36 14/37 +f 19/38 15/39 16/40 20/41 +f 21/19 12/18 10/2 23/1 +f 22/42 21/4 23/3 24/43 +f 34/44 30/45 32/43 36/46 +f 29/47 33/48 35/49 31/50 +f 31/13 35/42 36/51 32/52 diff --git a/src/main/resources/assets/rpmachine/models/vawt.obj b/src/main/resources/assets/rpmachine/models/vawt.obj new file mode 100644 index 0000000..7423417 --- /dev/null +++ b/src/main/resources/assets/rpmachine/models/vawt.obj @@ -0,0 +1,503 @@ +# VAWT Model +v -16.697224 126.487503 43.408737 +v -0.198903 126.487503 47.508175 +v -0.078331 126.487503 47.022930 +v -16.576649 126.487503 42.923492 +v -16.697224 8.512497 43.408737 +v -0.198903 8.512497 47.508175 +v -0.078331 8.512497 47.022930 +v -16.576651 8.512497 42.923492 +v 16.576651 8.512497 -42.923492 +v 0.078331 8.512497 -47.022930 +v 0.198903 8.512497 -47.508175 +v 16.697224 8.512497 -43.408737 +v 16.576649 126.487503 -42.923492 +v 0.078331 126.487503 -47.022930 +v 0.198903 126.487503 -47.508175 +v 16.697224 126.487503 -43.408737 +v -45.941685 126.487503 7.244141 +v -41.242744 126.487503 23.581821 +v -40.762222 126.487503 23.443623 +v -45.461163 126.487503 7.105942 +v -45.941685 8.512497 7.244141 +v -41.242744 8.512497 23.581821 +v -40.762222 8.512497 23.443623 +v -45.461159 8.512497 7.105938 +v 45.461159 8.512497 -7.105938 +v 40.762222 8.512497 -23.443623 +v 41.242744 8.512497 -23.581821 +v 45.941685 8.512497 -7.244141 +v 45.461163 126.487503 -7.105942 +v 40.762222 126.487503 -23.443623 +v 41.242744 126.487503 -23.581821 +v 45.941685 126.487503 -7.244141 +v -29.244442 126.487503 -36.164600 +v -41.043823 126.487503 -23.926363 +v -40.683884 126.487503 -23.579317 +v -28.884502 126.487503 -35.817554 +v -29.244442 8.512497 -36.164600 +v -41.043823 8.512497 -23.926363 +v -40.683884 8.512497 -23.579317 +v -28.884499 8.512497 -35.817554 +v 28.884499 8.512497 35.817554 +v 40.683884 8.512497 23.579317 +v 41.043823 8.512497 23.926363 +v 29.244442 8.512497 36.164600 +v 28.884502 126.487503 35.817554 +v 40.683884 126.487503 23.579317 +v 41.043823 126.487503 23.926363 +v 29.244442 126.487503 36.164600 +v 2.000000 0.000000 2.000000 +v -2.000000 0.000000 2.000000 +v -2.000000 0.000000 -2.000000 +v 2.000001 0.000000 -1.999999 +v 1.999999 128.000000 2.000001 +v -2.000001 128.000000 1.999999 +v -1.999999 128.000000 -2.000001 +v 2.000000 128.000000 -2.000000 +v 0.500000 7.500000 47.500000 +v -0.500000 7.500000 47.500000 +v -0.500000 7.500000 -47.500000 +v 0.500000 7.500000 -47.500000 +v 0.500000 8.500000 47.500000 +v -0.500000 8.500000 47.500000 +v -0.500000 8.500000 -47.500000 +v 0.500000 8.500000 -47.500000 +v 0.500000 127.500000 -47.500000 +v -0.500000 127.500000 -47.500000 +v -0.500000 127.500000 47.500000 +v 0.500000 127.500000 47.500000 +v 0.500000 126.500000 -47.500000 +v -0.500000 126.500000 -47.500000 +v -0.500000 126.500000 47.500000 +v 0.500000 126.500000 47.500000 +v 1.000000 128.000000 -48.000000 +v -1.000000 128.000000 -48.000000 +v -1.000001 128.000000 -46.000000 +v 0.999999 128.000000 -46.000000 +v 1.000000 7.000000 -48.000000 +v -1.000000 7.000000 -48.000000 +v -1.000000 7.000000 -46.000000 +v 1.000000 7.000000 -46.000000 +v -1.000000 7.000000 46.000000 +v 1.000000 7.000000 46.000000 +v 0.999999 7.000000 48.000000 +v -1.000001 7.000000 48.000000 +v -1.000000 128.000000 46.000000 +v 1.000000 128.000000 46.000000 +v 0.999999 128.000000 48.000000 +v -1.000000 128.000000 48.000000 +v 42.069225 128.000000 -23.133965 +v 41.069225 128.000000 -24.866013 +v 39.337173 128.000000 -23.866020 +v 40.337173 128.000000 -22.133965 +v 42.069225 7.000000 -23.133965 +v 41.069225 7.000000 -24.866020 +v 39.337173 7.000000 -23.866020 +v 40.337173 7.000000 -22.133965 +v -40.337173 7.000000 22.133965 +v -39.337173 7.000000 23.866020 +v -41.069225 7.000000 24.866020 +v -42.069225 7.000000 23.133965 +v -40.337173 128.000000 22.133965 +v -39.337173 128.000000 23.866020 +v -41.069225 128.000000 24.866020 +v -42.069225 128.000000 23.133965 +v 40.886211 126.500000 -24.183006 +v 41.386211 126.500000 -23.316978 +v -40.886211 126.500000 24.183006 +v -41.386211 126.500000 23.316978 +v 40.886211 127.500000 -24.183006 +v 41.386211 127.500000 -23.316978 +v -40.886211 127.500000 24.183006 +v -41.386211 127.500000 23.316978 +v -41.386211 8.500000 23.316978 +v -40.886211 8.500000 24.183006 +v 41.386211 8.500000 -23.316978 +v 40.886211 8.500000 -24.183006 +v -41.386211 7.500000 23.316978 +v -40.886211 7.500000 24.183006 +v 41.386211 7.500000 -23.316978 +v 40.886211 7.500000 -24.183006 +v -41.386204 7.500000 -23.317001 +v -40.886204 7.500000 -24.183029 +v 41.386204 7.500000 23.317001 +v 40.886204 7.500000 24.183029 +v -41.386204 8.500000 -23.317001 +v -40.886204 8.500000 -24.183029 +v 41.386204 8.500000 23.317001 +v 40.886204 8.500000 24.183029 +v 40.886204 127.500000 24.183029 +v 41.386204 127.500000 23.317001 +v -40.886204 127.500000 -24.183029 +v -41.386204 127.500000 -23.317001 +v 40.886204 126.500000 24.183029 +v 41.386204 126.500000 23.317001 +v -40.886204 126.500000 -24.183029 +v -41.386204 126.500000 -23.317001 +v 41.069210 128.000000 24.866043 +v 42.069218 128.000000 23.133991 +v 40.337166 128.000000 22.133987 +v 39.337158 128.000000 23.866043 +v 41.069210 7.000000 24.866043 +v 42.069218 7.000000 23.133991 +v 40.337166 7.000000 22.133987 +v 39.337158 7.000000 23.866043 +v -39.337158 7.000000 -23.866043 +v -40.337166 7.000000 -22.133987 +v -42.069218 7.000000 -23.133991 +v -41.069210 7.000000 -24.866043 +v -39.337158 128.000000 -23.866043 +v -40.337166 128.000000 -22.133987 +v -42.069202 128.000000 -23.133995 +v -41.069210 128.000000 -24.866043 +v -40.177860 7.500000 23.891901 +v -41.177860 7.500000 23.891901 +v -41.177860 7.500000 -23.891901 +v -40.177860 7.500000 -23.891901 +v -40.177860 8.500000 23.891901 +v -41.177860 8.500000 23.891901 +v -41.177860 8.500000 -23.891901 +v -40.177860 8.500000 -23.891901 +v -40.177860 127.500000 -23.891901 +v -41.177860 127.500000 -23.891901 +v -41.177860 127.500000 23.891901 +v -40.177860 127.500000 23.891901 +v -40.177860 126.500000 -23.891901 +v -41.177860 126.500000 -23.891901 +v -41.177860 126.500000 23.891901 +v -40.177860 126.500000 23.891901 +v 40.177868 7.500000 -23.891897 +v 41.177868 7.500000 -23.891897 +v 41.177853 7.500000 23.891905 +v 40.177853 7.500000 23.891905 +v 40.177868 8.500000 -23.891897 +v 41.177868 8.500000 -23.891897 +v 41.177853 8.500000 23.891905 +v 40.177853 8.500000 23.891905 +v 40.177853 127.500000 23.891905 +v 41.177853 127.500000 23.891905 +v 41.177868 127.500000 -23.891897 +v 40.177868 127.500000 -23.891897 +v 40.177853 126.500000 23.891905 +v 41.177853 126.500000 23.891905 +v 41.177868 126.500000 -23.891897 +v 40.177868 126.500000 -23.891897 +v 40.779919 7.500000 22.849106 +v 41.279919 7.500000 23.715130 +v -0.102070 7.500000 47.607025 +v -0.602070 7.500000 46.740997 +v 40.779919 8.500000 22.849106 +v 41.279919 8.500000 23.715130 +v -0.102070 8.500000 47.607025 +v -0.602070 8.500000 46.740997 +v -0.602070 127.500000 46.740997 +v -0.102070 127.500000 47.607025 +v 41.279919 127.500000 23.715130 +v 40.779919 127.500000 22.849106 +v -0.602070 126.500000 46.740997 +v -0.102070 126.500000 47.607025 +v 41.279919 126.500000 23.715130 +v 40.779919 126.500000 22.849106 +v -40.779926 7.500000 -22.849113 +v -41.279926 7.500000 -23.715137 +v 0.102077 7.500000 -47.607018 +v 0.602077 7.500000 -46.740990 +v -40.779926 8.500000 -22.849113 +v -41.279926 8.500000 -23.715137 +v 0.102077 8.500000 -47.607018 +v 0.602077 8.500000 -46.740990 +v 0.602077 127.500000 -46.740990 +v 0.102077 127.500000 -47.607018 +v -41.279926 127.500000 -23.715137 +v -40.779926 127.500000 -22.849113 +v 0.602077 126.500000 -46.740990 +v 0.102077 126.500000 -47.607018 +v -41.279926 126.500000 -23.715137 +v -40.779926 126.500000 -22.849113 +v -0.602047 7.500000 -46.740997 +v -0.102047 7.500000 -47.607029 +v 41.279930 7.500000 -23.715111 +v 40.779930 7.500000 -22.849083 +v -0.602047 8.500000 -46.740997 +v -0.102047 8.500000 -47.607029 +v 41.279930 8.500000 -23.715111 +v 40.779930 8.500000 -22.849083 +v 40.779930 127.500000 -22.849083 +v 41.279930 127.500000 -23.715111 +v -0.102047 127.500000 -47.607029 +v -0.602047 127.500000 -46.740997 +v 40.779930 126.500000 -22.849083 +v 41.279930 126.500000 -23.715111 +v -0.102047 126.500000 -47.607029 +v -0.602047 126.500000 -46.740997 +v 0.602043 7.500000 46.741005 +v 0.102043 7.500000 47.607037 +v -41.279930 7.500000 23.715096 +v -40.779926 7.500000 22.849075 +v 0.602043 8.500000 46.741005 +v 0.102043 8.500000 47.607037 +v -41.279930 8.500000 23.715096 +v -40.779926 8.500000 22.849075 +v -40.779926 127.500000 22.849075 +v -41.279930 127.500000 23.715096 +v 0.102043 127.500000 47.607037 +v 0.602043 127.500000 46.741005 +v -40.779926 126.500000 22.849075 +v -41.279930 126.500000 23.715096 +v 0.102043 126.500000 47.607037 +v 0.602043 126.500000 46.741005 +vt 0.277344 0.500000 +vt 0.277344 1.000000 +vt 0.273438 1.000000 +vt 0.273438 0.500000 +vt 0.140625 1.000000 +vt 0.140625 0.500000 +vt 0.203125 0.500000 +vt 0.203125 1.000000 +vt 0.269531 0.500000 +vt 0.269531 1.000000 +vt 0.207031 1.000000 +vt 0.207031 0.500000 +vt 0.140625 0.496094 +vt 0.140625 0.492188 +vt 0.203125 0.492188 +vt 0.203125 0.496094 +vt 0.207031 0.492188 +vt 0.269531 0.492188 +vt 0.269531 0.496094 +vt 0.207031 0.496094 +vt 0.019531 0.480469 +vt 0.035156 0.480469 +vt 0.035156 0.496094 +vt 0.019531 0.496094 +vt 0.000000 0.480469 +vt 0.015625 0.480469 +vt 0.015625 0.496094 +vt 0.000000 0.496094 +vt 0.015625 0.500000 +vt 0.015625 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.046875 1.000000 +vt 0.046875 0.500000 +vt 0.031250 1.000000 +vt 0.031250 0.500000 +vt 0.101562 1.000000 +vt 0.097656 1.000000 +vt 0.097656 0.500000 +vt 0.101562 0.500000 +vt 0.089844 1.000000 +vt 0.089844 0.500000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.085938 0.500000 +vt 0.085938 1.000000 +vt 0.074219 0.500000 +vt 0.078125 0.500000 +vt 0.078125 1.000000 +vt 0.074219 1.000000 +vt 0.066406 0.500000 +vt 0.070312 0.500000 +vt 0.070312 1.000000 +vt 0.066406 1.000000 +vt 0.082031 0.500000 +vt 0.082031 1.000000 +vt 0.136719 0.500000 +vt 0.136719 1.000000 +vt 0.128906 1.000000 +vt 0.128906 0.500000 +vt 0.113281 0.500000 +vt 0.113281 1.000000 +vt 0.105469 1.000000 +vt 0.105469 0.500000 +vt 0.121094 0.500000 +vt 0.121094 1.000000 +vt 0.105469 0.488281 +vt 0.113281 0.488281 +vt 0.113281 0.496094 +vt 0.105469 0.496094 +vt 0.117188 0.488281 +vt 0.125000 0.488281 +vt 0.125000 0.496094 +vt 0.117188 0.496094 +vt 0.316406 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.750000 +vt 0.316406 0.750000 +vt 0.304688 1.000000 +vt 0.304688 0.750000 +vt 0.308594 0.750000 +vt 0.308594 1.000000 +vt 0.300781 0.750000 +vt 0.300781 1.000000 +vt 0.289062 0.750000 +vt 0.292969 0.750000 +vt 0.292969 1.000000 +vt 0.289062 1.000000 +vt 0.281250 0.750000 +vt 0.285156 0.750000 +vt 0.285156 1.000000 +vt 0.281250 1.000000 +vt 0.296875 0.750000 +vt 0.296875 1.000000 + +g 0 +f 49/21 50/22 51/23 52/24 +f 53/25 56/26 55/27 54/28 +f 49/29 53/30 54/31 50/32 +f 50/33 54/34 55/35 51/36 +f 51/36 55/35 56/37 52/38 +f 53/30 49/29 52/38 56/37 +f 59/39 60/40 57/41 58/42 +f 61/43 64/44 63/45 62/46 +f 58/45 62/41 63/40 59/46 +f 60/47 64/44 61/43 57/48 +f 69/49 65/50 68/51 72/52 +f 71/53 67/54 66/55 70/56 +f 68/55 65/54 66/49 67/52 +f 70/50 69/57 72/58 71/51 +f 77/59 73/60 76/61 80/62 +f 78/63 74/64 73/65 77/66 +f 79/67 75/68 74/64 78/63 +f 80/62 76/61 75/68 79/67 +f 76/69 73/70 74/71 75/72 +f 78/73 77/74 80/75 79/76 +f 83/73 84/74 81/75 82/76 +f 85/69 88/70 87/71 86/72 +f 81/62 85/61 86/68 82/67 +f 82/67 86/68 87/64 83/63 +f 83/63 87/64 88/65 84/66 +f 84/59 88/60 85/61 81/62 +f 93/59 89/60 92/61 96/62 +f 94/63 90/64 89/65 93/66 +f 95/67 91/68 90/64 94/63 +f 96/62 92/61 91/68 95/67 +f 92/69 89/70 90/71 91/72 +f 94/73 93/74 96/75 95/76 +f 99/73 100/74 97/75 98/76 +f 101/69 104/70 103/71 102/72 +f 97/62 101/61 102/68 98/67 +f 98/67 102/68 103/64 99/63 +f 99/63 103/64 104/65 100/66 +f 100/59 104/60 101/61 97/62 +f 107/50 108/57 105/58 106/51 +f 109/55 112/54 111/49 110/52 +f 106/53 110/54 111/55 107/56 +f 108/49 112/50 109/51 105/52 +f 117/47 113/44 116/43 120/48 +f 119/45 115/41 114/40 118/46 +f 116/43 113/44 114/45 115/46 +f 118/39 117/40 120/41 119/42 +f 123/39 124/40 121/41 122/42 +f 125/43 128/44 127/45 126/46 +f 122/45 126/41 127/40 123/46 +f 124/47 128/44 125/43 121/48 +f 133/49 129/50 132/51 136/52 +f 135/53 131/54 130/55 134/56 +f 132/55 129/54 130/49 131/52 +f 134/50 133/57 136/58 135/51 +f 141/59 137/60 140/61 144/62 +f 142/63 138/64 137/65 141/66 +f 143/67 139/68 138/64 142/63 +f 144/62 140/61 139/68 143/67 +f 140/69 137/70 138/71 139/72 +f 142/73 141/74 144/75 143/76 +f 147/73 148/74 145/75 146/76 +f 149/69 152/70 151/71 150/72 +f 145/62 149/61 150/68 146/67 +f 146/67 150/68 151/64 147/63 +f 147/63 151/64 152/65 148/66 +f 148/59 152/60 149/61 145/62 +f 155/77 156/78 153/79 154/80 +f 157/81 160/82 159/83 158/84 +f 154/83 158/79 159/78 155/84 +f 156/85 160/82 157/81 153/86 +f 165/87 161/88 164/89 168/90 +f 167/91 163/92 162/93 166/94 +f 164/93 161/92 162/87 163/90 +f 166/88 165/95 168/96 167/89 +f 171/77 172/78 169/79 170/80 +f 173/81 176/82 175/83 174/84 +f 170/83 174/79 175/78 171/84 +f 172/85 176/82 173/81 169/86 +f 181/87 177/88 180/89 184/90 +f 183/91 179/92 178/93 182/94 +f 180/93 177/92 178/87 179/90 +f 182/88 181/95 184/96 183/89 +f 187/77 188/78 185/79 186/80 +f 189/81 192/82 191/83 190/84 +f 186/83 190/79 191/78 187/84 +f 188/85 192/82 189/81 185/86 +f 197/87 193/88 196/89 200/90 +f 199/91 195/92 194/93 198/94 +f 196/93 193/92 194/87 195/90 +f 198/88 197/95 200/96 199/89 +f 203/77 204/78 201/79 202/80 +f 205/81 208/82 207/83 206/84 +f 202/83 206/79 207/78 203/84 +f 204/85 208/82 205/81 201/86 +f 213/87 209/88 212/89 216/90 +f 215/91 211/92 210/93 214/94 +f 212/93 209/92 210/87 211/90 +f 214/88 213/95 216/96 215/89 +f 219/77 220/78 217/79 218/80 +f 221/81 224/82 223/83 222/84 +f 218/83 222/79 223/78 219/84 +f 220/85 224/82 221/81 217/86 +f 229/87 225/88 228/89 232/90 +f 231/91 227/92 226/93 230/94 +f 228/93 225/92 226/87 227/90 +f 230/88 229/95 232/96 231/89 +f 235/77 236/78 233/79 234/80 +f 237/81 240/82 239/83 238/84 +f 234/83 238/79 239/78 235/84 +f 236/85 240/82 237/81 233/86 +f 245/87 241/88 244/89 248/90 +f 247/91 243/92 242/93 246/94 +f 244/93 241/92 242/87 243/90 +f 246/88 245/95 248/96 247/89 + +g 1_1 +f 5/1 1/2 4/3 8/4 +f 1/5 5/6 6/7 2/8 +f 8/9 4/10 3/11 7/12 +f 4/13 1/14 2/15 3/16 +f 6/17 5/18 8/19 7/20 + +g 1_2 +f 41/19 42/20 43/17 44/18 +f 45/13 48/14 47/15 46/16 +f 41/9 45/10 46/11 42/12 +f 43/7 47/8 48/5 44/6 +f 45/3 41/4 44/1 48/2 + +g 1_3 +f 33/19 34/20 35/17 36/18 +f 37/13 40/14 39/15 38/16 +f 33/9 37/10 38/11 34/12 +f 35/7 39/8 40/5 36/6 +f 37/3 33/4 36/1 40/2 + +g 1_4 +f 9/19 10/20 11/17 12/18 +f 13/13 16/14 15/15 14/16 +f 9/9 13/10 14/11 10/12 +f 11/7 15/8 16/5 12/6 +f 13/3 9/4 12/1 16/2 + +g 1_5 +f 29/1 25/2 28/3 32/4 +f 25/5 29/6 30/7 26/8 +f 32/9 28/10 27/11 31/12 +f 28/13 25/14 26/15 27/16 +f 30/17 29/18 32/19 31/20 + +g 1_6 +f 21/1 17/2 20/3 24/4 +f 17/5 21/6 22/7 18/8 +f 24/9 20/10 19/11 23/12 +f 20/13 17/14 18/15 19/16 +f 22/17 21/18 24/19 23/20 diff --git a/src/main/resources/assets/rpmachine/models/vawt.png b/src/main/resources/assets/rpmachine/models/vawt.png new file mode 100644 index 0000000000000000000000000000000000000000..61a846b40bc63d2e612ffe83b5814476b3ed4e33 GIT binary patch literal 4283 zcmZ8l2{@GN`+jFEGqy%jIkqAGDwOJ2D`QBO64IoQC7dkTLWIFcNV1e84uy_X%s~-O zG>jHYlch9-VrsG*OLjwk?>F^3zyEc<>vDbbz2Eyh&;8!-eLvrONwl^!6%&>g1^|ee zn;F{xfPz0!0E>pVPH}_1$WxGwsSzk`lO2T*g04qRjo}?$%ZF;C;Y}#O%q|Fk4GqX2 z>hBxpIdBjYY<}!8=A*ET1Rm88z4!?L@dM_@hNMfqoI4CFhg0&D_IY;ihen0#VL1s{ zF~f}FD%bSll3taJj*09+^_q!5?X_Re{TfZ&T9Gwq?0s+4$0WNItL5u83($==Haj$b zx0X*y_Fc_-rMSKA{{*;chbQ$09u(_q*Uh=!8PFdNot!$*y*yFTey01P?C|t-$Hh-( z$~W7G9lJLhk*Lhm>b6BB)r=$CZeSB$#2I}aYRz$uin=&CmSIyQnQUUP{6%d!klkW= zUxyR6+`j&ic7d}?@rwADbd9=|&k6WH-+B`AaB)U3#~&7@Wo4MyhT#2jqJo*XZhe_q zqSGnjUuM`%gMrJjI6{Z+SMF4O-km#4f;mciW3esu#EBC#m&j33b+**jH*Y2;Cre99 zYf29g2=YmeJSjZPlHV5p3Z9KC7Q&Ezj7@ksowd{l(7mq$RVi?)=bXL1@DmT z?dzkGRA(+dd+X`r=O-^GS7=jYrX0BbeQlC=<>t!M4xRJx&%~>FPI|dhOLUao4@vudO=agWEe3Etd;mn9H6l#-P#Nj^<{wJyPnKj90D~f`gwF z6cn6R7gj8Fu9x4C5E>Fv%q;F#e0pZ`UE$H*?Lyju#1h*eS<|ZV`5JE#Ma${~MrRdY zeq^de&mBEl_|A07V&Y&c!*6i_kAEFiRbTJCLvn@7Rl3n!V4CV(X>V%U)X`zRJ2R#R6tn7%~yYBAL8|nO1tfsVBk8r{Zk7~XcqOR-~qY3#f2Tyf+ zYWA+C3=hH@&GB#cYHMqUgoZ{$L~vJDCxM>CxE-a ziHj4U9fC7|P}985AKPF(;;xB}Gb-NYoJ-aexAxU5^UT%s2=83ajqX^b4tiww;qZjj z<>5TJCi6m@@$qpH5s?=6KzH|h_9cW%(+X0e_ic&_3kzFYTZsw^CmfOw*%ZA$Y$>7M zih^{`%v=a^a9Uz=Re?>*-w&Fa^@3+5jU1gJ?HP$qv~cEy+cX+2@Tq!dmwm}ljo-dM z$Xrf!^xAwknXnE8C#+aiUCkIQ?^pab02vPvpk$Bfrm(#jLaE`-gMzgQaYKya*BU2l z!ou|qm(tZWG(;57ojZq)A<~@6nBIxTP_gb6cHI{f;^PG|nChx3>130AfBa56!A=X_ z9|;MT38IA4`aLz_IMfl-yL^|yXD>#7`slF;710A$v#lD4L}J#zFIlf?-mzRnR0n$<$R}=LB^572UdBzdDoa+;8Z^?>9+C*Ep)TpF`AQq z?qvOw5*4$t@TXakfsLCiD-oM&L1s*+L}g$@Xn`nc)oAg%;DP;Ad?Js zQ*`F5aziOd>yFav&g8&N=^G5Rvo+U@Hd)9TYEwSGX6|IoEUYG}7DZU7si}PqI9=MQ zv1^xJO6S19fTyOdt?k!+BoB|_SPV`&xp8{>k$O{yu5k(pvC8gPVMXD%%VYZGpH`!S zBHRu{-}F<-bv7I>b@Fnu8wktJR2zTmNt%CdyzO(%`H)9&) zdGW%rLYw*UNN;adi9}i6b^ZEvSvfiAxMP-a|fXlSr0Qa*q1!Gi}-5MABfa!sR?lOc|wZf>w) zw6(Q)%a+&FgfD;ljg!vb$46|t*Ur%&yZKAf)4=a6JG)HB;^o$kPv$e3U6ZVu3V?#YZ`-L^*RJ^H*6rv9X=kHywKwumoI0 z+o$+$mquDM^S9$8w*WX|2|P)$!ep>V9pg!rmc)ZMLLk}O8V+~}-#adL4F`s<18HXd zSa>21#H;gm-)N5%iJ2cLtNSTxlq`)0tJ25}n2d$(*uTAS!D=?wCZgSkTM(-9eZHRQ zsaZ4QZo2zX^Xf$}ubr|R>baA(H_Y76o>k0iub*j@X>qsNpw(UKxXB2928IHke*Szm z`A~V!M04}i1@p@sRDhq>4g$#91j_D7zppU)>c!@xj}y>OPV&(4Q=GIOhT2@gfjW6q zZ?WLXUzFkGbpGl(oriP`n7vOdITZ_e**h}vbAEq6g0)%Ftl;14wJ(|a*NW?Kfc9b< zMgIVFt9i3qP?o1+1<^4TRKqY>NBbWbbhRQuUqMKQ&d(u1l?LCFvEdNIfK^OyuMDy$ z=BN%^Ed-Vu8txKg`?{frKSK6);9Z$5zD+(AFE9W42s@m%yD!j0v2Wimx(5%EgbI-e z+nC;(jqx}jSc;*9~Ud$ zX9jn`ogeBS*`vM47}R}ZeuWOAyDi|$ZGzue8WNO)u5?0P-xnalr9vUK{Z~l8 zpfrmOne!5OK*odc2t;&>sC@e$^3y}Ijv-LLHO-PiN0Hzw3`j@3`o7}%2v5>7KV8&| z?eP04X@VG_(F_G33QhEr${&Kh$?94}g55fLWT1j9L?|J==R^02KU~POG%T)nLLr%E zID?|oPv&<~|Aov;i8u}y+wwnm{Rr;G1~mLbU70`99bhUryOx4^k9TU;Ul0yvSs0EN*PMEMoo3C29++*!<_kC+j!D4{#^BACuOB{~zH5DH zb?Jh##0{p{U|?8uv_X1{EFQo9ojWxjzD8T@@6^3lQt=9-fDz~8<9q8FeE$5na#O4O z!r~(Hs2IuWTX50$?@`P3=^C{)HSzKBZQoByCp|2#JBDuMN>F414FQWn&n#327U0j+M-=t0sb!OGA8E z#XsNf5TbBShrD6cRb6pbqVV`Avp0hayR+Qx)m`8|m6mKvk0qV}Y`CC06PXUkQ$lyM4;W7+39nRbeMLmn9;9wdeFNays%28DdaC$%13{UBI zQCtEV?vOVVkOXr~@*z!VAqEys1+ZUEqoz?Nb2U=cGRfK;0+)|f^C zJP`@heoznXhNhb!Q4tLoK&EUhNAKrXq8w)Nfkj?2F5(nZXddw;Sb-nhR(?qq;-~Cl z@lp8k0LduxFZ>i7#DN7lozBoQC>JFdMWMlb1iFYFO78MT`nG8lg^MJkM8YgQez0U% z0SzoAT^${c+_JN_!>)qf}1w7B__D=KZ37WKN!Wsed7MuCxiq_`jsq=81P7d4ANM< zO$mv`(IuN9G%Pq;wgN>ljeQ=$K22YWauupijfs0Y4bUk-?)# uen@-_j|958(VI-j1$49-vcrE3tv_6;|J$G|MHl{O0hk}QG%huAx%?lhPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00H_*L_t(IPfe0rZ`wchym z;)Gj4kfMYrC=E)aKBQ6~`~Uw*KcJOr9b4<&nRA(0O(wVhM-;`L>~7n%O*fT%Kgjc9 zG|GuA8xd#1+uQrc$B*Oj`{D31o!*W#aIJ&=)B7dyyV-1KvqfD`jj8_@ePn;21mIbn{cHOS6Qi|h*%{(73murF|s_V&a zx8Lud#^cg;``72PxVgmnVSv@@A0dh&piOfh$LY=G34$O^Q)3KApdou+kYx;=2fAkA*JZH1h^bn1_WS65Zwb0&?MRj_(m-bb) zlq!jNm@1Qy_^5OL8VPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00In2L_t(IPfe2Bj?z#Vg;zKf+cLDJM_PJ- zVdNADGZJJX8HY$RCYX3>;;pwPK81JQdF?wGAHZkx12nPu+wAVW)_+)QYcRO}KY}21 zWH#$Xy=cag>w0OL^?E6hBt7Cpczk?wI6UokueaM*!{K#L9oyKN@0|A%zsu!nJf2q7 zuqdj(1aP3C@dYta)G?2(efuEw`^91bVMdHbW2&79o6Y^h!=5uDNfJ+{QLpNikxOA1 zv6-g**=#{jL{&Aoy0yBR{2w6*0-&SO^DvCB&X4DLaU2&# z!4YW4j^iZ>L#LkCRVpo{J1LNC+jbo1t@K0sBpqG1+wEGG<;z|wjnuYf2>FbA+dOt^ zQNyzAFbqNel)ky{Z;6rEY&Axn_2F4_hTP(1#ebs~aR%bE>wb}bN#DydO;a`-qZXo( zm+Z3Cq!!v+GN?`uPtwP-{3>lE=3%NtLgJlH{j1yc?O!7k>bg3{QymdxqWs0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OB=L_t(IPeqdbOH)x8$Irdfy}0RKE)214 zY1`b34AI=Ci?KV`vW=|-SM*|9nQP13hU80RDp9skIhh(C~Uxvg#Zk7HXlWr&Fh}@(iKd0E4mFH$;*(vFE zO1gPh@@-VSF;J3;3&{En!BVe;i%Gb6DR*7OMfl6TrRmJ5bE-HL}fjkM3 z*>hy=rkITQ`H7>Vs0Yi;N*|K}87|i)0`;@G`Sa}^te)2Cbb7tM zs;a7@qC%}!8w`fp+FFanV%1RH;poEKMKC1UCVJc^h&cJ3jeMKU*4*4|Hk&mXO=V@J z)oOLS-FCa(YoH=W=m#h0@%9puOO~zlh%#{|=H{_18wdnkE*DZ^`(Q8_3Wb`QnvNMM zn2E^FFeINU`w$T_$fSYKZc41mdGLN+{3rxP_m^Xej%on#2==yp(DjnpMO zg+gHqiiSlsH8n86=ks9;+d(qsqs9YNG9)hC1I&WWPA!3(N~IDOm6w;RR4VY*)zwIQ zh#~v;fDa6Y%~lOTY8)4y>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Lb}L_t(IPh;4g$$GSc`+PO;^#=ai9fCk~ zuV3iN9HGav1@FxexI2meb`SrB7M_#!+=t4zw&$}m94ukqlFPF>k7si}@8%rN%^7Ul za(TDr@@>r%*j^;IHBWGJCda~9hKV5zv!fXHS8_Add9f9^aArCKrG)_jw&AB~aIM0z;Qd}6Q z0%!{#7(uK93c6`90s|9>?#>Wqc+$hSDT94m76;JX;-Z2;75oegVhjv2UIp9 zo=g$~Y1o*`4AcPhCBz1xI-qI=m<9yK*jL8;^iRO$VLO^Bc0O)Bmd4>j0#x@_uju388JOBd=7|gcH z3|NDehl@i=m;n(FKnfVZz+g6&V*pwWbS^MV;0&PIhB6GY0t|?FsPJT~@n9%-WdJ%6 z;u&Ca*qXrt43nkt4D(|^sc3oxL%stjY1H|0Fl;Gcn-T^}SgVtm;Cg_nfefGsPyPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00NasL_t(IPd!juPZLoPKGNN@XBV(`*_K{* zX-hBL%XWK3eDOhjQ4)xtMp20(ARs|7hy@e{BoOq$!~oGC`apP5G-@J(Q7#&95sm&M zzk)IOax!P;`)0lw(tXe}Qp-)$bN5ei51aV8bNpf_TfD^P+t^$So4X*~ZKNahbgY5i zs^j|)b7bNuH`B;1b@0nQbfuTB4~ideNE-ueJE zzw8#?^$BZv_G`R&Yef7rS-dqS{hlcPepCEB$TqJD@B4*UUG&azj*Qpy&pYYs%K|!W z42nNSrJuK@tx@Ugu=r(&eH#|n2H2Z!ezli^_MnL;12x=28-3P6SNhp%Ui^?}kbN4K zHikrC^$LB_MVGpSr|taA8Cc>-^M1?Z32y2%n?BE`o7v+I>Cr{;Njn1;TIqbNFxy1$ zo#aOAEMpD))gwI7w2F!fZy*q=tPJ@50iVwgAOm>4zW=eNX-=oh;V3T%g27-c7SCjI z)z$lQxxJ}WI-SmLznM%Xn@A)hk!U!q2ZLc~2zo@LaqzO)DgZJ7K`vJXnQ5j{sSE(w zKY^xsbv>F$m`I_l>v}So!a!Y*L?SWx1lu%|v6undPN$ows)h-Mk$?sQP_2ZCT+pKO z3L!3+JDE&x=MA_jOu%aB4aaDV00lR(+QhJsEq9g`xm+%=4a3AV!0lFv-(Lx@XtTpE zEJu_*rH4er;kE6u+Z{*(@pvK>(lM|gh{uhcxuH-PUmuZ6ch{DL1(Om*vE$b8j6D$) zEUBsrDgFQsk1Lmx(h}i-Ei9RY$Z{FFdOWJv>-Tsx=m~6LZ`=x0#ImelY0CMF9Gr^~ jtJS6`j&0acl4a#D3HGR>Seqfe00000NkvXXu0mjfdrfFI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/assemblerSideAlt.png b/src/main/resources/assets/rpmachine/textures/blocks/assemblerSideAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..833d80194da20d8e377663d3b0f3c72bac54bfe1 GIT binary patch literal 796 zcmV+%1LOROP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00N9jL_t(IPc2a0Pt$M|{ki_SwiBEyUD-#+ zHnz26>$)$%@IWFTQ3et;AmRfUViXb(7=p~jB|`j~hCqx6(HKlHCYs;_n&^v&(Zm;G z^uhnfvz6qexjnyg?mhRC8=cJEe%hO`{QmQA=gqs}R_56lw|$-49Os^laKopl$)8Ix z#Xh>&L&<~lbnPND*2a9@|GBa8a;l5{Fv}kl_-{-6r<=lbH*4~fr|J3#E%q{`JV;+% zq2ujzclTqtygHw=exB$5K0JQ7V*7r_wwSY;{M;G#{RI1Xh?093*tgeM7%+Ev<$k`$ zx_?_ZT(FL>_R(5@i-=3)8>1B4Xg_?X$x0D9xLXIUq zUqeHKUy__NGx?repVR3K1cG1yzds<$^@Tzaye!Kumm9woLpU7vdX=v3v*~oUu`!fN zrBPJB8JJDp>-C1iDm(;KQ&T(=QG>xoKvkoeOmjBd(%jqvT`Z=f1zw>!GWdLcO>0Ud zj6@=77%5HDlF3vo7T2_BG#aZ8%os)z&QK`ga(RfN_~6#{1UxW6YA3uv!;Hd8gt*s@sgx7!W1t{a#JcsvS0Ze&FpQ;jxZBAu-5 z5_H+`IOcT9Ac1&15s7FRSTV%ox;fWeJwU|T6a6(RXIKf&9Snw$8GE9rL{bz5R{R4v zJg!_%YHPR-hiWqj5yd)m#nJu#px5hzpCA_Y#;qVlEs7GBw$h+Qrfx#)c84U%RXFh^ aiqe1A{H#$FaCU6~0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0i{VqK~y+Tjgs3>;y@V14+!dNj88(DYH7<& zOIi@E##^jdwBA8u3?anLhFv$=jW7QHiDx<$CHmmxWctf@zG-Jp2UmWc>iSyL%25hb zks=4)lCo3|w_ow$1+G%3w#p zFp8y8g{oFp*VgK~zHHm}YCH(VqN(bf*`sL!=*?lY06&ZK9}=n=&ujQWnT<5LM-Fm{s#scoe8feO$9Hi1HT(^X%P0Q23Q>PTQL^{9G7*v zs)5pV1Nl7Ps2hf9n!IWj@1kY#)>V{PABzn_EWZM|5^o>5>JpX!0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0kcU&K~y+Tjgs3=+dvqECn4cbRB_eBSyRV$ zPTZg>)Ic^V#|57k+(2}E$w)oA_cpMUM$@#5Ie zQ(a$+S~*IADpKUY`=l&Y!EjR_b?iU;)@`qHb!cBi)@5Yf{3u@^SI_sYLAy9Qu!kLU z*f#q+p9fzA45L^oRj6upX?eM>>x;H+FU5mUESjp$nLU~&fZhj;KElu9`<#So#`79} z(547zWG7sLeB3W!Zx(}j35{%Pdk0~J)pZG9XC_<%vVF{4A-#!AF9v6$9pZF=-HwE` z|KiTxNstRDRg&NYM@RT|hP`hRxM1ui3sM_MZ2=Xa1*`#u@Ml+jK?2Mdcd8?Sv5X_) zoXh29U-uM2NYJ#x>y+61PD*koC;eng|C3U3=rEG7KK&-8%t>;Zslyl?ndZ}9JUmK( zJL&S!T%dwuDUOx@tF;|a&E^VHE13SBxC($(q=PsIFNT5;q7)C_3&40z$xA>8y^^L;e)Wp Qu>b%707*qoM6N<$f-e5_O8@`> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/batterySide/2.png b/src/main/resources/assets/rpmachine/textures/blocks/batterySide/2.png new file mode 100644 index 0000000000000000000000000000000000000000..403d7b2e22747f81389815622c6a73e614872436 GIT binary patch literal 585 zcmV-P0=E5$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0lG;5Rj6upb#1L~nk%mBuEv8vNJA09zT|GxQNj+fkw8qw~tN_8=C?<3o|YO*&!CLk={jS5QDeX?%-mC zgRVe2ymJ@73&;XWmjt}%^c3$earjz*3#M+eAhm_mE1&|jfR{j_^RBPIAOQQ$o$CrP zmT5$sbGf|q^)C>02!>JkKP5Ilkdo}=e3)$MF)7JefB(VFt-$8|y_7QN$!X?JV(=u* zn_K++B>;cc<)OJi2ggzzEB{w(FQS^wb)?oY{~>WT02@e0aSlNY1*KFe9=sQT^)IC$ z0j11xxmK%r^}5eADBo{td7jTYUEM&LriFZ-Z!|5-wryTDhj-C&cPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0l-N_K~y+Tjgm`G+dveBPeQ_@Rn=7!XG|U2 zd4VH4Az)BT5pGCmT3$&jRG}y;LTN#2#fD$PmfymHWf%ODZn|be&-J9CQM>5q$o_QC z9out!u@`2kZfJBG8A^jLQsgLjrY&8;VBH+H-IHzSTd#Dw<9_ZqUpmg${o>hP`O~)3 zZ{~+@-9g(PH0`6!=lvH7mX$9QN>sVLu(((?&3V^#7ve?8=WSi*l|6=`fZihvpCC-* z-JC!<6$G^~YElH$(i1L0ZWm9nHH-dZfm*t;v58g(%c}w}XC_<%(npv%MRFafUJTw^ zvxUPxUbh93;e$JSE+88yT@vu3-Cex@h^;pQ+%R@W8xm_syaGx<16Toat%I(9g8=LY zcd9MGSjG|Yn#p9PuX~87MKFxqpDD5VA1TR~{J6vQcY*&&NzVH79yhlFtJ8m_l=?6_ z&D2f|o}_tmi_0qk_>(RV%?&y@mf~3XzZx46Rj)50v4rX4k*fh%MlyybJQHpqT_JtN?NRs d#RjG3e*sj&byH(@2ZaCt002ovPDHLkV1hP0{ICE3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/batterySide/4.png b/src/main/resources/assets/rpmachine/textures/blocks/batterySide/4.png new file mode 100644 index 0000000000000000000000000000000000000000..90c9516ec4bba824a67a231d5de01c8b2bb7e912 GIT binary patch literal 593 zcmV-X0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0m4Z{K~y+Tjgm`m(?Ar3Ptv3>gjkU{E%?8f(gp>#tjE?M2 z_uR2P#}@}-mO2iNP9sBU&_#+I1rN2QE9h^UgSPvA*SYML&i3379p|*;TpSk956W+M zonA9Pc<%PwcE4$#Y%lg6DOgs%P$*I5^3w8h)if7e*IkMiA)mK(omci4h61|t7~Dsg z#)~w50md?ph}TReD}CQ?@p(uvjNG3ovH2e<$(MZpfiGVL{wF0l>+MerZv@t-|4J$K zYIK^Zy%;=6b9jS~p9J7fx;!*D=-^n2W99#9Y(-SPzJkOGrr(WR4ZtdrQJg~%Lry7G zh!^Jquzsf$j6f-~SgcekUbX5o4a)cHTAt^#PFFWjrfDIYPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0mn&1K~y+Tjgn7K6Hye!PfH7^A*^htZ*V#@ z{Rh*`v=j$|NEk|sRX{1k7}7KvQ^iE%#!uqb&*8#_i!NNS;7ho6!`h9WJFgTPT`)O$ z^UFQ=PTo87a1dsx!_eq7GL!~gq{vZlS6jM*{)RbdyRUbh58cw~p8KZbyzMyepBCR8 zlwa;Ty=H#!*zLFNe$zhLy4PD*u&jKcP@>A^#igaHX)d^~yBI%&eBRb|uIw=k1$1v? zFo!UWC$|L3sUWC@QIjH|mY#44^7=H7omuqm2-MPz%`LP#SXmW#Ff-v2kUqi8DUusV zbz|_>nk_u5_mK?eF901$G_@aA53?1`=yXJOoNW1Go?5TF(w~ z@dw|22*AE_r`iIHWgHRLOeQORKQHigNHC1t^_1BBpOj=LzkcKUnZQj_lCyG4!*hYv z>3>p69gj{kwHJdYX%5fv`HKMjNtcJ_fDVqOI9C3z#%4s->&r+iWBS#|)c~v@8O1pS zG31m|h4|sU0IbWDf)OZX7K@ci#j93*ra}3BUCZ-)*6Hd7$}}xxv;3lIS+;HSsyV!i kj>B75(qerqHYm057xET)q)9m5G5`Po07*qoM6N<$f>;R&j{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/batterySide/6.png b/src/main/resources/assets/rpmachine/textures/blocks/batterySide/6.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac184ec8e3cad0cc42ee26c06fbde25f1e33276 GIT binary patch literal 599 zcmV-d0;v6oP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0mw;2K~y+Tjgmia(@+$}Ptv3n5T|Hqu0t&8g!8&N5O4v=?aFM=BVqw+;iUbD<}KztDf_^=e&Jf zesfrTzUK_u#nD4|*tLgk`*`Qh;GTkI6-%WGRjn?stkg|&$#vc3_#qUFwytw!k6|dF ze-onxgjqbgAyCZ(K_iUX6akIwluMA;hebS?$KaMgBiq{EL8phcb%FbHQ!WA7W6Yf( zy@^ae25+O?!LtE&y8`L(!kvFFAOn;x33$=L0e=3**Y5%xn7GM6Y6Gb)paQgjyFj7y zNp|w$6u<$~;X@GqWFqCuxpP@$r)Y{Arhm=70{4r8rjpuhw=%HJhtQtzz~?;%WfakdERU zf*1-)sZ#v#UI5m4Na9T9$3wylM{b lqT}$^RkT>2hz&|D{R8BQd(h}dLCpXF002ovPDHLkV1hPy4Q>Dc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/batterySide/7.png b/src/main/resources/assets/rpmachine/textures/blocks/batterySide/7.png new file mode 100644 index 0000000000000000000000000000000000000000..150beca2ac9c7f475b22ec968f615812eac006f4 GIT binary patch literal 592 zcmV-W0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0l`T`K~y+Tjgmc2+dv$~pS(d@gqTR2Gj(j| z4IJ4Cp$1WkutI{uI}sC#A`l8tsa2PLlCJ$69XfQ#(4hlgqDvPRmM&e&b3Qi^!NBR! z`KSN$Kl|?SVc*YEN50l+WGDryNRb0?R#~co{+d2$+vi)>hi>U=*S_djmmTZdQyWckZP4i^qRc}?mF!F^$i7J=p7Z$3zK4;tZd^iaCys7G(*`sL!=)S~Y z8h#2pFC>(co>%jOCPhFkHRclJI9Qlh_4~p z4Z&Gyws89o-+oAl`}c18qXfBtQY8sau(yZbfAIaM1TGl4(Sq0tVsC*G&;VWoxz^#4 z`hos-rE%z`bHb0S)+{w+~XiLvYDLVAfF;C(Fb6M$oDiZA z4&DpE_@9y&fe?DJSgBN;YSm>LlPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0lrB@K~y+Tjgmc2+dv$~pM-=!tEy8I=bSpW z^F|!md7&=iO;{;GX@Qog6N;iDloliq3!j9Q&%w~4Lxv6=_!3>Zu&}VO(C2(6G=ib0 zN9UjZ&;RVZ$A@h{L+$ulx0R+8s3JuUyjRLn6%3a3VaMLzu#S7BgH8Ku*ZS7Ajy@I- zx65BPtbRK`d~Xjr=AdovuD$Lr3K&MdP$*I5@?5oA)AgKf+jHR{obbH5AG9d~>d6V0ARnhM@oonF=Mw74*6JEYmpD6@u#}o`2}tfDb%6LX z61@5T0AeT|C|LDRDTro`qaQj$Blx{bE)TIS`Da1qls7((|eJt0GLNS2y^g4$O<6};o!Xh zjQfjp9zzEL*}(=>V2EZ#-S;;kzwu|5_X bgvk8`G24H~YM1}`00000NkvXXu0mjfYRv|q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/batteryTop.png b/src/main/resources/assets/rpmachine/textures/blocks/batteryTop.png new file mode 100644 index 0000000000000000000000000000000000000000..fe64c41d2e82a614b18fbaa92e2af09bc93eca19 GIT binary patch literal 581 zcmV-L0=oT)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0k%m*K~y+TO_FO%0#Oi#{RN_3jDC*zQ2(@Nn`H^!9p;>QXXc$b>)1>yAQ$Ne z#poa?C5C`F*i6uc14oVyzV6BF^H~Cj^WI2;k7f!h$Ir|3_jMMKJB zfUzF1k61HdUUi$iW{OzvD)V!bZI{EsushqZBvsb~&24pOabz#=HP-z4$^MjFTr zvSnb+!0rwUKBMG6-@oIw)odO{VjWfmxGUX~jx0cBXUiL*NEp|$wput^+_n`z}26%6f4 TvcUKI00000NkvXXu0mjf!w~R0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/breakerBack.png b/src/main/resources/assets/rpmachine/textures/blocks/breakerBack.png new file mode 100644 index 0000000000000000000000000000000000000000..0412f2ac390a87af1d96e8286f2e6d4c000892c6 GIT binary patch literal 619 zcmV-x0+juUP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00G-cL_t(IPnD9(tLae`$IWEoU27*)oM1IAAnk|7LUiX*{sLoi9{lQgz))%+~o6lRxaIc zcQ_n=0Q7o&Fc|D~I-yV~m&^SXqTB5j3WY!*Fr7|^!(lp|roiv_(}D;&cFAP2(P*4b zr(&@VSltl0}ybA`$LFl(PFVU91i>azS(Skety2c zzcZM~U@$;47z|M8^?Ln&9}zUc&Tp?17zyKu8|q^0$G4dBJr|AY6UG?U3hqfykJ zT*Qm5aPM|ITw;an3AcRj3002ovPDHLk FV1lil8=3$B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/breakerFront.png b/src/main/resources/assets/rpmachine/textures/blocks/breakerFront.png new file mode 100644 index 0000000000000000000000000000000000000000..5adb9d7a4f0294d5d484e5d2faffd7ffc5f9ae39 GIT binary patch literal 643 zcmV-}0(||6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Hw!L_t(IPnD8MirPUK#XW#iw-dJQgre;{ zrd3>vTM<+oKop_X78G45ttg_1qNt#P7YJG903n-PAd4(=g^*Rwke~h`o!%wiqNw4$ zSKoV8qG&Yw?pmQx$nW?2d_IrI^Xc=K_a8pS<8k4X9lPEB`1lwM1}}tGt5qlzDwRqy znat&K4u|9Gx9@N)7E7&GW1r1LB9YBzF9eR$>GWVQ$Ye6rYIV2Ug~Q<=KYzi|>-F>b zd@`Ao%VhwmREicvT*s_bDz)3~^ZESr^b`mLfGU;BhlhuJK3^;r8;!<#y=FxH(o(nE zMSwN(!{N~Fb}JMLjYb3WbUGc6$6l|uSS&i7j@4=vxm+$}#^W(Jj7B4^R%%W?+gp`NMK~N09k&6aM5KW~T!J$g z41mz4ZfB5#2M8Ub*B3bHT~fPe;ki4_5&6duTAGGUi~fZpHV zBY_hdi$o&8USsX|`!CmG7t^#PlgY3MpGcmcpPS9*n^>32C1~Q~m{{-b?vQ7~lE>a| zw-DaM`gai*1X@Razuya5)N8E#7PJqC!)CK#q-i0OSS+?$t$_A%r>OKGf002ovPDHLkV1f)M9aaDU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/breakerFrontOn.png b/src/main/resources/assets/rpmachine/textures/blocks/breakerFrontOn.png new file mode 100644 index 0000000000000000000000000000000000000000..2a22b5ba2a0ca8abe0da7f8a10112a07051c6b45 GIT binary patch literal 651 zcmV;60(AX}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00H|+L_t(IPi<1UY64Ldoeyvq6+ux^+}F{# zU@f*HsJMVAf-5LmC{Z+`$cUl?DwraTO&XgtNs}gNQYB6PA*9MT2x|A4x7z(fB!&HvtTgDW^rRM7`$FDNs4u=zo zgvn&u@1MZYYPE$z0r$8Jg+lRooFO0`jYd12PAnG7=kv?u(&O zX0rf9A`wU+@EmrTOr~D1Z@1fGvFLKSKEJ---am{+V=|dcr_<$fc{ZD2MRi6}v)M!e zoKe2p?OLtYpWi=lz}##$>-D-9K}Mk7=yl}aeh5YPvjv)k_hr!D>gXdXD=2D z5H4&z57@=(MtPd1*;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JdRL_t(IPi>N0i&9|}hWGDq1o1$g59lPK z89_QWX(VEv4J8dcAf|*es3;2RC~7KsWl>&4-Sh{dn}}}u33U}jSN(>bJv(AxT5J~U z`_}uu>##q;<#JuWFo(lov)MEn&C$`(+jsAut)I)~a+OL&%4{}kwOXgsX}8-&LbX~= zrBeBPJ`f1R<8e5jzkG$GP$&w80{2|{{r*@iCKB{|y;`kC9-P5o@Or)I{rvSCj!Y&) z4q=^62Y_m{AY@KWPct|0u{+k>i7tHWn$c+d_Wj3)kDm}aaVfKRO{J)#7PgchI0%Fn zz5BD~ZTwl$P0-4DX&3aX*KbTFQ~K0Wjvk-a{4YoMq)&i{Fct7m9^Rw^2Ks!qv{)=u zhT0zD(d+e4C5E=$Zu|ZIU@)LmrBXp691e?XW$Q$(R_pA-_&X4W!=ZHS zcDpnK0UE8MF8*oiP9_u5&1RFd1VtOqk(L&V1q8~n34!0l?PX&Ipt)R*iK!-OVMvPv zR>^BYd$ZZFB|KshZNJ}7r&FL(HDKaeuRcCH#6qDEH~)Ej5H3G&w#*tZs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/breakerSideOn.png b/src/main/resources/assets/rpmachine/textures/blocks/breakerSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3cc57c4ff5e1f0c20597bd3efc907c153eaf60 GIT binary patch literal 691 zcmV;k0!;mhP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JXPL_t(IPi>N0i&9|}hWB02U33wsAs)!{ z0i8rNBS^<4jW%MQ4P`X&fS3}>q@pOODQYUrm31M}ML#3D>4!vD{f3@BJ7S;~o5lLR zwcdBF_3lsbdcF6r% zWQxUNI2=wUlVE=Q{PpSc7qwblDwVkBG876W5(x=lGMRKb9rVAr>N)T_xqwN~QphG?(8a1#h02G1Am z$M}n~kDyZsFmBLz+i>Tm)oRV2*{kuBca6};$us#Az(Gt0{Ogww>3~sv_tp)&-A;#i zKu7jG=6NNaP$RGhYcQz8;UK13qtW31u0)DWd_JGNtw3Eam&<0e<#KtsT&~yaN~MB0 z)oPW?R4Uc$^`_HlI-QQiV!$LoFc@q$n~TNbcsvp`8jZ`#%k6eMnM_)(7T|n7ABjY| z-LBv7mt+OH*=(p73LxFP@m002ovPDHLkV1gGkJAwcJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceFront.png b/src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceFront.png new file mode 100644 index 0000000000000000000000000000000000000000..65b69a046ead87fd739d0df2097b7f6a7a7ba090 GIT binary patch literal 764 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0&Ph|K~y+TT~KXL+F%szURc!3Axd9pDW!$B zw6sv5fFjy$ya_5G1{~Ar%p^|dL~&*_)6Fe2TbAt8{_qZJ{IDmdH@)|sd+vE2!VEAP zPpKSfTk)HJ+2=*POaJQIit00xv236+nbfA^J~ks(%fw8dH%eA zP&EW-5%H+r-`T$Ubo%jNZ+or1-fEPcxtA-A(tO_Ka*bb~PJQX*ZSP{x$DX03i{nG6 z7Bqe~?29m--ujEeY;JUP6jZm{?eTcLUhn0}(UK`DEIG6U`L&X>)9tL*D!Z>Xj`nt2 z)iS7)*9UBxrvLu_Rf!596B6Tv`~9sA7#JBD85@*?Z0{5 zckgWa88yAImW5}r0A(yNQrFzFV(Pc+68oEmS{7IG4k;K_85 zGPx;q9hI{M3jPT!m1QLm5U?5GIG*Q)Kp+?lN}?E&q;M!CBLb)}j1L2xWhFD2>15K5 z#jHdkmCeqi)7e}upGu|CLNtt6B%(tFHzF{k>qfKLs#X_^#j@i(v+b;DT8+j^sZ`15 zooqH|7;$iJH{g?HwNNNOqGAsx)%$Ldc+9D)UM?@VNb`Y5LFL}KUsbg`ODtSMCY_#6 zBy3$bBatX1pqPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+mTbK~y+TU65H%8c`I-Z&D@JipVx=VPIf@ zfngX{Wf3MIqU?)^2(i*gw2GpjsibOcqiIuP`p~2=eQ&=+lYX@xs_~&Wzk71eJ=_0Y z%E*<7Fqvl#EnP`@a`>)#Xjt;I*Pd;5;40d=r3o3zSmb|u0RUV}bp!rZhLq6s@4U@*{+NRs3@o6*Qn)JuS-4F&^aG@48% z)@-)0tkq)SzyfeX5F`}PlH?187JR;dC`w+he||n349-U)F~2_uA+UlVIvh^uLXs4M zBBxW3bCrdSZm_oPEwx?wO);65YwgflM=Ufw`KBY0<-_vh1lSyB50zW!{tp`cLcQ;3 z>&Bd_IJeKx-EVaM6CM9RyI)y3|0Ib5m0~n0qzZf@YmVn^(KNpxOX;GJF0+{ilWUun zYFsb|&%kj4Q4|g0tX4bVaJT?L@JNy$tj)#)JnwS5JpjX)F$^D1fEs|N;fuyRxNr{w i0O$&NfL@R3_1Isk9-h%AlNW{n0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0qaRbK~y+TU6Ac>(qI(D`!^^peHj$`3Vorp zP!Kl7#1A@+MkQu$#zg{ipa>arVJ1#vqW`zQ`Ye1fIlZ~(-gD2reWbXmHYD8n5WIs6R`P#nXcjd(>hrEl-z=lkh_= zRv$(+L1~XO=Xp~9z5NP(*Y_WXCSu7_ORUCQw1>9F8Tdg_j5GVkzx}UL`$b}z${i_d z#oUJoW3D8b9UrZxA8?_9`r_jhO8wW>=Jp?sd&LvY?iUvm-`{IoFBflfPvmd9F6za@ z7+G-=Pur`P$IlM4s?ypk4J|b`?!JEdge0xVc};=R9r;GrRJdQ#G|hFrYSq;BJzyA> zO2w>JYqgqHuiKX8*tSaqR8&=Cz-YI#!C)VByS+T`4~GZ+{(#u&@*{iYzOC0jt%f U2!Hjm^#A|>07*qoM6N<$f*$D_`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceTop.png b/src/main/resources/assets/rpmachine/textures/blocks/btAlloyFurnaceTop.png new file mode 100644 index 0000000000000000000000000000000000000000..46ba7785be22bcfdc98abf6f2a97ae061a2b124a GIT binary patch literal 480 zcmV<60U!Q}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Z~arK~y+TMbS%3LQxb2V1I-+HN{7w5g1xH z3W6YL6a+zFRMa3sC}`%OaX-B8u;c{iZuV=fz4pGXS-+Y04~_?&_1TI|$gWNotc=hT zrmf|>njPMp41Rxh59brkr85^`9tR^f-8 zc9FzWeq2v+@Hv|J$=oi6lA*(1048o&jr|TE&l_Z%bkLy8k+~Rm zLvgnpl^uW-i~~R!)*6Na28B%7!M(CyBPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0xn5JK~y+TC6WtI8c`61_n*|H^0LUQAdj{J zLg=zkmRCpavx-swTMKwA0s( z_%JAdhJ_FGy`Eon3sX%-vxMTsSqcz{MJsKf*WC=b zKbHlxk)PKU!f(|CU@7RaPHOUPCj*qMP;&m^PS5cXqR_bi9hdau1Dp^Ym<%$qDCS)E zvizo=K6DT)7kRYd2Lp?tdq+_`*<^E!IMtFg0VllDlGIO6lizDHFi}7UTw3?D1|>Md zu|+dYh$KY*Y^l)An<*g)muB^(aH*An>2WBe-?q~ja8;AXmAD~^ZWoo!(2;eLm8aJd!M7i&AP0g#5mDCti&%j%U8~L#qwEAFKB{SEY?BDvA_2!9IyvHHZ}kg j31KyM+qv`7X4?7>4qzQY#V73L00000NkvXXu0mjf;ub&O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/0.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/0.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc4327d2c6515e989719e48726bdec29b1f4bec GIT binary patch literal 802 zcmV+-1Ks?IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+UHZK~y+TMUnec5>XV#@9O5RXe0(TVmt(P z7Z#RRfV=o$-L+CsQ4xHAqORbh5X&hIe$YxOvl?rhDVmzfrkVcC&f<*ioH_IPp2xlS zoJH^vga)jor4_6JDg)qn3ot>n6NL6sHaFu4a=Kf0G}@bBZ8!8fgP}uj(-};y*E{Vt z9-v`1kY7W2_GgL@zIR23R%P+mP+hTcCg-+7Qe^ zl5HdjGqvLQH5?~kIPef`45|W2wqMGoCLFPpDHgKJy%g`Wa8ws~F=X!#^vFELb7mji zH4y9xy1IF^2@CUXM4$m&HGhFJ}$)}vcD=p z85E=50Q2dv`1`~5#cA>Tv2tFSno3GbtEt&sa$;Qk^;-G+ap%jcV*PNTR!)R`G>Z6{ zdTqn#cO#S4=%x-f@8$B-hzlUvHJ=@;*B)M_wsSE!9f`c>?Oyi9PI@;lma~J!86mGs z!yka2?Be+Q>e9*6Or;<{n(N!h2t$Gwg}hY#NcnSC{&}+g?M3F@ld-ww6pHjA);l#j z`t_)IarW%TX$exbay)w1rOt4Ev~_jw-ikCiJE}g(!N_s(bM1d>BQ2;6evhNFHNC5h zlotBd(?WhCG?ozOvx$lHh&U8J-Op7wlcnqs#8VO%@-ZmLQK@0BFvC|1!{yvyX|7-0 z=9&cjcyXYzCa+9}cbCQ0WF#}<4|p8NNm<|$*i~=9DMh`55qFID2tk(+bixur!l_{& g1EoIJ?xL*!0MV?W`Y=I{N&o-=07*qoM6N<$f{EjD9RL6T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/1.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a536d3119d566aa89c3c3b4daf327e39c80e1504 GIT binary patch literal 808 zcmV+@1K0eCP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+~rfK~y+TMUnec5>XV#@9O5RXe0(TVmt(P zfraH2;4VH`cdZmuR0JQOs4Ms=#Bxf5AGA`+ti~FrqN&Mjn(43T59qJzEY8@@nKPg7 zdE9%?Sp*+JsKA<0TVDsgwjn2?~ zwcTpr0P1D|X*Btu4Pj<0#&|J*7<2ouPy~xa6~6QkVFQW>31FcSrZ-?+HjH603x&}R zrQb>`Y-bb+V6y`trwcP#uuda9iBzdIdc8}dGir1lVCr`8hBmFX4rZ15CS=>RCMY0? z76fyUWD7~cOwBlc1;+^(4m@JH?2F0k`Z~w4g`1x-0{J8M#P(CeBOeDmG<>YiWF*Yjvcq#vWzxDY=p|(F)EyaUg z8ijrKT6InDb0LFS@1pkB?__h6i1j1dIhz@&RqtP>HnUMU9SNNK^-kv5R%$yZlrsH= zDLyAp!XJR1%>3xv%EHm(bU80QnCV$d^8>sG1wB;lK>l@7Iy+kZ`YiqC(a6kV5`}vZ zMv3D5MXKBuPL30000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0-s4lK~y+TMUneb5^)sAf2*6jqLCQXh;b2E z?#sdkxQiE7)=EJ|MeqWOx`LNNET=U1Lo21sYOHZ8nwrd}nf~no>H&I;-k>+=EY8@@ znKPg7x%_^=a~8oz5DKt{hDNX&$P9qv4ZsA^Oc2U5SznJM$f>SeQz$QkHCUTig+IDnd&KKYgo%BzrV zQ5&FuAes=&L6S`*2{Sd~_yrs%U^ws)tPLsyNj9I!x;h*=DP7oa7CR}9G0;>Sc)@S( z_H~FH#nF1k+SbE%u#R@lqvt&ar&W(Q)?S$IF6YE&8?nlIv?N6yO5)?STSr^*ozA>!*kLPy5nwX>2SWnOjUuX5u5m!k4Gg_tzWmpX95% zGnHb@&sb5=YpYgPv|bm|8MQ8IXZ1!VJC0}{vO1>IL)FUd^VE7K45uT3b3floKiWuc zW`$z9H$TB=rE&NJ(374Wep#M7xSuNJ#5+@6D=EH@_aMKAs_seOj*2G-%O4-5Ufdg+ znopoVf6(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/3.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/3.png new file mode 100644 index 0000000000000000000000000000000000000000..568d0a01d7de3edb5944a03aaed786f0ed4c54b7 GIT binary patch literal 817 zcmV-11J3-3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0-{MoK~y+TMUZP#5@8g_pViG>(MSwx#JC77 z_ho?qck#l?S}CZg2wp%@SMXAZ<&*|5v{K5f#u}%hsmW}b>22?;*G(UzPf(wr&f<(c zbLPzNe=g7SoP*#Hgbb{%t{$uk5(D6P9WX&O5`_Fj*4E+(a*7L=Wb*T14d;{!m8wZ; zP^dKZXPb=%7NBYdkXoG^+7PBUVs-}e1Td!?^9QkDNa9lu5!x$xkN^fV!qgh9&4k%$ z%s^pgtJH5aOKh=A62N2uKsE=aGhnS+_!23TE7WR-LZwxxTEOJZ;5AK3Wfk-?`9;V! zDRodl5Df_CAjt-jgqiAb{0xp0FdTRYRtJ@UBpXj;O%0ChlqTde3hflj=xC}1Jnu7h zdfEh*Vrea7Zt3#2d2Ow%OUt=*cC!|-UTc1`vy>GctwqbLk)jyBD+>2lt{rT|wwAA! zL}51{fym~37|Ng+wRr7}%qXHg$ZVTT4OGh4PgASu5ZsP<*77DY?Ed<+*vt&cVjL*Jl>DK|3oj3gb4qt z{6Dpn;G_n((^Om;T^IZEQyq&5E;HmCi1L%E=uo1M@A2<%rc2AQe5wcH@i6UUEXYe! z@m@MR#+I_Zg>-j*qEp)DLKyhwbXRdfm>c%5&+_xJK(f#6ahi~o(!nFJt9Fky9CURD v93j@pd2O863QGhDxB3|ilrnasjne-E6Gy2c0zE|P00000NkvXXu0mjfMNMqm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/4.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFront/4.png new file mode 100644 index 0000000000000000000000000000000000000000..858d3263c10e35de1416dc3dda3e4b7c7fe948b8 GIT binary patch literal 817 zcmV-11J3-3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0-{MoK~y+TMUZP#5@8g_pViGpG!lavF)jkj z9TqmgUA(ZeRthRAf)`NK6}%K;Ii>Sgb%*G(UzPf(wr&f<(c zbLPzNe=g7SoP*#HgcPi%rWULMA_L%f4KP8}6NKzkR#)Q)a`H=8q_T@(br%$JrLsYx zmn+q^=Nk=r2B2bkkQ%KU+7PBQU^WW#_%VkY^98U#P~$>v6cx}(WtSn_ zpwL1ALDV6bLn5h@NMNQ~96yKS1Plirf|Wr+mDK$MyCJJZjB|iO00000NkvXXu0mjf7r<#( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/0.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f96b27fced898ff36a9172d42ac78aa673beef0d GIT binary patch literal 865 zcmV-n1D^beP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0@6uDK~y+TJy7dUQehZ>O5_}Gus+mgPLSjP z2jL(`?xG-IDqc|0@Pf+K3!#WOQL!|)L}v~!h|Sj4)^clY>6hHJFWH*knyvb%TeUt_ zTU&oYFS_~e*}LC!|NS0755uyNF_~G&&OsU@z+f;D#;{xrV_moz84Sq0$zc;ExP-=K zs%$R7CIl>zilwZ?WJ;dcz~+hBB+VvO$St4@%mNNTa154{uzv(!zQOTlIQtDJr||P1 zoc@AOXYlJmN-~g{3sG36f1xIc4Q(8bw99w@8+<3Kz<+Ypr<-BMLIPd_X#I zJO{^-rYr^{lfl4{IP|07xzIGg@!Sjd>Qx4ai9&;-*sLZrGOm=!N54@~te5l58bTxG z$OQQnG>;|=G!#cmam4}-XlT)Jr#|L4FOJqPj990=rYWy^K2Wn7wapIQj(N=whpi|w z=`o=)R19jlFfl*$I2qkYMm8P=*Jj#UY^Gk1-Qlz~H5#{aIyva`D(xfHrcW%&mKu4*(Lj2cONs&{6*Yq-B| z&}a2I^nKpeD>?(}>F#Na&-&)>xkkq9es_((Q(vW}KtU0yh5qf-CBD#XH7>12FWI{Ls?!an z5`Hw;em7_za9dn`)jcihhI(UXcYRZPt+7hE5OYVuT>~Dg)2?f-DO1RVKuZa`Me1+U z#Qc_!vvRmYpT4HggmAd0V%leRH!CA9qsOMYQ(G#R@Igdy(GqkkwOnMPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0@X=GK~y+TV*mnnb}k@dW8(xOFayK}GFVvH zfNXYl9(Hy<2$z|eg@IK{j$c)qL&u0i-;7IMm0wkjPs5DQ)Q(->R8h;GUr~!+(}-Ww z49Jz%vuBf*V_?WBV(6a2u!;?=8cV01ExXbYHJ;Rkp40qo! z96HaibUi~}83RLXGDChj!|H7e(-tsnJ;1Q@2*a`s3^jD9Q0`x!=~kWW+?wkJ6sbsZ0xAP4W-vEY?{CVSF{OO+l;X)fITLF_0{xxhl7hoy z{QZ0#W_4%IonA4iJ*U4trJ*FqL|=`;%s{=rw~)7^S8(x4?t+r?!ho3gAO>AS1~tvd zXrC#a`4B12)QqeISD@((4i-A?m2ovCQMqZJ87W>V;WqKfL5x=RKt0j1zU}oX4Ydh* zMZu|w?x~SBj+S~1CVHyV+R|oCtC-qfFsUP*yDp5zr1Y!%>cY@)BuV5F-W?4p|*Vo{yyk{@H2 z8({+q%@ijfyD-+aD#bZ5z_d8QA<5q?%)`J?M}Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0@X=GK~y+TV*mnnb}k@dW8(xOFayK}GFVvH zfNXYl9(Hy<2$z|eg@IK{j$c)qL&u0i-;7IMm0wkjPs5DQ)Q(->R8h;GUr~!+(}-Ww z49Jz%vuBf*V_?WBV(6a2u!;?=8cV01ExXbYHJ;Rkp40qo! z96HaibUi~}83RLXGDChj!|H7e(-tsnJ;1Q@2*a`s3^jD9Q0`x!=~kWW+?wkJ6sbsZ0xAP4W-vEY?{CVSF{OO+l;X)fITLF_0{xxhl7hoy z{QZ0#W_4%IonA4iJ*U4trJ*FqL|=`;%s{=rw~)7^S8(x4?t+r?!ho3gAO>AS1~tvd zXrC#a`4B12)QqeISD@((4i-A?m2ovCQMqZJ87W>V;WqKfL5x=RKt0j1zU}oX4Ydh* zMZu|w?x~SBj+S~1CVHyV+R|oCtC-qfFsUP}MP{YYe&(2KS-a^OH uNYm0t0~m-vF3?m{eRZHxeJy28RRsW#t=MJ22X#3B0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0@q1IK~y+TV*mnnb}k@dW8(xOFayK}GFVvH zfNXYl9(Hy<2$z|eg@IK{j$c)qL&u0i-;7IMm0wkjPs5DQ)Q(->R8h;GUr~!+(}-Ww z49Jz%vuBf*V_?WBV(6a2u!;?=8cV01ExXbYHJ;Rkp40qo! z96HaibUi~}83RLXGDChj!|H7e(-tsnJ;1Q@2*a`s3^jD9Q0`x!=~kWW+?wkJ6sbsZ0xAP4W-vEY?{CVSF{OO+l;X)fITLF_0{xxhl7hoy z{QZ0#W_4%IonA4iJ*U4trJ*FqL|=`;%s{=rw~)7^S8(x4?t+r?!ho3gAO>AS1~tvd zXrC#a`4B12)QqeISD@((4i-A?m2ovCQMqZJ87W>V;WqKfK@1=MGweAL9qZd(pVCm9 zkXIC(n&_SyY2#?A$6%tTI;|~j*0hSL{RNXc657gxBNBoc9(`okxHmA|b836m^l5cd zCzb)F8jJm{j5Wc2XwQS&o1f(y5bnva?-Vc|oxL17CzQion;7p3(qN#YQl1l6wCyc) wER8fRjWmFP2;>4yHPu%KD%ICg)>Ksh08J&^0J`G&umAu607*qoM6N<$f?5%KF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/4.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontActive/4.png new file mode 100644 index 0000000000000000000000000000000000000000..abde225809185d227a5761443f6633b166805a11 GIT binary patch literal 869 zcmV-r1DgDaP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0@g`HK~y+TV*mnnb}k@dW8(xOFayK}GFVvH zfNXYl9(Hy<2$z|eg@IK{j$c)qL&u0i-;7IMm0wkjPs5DQ)Q(->R8h;GUr~!+(}-Ww z49Jz%vuBf*V_?WBV(6a2u!;?=8cV01ExXbYHJ;Rkp40qo! z96HaibUi~}83RLXGDChj!|H7e(-tsnJ;1Q@2*a`s3^jD9Q0`x!=~kWW+?wkJ6sbsZ0xAP4W-vEY?{CVSF{OO+l;X)fITLF_0{xxhl7hoy z{QZ0#W_4%IonA4iJ*U4trJ*FqL|=`;%s{=rw~)7^S8(x4?t+r?!ho3gAclRX80N2x zjP{w*nGccTOwGtja0Qyq;9#NCUKv+Y5|x|gnUUg^5^fWp9K`V9Kf|6A(Xqbm^(hUt z33)}qsfq5Xkv5K&dJHCds?*xiW=*S@+FvlKBcZK4I3gjK;n7Eije7&bJ*T#3O`ldb zbz&J%sZeZ@*9v2S?Mk>cry0sPrVSm|&{_cViQMbp|6{)nFIh)DVm6RG0i1 zyW9vHP-vz&0ojGIwpA(4i2!%hB_(?8mjU@OMqczZm8j8rDtcRZEvAt vX{2dsqyY>>AQxz=slGZ;slJx7rm6w}^#9!>kAuvQ00000NkvXXu0mjf3e$sg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/0.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/0.png new file mode 100644 index 0000000000000000000000000000000000000000..d30e855f9958dcdd56ecd6ac1564e24c035eea3f GIT binary patch literal 804 zcmV+<1Ka$GP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+mTbK~y+TJ(2lO8c`6(-`1_mp;RoiQ41)r z3#^5ofTn3d zsx@|KLs+j4qivYOjhXG3%ZK@f1%CDru`q%M381AA)~&+&^cZcyv?N9ug?=3+uz?mN zfZhOrO#PTfi}k2sB#}fW@9yrGE7fvk7nrOQysAT?XhN?<_7<`o3JnwxgcQLZB9T-i zf}O-T{u0LtSPnb{n~Mq{616?a7cX!`ld55-F6bdyo5n(Rf#;k$zoRe6lB`8-qq+u} zKE~9;TGd{whNjerWsJp`znTl4?M~IULx-8bK_+;bAHS@GkGDQlGr=Fl5JdLV0VsoF zt|0n_q>iqlLL}U@gr@a5~~xbNyiLXm7c=KDn6!QdE|bNXzN^b z@~)nLxc_!{^#xMj%VFPuskuXa`}y9T{7fV|DU75y1Vh~UW#xI=RANkMu$%Rj!s4d_ zzmXbECdO9hJkwKLY-MV8ae^Ch)vBp-X?Y_Ziu1n6_<+-9K#YatM=iMpwwfE=i4PT* z{K9Ky1Hh%#!NY7Y6>*i5TsrLjIAM2~^~gwS;1YN%kHZ-7S%=*H!>rlMn7oV;9uXv* i>arQ2)JE$}Wbc2Mx~xl>%A#BV0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0-Q-iK~y+TJ(1~78c`I-@95MSK&e=0qn1Tr zSVneP28ud@R>cJrEutv93k8*8ii)k)q@ZaHuGp9~Y0^)9i9SG|s%J29a&q$fpXJ_r z&LH>*f)Cc##sg~t#{f9q222p`1R;Est*tnMoap6izVHQ@;JH{Nk#vfcB8imO(WO!{ z08LYZl*uj7hA@Q+qs^Gri5V=I!-IK-IezjGG1@o}5}(3EO3 z(bg}D9cLG!-+u(Vd*xy%7N18(E7ItrE7P~v7n>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0;EYqK~y+TJ(1~78c`I-@95NFQ7RVNs09?5 zVG$TWmVuy-pjB}JMT;oP?m|JOn4)59Yf{j(23KrMnl$OBe(VFZ575Wx8}to&1`{VI zC%^w$?!D&>f{!2sU@a|tum*4pfa5K|1kp+mqI=ogj3da2pFS6eo`4A-OTrr8P8nZYsgBi2CG4~M14;~^$E9XH1C@F+>$*^8ErZ-|r z5~H+Szl!2mqvs@mS_6P|eV9Utb<5#NJb_5u)zv4K%Ei)7Fi{71S-V8ifF6P98D!ff z3Me25A%Z!0JRy$jSEGg;a4AEdndDc^B+?7S2>+I&$? z`99|T5ZOz5p$v+V)1s*zZ+^KhU0oNiKIbkD=Vt@n)nq6f4a`ilcb_)D-tJvibG2&v z{qCHNrjWy|sht(tPR_*Ne+YMWONC%GHiwKBMCl^SQ`e{4_bGm6BO4!u(-F%Us{5;l zyG!}CiH)>B9rnahbMObCXL)71dX#?uHoo;blu3+bBA#KF3E50!y|Q*!-@B>pT%N=$ zrO;wLg#P|RKYz`JCvK|Q+xokki#L$^Pz<>Hb&VOSTMzecXQzYV3H199s(q&n!@{sSA`u-N0uU~&Ke002ovPDHLkV1kJEYbF2y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/3.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/3.png new file mode 100644 index 0000000000000000000000000000000000000000..94b6939126912bb9d9cdb81a24f6cee768fc0931 GIT binary patch literal 821 zcmV-51Iqk~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0;WksK~y+TJ&;*X8c`I-@95NFQ7RVNs09=l zHW@Zq27-!=R>cJrEutv93k8*8ii)kRNkP*ZT(L1}(xgv)?0ehirXQo9p#22x8BDx6 zIr;t1a_>C{!6679SW^=htPU&#;CK@-K{OMD;8r#^;s|oWhmU!J2VngBBB5B^Dv}Gu z5^hVILQVtJO%75jGeH}|x)hksh?(t}-h|m)m}`LLI}Z`c!g`PZauvclBv`i+(@~h5 z#8eu#U!h`Itz#vCQVoE#J(x_6bxPq&9G*bf(a|FmONHWgFhLu5NvlXyhc2Gr5oB9M zGAJMjK7u(o96pBwGjVbJ9*z?*9C!%U2W5f7X}*;W4LH(~k^!rNagel8Mv?8{JywO= z+|AG=O-YTa_C8CuMcYXmq)vlOr;;MtqREBbr8IN2HD2EE?IpdtN#-y!a$58stUoCw znYTF~M0OHhD1&0;FsrMF>mM$Q7ng;L_t~@k*=fIbIS~v+{8N*jn|JFUuXoNX*=i;A zdV9udR3W=bT|LRS9GwV1f8lR!7xRHgbOupoq|$~LCoYdSZ&Td#S|&COw<8a&uk0@G zZ!hFl#@154RLC7o&Y(a4(6^t9OOus@)a#eAjpxC1d?X!q4>}FVY9MRnm7ChmRdwt9 zC{`{8=VL+i`!D+XeL6IDRmoh}UR|BNfYh6U-_@(F&rsR8dv`N483>J`AHPuT6XWw7 zpBC?a8;=gN4JN&^n4No;4X(zAV$tEHX~)F4C%ia5H8<)Rw3SQoLVjU2;fn-afstOT zQH?AV862Y0vvesvv>EBo&AZucro6!UrM|rs6A#!5F;Bv8e>!S1>y=1D%HR>$mBXy@ zx(xmHo&j3#v}m0c4J;8P+-ftbq132TXvwbs*+#Q-i*k)<00000NkvXXu0mjf454C} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/4.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerFrontPowered/4.png new file mode 100644 index 0000000000000000000000000000000000000000..4c86aae9f3d669cad567a5ee70b740ab1f37ef41 GIT binary patch literal 820 zcmV-41Izr0P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0;NerK~y+TJ&;*X8c`I-@95NFQ7RVNs09=l zHd#lOfuJI2Ra`*PB8sxRP*5qRsMu;v1Wjvj#m1y*lRo*__qNYXKSn=6`w7}Jn0Rw? z^826V-g7R3Ll7LWh6XlR4HyQ%@djXmXe0>Uovg3N5#;!fpK^GQz_d7JnSx=ZhLHerB>+-)VG=3UE{2g<93H=|t&1-d^M$QoycY1HW`Upv9UR^h$TkZk zP(Tn|1beVpTowyULT$w(BJtg&5J4DjRYZQ=X%Z(bAfCC*j^scn;D-rv=~M>a$|P zbC~r)WGn85GAKqild^KK`r)#0ahbn(pE=u|p7gmFTtdw!FQ# zyE&I#8d*ttlR;-BF@^s8L*IVRFN~M>lKZctYcB(-*ib6u?6>QYSx;6=OE=Z6tIEdt zQM6PD%tiy~_h0n&`($wBs+_*AzPUPk1*x}rpQBq{+o8O6|L%Hv+#eiaMyh`HcwNV* zh5Kn^kwK=xsFfEoGcPiM<=8+pGPp2l8yj_n=0_)HhF$%ZQZbg#%`L~h;ef+G)NM8> z5v3yo1G>~ST}%zEhkLWLPUbh0Zs6QP&rZ@4^IP&!SKMcPK5R5;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0&Yn}K~y+TJy88q5>XU=Pd9c2BQU5z0~A=k zVPQjD7*qns4=o2t?(>EKAAHNz=?9`eQqbGrhTU=bU%Xx$oXba9CE2 zP^o$l9iU(UhEV~tY%j}d?`d~8Lr~K{d8XDrMra-x^hTr3VAC7TJrDcrHVL2;Hc*Q- z1RJ4)cIp*qI7)+@ETkHR^tX+v%U$`)`edt+J}PE#Q(sO&1~C~4yTC7Z z=kNA&m)moH5As*L@L_@B_;>_({{lHlb)$DO4`*mY_e{BL3>eFhrxi*RJBq{mph15}L23>FWa=#i2*A2yUu`RdD8RV;a zhi<+6xg)=b1xX~x!wu1OWAVOsyO=?H=>B|OJgdrwA2Vk)8727R&ppZxJ4?y)+8o}6 z2vcDUND-iz3R0|x7F+L=iXr58tmPzdOa%|h&>a>t2kTS7c>G6c7GH$wWoYY#KD8C&mzD_8=xsn2|yc=z~77(Tz_8Mb}}$1*zb*d-%bBj4rxv>MSUU00000NkvXXu0mjf#Pm!G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerSideOn.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..4f6ef0cdfb5631ee00e8d85dd5e60a161a34cf42 GIT binary patch literal 829 zcmV-D1H$}?P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0#3WfllFBohpHD!+MYW2qrc6A= z*^4x^iq8Vk7+%HLk(RMeMVT64JOgGYTzgp_qoShZ5~H*=Q+msJhj`BFLZ?Dg1-J)A z6;l-MR7em71VQ3*_@nc5Q5jHF$r;VdBfv4q(Ia1tcWuu4SEo9k&jr@v(#oW?81W(9obhiYx*kTQjZ}9g(qZLvV6V~7huU*9 zfu(5Y{jv5Z>8qHt9P=$keRoIOW{15uVW# zhv|OT@?xzQB5)*xSV(2Y3S+n5^k^mo}NZn_2}d!VhxVyXfI zt-&UEt2&FpUC%bztDS<$!7~otfJa1%Rc)LerJS*np)39a01e^$pKvEY00000NkvXX Hu0mjfpLA_D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerTop.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerTop.png new file mode 100644 index 0000000000000000000000000000000000000000..521d86cccc3a6d271680214cbbe8d162397c1d6c GIT binary patch literal 630 zcmV-+0*U>JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0q03XK~y+TJyOeV+b|H+sgA@qB~qf^RwTQP zb#4!+iriufmz!ni9CF~fF+tK&Exi0^!6V8`5T>H z$yt2Z^|oBDr(<94g>X<%;Ev9hVt-OLXrF8E*TdJQd4b8a)V}%9PoOYaC4^r9Ci;HV zzLnj0XFXr;3g^p1=$q~U5lWDrN&*MsLtLe32VjL#8+ z0A~xbrEauwy^Z5fI2Zs*h^52y04PY|?H%RftjcGUVK(37_64xAdV=^c(MZse5LE;a zHGRDyrc~b{&+m?W+Rw5B0AYSou2PDcHj9GxkARtsbf_fsjp|(qr|!SZO*hLP1Oe!+ zMjoG@b=v5(!w?zMY~0~eh4rj<2UJwj64x{hvSqBZlx(IL!@2h`Z@Oy_$e_i!TKU|# zQMx)YW*C1U2~yP0=@mWDlsK=gE%W{}sv=5oFDDe1Z-Ns#?Z%jzn#T9AHULwFPp0Vc z)p%Aa-zFvx)gC)8>K%q_ZDmYI5=&FU{!kd_1;AK7{Mq2=LYV(I`09+gf1g8HqQ$V0 QUjP6A07*qoM6N<$f;zJnLI3~& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btChargerTopOn.png b/src/main/resources/assets/rpmachine/textures/blocks/btChargerTopOn.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0cabb592e8fef4458119b050b7705c0990a252 GIT binary patch literal 801 zcmV++1K#|JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+LBYK~y+TJyKgw6G0R{iO6<$F3WZ)+qF~- zg4z~vq1|49rcHs`m5{0tNl^$iMiL_=NQ9s!_@IBt5aWwM;6+8?LFA$jf(pummqZLc zdIpTi?Btu-Io~CEW$1Z$vMS8My*U=XibO$oLe}sWl0RheA;lsDG;uwlyryEpNh}M{$gpGrLAAj;_5*|N8ZlQa6 zhQ^ZcX0zh_RSe_7rb8c?2-y8YV=2rdjoxE+nmSj=wHtDSEq8QbTBTYvQS8W#JC4cR5?Unkq#d=^5~6WD+-_6z z*Lnj9wIRv_O-ek)tc0sB?1^N}gi{{vFhb3m|CFYgisBYsLjSNZO1&72<|95>hz-WH f|2H`5gn0e}-yhL^Hf<7-00000NkvXXu0mjfF~ws? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFront.png b/src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFront.png new file mode 100644 index 0000000000000000000000000000000000000000..50dea63af3c9f65a8f529c492542bad30aa6294d GIT binary patch literal 661 zcmV;G0&4wPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0tQJ$K~y+TWl&2`8etS26YEMM(aylUAAG|M zATXc|gbpB7TChn87)459F?G?@g~kLot!!Eo6N4L*rVAG?bkSA+V$bxW(ZnxjZq9w4 zdxt4zh?lnR3LPeCK73>yB-K0jReu(#8Xl)w&J1=yRjKD9_89yDM!*!M5* zC*$VTNe=-3cG%wA&Z7u~Mrbx=%7FqBm;t}naH@IIEG6m%OBY}E-)vHjHaaDj&={!r zopP(3Jb1gY?Z%mBkH{?WDjP#h)=~onYzdKGBR4O3_U0xy@@pwZyYaka6hgbf+ zP$)z#g7>ots2X71YSG!t(-yret!x+udE_GL>o_X^=vp z)Mzx9*i<^5{ZBFw4;1j3rd6%h7gtS9CtF*uK`bj#ES6ua62mYN0YS~Y0V-J0^J>hp zj2lq5uq@#Qki`{6mQ|>M;4o2?B9SN~2qGLpEF818#@cpDRSir5(RG49VcSVf(=iKE vI4%+>pa;MJ3hE+`1prJ%9l)|2%W{7KCn%?C?JfUg00000NkvXXu0mjfjp_@n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFrontOn.png b/src/main/resources/assets/rpmachine/textures/blocks/btFurnaceFrontOn.png new file mode 100644 index 0000000000000000000000000000000000000000..dacd183123eec1d0f93b3d792358f545c7f4beea GIT binary patch literal 701 zcmV;u0z&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0xn5JK~y+TWl&3R5@8e_+HQ%Ml*cd+U|<*l zfnlaR5K$ z%+0yabMH{eh%c*1@&gx$8u9>y!2S;sL8Z~~W7hxjt_}Nf(jWx3R*J*kjt_}N3UQ+W zv%%gDwnxq4^~(wX{;IoK)fE(hkO;|!M9xq^0yE%O3UXfY6;pw=xa47$4>wi_M;nh$>A&Drf``@^JtGj2}L>hC9=*{J?{Si=e! z8j*P81{{a|WIu~VhX)#Q!AS(1L;$0KrfE_1^SsOHWEqBIS)S+JE|qt8od|Q-axB1cTZY+v-e2f+I!N~cdAN$-LSija4OGnJWV?(GzEhXwf_0S z&PDY2dA2!NO4TCzc7C(Gq_w2nM)IJus6CZ(MTi>;_(V|(J-akre5Kd-BAxLI1>lU6dJ@`>sCms8C$ z3~RSLD5sObm7cJ=ys~h40%7B;4sSq|6HGiu`-1orHk;j0Ko5Wc1jI!g j3jmmkI>2hRS*^A|Tl=Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0f9+GK~y+TWsuKH!f+VI{U@gGhuhT6%{k|$ zW}=2jKQMxVpd^S6(jn^7rB2Z$Iz^|hT|4(L_8G5ySqRTwp6~Pidft_G6K~cJ($Ikn zI&~m~ScE84<_*7}cR%lI;`i&d5aQKxhxqlpl1K_YZ(ug;?f&%X=J4b39Kc_0k1r1T z6hTChY{#$V8%Quil?vG(g$z=n#H{U>*s?yGEGLn|wAUoAj)o7Hb7E2K1x~&Jm*Sp^ z;u(rFQIy4~{qF|mp|TpT?7`&+@Emo$%?5GF(rw?wlUd9*ND|oj4PrEHSr}Em;iACR zC3%Cc>%QNzZO1Sy)2vyRZQHKn)LpmHXn4)0FMy*|t2zy4n)avDz4?4G9!~&V;&3?1 zvH{We1Hd3%H%c@`QA{F9GIAhI2Oy4n3Srn`$z}r|-AGZ?6%h^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0nAB6K~y+TU6NZ%LQxQf{Ub$0W@Z`2Ne!{P zX-CaVR+6PCnr0WfAr)qY-ERcZOE2}%OHcj9zU^#!2!>(y%vo#J%p6N(-1W~wKIgR8 zAzlLPuc`n)PnD1J?0X~geOvsx%&(drG8j+tZ%1jo#2_``ad)9roxjU>JKiXoBoDKJ+R79qm%U2?DASR`*?PFS9$pL#Ba+Nzbsl@zP2!<%ZA3KyNt7Y0 z=VmF44O_v`N4)79h)oRPmuC%+vpoZRsDc0t9a1x@!{6bdX{0Y6<2c@VR;|thSQ!XCvM}8B-%R2_}tRxL*#J0I(&7(UNF~BxwpIUgF?r zKl`QCX~|?uNYF#8wbl}dVGOQ=aYO_}$DDFOw#Q}>tY?rcZwipHUp!#Bpj_i9A7p_J zYli}mg_SH#lvSdXo29UHke`AobQ*wM27>Z>D|TN?;^l(n1wSPbxtEz{7(E03F#8%e p`kb~-IK+riELE1nr#xNuu3y-97yjt<8l?aL002ovPDHLkV1h?6_)Gu* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/bufferBack.png b/src/main/resources/assets/rpmachine/textures/blocks/bufferBack.png new file mode 100644 index 0000000000000000000000000000000000000000..43e290af3b5b0ed0f4f2f19e5bd585f6f8795d94 GIT binary patch literal 450 zcmV;z0X_bSP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0W(QNK~y+TZIVq&13?gl`y4_?F*6;Vkc>Yh zdInc6vKI*iLP7}Q#+CbCs0g`02)J-Lcbaqf4R5G4iSWTx6|bsZCGBF2RaISN{&twd z-E|MfSHWV@4;^HP9iO_c*NiGEQg3B z6;c3$tca}HfGy0WUO@*yTHN2D4FVB^6`Lic$Qnz!!91AGDsn}zzk&19NhSr=1+u0A zTl^0Pj+GiJBKzkCrXDN-#?#jRN=5Fc4=3c-V{LL`ZO9O}kB@|#fH9B;SSR2iwU1BF syU6@~ne(nd0d@uP%^+N69$Ad>4->!|$?}$etN;K207*qoM6N<$f~l0SG5`Po literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/bufferFront.png b/src/main/resources/assets/rpmachine/textures/blocks/bufferFront.png new file mode 100644 index 0000000000000000000000000000000000000000..1d0e358d9d5d02a5a8df0ec39ed6ce73774addd7 GIT binary patch literal 522 zcmV+l0`>igP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0eeYAK~y+Tb&@?x!%!54v$j$d!6h_Cn&dX7 zv`MR`?d&Fs3hu206!8NQ7boeOL8T~yqX-U;`A_*BKH-EABf>*+a_)Q2dC$$&;y6x{ z#I=pho&&>v8^S;pvCvU#$PjD1(los}T%SkQ^Qi|9lU5nYAV7v#W9!|q{d8^=eBQR< z`@Sm>e_fjd$S|U9`|9yTeOy>?QS&eJsVN}9Lg+gh{^&^I*+dUIE!Z9@MPQM|HoI1((D;EK>tOK?% zmsy;etcCW%-eCD)Yf<2nWOWAVKpEC3Nnx76ez=0Ga)->4%pgOvh9z_$mKa7h{F;IB zIRu%(ZPpPL$k4?pWgD=?f8dlj_5Y4lWF#0C%x z$Pnk3j}K-7%0M~5Isq3czkG7NJ=+-h4)+Qqz^*_%=&B9dKo-aG54Ftc2N(eleEPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0a!^yK~y+Tg_6xm!%z@~^A6&|%56)2ZEBLX zV)YHgf*|Tf5VTYUf3PauxKQ_5XesCeh~UCy-YL)F7bXm$3c}asWH|TUb0=e^X_{r( zifh(l4>r01^gF(4q3zePVYYbWd49XwoQ<66c?i$Pb`_~$z=qjk>EytDy)eq>eE{DN zk%0cXX&|r>#9B}Mm!bc0u6VA39lfC+Qr^df9+*%Os28&w6R-8aA!d0`vKX-V$j#U8Bn+i7vy2xg0)TWYpLOs)FbU2B{oA8Sl_Fn~BFPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00MeRL_t(IPd!qJP8v}ZdW>vF)e!Ol+E*ym@clJ?Gx@?o~|c zN34bs$Arp968}Lv}Z3esp39YHS1HL3o6EaEQUBGRmFDPrdXCUB&626ca~&S4MJpUP2$$)=qXD#)LeV~{B> z(e2y}+P55cLVM5_+Bv3MN%-uec$i*|lL>B%8Xds_{ZF&jHGwKF(!d+e4(;w%;^18f z1h|4O%29xHR^fggiFT9RBXo+gXddA-tK3$N!>saHM|*Vv9$;7=zPELa>k2U zI^T?8_>9CegPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00F&8L_t(IPnD8Mj{#8>h3mhNh)9Q&vb z!2*f7#1LYPp-BvFo`q;_2pcPZw7;sd=vumqmwNBrbM86km0-8qKb5jttrm;LY&L%= zrPu47PN#ay)?hH$Y&KC8Wk9uBjmP7eOvdB!L?V$drF=dgC%IgXl|#4N9S(75~WgUx7)G8E=xiH1nlAdR!VK!ZnxL#^>VqiTCLS;)o3&@CYVenXhx$E z69$99a5w}UjYfZ!;$%LbLs2Xip_T#oz!pLQwA*dK-1U0BX0y3mE}6;IY&JtAZ91J! zAV&kWmbw8zQoCI2T})=sBG_7txJ0Hf-b3=jhVm?l=T=bHGq zR$Jj_Ws9W4;Q&Ar>;J+7t?6_c$4pbXC{3(zpU-DfVuehFJsuCPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Iw5L_t(IPfe0bOB+!X$7f@Vj*n_gCX>mX z$z*b8#ysvstw{#jN=OYwrE1aQLVThSBPzP^fl#QSlx}JZZd(wci-K<4x2t}DcI6ik zSN#nA54TJLzqxbn;eXFP=iDP?Ol^cwpW=`O3VGAFTd`9_z^}39oNuN-uNzpwo8@FH z+=CS|L=kXkcP6>@GW@YdI9K}?_CrW>Q(I%BQnZrDQp} z_{t5{CKNf`qsK!V)hM=bKF*S}l~{cy&eFP9^u;zqu5MmO?7eC7VKoJH+K3*^NjonF z;4I`c2q1%4C^!`TxvU$mlXz-(Z&jtYuj2*@WsK;%1sPj7N3$vfkU`wM;kj!e7(ya2 z4rEiY#-g@8DL>2f_&0cM#fLVdo8=-!l}HIX9N;M}jfchtMI3+tGVg$)$%|#>WR9Td zA)|Z#No1kihoTcoKMYcgW`!8YRj9Z;4JGRDehgwG3R2QrBN4z*Q-bb-l0!!w6L5n&0qo(N=LaK<{sRkd)|kD1GBE%E002ovPDHLk FV1hT1BD(+p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/deployerFrontOn.png b/src/main/resources/assets/rpmachine/textures/blocks/deployerFrontOn.png new file mode 100644 index 0000000000000000000000000000000000000000..ac6de2270442d1457dc95f3d1a67ab91a7cdca49 GIT binary patch literal 584 zcmV-O0=NB%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Fp3L_t(IPi>M-O9D|8hVRBGwKS=j)EURG zJ2RNhSmxJK3|A5cwTp^^z>I=6We6>F(Jl+z7KG3us7?D?^#f|vABa}{hTieY)jkgI z+&Oc2?%Z?EJ!Do@QU>M9&S_94sd9fKOwYJRmPV90!f)zU52oH-zumZzh2sRy5 z!n;e;=T(`hd#FKo^#l|A+kK_Js#MECq(eSFzn-37uCBWV^%k=#Qz=g&{wa$tjuG~1 zw$75e-|e)KKjs-9(L(~qh#K~scZR*{TY$SS(CXCT*n zGNg!35MzW)^aKZnU?!me00x+3Op5;8)FOE^7!d3rT!aXONIeIJU^*TE01WWpgvGqZ zP5=iw$Tx@%euC9jJZLkzS;$gJu(J4_l3>RM0Klvb5yiV!@Sm*6D0;@jm>-6skrIGf zSwV*e_kbGyZL7;+iw34%-`?*Z9@`h4!95tN4@aYeSc^Fd!DkA1-HbjuZV){pv3o#S zT*w$Jn-MlIm>pn%`@_fP3_>fQVFzQ!d|=i+#Hft!LOGMBO%-Ae3qtVc6IL8b8T1?d W`??aD3d|P(0000G2}~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/deployerSide.png b/src/main/resources/assets/rpmachine/textures/blocks/deployerSide.png new file mode 100644 index 0000000000000000000000000000000000000000..edb3f2e37a3e1caf244b5594c75b0c657212a268 GIT binary patch literal 621 zcmV-z0+RiSP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00G@eL_t(IPi2uyuNh$&$LCvg(-R5i;E0(q z6rpX>gj%o=3wJ3gO$)t5}Uayxli^U?Ts#+)%^7(wVT3xT#+wHbi zt5qtMdcBS_lgSJQgZX@(&1RFyWH1;s2;p$J-EOZ|tIOqr(rUF%r_+AFpUq~SP6u+a zSd7JD{eC|b3P}!!1L|(KBV#lgQ57B9@pv4M$CJr~R*go35{X1Y(=>^>(R#h!x2vR5 zDG1Z)RG7ozkYOM|V^pe3fk1%1i^YO)x7#HwQmM_0$w-^c1_EuZR;$D{@ZJkMkXkC0 z*qCmj7D8!*z{$$xGPMtf16Sgun4q1{=jC!qs^~_VaaMTEW;2(|VMn9UbUMw1NIV|L z!#un=BasN}QQaWCxeDLJ5x6pEKPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J9HL_t(IPfd|ci;__k$Da=oWiw6Y_^$cr zJTfL)Nuo(;VJ>_JUyuo35Yq;2N>db45EFHf7H+0s7OiU2x>oIL)dz@HeTIJe3^Iqy z<(%I=|8wp=S9o||df>K-Ce@$6|9<}ZE!|c_{PzxkIE0tEUDU1xpI%yypYB4xegA>; zuDG{dN5LywPMSfpcOl>a`uWROoR4)q3&=W&-jX@ag}`^$c2-uu2wjJseK>DExq4nz zZr7IM5Sp}`4sSC1DW3wmIDKDwtU9fT5P9G7XOC`9k4$ErQs8ksMW@<q9~fpX1m?4*Xw0Yj+`b~t=4op z?Q*%Gwdco?NTgUS77B$@sgz2kJRXnCaX2DvE%5n#WDtZxp?p4HtyY)I9mCI#Hgu`K*%_dkZ z7QAM&d9txgCWD~g@5^Dk-A*JD2#|4AstZo1lfJ{@kmE+9!Lgi5ZFWL#JDE%n&{m_- z2uuTd*?0q~*=#l*kJC-Ag;9DfV63@Zj@tA2d^{erQ%shvR;$ryM5^44wDnlg@z7*4 zNz6cEu^2bRm>7inumk;me>57U`dVG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorBack.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorBack.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf96c6075033faa954d5cecd73a8df3d09dceaf GIT binary patch literal 831 zcmV-F1Hk-=P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OT`L_t(IPh;4g$$GSc`+PO;^#=ai9fCk~ zuV3iN9HGav1@FxexI2meb`SrB7M_#!+=t4zw&$}m94ujXHd799)^f8@$%{7WF7Rl} zaqZ4`1CpJ2K!$5uj$3}DRkWv`i@EatN^XX;mE2*jT5Y*bc>#LcCdb3k=7}+@yTjJ@ zhOg_3SlJcQneQCxrg^H7kKsluAJFW~5M!VQ2r7=XhL8{hl!72n2h~e$d<=Iw1d8I! z=C}CfM4BvW3|`(Awr57ttV-`$4PFx}T!CaooY|x*Hz1=d-uBi60fxIB{6Kea?2D;M zvz^xv2xLqu^+@tFNeQ!_T@$dNF}O9|ZeC*`(2+o8x2Fj*-0R?*P~r_VwK3gpeNXtR z&XBZVBVm3{c}ao17$>0q#w07C?3M{pU3so|X9zPq>EVlT*G&sFjB?ZLEAoi&Fpw7G z<78)HV`Tnrr@$aKi^)ya>t40Y9hGD!%ep&`wwG|mEO7|6w0K@uX|eB5kY94wNe zJO>w-0KEqc10Y$IY7NqGZ;DWNfoFY!<+`2-pdKIsI#*VlUqpcG(7fz*J&`~zFsy(Y zfG)q=FU$b+M^U_4NwVeC8h5aU=UONile zH^0BDI?#!bP=`lFVX_qv0U7Xk@U>ID(I&ufv4y)h)&}T$pbZe`POk+qAR<5#h=5$6 z4aG6mmz($*j+Ar7`x?%u@`rdDXw~Ajz?EI0YkMPrt_Py^J<&j^Nu@qOWoPSn8MYL# z0aI0smjN(^0i!&~Nvk8zwI$23Bi9WW7(mpVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00LG?L_t(IPbE@YYZFlro@~-=lilnU3O>YN zQXj?kK_yV5STDtDOxk7>f;ECu0dEZ_4KJBNa3-sfzM0-k4u*N2oq6A@1o z!jA~zi42>~kvt5+wb2iA>xP%ph=YWx;CoiwM=XgaxFGSsSGasUA+7Ab8Hhjhb z8XKIj+>8SupRxkI9;CH2zcCuvDg<}#iTh>UnbuonwQVXW@xat}rW7doHY%*A10M|k Ye+xktW{vcgVgLXD07*qoM6N<$g4o$bqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSide.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSide.png new file mode 100644 index 0000000000000000000000000000000000000000..51d10c9a3b45d07c0c4e2b3c85cce626c15a2e47 GIT binary patch literal 882 zcmV-&1C9KNP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00QDkL_t(IPbEoU2g7iRt z$v>oz1&0rp`#I-)&iSHM+u4<7>_ZE_=_2OqiG@aDvy1vVM6LC5C#~4D6c%tV7y9u=0L*}wkSL87bI(c7x z-heIN=PD{uirtos+jXnSKkbmS$+TQx5Sbg%#{4(nd@msAxd(=I8dPN|QFpVNh18Wycfri2$O%e`Eo( zuDVQ@SuT}IS(arOMl2RLR5H)+Ye56E+p0Pd96hE-okhz&{bZ*GVu(Z{wOV~W6y=^l z3WXv&EgHO_5(psq;aE8OJ;irh;93VrFoELz6jT?(Z^2B%&PmV>w5pn&v%W#3I$O|)GF z+P7XV3OGaaGvbWJX%2m++bplhOZ3{+4!zvlQUH$u7--6e6%g{$V?TG`XrUIZIm5Qw zIN$GK2Sdb9U-;oj_#Yqt*vo^8zr6Ip10E#VX~Tm~&Za%|FFE)Ufe#9TSpWb407*qo IM6N<$f`wU-)c^nh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSideAlt.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSideAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..ba327fbbd5a86e54421d338d9aa4ffbf7e45e069 GIT binary patch literal 827 zcmV-B1H}A^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OH?L_t(IPh;4g$+|g*Yez2kzCxa5X*?@3 zc=lEDA8Y5|S;spym1|Zi*X}Z&{pH-din+Gta&FIOXV_Q7zCDL~Z<)ZP7+ymSF-v_( zDM6;y#X|kD{Av=+0ZyvM+7g=z`A*gf9<1QsU&+mIppa`z4&UA)!8vifa+18tGD70~ zjGd9Z?V)^1BFr|1(%MR*bK-e-7w~V+;yzf-%W$BKXGtR0l2oqMncOquxw|8I=B5fR z$rRdBB(g3~Xj&ZK>_nawnf%L=d8S8l?yuruI9bDIZ!GI*CZ8T+){y4Zoaxe2=;>#v zP!w;T9cc_ClY{hu$kSHYLRa>9Gatj{CcgAwQ=qzO72X^BVt{B>M@Vt3_52oJFgs#> zPxzi0NptH0fyyrS3ozX4;G0n5y{I_^C;>#PIztvT`2jTm6+!fGnGgkJ1IeyD*Sj-> z8J_g;MY!vx1sX=VX#z>0QXt9qUD_6~rVA7XKyLv3aIZ^<;c_>>zpFaX zi4fOA91Ua?CR+g!kOA}$1o_&j-e?nGxY)v79BTuy0pi^0wIBvW1nv!>4aG6mmz($* zj+Ar7`x?%u@&~#EC?1av^w%!Te2KGa@~M|0YuGNEI<-AbOb*-J} zW{>dQF5$;Lf=@aGfL^@SA#|-(0O*qArQG`qIQQkT0RSTzG$q5Bno$4%002ovPDHLk FV1k8Ib3Xt8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSideAltOn.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSideAltOn.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad2a1840440474553d7cf7506d3da16b1a2220b GIT binary patch literal 827 zcmV-B1H}A^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OH?L_t(IPh;4g$+|g*Yez2kzCxa5X*_#N z`A#(o9Bb!4+Qv68hkI=i_whR3{pH-din+Gta&FIOXV_Q7zCDL~Z<)Z7bbc8@CJ!4W zBQ5b2g+i+fggtE(jkP6|M46YT^Pa2~JXpcMzml8bKq1$b9KO9pf*UgVCHWb(RYc?^ z`8y+dXCw$%>Pu-WiOLBv&4}jRUBJINi~C?TFT;T{o+XJ~OH#R3XL8Ss=WY(=o{}iA zI74Vlk;u9{p=oh^tpQw9BDj|&^GuKA++W4RaI%Ka-dNVrOg=rttRc;*In$-5(9_RS zp(x%wJJJ|PCI{&Qk*BS)g|6)JWIWra*PmD!e!L#Q@Q&j*#M5>-jCdV0Og% zp71?0lIGS00+n6t7ht&8!8f7Adr@-;Py&cnb%rcx@&jrBDuU?WG9e1c29jNQu6Jh$ zGd$_xi*VOX3p9*!(*%-0r9hM!Vw~)!4`k#8=mAlduTFlHWvHw6lSx7#4M3-Fn;Z`` zY*vHU)Ef5*6|O)M$c7-G+kkq2WL2s)NW;A;Lfr+P>w6;C^+Z720MQI#tm}yck`ONe zU4FM;nBn#`!J>FGh}l3zt2)8jCPXc637X&JyR4xBY>_4qV+w|K&eTkK0sw>>v$Qq6tKCNE5~>l z;X?5hewq!YWsmX{ z%^u;qUBZuh1fO&W0KIstL+Dzo0MI4JOS$(KaPG@v0{~P(G}exj(!&4%002ovPDHLk FV1ktAY8e0k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSideCharged.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSideCharged.png new file mode 100644 index 0000000000000000000000000000000000000000..af2991fcdabf7d4b6834f81ca3ca2f3c83a8e27d GIT binary patch literal 881 zcmV-%1CIQOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00QAjL_t(IPbEE+_wd{yF6Uo$gtrE`uHYqm@&N<*34&CJFpL(c*ssHv=WPLM94*b9i`R>xqc%yW5hOkh;T3d z(TTn5qgLDT?K@nw)kDlT zVe>|8*^ECm;Nx0i&d8rP(?LhfYYRQCC!aMDi)Lz}nRue*g!>7!J3wA$a!~9xoY z1JUT%N5Z;Q&D57&gz3=9y7UD_OnhQuVvCw>l&4v$FSV;Ot@W~6dB*V+eIkJ9?;jb! z%+-=_*Gt4=G0UQ*>5a35ga|H$8CxgpVr@}gcxygadNqQ6Cp1` zQmM2kCjq>m5(psq;Y2k0J!@~Q*f4Jb(73>dF=u0nVP%(l2Dku#yIQ42o4c?Y|DWnIi_-?{#s{0zy zz729w&=y&mm!hl4v1;=jdPz-5y2m27Y9*e|GI$JtyS)@vKq$#g{@jbB#b&f_i`wqy ze7}bsj1oV6(TCpXKR*7khX)mZdFX=&JV>(BjfZWVkR|djjsFv*jzIFV00000NkvXX Hu0mjf21kry literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSideChargedOn.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSideChargedOn.png new file mode 100644 index 0000000000000000000000000000000000000000..09cd2e25f6697429ea4d0eebcb319a8b377613ee GIT binary patch literal 881 zcmV-%1CIQOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00QAjL_t(IPbE(cb{|4bIyyFt;d&|u@5bH*h$Pb5Oa-0xRd%iNUij+17>W}jIFj45fA>+ zjlFAOE!(3}*cH9pjIXtG#`Ww|+@n|Xk}js6Sa8#$21=QCnh~E&iaYk!Np9WaZgfzQ zP8_W}u~0L)=HgBn**xlq_)M&TM-A!NgOy}X249>Mmq;I-GO<@3)KU|^ahHwO+liT4 zY{rZ&Sn;POd_+e~o4GSqI^>FdZKEfQiey6f5N9ZzT-_bEJ>nbt;%KT(mdcvlcL_2+?|Ukw_VU1s^AVE-{a;!rO7b%72Q#E6fNS11%~2n{17 zlgaWk6Tu5AfdG>4jmDtg6I_=`I@wzq=q?F%mgi+A0uR_`gi=yccsw4s)Rak}26WgT zrqRv_Rjv?0M6dx^RB4a|G{6R`x zewLV5Rg&7MW#E0`KU{F@8`r^S%YDuuG97=->PQ4n?fVZt$2I&Ed{#&pbZ@UJx zZ#`@jazqtnC+kZy?Ydl-QCd-$>a!{AI;pRv7#;)QZ7PBl5DK%BK6`L9SBF*{(Hm{7 z@At9YLE@)BW^Xv=kDq(s<3Pn{72a;^I;SmQbY>WB};G`45T}|N200000NkvXX Hu0mjf{ZNLY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/detectorSideOn.png b/src/main/resources/assets/rpmachine/textures/blocks/detectorSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..20d599178a00f4c8d3393e7531b679cf77ecb2af GIT binary patch literal 883 zcmV-(1C0EMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00QGlL_t(IPbE&>IzLE zEGhAe?nL}9CmIr(h9$&@rihsGsiJ1)#1xgKvoJGVt(Rm}?-`JE*S%)JiwoZ^9-`*lHUQbmJdg z*t=%dvMn5~JHwZo@U=G1n2vp#8*(K_cro$hf{Px}Q;M83jQEr=D)g;`+`h-%Y^Q=9 zINESvfhKaz$(=H=dDJoS*+@Q*8q}}{D#^^$Xt6LVjt-eJvRCcYQX{^3myI^sh?yE} z#)K_c@TW$6SVK&kxHA?y;Ea52rN<5Avl?Q~Le16^Pc*DxCxN!R$b2UDvXpODOMB`I zJeESALs6P3a2hl2Xc(Ba6{!G4ZoDixcFRMe-CojsJso)C?aDU~b%1%V+NIC#w_W=8 zUA5@D`Dxc1Aepz)Oy{C|`QiumH>ts$cY$Ruw1HH0^h*Koc0%f&k`_RlYwF zfew8ntn14q+M)|Eox02xLw2qtme1$cl{3}y^VVxAjjAM@HnUPLJ{+Tu1Q7lGBO{n~ z)MYsgQjti+FpNYZ5eNk4O3Cv+6=+~~nzD}s2aoAtyJFF&@wY1>ModhMTrR&6hVqXi znM{_O76)EX2?UUQeEDM_Eo<9Pogh5{eQM5_miwxKx))payg} z7^2bcFjXcOK}4_tn3YM81T??~swz*US0-E33_z84?ngfd?eyU;ea`<2a95EY=Q2v8 zqodQsysF~F1~mik3;*GQOP9UdOQA1r%&3w~be2JBkin@}{pH|o)yg0}V9|FAR%5MK zf%dJNjRN+t!i;!bNt#WQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00I|DL_t(IPi0YUZ_-d0z2A*f7hk5bA#I`B z7TUG6tE~`?zbHN+cFJZ)q%K z5C;>E+*H4_?LAMMsks$Hq6UhC*M+y0WmB5Ft0y1}CLk8Ved;>j4)%(LCmCHlxzDg$ z938)}IL}rz?*9(3?)!xw-}fIqT+8SJ8q-Z^q~kBW^#^NoLJ*1mK|A)nYqR9aIg*li zEy?O~902bY?t{O2fe1Wl|BAPT&qD3T=I3aj>F9sH%UgpUWZXf#Sp z)AW76(P+?4rlEGj>h*f~R;$&^GeILmliTe!$8kgyMaOaQuyFC8q1kLg>UmzRR)Yu= z0$yK4>%gF@Djw?fIy%jsA$M-;^a|T(G-|b4l!u{IDj`)6$#q@Zwk=axUefaUJQAXE zxf~Sbav3v?w35wc!JvC!(8JO+4eQFXoD2)oEz6>>xbi%27>25Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JXPL_t(IPi0ZvYuZp8&HG>vg^fM5wV0T+ zCYqR-+sya{)lx@SwzcRM*{oKSYW&KiwNfb3!KNK{U+v5AWeoPPNB<}Pj-7bH75d|F zbMNn-bIU%L0DsQ{6xjc1dawZvK^R@;$3^~EokjOP&|d%%i0osK4~{n- z|3~Lw+^j`o!C~*vwn#F(948VLP+XnlyTybdJxS<1Xs!cdA>8MFsauFVPj19?@$Nk1e&M3A zvlC_G8uxz&NH3lINjaH`3o+e~hv_6VQm>NUOA6G%jYNOYv6X@~A_XNu3$VKE1JJkg z+owlSIQRuGj;_G#^|CB`xS#C24QI?X(Jv^9B1zK5ylU@u&nuCHx-9ryn#bc|48w37 zr_pG9zd9@AUm8U1&ucIkV69fGliLrK(i@`5?RJ~vI7Sr3QmKTCpFb}5o^3(UY&Jpd zbUL+K4W!$zgWb%Qp@;CaD^OJx7xjAm@k3_m0TX?y(<5Y)$)we4(LMylViBp_NVaWT zmSq}BWK+xKa!82EX0u?F%Vl_yu#!%v(ZTDkK%bYUX&6_Q<-ok)Zki^&#ZeFhLWruW Z{{T>h^6!OKG5r7l002ovPDHLkV1f<5I*R}R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/electronicsBottom.png b/src/main/resources/assets/rpmachine/textures/blocks/electronicsBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e0289b1a0ca9d1542355e43056602269ec30416c GIT binary patch literal 457 zcmV;)0XF`LP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Xj)UK~y+TWs;3Jqal-(xdVhK|QUJ}*|VN{kb6y$*+pLm@#s33Jp~$4tQ~M_dms30Fmf zAvKdvS4aj#cb5ReU>rLmQjkk0iB~Uo;f?(R@h^ije_J9u00000NkvXXu0mjfXCS!r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/filterSide.png b/src/main/resources/assets/rpmachine/textures/blocks/filterSide.png new file mode 100644 index 0000000000000000000000000000000000000000..e66bccd0de098422b4298ffaf523c4acb770f295 GIT binary patch literal 700 zcmV;t0z>_YP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JyYL_t(IPnA+#j~QVU)>*U0=gy3xlx`C? z>Z2H@>SI%*3{nywEm~@Yk_~ksn^shW3vQZ7dLb^{_^o|r)*slD$;o@(InR5}^PHoI z#bWPdi$o%!P$(D-zLm}8awU_=$G-^OZg(^q4Tr-LU^1DsTCHBMm(S;$&E|t_rBVqu zgTVkEm!c>(8Vw2H@px*r+I&8**X#X$|DSA&#bP)dR;$(RcDr7$yWK7lDwPUaP@o)& z_*Y8uolYYGq0~}59>1}Z?|sxQrxAEvCa%lI^*ghy%jG~!fwzG{UboDCEwcB`=f6kRKU2rU(Dv)z_OoTWs~EqRSRt%M z9SHy)V8g$msvmXDJl!g?-OucgCfobM-j&(bC$=FPs)CMpQ%G|p^!)2!+8jz*)iteETRbP9&J*N#_ai;XrIELOXbVT@NaV>D|hic)LF<1t`oS-;7~&`2>O z+jK=cu3bRFvkYUk*+U@?v&YkCS+Om!{eHjO?PjwXb_5+`n(cNQ^a6nZ=yp0CPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J^eL_t(IPnA+#j~QVU9t>vItku!&E~?us z8}+e1#!w$CSf9;Ee6-lIs)TH)3)!@yB3y9OMA8d!;l^+6GgE(HPbMdG-uFE3InQ$r z5ekI@lKK69uh;AGcy1-LTCLG&^#3hFo6Qys204xs0i)5V(P(r!om?(guh*X?D-;Si z>GgW>ILu@+wOUOC*zNX8r81pPtJP|^+x;uqY&Prn`{i z5vSA1^E@ixD3M6S<8hbEg(mTw!{PAxe92@I2?)iO!r`z&M$k$*qZU7!l);~>0Pp~tzz3=r zV`|y6M}hrbW;+#q_lv&!S>F_N4_Pg)cpHT@i^W1fN03YKOuNWF2<%h+^{;{9_t^a0 zH~xGw{%D+kE9oB#Y=YC|^Z7_5A_744=B+a9red5X&NHb9lZi3uD0BajL3rn-!?)Cp zNht^dCL_uUTq>1Hr_+d`3H~7ngujyvt)p!S2&zX}Auv?`BN-&$@As?KYPZ|X=kvv4 zQ7jh6<1r>X7z~cGVy=h7A>i=_FD~A_F@y=?>e6JP=_si*u;+P#&{6boI0Wn{>sQIH zX&Tplk~C}2%vV+*t>$aM-WyDxY&OguPakE)w!pUA?Pjx?OeWY7bc|^>n@!MjyWODM oYPFCf$_m`emJfgztT)H~1CmR(4ez?Ur~m)}07*qoM6N<$f?Ik*U;qFB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/frameCovered.png b/src/main/resources/assets/rpmachine/textures/blocks/frameCovered.png new file mode 100644 index 0000000000000000000000000000000000000000..4bab05c6bf9797a2d62138501e94167381f3ba49 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3R(iTPhFJI~dvIU;KVLlc&wiVekLrWB-TnX1==%T9(KY}5*M9qPKlsg` z{bpySe439q6e*Z0Y*nyT*vq4EZ0oQ8JWmoP#Ia4tyrI&05G1CaI9Y|Q`HNA*pH|;V z50#LT=By}Z;C1rt33 zJ+nVO$@hVVGI_clOF?0=P>jsKMK2UyD1=VnlVuT~ zYuh0HK_yQ86H}xAneDQ1(RH8hd4Cq>+C0bnv!47k+kI=;YHs)cjP(0iIOjvD`6Hz- zPkW7zOlXcNIG|dyXLZl&3(wBaT*>+FHs5}~nH>UGzAWhED7q>To<3yV%GL4U_UT5;#DE-! zyWOtdcNCv=p3uJ`x5D^D6`SCCq0B{l-Aem}8P^N#JXSGb&F0p%E^MCemQQm8!<82I rw5}-LcEKxUX3%Sy^+i>4i~li&?z6C5?B3l73^4{zS3j3^P6urL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/framePaneled.png b/src/main/resources/assets/rpmachine/textures/blocks/framePaneled.png new file mode 100644 index 0000000000000000000000000000000000000000..734a1ea848d69a4027f07c83a089df4fb25d69fe GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3K6tt~hFJJ7o$Sxe7$|ady}j=bBQZ0tjT1I)+#F;k7OXVIiBt8Y)6Iag zQ`f{lc-G8aeSfv)(>^(|^k-ksS$;peySTsQ>>j=-*12U}yWUOxYOwNU>g5ZU_pJL} z7%HB4a_`M%=VmefxWq!arC%=izDi#Ds5w{tp-n|=R!+nr{{zk8KUBOQFz-3ESLYIY zMeDPOCHx<_?ruAA+h{`UjH!YQZj$+eU~^<_U*jzBem>yf`+8$2vb?CSoUJ>~J^ bIoH*F?i%;5ePnkL=ywKBS3j3^P6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0v}04K~y+TEt1KO8c_^I-f5%CXE1li;R_{1Cn7BYU8uYG;XLYC!dG^(my^vpTrL+1g+xA|pH8Qn&8Ac;`ThQQ zJkE4ThQr}VB!Z_Xkx0~PHFyStLBY83cnk+he`XD@U!J0N^X1)ic{8al>+9#IZA=e) z+GVp@@OJGim#yhEl8)a$ zzDM;xl6r#Q1BoP58;u5QP$Lko)oL*W#_n&=8QDs;5JIQZfl*~E$v_|gfHh!ooq%wi zPDfFcocuUaEYwkLFc?4%BbJ=|5kR}$h85if3NVW|{4Uy^5*VuQlr$5&LK`A{3IQ$F zZ#J8>Iroh6*XOj$`l}Isr8im?20p4Sa~%%v#d&cVXnGr7f`+ zGfCvX0qzsf7=x0>;{k>yOv9)ni5Q#@s(>L7>`FC5@UVm%7r{B;vDs|K9bl8m1Yxd} zoK7bgR_8`o1{iAKA;6iTCPpJN+!AAj-EMceTzq^Uc)*anT{T8z-F`k1M|%E U$<+VXrvLx|07*qoM6N<$f@c0FtpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/grateEmptyBack.png b/src/main/resources/assets/rpmachine/textures/blocks/grateEmptyBack.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2ddbd0f35095e3c66d022daa2dc2a6c0444624 GIT binary patch literal 624 zcmV-$0+0QPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0pUqRK~y+TU6NOeVnGmv`zJWyqOyij$3;a% z1W`;N26W5`bIv&+=!@W!zk5D!&%iS0p>KEJI#s7mmxx3nnM|fsDwWISVzF2#6xh`3 zb@uX@&*wiC#A2~vFetb^pU?OE{rP;dUa!~ve$UPAb~_%Aold9M>opn;vXC?yjS8*~ zhr{FXAex}l>BJGRSu7UI<#INgO{ddVt5vO5lgXs0)oPo~=5o3C{eHLG{ZE0-X8ZVo z!{P9FJl$>=ory$3P;Rwap~2~N5^DXyy8@HRWU*MdZ#J8iN+p#_eG?GCE&2FOkilRu z8jW&=W;UDK?KW+^B=MQg=eykw86+lJr_=pWpwVdbdc7>t@Aqi~KLy4OheL{xo=ilj z)#^6|Z2l+E2IjshVBB~-rh+7pTcuL{B8)~ORFPfeaye>omW`qtC4@rLYPAr^LUCjx zgr^Y5qW!^OAls$OzX}M2tXTC9VKSK@=~W?{&0;V`aEX5qq%#sSz1?n?gzpM?3|uak zY=cq~%6nLOAFtPoD{z=2kxr+HrU)x4(Z)nD4y<6i-7*JYyPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0xL;GK~y+Tb(7m}+CUJ7{S;MI^`dH}G*JrJ zfNe-@AVAD1ghLXDAqg0p^FgJQP*EwV+KawnU*~UU5F7cT7c1>IyZ>nB-yJC+2cgGf zFpM~2Cvj+T9bq+sWI6>krs32ycxhS~x*p+s#H1muL>tF(Fu1!x@2&~AbB}hbg_dn& z(C=e5o$~oZvyOHp2j{+x$#~2$(n^$VF`whlGo-v_K~ZGhGw1V=|HGsqtwg1bJcom$ z;SgpjAq1Z1A!B6)yS*MV=NW$jIrIsh>vC|jT%cGk2?4cXCQZSc^-7%2M*~DP6;dE@ zgiiaGgYJV3BVh=^Vm!b_xhVK)yAc&St(%>RVI_#ZUFG0nKJ!)Z`_~WDudf8JrXEUG znz>QC*j1qFDySR^u2)}tg6+4BFX3W35lpYZ9?;v*yeg57+ zqtSRtus3lqbdj*s7r}bzOZfBo5trAySD*^m139b+6TQ9-J$WnyqlpWv6chY;IYQFX znW=4IVy{u=V5d`tV!jcA{-B2Bc~EfeCWr9J0dwoBf=EP$6pyPIcH10m+66>UcNb_S z3rEn*fZ$?PgPQul+_UREAMC;YE62|YD1vtwjSVVKqdl*B9KDmpH!DWr1&7}@u5y3Lni+K)43qjty>GL}Y~s-s0`^k3*K g8daD{6Oe=W3q#`m9%-+t5C8xG07*qoM6N<$f)rmd6#xJL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/grateSide.png b/src/main/resources/assets/rpmachine/textures/blocks/grateSide.png new file mode 100644 index 0000000000000000000000000000000000000000..2540917aa6ccb91dc0762b6485175b9efd670572 GIT binary patch literal 642 zcmV-|0)737P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0rN>jK~y+TeN*jn(ohi1>-YgCKnPK2n4(Cb z6bUUQp)E}akPwL4w8lXP9sSWa^mUH2Te)~Uqd)Gi zY#J!&MOcS*=#?^F)vA2Tk8KyB2ln!wpzD&p&Kj#62NlFL28WISSW zdgY*cP!)nCn&Y_J7I?eKM1`Jv_F!T`%VXxeV=`H#}(ZF_=>@)&6p}+57dGtOibS=(%5KJCx8A(=kXMTiT<$5WcFbx3AWh{`n~-W z=pF1@atA#Wiz*b;)Umi8GZ}|7Sk}JhRV=sk_gH<$=KWv~c2Bupuj6U%nGpOBQwwb3 zZkeJmKY_cI!;ps2%czjHQ*P>gZ66-V4P_C5Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Q1gL_t(IPh+r9R5Xy31R@;?2@5qjML|Jv zZf-F!Qe$R@$N~j{Ttg`-AQz;;TSG&Ri78uJrhu2vL`o{d+B$-R1IVypVJS5*h-2r- z+_xgXsI#lTieI2vK`GnTHq**#Pg&lK*jR5B6%PRcUs2I~exU`E zrmbAH9;le%{=?^oj+_Lt0>vb{^$p5hT-Fv8FfcIiGce2#3k%iK>QYlr7ZKmy+Oc=v zVW46LUPeY~e*T3MC-2BB+Th}r%+9_rBLk>fmVsebR8+3I`ii)uJ*}Nns_K;a_*9iu z7^D~(qfJdYnV2gS6{ownOo@p}x3XH3ld~`;rq14eM{)5?XV*e*Zeeb2U>NW-F);vx z45&dGJx-M+rEe0-C_!yWWh7*vFXfk7Uupi;^w*yrOjJtU;c*?CD)(u&fg8W)#I5kWoH z)+yY)muqW*P6E20L6Cz37^BM)lXk_#@9+yuG&bIrmIe)_$jA&OrN!|{N2bhNIB}W} z8=E#T9xh(Kxoh|Sb?seUW)|^=h6$#oeL+DGm*m^pI%;a!2#b`;E9_gj?)ZswpkM{Y z!15Jqr_Y$XKtLed!lKT_1sF;l?(TEK!*wJjlg-RhxwvZGJeM>yFIl>3&Du>2B0M~r z5)yM$GIr+{Y>ZDTx3dEVfD9*Rimh##px|;fwRI6u^J^O?<>Xt*$+0stGsyAtO9N9P z3roF(v@tWYhpH;jbHHQ+3<(c*_7*$CCQi;!ZeC3>F?n8IK6Z8nNZM8t6BFX#km6ut zXJX=JVG(3v(wCGpQj`?s;?fis5@2TshK&FRhlQdd05DO?vvi4)x&QzG07*qoM6N<$ Eg2~fw#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/igniterFrontOn.png b/src/main/resources/assets/rpmachine/textures/blocks/igniterFrontOn.png new file mode 100644 index 0000000000000000000000000000000000000000..22820b42bf6a2e5761874a455cef23139ae09584 GIT binary patch literal 904 zcmV;319$w1P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Q_)L_t(IPh+r9R5Xy31R@;?2@5qjML|Jv zZf-F!Qe$R@$N~j{Ttg`-AQz;;NJ=V@gDX`{U4e(kL`o{d+B$-R1IVypVM(&G0+PP$ z?2%l2Rw5#XGBOOJ+}tTqF_Tg=SL)~nD=KC3@&;&X#<8)f^6{zg^Vc~!MX|9hGBll* zlUJXTF2T#ou(`6Pv#Y;MOrly=E=*fH+txPI%IZj4!ulF_Zxt0yK|xDdSyyp!cM++{ zjjcO&?qj(B@Hvo*m6K1^)`>GVE_ZP`+wS-$o#9U>!>TNAXLY>g z6*KTMGS0}#of#FkOjj?*!lK=b_3U)hKk^KJ4l$f;)hqLti_y}VV`4TfA*HpxDbUA{ zL5h*lmWL;vUm(@ic2mB^v5ERiI+d>X8r)eZf2vC2?i}NlWnmdgs)>Aj3QSD=OiT>G zAd5CN)f5(iU`bL? zXf-hbCXEhly=9GUl?5g2%*+gO{QN3xY#!{~2^JRiEG!Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00M1EL_t(IPfbzVPug%4?vp8M)ubiJRX}UY zxVB&^u$Z`r-GUZk99OSFlL>?w$pSNKB(MO}2tgB*B|N!gOZK+Ea3Az#C(X(4ob!F( zxs=#&I-?c~KG|&EShf4~dTwE1b@GYR(^}Q9*CUKsEC|Phq9`UvvYSkL8Aj!}Uztpq zqOuN0erjr%PQ!m9NyTb-x3mR4ZfVcs`FVKwEfQ(*yg<`O9?y448mj8=VsX!8`uaAoMNw}+SS86dv)RWm2(W{j zBtu4{oubz5_AQnb78g;KECy&V>U6f*Swa*=76n0YyWL)|*XeZfJn!@Q5C((6a5#(- zFriQgu;t}t!teL*@9!51g|oA>hlhuLzkhyyetLRZDwUATX0zAV*PTu$m&@($?na~0 zF=2Ca^Wx&-{{H^;^%ak5wfge%G8_)u?e^v6CCCQ{2Z=-DRNrPFB;TCJ8A-rU?^7!W|is8AFewzs#D!94It#^Z6U2lX*w vZDROMI0CMWGr-UtN7SkaIgXPgNfgC@qQ2uzZNJ6?00000NkvXXu0mjfk*`~V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/igniterSideAlt.png b/src/main/resources/assets/rpmachine/textures/blocks/igniterSideAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..700851f24130df0820e76262a1a855bd7ffd459d GIT binary patch literal 763 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00L`CL_t(IPfbxxZxT@yods!O%8=HQFd^VwAH-&~^n+BpnXdo#VLI_}pCf(?w3+d^6t6k+fzFoPp7-1Q2hG+=lhSJDw^i!=a+9jk){m`3j}ASQol|I z@>K9t6fF`7&@W%V@hp3pOqLiXWi)1HW+FBl!A**};NqfRucxdmTjco=&jbBXBbr~mC#~$ch}`|QFgl>w`#Te{3dd_90aXai=_2>J)KTN02x+AcWQlo z9dkRK4$3DdCnystdgDZjZTtN`1Q=^Jn<=;f^#8ycK;7TpPo+|rMtUL8dMbde`FtL| zN25`%*TacsM0Rm;(d~9YCDTBg+6o;Wn#p94!;oY$i475O3<&nY2{0TEClU#Cp9(xT tf!_oZ;4*ALU^+}BRiyZXUawaa#lJ8<{vNK*UHkw5002ovPDHLkV1n&tK!X4P literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFace.png b/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFace.png new file mode 100644 index 0000000000000000000000000000000000000000..db1264f5209baaa59f846139f73f199ad80f2479 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3K6|=2hFJI~pV+p3IY)D6_SgR>j}tMy=!wr;U1&o|CPM|{SWm! zlpxjOm}F2{UDozrf~}&!;E#V`+W+~hPye;|ZU0=qP4WBxlG;22`}-5v`;4zx9BfN4 zRdAaqtJlb#{_10bIm0v787z7|*SYN+oD+n06ewMo8o|rJ$<|>cXrkcJ^V9x>k%auw z1_8}OaU2uVkLNLX7&y$?zT1^>bP0l+XkK^^}qH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFaceNR.png b/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeFaceNR.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7f76e7e3cc341f47221c2774dcb85181758fab GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3wt2cZhFJJtop_Mzkb!_pwf|kUyIaI2%C$6w2(awsY!c`HD`LN>{^k3g zyP^vNR08#@X0WuKOirI1I z+r&2eSHs<3i^^kjuN0RFvQ_APJ$OTy^TcN(o*7GfYH#~CJ#zJ(5ZG8&I)~+`H*YKB zdM%r86OJ<)CAH?v-h6H1zfU)cMS~ri&gW|@T7R^WS9#FEdGG3d<_UKg6|4XC1cvSt Q2l{}))78&qol`;+08$`(=>Px# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeRing.png b/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeRing.png new file mode 100644 index 0000000000000000000000000000000000000000..0c62e4c7058b1e7eb574cee549cc6fd89e981bd4 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hVV@_M>BhFJI~pV+p3IY)D6_SgR>j}tMy=!wr;U1&o|CPM|{SWm! zlpxjOm}F2{UDozrf~}&!;LrJs4}Qhxo%+82klTa$PSOAWnYir??C(!t?=!w)aj-4H zRKacH-}*gVzyIsluKRDvcISWh*`5EzXB7NDf8pt``74fowfE|MT)#|?zl=E{j=|ED z`^6KZYQ-I&9VM0tE*C#>^zccBfCCLoCqg?u?r%2`mS|=&bD8(IUdN!y(WHa_(6bzi zOO5>;$_A?}4oW#J#^u!Jzx+bU|M-KtFEi8!hRk-9m}1wI8u_pNyg z6OxYRF`VF5;Eaf3*vXJ$e1=s)>WR{XI|*Lw|0Nk(vK~hFocVSQ7Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0bof)K~y+TjZ=49ZW2LHIlY{LLT&dft z#RYiVG)K_YTmdGA3A#-B&`d1}FtK-e9opSF*^> l{Y(=4vZ{^b7<2N_{sASA#k~)Rcf0@q002ovPDHLkV1kw`&6EHD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeSideNR.png b/src/main/resources/assets/rpmachine/textures/blocks/magneticTubeSideNR.png new file mode 100644 index 0000000000000000000000000000000000000000..22586f6788a5d940bf8258a0d580e08ed897d71b GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3PI$U&s#^6&25Zb2^20nRENtw{@&su->HA1W4kum5~T z$_2RbM}EX-#W_jpmWB3KcUL?lMSwGk-9@-hAQJdbTe@1tI&`8ZI&1SG&Y;=eyG0RSN6OzlsTTPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00M|fL_t(IPd$>|Pf~Fh$A5QS;f-ysOS`Ze zyD+5{;Y(4P8shB5r5Cxmxtxwl6nTrcK%)VQ3v^}*!r}<10SCl5hXd*ewOlk?Zo2-K zzPyaH-_F_DKF{~}{XWk_c)Y6W>dQ4XH60?M)g)h<*B8#5ZqcrD*>o%x@#{6dYSO&AL-CB7d+yEhp9l04dj@OcyM{JUkm^kV1iQo^z}So!m9;3 zU7n#G`$w)z)qut93#-sGs*$H!z=gxm|e}5)(Y{+TTCbmB9C43RT%cPMK zL@fD+Ht59HwH5(i+G!yftV_y4=0tLEK$~R*}|4#Q?1WllEs*CUEPsA6$GgH!G&>Zct znH2>6F7?Eq8b8l-4@J$;27RS?N&CG!XD6&?YLuhbQ?$owo+g-1se`iy8B+3Z)Wb=s z22WE%{pn#sHTg0X^{`R5)ih0Q)@*x9I zEFUHx_Pfe7?McyYHtJy_YenrY0OjSYtT*<=q@U`Ue$k( W4{*h*)Z>K!0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00G8HL_t(IPfe2PZi6rog!z-8U?AKELP%&1 z#7&O2QQ9i%`@d8_;!3S#S!;V{c6Pm*5T@g}K@gax8OKSQu2@NuN|{J0!%%vjzgR4Y zeLt`)TLZmb=SA_7W$Vl3?RNXPUf`l|bfxwz9k%22^030Ag z*IAYjmSNxlj_Z27mSqKaB6QtA#frnTErcl{5Vh@yD4%AOe}f+V6!eA7NU zjXdaJuA6h6qwD$*0Q?f7Xd(c`{nNLAfHr97pCvd{0$Ae*Fb9W9XrJP+qpbq&X~y$I zx`}`j2rPbzKcbI-@QtcM_x*{6j^hP6z#3_vWl1>nn?J!c-^2|8!u$QPt~)*#G&!fy zV3r)m!`tCdBFRIZZy7B(2xFa!0RRI$4IgX{cz{4LAk;#bxhRUALIVT*H{Q%J+H{#z kys5=83`1-K049X_1HA`QoWp(Xpa1{>07*qoM6N<$g7xD23IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/managerSide/0.png b/src/main/resources/assets/rpmachine/textures/blocks/managerSide/0.png new file mode 100644 index 0000000000000000000000000000000000000000..325a7995a177d3fc3e4774d1a9c2588496f60c4a GIT binary patch literal 678 zcmV;X0$KfuP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00I_CL_t(IPi>NYZ_-c{#`_5*wFxVf0t14^ z#NbR2&~32IFJb&sT(Uow;EWs0n4p=WhVU{(TrkoXpf3YKV8AwH6SnEc^64b77@Cu` z=bqnl`rLCbK~WS<(|Wz0B(Kx7fniK$vt=Aev51n%gbx}pffovRps`r2Hk;k)yfF@> zSVYNgcK`!SPy{i9n4w9ML~b-PENdPIQY@mxFbpujnkD?#U@$rz*7eoLk&V?b;@Q)1 zD7Y00Zia$uPaZjJ7M5j!X_nAqcGd<<_dRo8GdmS=cV9^F^J$e!sa#SiBy)+V*X@EO zV1Or<9tM0Z^~;~W^1G*89LpES()p2ec37^JvP%n|DVA0OzNV5B^B-f;=dtKU>V0G{ z{YK2kzZWx03->0Luy;%YmR9_}hMY@(cuD9D1Zy?9?p`xn+BM;y0G5COzAErGe8p-VQJ6>dPyG$CoMtcQ~r7PlyiUp6C89(Xn(5F z;z^6|w|Iq1LNLveCdiDOfJXZ!-*0kqK@&_Y>2x~Ku!Pg87BeGS>&^Xa^1Vhu{+3vL z;KqD_0Ulj%+~GObt=HS@$yg+Tco&Yp-HPuZHebD1yL0>I=z3GsUt&)4-}_HF5&!@I M07*qoM6N<$f-w;*YXATM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/managerSide/1.png b/src/main/resources/assets/rpmachine/textures/blocks/managerSide/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a11a2d1acbf381cbfa3d658b3e56837be522d260 GIT binary patch literal 715 zcmV;+0yO=JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KKnL_t(IPi>OzPf}qR#-BgHl7y~|dc5Ua} z&;7gZbDifrgrX>#rX>=INHj&$GKOIl3gu8Jv4|GS;(-QCa6<%i z?zo)WF6YM6M>>s?<2YbKB+O8&HHh@UZ2TVCE%SQ^>F_}+TuO#Y$zU-Nj0L%nM)57&>{^}%ud7P_cqbtkiTOzGFto34ykAL=gU--ORp^u*Z z@H;;4|Cx!bEH8{A;oGqrh_q(6)(Wxkr`JRxBb21Eh|c-&yA6}}$w zk$NfKs_>noQnyvE=JyZzJ;%7gFfCq`Gczo=YPbB#N3TwD$lY&e`|V7xmHFM|%jvLV zX<<&K1_qcsA;d$->=Xq7H^$#ku_jHNJjt~F<002ovPDHLkV1l-^KUV+% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/managerSide/2.png b/src/main/resources/assets/rpmachine/textures/blocks/managerSide/2.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd632473c26c5d92193958f6230e27de7412d61 GIT binary patch literal 720 zcmV;>0x$iEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KZsL_t(IPi>NKPf}qR#-A@>3{Sv;!{Goj zY*a(q5J&~ozC`OyTjb^oH?yTsYolgSjqyh!a<=$$fCC6YfPji#rsZQ6!COVs{;m@JSD_Oh-sXXN~P$bQZX#6846bv@iZlq0|QL-5{X47*D7eELA$c_ z#J9HOg1Zhx zDW$^2WH=G>+pT6q0tR>#>5<#fEPemiEB@^kFAfVAhr;=RaJHYX=Hl~nwi_ZXx*d&T zg5UWP@V^ZB*CL;M+tK&@PViSYHa|Cg6$voG>@W?E;}%_xdLa@0{D#Ptgw?9e4{m9= zRyA{Fn3ymC1AN_JuNS^m_*kQ~)2{N}y;84Tt_j-}e#?E`fWhf>dKea5_TNJM{2-6q z{Z6jm$)2{ee_DJw6Lrsu24H{*MTi1Y&@j}5IOwxZUPLeHlU4>pgMncfV1UKd!2c_i zss*R5CVcJh=T197FX_F^aWhj&M_jX3mSus7t1*h?v|)m$?Ht;lh%|rPO!u1UVk!*7 zO_4-HY>)&r+Bed@Myik$4WmdBi3Btv;dd(8*nk#$r;ZxwZarD}8FJ28F&|)n2kVU; zwwO)tUay1$z7X`$8~m^l+=SNOzFMBTe`m1X6!jmNGWT!c?_h)g0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J^eL_t(IPi>N4Z_;2C#@`RHxv-9|&_XK^ zW^jgK!auhG+x!y78xwKKE|%bo8)!_>Oi@FC4iOiO&=x3kAP5ZDhHSz%{aBuE1a?7k zF8ZGHdrqEndJu+T1VP|9u24)9go-37t(G1JJRu1sih>UUV00J5Y_r51r2!31Gdi8# zXq+1cJRu3CdFD1?0HY@e1rRb#V+w@=dZ^W;Mxz}DJRu3C1tks`z(_YWWl`eHEMYV- zo9mAQTkC#^=g<5;?~c#A?elItePqzl1~mzoX>t;oXOxR-5-dHiTfWD4OTyj(&mM5B zl!-~1XfYj4MuHBj87u(?@W|3bkFz0t``0c0?G!Ih3YRD1#j$vPl&|CxE6esVmexGZ zdNC=aK8J!YLcy)r$G|@OPDq7+X5%Z%wrfiOBiJ2mgQn>UR7R6BoyM@ZE3c z`t5A5mHpEcN<8aXvW*!U1XVEs^m#ikqgV7@!Mv=#eFt9X8l&<)HnUObe$CuG`>>nW!unV@Vdo2Tp*7_I0jX&lJ+K zU}TA$m;f3q!QUxo;{#gmo%vnoI<<7+N5r*gHBuB{01wU^ZrEZry?wPA4Fw_)AN=9> oJKn+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/0.png b/src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/0.png new file mode 100644 index 0000000000000000000000000000000000000000..dd88e86160781c646ea4dfd45861b8ef949cbd4d GIT binary patch literal 679 zcmV;Y0$BZtP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00I|DL_t(IPi>NIZ_;2ChWiU7wFxVfmkkIS z6EpV#0o?}M{1e8H!zKH$1Wg>w#AHjRE=qW-$R=j=4O+S}k>YrpFkx)QU*+9NU@|L&Bo&PtbU<+3dgTJlA+_^psxTJTP=v=a1drL36y5c#;XdccNr z>11Y4%*9S5c4^_^*b?@RX~5D-z+Y9e+w30kMIxF5OZU$$Ufr*s{1dr^}zQo(s$@c*VE zsK^=67mcEhUeo8N0)_^`giS9mdMom$ezVYP0KKMv2;G{X^2xxwXTmu^fC={M1++ic zX|Y@5J2k$Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KKnL_t(IPi>NIPufrzhR+W$GgyH_TX_vG z#s&SL$W%bxpIG)~iOj?gCTz(BmMqc4ZDu39bqpPgP|CaF7-b6RP(j?XU$wiAfFEq` zqSVxufT4tQ(mYs7y^096+huocdwo}ivPcv61;!!%{ zT9}>G8-M{O&k6ApGBHBIP|3$YU)OUodP`rPq_Jr*Oes~s02AZz@U&8;SJTT5TP6Rw z)5x~#KyT@v>5E#rB!ry{Gn2H&HmU@CCz8X49c-UwG5%7f#fzHIstLtZNH*LPNjC7k zB%m=~5?WHKkdzIBNX*a>Xhg!_DQEZ|EzeHPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KctL_t(IPi>N0Pa07ah0hG26RC+0CbUTfnl#bGwx%UqoKmzj!Z08g#ZsVhv!Ech>96VFpa;bEjrj-n%o|s^V!WBh4sns~pfXPFOnpMzKY7IOrtJUib zlao_J;ff-j9%*&J0FxJl_z5wMQ&OoEJya@2qnQ{AR}}FyEt3NSO!N}Tj7+Xo(33{( z`s#E4>s250>ZQ-)_IlhK9{1YHGozk0su*CVu`y!4FPl>_i1frd^PSs17Iu$Pkt04* zNQMi^P(Bfg1vhOLGa>;4Jc{(xWv>?Y{vZ)PtWhd(mW#Rcmfk(OQd zNM_0_9hZwg4tmjEXyuC?d4o-liMNR(xlN>cmCbu z3wyPb8-u}M1P1uF!B)5Eh0I2Cctiw0nT2}OtkQqVAzvQf~N^+OT8rq54P7#a)=!vF&;t_J>J zsZ=dFtflOiUL(`31HGnyr8?DAfe$<9EgFpmn7A6FNDeC|*sW#I{#>MmPL*$0`Ft`2 z!(EX?12;$l8tp55yOPW$M8hbOL?Qu=Ncf#%nj6q!@8s_ae^yT94uXz33+4k1@L;{M z!!u^n*4y>aM}H9d;0wI>2DYJ%cW>6FA3qqZH%0vi_on;qQVyig00000NkvXXu0mjf D!2LKa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/3.png b/src/main/resources/assets/rpmachine/textures/blocks/managerSideCharged/3.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5b7c078b2edd5c4b3d2772b8dd4a5fc12c6553 GIT binary patch literal 706 zcmV;z0zLhSP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J^eL_t(IPi>N2PugG<$Da?NGg!e&3uQoX zVJ^r8Z&LwvUt-zK5}An?CTz(BmMqc4ZDu39bqpPgP+Dk<;uvM}=D>ltWuI!NO27+} zbJ6FV-~Z%)P7lH`499VmN~KUta3*_NNoE#@ zV~U5hvs;0|U<3@{y8>rL_)=o&<1!a*N_4v+w4^eBRALj}yMp1+YaZthKG|;;z;~~n z@71|(jr)Dhp624-W&4<+K~UzCKws4hGI~Q_p66g`AQ&_Bn%hz4Kld8>ZXM7Y`e&|F z%@vuLXW6!Z&pBq4^3WqoZU=0zTgyZHOPOXnRi<5K#B5X+jIksO=z$ZUp}oYkrL2&V z1tUwu#01b_3I0xrqX)FyJNrvwE-D$}IO1NinMe{afCuLdH*B?-_ugzrKZGI>?}OoY of$%=W&fC{pi;o@*&Ktx21HcRagYG$RrvLx|07*qoM6N<$f}q+pt^fc4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/motorBottom.png b/src/main/resources/assets/rpmachine/textures/blocks/motorBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc6e593120026f8cdf931789012dd557dc665d1 GIT binary patch literal 757 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00L!6L_t(IPaTqZZ=)~}#rYzYR;`)~l0X8O z%V2Xjm^(lS08L!qqt zi#1)SbRj#UsK39-FTx5hdC&HbrvGW%ds*Mp^c3=wAMIVgvB}o*3WPIc#i~Z1Ea1e*FEJSRe<5Vs{gm4) z2Wk1SDL*&KIrMjqzq3eVnp~BPvEXtu8CdgG^pB=}=^1kTsKqn~h!1{p3gEEbV;%J4Sg9)6)8_})lI+atTULI? z)t%>8#t+XAtS4;np!;x#gVu2?Lm`r&`3kGO>KrF000@(FkR1KZ@RUAlPofUT2g-J? zyG1Hp3L0JVeOO#seq#Jc0fzN1J9xky?Cc2cz5Bd3j$0y?%moxEdGQCQ=JITIAT zaC1Fq!PN`F57N6Q2}u2&4Hcxx*=Mb1CAw^j!pdC$T)20_4hCd{D}>O-guU<^XqTkW z)t>mZLbqep$HbZM~4r1Y#_%dF-O6GWOO+_@Cs_&vcnd)O{HI~ps nwxl(dVWa2zWFo)4i7)>E%A3s)Y)HJm00000NkvXXu0mjfV{lm$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/motorFront.png b/src/main/resources/assets/rpmachine/textures/blocks/motorFront.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb980918049f00f522f3f11211b2bd3a3c07281 GIT binary patch literal 872 zcmV-u1DE`XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00P)aL_t(IPbE@KPvd47d{k{!cA-Ux5H?E^ z{1L|{eqVoLV>^x=J8=Rj35nwnK7t@DNt@CZx=2+~OI4}rYA?%WFI@J*Wp7A(SoH^V zPra>F_0nI^e^H}KqdCkxGnaXQ!L(@dsw1ebsQHQ+=w_grHQ5Mc)kU(yi%vmt5Ykyr zC6@~+kc+snTkoB8`s1)WY<7l?#-Oq>s02HXAK6}LmD{GXs9FXSKB+}j`L&JV$R zG82avGl}Z*95PsJt$^ms{ZZKGlBTmZIUE1`=gWV7Kfk^DiQZ>J9~yN}*o-CIK95iWB2|AF3d$j?n(AAdI521cN0wEX5` z_RSUgaQF4?&G8SXWNZ;LA7hKtD4M|Eg=@O&`yto3lRK9wRCQ$#XW ze%+r@TpUEDcwAU@#Bx}yZM#YttDYE7tGFn(r4oM+2dN&`d}(9P3%ZV2R#W zr?%_1j_Tpb=h3LS_f@wyZuh_J#JoM;Y8?2r$h9{O+2#Qk3vSz}_U*k%2m}S1Ap=wZ z5P%B+r7|GVX_|g$ds{`(;sBYfy}9OgtmZ)t@*HFd0-yj8Gamdc^i3C|l=OmJm$()d- yh2^|NF%rcI^om0BIwu-fvJkJatVCtmrT+kSF}5oarmY?T0000N2bZe?^J zG%heMF*ZbLuk`=`19C}3K~zXf?bh9I+f)<)@GCULJ^~|J`Vo>Qb`sZaeXl=jH+B*` zcH*Ron$-Dfk~XDH)&_-cY;D=PK{FwtAzoG?fzXiH9`>>aq)9vgFNhbWJxtmI5<*Cb zKLGv;Zs{Me4kR8>q$A7nx#zyz^YgiYLQ!60WrLGVUa=+3Q8h=_a$?*OWfO`9%Nw(j z0ijAWG8vxr12KV$?R;ai((G4j-BP7nEOs)5PR3~&c0FlT^|Y&*rMSK@H=p4tg#fyv z7F)UcW@+pC#>KtW?(WLkJI&7JMti&39Joi(cirw{x}s}E3278a=GF3gVdF~sR`Z-P zcBUS?K+>TQ6(Hy-f|=^fjN^|uwbU&n7FDFvK+7tvw;CJJKNSfIakQ1w?|nf2c*uPH zzW3@nu-@?C;)y9=HtdCQ8tF4YvBlz_Q?dY#4_7^siJW>0A1;_P_;fXqTQ;RMk}Vz|tz<%+7E8%c&WB zf(4w$8YMMTH*#$=cez#A>Ga+#Tx&VoEoZ-G754k3z4hXnovWM4#kiPc0ZPo8Zamve z)^^swY8QNV|6pSB2LNsX@I{CKUwsRPx3y-@t|qOe1g|pyYIJgO-mK{PeidBW1IwLq zh`0g33IMyWd%@=0pj=a2J5xz(`8gK1#d(ZKJ jyB}YZMjrl^2RiTPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00QGlL_t(IPbHGgPuq4J#=ojM^^KKA1ZYMG zb`oO~|9*bO#&#S#cHT%tg5x-tmmmm(Y$?!|BCSOm)1<1?F6FWvdf5(KI7~v?q3s{A zoqDTO?b5%X|3!@|J*VgMeV)tn1qx?)os}(4wt2;s^opuiWW6eC6;Za4XtBJNlPrW( znvuzwTmr;AZmiY1yX|n`clynCztQNG>b+8B)p7&V@r|OV+fB__oL?yMltO?}Q5&n( zV7IyV!}hnw8~rEin-9a@VRvoc4~O2B2Af4Xjeh%*_O`J&H{v<67eDs9q`aAQe!s z)mkKCyWX{^kK)r5M`kgR!NiOG>nEMtuTQTK7r%}3jQSU&R^|3+b1JLjC_R+MlJCm7jSLGRbBCyF$G>^9$n{G9*%_U7VS-|<6?P=xE>>O>vMj!t8 z3r*fH0U!W1MZn*0;PizaR$bq8mh-&90Mco5X~AwAwSf-@$FS0yN)b5#0)W03gWU(v z>L{LDY8Um|JR7~nte6%HNGSHG9T1cnpsn11Dyu(^INtplu002ov JPDHLkV1i{^mbd@_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/motorSide.png b/src/main/resources/assets/rpmachine/textures/blocks/motorSide.png new file mode 100644 index 0000000000000000000000000000000000000000..6b81acddaab6c8301872f0f9dc139745b2cc379f GIT binary patch literal 789 zcmV+w1M2*VP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00My#B)SO5G_mdnB7fS&IbGZMP%@ zQu|Ug52mNA`kl|<3?*ITDs0ew{umFI99_UGf}c#1O``EU{cI4 z<6<8J>G*Rn{u(6Pz?&J~Omj+AjRi)*AuCpsWmuj@)w!IWv*M8EUrDy_18KGk(=G7v z`jzRGhCUQ%8He-^B^w_gtn6?O?lH7fV07}<5Kf)p zHk=%WAtzt`BCWKQ*je;T;ANJwBY+`8G;6V1Xdn`pMcGEN{{q zS5AL!Mk_a*SymwnZU++GPP_<4`*3%yR@ZWUomH2-`YjfheD*y83{t>;X;@=faN3aU z^YJp6pYr<4BaFPF^anyU@JA@j;51Khe8p8&ZA2Esg4@c=&r)haaEb zYIV3)f2)DuKS1%men*R~U}CZ=1@R_pWzy`FzoRflqbT`t1J%IjCI~>l;kkKaFnpeC@qK*TfD`HeNGzifJK)DsSt2Vp9c@CM~WS* z?#R?bxo5Y57;4Zk-bEM{Z)+qiw@3k_C4!W2ri(K&!D&p-Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00O>AL_t(IPbHGcZ_{89#eFDBOKItb;6N9; z#7VrwcDy@wyv3iFByQqnbK*2<+R_C|5eK+b+9EXl4yLXqtrw&{(#kum4CjbOjz?>Lpd<@F4w ztJxj3d)ye&oPpsY49PA(IPES@j?wdpQfM^}{OYz7uljx94}cq)&4b#AGA4oYFr+v_ z@3_N1nAl#w@3f8Tj<-2*PtL&Wb5QPCUSvck&6p08GaMig4u&Ma^^V*4Y$6`n4Sj2` z9Gy6CKY(}Fc6G;ayGG||D>px0Tb^Pq0+rJL1)Zn$Az1kN=85V{n?tAb%o+*G+p5(r zghxSDoVk9!#9Ab&q7b8#oxQE)$uVj^A(uEeGFk`5+56(fH&EZ#td<%c2J2IIjn^LKE5 zXN2bZe?^J zG%heMF*ZbLuk`=`1MNvfK~zXf?bgX}<5V06a0^Y96xyL}I)G5qDP6MJaU91>V#kRc zC*HC(akDQ?nznR-GKd3Q1`bF)3}|N1R2m5w$_b5z12_IYe()~%@D8I$2qA8XzFB_u z`+lAu5#u7fnv^VFwuM|dqt=vMIjxk1tj&u>hAYr1jpj6($&#e7x5ESpR!P`hWAe#p z`e1x8t2bxm@~~(R3#Cr3;L2)4%GX49Qth9%cr6|hwuwwh7@qe6zBjg)7Mz~$o>uBd zc5Pym$GSb#tbsbbY@;-#$7v}{C{B9%U>INZH8z(keWQI=Zyeh2(fY)!Pfcf3?3^`G z$`=_b9VT*iW_&qF-&;J~ecSHojid7Z)VX?SetvCM$3}UikFGk9&O$4q$&g~0kWF!X z*=tBEzkRu5wF?I))zOvx)wkxO=T_rLcZT}l;-IIlJv|Ew21CiwKff^eu(i9qpuD@N z*5&<~J^08#U#K3cMlavLaD#8%5%2j0Bbihwf-fWoCkM=$ueQ0QR77W_chB^P-;|#G zXtqu@qpSAMT{N&@GMttmcrD>h>cYAorj#At8R)H({Pm6Tu=vp zX>m@C6QZ7UkLoRD_4&t}=_331du#fsc70<$eE}~D&u-27#GaY!Uyt7xi%C|A6B(VW zjLhxj1?e5XXt4du{C7W@*UyZbpUvA>mV2CU9+$V4?!XnYS&GiYh@?W>9Su#%>4{QT zX&x&tURuBY?sU&{#ZJzhRnTpX31LPi2{uRDy#iVqR*UN`rPNXEzU1_?1y`~9YU{X$ zQaT+=ND(3-#mshr+k11QuO*b2+RQ37LAJPTRfIa3oqTm2qVYf!^9RD471x*CLEWdq!@~Fd!!JF3So*3 zQ(}aXsFcD$qvJv(!tCsj!GFvHw1r>y<2;~rJ`b??zkKll&I6=Sevb$EQ}w+?oCl}| zw+{9Gn+H@4oCkW<*WS82pNDZV08`>TK>2S!+wyq0{})1>2LKEscszhOFopAw3ix59 z`8@1PE00e%a2`0#LT=By}Z;C1rt33 zJwr2>%=KS^ilRJS978PplTU10znr7FGyCiRlgAdbJurMw(thUuYvCvVnqU0o4f?-v zC1c_owg!{;E2sY2zsy4>hr`TNq31fQ!r5YDmy^Ye9>QmSMr)~fm^Vb&WHB6N`;*SV YaMH`bPc=x?7HA8Dr>mdKI;Vst0I>p2xBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/pipeFlanges.png b/src/main/resources/assets/rpmachine/textures/blocks/pipeFlanges.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcd7de332a59bb936e1f41ebce0e5d7cd86f135 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^rrLPAIEGmGpPl6Eeb_;u?YDeS=JkGuYB7G*^8d}^t{0RR&1mDQb6~#Y zwtDI!7b$&Pu_ev-|-VknYi>O$ah{TGWDN1S_ z2UGMtS?@@4#J2SE52pIIeCl{?MJa$+RxKodfN-QV_P+3%|VR$9b-^NU$>kMaI}?dNaKt=#|&Yz9wPKbLh*2~7a`$iABZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/pipeSide.png b/src/main/resources/assets/rpmachine/textures/blocks/pipeSide.png new file mode 100644 index 0000000000000000000000000000000000000000..5097b4ca03795d5908a48eede76ec007a977277c GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^iXM5oIEGmGC!g51{&?5-a!r9A@T~8Q4 zsM&w!f3ohS|NU3J{}``=%d*$GPb3F(~ z!?4UP#WJPma>M1x4W2vwp8bC*HuL}V-zg_QAKDXg@qcY#ikixVWuZ5P{y$gioRogx zDd(pD{nt0#LT=By}Z;C1rt33 zJ+nVO$@hV3R(ZNOhFJI~pV+p3IY)D6_SgR>k2POtxa_;>|NAc;f9nkbAN+s3(k4Ob z$o?BjzvWfh*NC+k@-S%HTvPZRKezMYeo5oQ^~?&qNzF$bicVxXN*rdGkgLFZB1vHl zugLCuYVJ1}CTw=>nt0Sf;)&2A9)_I^PfAh@1=urdgp78!S&%iKwhvJmKZ<4P9UCrR>>gTe~DWM4f Dnu2e* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/1.png b/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c0cb2b246db3b7789a2597747c220cf707d23f GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3R(ZNOhFJI~pV+p3IY)D6_SgR>k2POtxa_;>|NAc;f9nkbAN+s3(k4Ob z$o?BjzvWfh*NC+k@-S%HTvPaM-!$=IJ*)8H|1t`^NzF$bicVxXN*rdGkgLFZB1vHm zhsf@GYVJ1}CTw=>nt0Sf;)&2A9)_I^PfAh@1=u?x%tJ@YpS2K9J`njxgN@xNA D>`ibn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/2.png b/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeFace/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e6e1d828ef2080eddda49457ac5f82650754df GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3R(rZQhFJI~pV+p3IY)D6_SgR>k2POtxa_;>|NAc;f9nkbAN+s3(k4Ob z$o?BjzvWfh*NC+k@-S%HTvPbHzq#?@e?7Oh|EC*GI(UVcPb#ivP2^#A*w$#G(B1gK zWWkNEW|oK88s_i@_2{r2QkX7~%5Z{JVYza5qk%_{2D3xghDt^iw-AX1>`A5*+E|qW zH!=jV7_o>=^-nK2v{)#GV^fsCF@uH>nPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0Xa!TK~y+Tjg!4f15pr0N38@4K@bbqfPxXV zu(I`me2A4GHc=#?5PSol!CnxHkVeIbh@!7C&KcQobLR?Me4FI#%y;MKMvjl_89kqE zxY}}mJk>hYq`xMcb27uw&b-KEupM|Xc)whc0}Dr6Jy$ znjx}z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/0.png b/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/0.png new file mode 100644 index 0000000000000000000000000000000000000000..43cb3fa80799c066218499c43c44b0c31e058224 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3ZhE>nhFJJ7oovf>$U&fWv7ED~**}x68#k*I_%|*PxT3WnRZBZRFdch0MkGxVFVdQ&MBb@0F|MG Al>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/1.png b/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f6a7c6fec5da44fead4cb90040b640878182b76e GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3ZhE>nhFJJ7oovW;$U(q0oPSb|P5XpvUINvQ8!mC*U=?YKV%@UE>#1(e z8Wzu-Glj=~iV2mw$!wS*(*N}1^Y_PeFTF|Db9Fjvw`hWSrOQ_5eCqV^Q!W*urX((@XscyQwpUH2*T85Q7ncs>X2q-wQw1K}iw(+Ur zbf!MbAfX49$$KZPZrZ0L5h46w`qfiRlVvAVGw~!UB*v+S#{)gd;OXk;vd$@?2>=51 Bh)Dnd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/2.png b/src/main/resources/assets/rpmachine/textures/blocks/redstoneTubeSide/2.png new file mode 100644 index 0000000000000000000000000000000000000000..303db2287dc994d0886388300c04ba4c98a5757c GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3u6w#ThFJJ7oovW;$U(sMdUuXl+>yyQZbU`gmI&d<5)I7RBE)?@Avsyq zBPqGh_}umhJB%MS99>eO({EpIzV7}>yJta5Le|?H-E+=1^s>u`>(3`%tUkBdjCby0 zwZmU#-2LoQpt$24bFS#Yw#Z19W(Dq&EKkOWoqqM)8(uqlZb&JMmJo7iIPBZz*p!v@ zg2CJ%jKzbs^32kN0#LT=By}Z;C1rt33 zJ+nVO$@hVVvUs{UhFJJ7oxGQiF;KvbeX7gCpm%y)YrS4K+8p8P+^@kQBs8_n?IEWL z*TfS+3j#Sl$|T!0ZT;RgTO;lLvy>vE&v#?Bp4{z^+A^u;MTE?g_O7F|H?95fJNf;m z)z7wy^mpDk9}t>&yK8NM>xNaB*vXK6xhMX9VT^fPu{2P47=wo{duMD@=|f- zImgqQrX9M*+svupP^{)NrCT8N=@DzS8&i0U4)C5?a`Sw^46aWK;jD*`bJevqUGXv4 zv_)~2zroLN1>prhC6lba@LjZEzQeSRFTCQd`+Ic>rf=UDg*2Mf#yUQ6T*sAiW~E!h vdFj`zJHrC5aIh^CelY!NE9C;pM3^N8#S3j3^P6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OT`L_t(IPh;4g$$GSc`+PO;^#=ai9fCk~ zuV3iN9HGav1@FxexI2meb`SrB7M_#!+=t4zw&$}m94ujXHd799)^f8@$%{7WF7Rl} zaqZ4`1CpJ2K!$5uj$3}DRkWv`i@EatN^XX;mE2*jT5Y*bc>#LcCdb3k=7}+@yTjJ@ zhOg_3SlJcQneQCxrg^H7kKsluAJFW~5M!VQ2r7=XhL8{hl!72n2h~e$d<=Iw1d8I! z=C}CfM4BvW3|`(Awr57ttV-`$4PFx}T!CaooY|x*Hz1=d-uBi60fxIB{6Kea?2D;M zvz^xv2xLqu^+@tFNeQ!_T@$dNF}O9|ZeC*`(2+o8x2Fj*-0R?*P~r_VwK3gpeNXtR z&XBZVBVm3{c}ao17$>0q#w07C?3M{pU3so|X9zPq>EVlT*G&sFjB?ZLEAoi&Fpw7G z<78)HV`Tnrr@$aKi^)ya>t40Y9hGD!%ep&`wwG|mEO7|6w0K@uX|eB5kY94wNe zJO>w-0KEqc10Y$IY7NqGZ;DWNfoFY!<+`2-pdKIsI#*VlUqpcG(7fz*J&`~zFsy(Y zfG)q=FU$b+M^U_4NwVeC8h5aU=UONile zH^0BDI?#!bP=`lFVX_qv0U7Xk@U>ID(I&ufv4y)h)&}T$pbZe`POk+qAR<5#h=5$6 z4aG6mmz($*j+Ar7`x?%u@`rdDXw~Ajz?EI0YkMPrt_Py^J<&j^Nu@qOWoPSn8MYL# z0aI0smjN(^0i!&~Nvk8zwI$23Bi9WW7(mpVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00LG?L_t(IPbE@YYZFlro@~-=lilnU3O>YN zQXj?kK_yV5STDtDOxk7>f;ECu0dEZ_4KJBNa3-sfzM0-k4u*N2oq6A@1o z!jA~zi42>~kvt5+wb2iA>xP%ph=YWx;CoiwM=XgaxFGSsSGasUA+7Ab8Hhjhb z8XKIj+>8SupRxkI9;CH2zcCuvDg<}#iTh>UnbuonwQVXW@xat}rW7doHY%*A10M|k Ye+xktW{vcgVgLXD07*qoM6N<$g4o$bqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/regulatorSide.png b/src/main/resources/assets/rpmachine/textures/blocks/regulatorSide.png new file mode 100644 index 0000000000000000000000000000000000000000..d952280ded7e5d7b4308c93567792020dd28b19c GIT binary patch literal 868 zcmV-q1DpJbP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00PuWL_t(IPd$1yw^FAN;UHtFe;o5{?_M-AsjUl1JNEfA_DauYj zmE_3HS}8hnlUUeddyo%*8FI%(m{r`3o`^ZO#oJNfYBtmu;=Ah8yBoB_orY#h@|KGz zNee~b;28-%M(}%xr>8mFk9nhAMLZr)E|)8nN{vQC)3ih)@phQ^m?(2H8-c^oXz(+9 zY><@*tF2+Zw@tCJu@V3kz&U^mB#CBIW)d27G;F&F-*^lJJpA>p@KQZ2w{XjhO6-cX z4j_>v(*W?ERJjPJM_|Rl4UAAh1MYPC1WZ)2JL)r$P?02!D8NOrSSFJhv+372LJ*j# z=M?^*sVYvd32v5WNTpI4fLbh80Ehu_!t4}T-(?m)h_{U88;$|oLnRlM=EWE1 z#xX4>p-?CiiPUN}PLDK2Q56P7rb>KCCreSB^t&n884?s5;_cVc+p2UZTgmzSRB?t< zoUfOebK>wR8q1T9RhSjGKS;uslW42Tcr}p!qQ^AlEJVXtZ}4!O!HB}okK=W1R^846 z0etO@tSMBD-z{EvYQ-8}H9dG`)_wKulgjtr8q~b!I+jM-3lQ7ra@&QGYx!K6lKK uCpy58xZ(jr?Yc;uWWAkObwqr!asL5$5(B8^+>eC-0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Op2L_t(IPh;4g$$GSc`+PO;^#=ai9fCk~ zuV3iN9HGav1@FxexI2meb`SrB7M_#!+=t4zw&$}m94uj9pUSc&i*;oZ^Wr!rAh|J} z1xUgfK*1#m%s@0Vf^mN(H^bRVZlG#?1%@@LEYl+ycjU1FjesB^dqXDcoERn`X`#We zH=pfPBOk+!R=yLJ999}2QD+00cvp=uHyuAqML&BDAPR8M^t4h2>U7d)1R8OvjgR3@ zhrs1lZcjtDvo)Ok#a;^=L-x!_%JS8j)!;Ru!nGmGHapVzVk>umIV(`XtqB4QcRTp6 zcJn&wFkkBAomSzuu`gy-M@Vt3_52oJFgv0x+v$1-kEbycP{HkKf(-XM_<#o3=`!pu zVz13`U)341pve!Y0ca0U0}#2}>H{@c>o8nu<-R*ZnBhqe-|-5LAV-EBxop9120*1i zlo?{2?57W8^3pX4MMW=AlUCEHG|aR)jbNCN!;L2mXs zixOFY3RWaAgEZWmA_NSd`LWEk?hGj*Hb6IQn;Z{u43M#|C(_fnK$igJfL1MT3tZV1y0$k0=m#KL-xCd#npEloRCczG zmtji*n~S+}jF&-vq*YOzS&)-fN1kg-mSab*TX%sc5H)AH0HuHmoJ^Gtmvb|$NM_hs zz<#il^Flq>wRWDHJ;Hapgdg_^KIsqudhu3=(6v?ppi7RIa_=wT+?U4&04vWdVD%|C Q=Kufz07*qoM6N<$f-V|n(EtDd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideAltCharged.png b/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideAltCharged.png new file mode 100644 index 0000000000000000000000000000000000000000..7a925d1de5458e5667f3d009cc99615338873db5 GIT binary patch literal 834 zcmV-I1HJr-P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00Oc}L_t(IPh;4g$$GSc`+PO;^#=ai9fCk~ zuV3iN9HGav1@FxexI2meb`SrB7M_#!+=t4zw&$}m94uj9pUSc&i*;oZ^Wr!rAh|J} z1xUgfK*1#m%s@0Vf^mN(H^bRVZlG#qX@)haEYl+ycjU1FjesB^dqXDcoERn`2~@B* zpY2p5AH$7Sz7v%kt`-bHQD+00cvp=uHyuAqML&BDAPR8M^t4h2>h!S#x#dzDAH$sv zfy=GjDFF;;YdHIhy%six?3t02<*PHR!D~W=YeSZ8cBJveR_Z3Py^5&pavjvx77z~0GZgzeRqa1!;>Dq;}slITnsyM*@E2+fJ%WVGsHOA zPanw03(zyulm@yUXyV=iwkMN>KpKF45@chT9l=zVY&*5a9q4o*3G@R5x!LP1N@Nk| zU|5mB4AO9KiV!e-=EpMEx-+DN*Z|$IZE`%sF+j$;o=AIBwK{J`V1!H#X1v=k%mDO< zp{96{i@Lv)YE6p6s?G?I>IqScTY}~{`7Uh>s7SD~HI(Hd1|?AS^jZ)DA_DOSkP8g7 z;u!18P5cZ;%DLiw4QEvO16=}?16sAXEpTO5=-S>0pdWx}eNQw{YEr2WP}$i!UWP3N zY%b=?Fi_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideCharged.png b/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideCharged.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec9b5dacdfd62030ab6df8df11e6e09bfbd289b GIT binary patch literal 862 zcmV-k1EKthP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00PcQL_t(IPd!olPm*C2J_w@n34DC~z$O_a ziNdHLZ+O2Xkfvg4P71|DSLzg|iBR4uu`i@-QcCIOmi?fc&D>ntmN~o3YIAv6Y8w2a ze@KV9wLLpK?>W!&yyv_xEH#IJa}vMqarXxJhqM3@9HEXUsiO%&&`$O{~S1@Yx3DbX^$6ghj*aze9g5AonHP42jf#&X!`iJJ46e2x-#tIncJa9Yz{O&KHIx>i%tmYc8|Lxh88 zBm`*w?_q8n54In3$DCzcE?1#YsMTt%R;yB}q*AHRQM5-#Cy*h+;g|q|G!G3*<}fnTYoC^Tnx>EVZOKUtW|K zk6+PTm2`sAocR4A61E13&f2V31H~_T3{!)pC>ZYzB_|b(2t0oDH*}gacOLNJYd6PI zs`1}7E<81353iaYx;pE*_V!85d!Gd{@4bPo(XJAtZS-+r(atVRlbMUvHd97NU1~*v zl5W=xw&c@o`eAz!;$cf6wvbSe68EK>fEg=%ut%(QMQ!$Tb{|Fm@d^VT;gMHxOq00c o0Zr|?Nt|T8i&(WseQIa_1DP-Z^YZ8J;{X5v07*qoM6N<$g4d^fw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideChargedOn.png b/src/main/resources/assets/rpmachine/textures/blocks/regulatorSideChargedOn.png new file mode 100644 index 0000000000000000000000000000000000000000..76ecee3f6390ea1daabb3499ac0504e0357f3817 GIT binary patch literal 863 zcmV-l1EBngP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00PfRL_t(IPd!olPm*C2K8k|+aryZ8flV?@ zCWvE&Q_1@+0l^EV=ES@ux>8e^CPI0uz`l^ONhzhxE&D+?o7!C3mO8u4YIAv6Y8w2a ze@KV9wLLpK?>W!&yyv_xEVqPyvk|}UaSjG~$21?|AE8bssgnu5-%I*NdB<+vwuAj+ zfcR{UST?g@;|^=SIb^9dbheQ(T^EdT@n#6d{|Oe~HZTw`tAf_;1Z>#}WJ^Ra*Bml# z3|i@6qQx07UuX%PtO>@5gjF;1=Y1|5I=SENVd@mX>J{a=dUaf-Mp2S_p(HyFQJN#y zrAbg(logm|cZdsrX>!j=G?l_uZ}^M!|SrAUUgGMBwq0x3Q}xeeVGezV<}a z7bke{8Wx|{U=OdF9=bZ~y7ul#)dx>KV%~inTch1YNZab?z>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00PuWL_t(IPd$Hi1OPyV2wYj`3H4WbA zAJSoNZQq^!o^w9m^E>DH!D1u(o0Ir;m$!FMa7c%v{Dai-ICV4@?jI$6LxMw(V6!jm zM=$Z&5xQvO!rE=_Yy)edi9KD%oU9JQIDdnM@&5snZ)=&Tmt~CAP69SM38Z5sFw?*q zDQ7HMIoRSvc%Exyk5>j^OqRp4jq~$9ANF1R@14OKc_4d9b*9E3FEuLjQ_kgQ$Weuv z3bRIvPJJu`TWt69;V(_@xCpbFv(XhY<1Y6)a$U`a8bh?RKBcokGuUBhE|1%C5rs)? z1P-2&;G+e<2Y5OqbNexG*qP7c@e~S$N~KCpPF50qgaQ*2aWSET0v zJS4dSfcGRSL^wSH%XZH35EU@sPG?WSSXq#xJ`IUmBxwV958xGxWipvDL;2r0MDg+QI6cx7MU@(2($wN?tt=ttwBJp^&VZo65N)eSX{*wrtc4dXiQ-h1 z*rJn}Go$b+8cX6%l$Rd0-%r9;AJJBo`s$wLMVD!!FAohP-GReN1|teTKaJM4Rcd!0 z2;gf+Xic7a^iIM2(@L!2Rg?Xfr`=cHJt_O(twGItu3~AZJr}W!9v&>%Iax{4N{h-? zu4%1KEYio&RzqKtj&3my*v+ViO<7n%K%a2_O9uf{_3+WoU26~7>^tpvc up73Lu#1#){YS%^LBPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JIKL_t(IPi0YUZ_-d0z2A*f7j;wFkhV~z zg?25ytE(W8w!t@}Kw}o^lN?@ySVh z@6&UhbDoq8hr{uBd_!2$qd{PGMFglCnw=S>&@yNs6TBvqN%!IP&t?8&H4MBdaHqjK zAbeo zt9mY%OHV7AOoCCVRNzTtY9f(<9@9O6F)dx!v96*hk!iu*vMlx$S5XuxrJAPw0n#+z UUqY7)MgRZ+07*qoM6N<$f-kZw?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/relaySideAlt.png b/src/main/resources/assets/rpmachine/textures/blocks/relaySideAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1dccc67b709c8c1809fa9bc87e777fd48765d0 GIT binary patch literal 548 zcmV+<0^9wGP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00ERqL_t(IPi2wKYQj(uh4Uh9N`71aViQaS z*W$K|qUff?N})z1#%}7SxKoi-DqXrMg)X}EoqUddao|?yaJZQ{_sq<>L|d&^`~CjX zItwZ`xVd&gSann`C_3lJ5Nmu6heL9E@%~_L9t+_0-Z+IY2#_JxXnnr3-k#1BzET(b zyp#px-(#Hw8Ai04=VX!d8Jn>G0k43C(6crCu~Chesgejoo9x6JVvWbqpjaSMRRZZm zhB)8wF{&UEsX!EfL5f6{Z@?DjPQ3zo05~Q8-XI$Uh!`xnvLq$4+>-i1HP03VWm6L2 zoaua05ccC}h9l}b_;3I(nZNa(t*)$8>%O&5#BY&M%tr`>LsgqY9g zoRovXAj`7haF`^CWm#IWSnT)vT&Nh2$4DoW38KwrBeMub=MBE^bHVKGcDr7$IVs~f zrfs*|EtgBAvMq`tT;-NVqfxKdqi(fYolXabM7!OF!4D^7v)P1UdfrewMi2x%*Ymvc mG1%T{G~||&r-xza`~EL5*acI@{`_A60000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J>dL_t(IPi0ZvYuZp8z3+oP6gKwI)?(DO zCK^pln)w+}M;*3ITXc(T)(;|$aeh=6 zz4v#|`JMA4WHOn|X0uJ#n&fu_+d&pk0-oiWg7d6{1~S1mpU*olHon%FYr_j%l%01$ zDp`QUid z^?vLfOb0J%SNPB`>f_`5)u0F;WCNLCI0(k4<&?V4F)J~Jqf{E~Q(xatd4ijdA`$}{ z$hO0c7=e@;%rRzqA{I>Mj9CDJ&mOfb|m_Pj`S3)5y{W9l8=!EH-NfT zdUjfi!okZrakT|br;}lr!+ov$I+TfQa9%bL2=F|=wOHnx?9d1uX9(;N;5QB}3q z>$O^~ZQ%X#Bi=Z&Y6?lF;dNTrL;kIIdc);^D{l(cbeU z1jnX%O^8LvZYl-R?U#4iOj4DDXl)BbQ8Z1n*=#<3NLC(@=u^3E7+`CJl=As@yG`p5 zR4NsuvLjiRrR#b`4TQI)VzHRbX7ia$HkkyYUa!Mb2?f&WbfHi{cUvGYmLy3SR}ci> nV!=HUiO^SES(a54MHIz0#LT=By}Z;C1rt33 zJ+nVO$@hV3wtKobhFJI~pV+p3IY)D6_SgR>k2POtxa_;>|NAc;fA0sK`h5TR@&EfL zPk#Nsx3%fN{``G3r7*3Gc6eV!XfFVVC zQW~2ETld0#LT=By}Z;C1rt33 zJ+nVO$@hV3Vmw_OLoEE0Pi$MioTIrj`|JOc#}>0aFid!VZ!gdP#s>$R+5d0Pz10#LT=By}Z;C1rt33 zJ+nVO$@hVVs(QLOhFJI~pV+qE{h+&=#=re`k?-tx{rGCO^S}74r-nxk9@+Zqf5D#p z&M)hG_n)XwF%-z-75rJh(O1q{=5RysT(1AmRg$C_gskly8#$O?iT?BNIAoGgs&=74 zv#W)d;iu?qaR;_JZkNXf>?rhwn+Lk$1o=~^Ds;H ztr2V4xZ}Xn{Y_0mX9RYLJJe)nM;~HalRN3h{P#V!0*;J5dVPrpzFHRjcMNRPVLPN? z7$D>>e%yp%1xL6Si)5c(UnYZrVxo7a!p7I#9VQIXUM!u0PniOyu}U_9m7g*Aah`!8 YI8Njq*QMoOfPu>3>FVdQ&MBb@0PT*a1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeSideColor.png b/src/main/resources/assets/rpmachine/textures/blocks/restrictionTubeSideColor.png new file mode 100644 index 0000000000000000000000000000000000000000..872537fcca3ee9e3b5946ba2ebf21a18ea20a1cc GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3)_J-(hFJJ7on*+xqR8XA_oiG1zhV2P4Wc?nk0l)p%CTvRy=K24rL6S8 z#vg~pPY)-21|j(DTyw+O54T zUMou-I1=?8&qXHu&S;b0+nC3A_PWV*sq1$+?p_xG(jpDZf=*TX^b1`P{Pk$Z|EnSm z_U7xi#lGU^M%pNt2wTaO|PmeCY19Ulqr>mdKI;Vst E0L5^4LI3~& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/retrieverBack.png b/src/main/resources/assets/rpmachine/textures/blocks/retrieverBack.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aec79c987695b076e0ec9ac597a2ea3b95149a GIT binary patch literal 599 zcmV-d0;v6oP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00GBIL_t(IPd(DfPHI6A2H>+IA#Py9o0t$$ z65xNWRO)2I8Ns_5wI>gwU)pK9)))o0pdt z`|w#T7XSUPTrPKUaS=J)Znxjx-^b(8`t|j-TCJSy_xsP!&$qX?_xJbL*H&M=kxh)x1$=M92ScO=xjE# zj>qG{V9;u{SB%ri1LGE5}ar5U7Bsdzjd zi^XtAK(j*7hT)zZ49=-A2=?Uv2vl52#YZaYQK3-aWye7SXl)yVhI%?C*G33C`zZ(mzS5Gt`94+ lkl|G;oAAi}i2=RfOm45*dV;0OQ!002ovPDHLkV1g8B4paaD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/retrieverFront.png b/src/main/resources/assets/rpmachine/textures/blocks/retrieverFront.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccf1c2399d18de5997a2593d29de9012c5428e1 GIT binary patch literal 815 zcmV+~1JL}5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00N&$L_t(IPgRorOH*MK$ItWZ?p~kWZTIfZ z`XLY+wSLK<5Yi;g3`$t_Lz-wy9nPfbHcgzSR+jiOY~>59#J7yH7sKABO@BzSj3|&S z!A#qJaeqkXQ3!&=!#xk*&pqdS&jV49{_|D&dyDDUO=Tl!!HD;0iD7MX$Pyn=WBtlT zNLg+-er=UMHW;Ec5-ik9Q$AzFZ;aHKB3?F7q<`--P5aE#el=RRbFjo5@gzMefxZG5 zx&ZS{GAuR8(Hdp8F(q1O9j~-Zc$h1L`f~(tHYrOdlhx9glfJIdjXL2$5q!I4hP4j! zj8DdRQf|C*7Mkq0tZ2YYj8Q1ml4V1-1;{O+>k%Mq~ev=o9r zMxB9zrsEi4ZR=_#>^2vCGIDI7v=fk0~?>)(YrMTKo@02CY)w2nY zh_ZOM1}nD}MDG002ovPDHLkV1myvblU&` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/retrieverSide.png b/src/main/resources/assets/rpmachine/textures/blocks/retrieverSide.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9f73d0771c80ae02af23829bca4970d12fd67c GIT binary patch literal 795 zcmV+$1LXXPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00N6iL_t(IPd!rGP8v}ZJwm|&W)K<1S_%yJ zQZhD{isf2uy>L~~APR^QgK`lNFr+|C+Lu1~VA{7n^aHACLeltDlO}y>`deM2wkMM_ zv*+x!_F8)%^0A=$TvC1SFqg;7b({Y2mL7HJ>)ZXN$6VIwQH#OzwN4}LLq2?PQ@pD&qAZf|eD zxm^ykBXuCcXu~7HvFNW#pT@G+|1|mb2GARQWbfn z2+fUmI-N?TVs}3^+N{A~FcyoEy}iAIg9F~_U@iRV>FN3Tx!puw&Prbhk{Krfpx^Ja zyixD4MIw=OIxPbB_xG)WTWjH4t=8GunTC?+lu}M9#a^vehr^-C{X}Qwp&42TG!%

vRDhE!lC$0Z0) zPEL@`+04+hwY4Qy06@lRrL3lWbO;+7YK&Eg^Z>wKyWQsO7MEu>5{-hLWV6}z_4ViB zfNDyIxL&V|^#1_4Tn@fjvxzgCR#sLJ641j6^N@RFHOCW)TCJv*i;^ZO2`wWyf^RKv z&>0{5{r>w35Vx?f;Pd+yUoQgCXf#Tt66C@qC=p_C;cys(!=S_p@pv4aJv=%>%Lju& zuh)aoa=8o`0O%$f1*^!pmxO_1D4f~Gx}ND>f@yl%$}nz?M$0e;moP1O^mgak+8X4E zl0c7I2!MuT+!Tnx4k8G^MY>y1j(f4Rv_x>d5{U%l!pYreu+TT?1}i@B6Z`7wDzd#^ Z?_bJm%}RpN1DXH;002ovPDHLkV1j^MZ0G<0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/retrieverSideCharged.png b/src/main/resources/assets/rpmachine/textures/blocks/retrieverSideCharged.png new file mode 100644 index 0000000000000000000000000000000000000000..eed7d8e90a078b6d5ef9b9ac9a8f3f9319dfe18d GIT binary patch literal 811 zcmV+`1JwM9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00NsyL_t(IPd!pgPa0tq9ibq?3?c)zrN97+ zwFDEZVtEW|E6QU)9z~QlA}u&73=mREY3im67pCsI=ntq(6O+bOO`3Gm^l$ZywViyq zGk3mw&OPV5AMqit`dCqYYf~48)RjPfe??xl$*Y@q-J>pe^0G-`edbA&y-$x3IghLp zR-EOPpK8i4hve^*@n7%8uLtU@zWT?2`uSRYDNtVz$@8M}ET`;86@=I8b-UfsXmn?1 z=h@9;w@Cah`GQmKwBNy2C=?0=0?W(GEX!h-C=?3GWYWX>tg|zzR4SLtEzQX?QB`nd zj9nUSx7+o4ecJKJG-dPoeBp4ID3wapYL%I>(^jV2?Vg^VPMe7*^U_79WNwB4px^J) zjLBf13I>CTL_!3V%VnF>p|vv2W^*_kY7`QkQmR)<5gU!hU@$N{9_nliG(!sk4aH)S zVvHJ-;rRIYKR~OHVCD09u%H9Y7~}DHI-MqVcX#oUPtuA>y56XFI-T*+5tITmF)BgY zYPC?UpRz#D_V%{e0RWj^E2TBHmoH#LqZpybM0x;VPY?wCv~_l2J{SstoycS|TU%R? z{a)3i4mr>BBK$h)|AuvA(`e;CgW!2f1+acQkl# pZqOZz#qfcjh?|?6sCKzre*ntg&wf8^%DMmm002ovPDHLkV1i>|Z;Su{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/retrieverSideChargedOn.png b/src/main/resources/assets/rpmachine/textures/blocks/retrieverSideChargedOn.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ebaeb81ee9e84fa2d8b443fe9c84f268ed6c0d GIT binary patch literal 824 zcmV-81IPS{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00O8qF{7B`@m~_E(ie+K2csp*RNG zLCtwa`(;=AZJ+#mYWVZsaNW~ib@jh`)bF?Y%O>@GpZt{5o-5j}q#>M6C&Mt3Bqftc z@69rkcPu8&^Lv9Z5aM~>@AuO*&9W?_L^hj^Mxzdndu+4BVlhQgmW>*pSr>dnx*zCT ztyZ~QenPK4Tv>9tT)|+F$mjE=Qt6S+V&a%ir*n38HfI=E9UI0*9~5-ET_atV+>`Fg#6e0&UGz(-~&7?nz;*XzxA*$K%D&fr3TLoSya3AjfE&%wa~ z3ZC9{uo(L?GMNlejBa|2_e3I*csx#|QYm~i9$FV*%awAw-L^~)y388RtbqZy(P$Vs zW-=*(&(_vfzXJ+}oGU{?_wJiL$nd(fi4YlB)4j52Ag|eMj!WJb@lb&0flee6iEub< zi-pPMdHAZTiXL(|ZBS&r=p)nVG<2K%?6{j=Utfny03K5G3v*M}B|#Lc)#}3Rz#2Vl zT^uq`+(ihwNA1g|#d(LraoYjpIF4f+jOVon1+`kOSS*4rR00w%2IqFWF*ppW-$4)r z-0XHmZ62Qi_lm#Ih3W?Fph?2tz=6DxA zpO3)v5=9Yoq2&K)uyAkS9SVhD;3v+FjSXbm?e>3TNZqu?n*&1t0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00NOoL_t(IPc2eQPa07ap44DRmgMr(}+yYhfNxBL8 zswDkdm3}{G{(VsVeXqD3$)^MP?-BVkl;5<;k8|d8S$b8J4pKDb_xrtGZz`4A+uK{e zTRii~&C!l0^SIzC9*=KqYfqpDdwbg#4454Dot>RxvG`I=M|fGn$b^<; zold7#t681Td5bv^2qY2->hSRJ`1n|`+gOv(>-8p+iA^DSty#cE9s~>q16JU5HcKoP z%Vx8)fTN=$v&*S63C(76JRSoW@EHrirCzU(Mk9msnc6IXGq_OTP%f8=pjYy`%gajy z*zYp9)iW8TQVA%?zzX_ICX>tMsQvwYeC9PQtzm2RTDRMEFU|*eI?U6!z-+Zz@a8N= z@Y&tnon=6Pgj3D2%IfI}WUL3I`7{$-mA!G(kk@XvIjhOB?2g6bK&SHg{MOditB_x& zQNwOD8sZvLEhvgvxfo#zg#vW5MgwOwM59rd6yPC+JmnV6#-u2oot-%?l2y;bvgA!s|3B8U-J2U4;er%91eSZ-nF-D2)MYos8lMT3zdL`iN=LOAv6w+nq^2Plc?;; z=_yJ+91i>aK7>}QRfHh`)kL8n6+RD?&~P+`Gg?^33!TGd&}z+uIF(8jA$o^P>sr=X z?dfzH^k$R*k6bVi4aJxgkiiKc5WpbaFEGbkL?RIi<0XnB=t9YTYp_r^@CGU__=$6K fa}(YxD=Ys2Kuy!;)9X$=00000NkvXXu0mjfZOLgA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/solarPanelSide.png b/src/main/resources/assets/rpmachine/textures/blocks/solarPanelSide.png new file mode 100644 index 0000000000000000000000000000000000000000..d33d77c8c1c355e8b3a1e2af34e2513ff4953780 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3HhH=@hFJK&^|R(`H4r#6^HN7^N9&S+0M4u}T-%f)et7S}s0SGFR& zVrj6>W^3c!-gY%V#CZ;XsEzlEoR)h3`|o}Czt_fI|7^1&!?1%=-Y%P$zBJ^ri9*!tM2T0s z+GZ_V`MlCV*lT6(?T)s@8L5)*xD+=u70*-g6mjh_lt?&gKjo5m;aATOU3#6BK-V*P My85}Sb4q9e0R8lPaR2}S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/solarPanelTop.png b/src/main/resources/assets/rpmachine/textures/blocks/solarPanelTop.png new file mode 100644 index 0000000000000000000000000000000000000000..060d812d97a1396a78713ff13da49947961bf721 GIT binary patch literal 663 zcmV;I0%-k-P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0tiV&K~y+Tl~UhJ6j2yG-uun0H)FHAV%^Qf z?LSbIpa-LH-F{5JWs|ig7C|fKNhy}FLL377fvfcpEC_{A5D}vI5F`=(W1YF%Qm@U! z%$@I^@0@$icM(NVtyXI^8cC8go6R&$H~x9}%ObZ3AdFz}qfsro_=KAua*KjFjhe#6 zLuQ5x0pHUamlP%x&Jql^3YJQ)b)m9*YUH5o_CvfAydJP?A=&H1H$(1`Mx6=;Ti2MOg5VYxtSFoz7(8NtCm~wH?#oH{tL(mq*b=-Pu&W_9 zbNE!WKabh%LHmLSAsDnp4;t46G3f&&8aEZH1v~3K%n25}tE$2z!C({}1rqmSpOks? zUa-+;o>GC8ezTJ|?LoUr7{OUXM}fqGyIsD?Zb}Qja!uhfVSgHEKS0WG$mi@H`2_2I zhO(LFar<$&_<=|GtH6{P0>dF$*8?-T;VaanjacETLM3aU4*`RE7T^^Pkk6;IuF>)E z^{DxgH%w_$@GvvYq!h*#&UHO-()EI!CM7*k&}(uIQwpcESUC%gIKbloE2KYSKGRI8 z*zyWn1_wE82Y60;!m`0}+HCE?sL$$(;I>BO6(XO~tl$n!_Fzn5G`kx9^2LIC0hV)U x(*_j|n-xLojV*CYa9{9%VP==_|E_lw{RZI@vq9zNDd7MB002ovPDHLkV1n<#A(Q|B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sorterBack.png b/src/main/resources/assets/rpmachine/textures/blocks/sorterBack.png new file mode 100644 index 0000000000000000000000000000000000000000..c5675dc012f58f918e18ae5f32ef1b0546f78757 GIT binary patch literal 694 zcmV;n0!jUeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JgSL_t(IPd$>`bJAcC#WMrg4y0U?KnNt^ zgAj5-8WL`yg%&J>)p{8pwBuMEeQ+EfeDnVwe`!=^$!zlNIeX52EA{(M9v^CTt?%Wz z5PjPgzZA9GwK|<{U3iAkX}1j`1MGG;^ZD}L=;+J+`FT8_uhR5#H1h8|UB_`r>dS)= z11SCiINofoeLqx#q_#MW$CEIee3#GOmP%2S3# zYP>arDUt@fqlXFvU|>3(d7kgOqs1cS3juyGa0tt?rM;$ol;xdi1;H3f{9x|%@dsCq z;fSD>ZTBSptET=?E*~r#Zr=|ol}fQ#EEEbSC#SpJGwL3it*f>{hYUa$vfFY6VE}{> z)cpsn*Bd(E;*=A#%exrh9i(o*ROv*s0hVfd8iMa%fglzKfuQ!oIA!x1+? z5l;5|0|}F@ZC*1*5+uMbDW=fktscbOWiz?L@xMN!Jb_zT9hLORxHCz2y8g4(PN&=Y z#S4(=`B7^Cey3_&OAcs>G4yI{iX4P!}mgSk&qR8_?HgDV1;U(vpbpQiY5iSx*SQz#tkLPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J*bL_t(IPd!rmZ_;2CZ34IjI@qA^_A4KK zQ!HhS*8~(MLYZR^&3L%Y46|t#qwxp-|9HBpX&9C|T@gYp%SAT^GUV&;VR#q>A^6CLum0o` zn5e{=repNq@n`q^`j>qEB`lV%^92TS%cnQm)uTO(Y}*ANA_yA5G@EU(x^5LjQh%<^ z)>^dzNe14b2Ne(i1C7R!>w32BwA(#=K>%+UCV~*18FSo*Wk(vRR%@VyADG*H{(&pO z;0S?Mx?X1R@ABepHaj6YxIM3$%jMGPbSjnF+1VY9PEdEt3$G;^9by2wAd9j&2m^pp zin{-RF-kL;7r1M@!k+KH#PgLP-{Y3bWs0W20AN`T zCV(P18ILDOaI?blr#}CL1QNi`s9s2B>q>tb&obJ;@xMM!l7L&ecu+4NaNV(__oDbD zNVDO&`0)uy==oMS0QjoJVJr#29L{5|XrqN42J5BkmCu}@PM3s~AGINVmObJG6uGXC%^UI}c#-27cK`-Zwcde5Bv=^i lOA_&SuYSt1NMMf;{STbudeB#nD%b!3002ovPDHLkV1h$ZJBPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KElL_t(IPd!rGZqq;zwUm@ria^3neBE8I z?bu#Bb)1GIq)H;vQWA%f5^il;ghWw`gb<~?fVjL>LOk=p8$W>f5I&3J8WBybv3Jg8 zW=C=yuZVY5mA3jt&bh-Fe&yP8GLGcfOe_g`jk=G7 zO$miU4uA@>&vF$U0C3Jx_aCsiIfMc_In|8s)mjc9gcfo|55+M`S5~fI)_BFZ<9Hp< zZIhl|mnGZgs0IdrdOg4mpa`98ZS5fOyg=PQW3wY9m<`w^OQdwVbOw|BF0(^)T1nE7{=JV1+l@49M4<< v7(lIN4;GPNVX!YnPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00GlUL_t(IPi2yAZ=ygHg-Oe3x0}sovq@Ft z9Vvo{ltpEw8mVlzjk22l{~xo@l!h-&PRI;%&bepq9mR3H&#-OBG;PB$$74g&#-ou2 zhQkq%g8lwb*MF<3etP-?USCfyFGsd@{ah4flB7Wp+O~_uhXB&)^zVFrd zJjC&W#bS|V*%GjwOaiJ&K~)`^=5o2bHO={Oc)q`%dY%tlcd}k@%5p~?luNk;&#|9ANJ-r2V-AvP8dA?q)3h*It95>Hbc;G}fc*CJK7>rtInvVB;o`&HJ8f{Qa z(|UZ|5tj^DLh7k%Usb>Kdbj=l-Q56ngG|u+}{H8F5Lox6kyDXd|8$=Ao>WY1H9$3*lf0Zv6GSL)O0FaMyJy> zW1__CfPmTUb`^a`KpcgLzCXo)3UQoJjr)<9oPdH*IYo(pDJwh=9tjNWxe4F^w4)?s x6vb_2IJnCSXb8sGiO7PwIJIEgK|UG7{15GEbt@uNSswrZ002ovPDHLkV1l{p3HAU0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sorterSide.png b/src/main/resources/assets/rpmachine/textures/blocks/sorterSide.png new file mode 100644 index 0000000000000000000000000000000000000000..bdcbe83b633688e3a28371e0d12d81e0bb54b296 GIT binary patch literal 716 zcmV;-0yF)IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KNoL_t(IPi0bFkJ3OC9ao~VVCe_#Fs0ug zw3IC$QVJCcWntMUF}j=8^~LBCpZ3iMUyLt4_`f|}Onfl8ncSH<=bn4+46$wZ|FA6E zFf3g++HGA`+l;A*R*NA@LQ!nC+snmbHJi;5NixNX?P|3~((ez0plewUO8h0@NYiw~ zFtMWEU@!tMO|woXR1_-9iYQ75#@e_o2{`KL!aUZtGplEds00y2tEI+{v|qZLspT1> zAV|0(Xjhi$>xJ{}Q~K*Z-{&@TfcE`>Quclq{QSE3eP6sOJV}yEf^9phs!c+g5859u z!YpPm>Uo`)qJ(7JrB_98nc35bQQE>72wI1gYUM;atu$+u+LIGqH+Qmf;CK|m7U$g4 z$ImK{KmfQTgkgk@q8x+5>km=N1krJPY>&R1P5EKgCV>h{)`m;o?}uUUmT3pBv1=-t zW&}Z`B*k~#g&@Z2I9^GB#f>O^sXxzq*%8$3Msrzq92W^r`12d^rFhy{-|&V{#QJEt$xqQ4XoMwfa?42Ktte34yp4 zMLn7nXa-$BF(@hpW03X~J zbv<+f&aowDd?Gw0 yIey@k1kPi!CY{FM>_0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KTqL_t(IPi0bDZxTTm9V_t$-DR({v-cb9 zvbazL77(yBP_U9}s;M+eQ`7ij8z1^mqsA8>d{Y0jXN!psCMTPj*>k@0oo|MCUhqF$ z*RyTcvTVb!blqS~2Q-ZVxnMGx&Ss0zXt&=V0-a6|Uu<`G_poR*cA}`}x;{$$72wD; zE!%eRMZIRT1zwg7s?}IksiLT&C;^Na_?ruGRJDX*YR>v@-4js>CV-~tsV^;`1k;`y z+M*yx_(jmJqR?j}|LQdRelcE-J@|lKsYH~r<9YP${piQVH}iua_`NHH?9vbws&e*peO;enon0e0e zb6GV_JBku_xxTgn7-FoxALar?oQl%B()QE#bVI7ulA)sbet-o|=-C(Oz2zE3>BBB* zD++SUZ?B)nt%J@qogJ#G8ipZb42xFl5lpTs%~vl!ViIntgq9qv%=rpdFN&ojSpj=R zNSDCeOp-ckqZxGdn(6;CK)_x8avT@006efgLSWLSl)wCqc*uZZfIuRSKP#4SBgXzQ z5CkDQfo9W^&6mNG*PpD#Nt*6pPz29ouPh)m)JOvNPA7|^7{Qt<%{bn+JzU84ho5*v zxJt5lz%gHj32S8N5K2@65<$FaIER*YL9i_Q58DfKEcm}Gp8x;=07*qoM6N<$g8vIV A^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sorterSideChargedOn.png b/src/main/resources/assets/rpmachine/textures/blocks/sorterSideChargedOn.png new file mode 100644 index 0000000000000000000000000000000000000000..6d3b395d88ac327b41e4c2a60a262b8a32570eab GIT binary patch literal 721 zcmV;?0xtcDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KctL_t(IPi0bFZxTTiol>nD(;8TIK6dtd zm)!*l6r{A+MV3InBz-A1nnE>AYShxk_)w#XFFyEWeK4BX7k{gsEk2l-oJ{V_oOACz zcZN8Q_djggF-_YrOeqablR{_!=K@FtNzxw-w&S?FzPCH?RI+zs@0V+EZVk< z6n_Oc(sjc$Ev(2_tJT44wc0@tQOZ=6=5h)kgv4zsz|oBixx0{Ax;>8-nNS4aT*G$p zR_4ylxrO<;Y*xV)LA$ET?gwmV%^eNGcA29N*o8vKn24*|cv#-=hqZ_+ikb=>$JI3b zQS81wYJEEG3_A{t`hM`nD)i3K zm_VYy%J!S~gPJT_3Irghf+#9sL+K0*UauI3#&rwW&V1+d>h-KGf+|Q!kKS9mhf!2M zvyq!))paurOZIT`&0mHXV|86W6~N*v-Ta~C50lZ1R4kTGr0%*N0-UhtAI@yo8BUOt zEw7S9lklA%UmQ0&|;Vu6A^ z^8oNXADuumYpKlzc=^dYWBX~PvVuVoe2*7G!Zg%yg6hp?D-0tT+tuVti9hDxK^9+s z!6(8~lGz7-$OVdsY6~4giA+FG>emgY;FVPn48!~basqq`Av$gO00000NkvXXu0mjf D%mq0I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sorterSideOn.png b/src/main/resources/assets/rpmachine/textures/blocks/sorterSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..293304690c3a050067d977309799bbb51663feba GIT binary patch literal 716 zcmV;-0yF)IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KNoL_t(IPi0ceZqq;%ou*I-N&Sq+kN6$G zVmGhGb?U}xoF)o|2mztc1wzn>Rd+1dAT})cZ;l%z7D!j4J2U6pbI+Y2j??)+Y}+wS z+c3;_+t9SOs%i*DQ4tlPESIa*^P-rapHC5KI>CzVe7-=^?+?SUYuheL{3YN>*A3IO zu%g~zFaj>i@*s#Pl_iM^f{0MnHf}2djvm!W2MJENs~hme-h^G;aHdbjk_6w( ze0$}_mnV60xu%qQo~NoRlF{fCB6n6aE8budcC(3=EM($n2C3JL=G&G8^erK01mb!e zCvsY%8FckQ)&6;4yk32?vn(6G063r>LLf4hBC800000#LT=By}Z;C1rt33 zJwr2>%=KS^ihg>!IEGmGPo1=z>yU$h>vHd@TA_Bv3#KY?EE8}P>Csn8di-0^rI(*& zYllYN6!);EHH@5hl8lPqy?c{#q|j(*%)L_YtE-;>{`;{)ux)un&7>tP3~V}Ga^JF6 z2PWHQE;_qq>)fqVJ5B~L1;_=Kl*s&>`ibLuVMCa=h{T2qO4GBpx+F4)&2wEJr7Lk| z;pwJkStTDYdoxo(T|3=O5s?9H>5WlFFeG`2dXx}jfjPWdApHrH+r z$EHMaxw`0}>37!Oe*b6r(wiy&te4(SU3-z^@b8N&kI(vbd}&^VW9fdP6c`8$p00i_>zopr0ABr^2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sortronFront.png b/src/main/resources/assets/rpmachine/textures/blocks/sortronFront.png new file mode 100644 index 0000000000000000000000000000000000000000..baadd4da4d39c093ab182f231cbf722a69659e42 GIT binary patch literal 860 zcmV-i1Ec(jP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00PWOL_t(IPaTrWPa07a#_vW+p*Bs^jo_o| zjIl!L##gHmrCZaTsVkE%)YO>xt}#qTKm>}YWxxb13W_L7QJ%wNKn77%7zIh&zo$o% zySwL{?{~iQq1oAag@RmL(@~V!V%gr=vAbMuulM)KiPz!SH=8Y6TPCgc$LgwfadByU z{2L+&(&IU~xM1(^OQljd8cmeTe;yzI6^mt#D~7}2o0~!|mk$ObdwY)Q={cm+=~JoH z!$XndN(_@Km;a88j3|{Vl2ne3josaGfj~HyyS={71p+~Zf9;FE6iI_EM|WBeQuspTAEeQYI6X&vW5$w4tFvES9#n zziVuKbA0S&m^4tFot?967WP4~B@|VVilI=Xt?g}neLarj7>0>NA`HWwPFF0JOeWJu zN2gB>PUk_Pzzq+70TP(q+}zCP@!-`61T}nqZEY>+0Ndc89D0Bm9Ui)Y1T5?B{($3c zb#-+w1Ok3l)hizFSv9Yv1(Qf5GTGqDiYlGX*lc#RyX(wmZ)axadU`%$SSvKZc&L6| z&3j(WYieo|i^T&2a%O@lua8`WlipRki z3j%XI9v{eo8wUq&9B&m0g|I6;s0Ji(#qW;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KivL_t(IPhFDPZrV@~hR+M+D(YpWR_a|Z zij=46UZPe-6@s)N3Yf4HFo6KJ0kdOl_7X&JFbRv|KOj{oN5ABA=6o~$XKZ3J zS>0}5Boa@j3mliB=_^TULdBw#&kGEb3Iym_jPv<|Rx72~pAitHlGN)dh#qN9j$Xdv z`GTTMpj0Zij|77e0Kh__2;upBE+^FM9g1?1=P$_9XHKWD)9FJNi+vw48h?~Z)p(rc zIG!Ny{M_sJhoey@6pCJ4gp0vXigsK^y8bkBF=9`F5>KVZwaOWC)?VS7Or(V zo#kNRh~Ru6&X92F08B=s8GLUh&CR5NJ3zsMg(HHqfvCzAcAucCOLVyzH`e2A!twF( zlY@mLf>XIN?F&qpLiMesEaL%2kT2NqDyOZh{M?x=}ptDqPDWHEvhKr7p6OUbW`exjPvI=mQ9mbj5Qlh{f@KLl`9EFotQT!$X-%R*a6>A zoTfkPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00I|DL_t(IPfe2HYuZ2<#*bRT}s2IKJr zyGyUKOB-9B*PTp$BAU%M-zk?X0DxImg?L`4-R|Gs4h`dktS5=Gc6?kM4!Ao{r(LS+ja^C3ocBvl+T}BU*D0@ z=+UEJ3T}skx*S}SgYP3W9-=Xc?o5}6 zod{JVV1Nm{LW2>CM7LxlD5IMpP1BePXsEmnBLOxV{UEpvWa7)!OeVvi7=!RtRaIDD zrtiWuE8`SGzyOn{r(e7PbRvf7SlSN$uol2#|P1XeTtlQg&PZ8MA zS6AQu6>NtgmP{rwv6xt)Z)EsE4wL8)3^2i?vUgCXH#mI(OfvKH-#q*s8jTiloCcl{ z3kaYozVpCrzUXWR05JSPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00JdRL_t(IPfd~0Y8pWlhKCrz-4T+kt61tv zyXuO2ky1j*MG5VD^r{!77YU7Ra-m45M2SX>imTNox|_u{HVtZ}DPDw9CpvleCI#^nIU_7scbe^F4tPE?(Sgp+PrX_ON41UosONd`fr-2)oLS`E2L7H zot-2(KCW1nGnq`cd!Na#-{kIR$#kaE?}+55FMMbBLl*$BVzErx?atYmJs1pMmFqYo z&gfmCJRE*SyewAu&Wpo>W%X+{qtR#+)Eyig=JTbKlX|jcrYlCXdD`vTw%teawry?K zKf*;en@^|T_j;FPJid0Vcu3IgmMM=V)x#54SmepFDlD%FzyOo0s|glVlf0XLuP%EZ z$lm7x8urnUM7L&3#8!YR5-`97UZKGVMWT;nBq*cnK26h@3TUW2_9Fo{9)Baa4P@f| zwL~Jppb&%bRaI4ZxI&-#>4uC`2mu33Zf@>)0q961f@9Vp>=W;;GFKsq3jvrH+}{2` z#w`6+f**#$+pHBA5;i1vkV2hVT2efVi9y8Uab4HZfi2MuLg==z#D~Ti3r!Yv33MzL z6W3W2(DQCj11?2iL!X~t{43b>Lo6DNVq!6}N}tH^gB&K&9~fYQM`iDz%x-Y@0+?j( z=f8RQI~YcbRI3J_5DN&PDZY!qY_8yZ2LQ06qY}wvviPAC?M9<(jD^5$Ab5^V9035f bzn}gCuj1ZhI$&yV00000NkvXXu0mjfAM-AT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sortronSideCharged.png b/src/main/resources/assets/rpmachine/textures/blocks/sortronSideCharged.png new file mode 100644 index 0000000000000000000000000000000000000000..00306ca740d4725ed2951e022ff1c67a38860407 GIT binary patch literal 722 zcmV;@0xkWCP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KfuL_t(IPhF7-ZrV@~hTk1f?-8k|Y156U zQBZ?`6x2dY2wTDuRvUuZY>aKz0wp+@gvD&7H0mjOf*zqiAXO+&zhu9eZ^r+OiPdU% zyM2*JB9keatL+o6B1v_Ksn{TY{*vkM zFej<%7_!v9?;_^gA^>2)V1%%2A)gnj)z)!@Mvh4B&w)s*)r0iG*e-JD4e-32NHD1s zOHg-l;r08&(I{=naE=(0PUnh6K@eoToU!~VorMdx+wX8(iejB~I*P-3686}NDSsj5 z&ojOp?ad`250}2mCOm8$a{HWSt5FY_G@D(}qb~QPHGWMR>q-6RsJSI#$LjK- zvKUkrs-!en4`l*O;1#`}v?l0d{hNb>m(O(c{`E{1XZK<%;_7tn3AOv0V^K!Lr3D}vL$s3~P;SD95tBE3vd!=NE+I#^+V}skBRF;qO;z6Dd zq*)(=?=qb1=+PYt&NoAsN|kKVv!S;eoU8I&m0%iEYKrim9(DOd@EkC~PrY)Tso!$T zfxJL(b=O3w)F6hZ;7<)>nDcEka(Q2nU4HU%Wdp34MknpH#W%JP;}S{-%uh% zfi@Z5USEd^MY-`nDL&V3D;NvHHlW=*f=B@XX0ti|0T@KFp@#5sNdN!<07*qoM6N<$ Ef~*NhA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/sortronSideChargedOn.png b/src/main/resources/assets/rpmachine/textures/blocks/sortronSideChargedOn.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf1fa14910b71a35bc2a19f91bf6bcc4d0058ec GIT binary patch literal 724 zcmV;_0xSKAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KlwL_t(IPhF7-ZrV@~hTk1f?-8k|Y156U zQBZ?`6qG_t2wTDuRvUuZY>aKz0wp+@gvD&7H0mjOf*zqiAVpE0e#w3_-;Dnm6RXwk zcKafcL?%--SKCKiMUv_e$4P~PVCQ91Iv0q5Ug~z$W3fU0{v*>r zVNO!jF=VOz*hS1YMF7Bp!3bg5LOw54tF6NbjU18MUjva=s|V?Wv0Y@}8{m04kzi6O zmZ0wZ-0Sy;qfy$D;T$n0oz4}Df*{CvIbr!@Itv$Wx8LEo5XCy_bQFj6DD1HnQ~pBA zpJ#kI+M7#49xi>EO?cQiOXV1l1|={ixr z=avI`f!^w_x2U0gPnc}!;Vs`1Y1g+e43i=8IAb#%_??!U*hLzOy0C9-kh!MluoJ$a zM2G@yGQ7XK3KNQQPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00KoxL_t(IPhFDPZrV@~hR+M+3iYy5EA_4y zMat83FHx(aDuSdS3Yf4HFo6KJ0kdOl_7X&JFbRv|KOjX>j(*AK%=u>g&)CFd zvbx>ANF<(47dS3M)0dLego;HepBES=6$sF=80Yf^tyb#z_=JEcm84!zLG(a-c<}lS z&lePB0;N*9eIyu+000&WMF`L5b2*`2?@*MBynIETzi>KzolYOJSnT_V(fG4es>b6i z$MFPtXJ=l&KOBuRp-}YvJe*8s3k5+Cs@TwU%17*<7O7B;BrTGkp(x%mvP$ z=lnU=mu0-!1mr0u1DUvok3nvq!)Q9z0VeHs5A?WKyjNTQrmfAi`FGr0j~eSy{m)%} zbz55wYfD9vTfB!d04DH?+V^T3^f%oHt@iMVjy}JeE8_e{)_l95^aI&pEY2jL< z(L8&!a71uE5NAlZZ~!Kw(G0#fljdg9z@5cn2|ijlA~+j}s$60B397n8mz!~8J>Dkh z^?E=L3r7T}a%I{Vm@tLvTT5BS0~%d^{qi2yPo(?wb}9>#emOx?+c%(TOmH`o+Ul;l zysa*V(tH5HcLh%N^!OSH_HEPUaxIhaZ0X$u7fN-ZNHC2qRatnT$GuWKWCu*}Q3K9X z<#%>9tS(Vo+1D0Tlj%rGNi4>i4M%>*N$S#-grZK&8xv$NC?@QH zZzxVvpbh$u_;CnDx$!_MUUzjRqb&&2fcAR?aRmUF*=+j{7ptdTKoznr00000NkvXX Hu0mjfucJMl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/thermopileFront.png b/src/main/resources/assets/rpmachine/textures/blocks/thermopileFront.png new file mode 100644 index 0000000000000000000000000000000000000000..ae96bd2f2c689eb5fd83a9869e7d5d0f7f119885 GIT binary patch literal 735 zcmV<50wDc~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0#HdrK~y+TWs>V_(@+@314T+_w>G_)HJNFf zG)?bq(o52IZP%`=b)`7GZipAO3}JSnGU|je=D;cYu%TPMv5A5R;#a@v7w6jjSw10J zMdAJMocBDxocEkO1Wk{LVlWbk34*8>#|e6Qy&TKB-EObP1L2`*hN5UfRde-vqf(hF zl`7fncq}HVYCe@xP|;{2k&qQ7E6XYL!{Hdm@x<`3g)769~af4BKzrHTja zbgrQMl79k!qTibI_f&uYIJYQ z@Myr-N9txPhVDX>3j{)V)^fS3C^$BL`pL~G zfZ2j8naotHHDYy*Xw3(M5&Un7x7zJa0M8dBm^EPUPV!cRgE*a}FcJ?&A>ofDM<%=orTD54hbNB6z}j%w#g@9;4BSv@$-QD2kzQ zI2sIw5lo)<>*ePx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0sl!vK~y+Tb&}s}(@-461AQo+9WL!k)?}t_ zYzZ}MXzp5jQ>C?C9b=_0B7zKj&^;(Rg^7#}hCc?IT5y}&q9RiiL=azm@Ig>ex3=@Y z^4xuAkcsep_~d-g$ql(jQq^J8%#MuMnT$ze7#W&W%Fy*hB9Tfa0ZCQW6h)OdFHcM~ z>-DqMYTb2D+qT2`sY0QI$>s9-JS&x4#tP6a%QlSTQh)!^sj*`%uJrYV34G;W2m}IB zET(uf?9PRZEJq3AaqSS0XL-6H%d({F`p$~`Vz!KR?|EzOW(7)jb9{TQW*F(ct@E!J zYEU|xRq}|yUVHNG{24&+Y3u#{1_j^~foGRKEH#DaPf`TBD~&hv;sF6tdt0q{iw*q1 zu6OR`Tv<_+j(71D1@N%DI=MD;63|^A$GO6{|4Bnb@!iK2ZA1HK>DwvF}efl2AJBDipxaN0q+%TMwJR1mSkuHksK}tb o=rEd$KBLus!=d{FgQ^by2JDl;!^c{L3;+NC07*qoM6N<$g0>|icmMzZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/thermopileTop.png b/src/main/resources/assets/rpmachine/textures/blocks/thermopileTop.png new file mode 100644 index 0000000000000000000000000000000000000000..f799963d2ec26eede4a2ab713c54700e3369ae73 GIT binary patch literal 492 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0bNN%K~y+TWs(VM!!QsjKISSU=z|bEm#G4UiAIwUHAKjc8j8_s<+*44@q4e4h`TM0&7#$ z-ZD+|C`v$*SXR=!fYBj4LEH992aE)jXp|J!>mmWBXqP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00IL^L_t(IPnA+hYa(G3l%!iT83&gUTtK7P zOt;ukY2(rwm^dh2-0+~d9Rv|KP@{+&u85+73gYjbYR$!C-l6%HSM{o@Katn#bzRHp zbUGXkyWReJEsCQ2e*f(jTbicbZa2qq0-(`oWV6{~u^0}A)9Li*wIY!SPD-T`zBmkp zLa9_r09Y)RWHQ-oHgQp_)wbI$&-3wkJQj-u0)fS1F`Z5;l?oaXi3B8wFb=D7xjYyQ zE|*KE)3Mp?E|-Vn-dNUFtyaO(?RMAeHP&DkBtgJ%IK=7kcq|kO27|$5qKrn<%ZssI zub7_k2EwBv1 zTuhfrrB5UY%uka1C6NFRolwg#%w4Q-3}+~4fGV9%r_pHO9;T6Iuh&CFcd@QkD|911 zoL*hBkOyvT+wJz@Z~)*gRy+aR-3r=x-VdWtayp%MyB)YjqtRWgpxN*Do6QDa1aQj@ tiZL0jv)K&vU$FxBy~hW@H=Z}g{Rfhy(5N_aXn_C#002ovPDHLkV1n#f7gYcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/transposerSide.png b/src/main/resources/assets/rpmachine/textures/blocks/transposerSide.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb03af7fec41dfbc0eb32e741a34f5ee1bb25d7 GIT binary patch literal 682 zcmV;b0#*HqP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J6GL_t(IPnA+zZxTTm#Vr)ELRw8z3>8#} zgqsV?a#?5t2+LwX1EgFV!zG|$A&Bw-QjriafrKCi```or)w8=i^tC6GFZ0cO=ewL4 zncwgCh;X~zPN$P3NrwoN$rKC*rCYdWv)SwQQWPZ+I-O3rT&~q>9LE(3g>NEKsT58c zjRq_ZS(eS`^8&$Qv1GH^;c%GCsM&00GMV{&KAB7^l?npV=`>o9p&W|X zY&M#vQ2|Hca5xkS+3j{TiF8)0)#Y+UA`t|@6)YacRT6yZrwdZr1`gG;u^X}S*H`fU}$Gjv>rwB6|jWXzn;f@r9 zR;_rZIehX+ex_EO9?8#-l~|H{qLQoRL?V$01Ofs9gB~6{07tDPBzvqn&^#m_D}_C* zNldeo6Tl6n@R3? zJT8?=?RJ~z`Btm7mlf~2SS)be@Aq*ng-)kaSh#rX^?D6Luh-kliqpI3cDo3zR;$Hg z5!Iwz08;N|#cx6G?RL9btzeN%qV0CO<#LHosT#rrS;4#C=L6v$->WF9{>OV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/transposerSideOn.png b/src/main/resources/assets/rpmachine/textures/blocks/transposerSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccb0da11098de276e372a8b6f4f9d6c074b1327 GIT binary patch literal 683 zcmV;c0#yBpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00J9HL_t(IPnA+xZxT@$9fm1OEwxQ!tR@XD zU?>a~7?9mC$TA~f1sc}Gum}$a=&}O^DXCI z!sGG05#ew+Y&M(KYP}I*Fc|!PzjO=NXf(Q9E{0(QLZ{Oyl}goWmE*X4KL1rjGMU6l zy%H=WwQmGVLAW#lP zXqt99ov45#mSuy%pv7WAlSpSao9%XcC=@~fT%jee*DIG1>I3pfDJ(T5gViX>CknxZ zRZ%jEBx11`1|yIg92G^LsN|=I)RBUOeR-_7I8mN!4zSJ+sbiH~O_8W05HJU(p|8$( zx9%=ttiHZ10xu)T3SKxIjzl8xp$Ya71i}YIpmnqj0Ws=cRtP*844^%LMmL+yY&MhJ z@pxP;7TfK1tJP{Yn|oRDu8YM2*ZqDU*HY+oI)#Oc$6l}3AoO~@y{tI>AKh*jp_NLd zP$;09lnX%Wy{z~x$i3ZeSF05)l1a4PZns=65h_(fm>?^7kNbQeJmPyZ%s-am)z1t3 RJ|qAD002ovPDHLkV1mS*CZqrW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/tubeFace.png b/src/main/resources/assets/rpmachine/textures/blocks/tubeFace.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff08e0760ee73777c2d3d1513d26ea8d0a9939c GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3HhH=@hFJI~pV+p3IY)D6_SgR>k2POtxa_;>|NAc;f9nkbAN+s3(k4Ob z$o?BjzvWfh*NC+k@-S%HTvPaMe}3xw`rri@{+|nY_@C3vCc$um%%&)TV+IT<(jLZ} zBsiLntlNH4(2U_p&V;ikk`!XzYJ1FKR1j~N)2qXFNWpLs(40fhTCM6GA01*4>rmiT zh<3c!$f^{$ks*l1h(&Cwe|o{8#X>0@U_%>1Y@YD`IM2YaomGcB-019Tpz9etUHx3v IIVCg!0F733B>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/tubeFaceColor.png b/src/main/resources/assets/rpmachine/textures/blocks/tubeFaceColor.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0e78c86e885eb22c2a7e86028c08517e26764c GIT binary patch literal 510 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0dGk}K~y+TWs+_Yu^)!s57e3gSEX z03srS;4}CFqGC`uLF5p@LTtpBNEfiMu@ak8Jdkh*DO08#@0(-7tQ+{Vn}28j`DZ5K zXe*EKc{NmsNXNBp+wndY=xdTohw05~xIXCXCF9t`P4CvCSda+(-1fr7-bx|>_x-RL z#ezg&_BaTqJIkSI8odbWx>oLEydK2@tqa>^=JN0JKv%xuIe)**!dsq&my=9Ia6&np z>1%x052O8FINo0B9AKHc0ed(^h&kU~oT-4>1lYD7lw~;|gh*9YQWS;2;l!85q@o@` zx+#d`#WE6OJV*qrq0#LT=By}Z;C1rt33 zJwr2>%=KS^iY|J(IEGmG&z*Rh_lN?I%jHO}TS}M2WtTMCUSOE+AyfS2nWCD}{HdF& zD-QO&?QA@HX4>^#ycK_K&Z|Awl<&G9&F#B+$8rgQFKYJE4dy2;r@MJ*-mUUaX864? z-Y)HUVMNbGCl22?*@*@VF8Dt>xZ?Ud!^VxFEu0G+ubz?btuba)64qGeV5t49>uAD( zc#+LXN{erPd}qJ0=(ZKpVy|#v%k_r~I>U>0tXSn=+}t>iS7K*h?6>}Tff*qev>B@7 tzh70#LT=By}Z;C1rt33 zJ+nVO$@hV3E_%8+hFJI~pV+qE{h+&=#=re`k?-tx{rGCO^S}74r-nxk9@+Zqf5D#p z&M)hG_n)XwF%-z-75rJh(O1q{=5RysT(1AmRg$C_gskly8#$O?iT?BNIAoGgs&=74 zv#W)d;iu?qaR;_JZ rsmlb3Ks|=k$ec!2p~F1Q|9KeZT{bG;&%ZeX=s5;YS3j3^P6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0aHmtK~y+Tjg!A>!!QuWujym7I8Og8DWzN2 zJWwCP&_ZZC1(GpSr|cd)*5FPtCaH%8kH(Af=FQvnKG`xh${@oT@p1RlcPEKn7Tzd+ zRx>)S9ZJ)blO$o^_c_mVJ}n(OzD&rh3tAHp<9egLVJ_k<;7T42UZB>BqF`4vD+hS8fMD{lj{X6FX3l`= YA1cNWPU$|`v;Y7A07*qoM6N<$g8z-czyJUM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/blocks/turbineFront.png b/src/main/resources/assets/rpmachine/textures/blocks/turbineFront.png new file mode 100644 index 0000000000000000000000000000000000000000..baab32fbbcba9cd11dec31308fa04c8c1777ffbe GIT binary patch literal 777 zcmV+k1NQuhP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00MbQL_t(IPd$?9Z`wc*#r-)U!5k?xRir9W zxonILzP+~B2a69dU>j@*ByAEUY5MmULYx@9#(w$Myt;1C%}b!!t^?)olx*QYNRLI< z=${NE$MYj0xdT$5c2&KgD?qhzS#Q_sEqeVc@^WOYQ~|S;i)6)y4%F(&xy_khN4q zJfsv)2zUPcFtryN7yuAe{zq!j0JMbcY%ev&=8)1n(a8|m+Os|8P4=W{(;)q<4dkzj z=;%R+HnjVWWp~ugBlrF*kn!tE;GyDPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00O*8L_t(IPbHFTZ_;oS#`_J-Ha6Uag;7dd zT1pGO&_YWKrSt;jQVL~UmJNhuWYKwvlWZ?^Gt)TDOf*J);Tu1we`4~>ljoeAljpoR zP?E(sm61#?Z}EyFs;;a!IoaV07ANR5TcWZW#cC8?AP63T=?IjO(^g>g=3a2x=}a2K z^SVE)db3L7M5~V#XDHi!Nv;W!$#PmM!N(x6!kb-ve%X5WeenKgaP`o={^~#c4L<$x zUw)`x-n*|qHZE>$f2Im1O-U#u+qwGKY)_nE;T=Es=1Xt-!oB&?zWU;wysC{atlpwj z@+H+1MT;eKD5O}T-8a0c8_d0DH{SI_cX{8r|I@wu?JqyKFK*rW(yjz@$t&b*EFqv! zzAD&#y*aizGuNBc`e*Lo+`0SJdHb#H&yB{hZUjZ6tAGW`VaYtcS};0lZDh1hYK>#F zIkDS@IYuQRuEZGaVsm8LL&F*A_NZ(RO4a^qbftk> z>B{DzX84NI5?Cz_aa!8y>F$v+UId2=Z?N!#(`Ini>YX0xf$5r6I6t3KGhU z)z`bzW_V{a65EA|gIF?(rW3%RX#^o-2pNxI2RMh6+xd)~g2Xbbd4*us+IYMcj%;r2 zg~E|gcrOIZe?W6Ryhd;dy)9E>5@KXZsq_A{xerGW0*3K}70D<<#DM{w7#4-G7@k2S zo2T;xlu;;fTzB3830sj+XlEU;vAq`BUI%RMZh(-r@FSFli*+$AVNhC17HUGVCB@TG zK!S$jR1{9`!>K5qjVH4R%D^~{lv`@f$db7Pl;jeOLUI+FuQEV6jRGaB)42)*9yV|0 zik7Ika^4WK#S|EZqC^DE#7GfMNjM=Sa26qW4ChfYgOUP9OJr82!AGZf45ML~i2MT! W^TMG`vRM)U0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^MlX|MGF00OH?L_t(IPZd(xZqq;%^$)NJUa3F?5~p?& zJGDLWGUI)`JBgRXZqlHpkRYlG$|6by4{QQNK}7-~;DHxDl*!B0z0x`NoV!rl0xcT6 z;)`k^p-47Th@t_EBrOnu!wFV*$LtDbm(v(Vy4~Qms6Olk6`rp1>V8oi4ChBlx$^Rr zJ6xK{0!4Ee)(VV);tQhLX-YRK*_Hf>vpyNW`7wL{t9p4pdG)P4|5ttfTR#1moSdc4 zKMjxHh2_csKG#)R6buK+!p{z(>M-AboUc#wyHC=$KeLx#^X0R6aU4t!Evr027=k6 zM6(x6o%9Y)<~W#{;mpPr!n->0ZI`M`@(OM8Tth=37##}Od{8^_+)Wq$_}(yC#v4v; z`7j7e$UoEG~2N1Wesvwp#t0 z#CJz&GoaZPZZi_ymRfAT#R8gB*d54`kM2k`%{3a#)_;Ua)E!{*!4?1j002ovPDHLk FV1mW^Z_fY# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/assembler.png b/src/main/resources/assets/rpmachine/textures/gui/assembler.png new file mode 100644 index 0000000000000000000000000000000000000000..17a727d1549fa62ea35d4d3fcaf3a1234dbd0c48 GIT binary patch literal 1981 zcmbtUdr;F?7QP7xDX)|TMTH;=DlRM5l$JF-1qB0vD0X>j%C3OCvAh(JB)9`DbpXkN z6fhALhzJC_fXEwZf9+oqYQe6}m zm+l@Dx?j8=*p#=YR&cQPkZFN|bwJE?M>io<=#bR=Kp$~jisU_K6f2OX>Nel)i{^LS z`gZ0)&p~!}yt;a6c1P*VQzOseYL_XS@${3O*glgbYW@IsCg5RPLUIsIY%R8uY)!e) zOySfAgU#RYhsz?8IfRzPI$;FgB&pzEZKi!BOu(wwpI`7lvBY3r#j_MLF?V^6iKV#a znMbTovskRT4Y>qmbvFq|#IXAMaA|32G_@3UJ@fE}sjW>#%*NUhT~tV=x?RvM`-+x) zC8|HqrG!#w85J+}7WpJ~2?P~hdrQ7Nbt->|j=vfj$}hXlNKH*We*7mtp_A^}?2?j_ zJ{IdRHWTvEk|bjgGGe9PtN9yuxUEdfJo$YK+nyJlFLI57x2SqPHc?%S-b@uxy=A2+ zO!!;fX5@?` zavm?3ajD@DDC#S<`=P%{M{K+G)_HsT9XBg#*sj7(&e@Z5SXlsXS9vlL3T@HWTBNP5 z?3bWt*M~rulFmko z_U8mHtApUTxmARoZn2Xmk+_W%b7!i|e-VfWj$jGpt#_g9GjDSB06TR0S=9+9lUe3j zju$oO-P>H5po@~S@vz=6<-0(|mB>i*+qZAyIrZy)DM&+W?*`8N^uyht+UY2%emm6* zLyP2H_Jq_bswSf1B|p4NF zEjGA^fAXY*B9Vk$z4l{b2+6pIL}}iV*GqzzP7^jomkg~pzHVLNy>vMr zi$0*#5hIn!xT*<1Sgtd;%zE2_`>l=Hq|vOo&IYB+5>hRkyk~zhiJ9@2fUSX^47thl zhHJEf$+#hdSnYW8#-F&lxRh>}MU=!-W`!GvdfrWub6o;CHLzVEr+Z~#EM{%-t=^=i zXo1<@ZtvveG`g8A;j~p%)yN*Al!~r8_#a)<1(*OzRQ%!UmlNdjqpf0?eV$NDIygaw zlWEbj-PxL6D=ij=a5Cfm>oLY3Jn|)M$U!7!T9jW zopPk7r$0SV>{%Wd9v<$;AE)(C81`0Cii3&ye~(a7MWqaf(EHuvlnd_N!%=WS$J1^hAqGf@+v%>sgC`nuAXI&wC0AE2mLYdvWsb$Fe`Y2#khGTD8SoW#Wr7{ zb1)eADHVYD<1F6CX9P502vDRtk0^GZU#O1pjaR;f9@OqO|1I0!<*`GD{Xj?pW^rxp z#w3!>8msiWdY!L88vFn;g5QQo-17r3M7Ws|!;cCo!(~ z{I}GLSPy7)nG9GE*xKi)=wY8p?cnHWG#35E7b7<{Yjn)Wzv!^FP*KAn^_iLWnXr#A zKjaJn9HDpK=^cL7F#-dq_Q#S@s1(AWT9I72*0D=J?p5U@<2zUWC)V#|+VgW-wXEoY z&PJxjsFYtz+_bXl&4mNwy+4W;O*4{ky&+0-h2Oqk=Ch$|6}F! Yj8XZXZo*lUx*ZhkS@$yx2mf3D0q(Fzu>b%7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/assembler2.png b/src/main/resources/assets/rpmachine/textures/gui/assembler2.png new file mode 100644 index 0000000000000000000000000000000000000000..608a18f7bd15f63fec2371bbe0b7e1406dd43ba1 GIT binary patch literal 2200 zcmbtVX;f3!7CwX_XaNVrWtEt;LB*nrf|enSB7#v73rK(xL?2Tj7$IOVLI}?)uZTht zi6RiF3}G@+QIH}-Yh^G{zb0Dw03u%jCQD$rB~Xlg*lH?lBjWkqsxb^zQK{b6XKaptJABT%k9In^8{ zur~<+o!?hp6+OcvG{^~$!nz!Scd4qcN5J!93OWJM+=6vH;1Tm?wA=MxH>3#o z#5m#6hTNbB-|dbd6{0q7etnzvefy#yXg-)B5_oE$x!6^)NRGna*z3Z$gY?#@B;Y1?t@-nbsJ zMB%cxA}yikL|9x|uz-EtmMF-ybeEgVGEUxYI>nOM*_bYdJ&Nr6>Edwy&2L0Yk_=*G z{~tdaq$@w53OF3n!bBe%!9Tgvu39qES@z|&ZB=Ns9_r%g4$%)4XYqb9eV47yT9L?oM8kV&a#V7_7cg z9rW`D%_AcO=s!#YtMem`x4#S9%yoiJCLW_U#wqy~EIB9W_+Ur#eK{&b;lkswah<|* zf@v-Cu`$k+N9eqTKqNDQ)S8coRtPg=#Q|Kx6NWT9-WF>*U6G!t9G7oOOe)R52de|c z`+;q{rX$6Jl}IW@#^*_De%v0~vy89JR0U(6Jdrz3M4Ao8O}8YF-JofpIIX6`%m_SA zsfN!{y+h-YP&56cS=+PV6~W?N=Ko7B$uMj#Y`xcrg3ybT+#s|LD!J z$KicdFdn|jOj(Un$q~#J#kXHBgC|AQb=6KFHWJ1oIxif{> zbcimYD}=J-oiAQnm58wPgRbUAqE1tvf%-HZ0**dHJn!$ixvAxnE6%v=!hT}h2kIaO zjYeBiW`>e%=pruu?W6>??#}orb;G1PuMqpUUfZ8C;%eeEnqXGXkPKI@@hv*O)$&GA zd9r88be9+Ub$m~D(o?3B*b{h^GMyNgNV<>R(t{hO+BxIF0Ree#S$BV^;C3(<_{O!( zTznPAZ+>c!pAHS>h1vJQ>0aX7^1V-=KJ`SjLe9I^z*YmxX0m|oiID_2adturSlCl`g8N-HVIfjjtHzNhE`N&v%d=*YV&NF$5M>UH45$T|O1uEr*y zbz}5xMZC0_np%Glyqsq)URq~+OQ}diQoZ)M!DzN^L6J9iDyuK((GtAAytM=aMyhIH z!d?oJ?i|i-EsWjuY^ZB?DNUAl7%fB!Sgl_Ru0{J-B~{AgR`*U1*9GNwSl_NM6T&G0 z0Re}2QfXgN;BSk&Hpg2pl<;ca(8WBmRjXN%;ZzjdN19yFI2=`=E)a(mlhxilw3RQ= zb*wX61Ej+(0j(J+9`W{JBJPVKcMfY1Yh`JfZjgTacBoCF_jNt{Fc{9n)|O39LAr9F zK%RuGeXRPsV94}I# zl@(pb9Oa4;#X2f0ZT}M}e@3T9`wH6E$|+Z@s-cP;&cBX{;*=w`3(%>U?i0Zg&M2gI zxq}g{U8m5YVOw-@d+UZq%fF4cN`Q*LCd7v7VP{nIuQfV+PPj8_$O!|pRQqdcP#>dh zu?RPYvv1uhjD;(fDreu99{VIK>T(w)+Oyy~zYPKVpG<3lgV6pKdx-A^=*X|XKnPfQ zd-$ffHuSZEYSh%jU?^72eh&h;2na&dw<5=j#0hWhg{K+wcd>9^^-h zf!X9iH3awgMSKl&QZ}SHp#Qmaf2s@`_*M-CXexOSApEJs!Pn*J^-*XKG4g z))X4uTa^Ik?`gP-5Kj~q`7|{BnE1D4wh9zhx1I)F>8aeh_fc^ORtmRnMjxN>AKJ9K zrm|bS((*h@gwLV7bF1%`mwNW$1VVGj%YB((B>9=D*Vc`cnaVG~|1qMNO4Wj7nCr$J R^}#D)u!oL2avl8t`ES*>yYv76 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/batbox.png b/src/main/resources/assets/rpmachine/textures/gui/batbox.png new file mode 100644 index 0000000000000000000000000000000000000000..1913a73f5c760995dba12209ccf935d5a4da26e6 GIT binary patch literal 2486 zcmcIlc~H|?5`GB;Vgv$f0uG>ntb?F}jtUYvekh0s%6+Mj=!gs$1msjO`JuarAc*VA zA!0H*B7)qCgAx)vMi&rJR$>T{h)f_{F@z%_A(=4F)><|H>_6L8uljY@`@a6V`c?HM zpM##d7-I|oKzHvRcRv6S>MH`Ewbbs&>GBgxQG%c6PEg%xDpUtr$M$==tG(J}yPi_j zZdu%(&;$VVT9*#u=c^|t)k*Edy$3wB`!O2mt%xlv{Ew-h+3$6C3rOvo9H@&m4PB-E zndg3$zVowDoQJWy-^#xw4kqHuevA(mjZ-q>5 zjq+i@$VHx#IKE`!2~NWt&vJ`#E+N4@mVLo>?I&8^W##QXIa<7bU!k0?J2=i%bt%sZ zs09~Ux04I|?WMvS&!0bEnY&wr&5-Cwg**x&Dmd^#O%3*2&Fm8(ar4WS1*N5>Sy>+j z269tpeIFh~Ok>PF+^?>wNUwF!Rt-xcsW~&G#H-?-pdS+jA%ktqO;Ta*)*W{|Z7kcy z{t7Chr+qtJ3OVfigy8v-k`hr&N|Y{GxU>hy(Y1=RC8^Pki*nj(S8Y8?>lwG+2lje`=sAU(>eL zq`$|ybvWVb0fRCNA7)VL$gpkdBj z)BWD98c9k;_ymRuiQXFZ4U`6jUHvRv(8>!&!ph=mrGt^8UcV^Kxnzx(EnaYe+2v*q zMvsDjT16=Dx6*=JqQlPrB`AsTeoN!8egQ}{Rl98_O)z;TZG|S!XVWxK-!#CB_(+e7kZ<}fwz)ZrY%PLt)R%|D>iqWB%Ub_eYjvQO}@3R2B} zrC=3oopx+fV0>aCj+Q?D({>jEAzMyt&Z4!PTY)`g6tBuLVi3ZSa5!h-fV;bW_jok@ z%>FpX`}$>OQBy&D2VVM?Ny#MJ?$aA)OSURq7SX)8aCaLRePImQ9DGKfEu(FvE~}+f zRSZd`+m(t^(Mz#7zBz5)Ryi$RcWU4XJ}}TD-6@-0LtG9*gxlbXLvco=4kG4exUpBy z=hT_ewFOmP8iHYR)-M0+@L-W+?$=9XfJZM9xORXGi5yIzix2V+s- zLGwbBQc&DN8LNpN1h@o$SU6u2gJ;E&V`3h)xU9ZXqv&WJjSPE{qzDgdkO+Sge>zRU zIH4&&Rd;>E9gz;MWVIcWOeap#!y?M=E>p_8Yc5~HSTz@{*4#} z2rCB_6S}S@a^*-Nq9oAm_;PB@m-JW@)tP_CciByG62lHUd>F9C&JwDCU(gc=JCuE! z(jSZZHO0Wb&w1E}QC*& zRk^XjJB7)G4Hd{6ycA3QcAe7}wKjSj#U0U072e)w;pz5Elu8oI!=mB*U<@HD~t@ z#=U`E)yVE1@Ooa44{VF+d-{0BEY232k{08b&m% z*GH<8(0r3Y`KwInAdCjzYRT0Owk>roy>9?CT+#^s3H}?9=fB{V)-ZqoSVH|l1)p-1 z9Hm!PRo$hsQl0V`4Clqsk#~!!cdnaY-~}_%H(V~a?(yS$W{XFjn0fEJf&3c$Cq6W| zs1~>hik#Ap3yeKnWwuy*BRgx4_1&y2e-pb8276p9yS)=U>HpbpRjSOUJPci_9g?{! zcBX;snygu`^(T#AmoW#XNPWNp95vT^9+v$o4_XM7Q6|udyYSE=wpM4y;AkXA9Us^I zZ<{)zlp?$d=XjAO3Vw(IDq(Fh*q#NVcRKBcVCi2wjqJ6oCy01&o?06_^;p2v%W6!FCI8(vG)!YMYgHeQDdh-T zk4OO28s!VByAU>s9pdSB4!iJu(2Awn3TX$Or~oK-+R=8pGM-QNTiAc?u7ells=L${ zXCidJl2J}bY*Fh)Wvvoo;ONqO9{$!|i0jnFD!1av#GFkO%rzX_0RuQn4)yWrx1}f^u><6uUICuR~XN~w8&+cdw)3D`$O%}@Nj@Y);UH$ z;IJdT)I;J_G?$x2k1sW4>%uW@8n8pnjag>4nBh6PEUdoYab|zTz=Cz_VcYHR<`?+` z1LuZ@hAgef&F`hZ2+q)1IJaw2wq`iDoZ}`(?=?a0AYF6`1?a(v$;lNkH6wdkBocL; zsIRYw!FXOvkOOm86(SD`z5?kHk}JzW!PB+fZ}Mitw1G$D3*InhKI`sgzj?C2RE4UX zw<3t7!%E`LaS_60EEcz?$AezqZ#h1Fg576YQ&Zz_tmRtbxQBbD$0b~P6HmR+9?$lB z%YX6We50>3ld?Rpoh5lXBAXxhurR{s^HVxIJ4=Np=Z@*eokZfomn3B8&g_me^;N&u zKgG-K^-iifdgRE%=H^{x<>g*m=JazI(@m1t_>NF&2%4Ij%9v>!-zSktZ62oPbVn|h z@leI{+~Bik&ql9%>@zZ=?sWZ;8S6S1bBd>HjfO;(+oK7En|0RG)n3+!g=M#Iiwy&> z+J7s4oKdtX)4n20mah@VOh&7LNk?O2WAy{JXGo33rGv>Z8Z;(baqJNHWkEr~`-Y%0 zB~4)BAZ+4q_qiWau9QskP$gvf0L{RyI)?AGL!?SLjzA!=WF-iE)G|;L?rRd7LTWbx zYia5RhQf>yjr?#~jAY8l$2)GDEVd!HTH6^I2Pa)-jyferQAqmb#7IEB;SPE>$fQzf zl6UNA_^tbpo^U)p3R~emK#->mN!01EEm$hN%GZ!Wv zuwHDt$P6-ENymfOTZ|BR=P8A}2?UD5B@*$R&3yHgGz2Isfq*Im zSZvdT(N`6fZD9oPC2ulH)lR$Z0Ekd@HV?yk(f}}2rf`@iXd?;$4v31Om%m|c3hFcf zPmo0IdVVM6a)GZJSPC%zWdv^=#@p{<&^kfD&E8$*Pswpyy{c^P#`3wvI2uhyPcK;L zrvk~R2EaZ#{3!~DS!Xb8vV5GZ@e_n{yjfS~^;&eZ%g<3#pNZ?<*$~kQ-0+@eZg}Zl z7R8OJ4gVGUG3uY-((^LsA(Lrw?|4_K+Uv|&Mg#&g_nxAdMdRKwMBjKp0s7=6$Ut#M z?Kx6H8}wfg$#R5Q%CFpW)N$7aEKGNdNJgL-zSuhF{*M!cfX_U9uI2Apk+G7u;>ZBS z^{CtCw07s4e;18QTwk?1edVXpHv|aQ+XlwfhunRwKC+As8_L!_3Z>mWQ2vZ=u8Y*Ak1nH@c8+b; u?mDf^@$WN7_nt}4YKWH4^Z!NiAgQ9|0%fdS@k+Y<0lQs}vjJfOh0^=k)g4(d9aM5O^Oo+(zk^Qm1C+3?$rQm{KR0Hy>Z#@ zquT=67m@8<-XVb(Lfn{PjkJ%WAA68CT=8ygN|C$wS*;{xb)>F-ATbbk(1eN0cI}A2pC!|*W=|;Zs9|T>_sXGq<#6H51eYG5C{ZLmXoHf2&8Q5 zEdO$bMM^B~z~(U!4(htME{of6VkL18S(@cc zD^yfZhS#dj>s}7>%r0%t-O+dXn{W4R%uRCAL`y$Zl|zS;1TQaVXJ@bTslTms1&06N z9)7KAxpa16K-^+a`K@(+hn)e?0Gd{y$qfx{2{c1Y&%^}p#vrPWw?e0WuX~2a^b{p_ z`*VuzQ%>A!u2^nqSe~2vq5ajeaH{^kCEVc@Tn(M!x)y2Xou86G6azC0OLx~Toz2$^ za>McPumh=faQtZ5C(mvs6-+UYV^0>EU{O;*DA)oNiE>3vDZRjRq#3Y3n8l37Cb9=mFmo`s=lJCSe`2RH{ok)_i`giLXs4briqCtG|v0LH;7 zxfCgw+tL@XhXNKUHTPO^7~141U@x*CfW!*S2=Fzgz&eST-pa$%KqToTqhkIUsJ^L) zq1UQdvrN{KI$H>BBkF4@hx~>s#BWA%;D9dl6SRwkL7DN6T9n%f1Pc^Eef80L5b>be z9GZGc?Nqh#E50pNaef{r7}e)I}R# z6VsarBlBvNQbB0S@q57c%JZkc^bj^?(3H-;)b^d&VZIlUs2EX4x4T`nMs!s?CjF@; zRsD2I+`rI#R|rG1(zanXK&OmZ+#|a`)TKAaS_E4bEtS?Oyap>CpOJK-d^PVc0TJ5^x7AMq{>203(Cbt&0BHuQRDD4AzYa> zmTFo2--ht$hFnMO@cEF`PEQuj9rq_8#*w*}21s-{xWFG~hg?ys?^rfhFA2#WAGf z*4w)Wa~C^^G(0q4Ei!e6*$G3@A1yBOB8RRxo|?6HO}VK1rZBcQil1wP`YIhQ{;|5$ zd4BZgv}k)Gl2fhZt$FXi%#-P6s)9F8=;znQH{Q2_DPFI&@c6D@A z&Wq*DDPVnYmY<1%gF%4-=pIZ4`-h?>&9ZHYUwihwSAL#zuGcd5dSyC?!`yrK?uFI< zx9FQ#+}GdVA6k6wdGV7u^-n(j2w4%$-~b9676t)ajCt<@elz^q*Iy`OKC{?vzAXP) zZ^1w>O~Jtb``Nb(zA!A#y3b+a8|>n8=5x(Y*=4QT4II*qa)mZ#OqFc7-3oF2fy*~J zo>XMa=yiBjGdo#%f_6jJO^z-9Ki=SYB8khFaDV%!D^Ga5Fwu-@=I7kLUWauIt5TIO z{5uXbCLMeDz;!Y)*v##9=xcA2%~BR{0a_-8!}|^lbC?7e7C4&Q^V#qmekH%*>HoFn z%g=(sb-A4~!*ub4-a;8*Q1@AupZ{oBx*ear3JiXX91Is0%>K==?N|NhXEU7V2DwZL z@^U${{U|rk6Tye)yzX_lY~t#2#OD0;`-$InFzwjGkbR>f`P?l_LV?NjKm?d1csB{2 znDgrS26^emGb`(WVdB4wY%}K1mTp|&X2!IW6`VL8=$Xqi-Qvpe<1Jpdo$2!ehM2ep z)11Ag>2GEDm)~W=k{V&5-N0bMs=(mToWp9i{FmjM<6#MWKnw{ghvMn~a~`WI1$nL1 zIsNE~Q+GJS(kUfYbLa5#9cDhjJ2mLh`FN%-{do5uRrU4XkKKJC_F#Q#wVnkVli-LpzihvZAMZzlZK`LNSf&~Pm z7_JLoHGl-gD{E>680-bNw46!CHS+a8m#y&MbOxBD|sq^P<_0=VZ55tog{gx!oRNz`xC?@%krkY$G^f z|3cHGW@|DyDh$ke9imd;IM%5da#PM)I91#+Mo_E@9v;e9c;dNnFu(n3gyp_{S7MiE zp0~BN30pjMwJNqbyXwc*^68kgH=cw#y`5^RK+l?Kav|ACkzlVM9sStp5eK7qtpyEc z>o?-9NT4-}K-1w*^wtl(q~|h4_i|B*=;!U6wGlSejyJm)Gv7wU$buf`I(s42Te+i1 zbPMEKEzn7b(Yf)(n1Gu?Zj3i*Fk7rg&o66fIdyQz5mFrE7o6_JcL|m(Wb0#bxX|Br zB`;B6wA3sHPMKhfi?<&wtKkp59n%|5OU*YAcBJVumSbusmsw`p^$bCuDj+xqt~7-k zhqQlDvS))e5!LW2-`sb%+VjQt-J_greG|2-ZyK+vU-RpIyGqAccfp~8-8Z?6AXpZi zfa^bSD4SvEa^>LdsAW>|SYz9nZG&9QbFOz?s#OkaJbqnA%fnJ0F^zykm3f$K)3`W~ za-4#Do>XdT)cn+mUrBD-T5oun#i8F?UJkyv%oNOK7AsoU4BhzdD{zMXY^<1Wecx#O zp3%xZd)V=6$<9I@+FlEb%hvUjJ&ul!Z{C;Hr`Hcm{(ARF&Mh5UDybl9T@+ojw$u*? zkEic%>?^1fbWS{5-f%9EwqKx&DLZAUoZ%mU#0f^IwHEPkNI3%5xF&j0)DhEJil_C? z;1{EvZOgiwwX|^Sg3+kC5q7&$#W{DxX@!g>)vfOwidOlPyS;zjBH1M)8_*5=5L4S_ zAXEZV&fre39L|)(aC(L<$9w!{D`Uky` z*lf3rV>v5bO)x!)AF}nOxhzzJ3dr2LqK87EP8q9IR{V6%lN=*BX)6k^=_|u6y7}WN zdgUvo&nE;n|3Zz>ckRlgfZ^z|0>Qh^`}4Cz`Wq+18`8f^6_S}1-bCANEMy|*l1=B= z2{#?Ro$A_Ox{RQ?Hyt<^g>M6EqC|e8_i5j3HlAteYr>uak_oU6J#l(H3b{v5VsrMgNOS$-G12-1i7 z_VVf%GjeOUKasz%MpBiC63o4RIZAL_=ZEGe$dFvTy1n0KBO$#7QS{=EBP%P=sWMcy z5nzT2UJHJsFZ3GWo%5u07{zDnV&`b`Hj-c}muOzZO)!ZU4bC=ci<)n2=$`s^Z?00u zbOUFG3ZSneVKh!rVPL#(MxH)M>kX2i?F3yX^Qq^hMN6I(Wh|)zc{EP(C?&-Q1{_e3 zYyTGphIuP#!cahlIt@se`pb`AzxPNhd*0e;grBEPH~6w=@Y1mEQ*D-f2c~@R(+%V3TNvd^(AILU>6!`8!PCZHSMsyCZWhHB#X<0&oH46m(6OOd(Z>S2c9%#sS; ztN+W8HkXmF%;okVfdfY3P_`jk`NP6klBS-iR3nJGI-f$NO7NyUk%c7#bF9Y`M2cGZ zkRE~x)g-fh%K0-EJk-8(1_41V{Y=9;jvVIE^#;|l3uNe#6%KcPNtLIB`Eaa9@k|^p zuM)I}Yqk!!jwBT%`g_1VKv3jZi^eM{vzglY(PCXjt#Y9!pA^jRMoVW8%D{m9@jJch zRD&R?--oLd5Pb?@F)i_XUzllGlTuwB_7K27BZ0-$b;D}aGs+#bGI9D_p}u5n+LBa> zm#(|(fs1C`yJ z7#Ij#j|)44B8~^iPEGWBBcY|36|V3wL%C+C!*t`4G(Nvf%BOmW96q!@9lSl4JPFU0 z1-<|Rdojy=>h&wI2VcOeYy7G-5*2_tu46U~(W5v%6*drT1MEvB+<8|jnl*ihg*@Jq z;UwVRyah6qt*k_rKM2bqOJrlr0*Z@a$KrcB#M9vg10riBbzn$qzIXum(PkkuS&lLJyyBZkpp&*tWb+8HKLs_~Z~RzsZR zM+AsTS~X}Ov}op+C2Js|^Hs4YJFL;dYCIY!{BdVI-XzYr?V?ig@AGNQ(UKSjNS%#);>xRwZ~e1 z=BfPD^(V>ywG#>eC4MJ;w)QHyTUdFc@_pTW)S5~go_?Y&wp$di--u{?-S31NDg|XU z<%`7L&7xRp5UGvE;K@PVyDD7Co!)gf<|wm6`;{Uc$k652A$v1R*5VTkSDy|)r5v%~ zM306|c62=bIcNs{2Z@rP)vHw6wWTHJ*}KzZB43#?eXpLO;p5eSeX7HN6Pl(<6$-=w^HsBe5# zTqSu^jBuznXq~kqM_a4HAnkR?_{cAHkAY=D`fVFu6|vL*TxKI1rOwH6|Hvz;+q`Q> LaI`Hw;FI)kwD_7m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/filter.png b/src/main/resources/assets/rpmachine/textures/gui/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..e38b9f087fa90262c25b840459363d21eccb2a5d GIT binary patch literal 1297 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;3=GT+0X`wF zKtUidH#ZLr4ejpkK6dQb|Ns9Xf}`YU2n_oWNSg9F7wAdGk|4ie28U-i(m(v8gWf{#URP*QQFYMw8YB6jWLMx z!P`gs7=M&BO#+H{_&2;~*w6Hi`3`55*awpgIj{{|8H@JaJh|Esr*$9+F-D8LlBl;Q zavBax-@V$0p|*~<;LqaES?)e9F-#be!ivI*(=kL3xMVOK*yqT=@J7Z|v`ijdeg@ZU zuGySS3>&WfQfJum&nkbW8pD>lk6-OsUtLl0oP-~h+>|Sg`C}KZFjo;|uBWS?%Q~lo FCIHFom<0d; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/filter9.png b/src/main/resources/assets/rpmachine/textures/gui/filter9.png new file mode 100644 index 0000000000000000000000000000000000000000..3c2074f3d1307e69ef0b02f0ae78df5b116135fb GIT binary patch literal 1317 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn`1yx4R3& ze-K=-cll(X2xoyuWHAE+-$4*&+%YlxEl`lX#M9T6{SG5LzocC9nJv2+7+98ix;TbZ z+m1J9wms2DaRARoTO9&7ae(GTY&sP05^-7dV>>F5TF7 z|9i;Fw`;35)aPuE3Hq~`Q=;w5#~rbH(+%hPDJwnt_s>r9{L{SKie|l^=Qqyzt7)3c zGVOF~&i30sBpCI~3qKi~gof^o-{`me@^=myKK8>q9|gUNXRN5JGZU@K-F(x<*?<1EjmiR%EDLl_pJU%G+gO+Ou7d4DD!cMC zzh#UC2D7YZvL85@@h(M|7t_2MQ+TM!XHp7w()iVc>HrR=>=Ekl5EI+vv6h{;I{rGIaqH}@6RTv}0GZLGtXkfS!)bI-ngb-zAuzNyo9JbB3!9&ZMT)pzs0zsz+C z4ZUd6tH{ZaTvpY!{ryi()o=#OcvUIJbqp*Gg1^?Y*DEmW+_Piy|N6?kzpL3C*d}SS zvMAVZzWL@&J(rheY{}9F27?394Ua!cq(&Y~G3wm4?!N!GDM43C-^MetG#K7`|NY~q zPoHl8{dauw-oG24GcX-E@nipA4u@qmtN0l$4)-~H_@4VC5;)9e`?~C@ zKXy>~4BwyM{MeH~0|Ue1qHmWQR$pE9S^h%Z->s!B2sS*e@Tmx2!c@ zQ(EJ7RTpa#0_q1PDvkz0AWPC}xBP*K{cg9d4o9`WFaGxW;9HKAxpr%ccPUR;&;H*z zoZ&6^g;v@8HJ3|et(hv>P*Wq+C}=`uN?=i7aA-SFSr)e zGVa>&xVLoIx@32S^N^3P+h=wHObw%G4 z7sNKMz1&{vSI+v3pA~HK>$O0WA3xjzRfLr6k<1ogPzL4%qm=N3*I(*n_w~m%O3LhJ z+RX~IPJm(4?my47@3^^mX_|(HO6ma<@q}lecV-$$$T8IQUS>3NJLJ$G%Rnn2(YT*M X_|~2RmsN@pAUix={an^LB{Ts5jK|e% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/itemdet.png b/src/main/resources/assets/rpmachine/textures/gui/itemdet.png new file mode 100644 index 0000000000000000000000000000000000000000..4f55bede1f0fa814d4ddde6db9cbd482bc528420 GIT binary patch literal 1876 zcmcIlX;f236rPs=30RgES}MCVZD@}XG$1w-4VD^$CZWipg0hGP5=9Pa6E_4@suZ^h zLJ_mLKw4R)2!aWV3qe6*!9V~>C@MRNB(k=IKCtbN9(zvz^u3ugcfOhLyLax)o0sNK zBb%Dom;eAwDZV}d06?$_0kjd^geCmAXQ9UqAa4N0Ep|h2$0%wO*$2!oyh4d614fMF zeYddzFsomv(CzP8V=##NnnL{&)%^|<<%+oEv55f_pHh6h0}phK^?3X8r|eO$G`WqX zttLoT_RirY+paz=+}dDbbXehJeBd+ry}{k0(@JN{2D2TJ-5v_wqqsY#ue&sT_`*#Q z=^bTO<{MEu+Lem=jFmoEP#CJTA7y#49!xWJH8R}{$<60?!=sw{nb{-QH%9{c{Msj4QH&YCW#Xnxh$kO?3erYP;Z~8s97dsL`O%5 zpkYHZ!f+%Wx}FkVhE#BVo7}hKN*h1-MKoS(U5N>>UOzV6 z(0As@B|5vmKIesoVpKLa(ck2$+o){3=hggje|USLgae+OZTMDNp-*sL>R{W_$9phV zl6|uF_8>iI6c~V1Jb`ctGbB;uzFf|jzV$2SVQRW{!lBpY41h>pwRPvt7T((QPK9rK zM}}_TB)ji^+Sgnzt0j9)zM&QMd0%)qU3rAPlB-e5tsv4i_Z9l>xNSRn<|NW{j;!;c z;5%kajLU#*|6G6g4r+TlfBFo!S>pwfBER8s8Sqd?iN-ATTfYZulMO*?S!wC3B>EJc z?^Ts}vx9kS@7}!_ig+Xl_`4~)lj7q})tP~=>{t@?D)195Hn(`?x^?`{&d#hGZ1uCM z))moh$%x*cTz}ZJnM&Qw;Z)=eXCC~a$z2G9_c>IgengiPrkqXCq4FWvR|VVVl{~#f zJ^4Ia-F>fDU9EYGy#6i?!r*u_h?aU5olO6#g+5D z&n!~xLAfjJJoy6N)CIV#Trl73<{K3XDEf-$wkk?oFw9A|Z;(py9v(rr3Av<$xmbhv|huzpa~8k7J}d z!G2D(R&n!4Y1xH`0|J>K{J^rL8S1W_q>oB!)gI4=w%&2w_?k$G`(0Z*GjYyS*M${C zAKHi0h^M3SJK7UCY`kVJo>-|W8K_)8QyE)#m5400d@_ZZ>1>Wyt7-)*xn_4?UUpfl zN|1JVN~<4cD)n2EiuJd!JRa|$`t$uqam{9RG?L2phMWl(xo$!1zG3(l}ceLyAF^5KmZGn4B!vYY4Q4d1I1Y8LrWS19T5@cG=pQf zixFiS`cc9&QGwa_r!2)cD*Wj{DgeZVxTSK53=8vs;Ux8cPB+^jDyxrNen2UaS z0Rn-bBg|#UOt@;*s;jo;rslw0nqgYVGTv9sf#BcK|MCcd9_7t07%{%h)Gaumd`a^u I-Vkx@4`+oDVE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/manager.png b/src/main/resources/assets/rpmachine/textures/gui/manager.png new file mode 100644 index 0000000000000000000000000000000000000000..767a3bd468754fc838cc5ce8295defbefbada4b6 GIT binary patch literal 2556 zcmai0X;f3!7Cs4)FbM?FC>lYA7plc9Dn$u|1Q|l040Qly2pC!h1(6{E3qsI^pqOZd zstAF!6w$H>YHAS?2vs2}odnGK^1F;T!I@4|X^`Cfm#d)HZKxM%NkzHfhLpL@aA zo4j7jNDBb4p5pFu000=&gaHk8s0xa|9lqL2I6&SHcrUh1LLGIQC)ow4R$p#ySuQl9 zdCL800sy*yt`^uvOAjVAh)kq-xgz_ubak*+Kaq6}plPWT7pFtXy|V*8k%ixHN6rrx zZ1S7;X>yg{fAE&((?O?{`eHTCj*PfEm=h=^$YVX8I#0Jd2zP61`%Q0dC>?TgN&4a& zjT-7E_@C6T2s$@CyZ`LihzNUfAL(i3<(!|S7e`ath!U0NbH(k*iHrW)0V8nB1h-S%NNGNIzPNmH>Ent zj;1bFRfW-LGy=l*uRhlJ_;`#8GvI*B*~6rxanyHOW}@Q{0xq#wuC>&`1O>QKXx;NW26k7Yi^ z?Bfp}(am{CVM~jLO+j0B_P)3gm;QuyLf;g_{@{y6ofYnNZCB}=g4mNEPR7j7g>#g{ zS=tLvH=vp>lO1H@gX0A-lCldq_-sik*~@w;m9)=I-MPM7@j-@-aJ*0!QOwT55x1o$ zs}vvpWvWb`Iy4*(oT=7^E#H-vmsu4CW+x3|*#03Hb|wxzvQnI8%#w6@FP_p%rR>wZlKLl-cb4+G)--lQZ&UO2xxri^;?R)KoV$}}rNT62c_ zX1|qf^twM#*+G}20am7_Q?egYYac2W$n4qWaL(^paR)W70bklRkQean+o=uUWoZr? zcQUX(HmIwrOX|-HvR3Q%$<56rbZy39So!%|=yL80q0pVD?tJqWCRVFuvFBq)D{v!| zQ+`m2#fMs3TW|A`bouD7@w4p%>p!wYANvLj^KL~M-itk-%QS2mn|rIY3mojh1z-Fy zl4Gw*2?v3#?d?g0@`1^?Zd}*f`c3@Gw#LpZUSmyDmYFGS_<81ssq~O%6ZR!>gDqz= z3t`)4BtvsHLWx8&+I=sK8ueYr%nAO&h&boOVD!T;EKO-|IQhoLe8hy~woPbsZHMr8 zk5Yr5JS=#M<$%;w`RMIKJL6ut+1ux@f&BN zY)2wcqDt>3ezD`$sGH%-yt;1+)w-KUMt*5%7tj;dac5t5ri|tj34Enu*IccEu~(|$ zXl&(xR_g6|OFut9guolW{?xf*r=_m*B9Ho|;o`Z0S)1fY%YX{MLp!%V(hR=5nYgEJ zGJ*#uH9#6Y5)jb)j?b!r$M!$`F{fr(ZUq>SxsmC4J0|NwXN-$SS$`EGO#5jCBa00PHm+# zMQx~BQZzkv&ptmtf3iBzD<%Cb{#<2PC7GfYdL?nF*@sj6dU{xkqzMO%jym`}I*Zm- zh(JIolIeJ(pdhEZy1FJ!$5LR&bP9%nFJW9We>ehIyrHgUQ4kse=Zf;v{9)W7*pLSp zJ69nX>y<7q+aaNkBmhcVLosJt(AJS2Sq8YL7%S|$$B$=1XHoCrSL`UX zgb<#ZpccF{^*V^$(GCOQ01jFK0+>Jt3dw9=$Mvu9d+yY2=7?s_)b3iJeJxs~`l8=y|N zAR&uVJ71xM2Hd$-+Ax?51enk;2bT7$EsMQGqA}&_(+oA_$(n(xTHH{}PrG#es1Q9{ z!Xk2eA|oR$>lE@nj4?5O%)S2+{kgZmVVyuI6tb}?c!JyM&S@Fux+a9(o8$>Do}AW? zt(RaaH1)gJ`Cnx*TQkpXfi{`kFTnvzX-*9K{Zh*NBweO~d#fR&gM=~RkL-f8SIu9c z+<~vyLQoM{MN3O_Jb(WDFP+CL^yKCgsIJyB0hYgn^S5|QC{ z?gQRsLUH)bS#EK{llS23>t|NRoGScsvSle+h1N3}(^hLjTMH^2=mRELV|q;lP@L^v zEii_fo12SNXXTQ%@)GYVx|^HZC9y(-DaUcqM?d!eKwmuE6f<@0e=Yyp8C;7|hpRGXx`w);o3_4KmoYt;mrxFnduu{mZw`>b(1^rSR6Dyv4z-E(Pz#ujK1LogD z8Xyb8@4FulzmvO!*YR#*ldibp;YZ>YVz_q)Q{$rtF}h#k?59v zYVIPNJAUPC_3B|nsBvkO5iv;9U9o`GOK)s!)aiG$g8lWi5zFfW-p;P)dfi*BPthSV zhc_Kv>kxCNR|4HHYrjKl-ap~J68j030qSQn{nPhL&Gi2hw`avlkulQD^s2cgCWHIy z9;S_#GudSEsiwfO_a#ar-ige0+zsnBVm01E(jjWKA!?204L*7Pd@i|32zNsuMf**_#}zR9l@(arJiL?GHWsZ(fU6DgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/regulator.png b/src/main/resources/assets/rpmachine/textures/gui/regulator.png new file mode 100644 index 0000000000000000000000000000000000000000..201386f3bde3ae21eb8486b097b5e79e0e7f5919 GIT binary patch literal 2296 zcmb7E2~bm67JVNBi71OD(y}WcxHAsm5)BC=jS(f09Sz{9BoHWQWk;4E3ax{H;DYRG zBSL5rQCTH0t%69xBD(~lLVzTYwCr2Rd~mv_Yihct=KcEh|2uWxdH0@s-n&7xvr$si zR0IGh;g27)2LOV9A%IeVKcve~$t$x!dz+)6q*+@4PZZAE+8hJ2l_#&JAPq*={&3ta z5CG+0R$ge+_7gN1L608nB0W0sC#AIJNj1!#L|B0uqpv){z4 z6P2&#&sAKr{XqK>6%vb(M=2tQwwyMU;jZc1+F4#PKX>}Hee2N018OcmRi>r9+OgYm zP;Tv=tfS|N8C$Xu`XM2V<6VBGTlaZLA}BNAhPL#cXv}=ba5*osdeZJT&wP!aOVXk+RO+uQeX=BWm(pXm6Wn`99U6DlTINT=FgB-CAB_gxvu*UM|0 zUd+-ZURhMfKUDe)yG0K&GN?v7l(i53KtR19RR#IjzKmY_+Q9N(9F@wLol5dzS6A0} zg$@O!6%{=vQ)g7eQhd8h_!Imld}?E3Bj>>{{k?C*^0YX;s=(!?`NiZ<Gk2dee6-C3~W)(=Qyl*I7KwUPqaD`yGKll56up zS6L(y9g3KG3TQ>)qTce-03K^;rY|5|pD;8f(5j3G4zQ3##;~Nb|5M-NE-`P zKr~OrE{D}OG?=0zMpArpp&@MJTN0bY9a{`p3wo|Q&}KC1KF4S`CzwR0Pft&4H*SD{ z6IR|k7kV{6oSBIYl`aIs$fUSh;%~tU89$@0ESLyf7rz?s zUheX&c9&`c=A^T;Gy2I4hdh}RS2Nu+0`kr;%=a#1F{WRq>VEy}8k(-w6dj7ytqu~{ zH-yXLx)32!YF$WRV4%A!wzs!;_ntjUj@bf%Ku6=q;DyLCA)Uc`Ki*e9*qUdD`Fw zS><3;0E_M0QgctjTC||k8`_xbq49F# z58h@ILumx@N4Phm?K|q4!Ve{==rrHmCF2OG6AK~&zrNQ0qF~NGr@4J4*9DP{94H!= z#z`n}srYD56t_AwK$#W#7m9K=KDC&^7zyL-0FKR#X~yl|W|#Tz@3Pr`hIqTIuzf8@ zCQqjFu&Aka0(LEUnmR*=8tUsOKG>QBM^3bK(uk+yBF*yvZD6ND_#jDnz12woA9DoQ z0%)IqZ4HIU6pAU9C+)kkCMG75 zp0gL~k*0tVRF8y+MjkMo18wWa@IKGB_^6Tn7Gw|-otO-mffphXwCuh)m;j&v4gjym z2E_Y)j}20!1?(V%@aorn7B`Y`D)|PjuLUSG?qW+F61?`MQmJQaT^QX;IUrAQFR6mb z&vkcm(-_tIn?C4?=kxh$*0kqUjd{r;Y;R=~=xmKX)%Z+Rg^=4_2EZ##|4kLnu%*V!18`1>(Jo3o#J~ zz6t}BXj_TtJ7A>c&6_t?ST#qrxA(}3C~zW7k@@V|Z8(Dt>PvWgPF&6Qn`W9y5;>T} z8@{c&8J?1ZyZ~&^+2o(spuo<0%A!25dhZlvr3+wvBd!D?N@aI?tq#jU$S*Y*Ka*o9aC?o=iS5w1hOQB!UND&{hHk4~ zAOn>MxvGbQx6u7vZ5!Tce&hX<1Xp(<>Z9cfP0fNwe= z(DP+utCD*_r=Tp!+P~nNY`-h^U-rP=7*#B8ZtZxOR#Mlx%{>-cVWmCHT)yAwo%(3| zO>&Kgi8Mx`r+$52ub;YugTwc0$_f+L(K0hQWHD=F>lDAKJ6DDd7CQP6p#7bq=^Voz zE|;4$6^y;~&N4u}dz0I1NmAx9KBpRhAzP zd6&BdBENg{=S+npk5yfr5*yr1iCU*{eRce|IQYU?tUS{%kF4Uf51+^yr5G`p6y?^N z8t$7RIyyQUW$&JiQq+$hKdz|QnP>69t%RAXgZ=7u+sc$uS?K%-^T=h;RMH4vtMHBz zf?Yd%c1P}|T4mANiDrY{46W!j?mc63^M2WwYf8F~RrN+M!sioPHKPKD{fZoO5=r%% zIO6h**`Qn6_Ry8N_b*xOn>4L#%Zu$Q2Ol4CbYwQh!hA?1QqO+Y^Olx`51gcL_&g&& zuJeaey;`917%|ZzRS28-T(AmUK9aa@75u8cf3>GOF~p{Ux1l)wrEf08GX6dkCztP zbni8!U(4mm-Gj$YRGr|yV#UG<_TgU{{a6?Wvlv=93`{35~LJmE2u`hjL zt(i*?p^yZv2K3#&BX^%yK6$sHX3KQWnTjnfXN=#9<}Nc{U$7Z99wgskMeOhM;98c{O<@g#48pB+863 za1UA|M0*khU0o?9n@k=M?5GFzvaQK(^32{ety33-o5FM ziIO3fRdwp;=Z#}rMm7$VKA9I_u~@6Gt4c~r-xG%3^yRt-KYz&fAkXu^&X%!`I8=sB zy}fAFG5jLJkFyI+mk#FGsr@88O=u9YZ+kJvlWj(pm+$1|CHF+zXjCX4Ybeq@T%pYC z=M6`AnV6Vt68A?a%Oj%NyL$jPjl%tmmyvgWs)QgK_AfNTcOB?f3Wcsff# zK&^3*hGce54lSW}GF9l>(S7E^g(`#D+ciXQcZl|^AMo|{wakqx3f2APZhI(i$A?W| zy`Pp9-zn3ZM`|^umIfsi^QuSSeiB3_Z~$E&vgC|}r_g}{WG2U21M1LI5157P@EF@- zUdK}ioLb`WAq#BNmK^+@uHPta4Y~(t%8(hd0crn^JD?oftu)~4j)He_^&3sR$Bd-< z`CJdqTgWfPu&yr$pPt(6I(~u^XeTeGSrgeQa?O0tg)2$lho#i)1?C56dD)uKa>d6H zCM4Nc2a89nmII}yKK4Mn_+}JID(z@}`tRG&nR#&UgWA)3K;=Gz6xEpfP2jcVUPz1| zRIb4JQE&e!-Q~w0oxmQM!otE}egwTQU^3S~9*kK|PEI0lX|X0O1y%bbz=(9hiuUG^2_%1Tjnp?)1pOG|}KR}Vc*OPuQU zkwMD`1%9HDDQVkDAo9zO$B-o;382$%Fd-UDusaO#qSYiN`Yn7!5TQ7M@efNGdE=h8n{j6wY$J6(shg4E148K=1b@nVrh+WG11@ z;{fvf*sH?yBUNshuETCqRkxt->;u{gfC|Jgwf}mM0U7`Z`1ewZp<#%$nwA!auXS#p z&<)k@|7>gWe$H`V`jYBcuwXpc-sXz>l3^YrYMxEqGC@^ z4=w19=Mqr!LhHV{l%MU`VXTwl^FKlV#RG!=K}?GHItks5BcqmXe%tda@r_JxktTW^ zK7Ca+B%{Y4zDO{jp>9xKdg%3Z4IKQx3_2!~QE9oe T$I_GW?FgK`Bc}9#_mw{ZJE>AS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/sortmachine.png b/src/main/resources/assets/rpmachine/textures/gui/sortmachine.png new file mode 100644 index 0000000000000000000000000000000000000000..953c2ae40ec275c42d438b2e1194a06fad5139e2 GIT binary patch literal 4109 zcmb7Hc|25WAAe>VLqtN0Wrmx5$ta;lwkRWolr0TYDrC)?Eu+QUZbFnL*|YB#iA*Ds zsO*z<2!$~;82dKwal7yP-ap=d-g7?ZbI$Mgd!FC=eSYV89-5gL@^XuC0|0o9a0cc8 zz@SeU;6g&L%U-!RwkdCO!;_%6Rg4Z1$g9SN27tYNr;&4FA{4mrmmiypRaH{xpl=vJSfuUG>vboyKa!#&Zx9|mj8k^v9`9h z(7ehL5f$xXZ_GtaF&K|@zOHRr^16zsFu6e8xgO^0;#Q{5RKHcR^ZL?E%*(oJqOu)X zj;Ux@Bx3(;-sElYsuw=ysG3@qiz=gt(>9A5(?B~CL>?%nrs#{&1VsE7Ocz}x-c__K4cMbth)4-dwq*??Y1dzZo2SV&r(4>ZUgz z8N~+&DvG3rbUNMnS$zEP#&~Y`EIIr>Q#$oalorNj-WL|PE|iv&V@Rb^dG3gna#My& z+H}|_u5(7tRA{&l{*IBg$3)Krl=}x8hj6!db;bJ1GU@aupMH#n@^ROnEa}i_sN7_s z>ECT7_VI0QZf>-}lw_FRKsnwRqIR**t4ynls$ix!iZ~hp-qt}g+qtV zttR@w4hJ^nwiL(HyE`s)iWp5uTj1P=-MU5uJNQd!mx=lL`L!v-gM&(`Z81*RiQk(Mq)|S z*@nqQcxGniyxU^lR%76^Jf$l_SEj(nh1TRlwD==sVT}SoB)gKuBRAF}PpoG;N*j%h zjXhUL>GZH)DME+*?6^NsiSl^#c0k;tOJj>JI={ZjO=`G#Y)B%fEAN7#DLqMNE8F)p zuq)AUsBsL8cng;^fD&d=O} zT+81BV#A2LWMpM8#FZ4j$>>S4vzk3^_JonAS=L2=`s$3dv@~R{##3*K5nDe}dNMuQ z$L@JTg31@>$E-Tt$Sw1w{bcWNs0Zo~77CbKXM8=nv)J!28TKd8Q6?!$=Eub1n#MX@ zFk~4Eoa3vM^P5!+VHmivS2Sa{Gfs~~?fCILi_C(Bl{Rs!zSI_<$t?XE)?l)Ng2I^q z_lDh~-&b5nca}0!od;gIZSJ zDUO1x5iOI36HNg@ks&Qyegh#>BpUwY2;8Z^!lRclugDR#Vmsn<2=vr+(})MHpXWR0Fv$P$+G8*6p` zC!ZigPZzaLEi(^&NKnZQ3xids-co!m&HB@(eb4VRhc}lJDk%mv1*_UyD-Ow6Uprsl z&XDB?oys1=%CwMW+7dUY^9q;ZHFQMq8SWS8c@`K&86CZvtm*HqMe~vq`tzr&?l`2-!|t&2sHR}|%t?W@V6s+Sr=T=cDVW{<7M-W>c5Wk9&f zN0PiQLzth{q2+*Q&z|KM7M`^>trFXXED{E~>9&P^#A@yB7Wm$z9JUh>ZXK{3bbDzdaA$=hF%I_E>k+`D=d0ng}J2;%B*34=c-~bG8 zNNfd!bZUmWlE;UhzfY3@#Cr3K7oX0zvL9;8=MLW*B7w5@|4(5)Q+@8%tOBtZ;aZ2A#N*b_U z?cWNB@)>6}&}cN_wgtzaUAnLcuz~=7b*{Q~;|UOq#mZqYQ3rJifA9$+BAD4~H@{}04Of2Gqtw;gC5x+NCV@;|$mf#pCxTdmh{%v_E$TUVknfKKX zNTEspz<}@K6m?~dT3|&T8baGwt-0#L!N<{*pr7ZhtgM2`&?3>^a8#EtOB3TGW#{Br z;PFMBot-O-z`aUyWQCGevg4yVCb(=oV#kfx6QZ898sGlXEBe6!PEH@u<*}q#44HcHadz%NMW^5*xlp51zpdgdB zgLLpq;KczT9KPaSWh+@E*_qpYsW1Ol)9bJ7ra)(-h*}yJ%@y02>YF9Bs;@GwbS-Io?MkpjX(XeE(r$xwhzNWT<4EZ@xH6` zKWvwGZ=~CLRbLc75K(N(duAldi9XXDYdISum* z7cSH`vAx^0;@vmUi6LCkGvjGcG-p4~_$dl;JF~{WbTqUTp*O!j4!L>rrn!qt0TPMy z$`?%HQ3=x4btPwHoD_fpKPxN5P45`}F_+8^Wh-gnhqHJ^)jw+@0s{jD+>!kd8pLgc zpd`Qn2fhFEwUkhHv-WW-W1VAjhm6i}g%xUk_#BDH;}2C06dA`W(>t?_mufU52&V)E z1=pBVm!pRdr{^%;-8y{- zP>fkCnHl1`t)#J91eA5?u%!z?DM$a^Ov3C=h#{(ZjJ3GGR!9sEBmm$C;I9&K?@vYW zgVM5lwTS=JE4I)Ij@I;3Vusc+7F#A*=Sf(e;tP2Emy{YI82|c?@0r!rHrlCC*lruo zWY@gF_rL^&mFa`e8G2;tHMB%*efm}?o*p?@)n}sAO9~}f2sLj+PQ!o9Fh|B zeGnOubjG)@&Ha10R3x$RTU>u<+d8^X7Dneji&E`2`pF$JAoR=aKx4>lPp{|t|DP3( z?7ys}E2=1witGMewo=-x_#=mEsRoq@oQDSnqfF@9Lxk4FZ8d`M3vgMi8AG@qkJz_K f;Q{~mRf^jZry=nwCSx^m+mnq>nHUtGB;5TMwJvWd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/gui/windgui.png b/src/main/resources/assets/rpmachine/textures/gui/windgui.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5151684400469039de1346c54c3ec3377acc78 GIT binary patch literal 1959 zcmcIldpMNa9$w$fm|+^Xav2Vd%}$YBqbY2XDKZ$hs2#Q#&PL^NnXt#D%;3;)WU}iB zr`+}yJGVG=5#v^}X-GZ7Fh+(bxu>xkX3j_Z>95Y8XRT*F-&*gpzW4X8cRjz~N_Tgq zC}Op-002ct2Rjb{Ab1J^c{Kd-y-*&!xr*|j90S$8I&a|xI*>}S1G3Ft)LeEAMie3) zyrTe6YTF#pgY3{b7{o+7x*W%hVo?YsEAq#;oiMW7(eCKUSpJ;gDBG8zi&+#h^KaWb zi%KU|Z1wBC@{=_m?X%Kz+UM8Ads6D|q#t|UJCCZ|{NZ`Z&W|rrXr2*AhpglJQ;Kc~ z><+VO2&cV@$35RS*wa!+5n* zvQ}#fiA4(OEk96CN8hcj{RYsKuW+%EuiNF+({A^H_uE)nKo7nT;_G(<74$!sg9g$J z=b_QHUXP}=$0;?khwKN7BRmVnyzkA!aUKoD>CoatI{V4)S*ByHKtOysqoPd!ODFAg zIFf{p>&2&W^@f1EINo!^m8-I_b3)b`&iK|fDt$Y2x3D0Sy~9%|Ri#fc&6Q&mh?fF6 zh&BZdh{cguUFvwgCRnu}FKv6h5Bm8>v@EkW ziO(rK9dLFXr{|VEHNugeA|3rz7ntgQ&CM-a%Xov=~SQ4N}WSOK0V?;>Xe zSZ@$CR#!mW?pKLXKB>iuRMz1IyYE-`0-@xU%}G4J7US+B+s)i=v0n`jpRa3Kt)tQp zF*(9P%g&3mwk~phfXY(K?!ItQeSAc?c4JFpm*-E%wQZ0@zQUepRI=H7C^|4#z^s$S zujJuz=%wx>T(_FRe04si6gA(KIWbF=lQ$HF}g(iup|?x zNS(y$eQZc8^OOHAR`%>jQrjdJJg1-&^(_yeR?1<&-!N>})MRl$%9< z{tLiwn9(xkxGaKf#R$$r4B2c9$sXe3awmHHU#O|UDJ7Hk2|o1;-~GF#k~IEOHg+oD zY&`IdThL69ihsNx{)9$!4?7zOE*4BpO?mnG{ScO05^DIlJOCBI0sys@)_+xu&(Iq| z0S8%AS@~=o-R!sj)!^Wjzu%tI?y}H>1gX$?Xrln$;u*g&Y_9M zttQb;roEM-8Tp@-zozkv6=Yz6(gQ4w7hAt8VM6+{$V5&wst&akokgjeHY}=c?aaGO zzx@ai$6f8JkI|C< E3kIwec>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/battery.png b/src/main/resources/assets/rpmachine/textures/items/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..53b2783dba2e8d8ab5031555709a45919c380600 GIT binary patch literal 465 zcmV;?0WSWDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0YXVcK~y+TrO;1H0znwZ@h9pKS&D{KldH&T zQCPHwwj0=7+#ty45NK2gmINAG9m3cs4;{*D(4j+b!oBoLI{99H&8}U-4aPcr_b}}9 znLpIz?SJKcKHKt*wTro!iEzXKih%f= zZ#$q?2y_(!dtL%Hg7QGTz5w%mA9O1KH%l}OFn_AT?CgQ=!u{d8IDTb99ta;ZET6CU z?|mQ!%c5c4z|GsyJ$CgQ5yMh|TQoO|KqmMjzhO6DKt9kH8Exm&EQc@y00000NkvXX Hu0mjfSg*FZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/emptyBattery.png b/src/main/resources/assets/rpmachine/textures/items/emptyBattery.png new file mode 100644 index 0000000000000000000000000000000000000000..53b2783dba2e8d8ab5031555709a45919c380600 GIT binary patch literal 465 zcmV;?0WSWDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0YXVcK~y+TrO;1H0znwZ@h9pKS&D{KldH&T zQCPHwwj0=7+#ty45NK2gmINAG9m3cs4;{*D(4j+b!oBoLI{99H&8}U-4aPcr_b}}9 znLpIz?SJKcKHKt*wTro!iEzXKih%f= zZ#$q?2y_(!dtL%Hg7QGTz5w%mA9O1KH%l}OFn_AT?CgQ=!u{d8IDTb99ta;ZET6CU z?|mQ!%c5c4z|GsyJ$CgQ5yMh|TQoO|KqmMjzhO6DKt9kH8Exm&EQc@y00000NkvXX Hu0mjfSg*FZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/sonicScrewdriver.png b/src/main/resources/assets/rpmachine/textures/items/sonicScrewdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a2e84d4a969ee38aeea707d9a5399781a44465 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wyq+$OAr}70C$_C$&e7bN{q?`3#FB`A%^OxVov9a?AHieDy5#5nQ}u14 zN&i>!{D)T`{Kv{mz?_X-_H8*|MM^MRL?R9 zFfTcH>BNiu>w7Q$e`N6cf3>=(a4N?g1_8EAhKCNusv8s!mhJjKmpAl-R7(;APqWF4 zRUQA#1E&32uc!RW{`h^N<%$u!42iCW_x^i5s`;-h!~5@h`tSeo5n_E;1?I3dh^+Sf z@SlHE09!TtbVUoG$_Yuytbu#l9+)z;T;%O6H+STWXku$HI3rLTy77P2r$hgBO`duf zGqgBLJ#ne{pY6px;TdZR&!vtvk}aM_48s4@85nNQ|E*xUzJ>=FcnqGdelF{r5}E+o Cg`zqD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/voltmeter.png b/src/main/resources/assets/rpmachine/textures/items/voltmeter.png new file mode 100644 index 0000000000000000000000000000000000000000..4785c1ed49f778a7879fab88dc1c3c7338a7bfaf GIT binary patch literal 522 zcmV+l0`>igP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0eeYAK~y+TrI5X9!eA7Jvx$PZDQZy3kK#`h z7ey>o5eFe#FQa?c?8T)^Z=hGu8%PkuOUO02iG!2F+q?(9n51=(9(eQpobP?k$-CD$>2wzo18DX<4~N46 zyWI}^{T@LO$jV?|0es(&K{0?qGa+FZ#?{q5LjgWC4cqNj_NfjSG%qtR%jAbh6)FUenE>#8!%G_qo|*-Syy z3n$}wJNKw>jKUKp7Qzo9VoGSy(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/windSailWood.png b/src/main/resources/assets/rpmachine/textures/items/windSailWood.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6b09d06e3be08c4f937de686750e988c27c318 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3c6+)whFJI~pV+p3IY)D6_SgTCO}R(^r~f$l*Z<3upYqQX7?(LpsIVQn zs27w_x1je%{e&usHtB?gN59`cfB9W~)*SmVo=L`GkALTLhO}R05V*Ia>f8Ut)z_Oo zu5_OLK;j7dNyY4zL=k2`nL8i;-`lF3@aM@nPYbq>jzuS=5-YAWJWOYB<>Z_qe&}z` zKk+5M{+;*z)R-(F-y(cy&cUCI>2U@@5C5%KWItHtWm6z^tnH)k)yj?14s!p_Gce2* X&$zZ&@cB8QHyAu!{an^LB{Ts58_I=m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/windTurbine.png b/src/main/resources/assets/rpmachine/textures/items/windTurbine.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa176f57f094096cd1bcaba889c805eb5f01e4e GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hVVGI+W;hFJI~pV+p3IY)D6_SgR>k45la2z&6C|In$Rm;|Y|i&q;Bx)^`G z5=!vp3i^|9w0gU4dp1kw%oW^!ri(sxFyzQPFm3DSgR>^8o|nDY-- zw!8ypyMG_-dV0j-U$%C4qo~c!Vxb)E4qhSVlLxOPN-zZLXdU1R<2YnsC=l(|B6~Ps z4%?Yom--e-%$A5_Hd{ZpJ&|D-kaePnQK!J6Yia9EgF_4|ZEN@rH(d2z*8DhzYn7x* zn@q2Qp#Yof;#oZA%NP}Syi`tPGFmD&8g#5(eun*dGtlV@Yc!AZnz1}7nb4@flhkaY me4FR61lxozO_K-q%nS*wOe?shOuc~N#o+1c=d#Wzp$P!58jq3y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpmachine/textures/items/windmill.png b/src/main/resources/assets/rpmachine/textures/items/windmill.png new file mode 100644 index 0000000000000000000000000000000000000000..c06b03c9896e5f19fe0f97fbd10d1d161b6beb46 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3PIVKQopC{5A(r)(ruR2xpM4I7{OC_U7fWn&PN7%m^p9mA+ z6$+m4fI*s}i1&o|f&xZXJ&m>pYz-C)juTWo1U(Erf?Q|4-ru8PeJ3EGLV>5vML$ko zfXhMPST@6nuo>9}iF?=@=5T)!GP9I8_MRzWLDM1D*)lwjO<Y792RL#(ubhm!Z`} hXBSAJz_I_547@MZ-5>EE5C!^*!PC{xWt~$(6988we6X0_M*N*yxZqy<^gt->nJ9f%s2C!Kbr*r z*0i4kIOmw>IlcD`A*hKjG0~y`Nkn5v^s3~^naBds-)T&>7(lwAH6s=`!o7&?lUUw~ z&f2sXKt{&&Vx12qar_vhnntxGfOOxNHbL<=(CCx~&@tO9Vt%#a>|wy}CT#^hRC7!W m3R^>p#ZNtA?PvVMzwiYhs81KB_2*Im00001aQkcdO*<|#t@3a>SYPabLV*hR+KvkhqbnPmVuP=18|$krodi3 zAuJ#~5^h@yT9Drrcu>=M>L45r({EUg$#00gpYad>!UtI=I_N`Hkr)5~002ovPDHLk FV1lXHWd#5L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/0.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/0.png new file mode 100644 index 0000000000000000000000000000000000000000..ed70bf42ab3bc081ca2965b54845a86a8e85e0e6 GIT binary patch literal 443 zcmV;s0Yv_ZP)LS~%tJ6A#AM-JkYV-|y@QIJUyg{TWr2nt%X30E!JxM>qe8#k>K30(CD z`Vs!5w|lN11Vv64-p#r9ea^Y?9!gRYX-XqQ8Eh#Qi0E&byP%W}ii@`!84#OultY0E za1>`Xz&-+52cV2IgK%dy_r&GPDzi|;cY~1Doz`w-d z8O&4In-|}No`gdEb@j#*8y>i7rQW+1IkJXredPiARHD&ZLbQ-7MHugX1NO-=ihcAujFAVS)3jd lY>Q^*#P)I*Was%Vd;#7YO_p^pdshGe002ovPDHLkV1lJgzSsZ& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/1.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e594184e03fbfa79bc3654c24e3f1f49846517 GIT binary patch literal 442 zcmV;r0Y(0aP)38fs1Mpv~v?J+VyYr zpPk-)eh?HnEzaiNcYgOiIG0kCLYmSr$Us(DAfmsO*#NECprm}8FhFe1Qyv8>peTy7 z0d^H+ZGnv92*Q)uJdn-jS!St4y^XNe8bNpyUYjSg`P~H|>bq7DwF!TRT$pC)XYoT2 zE`-3!oIp-0tQ}*w^57nDB+Z9$4WDhoTb)ogatJQe+ye|bmCbjZG@klp1<^f8_kffH zu<5Z|!p&tC_f>-CS#}Rt@|~h$n+n2aC$X+-t^tnOMKo}r*48}<1m|mrXlL#L{}P91 zI8NbUTzr-4ONC$J&|4A2{5|=FE7c2nn<|MMCJq%%jJMyS%;t`izZZkI5kkn@P~sk& z1Kv79+6f~1If!FCxrN~vP!VNhLpF07*qoM6N<$g3hnNv;Y7A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/10.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/10.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f55ef9a55d8cf58037f1804299e98bea1203af GIT binary patch literal 445 zcmV;u0Yd(XP)`KgAB|o7KrF?B^N=nX;4&r8!gLgXg=9CBb9pr6GL zQqWL_Fs%&367s1BSj#^+2kZ*7?Y7XMPwdbejLCg?M>m`Ul42^GtNCl3R-Yt9bDzK`)fIzxWE}zbKLGy{ zho{|5VXIqw6}l7hzf3`^2N2eq2zf4KZ(Oa(ByyNIRMa!xe2X%h&xQ167;42Qa!`@t z9-F=D9(?XY1hiui$GCS3?Jl68%a+DQM6nq(M*wPKpScIf(|%`WyYT z)!D}fL6O(Nn(TenxA%dyDNb=DDG8l)EDHlf^uJQ8prsrrD&K~65Sz1z%>vy|U)4zIm4fbb@~Hcw{rhY7&E^GZR~Cj1>TVVa=d#ZMAA z6Eg@23(`^^`yuL;NArL^X-;bf{QfVv-S1djIDpIAFb_z`scbIRZ%{jVR**SM!aN`% z0c@%^pO9_bLDL>!osF0W_?;buqfG^2v(K}mYNi4C%rye8UA4B=5|jVmgwH+&U@CEV z`ok3VhQ&9jdnxa02#$^qL9L5`^HTNPwzf(lhlxW)BjfFlD6{!OO6vw;YkA+oJi3Mc5U?&PNQo4V+k}m>tQEIGnezA+*sN}WNC002ovPDHLkV1mJe#;E`R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/12.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/12.png new file mode 100644 index 0000000000000000000000000000000000000000..84ad9e7023872d99fc12fe922372027ecd1baab3 GIT binary patch literal 437 zcmV;m0ZRUfP)#;0#lW^-R^X%L6j4k4tqmAJ>|pmrv+ zae;{c2E;L*+``BO?1>soVWQh1>{n&2d;+qo(_3J(x&@B&Z?{ksML5F7@e!fm(Ad10 fo8E$&?B2o`QB*c>Q(SQU00000NkvXXu0mjf4Qa(f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/13.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/13.png new file mode 100644 index 0000000000000000000000000000000000000000..6a54b00d4f83b097acf5806b2f81d12c40a97f72 GIT binary patch literal 441 zcmV;q0Y?6bP)77$Z2sl_s#j;J8%xgDUKv1k)|{$bZG$L&1~+;$Ja?_sd@i7LcaC@!k6&byqV1(E&vOGD+N)P@b8cd(**q-ehNZo zN+3Edur6izk5R8Zxd$9d^P1&@=b12jO<2rjp?m7?0SUR4&H39TsxMUq(KO3FU|9m# zRCz4JzRO_dR9>Pjxd)hm7NT3Wg0R_GO{ke`K*7F2ICucfW69HF(6u^D-Oy}AsEI04B866yuw9n3&3%wv9(RGwstX+F-?~r`1vtXS-mc7o jLj&_lcH9NEdDw+73L-Z}u-3I}00000NkvXXu0mjfIgG*M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/14.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/14.png new file mode 100644 index 0000000000000000000000000000000000000000..fcdbffea44e18f457163c967116d759568839cc6 GIT binary patch literal 437 zcmV;m0ZRUfP)CZg9 z`y3@Ga$20teRF>IUglg%QyLk{z$6o^!Uhrjt?U|TIS)$7Z<8j7%?>#zQV}IlnheNq zgX{{(EDa&tnazFq_%g{XHDg>Ls&|GEo`lEd&TM}70Eh>=3Zf?Ab;yHhf_@f1rOt)G zqEt>Qsvo0XefAD$NK-v%;3GVRr+^?(%74rdHd~R5s(A(!tXsrGhiYuYpH%zD^i%JEe~H60a8uZK zi*HhoQqk9W7@Zgr!Jb^jsFh`H{QzW@$G5;{bqgHl-)^BG3b2KR{T)KyrlEN$ fH@*ec*}a7?7Uej>J{+((00000NkvXXu0mjfI>W(~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/15.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/15.png new file mode 100644 index 0000000000000000000000000000000000000000..dedd77cef9ad667f90f175a26404517d2fe7e264 GIT binary patch literal 436 zcmV;l0ZaagP)Q4o~T)RbwabkdL^i$X1lAS7FqMNrV9O}J{&#zm{3otswe`ZG`O zK1T_P92aNv-hAJ?1LsnK3Mf$t1{v5?ED+KEDc3>8Dril7s~aGOD^x*^YG^2p`GV>J z$l3)NjfsR`W_Tnn-{!$0@z5PsgM*2LC*iUAWrjaJ2om8(DUp-#?~n&*PJSPLiQFg( z(jproYOse^^VPfHR6v%hLf3VqQYmCJHAMYw?}Bw9VA$zyqjTGpl4W1syC5e747JZY zsGm5{G!6cxjCVmie1%-mmJ)^&aZ{do7TD$!v}jk3?e}HH|F;keE+AMaT%NJp!jXIU zA@U-!`kqE;5JNIDgcg2~cPoLuY$BJ5OGQ)g`A3x*z88rMlL+)wsDYjg-!U8woQZB+ zAQrj?agC?DFm?rdN)u(JjLSY@-w|g!#~{<0?E=Gc7r4%U?Sie?uoM$VhlHv{6F9#$ e+XeZuy9?h`n>Bi*4@jZ_0000EgeMBLrb}N^MQp}76oPog%~ynt3g47CgS8aXkvnspoutX)U03N z?^~UHd=M0Q9jwVdXMKBbSev30MT}xF$;7s>Kt%s5z607wgVyEW6%)kf6s3@*EOH_@ z8IV2#S^FR}H-K(6^t<>) z0(W8ttHOn(R8YG_vCwf2xRBhbOrn91?@W!YyCQP`A`EQ`z*OS! z^oA*H4T~RAFH*txCFpenVQ*8e@TlJW?wU#>hlxW)BjfXrD6{!N%G(UXT@4`Mt}5{x zn|JIG8NVaGgt7P%7fKF+|=@FD1GBj9YxyD7CQo5*G2Qc)kg{843wPefepAk>Nn z9cAZij`hcrwR^t1RW z2&Yp5i_-#*RLDHUR^?tFurJMfwio?Aq1PjnTn7PTQy*Z-u57-2O5*XOtRSWl*9Rmd zfK3lw7uPQtwA%!)v7iqK`x_`%Z3SU-&RJ14Z9v|>LL{)O#x{+Z+JDwO)(8Ac9G>nl zg`HvXP3lf6^g0i-Ig6;jg|P2Jy#+jVl|&8`hl)nVn{QEO^SPA26@{l3M9@=H;x{(W zcn%Qs9?7*%Kpf-IEp&%~iYOx`QfSl(>#nS=?SO1|d<$$=x4?1!?H2MPkF>C{y&?ZV kng-@2XM78)^Y9kF0GaJS&?O7R;s5{u07*qoM6N<$f=NHZCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/5.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/5.png new file mode 100644 index 0000000000000000000000000000000000000000..dd81b4f1bceb9980a2d0e161522fdf2d5ce62ae4 GIT binary patch literal 444 zcmV;t0Ymy>JW5o8 zE$r!l!Uo7%1EuW|ggdjjFCQPKnWe&>O9b`y2*Q)_*xZ@TFD?Lc-mZeENq8M{VVa_! z#aBVNm=Rc<6|kfX?-A;?d-s3?X$jzUKCoxfT1;% z_>Ike?GT23BG)wVima{df-;rKEwEYL0>}BcTPTVmERn&^ mCZS-_$ehScZb5Z+Zs7|g*gl}eo1c;Z0000~_BZ^c$Xku)eIz73inHm4|sEM<{X za+3k+A}Fx|GIK)+cV=@>JU&h`3r%b1@VlBr2v5Reb7wZc*#OMyR}vy8;dRJ{X@Y(h z-xURCLJJNDQbGY&73IRceZYY*9~nV>R&MaIc8YSi1n*SYK43|7W%KiK9WR}03DKPq z`+$f5uxZe~#6zQn*W^AlXV5-iMn6F%UX&0v=jYaC%{Cwt@4)cv!7awtoguM*N&LvB zeZarO;ptl`>{-Qu(4CO~X&zcL0K?rCD_qDouUeByx;4KEvD2Rw}g0S~i_SV(DOd^MgLq!YY)3+$I`9{b$i9qf8;a9s-++(w* zc0@KV5cFJvIL3=xm|1{^QirbS81xATHBl?KL7Cd}7T7Frf#dw!EfkajOeKSpBSPM! ixp`}Mc?)u~bqinD+&dE{*yYgx0000JEoli55F&6jy*A-{GFucI-B@Fu)APiFIn2|&PkDmhF(z-_OZ2PDK)Hn;m%=)UzO#9@n?2Sfyb zP4`b-v>w`MHk(jw%jN-o=Q#@NyAs0YL~L8uOaqM69Rlt{X!fXBJq)+43LpP_vw(kz z!!w$sa4;#p3q1;XUzeaYdk6M%B z9-H0jF+7e___PZU$9Q@RqY0p_Y$C42aaJd6l|-$u4@#A0x4>q33moU)ZoyCtq?Hu* nDui5`#^%WC>=xwY$t`>V+ABfivgs&h00000NkvXXu0mjfk08gr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/9.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColFace/9.png new file mode 100644 index 0000000000000000000000000000000000000000..4822d3528da9eff2e073b0234f331d78972fdea2 GIT binary patch literal 443 zcmV;s0Yv_ZP)}-UF|W1H{rE;GMhgv02Vwq5+XO@=a2={4E-#ADhfI_ z8=`hQR)qrY6I3hD)&WPtti|J?;SkjAVlh{T*HN<$NQtRz&h|Sfzw{+URa4dhF$M_J z*3%tU?yo?t7UtBLbwJ2-j_77pLfGt2R%FdGppdym*mnrkkrJ!N;ZY?imcasKTV3Q7Tnl0ki+ lkT+;-US6Btf}CvL!WVBaJKGH-M1}wW002ovPDHLkV1ho9!2SRL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/0.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/0.png new file mode 100644 index 0000000000000000000000000000000000000000..b151b079a1e865dc621648f82aae7cc461ee866d GIT binary patch literal 650 zcmV;50(Jd~P)YuW6n(TE3I&FN7KBQx!6+>S0y?B5q6RCaI!&8sQf*S}M{A5$aZydWP#0QOD(S)| zZW>8kk(lrYWXF;ntXUI62q9s8I`7R41x*?!xtW>Vch9@$+;d4t7eq`K!xuvETMnYW z>Ax-Ofo0bTk1Y#_d57hkmR;CQ4?!XckeMjRoX&qLfO*G(N$Wnw&D%Wyujd)0mv7-s zEDr+YRDhfcVBMc&0Nd#!#3JumE-q$}O1=Xhy$NzL0zxUo$rV;`r~=UMj7z}!&quiT zeI3sE$LwaU1D;<45u8d;fZIYGza$Ai{C;+bzQ3-fF#XBLH0TE~a$#`#3urVND3wYe zi{2#mq~|yggkA@fLfSpTC|I6M!N><-;6f}%i(0J~DwPTfg@V$7MCJxGpdxPiMxl?H z!1;J|Ivo^?MV6yQw3tks1+h*j04Wk2n8GbN0%JPRr`zqKR;wYO&$HYpH;ZB8Ic1ER zh}XzvM9B~qRDf!=ih8|{cDs#cvk8+v2E&M=5A}n^b{D!pQt`n!vBO0iC!)xQ=xyb4 z8Aj0vE@Xgv`s2V9to#EE&)!iw_(v4^&{a9+j8kNGf%Oy^+7R`Cdv#M z!;(tjQ1ya%-^Ku5eLi9a(u}mUum@*k7^*XZB8VcbsJM>2snX&xe{H%k14XB6|pr=9Nd;)Kl)5r*po{>)5M!HlKU?`AM kDD0)+jEP)YuW6uq<^3I&FN7KBQx!6+>S0y?B5qK3AVwnIu%6SPXHN{!JfE~-fvek2Mjm2}Z2 z#-u5U3pXY;8jTAV{*ZEGk)i)HJ-0M)@UnzAY6n{wl&X=mxM$Nl4Z+_;Qo5Tht5Ahx6Fh?qNq! zIvp?y_22-f;JQ5qyBvc}O7I+e^sPcTSRpj#NOYjlRF4Ks#A;*^){FyEM8=OQp|vP- z>=AoRBPT)b5dl!3c+V8(^oR{v@ViF%xlZ_0CcK;xxj|_X{q|F0jHZZ}=seQYhgp+? zUg7Wt;rklltKP1|nt^RV=)?Tr@~prT%L^Y2lNSN<9f?As+J}-Zm}-ZVupv19qGt+j z`8xV1mqZ8uh@xM*sK>M(@v4_kA)r3$0T?@R2g|kR!bqkl6EuVcgTkKS1@)ST13Y}a z&kbZ6X<>F7{#50Nf={PVqhLowHVrn``#TkGq`y00yC9t_2@1^0SKOD;(#kkYCi$gb zs>+QOeHY~&bZfvwWB?rva;I~6T&$z1_&P>9ZX4NBF@U~UK~U&k=k|X9m>rnw{0Ha$ ViW1hPo%#R(002ovPDHLkV1l2qAY}jm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/10.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/10.png new file mode 100644 index 0000000000000000000000000000000000000000..0e045c5f1e5bac3831707d3fc13c9d0e697a893c GIT binary patch literal 637 zcmV-@0)qXCP)YuW6ur}SC=?h5T1Kd}8jR9XAfQ7^BGzD~RHvayO=vL{KU!n7ii>K}g&&E+N+n&i zi7{zP;=+wdjYi|bh5zh0@4XocnlvtMW+wN&Gv}OpE~TU-a#9X&i167gvYzbQ--^Jy zsUhNTA?VrQJkFpa)9;v9&(vyyqDLTC>5VV$zB4T&VZPNJe}hgb}az*-VCXz?%%|O_pq(1 z9R^H7Jv_iAcyEuvr6k~#Q@qD6t=L_7Bga9$5dl!5WX}{Xo0S-nP@~_tPCv0kpD;r&d2djjM8E5V7^7|C1v-l?^{?mSm;D^z z;p;sfAUjC&vs=(ItA`STri3*LcT8l{U}L?%y~>01Hv_f{@|i^;fkpYEZw4)+f`fFL zANr;1JXrB}an7LI17;!v=y*^#S-|6kI+|**6QrZIku4Pi=u4D@gzj~2{|A80z+UG+ X2N}8C|v`R$Nrb$S2LIXx6)|l!P3kuajtskw3R^y@yU8n_3R%+;? z1rbUEF5CzeMRDQ6e|CKD%}kmo6c?BGhWqZBbI(1Oa#9v0sf0H~_{@UblYg771k|-C z5@rjL;Ht<))is0yH$jC8XuJrTl+p(R1Xm*%(HjT{S2_U6#68##pCVbA?FDGN0BsjQ zZ;S|lmHG}!h36tywwkC_pFu002OTefcnf7ZB?`7(0Df=A3@q&4!nLghM5k_xKYI)` zZ60Jqo!|hMj50pjHr}Vx;t@aJ&ebsXDkU`N22kWYWZyBE<`?Mt7U*KKigo)wHVvc0 zfVWVO4~Q1jJEKsv4E%CVf;!pge(o<%lyzPsB5H5=H96vK|A32*X4i~B7^SPRP(?}*5!!N>Ywb5R)SZw7o9OV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/12.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/12.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d87a8811a970edf3270714e60ec4db8ad4c99b GIT binary patch literal 626 zcmV-&0*(ENP)$a_bp#SaZ`*F?@YI9w@`_9?>z0dc&&-=WTcjQoZl<|oOKUt7@^8Y|L4&PxI@jw?L z?}5mLeTN8o?t_X|&|C?$;K*DE;5`T-=0C=`ci#p`#h<`<{u-%ja}c0s0`yD(|8YzJ z?6=QQF1{7HirzuJ_6BNc6*OA}@fIp{O%$A(0Q|cX(Xjpf0q%U=MtJd|c-dm0s#_o} zEQ14VXchc041CLE#3g=yZqYmkG;B_TbG_4M)aPoM@WOfVa?& zj))d~j}maJS-6zE$nm00R$QGXT%RP#z@UWz4Y-KA=}|b#9w=!Q#w=keA#=Ql7t_Qf z$Uh+g>XaLp!a9rWm;l7*$rh z!RUINWw=J9KHLw!z->6PHR*$K3L-+Gb5TgXwlc*8)7?<=E<}^>2d3ax?_qd;Q!@BR z6n1He#UhK`Zct1iqQ4vfNL+f1TYK-Mkt|W>XbcUrg;UcD`rUv4c=7Q}7|1eGW9yf^wxLTi{k+@!vq#*ut+uL0tN+>%v%>FB!q0 zUjr^82e37$PFL}&*+xeT*+#l(8~IXkfT3(%w$Q)Mz5f8P7+CB42mZZ!bEZnv)Bpeg M07*qoM6N<$f{vjlcmMzZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/13.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f6467c09a75a2a98f331ad9d0d0243b85d341c0e GIT binary patch literal 626 zcmV-&0*(ENP)L=&_L;0HB+fYk&wBmx?w@j-2P zki-{a6JJgI1OB(;{n#xnCd7xy-Ob!{?#!7plvOe)Dn)!I!Y>wNpZq`Aio?GVK|I(( z*taHf5&s54-epj}3>q(hCY98Q1irN}Mgn^n^3^*8iTGn!&tD@^p6?}S+XQW!Ah0(g z2>Mn}XebP)yW!?aDnUvR%;;P>p@ zCU{*%XaiCo?gxMHHk5Ql`e2Ach*J1S6q2vG)|p_Y2WnPBY;31z3IY8d`X}aO1^tqpFM0?@Pd&n|)op1cN0f0I#H`)If$atJZcq@ce>@Zha*Q-Py@^PE z>8OP;YhjgQ9TE97_*kFqF9{!xF2$B%K!iX M07*qoM6N<$f?QV#`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/14.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/14.png new file mode 100644 index 0000000000000000000000000000000000000000..daae6d677db23e6ff98d4fb00120e1ef57e576bd GIT binary patch literal 630 zcmV-+0*U>JP)D|^mBJxXl=0|snJ4dn^w1>iB(gv6j>sPCMXHw2N&T$!DB>LvezG9zE0@v_~4sxE`{ zhzt&JO)uexY2qN25|{Y-eyNJ_outs97r>+Bptw$>t-7%7S3q-#3L54k?CW~B15TkH za|#N9`(yB^X}FcF$nm1jtoRK(H@!~Tfl1SS8gLQUl0$G6eNd7rzOaIZ&na@eh!@ky zNsu-o0jiYgo5EEVX|Ds{H5b0J;=O=^npXl0DN`8qoRVX-MZ8GoP@nAw3yCR2jc0uTV<#Tq`uessk}b+4c`K(>+Q zXB&v*SC1%!8HIIZflbu{&G*GR{0BVQ^GFp#cF3cc&x`40fQ1ACqS012#sR%);V Q<^TWy07*qoM6N<$f*D~XG5`Po literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/15.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/15.png new file mode 100644 index 0000000000000000000000000000000000000000..d797b89fe3e14c11323e4b1853fbfc68e5e3a633 GIT binary patch literal 622 zcmV-!0+IcRP)L@_p1?al~k%OcF z*y$XjUVSUh8fF*m)*HyRYoK#g5L0N-MUimi0`PlRQ?T*<0q%U=Kz#9`sO)th%j+N| z?gRteP#XAQS@>2ch)ewZyw*nMLtbbw3=ohikS5QBKZVJ95K>+i35i5PoN*E-(`*V9 znRNi#R2rGWbvugFK4i05WHK3~QYojJ{eMcD$9N#?jL{SEGF?E8#<1i9a0TYbl{tcw zb@(S7eb^7-=xz9lEyo8l6oW?Ui70NHx~?N&1|XIF&@=BxrVx?uVSN6k)4@NY*q1KZ zv1mtWD<-C(nJ-5G(uv2owf)X9k|)X>O=HESaO8Tyyc-n&FFqa%19?VTS=vXux_LrD zwJB_qJ`jT-?upvop z2DF88sE@Vac{&8An1Dk_adyU~L-i2b$~LP0DrcaR@h%Ohh>Nj)*mEujF%hj$3+sV( zmZO*GWfD9G;tg_u5=nMV;g%7J0UJ)jCpZorV|Q>D6<>wr`h_v{I?wYlS|VN}mysns zm^1E)@mnNtAdCo$K8E4*-jS bwa$M4v=)-n*(iGS00000NkvXXu0mjfwVEJ3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/3.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/3.png new file mode 100644 index 0000000000000000000000000000000000000000..474f1db354dbf662af0f211f7a9b52b12b698e63 GIT binary patch literal 655 zcmV;A0&x9_P)YuW6n)cnC{th{lI=;=>knqTTK*JD(S)| zZW>8UcP1`enYeMKYq!Q2V@%xo3y$;N%uvvzadGoza_>9uo^#J75iX1bm%tN3@LCO` zpY-2R_rX?n!{?~OWi7It+g66tat$Pw0vU>fjBvqy0jxzA`t4QpS{IuDeqRB~>TUQ_ z*>-@24$#m6?A3k-uvpqbBDTSDNx6nh`VPeSS&*YK5K19QPOuBxIspByc_idsUdN^9 zIk-n}u$PSvL~$BKa%({WE=WndQWU%h23Zk3pH5~l_$a_MXax}XD0tHm+`Ri0mkaMe z&im7-C`;Iqq-F<{Ldo03DA?u(Ac!HD`3TF=OUw7aBfs_$*{i!+2MQT!(}0RN8|a29 zVF4cyv9kFSQ}b_Gj$WddN#8*bd!Gi7A>ppj87ZA_Zt_kUE^gdbWg`jEY&i8%i%&kDWc=^uZ{odz$pXYsEO4<_0+OqgUgkMIGd9r_BH4M*E z0AXJhs(X>=0-h!KU5`NNJZLBb8nMMr1#mB_==ZLo*S*jLh=iX*fAtQL{A4>o-2|wc z0N&Mp4zN(#LN@(@=W<#F#lm~YnVX=CX%M53qbs~%!vtX8m7s!|+GE`RK7+vM6aKQ* zfh^5iEXFUf^XpU*gP)^ZgH`~il!9cxfJTF`zHU4?9w}g1e}Oec zX?DOUltNvcg6HV~oN^ovDamuJXn&uuy-g^WNpzsoNSg*s#JOlU>{%D2sEoryLbWP# ztcVp;-&v5iPXH7t(Kdx!M#Ot;I6fvE9T9eR2rDZh*DVdB(|Jye(Gu|*T}FmFFlGYO zYJ}Zg!odMyZ;#-zXW{4)`Y=CueD`3B7laRb$&VnZC!&yeZFAEQOmjj?IuIKC)HVgL z{1BbPcSHyOh+Z9N=|% ziyO!?(!|&@0_oWk3aUY2oOsp%B|X^0 zOCyQ#X5zt8uX!RNmBb}4Amc$mE1%$x7c_sutyu*8wEWblLtZ}cGJ zWdELK2(Ar3LY^jk&Kl48T^sN^mO!Z-Xekm$c z^VrnZv8^cW4j6@cu#Z!4t&G4f$6%8ZJjaTvKM3VdgxS|5I?!mMO9Lk2a-<*Di~~|c z#`Rx>;yaOJMXZ>H4ujl70-!+gt|?s5BQ{_`ZI7`2o3QkSP-uxc1^)8UqSEqoao>mQS?iv^_bKnzU<{w2&lKa07ee2;$r22Fp??C7!6>?ps-_j zLA~tZ0Jk3Ras!!0nwi>!Kef0|!KYKGP_Qi`n+6-}jqOElq`y00yC9t?3JT21=iFz} z)Jk}pO!7+~RFxYm`Yg&j=+uCT$N<_J9_ dV0K`x^B+`;k1-4~q;dcN002ovPDHLkV1f{RAvgd4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/6.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/6.png new file mode 100644 index 0000000000000000000000000000000000000000..1756fa0110bc864b153d9e67b2a4f70b01c478f4 GIT binary patch literal 653 zcmV;80&@L{P)eUIm|QWeF*I^3BY=x`duC}imvFW5E!*mpH3V)n&VTzoc* z!0qViqq|70+Waeudxac#}%;OYbF#8!PrS#ye=%fQiTe8X71E6|7EFP!;_RBki?~Y^fMP nTfC@KXkO>~e*l;rnCtup3nG?g*tsb>00000NkvXXu0mjfIFum8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/7.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/7.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf40f812f3b61834d22fcf2b2446848dcfc5188 GIT binary patch literal 630 zcmV-+0*U>JP)YuW6n(TE3I%2cS`aF&2BWkT2;JA6fwYLi+&T4S_|i)zw^y3n#xNf$P8 z(@5gh#6RGFJI;MGL%}AEi=y+7igwa`?;`e(8sqH~oA2VR-fe2z&eR zyLWjk;Ms%E^#Ckg23yL2t=M8`0=Remn3oPP>)sgxM8Z#@y?BF2xjqgsFaZW8fOIg= z0d~5_$fe)$SV8Hbs=kGoseoNhgAs)SyT%KSOaS`s1!Zjfc!c}iLoi%(ocNGhEAu0cDs#Qt%hti%VX2RGA5lDj4@gw-e6aeVG~$20q6zd z*lad=yDobUjwwSQ@`J~F7q+-+_+Xa#5M=%nQS>Bwtx~DLsW>4d9SALc7@LA5-pAzf zn$f{2QS_wi1frkBmXA*%sJt2jSUC3t&F%Mwkt|V`*bHhWg(K4o$~`X!c=_p=8^|(J zZFL`k^yUc#zfNJBg@z*1G-#~P4>!4y{_TKvLAcT~D3FzJN=5Xwb^K1Hc+ww5;l_%6 zjqwgfH6RfQV5mX)Vi~XNUG!xC&`4)(BP|sHOvI}Oh0%2${0D&5fwj(m0VJx1OipC| Q;Q#;t07*qoM6N<$g71$RoB#j- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/8.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/8.png new file mode 100644 index 0000000000000000000000000000000000000000..534c6558fcfa724f296b20e4b14131581e8b876b GIT binary patch literal 637 zcmV-@0)qXCP)X zp|3&zK>yp*J?H+I7K}c;oO^lS^PKm2-sdF|Ll_A|0$&KhPdSKs(tk(S2it)gK1UZW z>psi5Z3l2#o`A$sAaik$1w-&$0PDUB)Al1wTK9ASzb^;r)m!*eYr_D26`-#I*pH?e zz+T}LiP(FVONv!w((k~>?}A*7flvxba)VtsQ32?8)gxf*`%^spx&`;*GxoC90ncxO z2yP`Pz`=p9fB z1@9Q6V9Uzh!H)>pi-$Io6WM^I5&?`^Ce}Bnuxc^b;QXCmQ(=x zLakOqtJOlI(SXI6fN4z8hx)3#Gg0Is`dX<}f>|_!i6U;GYT%5!Y=XZBGPHlvA#UsW=8tE1G)>`wGD*=welVNZFHqg{E9|d z(Qi>?#tL?Vtb;)fsE8Cm*C2H{g*R&jR0WrAr1Q3sE)@kB31t)tgX`S?4*;zLZJqxB Xc1M?+g<&u%00000NkvXXu0mjfoKhtY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/9.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledColTop/9.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9e5ef1062c32769a85746307669b1ffc901eed GIT binary patch literal 629 zcmV-*0*d{KP)1U*Skmx*4z% zYT+SXg6H`JoN@vVDaH5rrA7m^u>mTVMFu*}^l89ET!{_CuDKw^WYGRTs3Jt8zc)|^28EJlQ z8^O%-X$b+NgjEW6MP%JzZGC;T%#HMS25c6jD~qB8X60Mnn`rAx_?1rcL%&s(8!P@L z&NJxMfQiTeT@CUV^LV#VLrV#Cjda#DvY}#tfkaW1&^ykZ{{UDSSmXQ$_o;|73QP@c P00000NkvXXu0mjf!iF06 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/bundledFace.png b/src/main/resources/assets/rpwiring/textures/blocks/bundledFace.png new file mode 100644 index 0000000000000000000000000000000000000000..5fadd6c466fa59cbca2f7cdcb0888edef1bdc148 GIT binary patch literal 448 zcmV;x0YCnUP)_W8QxUC=ulyYL111wB`raYwrV0000;D|SkiT3v<(mFZwkXQxA_buh&}s0?kN)UpQ$ zz6=Mx3jPEBZ^z!7U#68lgqxD&({s)}Uz%3(C@MvKCc>}IMgHX9W;+XY%R<&{BbnHc zXO_B!;h_hhLK$>s7Bs2YeF2G$Bu4ZmjwjYaKrZ_P?(^5kl^5cG10QhU1N7#I0M;7& zC>Gwyvy#(7wekkq>{ZZs0mK$cbY4E#^8tL{N*h@E@ep^uEy23*Nd7rcplOSqe7+cP z(*Bj@%S$}J)T$W!I3XEy162KPNBTt%a6MPSw!4m9!w40yg+}JESWs6-ks9BO z1I!L!dM;An(qt?H4sm7Th=i!sPsO&tb0}H!wh&}crF_p8Sb+eZo)kc^1)j%JZX7U2 z=deSAF$Hgpf&cb^r)u7YGF6EzTv-6Px?!h`) zp@ltvmHCxn0i>OmF~Df*F>cl0dqoNWtCZ;hIQL8ey!f;)1qzCE$BZuDN?rrJ`01VYn}zJ@)i9u+U_EL&&0oneEP);!%=lOL3k%wW3AZK`&1?UQqX%plJzj$9{I81q-=S|>uVAlk&EBpUC!tEjc zDd>PbZkW1|)0NOS-O}Af(qdp2pnju(X_`i^J)s6x3uq$q)}R<1Za%);?fD&fY~H(N s;=}7Y<0MIvAlu_JT<8c|XUK4W03F#K@mhzsvj6}907*qoM6N<$f)}-euK)l5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/highPowerTop.png b/src/main/resources/assets/rpwiring/textures/blocks/highPowerTop.png new file mode 100644 index 0000000000000000000000000000000000000000..bae4b16f54a8b21c993ca5240face29b803660b3 GIT binary patch literal 544 zcmV+*0^j|KP)vR9&i$R|6}qk?l}f?$JS3Az2q9qGc2{#BC_|#YbOZ+j23A`I3q8yd?qgcpNVV z49tv}SSo7lv>QawuBm*PAit(1lx(NXFb-cvuvLv?wh)y7%d)smCjLp2`atRXSqqJv zftA50Y@;%%+;3OF&y~>K0Mj(P8hr#yBxHkqmmMW z5vZ%3PCp8;NPAFG&?*_6-rqeS=*_aFpM|GMY&?sy(~hs9T~~4b zy8qT5Tuz2?)Ku}_k6|XSNx;7z)9647)tt?1y*kv_vj^>}z+O4@f52UjDahzpE9=-Q iD|nX|j|bd*jlTga!eap!kmDKv00000~WFW85kId!dp!v{;xC)`ae(4_df$j^Fznn{~z5-i8kPdedhm@R!Lw( z7(h0IG~ac|Cfa~wRtaE3KrUe*RudjPSPfVK3?Ps{k69-CpQ`Oax&e29fqKz46^xHt zC6aCcNaHE%r2pGYBmW<=h$Gzqkh3q_ru{z%)I43sb123F(HNA3&)KA4WTsFF&Hw3g zM*pjot^cRW8lcFnF$(#=(<};{q!~c@0F;?Ph9E1dP_p{(3#2WeY-Bl*W>97Vr4yW) nX%#Rbfi!CaakqvG&ddY=q|;6ES&BTQ00000NkvXXu0mjf+X#37 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/0.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/0.png new file mode 100644 index 0000000000000000000000000000000000000000..c06fe10efe6aea49a6788a40dca62bc330bcf34b GIT binary patch literal 280 zcmV+z0q6dSP)aSJH8se_6Rf;c(o;1&M*LI+E+#H|hdB#``H zUda0?2m(kcQ4|G;NK0v&B8npTz7Jyawr${{3z+8_UDqiH@y$Heb=3wmO`{-O3F(@? z=vM(@7^-*Hbq&{buLG84!8ndeZQEW4u(9uZWLbu)s;&dL>}i@%mL)vT`^R6<7Ps&) z3?E@K3!#QOD0000}>l}f6kmk)X4F3-#6K}wpNQVClf+2=5fNTb7 z-VjZ^0rP?&hJakcK&&P_c(5AK<_huW+(3r^<+fxPus(|6|FSR$o*zVp0U(VFgCQY3 zD}W3GK+awf4%7^c<_fzZ84E;XP!e7eikX>Qlo|d9X)*jyG-CK4pouEi>CW(fiVq}7 zGl22|C^LZ!K~|Jt$nf76NLxVJ$Z{afpv(kHCpa?`D5rrmYXfnCCGN}w01?GC0~t|B Q6#xJL07*qoM6N<$g2}{Z(*OVf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/10.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/10.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a69d6bc6c1bf8e07798d187577d88900c8477a GIT binary patch literal 274 zcmV+t0qy>YP)J3x(PcIKsvEWHD??HWgSz?KrH|Bt_5Egj(s`?oOp z$Vh;igz1Q%%FAAwiR77^kw$Z%VN%F*QHZu%fJ7hb=RGxRm~>7)hDnpA=Af$x-H&0q Y11aS+6|?qHh5!Hn07*qoM6N<$f;UBWXaE2J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/11.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ad37b454ce5e2b69df01b0797535b601616a4100 GIT binary patch literal 270 zcmV+p0rCEcP)`Z2t_Nyf2F3G9Hvpn> zAvmP@`Dc-C0La;bf-At9d3Y*@Vk{7iK}lFZUT4w45 zs-FT*(hQ({0Ln}tLy#45awh!u1=1E!HnJQ<^8#=>!I_yrISr&)8;H5M3UFp70Pzng U)Z}HDyZ`_I07*qoM6N<$g3dT;iU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/12.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/12.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7cf9069a0e15c39d68c1001239ab1a7f05b49d GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``#fD7Ln>}voqU?>kb#KHbM}@d zrK4H#Vp<$cN*XI7Tm!it{jWcJ!!R;riO}v#M;)Br%~AQ@7|M|6_P~yb(Offb-_r%R zvV+qe*p{=$9D87BDDWa}=K7h|4+Nw;^x9XyY_1bs!18kbulINI83Tg+S58!jXHE%O zxlJ*`MVF!Ko24o5wh#X|ah6aVmRQ9g$SqpvF>7)h&?gL@u6{1-oD!M<=ObY? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/13.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/13.png new file mode 100644 index 0000000000000000000000000000000000000000..6df0302cb94ec43fb3eaabcb633617780b2bba08 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`yFFbTLn>}1Cv>O&I6sZ)$W5OA zk`f(JY|tEZ%gOe{nTK&_OJjs@ z#fJpb232#5ch+9o72RGSJ+cPeDGWSio&m`mjO&J+oTBC~4AfMUK0vQ{d|jTt;% zhu$2WF|+ez!$bScqKE6n!WD8G#g1}1%wgY-`vQ$aA9M sh=9i22WNcNd=xl)OJSS*yE7~dy;r2zE_j}71$u+Q)78&qol`;+0GH2PkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/14.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/14.png new file mode 100644 index 0000000000000000000000000000000000000000..88bdf1bee4e3f811e0e28d6387b1ef85b5f2f7a9 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mpok@Ln>}1YdlE$8GrEXr~MP# zzuGf1GY9VIn*Ft2Fu-3dK%d#;bBW!y|J^@sc9A(J87T2N3qcGcX*78q+`3~9v z{3iq^cuRC#ZDHpRW9Dj9Bc#wP>kz}s^HQyd zhrx1pzxX1{UKxF!g&8cW5A_zrUo@Vqs(raW+-%u@$2VvG$2R1o>=a6nTk*8f#gJJ; z-ltuvX^jTMii_eN(GE9H6e*ltaE8T8-NHCn&_J=#B%8TVhTZtw85Ra>T}4lWL?uR` P?-)E?{an^LB{Ts5*^*!8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/15.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/15.png new file mode 100644 index 0000000000000000000000000000000000000000..007a714e376f3bae411d604ceb0257b4d9e4aa94 GIT binary patch literal 235 zcmVx?PF9E>FM{()}eTZKrfIxUBG&07VCjfY!=N1s{G{Fk& z_#^KRaBYx${e(Yi#WBW5ci;n<2_)Mjr4-+m@%o%^&sK2r l&yks6bAT^PXsr*;bO(iM5abr?QThM?002ovPDHLkV1l*FV-NrU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/2.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/2.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6a451790ae4903bb92e83dfa43845cc6152642 GIT binary patch literal 290 zcmV+-0p0$IP)MSWS5FU^Spls1EGUDWX&U7YG!PZopEBrT^!O&jsUY zV$(=B0Hkq-*o^<3BAx#yiB2Nj0FbliiO>5#QFP+}B7vfz7z;#WP!gUkHX9=|IdD4s z_vP~aAI%&6-!av;s1%mhj& oI5Sg&Py<-AHV|j>XX4CE0Q~qyu=RK4B>(^b07*qoM6N<$g6P|RUH||9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/3.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/3.png new file mode 100644 index 0000000000000000000000000000000000000000..c74a044eb0d7c7b492a0e0271103c5fdd550d056 GIT binary patch literal 289 zcmV++0p9+JP)_@bb4K;U|M@K+i8dgm{Ko&-ypv!< z7(h0IG^bVGCE9@K++$!vKrUe*RudjPSPk%vSpoKEbk4E=u0c~tHz2k0&i{m>i(nj+ zdz^FwKpJE7PyG)`+4es&>k#P%fSjFJd>N?u;D5K^=|eFVh{m8K9A9`2BQvS%h5k3N zNdIr)T>W3qJQYRGKW@$c(A1saB+UTI2cXOZG6Y$XxnsqDUm$G(Wh2XhG=nk|D4pQU nOn$Mez?!vz*uke8XJ!Hbj>T9jCOlB*00000NkvXXu0mjf#N2-U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/4.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae5b99767ac9c0ca2a9acae8bc463cbf5229aef GIT binary patch literal 257 zcmV+c0sj7pP)S#@l90S#{(O0e zV@RGu>KX!=sVE?63W*{$rg_^S`)&?c7RWGY2)HxN>uL_@It}4TU~2lJUj-zIz9;V+ z1Q!5&)M?V{`wIXXS*o&xwCx1|k3G+jrh$avUsl0beC=`k43lL+90%fg5ZivA%Q8q+ z=@NrEV3-IwE^=MSL$&u;|2Ri8E5v_t8YU)<=9`l5pNHuQDK15zra}m>00000NkvXX Hu0mjf5;kT{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/5.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/5.png new file mode 100644 index 0000000000000000000000000000000000000000..18c325c8a95ab1626ff83ae732005bbc613cfb61 GIT binary patch literal 268 zcmV+n0rUQeP)21X&;tzr85oGefm<2=d#_~p?=}y}2Wd`u$nZb=Bk=|#++g@0c@km>1IT8O z=A^sC8xU~}VhG4348&@}g9obt-YX#f1o_u#Dj5bO-C_72dl7;okCR~lNMqC~U`TIc z_#bwN3!av;s1%mhj&I5U&?Du`xnAhzqqotXe;oj+jk Sc{1Jr00000~WFW85kId!dp!v{;xC)`ae(4_df$j^Fznn{~z5-i8kPdedhm@R!Lw( z7(h0IG~ac|Cfa~wRtaE3KrUe*RudjPSPfVK3?Ps{k69-CpQ`Oax&e29fqKz46^xHt zC6aCcNaHE%r2pGYBmW<=h$Gzqkh3q_ru{z%)I43sb123F(HNA3&)KA4WTsFF&Hw3g zM*pjot^cRW8lcFnF$(#=(<};{q!~c@0F;?Ph9E1dP_p{(3#2WeY-Bl*W>97Vr4yW) nX%#Rbfi!CaakqvG&ddY=q|;6ES&BTQ00000NkvXXu0mjf+X#37 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/7.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1b086bf39c8c2f02f7fad4d9f2787187845f34 GIT binary patch literal 257 zcmV+c0sj7pP)1CL9ml`cnD~FUr$oJBf1>EI&bAi+WL0ZKp=XMgaiCv>nBOWfMwkU(<2JnlV`rYVY| zKvh)`5i2RBkYyQ?B!SSpt}C`}vj$Algud?$M0hgI%d%Jl+O{<2dj<4?z&X zb=|kMJkL>$!OavCN!63w?=VHlo<=?VM4P+90U RcFq6*002ovPDHLkV1fw_aG(GH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/9.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOff/9.png new file mode 100644 index 0000000000000000000000000000000000000000..7b97dc7563c9bb9e50bea9597a84b22c905d4d5a GIT binary patch literal 251 zcmV^#SuN=z9e@Z>D%%^#N_GAk0KtbRRzpND@^i>kR?}z_JL& zQAO7o04QXu_|i>d0ASkFB&cga82)7!w1Z!G7{1M9Spvrqc%HzvuX|Z0C`;Ai(+4yY zA)kj_SDwdczvq`dirFFllUp+#PNVq2x$oba=>@TrF)q!R!1DkA002ovPDHLkV1g#D BWI6x< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/0.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/0.png new file mode 100644 index 0000000000000000000000000000000000000000..a494036e0539faf69e1746ae1230afaf15633dbe GIT binary patch literal 274 zcmV+t0qy>YP)EJ zsdu(*3(xb;1Ga6$JkLsf-=7E2IF2KVqCnF$=K*YcSr*iF4d3_w@fWnk5uT>$Elh@C zz_Khjjsw#)UutQZqAW`_(!v}tOoTiivTd8`!u7F#uF=deaZWylDM=D#zTD-y?#D3Q Y0Q*^upc4q*(EtDd07*qoM6N<$f+3)E?*IS* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/1.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/1.png new file mode 100644 index 0000000000000000000000000000000000000000..40be4e9b76f61bcd909d4bcae1f1a250b476ed23 GIT binary patch literal 266 zcmV+l0rmcgP)}>l}f6kmk)X4F3-#6K}wpNQVClf+2=5fNTb7 z-VjZ^0rP?&hJakcK&&P_c(5AK<_huW+(3r^<+fxPus(|6|FSR$o*zVp0U(VFgCQY3 zD}W3GK+awf4%7^c<_fzZ84E;XP!e7eikX>Qlo|d9X)*jyG-CK4pouEi>CW(fiVq}7 zGl22|C^LZ!K~|Jt$nYP?_MwSC<24yBtI>DKlKsgPhc`^_eSmMr10Iab$G0(hR Q9RL6T07*qoM6N<$g5VKpp8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/10.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/10.png new file mode 100644 index 0000000000000000000000000000000000000000..ac901e6a439f12f4f913a0f33c6dda3b277c63b2 GIT binary patch literal 282 zcmV+#0pa zEF8o-!PoSM_7xB?a`z0G>zHA6K+1=@temcRsSYq>#H)Mh4q0`8wVkle2P{*QyZ`tL z-m(#ndHWTn1I|<g~{fmG)$H> gGe6~OFenYv55&`Z2t_Nyf2F3G9Hvpn> zAvmP@`Dc-C0La;bf-At9d3Y*@Vk{7iK}lFZUT4w45 zs-FT*(hQ({0Ln}tLy#45awhx-GX5WevXSK=niqi63C_#}%4s0YlYy9vs{m(a0sxE( VECP|o1Tz2t002ovPDHLkV1i86X*B=< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/12.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/12.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2c12ae75a098ced46a74c1ea8b3826fc82b286 GIT binary patch literal 249 zcmV}1Cv>O&I6sZ)$W5OA zk`f(JY|tEZ%gOe{nTK&_OJjs@ z#fJpb232#5ch+9o72RGSJ+cPeDGWSio&m`mjO&J+oTBC~4AfMUK0vQ{d|jTt;% zhu$2WF|+ez!$bScqKE6n!WD8G#g1}1%wg@JXPtxy)=X@A6&dZqm{cz(s&>IY%u6{1-oD!M}1YdlE$8GrEXr~MP# zzuGf1GY9VIn*Ft2Fu-3dK%d#;bBW!y|J^@sc9A(J87T2N3qcGcX*78q+`3~9v z{3iq^cuRC#ZDHpRW9Dj9Bc#wP>kz}s^HQyd zhrx1pzxX1{UKxF!g&8cW5A_zrUo@Vqs(raW+-%u@$2VvG$2R1o>=a6nTk*8f#gJJ; z-ltuvX^jTM3c(XU>N!riO=HevOH~W7IyiG?R|6;Kl1d|ipfi@Ln>}v4R+)^tiW?xQdHC> zT0{5I#orh0o?XrHxVp`+WcgbGO^2M0=2RK?iuZ=+ja`;#M%eobwTsO*?OTIT*aI+_|O6?#Ozf0EKU!y>p76b8^H@Tgu{U?Hka@TmR%Q<9y#q z>!W`xHVoT3zct9qF`GA;XVH{v$1-YFo?X7)%02?za!_r)0E!Xt{Jod>xVI^0XcBcRM z3)_@bb4K;U|M@K+i8dgm{Ko&-ypv!< z7(h0IG^bVGCE9@K++$!vKrUe*RudjPSPk%vSpoKEbk4E=u0c~tHz2k0&i{m>i(nj+ zdz^FwKpJE7PyG)`+4es&>k#P%fSjFJd>N?u;D5K^=|eFVh{m8K9A9`2BQvS%h5k3N zNdIr)T>W3qJQYRGKW@$c(A1saB+UTI2cXOZG6Y$XxnsqDAmjfbC>vQ0q#2Z%Koab_j}DZpA;-|(B200000NkvXXu0mjfvw425 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/4.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/4.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2c506cab270d135066143b9b431d192dd3b52c GIT binary patch literal 254 zcmV=#|H;5OjnHQv``R)_RY4#T9R$y{#o{o^n_0mK?d&O1eVW&i*H07*qoM6N<$ Eg0LiMl>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/5.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedFaceOn/5.png new file mode 100644 index 0000000000000000000000000000000000000000..0c48e17925b011d14a4f15157cca7dc1445ec61d GIT binary patch literal 269 zcmV+o0rLKdP)21X&;tzr85oGefm<2=d#_~p?=}y}2Wd`u$nZb=Bk=|#++g@0c@km>1IT8O z=A^sC8xU~}VhG4348&@}g9obt-YX#f1o_u#Dj5bO-C_72dl7;okCR~lNMqC~U`TIc z_#bwN30~WFW85kId!dp!v{;xC)`ae(4_df$j^Fznn{~z5-i8kPdedhm@R!Lw( z7(h0IG~ac|Cfa~wRtaE3KrUe*RudjPSPfVK3?Ps{k69-CpQ`Oax&e29fqKz46^xHt zC6aCcNaHE%r2pGYBmW<=h$Gzqkh3q_ru{z%)I43sb123F(HNA3&)KA4WTsFF&Hw3g zM*pjot^cRW8lcFnF$(#=(<};{q!~c@0F;?Ph9E1dP_p_DWc)t_Wh2XhG=nk|D4pQU nOsjwi38Z;45O-_1;LJ<_Kh97fDV>^}00000NkvXXu0mjf+-GBhPaPKelaywbmQ3t}BLNa1dc-nvF5ufWGe?gvG_z^hLi4V1sy1-ZxFt`v5j| zo@Xa^{5F8baU4gADF^~YQ3RzF!Z3W>E6Wm1 z)3^}}bHFeWay}HtF^&bEul0G4W{#Hcz1d{o($?iy==TJ(a zX&Q)#ld7shQ549s3_`Qk8parBz`Cv&$I(KBH`BcDyECBgdkbMD;%fS$Uj^`k_|C5D zkR-`{z_x9e=h1A7S!54?z$hiX!;F z|F&0_CF;7iBQ4AU!$ipWP#A_d7I?hY=RKO)AX8-dqqK<&!)wz z4`e1mJ`edmmxRxEzS)yl9nzfanrU&G#1G|RxND{tOph~MVAk$Z00000NkvXXu0mjf Do=~qy}XgHSwVm;;og5u z30X-=&O*ggOh--%h>6XeyWVovttg!v9Gu)T@t=wv+7cOLPH$pROqqY#^fr1aD8s^SG_-3%5K?AC9%^PBUx-dL|*w`%XF;p48zh8CX46(4BY=&H*mjg oxGm^4emdKI;Vst0B&Pf-2eap literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/1.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b325878cf0e41596f4ed6761a03d7b6e020dbb2 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dN$yLn>}1&v<$M!+!^^!~b~= zdHzdE2vj6;9R4rM$@71DyYZj=QrD@o#gBZb_Z2z(zw@4h-3f*XP9@A~tOA(_ROCAj zO?^0nts#cZXu%=AP`)LFkrI;_rIQVK87dj)Gk$JfnaN^p$794elRC m!gkCY$C!@3Y?yI}gP|>U+C}R>`Mp3NFnGH9xvXAc_mW5?5=~A{5b0p>HB2^>iAaP2U5LcMX7tTo-ip#*wUu`0(tGchKKJx6 ztYySqd@ce+PlrH;+@!}*8cbtrmaPmpON+UnfDR^sHk)FA$08i;b8-OvG6iakV{5vx z%i#m~Tpd6oWC504g+N+_JRpkjKEyOY-&^+iE&Qrcqg4XbnK*zGK{tF4c`QS~JnKvX zhE)hOnY{oV{1?y`ssl<#$hu5fKyC}A|AQj8@c}%`lmP=_*^2-G002ovPDHLkV1meK BWhnpv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/11.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/11.png new file mode 100644 index 0000000000000000000000000000000000000000..390245b1dd883aee43d799ec9db64674ce360e56 GIT binary patch literal 234 zcmV62+brQ_e9KI_b8e@Lr3;W7;4eOXh^8f$<07*qoM6N<$g0B=`zyJUM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/12.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/12.png new file mode 100644 index 0000000000000000000000000000000000000000..696ca88699b5bad90ab1163b4189250151a32186 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>pfi@Ln>~qoqU(8$w8p?e6~nb zcG`ut3XLIAK`swk-~TsAW>+me8+&-~jqbVg^PjzWqYysf6-TAJzyj-|d_i&w=LL#B zwe72BsC=vV{Oof-2IkTOzGqotw#6>sOGw{xeD%Wq&i)PT38k_QoN5fa3)p|C9%TFB zb>gZ?Ls{4+zr?JbEtZTbuMHDa8ae+i$o{?K%j*Uo(}pYgj68qD59r-t6!SLFoy?gq g_t2wygLLWaG+W!nN>;OyfKF%dboFyt=akR{0G#|=}1C!9_EasJ}L5A*l7 zJ+x$9$>7uwhY#ijp}KgO`G5^7mJZo&lZ8 N;OXk;vd$@?2>@nSNxlF8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/14.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/14.png new file mode 100644 index 0000000000000000000000000000000000000000..fab16a2920cbda2b4bb9fec4d6e20bfb50a04834 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TRdGHLn>}1XFN&!yMM;~zyD3_ zw*BYf;VHOt^6sq)mS*_GWXJ5VZoxdp8+#m1FzgVQ`Y6F5l+S+4 z#XzjURoSCQi!G&iV}eA(L)HmwDXv>D9LPPC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/15.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/15.png new file mode 100644 index 0000000000000000000000000000000000000000..f6caf5ed2dd7c77a07f6adfd097aff3680110c2f GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn>~qogB$`M1jY-nEl(| zf6IMRLl=le%?SMI;IXkXf$7Pd$3a}jC1!Tq`f#uK+)QVVHB+Qae)JmpFdVqSoK?%Y z;hI@8|ACVM;!bx=bX@i_26-_v>^{SA;XC6zr8Nw?hrVu_x2vJ@X6tq{rCVYRQ;IIM zacIQ(el1$~ogsrEW39i#-IwwVe||H}S3YBRnPzopr07p1gumAu6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/2.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/2.png new file mode 100644 index 0000000000000000000000000000000000000000..7281e5d27f3c4e6b8d4439aee46a1f12abee3b49 GIT binary patch literal 249 zcmV4Od3jQpLAn4}k>s`4iwbj_fVg?s;^Wn)cBx4!O&lv_W z03l?3YF@+in4ooA2%KQER`3FP(L+QdAPC^#9>`gK4v1+i2RqRz0Dc()-p$*r;l{>o zKENnO1;7Y8pyZ`R;3$F#SR=d-@d&{86|c-K{HhV7Spj^T00000NkvXXu0mjfs0(0H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/3.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/3.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd9c1b8a9fba82e3638d353e150c69bdf8e94e5 GIT binary patch literal 255 zcmVkx4Ugrw{MD@-iDf?)v2Wgr9Gf~KR$fi%V!UO*U-R&@`<0FW2(84#0uf{F%U z^8z6Q;9h_QA~pj+;xTzA3C9AiXasqUDh7Cl&&MzT!wVn{$cjQ!cY+Ow%sPl+Kt#qq zumJ(_>mUYz6q0HHC>E$^0L5OwmznSxKrj|4P6x!~MgU_4`kFx$cCY{d002ovPDHLk FV1gnXVnP4_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/4.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/4.png new file mode 100644 index 0000000000000000000000000000000000000000..084a6e9578d27bcbe2ad397644d70a606bc136ce GIT binary patch literal 229 zcmV^P)tyVD3}ZH?P%wACIF3PKZal zkhX;c!Evo9Abk&sqUD|d2hTvBTLN*c2D?rN_+|t=@3_W|O|t{WQ3n{o1eB#q;3~os z@Qd*Mh*togSCvHzcQrDa6TtU%K#RZ)`=KOJ0P8#hX{vxQTmcUL3$O)u!0QO6!(;*; fTX_8+*qp`>TaU)Z^XnGO00000NkvXXu0mjfSuI%w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/5.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/5.png new file mode 100644 index 0000000000000000000000000000000000000000..466a6b76332a2a381624ee65059f43470891a6f9 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dN$yLn>}1b66huVECpYe7>%>+h;))#Coa!QvP8e|1p zH-;PVGVJ6@X}DYxVmaa13~moLmAi*c7@n}!u(`}xu#EA>9)}YQJH!(jJI*pps5s)O zl*AZr(zM4-l=;rHWT}RStP|K$TpO(wfkqxNQAm+L!Z5!yfZ2h|)09Dk`-*WxlKz9! mK0kOAB)CPEGba@(GgwJ%Ud1wZ%QB!37(8A5T-G@yGywp#idDq` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/6.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/6.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfc2dd4e6549ddc19cc2a5049dae168fa97e86c GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`$30yfLn>}1TO`PR{=Yc-<^SE^ zZvK~)ka+N8O6aBk;^$cZ>)%}RFFsA6L8<(X(!>A0yU+Z;?W6S1xPga3)5ZM3gi4)4 zwl@a7EZTdLX166WoJdt*UY1?G=tQGQ+y*~KiGuTr?1vd9h<}hQIAqk=#g_1yNs;+M zTm!3;8MDJ9bzNc3<4o%^SSow9*v?%4deDI3Ft-BliLSC)ZjHPa96f#|%-I;4Co~WPgg&ebxsLQ E0DeVZqW}N^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/7.png b/src/main/resources/assets/rpwiring/textures/blocks/insulatedTop/7.png new file mode 100644 index 0000000000000000000000000000000000000000..7a283e9bf66deaf4853a39f7dd80a1faf653cace GIT binary patch literal 229 zcmV^P)v#*)+=Ld8V8*ZQDkSvHC2_LMbKk z-jkHF$*t>3T5DnePFHixFR;%_5^3tT=qTwqPpP>hj62*em$zP|5i zo@W}zk))KXxvuNTdrwL!VgOK>18v*h1GLtuaGItKfSm#0oUi7va2SR!fWPMeBAfx% z+JeAdgezc)@Hxai0OQWN>npB5dRlNZe{tKWB p<$%W#&K}blaM^{&_u$TJd;#({~qy}Xyt!9jrKL8WJ_ z+d_qw7N*V%EB1UfviyHswy>3ByPfql#z-{@cgO3T4SzMf4;pa1iV|RXzIBnnmbD69 z&$5|x_Apic6Y59~y~04IJ%<5t4&VmB9pJFW6A@{`KnkHz_b)D+EcD5)AB}pQqnZ{ulG)I4_l_r3p$h2SsrH~86r`{!Ej3c=$z>drGa?)5J65Hg@f zkk0dTF}7{nw63f8ei9^_U@>!+T$3smub93|A}r~p*LVjQd=lmByRL?_zBQs`+=fg)A7EYFPcWLRL)xh~fS)rw2j&au77kf{qES-|D zR+c#`yWrfxYJCN{Z zZ&$@}j4aDgmL;mHLQxb@O1)i-F^9Q%o`bdO_kcwhVwNP+0kv(T^E_;$2x~di2J8iJ zG)!O!+5kUV1u#?+vMDV2)zqr6d2AT8; zK=`AHG;2jSHrKLo7{}ze9Gl~70h&>03Qpl^fc8V8)wG<}*HZvb7v^aSK0@{XpXm;= W3N$PYxN9*00000c|6M~fpqNSBqDhO60HvZsvuPCf9%nBBVfsmY; zOeRVxB}IJSmne!PNfOEPT(T^aIF2O@LvdYKp7*P7f;3I9f*=UQaU4AXvr)k8j1+KP zOJLjfM}cKob?qwU=2>-4EA7y zswRdZeMGG*jKH!WIf5NnydHiP@Tu6u4odE$**+fP*v01N6uUh?G zp#2J*_rD0V2Z@=AlSlzS6a`vy@GQ7bB7fsM!3E3SD@s=Fr9}V$002ovPDHLkV1m*U Be98a- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/powerFace.png b/src/main/resources/assets/rpwiring/textures/blocks/powerFace.png new file mode 100644 index 0000000000000000000000000000000000000000..147f1a0c6ade53b1b13f59065383bca2115e1f47 GIT binary patch literal 240 zcmVHpB_NpfY%aB+5Amx66o~JnM%LQn1O%s)N>H@J z1Pid@kGxOt+9dh<34b)kMeVInN+~o=17i%d)-NOO`~Eo{`haF4$-1a*TbyoyT<&GP q&Mn~LpFK0t<^;?6imvN+&GZ1XzZF6r)~QAS0000{|;R2k1+ZkRURhp(LLsiLkzC1rW zRM&#bvg9nwn25SBNfIuKg3~nRAP5FI)C(b)o;Tv-ng)P4j{gIkw#0xuuGA|!??@^G z!1KIb4hIpJfGCQ%Z4P1ZxNvHzpImCMa)vMVjT2LUH zI_M@O8V1Sq%lqN)nz64}&Y^}7~aQvety17xbh>Teb_4H(;l j)%^EwR-+b00000NkvXXu0mjfDCCCE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/redwireCableOff.png b/src/main/resources/assets/rpwiring/textures/blocks/redwireCableOff.png new file mode 100644 index 0000000000000000000000000000000000000000..61e89cd281d747542d0f96613dd23ef6bcbf2f0d GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fh6A}`B_$$hlu}zsa z?ce&9etPo%^YioU$pX?UY?G8T7(5oTP1weeTEi(p6NZ%8dLf&+ z1*#b~>I%Gec*-HgP-Nt@Sa_1+v;fORJR4fGT+B{PiC}g(XVQ@Mp+Snt=t4t;egl)2 ouvEvlfU_#BN=GkRFnwlXc)i}#yNP{<1<*wdp00i_>zopr06Q!}Z~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/redwireCableOn.png b/src/main/resources/assets/rpwiring/textures/blocks/redwireCableOn.png new file mode 100644 index 0000000000000000000000000000000000000000..0e452895a69f8ce93a5ad84f9ec09c8a405ec56e GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-ftPB!FjP!MSSyWKJQ z!K-@@R9FNbJ`vbz#`4#^TL0d1lH#eil@Tcm0;|MkcZdt^bzuD{F0VbgrOGJ4iKJ{2M%FZ#8TpB8=qPnTc*=^so2XZrn wX4tG|4ZqFAepQK2Dxu2i$o2C-4(~5u>^tw2>G9Q32bPgg&ebxsLQ01eztw*UYD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpwiring/textures/blocks/redwireFace.png b/src/main/resources/assets/rpwiring/textures/blocks/redwireFace.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfa90741b6f5452489fd4b97397d4fa618a93ce GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr-gYPTt6Sz<`70=KeI+ z^$C^C;ajGZnCLiunReP@lJL^v#xFv5f^7oUnpVH}bctqV({Y?}a~tD~oijcq%Qi1x z){&z5bZ_JC^z64wKJ0dMS+YtmIc6yX+nXQ96!Y3}9owSgTMUltl=YRQw zlO`kxczAqZX?4hTXi#u0db!r3(0liG^%a@Fjf|&6W`}!a8Xnsh$C2nL|5kHpSoYhZ z72o@q5~dfPoBsV@k;d~qtPcET_qpap%qX76rQxtvbUXV~i@y1yQ-bUmbePwg^4^GK znCaBPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0cS}>K~y+THPUNR0znJ};5m`Jc7bKzhzJ7u zTfP51{6fmARLFEXJv~{<{?KgdYM92=X5EdwW7~If7Q1Gz$h_U}n)Xnjc-6LESDTl` zqTX%wHdUo9ClyaE4qaQ?AygB+-S1E{DUo>8b)^eoq!@zI3(30D)&tVU1M2qUKn3U+ zZxE)1a~7#$K<zC;qmo}VY%rLA}mdAyY6&;gPV`<07?cl zKFbh0b)k7jBzP_=EaByA1T%@IH}zt<)Sc!DZJa0f7Xo^|2;aF=Jzz-mU0nG5zhoFL zcu*C+kpKVic-PwpT+n7ImsUvT0Fs63LG(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/basaltBrick.png b/src/main/resources/assets/rpworld/textures/blocks/basaltBrick.png new file mode 100644 index 0000000000000000000000000000000000000000..c35ec84c4ed1a30e3b5e8d0bffec888c85801eb2 GIT binary patch literal 586 zcmV-Q0=4~#P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0lP^=K~y+TEs_aN!$1s0=O9fwNkO7Ovo&eD zWvK*hlcq}+#G)br_df(L7{#(Y-}WE-Pt@^zDh_4ab-Q9;cMZo&Q{yG5PDg@&f2@XD zE6{b8gtI6Jr;h7J@oc_aOv7+CkMZ$h&T+9?5>FgQTQsx{kf4XEB0-N(2;Rq0NY?RO zdt|F~eF259r;I|<pJ?tBV zPsSBnC2Q#cT&2n3SP^i8wk=h+4c%cpdzd^D+>OT**YT$T=J_71f4NKzQ-!&Cd%?sT9D1ky4BcA10DpwuMBz3Bg~=U_5yiScY2v Y0#@v${5mPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0w_sDK~y+TC6Z}Z+CUVB=PxLRkPWhu1Qa3! z1R|()ubx&mg92(@sPsdn|Nl!Lg_A=vbML#{cSaOU^Wf-E)l|!|!*W>k{U8i)`u$d? zopks2+AU4fJiqvN_0eqYX}TsH*X8AS?roX^c0CV_<2aP-alDz?H1hey?*-pHo&7{4 zy)GS4PUo|$>uYuuRYgis6}UBBM?7xC?W7Yo8=WK()!k@Ik_u+w+sSdg5m%xrf_@m> zPp5}pR;8?z%jL3i7R~L-j>yWgX_;7pk~RN)&mQK?0I`ub-j_>SB}syapTJLlIKVxV zv1U1)P0uecu$xnI?|+tq@#uDvMzvkjvY1B<$0MR(5>f&K(s3PNrE=MJ?9=lzJQJ7t z#RZXosj=5o6oq_#-26N~J;4A@WLbWEdSX_Vo0$w@qWt{!A`Xv_zU0iw{ayEY{$Zl+G=!VX$c*7?as0z9Xk;#HmNQm^Y ziw!mj)HKc2zg0R(X>&bSHw@ti{_EmxoZb@RI$Q$fG%{OT(9a(qF0L-w;Q?dWwg5dC z4cDXdphMx)ciyPgYxt(bWm}JD+LnNo+r|}ugL$YKg*@JD$BA|$z-uC4JCzD2Bf@ft zn}{)z#yV$0Hx!S*o`@kVg+xpSrR_3qy`m>RRx9HFoHFpyfdkFw*O!a$mxRbg1O|p1 d1dAW|{{gS8k;v0fBl!RT002ovPDHLkV1k5|H=qCj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/basaltPaver.png b/src/main/resources/assets/rpworld/textures/blocks/basaltPaver.png new file mode 100644 index 0000000000000000000000000000000000000000..49d3adf334c8485ce244c9d6c211c208a9254a33 GIT binary patch literal 555 zcmV+`0@VG9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0h~!hK~y+TEs_atgFp;LIR=m+=?Mx+hHNlE zsx}Kt5|*lJd;fd%xsGHR&$s>kJ%iWXZ`Yx}=gPS@)vaT#(0Sv-Wb^xLqBdq~B0aGgz3J0F7mJo$zCJoA`a@8`IYY$*n zxTb3fK+HVy`f*Tnxn2>lH^Q_HVp!v4QoS87^%cZKk?epzrsJugM}+J zFJ4}}>Fbjs4rrr-%T;qAJm?cS;Ucp>VkjEFFlNymZ~vpwPf4^u;qx9sd|O z1~-xzD?8L}qYV^sq2w4sj(a>^&VWip0YW0)VVFixG;mhwcqn)lnNv8p2~@588tlLa tV;mCU@Pi--0|F2Neg{AB@m$f&m_J~)si)FM$uj@|002ovPDHLkV1gN9Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0oF-GK~y+TEs|+ZgFq05`58bL%ArlEmR?-F zHPN2*0vff}ME$D%|F1rDn@pD3*`1kZ-bLB$w#)S@FN*ncaVRpj`|Q9fopigwxvrbE zB7{P8G#v*~*bRDqs};skGU)e$AWCA^xSz1?4+r>|Fi6NVLZ(%%T9(&n2q6s9upL_% z20;wJ?$ybms980Y-C<9HVVZP=4XW*aM-YtFdPNWz+i})uIv5Q#T`y-KfqJWS4F+W} z&Ikr!zzQVgW{WvZbWtf2IHngRIqvkj7&*PmZDt7K2vknFCQL&)EWTOch_)l-1Em-f|N7RluJ;8)b4fwkU3eAm->VO{?Fep2?(PUFGmU!`uzSHPbc?& z)3PlHi9m~#5L&kVdU^xt`VORWgX5>!^Kd)@5&>vP2e!P=ZLNlX0Wq#aGXoC-5>YPU z&=$YdZiD2yF4v}y52~svsLq+=I;ifqTNn&fMI0${m_!oqGPF>*N6Dt&2)l^m_stEB92y>$!ZkUqb00000NkvXXu0mjf-O2rN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/0.png b/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/0.png new file mode 100644 index 0000000000000000000000000000000000000000..c6070b664956a979a65017a3beeda1b3f7b4a694 GIT binary patch literal 627 zcmV-(0*w8MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0pv+UK~y+TZBt!u(=Zf0X})YHY0{)ET?<0u zm6dH`YD-JifvCjLrVX?K+t3iOX#yU2<8}X%zY~0KTH^o@C)d9B+++LL!S}_jL4N2V zo;tOhjg5~Ia-?cG{`|Tv5zm3{`w(ibcur%Ag#PC$cmGEd=`+{l2`tck8?r#}QX*Xn zo<|cHQZ#Fzdlurs&kSlWWA0!j$^yx}f!0e8y$=Fnn%0_ak$c}_-7JtS9LQnCF-M@L z;wXR|3tqu)UW0a~W=+VgKXoHOplwCkgSEimdgaHv%8&jR1$UGiK7j>_BcCS})g<6? z_f)U8TM3C#$Rg>of#7k>xs6N91NAgU{>nrDlhP(7T*#Jnx78C5ofCb;spcN|kUM{Q z(0m@EeXI$S7_EI}2sX$>wTNpqBj64ddKVJTuz>$i7=n$#bp)wRv~x8N=qkPK!W5f( z4UY6eDRxc+csr8Ev|EZSK<3co&bfd;Zt<9!*IT7X;@Q57aJTXx*sOXg6Sdo9BHgo` zCFs1?(Yk8_af)NzILRO${l^0qIq>vLOdz%$L$Go8CPwH)8fY3hiOLr?r`;AxH zB*NgUEXe~ki}aiDO`Qe$R}m-jL%$Rwp*?Z_5zw!*q(=IkPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0q#jeK~y+TrIJfe8$k@m9kP#^$#z8&hzNmm z4=ohhh*w&Lhj@w#ia-$*rBrQNQ4Xj#P6TnFCq4jQhVl~P6YzD6?a_|d(o5BY*ItkP z8?W~dd-e8znLPH7uAytqgZnoAvk74J`=vnGbCO}LgX>gbWmm)2{*}a~hVSwM=>3|L z=CSp2NgkfwJ^}nZzHtCO3hrD0@k|G(R{-4&B}qP<-??zjY}{Pm`VDFrQWpq-gXkSt z5EZEBAh}A*h%YrlI6b?A-Y*8SBZbrj0w}Kdl4Q?xY1#;xs0RufBHDm^g;J>iT{L?C}9Ozn{%DElzOW&?WZ>Z=F>Z*Wh@GmP@ X4svx?s{Z$T00000NkvXXu0mjfxs48( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/2.png b/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4142968c1d88b1bf7fb7a0f7527b6d8d00f147 GIT binary patch literal 463 zcmV;=0WkiFP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0YFJaK~y+T-I7^L!$1^;r_CgjOkbl%m`kKy8o=Ivth;6fg3y z_Zh<2Cc|zn0?U#;2Ibj}6@Xf(9SEcXyE;&xN~+aZP^~>l7;P^DCxAcHM^jaHEj=_A zkSz_e+hTrvfl`!*b?8!Wd!pe4kS8v@D~{Tuggo0IqZ}Dj6UiP&II`dz&9m1goX=~f zS16tf1h?}**F|L@)4;NJUR}t(oAFYB(U91BaFA>GF!%IhF3TTs)TaeF$Hk170+cG3 z9Q?pv8%`9CE%4^ze^AN*Ht%hioyxa>^1y&-=||K8`vAyV>pdO+ir4@E002ovPDHLk FV1mJgys`iQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/3.png b/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/3.png new file mode 100644 index 0000000000000000000000000000000000000000..bad2bfd1b8eca7865cfb0cd3b65c7a8dc072cc80 GIT binary patch literal 555 zcmV+`0@VG9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0h~!hK~y+TrIOoD!axv)3oY$-Dd&RRISR{XI2z5Go1NDL^vMR_AVQi()Av;m+Gc!hRD3j*SoVTiJZ+)Qvn zRF{TT$(9DniP9Q?7W4%Mk>OAoigU>^KeIR%UM2K;Isj)t=2jhzqHLO~Xlg;$6iC!9 z_xKhP{V>c^hxhiL6`TR`%t89bK;cC~_F|k!_H~Y)WXnKqV#02_-eCmx?=}4^#4jvl z$F8C2AT^M_VO0m84rJE} zM~oqN=SFuf$l!@QnXy~gOhTM&=>bEA21GjsQQ4eC(*C=H#MN@7Nj`u?cht+lL0J{$ tWk-#@rvQL@A?n-z0EzN;T@8>Dv>(IJ$r9a+^nL&U002ovPDHLkV1mgw=%WAt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/4.png b/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/4.png new file mode 100644 index 0000000000000000000000000000000000000000..53f680978be118bd73d982878c5f3997b672cd79 GIT binary patch literal 603 zcmV-h0;K(kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0nAB6K~y+TbyHnW+b|Sun>4YVq)D5#l)^NL zS12DEDqXv(fT#qB2`15vFM$9dB=)ekz49;jcg}pT>n!2p;l%dwy~p<+JEdRaXGYL3 zq4CW{I4Hw%FEM{3A$tmPt(3*^=kGHZtur5Lq+sWk@7x*g)9)JM9Vg=nEYSL4g4@>; z@kD^uRFMq|h848VeJuS+ptcj{7iOX?5REFR@4IMU35Y>lNVXu6k53`Okw7#qLv~F} z)&eD^#~$RCc$I8Hm8oHkJ+NHC11c++dBE$3nIAt*i=BG~r`ISPzyj%Ul}Q>^-!n;5 zecGluN%VY>NIa>)`y4Vif1UF{eGSn#bkVt0+N6j#l1b5R^~FW=RJSR3nvH+Pwi@6Jd>Qz{!I;$w(-&$M8X2@t49XRY{9@}PY+ p4Bi(YFGTPCr%e0wJOAfU`Uj*Mz}fXqS{MKT002ovPDHLkV1mof22cP1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/5.png b/src/main/resources/assets/rpworld/textures/blocks/flaxCrop/5.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8ad0379adc83e832e0100ca3f0f3e39b7b9388 GIT binary patch literal 585 zcmV-P0=E5$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0lG;5N%TT%uMDdC-8NCr>dDYExCw?nrgc0|GN60woZ#z z{|f$mUBPPJbU^v9p#f*tZzvtTFr*$Vf9&bKTsflG3}`=$v3PXrkqejiAE;iu8Ibdv zcT~<^dCwcMOhA0L5u)Ehwk)_n;>G=E13=7C@QWVpBcStQu-B25yCq87+H)ce`hS3e>Rv(CcmV4g XV$IpGWzF_A00000NkvXXu0mjf$X@ya literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/indigoFlower.png b/src/main/resources/assets/rpworld/textures/blocks/indigoFlower.png new file mode 100644 index 0000000000000000000000000000000000000000..4fdf202b7ba291059d9d480c70558dca9bf0e186 GIT binary patch literal 468 zcmV;_0W1EAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0YynfK~y+TW5~9zrwD_IYxV!h#>3eF-WZ1e z?A+fOKp4d5_GkEyt_FlL3=qs>_|Fpz)NIA@pErczKO5&o1|C0#|0fIf{pa?;Gz7%} z;R=WXkm9|Wo4|(537h<%!-nDi#-!z7LwLhb4S^dVQ~*)L>B8{;NyGL3(?k0IgIojB zG%29#Kf4{oFfMn7|02~0L*NF0ZLc`>|8U-p|AM&;|M}y9&bMIrFOb9Ve|!2`ux5cY zhW}#iI9ve2yx~BNNx(1w1{kXe!+%a^2C$8M2@L;1E=1M{!zc!TY~%KUDCBei8sG>q z2qw>;h-nCl0U#_?1avmgsUSA9F2jEgYoIGUfv$)Jif0or0OmiCOZb7#2E_uKDKI*L zUIU52)FERG7l3R5*#=_s0HcgWAG<~v#xMXKvjbxSn>YmjX8-`gx%@qYOU{M>0000< KMNUMnLSTYEA;5nC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/marble.png b/src/main/resources/assets/rpworld/textures/blocks/marble.png new file mode 100644 index 0000000000000000000000000000000000000000..304676d1523e6312fefb54764923510de49e1fbe GIT binary patch literal 620 zcmV-y0+aoTP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0o_SNK~y+TJ(Af@!ax*;=bgRu9lSO%>W#)F zQCyHxMJcq!?h9=ZN{fPV$LJ&Yjbls>^qe#Q|DR<>j6!2pI7QIKa{p!&_4B~MAG#ev zoJnHdMZL_sR=!AXFNry;vH>8nWD>W7U+1^6b44a~uJGZEOAkfKyp&D)KaU@5{8zopEYG1}qQ;ga?A^zNI-v z6GC9OtHSwSKEFNHRpD_&O(qd)b~Wh6`r7L1O22bLO}XM^u$YbJRmQl4+Uc%bD>yzF z6yfR? zdkDJv`5pxs_w!8>nvES)$gplg*%Iu=!4?8cLRZ`__Anj3KR*EVOwG`bfvVjIK1vvx z+rI$HqL5#{E{ez`kG5JjlVF1Nsj-0KBZ*UH4i#7;1Z9X)U$(@LC1ybvG+puRK+nsV zM}-Q)oz@}6*$)pHIXQze$^4a(w`R6vso$&ppAGUPF@FFqyk4=p+4RK#0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0!T?jK~y+TC6Zfj5>XU|&p-2}&pzpsPfcv8 z(n4WqDVF#vOnlOs+6cu0hD(`&avg@-48v`PYoThRu{AdS1V5Z)=gdC)thM%;wU3w& z8{cN;Y|tR4eQiE!P5fuzPhqoy@s+J>&w|- z(pPKwM8LbVCJZ`7UCj;k61e%G4xgS5d11A0=7YI~6LtB^*}?t`u^Q`8X;-?8m2;mn ziPKcx_AfnZTdjvI|UDwsj#@53F*wbcSfSVl$Q2G`}@>(I-rT<>+r ze>3a-{&kB*&K$si%KN&+Yb0v3E6VQB4ImbZXWp#$&3{SVtzsiW=Kjmv~E zG})OnP;w;ca1`*+f#(3h2}J3?z7huK)6qgUhVfUKb0rn26;k0N|7_T-$QO(#a{87L zF||_eg7+sd*oi~mOUdJ6AOWvy-~AkCc{$DzMai>$B<%(z_dmo)CSa%t*SY`z002ov JPDHLkV1m*GP0j!S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/ore/0.png b/src/main/resources/assets/rpworld/textures/blocks/ore/0.png new file mode 100644 index 0000000000000000000000000000000000000000..1a046b35516cf73a998cf54380768b8c5af6d6be GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wj-D=#Ar}6r6K%bY1_-n+uRHSm@+n)^CJzxEmSn-p98O2Pb~0*jtms|Z zy`h*>EGzNvw}i#qA7)!l&pr?w^X&PYnZ}(sj;h-Gg}eDL>vDWgCp-z`h7jTs`b z4t`(${@Qob{;MTp#h&={`imxM6*LOn;NMoYd2dkTUQ3I`m!g+y);C2*&x>|lpDFdV zg?n{gj^|u)sW>0r6nDm@4P3dR?{i&Ur%PBlnD`3o_s;M4ee*3Hj}hZmv80NM@%R50-B=}#qTrCexEbD zD?{NvLqyQ^Qp;G^IRT0qNB=Bm)yeXiU|i&{9Q2Fz{>M1$5A!`iQN-Zs>gTe~DWM4f DqFk^( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/ore/1.png b/src/main/resources/assets/rpworld/textures/blocks/ore/1.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc9c93001ceffb35d61d7d46c26fa3623320d4f GIT binary patch literal 461 zcmV;;0W$uHP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0X|7YK~y+TWs$v3#4r$qZHgnw6+Bp^ARwYZ zAe4fThAL^O9LlRsyvY?;(jy@ubgw}LZ@{-6%S14RwL3erKZy$=Obd{1BZgt%{a-Z$ zkZ1|YDT-#vAk9Ed^!D|7bvUy=5$JgLpF2rO6_`N@>gvg#yc}f)_4VNb=J?jD%derF zJS?@QX;c%6J712*^CDvxrvkRi2&DjqvdAjf1YP3r0it=Hc`1B+zq1~3M%Q(c*#z?C zxr$kjCG{~fWH!S%j@8B&54I%*)a+n;PsaR#84%q>#6}jcpM7!fSEs3}v8dAoKq7VQ zvc=Q3ty1QrUT@MDce-6YL#?)x4aX*!xtv|OD#)}T|IltwAeKx_sTxD|EYTVQhe z=wT!S=?1`%x~}u-BH09nAd~4&3#_O%QJj!!Y7xQ@iwawf8sV4=00000NkvXXu0mjf DM+dmM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/ore/2.png b/src/main/resources/assets/rpworld/textures/blocks/ore/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c635305803209b442d4c39b1004605fe0ad6c85a GIT binary patch literal 469 zcmV;`0V@89P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0Y*tgK~y+TWs$u~#6T2DewWJVHkKRe7^s%9&tv~ zG?K*$|lHE)Od<$Ky+!aMln9~Pjh!Yb8A&K z7Im5cNTjwdBc8ghl`F|5QG%R`+qT6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0T)R`K~y+TWsyH?!cY{&^KtV5vcGH{UAx#Z z(m}9+;vf|vi-RB(3W7ohLFiEM8|d%lT#rG|@VMvCz3;xHNGVkVKu0~wvgCYra|77y zPR(qgsDK?+-#ndn#1L}>yzj4E0CLCk<@@))+aAb3^I+Xz0tj(hq4RUKd2g4Rf)Wh? zu92Eb4n>y13I(d~1<;q#D`{$Mi$JtcD^*?B@~i;vWELxpn-9c%gAAZCLpUv}*!>N3 z>kTr1bmMFN!4Wewd-Tx^D3JeB&-H>nlAmZ}T-X<+H z9?c{SEn{FS8oUSLcr-)@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/ore/4.png b/src/main/resources/assets/rpworld/textures/blocks/ore/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0e63e96de305823836b0143fce50468f8b4a8e GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wOr9=|Ar}6r6Rr804Fp_jWB45M^CnEocIb9-_V#w~bvY<`VspB&<4KWg z=hClddssgI#`t3OqD-lC_1jGv9$PHS3<^2Wx5`Zav=h%plLOiHubC$7e*b&dy4w3E z9Zo0QO<>|Ej9OS6d%bd=DXXd!LyWTNRGBWFW>KM4?^!SGd+!;X9L=)Gb8SfM^^=>K zc1(_3W5UCnw9}F8!VL8}Vxez-v+erICh4$iW3F_1<^=|aS*tY#>g50#LT=By}Z;C1rt33 zJ=4@yqg0@wBAzaeAr}6r6Zi5lI*PP@cQkQoS#xN11ru*)&Z2;T4v#eLwOxLT0$zo9 zbskZ!kiGv#@_1XY&%2*H%iq08Q*24)y%5{FNWzADSk|Mn4q zWad4u;&(ATiMxHU`0{?;s+0wV8}bYoTP)UIsGM2qH+kB!1xwf%u6y{Zwkw@ZXyv*3 zohidIXTq{$+c;c|w+2m3)jZGjz%Om%rMfFFJ?1AEq=MToFY2nj@38%z0<(wty3cy) zITsilX06r~sF!2#aK7v%uzFRdK1npTB ztcPA+6yR;Rw!cTr`ARzLOI`;~=S5Csnvdq2&3N82(WaN0#LT=By}Z;C1rt33 zJ=4@yqg0@wqMj~}Ar}6r6RnF5IS9Cv3VDPGu?40ICHpWmifFbOzhHQ>TKdPSy4Bm| zl6N<+eK~L5{E($nkJ-X|AdIw{tIVD|6IjWw7ge{Q6-+c#Xy~rZoWzlZx~j)?LfK zb7YA#%cWC6iz?@xZDq>){`>aF6JDjU%Fj5}8gl0yY}>W;R$bnLThcxZUk|K%T~XY~ z%aG?Ltnkm0;X&K9sR|3Ff)!F%?|Z+sv5TcQvW@@fF4uqe*b61t>~5`J{LPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0WC>HK~y+TWs$K?0#Ou1_Z#>PZNLE05E_4G zKY;#iWov08rHKUvBveEj3K~1KA$Arf8e>95B88r}a~TLu@p5PG+(InB(G6ro~gV(?ukA^4!+F7jpWwaQgJ}Zbf067ea mGPz5U|Fl7#9Y*vNkPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0dGk}K~y+TO_H&y!axv3^8@xGf{-dm1j7?a zFfm|bV`rCCmIgsgy4YI!1^EDf;5DzY$e+Eldv(bL*SkCS&d$!nbBLlyWWV3%c`klF zpGAN>^me-)>tr&Khd`R9kmvJR*R@gDL*Mtsy|OHw=WsYcek@Sy2B(hW*!-%hl4rGA zjmKkRK@i;U_siu{6a_j?rqiiWJ2=mBxg^F((=?~k2}1hWY(^q09N>1l$wLeUYSOD1 zN=2~UZjCNU67%;39#$?H76Ty#mm9@=KJWYf&w_@wZQFI734Dv;>AdIhc#KA)^?L2S z-*2S97F2}?AY!XxRGVyMH<^f$l^k&O9=u*J&Q(1)9*;POb2Pw%lmHVX1qKeehuUZ~ zlacH*7pb`&wYD;7GLX$?!=Q{od#SYr!`HJVskoiC1(i@Jgz#dqpaDEXDd{Zj(pU4r z^?Jo1j)96Hx*-fhR#(^uPA$+r7tXRw#K80Z0km10&M{`7J^%m!07*qoM6N<$f_L25 AZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/rubberLeaves_transparent.png b/src/main/resources/assets/rpworld/textures/blocks/rubberLeaves_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..ea379b87c50ce916d6c45e9a9eeaebcf6f4ac4e1 GIT binary patch literal 553 zcmV+^0@nSBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0h&ofK~y+TU6MPh0$~h=X9M;kf?y@0peQop zW5CA7&Q2>!A26t$7B-fyzy-Jg8ygEZakrDp7db!U6lW&MpPW3SZE^`{x7#LpI-OdQ zBtc)V*Fgq)b7eA_*x$vXQmJH+AmcC`4qd+8Zgw~vT-IB)T6NtCmdmAONoKQ|%biZg z0Krs{502yb``K(ZCX#NqYsF&Goocn3ozG|6?RK_UEIbH%xm-5l(7ghLEJ>@?awqJ^ zRXW3DCfDoL3Wb98dOeHY@3#j&pHByEKmrKBrqb1ph)C`; zz=@17lTmvIkH^DF)H|5Z=T63Ie})JkArJ?S3StO&qY~O-z1#;jC(wiyOqm4BCIa0D z@?bFVn{fge6|8I^KTvEWl_wU^E)#d@TA0?%?~4LNfMM00000NkvXXu0mjf%UbHR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/rubberLogSide.png b/src/main/resources/assets/rpworld/textures/blocks/rubberLogSide.png new file mode 100644 index 0000000000000000000000000000000000000000..efaa9c8a2057f31a375fa22381c3bd7ff3da91a2 GIT binary patch literal 526 zcmV+p0`dKcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0e?wEK~y+TU6FB1!cY{&{Z1BHE1{ua;3PyX zvTW0gp-fx`)`}=7NGM`Ng%v^({o7aU_c$^w*!J$d@0@$iy-O8Wm#)3axYu~wZ-WD+vA;uQ5(VzYdWzR~ass^`AI>8_qAuy6R=n{lSNmlMRohDOLNM3oy}g26 zSWb(q_SLM>haZP+ycj}a>3!%s)*=XE5gcowTgpl8E@*-_mN+2bcpSE934$0KfW9w} zURj ziZ6dd2+-(gQ4*Za009vY0zCvS2$&ipnOm{3M0@>dK%XZ**9=NLYSn~hX%e4Vl7d8q zAWl-C#Gr*VYlU}KFL9xkTw_|XRzwOJn6bp0SOgJn=1J9cUIDjp;8tzx7ZXY>iO-G* Qx&QzG07*qoM6N<$g5Pq}TL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/rubberLogTop.png b/src/main/resources/assets/rpworld/textures/blocks/rubberLogTop.png new file mode 100644 index 0000000000000000000000000000000000000000..d4203ebd7e1fbd835311c6c1f3033f8b33d65170 GIT binary patch literal 798 zcmV+(1L6FMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0*^^VK~y+TO_Kjl5@8(2?_Y9muGw5)#&jkc zgrZl18093&BtlU*g-{|)IKq$lWCgk2iIEvOK-xtez-k*KhNiV zpU><4JcRO2tG-8KC8cKNy(zNie@Ut24QcA_#EwlnAZckLu>7j!e^$8T-Iel|Unjj= z;{2D@orYxegEfJ>_!9elQaDHlU?yNibu}CQE<}!UVY^Bu#AwJ`VYQU-1;^AP&z|qC zL-K1b6ccE7UXJeb>_sKcSoOJpy;fK|D{ma-KW1Ze%0s<33?F8K9Akq4a}wxMh`3Kn z+~>I0Wf)E^&5CJOOfgoCBEdRxp*hZNwyNbuWv6R=7?5@7$$lw2^D^}IwNBRFbF*2~ z-ew~2&p&%;kVz~$k|L$tJChJyunzSqZrvad#csqysbw=-W;VQpu8R#k}e0xcM)JJ*j#w+M;#>RQ3?Ycq3qi(ZGaaN8ZXv|RD^coZ$ zjwedRrJJYCCTpdfy(xh zkf1jgCIb^sg}4u=@Zgr~&|(G^Y%aQhWSuWGcs7t?I)JN9(3F2%li%3e1U}h6Lob cl(aPc1qLUQV`WPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0V7F7K~y+TW1tC;DB}3f8^ZD*$|W5r^>Y0e zjAQ-J;Y@-d%m%26L9Sr2XaCQrgDTDw!hvZhND!nL*$|!(h-M~5X0VuW8Yfr{lM(BG zMg>MZhM2H|B_myI|1+u~G;?`D3}n=Rh+zd8ey%7kG1XE5({P)Wm~d-`fr4Pq|EWIC zV1;_B%KtUxW&itG8p1V#TnaJ_%0&Q}7eLMqw72~4V4@G^%Snl&Xojgl2?vk_*ncWa z|NU*vz!ETp8Va&t7lG6;Td@6Slw#EPqG6iN^|bz*YpeZ_aJKpHW^VM~ z+CT@pMsxrR=_ps5|IVfe|C0=+X2<-GbGIkofaZkY|5gUtSO5S3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/0.png b/src/main/resources/assets/rpworld/textures/blocks/storage/0.png new file mode 100644 index 0000000000000000000000000000000000000000..d28b2d961529c7068fcd52f8d0aa0700fcb79550 GIT binary patch literal 802 zcmV+-1Ks?IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0+UHZK~y+T6_Q(T6IT?4KhHU5?iY_|d>K2A zA;t7Z^sTQ&eJVmlY740CLjgqv0lh#TLV|)4(%kLf7(x^~c1+xYqqc!al`0S*`lC8X zTkC0k+Iz3PId5ivwBu=&pVjg+L{o&fv429JL|j2kqW^%pi24HSbJQnDZdth%RoJKe zyGRBkyX0E9>&PX<0&*T>26+p09diygFcVBgnb#41z8%1@;j0@ zq(JeA+!4`;;1Fvc*+Tq=v4Gvg-@v<$&m!TF!ha;MsT@)Mo8n*Op5r`4?4oa>Z{RfW z9}zy3#oIDuiLg)f597zwMpRN@gx^DT$h1)noNcllJ?ZMDhKPR2xXhD%LjD=?Q;Pi$ z-Mj(jE~<^y#BCD~^lHzjbga^*=1<`;i`~ZA!|dXu)xp}qYT=~TZDZ`ftq=8DR~2_e z+#;AI;4b!KR1dxPVM{AzT3G8M-f}8E@1q0vRNqLtGU{f+9rAO;Org@So9GX59^<7~ zTO-&|g|@2hrNii@jtcj*Xh^wB^*(tnqkcx8MxVo4#azd2sJN+;N11#_%kRouss~j6 z6}!TDxP<*Z-VL(% zv~ZDZiY?=>YSE@v>QH^g$rsw`W4->usW+T4KEpVN`(-BgtrlDn{>Lav)C+jgLoe{kb=>5RCIF<{A7mxMxN1wUzxw1YhA^)V!-A{FP`?j<4FMR-D?J gH@@uGt_79<0S7Fn@`*e7LI3~&07*qoM6N<$f*5vpZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/1.png b/src/main/resources/assets/rpworld/textures/blocks/storage/1.png new file mode 100644 index 0000000000000000000000000000000000000000..838f49e44468533cd600fccd9c03eb90e0c8a096 GIT binary patch literal 929 zcmV;S177@zP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0}@F@K~y+T9g*2j6Hyq&N1)TW_s*TAltK|A zpdhWKEefS*OF;`|I!vc6NPKd8H9VM@XiR)?iHZ9ba6zkLV%&*KAjB;p3bGX!invro zDT<11!9T!>FX!oZzI^8#V&PUx?lEiLjf(ucj?7LIcdZb1ELC4IksW3#RE*k<;FMK; zXa%`vdFocZAaE2`K77kyTt@J$hJ6Ut2>SwW(T+#G>}n zoJY$tV`bWeT{Gul{<^_@9r>r8`YEM-S`8u|FeJcU5!`jFPuWvjiiyltLq@kLW75GT zYVo`P;$AQ-z#l&Ht3ZA9!7&MjW%xoskGG`v8ji@uUw9){>Vh z3Hope>UOZ7W%iq&k2djd0^DE__seL&i$?=W1`zdv8J}_vhU>_VN&@XRp__L6#>;<@ zwPTH%L79IZVESZwSVV7q@QbL>I3C2a!T$yufwr5NORM;PNgI~Zp9|Vv2|ukz{elt$ zPD$#S1`wCgd{8MvF;F230k;|HHXFWQt?d%n&T8E0qPyH+z)gMfs((rJpJtfw(}^IS z5$QfVXwN4=OEEZ7%7mQkg(^kiRVQ_?ntI_;#k?pPz{y4~A@gxBAFJg03c2&S1lVE# zhsv094t%x>U37ulYt&EO^)|D))Csx z1l*`Wn+TYtL0JUcuBEdHW-DZ}{csL}c52Zc9nQnj1}JPJm8}|XFTv$PX*Vh5Vm6=R z_S3?CTFhtUJX*>}rX0$$SEuCBhQkDNgrE!jaWSL|AbFgmi`4j{mZ^Z$NrEdRlmcx) zA!3grwwRJju<;nOlrYK(9a{>yQ>0ji`E!`NK*<$YIZGK%QPy(NTt*Gpg#!=hZ22(w z0BPUHhwtJ?ZLvgdmm_k7$V2)ux$NjeQq)1|r9A7neb(rM$XI6IN zj6S-|HZt25T^tx)is@>SaU`sg<4*N)HqsKz$36TN$~9lpm2&4>mkT%45p(fC*?t#txmK6Dl3h z&NZVl zFwSh0M$g?`&RHjSoxX?Uj;KJ&d3CSzVckEYs-q} z`AUN$Zn`67*?h;Uv=!+fBW>YQN7&MIhbuUR%@MnjcSoy<>}G`NT*Hq`dpErT*fHV>>_l#PPwpI1`vM z=iaa7-xqKH^!?3Sw`DJV5rj{^ec|fyJqzDk^U;^PN>>dBL6i2K`s&DmWh>Txo^$5> z>JcC?W^ZA^;r$uwvvSY;bne3_zz#d;%F9n!^2K*Y%Py6FJQOg&uO+_n@~bO%e_K*^ zx%QW-fPP`f;Lw+1SA6sHm4^GR?im1@2Zh*2j@kG_Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0&+=2K~y+TJyF?i+CUWb@As|kLlY^AqJ*?T zSs*kJ!ftHF;C&z4*x+qEc34D~ALyl(Djm(sJ=?v*{CpTTx@aVLtb}J~gtTZVxG$X9 zXXgWCbXlqKGOM+Q=e6c(?eY8hEz_IGZoKo-H!pt=ijO7v2-Cg4-dKLF;7qYsQ#BaP zo!?WVF_11BU4~OUpMHk)b6tL9xohtDd;p+y=yv!Xx zJA~Cfs}2d>NBK4+r5l%cMKnK?{B#jyl1%`-vAQ2hOrMv7cpqeYKifL#){Tj^rj}2% zkVtMKFH^}UbGH;6ij4GOpfcUj!VW7d*%<3m4GVzcQh@3fvQtRjk-hM!fGgf8nj@WQ z^aR;Um5>@yrmUzMl>eakRQ3zedp*J_LA-G2QPAuo5e^bi&?rl)d#@TKEGdjdx0JmC zUePZlTp?#$e_k+mJzlUA*(zYBx;e}gpn9(oCg2Lyp%QXS1t0ZoSo&9so9X1gAG8Om zXyrhf!J=jk8UYh6qN-nXSe28Vgne=YuAKOE|aUagNL*8+yt( z7jdBll@V@4uj))x=DN}6vGs3*s)nn*s?qOG~!>C4T+uWknl^X2Q=w~M=zdgrv>KCM0f zs6AiYkFFls%NDw63s0;*oV$QF@7(m&ll$=>*0yj??)OG{00000NkvXXu0mjffc068 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/4.png b/src/main/resources/assets/rpworld/textures/blocks/storage/4.png new file mode 100644 index 0000000000000000000000000000000000000000..32c8a00037d235ee208e318c2d45c702d6798454 GIT binary patch literal 647 zcmV;20(kw2P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0r*KoK~y+TB~puysxT1k|9^vjV9ai=F-FW@ zmeqJ;)M!xguB<3RX{Rqxe_&5xQkp64nKNf**lxG`-`eqb#D2M4%Canq0?zq-KAlc+ z9IsZZuPB;MChu==>~J^`QC-*0Ib#f*rfIPIKh_%UjTc3Jy?!Uj{3~LJVXb{WpO41_ zAowtV;rSr&u@Fg7k>~#w3%1#8IOkn3MG{M6DTToJRRgV*)yipIaXy>PSQJG_*AN*z z5?ql0KoJ4sxwNj0X`F4G6GF`Ab2gn$^V`iTiDjhFvV9FU09ppT?j!-eUawgYOv)m+ znv7PSM=MQ)#0*}yN;*BAg9@?X@Q)}7h`w3-J}rEBPuTj*9I_;Y)j-B?S8*!gTVm( z+itf>l7I&=Op5OsX305>A!ZR{_Ikardxl=G*YEeo<8crKVHhqJ3k-akruX|D$UM)p hEW2K>-Lx;4%U{&}r!)|p_f7x+002ovPDHLkV1gw|5gh;k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/5.png b/src/main/resources/assets/rpworld/textures/blocks/storage/5.png new file mode 100644 index 0000000000000000000000000000000000000000..79a47a8ccafdf9c68d255ee21db629c924b8d6b2 GIT binary patch literal 758 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0%u7?K~y+TB~sf?6HydBKLJUZbD3K|#P|Ui zDhSmOMMWX0&^hN!8Bwm5qA&;oM!!KHB!C10y-Y6yXh1^HSN#*$w8_fJB(wHjYp=b@ z%n<)L?tXgiZjUtcopvIcUlE#Y0Q*>{_E%q5?eTX0B?Gw+6 zeBP$AiV}6*W=q@3JjRLH*Ern$93RsUd zznG#|Gsd5}6b=ISmMHALaG(Gx3ZM=&6+hLqL%o?z{ax(-x7>BJYksYq o$M(h(XY;A^;hDQO;s*WfKkZ#YVHaQ6cmMzZ07*qoM6N<$f`foYEdT%j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/6.png b/src/main/resources/assets/rpworld/textures/blocks/storage/6.png new file mode 100644 index 0000000000000000000000000000000000000000..637c184926468bc57fb685cdf7e769d93edc357d GIT binary patch literal 418 zcmV;T0bTxyP)N2bZe?^J zG%heMF*h@ApJM<30Ut?3K~y+TeUV3!!!Qg4{SK9K&e2N$|Cn1Il)Q(v=fDEUX#gZ2 z&L4$g==;7UUvvS(Fig|5EX(t)d7jy+sw&U(G)-OCl~sC>uj{&P+rIC|aS(_>P1BTR z8ATCoZ|v&88NTy8Vd#VUzVEsYH%-(B1wmlIIF2ewAS?6Kb&Uz8C<=lkNw}c_ZQJ5w z#i!AwEX!DNEB*lF_?VcgVvuTI+?xSl{Qw-_K2idiV6+M|AdX`a?aD!b2pF9sq|^Y0 zW9zPjPx# M07*qoM6N<$g1s}T#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/blocks/storage/7.png b/src/main/resources/assets/rpworld/textures/blocks/storage/7.png new file mode 100644 index 0000000000000000000000000000000000000000..e94042c70d9c247a6fd3a1c41c0faebaa03eb761 GIT binary patch literal 563 zcmV-30?hr1P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGirT_pArU8fCsc!%P02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^PVZl7ZS00E;(L_t(IPnD9{PQpMGhJ6cV36)}LKqD`r z5v+i+xDbkhiU-)+z0Ba<@H}GDR@Z>vy zS{SX?TmTr4iR>WHN>|~Pb?(0a;mlm3<-870WHoXh9x;M^3Ib5f90wreP9|Vz?>#R% zV=>mm-RVOdCyV<6;DY^kT^vv^OGLRu*23jz%#$(cEvsDzi3JcGy)u;u;q>#ETc^Sn zqYLq(?59DIWH#R3*I&lu5Ihk?mPhg9@%=-S*%!}z3kbySR%`$O002ovPDHLkV1l%m B>$(5{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/athame.png b/src/main/resources/assets/rpworld/textures/items/athame.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe354b5150d9a61a656712dd6000a3c5a32e963 GIT binary patch literal 292 zcmV+<0o(qGP)c5_$*?(LK2(Jsa9X$VEMP2)UT5j2Y q5Fb5l5Oe`d6No0HiR{dT4Fdpnz5P%?sSEA^0000_wrx9;5E5-c%#tiy8G*&cbGFE4ECMCSv$X75TsK*mbx4 z=>ApH9#nks9-$~K1XB2RtL?`Pn^zfNQUDFC@XcmACjpWo=B0lEniz20b?$QNxrS;> z9jIA^Wlp+wB1!9G6&PPJ|znf2&V8U z=KFcgX4?@$ToquG;|<9_kR4*l9IZG7(2i}}b|x_-*@BoQS++6-QGgW21G7)60%&kk gZ>~ubN+~6M0gUCIQm2QflK=n!07*qoM6N<$g89gBQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/brushDry.png b/src/main/resources/assets/rpworld/textures/items/brushDry.png new file mode 100644 index 0000000000000000000000000000000000000000..4462757aac2fabb05acf092f0528afd760358bb1 GIT binary patch literal 257 zcmV+c0sj7pP)At22@7NS@U!SDje5OkZ< zeMJ8oC==lVbVGENc>YH@i~iSB;QVi=C-9%7Xf#sg{h#I~`X59)8Swv4_L3&f3+RTx z*fzTSVAp^QQI_KTPgY6<8Is{AhvE{F3;+cr%q6tX3&dgod}KED>fybq00000NkvXX Hu0mjfqjGi7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/handsawDiamond.png b/src/main/resources/assets/rpworld/textures/items/handsawDiamond.png new file mode 100644 index 0000000000000000000000000000000000000000..a65a2da47103feb1c8e4cd0b2b1185238daf7383 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn>}1CrAV-s0X~;-zM|D zev?W0venI|@-`J8>~ESio7mU>`m+Dy>&yR7ZjxLUxo-6z`}uos)^EzWX1A}+;%vxf zNfwW7k)dteuEv38)w4RAa?gI4`ZIso!T<4&P0c2=9Tmz@qLn>}1CrAV-s0X~;-zM|D zev?W0venI|@-`J8>~ESio7mU>`trY5+Wg<-RAUcg9^q7uU1tq=m{M;0Oi4?b?bwhq zJ2Z8N$MrXvYFyh)4~IY7Ka=f$Ju4^Qr5v_K19r{|r$PgPKlXd~H&&cAcy9fI`=7hn zge5G(@AY`g9ar`9ygV5e-}!t0B$ea!$)RzdF59eRV91i+B*wL+}1CrAV-s0X~;-zM|D zev?W0venI|@-`J8>~ESio7mU>`tsjeckTa_n>?5A=qrA_-`M}&KGH0I!cbP0l+XkK@Pb$A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/handsawSapphire.png b/src/main/resources/assets/rpworld/textures/items/handsawSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..a7db0f00e94be9ad9613642c1f419197bc8a430c GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLn>}1CrAV-s0X~;-zM|D zev?W0venI|@-`J8>~ESio7mU>`m(?5#O?nnH+e4WEQ`$)6Xw{lecjIZXf zF;2=2oBGh{qR*7G^U@Y2L>t$n{+pfo;eYsq2MTA?1UQN(G^mTPGavkatW5GqcAMpW z$M_HSn;KPAXH=AD?%)opP4V#G_RH(e|EVgL|D;!cnl%5JCo6;8{2rO`WpS}US2B3I L`njxgN@xNAJ@r=e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/hoeGreenSapphire.png b/src/main/resources/assets/rpworld/textures/items/hoeGreenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..f08d33de01ad18519725e0eb2dbd14c7a14e0fe3 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn>}1pV+oOeE~~zXZF|s z8Y&t-)mFUxOd|^^vkYiERfA9GNG?D(nsy&Ffe`^TmH2d&?c&A9gk{ zzF=Zokj6GcQQ^+ab^qd>`({@#H<&f^GT!7VVm%@7#6a;0t3jKkbk^tkMTZ$$9A_n- zW82B{O7#(s!#2sAt}d?1o6i1->A1>JGTYOrA!4>64?~v1$uu5jkFAo28D^YSm_8wu cVW$McM(Ia~vObE~1D(y_>FVdQ&MBb@04Cm6;s5{u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/hoeRuby.png b/src/main/resources/assets/rpworld/textures/items/hoeRuby.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3810939310bcefe285345f2e568bdc3e98c647 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn>}1pV+oOeE~~zXZF|s z8Y&t-<7Pfboy|$T;Sn#I^$lj?5EcH-v|Y=5;Ke`Qks1z2%PX4?7ze zUof#PNMoC!sBmZIx_|M`eX}c=8_b${8E^6wv7QikVxahh)u7E%I_q=&qQeX=j}1pV+oOeE~~zXZF|s z8Y&t-)mF%zr=h*B49nB(@zeaAckktFU^bcwWcynJ@nH*jw)C{;;!w z@dXpxf;6@niVAmTuKO47+&8;|xxuWNm+>Y~5$g$oCkBd7SPj}NrL#WQFFMT7;y5eu z9NSKoSE`SA9JWc`baio6-gNdyOvhD*lG&a{4H2^qc^I-3PNwlNdu)|F%rN7u!t@EL c3_B$lmZd+IdEHmM6zFUQPgg&ebxsLQ0PE6Nod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/itemSeedsFlax.png b/src/main/resources/assets/rpworld/textures/items/itemSeedsFlax.png new file mode 100644 index 0000000000000000000000000000000000000000..c695b00acad960378ceb7f728155098b250853a5 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pxt=bLAr}705;hN>T|4rBw%V?L?L`}#CZ9fBaJt#VU+?nq>;t#r-1mIa zV0faWAR%t&T!(K qOSzzi>7*x46O!g!H0NMoW@ecAvMjLU1%nUJp$wj`elF{r5}E*RgK+); literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/0.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/0.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1f7480c4a5702c2e7efa414ed15b17ccbb64d6 GIT binary patch literal 275 zcmV+u0qp*XP)rM z{{P8d(!_ZI8G|&#*fzTSVAp^QQI_KTkJW&iH*eyNbC4k!esU--At@Vq=8r34|DQW| z?*FGxpYR%jVgRz{J$v^2fAi+e|I3#zgALJ;iSq(725E+|ZFKp;t^paMEXDaBs{vEI@FyIQAsK#hC@vu>DT4wM f<`UZH1!6G(EX68h?i}UR00000NkvXXu0mjfN1%ND literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/10.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/10.png new file mode 100644 index 0000000000000000000000000000000000000000..dd278e226be88707c14cd31b8b509e3870f12c6f GIT binary patch literal 282 zcmV+#0pVq<`uCY|DQW| z?*FGx_zgiZ09o^%J$wGYdGqG~<;$1BhG@uf|0ifbIKw)yvtc$LIB)=L2uQP!g(y}- zFuaiDR)=A8x{v6817#vy0P+He2KgCeh^`XP|0rkC|9T3X|Lyby2pbT=uo14vNR{`0 znwRK*5bb2Z|3BGFnm8{YV~}PT+eVik>>7|E%2J&Fu^QmTFa>X%gAB>=lS6R{Nl6(L gkT93fJ}(f90U8r3WNe71)&Kwi07*qoM6N<$g6)oc(f|Me literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/11.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/11.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7fcbcba6fdcd0b7714046e631b5c8bb7214a4f GIT binary patch literal 272 zcmV+r0q_2aP)SvKR7t}KS>6_G{?q%{D1D;x&NO& z;Wq@u0A$U3_U!rp=FOY`moHxi8=@h{{htT})`6W3v-!Y*17Jfyntd!pu^NKm1vj@k z44cz^ME@Ho6Xk+OU_~H5gACDC;`txtEc#zhf%Cteo&YfhY=kQ^Qsw=h<|XiQ&Jg6vKbA3;=2NS7-P?xi0g6aB%Q{k_>=p?kFJHb4Hbg^?`#(VgKz;@}8)ox?0|&r{fHeD9h+;Ja z!wcblZWuPF`-uKGP$t3!ATNMuke@+@=qmC2k8&3MucyHI-%d|}umNV$h-foX<^7-L zCHfykI~nl*Pxg`~&I`yGq#4Gx(d7rb24sk`6z6}e2Iz|6PdFe$GW_IFTtZS(1_dO{ eCA7~A#9{!{GaYE*HYYp)0000`M`k#U_(HfeJn(=8iL^k zwvt0X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/14.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/14.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0840a94e91a34eb4df08d2eec3c7dbf36660cc GIT binary patch literal 275 zcmV+u0qp*XP){=a$i=Ktl(m%)Z;$Z`KCXuvwCvtc$LIB)=L2uQP!g(y}-FuYLb z=7wQ&x{v6817#vy@CX{}AU}f)(N*I4ALT6iUr&Maznz`{VFNZIMVpZ-@BcI}(f=UY z$$hm%`mo&Elj z|4*Mj;WY%s0A$U3_U!rp=FOY`moHxi8=@h{{hy!#AU}hg4YT>cfdgPeK$?9lM6nuz z;RRn`UksbmeMJ8oC==lVkQYES$j=}{bd`AiM>&iB*Hhs9Z>J|foEKnhBURr2X6_G=Gf!`2XCw zbN@em!fyzQ0mz#7?Ai1G&6_v>FJHb4Hbg^?`#(Vg)-kLDI~!*6fddD?hJZBtScqaZ z1j7q;Zgm(or~8QhH&7_W83KRgIxnML|KaSKUM>#FigQ4=O9Be{NzwvLQ+x& h1tiQRw9gB~VgQ`jFr91cy!`+G002ovPDHLkV1i5jen9{L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/3.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f93ed68242ffba7b0d04eb21ff3f736ce529b085 GIT binary patch literal 283 zcmV+$0p$LPP)$Iu(kimG61AGr{Vwq#p^!(4-O9gPm%#J&2v_K{D1D; zx&NO&;Wq@u0A$U3_U!rp=FOY`moHxi8=@h{{hy!#p5g1j&W721;J^W}At22@7NS@U z!SF(CQXPiP={}Q4l*RePY%T;Bqe1~ hK*C%?`@BFb1^_XNFQ)bK@GAfS002ovPDHLkV1nFif_?x1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/4.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/4.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4424969c0a700c05214c320f50129cb46e9cbc GIT binary patch literal 281 zcmV+!0p|XRP)6_G=KaU`~Tdz zb3j8r;WY%s0A$U3_U!rp=FOY`moHxi8=@h{{hy!#>()V>4YT>cfdgPeK$?9lM6nuz z;f1<7Hw>H8eMJ8oC==lVkQYES$j=}{bd`AiM>&iB*Hhs9Z>J|f*no{25z%I(%KJaf zOY}d8b~51qpX?<~oEMNWNHdIWqstF=4ag8>DbD{`4VW?of5HJ7lHn(Z;u4aQGAJNn fE}?y1AQl4vsZlVUlxZBe00000NkvXXu0mjfr%-#q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintBrush/5.png b/src/main/resources/assets/rpworld/textures/items/paintBrush/5.png new file mode 100644 index 0000000000000000000000000000000000000000..29352217e063010ba2b89b49aca2d1216141bdd7 GIT binary patch literal 275 zcmV+u0qp*XP)^;1ML$L4F1qqN~L7KgwD3zn%i;e>*(^A`IAwh&Cft-v4P{qW?j( zlL7z#WG`vrynu{Bnqh1kU4F1@K!zwwasJ2df+_eD4#|1V#@3^qhVj{84B1J=2OgPjet`M`k#U_(HfeJn(= z8iL`4x|k#ko6~(n{~IV1;R28sKs3nDAVYMOc>YH@i~iSB;QVi=CqUSMjjj=JMMkQ; z|I@rg|AS~J1OETXUed&Q0U3id!`L>u{9xCB3{jTi{EyXuDOO&1;~Zp2hMydYOGrw} ipn!zAg!XxXSPTG7!!Jg;WJ2Zu0000taasMZ10LafEXTxkhaNq#g5Rhgc3sJ0wV0a-S zA_BwabRW_G2FgUZ0OSP_4e|!a5M3pn|547O|Me6&|J&&a5H`Tl(h{!7NR{`0nwRK* z5bb2Z|3BGFnm8{YV~}PT+eVik>>7|E%2J&Fu^M1tV1PHyL55`b$)UJ}q@)ZANSI4# cpBIS50LKs`(tLMEzyJUM07*qoM6N<$f=|1V#@3^qhVj{84B15#2_z|Mx*eBi(VupuDLJ{F=_ z4Z-k2T3Q;0&FMa({|%IhZ~@2*AR6RnkRiHCJpZGdMgQw5aQ?T`6Ci8=$aWapNR{`0 znwRK*5bb2Z|3BGFnm8{YV~}PT+eVik>>7|E%2J&Fu^JE>8j3g0L55`b$)UJ}q@)ZA gNSI4#pBIS504hfYH@i~iSB;QVi=CqRS&8#lrg8L9IAPxBJ} z52Bq6`2Qz+NfYM_W83KRgIxnML|KaSKXw;PnSwXYL55`b$)UJ}q@)ZANSI4# cpBIS50FYlWo#uo}9RL6T07*qoM6N<$f@h9?A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/0.png b/src/main/resources/assets/rpworld/textures/items/paintCan/0.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1043ec605137070da66080c23226fafc267f67 GIT binary patch literal 366 zcmV-!0g?WRP)o@EAv-32A= z&xLabu5-Sb;a*3<+ivt5@%FyMkM)0m<#GwqVzFSo44`DovJl5Hk|aTzrZ}BWy`V1u zMN!yzy*#z zTrL;5t_#O;uv)FyoaZ@$Am|57r&H*<&H$=@zu$TG=ktl%?S}b$KHR}%GU18@Xqtv& z6h%0n&m8GH0c2V3AAu6cNUHz>% M07*qoM6N<$g0z98{r~^~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/1.png b/src/main/resources/assets/rpworld/textures/items/paintCan/1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d49f7ade92d0113ebb4ac40dbc051e77b6f84ba GIT binary patch literal 393 zcmV;40e1e0P)9ygog!KGss&w4e;{v`hVlbjsFWG`2QycI{uIJvH$PuXbRSRDwW}Xc6K&y z11v2q|GT-lfepA_!18}f0{8!!p#uL8rE&gW8_VNJ}3-tB%|3^kff(>|E&IqPg ztXT1X7SIq74Uz{LU}|cL+Y2BCAdMgZGXNw8(mZY2wEsm#MfeQ}4Gje=hS>(9`vZl* znmao?|7T`q;*SM8J3Fw=Fbr}5Omj&|3D^KtRn`A^6OyyD^M5NVE3g5`nn50)8-x7|!syPXYGwieGkYAC!~9u-00000NkvXXu0mjfiVm?D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/10.png b/src/main/resources/assets/rpworld/textures/items/paintCan/10.png new file mode 100644 index 0000000000000000000000000000000000000000..302521168f67cc1cffc100ab5cd8658fa712e15b GIT binary patch literal 392 zcmV;30eAk1P)CjR%akNodw>I>GK%5ds`c6K&y z11v2q|GT-lfek2Nx&1$Zd&~b&ftml)I1l}gNJ}3-tB%|3^kff(TkGcz;s$AX=m9oS|V2Dt#Hxum27Y=Ek&>VLcm$=TWYzm=60*Z^eBAe&WGRQ?m4 ml#Pvz!TtqdbZ1jFGXVe>p&XXtvIA290000AczJpKzj5Qne}4W2|DBzSfjIlWg+(}6GXuk^|Jm8uxDBwh zwEXYp<_0!^h2{2tZtg8Wzt8;7$$1DE4r_si*x+}8zP|qd$jC^r0gQ}q!Ssq1D}aW~ z0@EOQkO8KqrntQTQUKBj0x$zWVj#`arcL`_R8)lDfY8uTuws~PAX-SMAFR2vv-5vu zW+whvu(PuR+YG}X7r-=^l$3xCP*qj^k2fJXJ3Ifkva$jjfUFs0vxu%-8fx%6#u|QHdfH+eZ-ZWbgNSU%+SZiNd$}c4tVaz-{Tz zf$t0)=lji!9<|D!Yrm0fZ*%-u{|AVo2&^CoL>mJ*xhM+U&?P)NfltS9=zI|L3E+9& zyYUo?_7Typ=z;bS(xIFihJisqmSteb>vOy^?jWXZJYH)8NtG*R9%~SgBni5%gG*<4 zNfn-Ah0wbdvwx+bs;XgtZQGbkCIaB<_jH82)$Ac1$a`?zZ#pnd6VvHb04Z%rY}-~K z9Qio|EXx`mffLxss|WBIo13OVUDxXYd7evhUyY+p7h+y47AVVd{Z|-|$5Oc$chH+> zvzY*h2x~8rQVNda2;ifcE9<(Bjj!@(G?IB)U)%oEpJ@rpRSBtzS9^Z|0000NkluhZQ4|8#W#kI7w{^K+tBqZcN$dF8Z{r`_ySpL6d zV)_qM0yZQ{K>@58AczJpKzj5Qn|E2u=|C2N{{zq$T|Myc;0&BhqG$=be8@BRCv$OMm zW@aY-Sg^CR1KSM4AQ!+imz0!%4Nz58{f{>xIXgT5x3aPV8-T1CWV4Ej%73Dhvazu- h*uNl*?rf@NCIDRZ63V6045HGh+p>`{aN1w6h%Q$k|eCR0Z8t;jts*fUDsLomVsUXQ4}3UP1Ak}>$Yu^ z6wovc0aDjBsj7Mi<}^*&jIpGEs;X$;cdk^HB`1er$Yw=RXdFj5!1sO1^PB;wDrOh0 z19aMf<2cm!{Q*GSwv8c(*ayJ#JoyMnfDw-XU=8MVU1^%8b3og+oGhv#q63(hWuajh z&QBqZW3DWO4upB0X9if7MW+`j%Q6arfC0~DR5neM-oDDN>+-zN&$d7MGd%!Nk_W;X S>2jO^0000pw1oue$Aj}OyxjA<_wrr@uh15LBi`QI__6*EU|AMOhGDQS22iqX+vvP@ zFn$_imYkuN>P3RS0CZhvL9tOgE=1CG~6 zoP{$(YHu|*(^!#!QmKU9ZinH^5Ot#tr{JJ0m)X1)*6=(p8lWf&ip3%W_K7{_k8|`> zeJt;nm?o#tG%db^Y&HwWaTsvAI&qv#CK#j!9O*j&WLb_LffC3_D+JIPnS&rev)POX zRI61^4y#e@rn_wReIKst#@|9dpXbVyhDXNW1zY%YbBm7wZ2e54$B*QRRQv)d3_kEc4 zBg`#cV7_|=$34jfeF5mY&cdk|db*PC3$d0?4wQKLRC?kyZwvGcu3IV+;m^ zVu0s)oSapoXt$2p9LF)jFf6`>YPHIhGf@Ybc{m(0pj$TCIq3Sz+^fEx>V{Xn?A!FbsnMyIlhF`8@^$ z5zFN*rqd*Hxm2&&|VvPaE;{`|G_c0ub9O*j&6h(<1ffC3_D+JIPnR~q+T-S{U z*tX5dVKs`~?lYS^oerAKX8bJ_3I(nliaH3*p64+jl}aJ@A?dn~Y&Oe)&t|GDNfOR} k%9%`t=Ouk_`%izSciSH&*7um?bN~PV07*qoM6N<$f~+8_TL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/5.png b/src/main/resources/assets/rpworld/textures/items/paintCan/5.png new file mode 100644 index 0000000000000000000000000000000000000000..cc87f5fcd983f951c4e705b960f501268fc9c300 GIT binary patch literal 390 zcmV;10eSw3P)E9&GRn8iVGb?G9w zxoALVH)qEq_d-C0gyP48^DeyH^Sk%*UZlucOTQ6sk8Au`{|9hg7bM%ZSvvzL+4p_) zj(TWawxC=q5GNuR^aU`POxW1IXrp#lL*=Q$syoeZ*-T^Q0zA({nx^QScVHjbumTIlp2246UP2T_`2f>2F`La8AV14!-ZUXj z1?t;6lq&_}@wm8y!C-(O2pCX$D{)Mc1ma9^r0)bU3?qL8N+2Vx3_xdO-fT8lE|PPuX>>L4?(Rx1Xms*1vgo2hcY-^b2R kS=V)*m-M~uKmD0L06Iz&JWA0my8r+H07*qoM6N<$g5t2L$p8QV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/6.png b/src/main/resources/assets/rpworld/textures/items/paintCan/6.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b2cf26cf88e80b6df76bc8b76fce15b9f8fe53 GIT binary patch literal 391 zcmV;20eJq2P)pGk7rdJUJK{i0sG?=EzfG4qyD|;Eo zriUA64HumSR4SGH4irU!5P|`(i+dd7IL65bgd%+>fU2t5BTxbvX{7)rcnR@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/7.png b/src/main/resources/assets/rpworld/textures/items/paintCan/7.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8ff0baeb11e07373538093a6b082fcdf74aa81 GIT binary patch literal 322 zcmV-I0lof-P)P|Mi81e+nHW#w z`EvS3e7j!gWBm^hMG-;1@3YQ=Se8X$7%~7EMeisb zW5;ohE6{bF`o3oXN=MwbjUkA54}fW!@)ocFMqC1bIhfaVrD>Xu0d3pzVv!9I`vUW_ zEHn(m@mKIXk24FQ0%4x#nE|S*(&0hEj@!1)fJZYjD~dvIA7#TZxL@eC?4SNjH{%u+ UqWdHAIsgCw07*qoM6N<$f~y&YnE(I) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/8.png b/src/main/resources/assets/rpworld/textures/items/paintCan/8.png new file mode 100644 index 0000000000000000000000000000000000000000..fe297b07fe7dbbf3d672085f2899f9dcd278fa1a GIT binary patch literal 354 zcmV-o0iFJdP)287)OCG3xI z9JtQ;X6AbDB71u*ej|CkKk#GyAHcS4P=;ZMUIsAPbzPiJCnQONEXxoC!6fJlV87ps zF^*$guUFjfchT*3!{u_3bwyDy380w}&+|~%HJYYD*L4DM97oI?YZAbuVHgla5st?r z4u=Cw(-d=6RWi;bV6)l4vMd3xdYe|nid0M0}pxU3V$&Hw-a07*qoM6N<$f~tg+ A!2kdN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/paintCan/9.png b/src/main/resources/assets/rpworld/textures/items/paintCan/9.png new file mode 100644 index 0000000000000000000000000000000000000000..efaa880ed07d0fb490147e9bddfcbd55f1e811ec GIT binary patch literal 391 zcmV;20eJq2P);F3nZ}9)lu9K8L4c>x2wJ_4Vyy2w;kkBS7iI379rz7KIY2%O+Hsf!hP$+QaP}D(a_B@XPsZcD5z-~>bj2lzL$!g1g`5+RaG1;%aX&x zFwi)TECHIPkyMZ*2|)tty5{gSO*GFl2LalW3gS4Xecu_=G#L?W+m@wLfn`|~hT&Zx z*tU&v9Ow81x~@~6=N!WG7zX$b0Zt`t0R^uDtRcLvE4OhdNYj*y#cm=9mSy1y9ZtdX zytn>E7$b#1RaH8?NI?*gZQCq(3}a_SQRw5VY#7GVDF5~|-2foqD3Y=8pz{C#002ov JPDHLkV1n3kf(`%x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/pickaxeGreenSapphire.png b/src/main/resources/assets/rpworld/textures/items/pickaxeGreenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..5bebf488a84a5d8c6ff523cf89bc4f5e0a1e41e0 GIT binary patch literal 485 zcmVu3du#` z$4SQw;Q9EVFZr!qVXT=;$+Z{1+{uz)H5w6qK)}SanrtVcl9&leU}?bp=ZGFCCxLC@ zwdF`UGD+~*&xAYj9dw7jMtN{YJUKP!I+Sf2tVx;YHGS6C0QPAC7dFw8jH*xdU0-E;7XVZX zrir+K05kKg7w4j^l0eqFwL=fDRat4ga zs7fd@7NEecY>(0QuYCeoaU3I6^eRJ%E)u+Jb!?}`KnM&i*qf-yjpg{?djF%~{lt;G bYJnub;K4lYJUO`l00000NkvXXu0mjfjC|Dh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/pickaxeRuby.png b/src/main/resources/assets/rpworld/textures/items/pickaxeRuby.png new file mode 100644 index 0000000000000000000000000000000000000000..6a42dc2b4cec6dbe32b5442370abeee2538371ac GIT binary patch literal 474 zcmV<00VV#4P)6urB2EQq8Agtj3VjG)1vgn%8SAbkLxoLcRqql=46!6)zmd;u4i3_e4l&(iIy z=i>RA)D9=P`R;emxqp#Hqap9J%FKx6C_%T|wFCr6@OB(W#^bRtZ7AoZDvrf*9)bz+wEV1>2!LvP#6>cIv`1sf*%?F04Nz|t(^{<6TyIWh5@8g{l18IU#(H6DY6(h~5f)&8plE{((D0Sl zz&Uh8$+Q*o!nM}_(H%YKw1+`;@jTCO2hR6=&*z*URA*1ZAaBB;T84hr1q`U=_&a9O zv{hogS6VnetZPS;_$DLMW}z;>UIh zn=4)xWHm}I#QgY@3E)%Q4~s^Dx_#%%|9K!j%Wtfl%a*>b1+lU0Ln#-5XVAdOhmQX$ zA3U;KKG3kv51lFABH3T=lGn2swZ}G60ULI*A$*89U^U*vqI>8c2cpo6JBP~+^>r*j zycka3H5q*7`9p4ZEi%b`V!j}+<+>Jj>LA9r%!+hCj)kvZYW^Zsj!`% zK_)ncr(J4>n~69f+NR3Y?Jz{@^!aQoYMrC;2`nNfzJs)vh(AAR+((f3O|aK$%(%8 z3||(y7h(S^Oxp*T)5?T}UbA$guK92umLOsD4#0H5GWq_x%)&B`C#s9Z1pNN7%VjzPE z8enRq`(H;>1*~D=ltwTHv0>r_4N#Dk{_pK#4c4HouJT`5UKXs;$Ia$HNRB8MoY}MZ ze?o-M|4=WN|L(Td{|nP2|LKP813(HkE$REed+oIU>lRG>pAZu8zoszl|EXOI z|8H0_;lHky8h!&n3P3hpJ-+#WUQ!HLbC{Rg{|g6K{Xf2a{{IObH5jgd8vxQ=nV;}~ z-}>qQ&mUO%|IpTjV6W5`r2apl`f?iONmHzMTVhz@yt*-K4SzZ>b(Z|i^KS++C z0U(WM_ALIN5aIJb)XU|+yRG&A!t}`hyVpzw8;aKekb+H1`u@+G-0*+%vKjvqLIVER z6=(iGzGMFX4NE5c*VR(PZvaTaoC!7m?_AjbKR+e*e^p-6|1dAN|Cf)h|G#hjjQ@Hvpu$GC$$}lIhL=ubtZZ|Jcr@V6W5`r2ap}VH&W-0B!REu^0d=Att)tYUlp| O00000#LT=By}Z;C1rt33 zJ=4@yqg0@pxt=bLAr}705;hN>T|4rBw%V?L?L`}#CZ9fBaJt#VU+?nq>;t#r-1mIa zV0faWAR%t&T!(K qOSzzi>7*x46O!g!H0NMoW@ecAvMjLU1%nUJp$wj`elF{r5}E*RgK+); literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/shovelGreenSapphire.png b/src/main/resources/assets/rpworld/textures/items/shovelGreenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b5a9c82cd673a1e486d2d27a5a5a8de44d0301 GIT binary patch literal 388 zcmV-~0ek+5P)~fD!7*6iTK#{bF-Viz4+94I%j%>X0MzgwhCzm4HGolz0V{@T0%O^|s$fGv z>QM{;Dco~^4@2dwN`{b@5C;7QT?VEqgl3?#!J0vA3y zoVP2Np?^a^gH5IlgUwtU28Qiu2EYQ5xtjs58D_KY4lM?q*;))Xl{O4nTeBF#PKLoX zV?-lRBZ|$iF!7$~#SqyZ!4P%`RWphKAPvYi!(s(y2rNONr%rhEA!|lf0F%d+yfFd} i-2g%uZUa7B@L>Qc6L!h?fq&fq0000Qx;lltW4MbhfQ>@~j70?k7{YuvfiWz=Jk3P0YQ`{tUo;a; z2S=_((cGD?{$E3m8?G7TS_}g~f*{Re@{_*xx;6TM`Kv-Z8TrSFClGJ%bci|x00000NkvXXu0mjf%4w3N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleDiamond.png b/src/main/resources/assets/rpworld/textures/items/sickleDiamond.png new file mode 100644 index 0000000000000000000000000000000000000000..f6663fa2bf5abf374ba492175c86646cc5102665 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhPi$MCzJR5)&TvRUUD(INV7B9| mi^2kdo|0+CzDB}!JPgTIf)-C-{7?ishr!d;&t;ucLK6UIGe>Oz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleGold.png b/src/main/resources/assets/rpworld/textures/items/sickleGold.png new file mode 100644 index 0000000000000000000000000000000000000000..769b6a52880b4d219b85765efbca6a4c29c597db GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhPi$MCzJR5$f*qO*+RzFFEZC=`<|JIkUKIEEcXx1Fa!;pFI!{p!V6_4{?XE>ywF6`rBFxzp~ mMPY$JPsuc6Un5~V9)=CvlGjpybg}}S!{F)a=d#Wzp$P!YtVPiP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleGreenSapphire.png b/src/main/resources/assets/rpworld/textures/items/sickleGreenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3fd23f17f6db50a598ff798808eba7361169c9 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhPi$MCzJR5eF{w#V8sbOEc(VR5&YHSM=ZX$&QCo4iZmNnm9Srj6IC2 kn3S|M59ciNOgq%h=zopr0I|hG0RR91 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleIron.png b/src/main/resources/assets/rpworld/textures/items/sickleIron.png new file mode 100644 index 0000000000000000000000000000000000000000..b5dcfda7abc3b758fabc848b07dd89ce763d7e3c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhPi$MCzJR5WNxtQz5yKKemb^PV8m|gWifK42FzFD(lAjL_Hfyw9xXzH%cHtO9Od#82 zXFeYu<_$k5FERLFBK-IM%ys|jpPrifKk*{_;Tt?|h73zA5BtB{-zH-o!_3h<$HzeN qU=CZRo4BDDfV90aeng66i2QK@3sZZZ!6{Bc$EX|;cQQ@p)UD1EjCp#WWIY>N7Y2xHeGxjj9 lVp7u5Je;%4Gwo12V?+{5)QVoNjX>8hc)I$ztaD0e0sz|!L-7Cr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleSapphire.png b/src/main/resources/assets/rpworld/textures/items/sickleSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..c4155010574c93c114e7a97f372688fe9384fee0 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Ln>}1pV+oOeE~~zXZF|s zCy%*E9?*XALB8drQG@@9hx@lZz5U;-N_?Y~(-dxpwg!U}0s_997*DXB%$9dEY}v<_ zVBBKHwt!t^*PKlUOYg8Hd{*ByXVE#&KZy@A)qd?aj+M>hFmk)zlgQvv+&2GCJ+I}v z{|3{6#+*EH?pPMXnY0OMUszZUS4=iKlQt_wtww@j%W>B0=WBl-2fB~J)78&qol`;+ E04CB@egFUf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/sickleStone.png b/src/main/resources/assets/rpworld/textures/items/sickleStone.png new file mode 100644 index 0000000000000000000000000000000000000000..7f783be309e1935d62aa02280eb770f289df4876 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhPi$MCzJR51r`Yx*&MWbVB23?E_XC>>3{+mA8@leV^;z>#qCuf?mhjA5? jl9uM-oMoPAhuRs%MP*Lart&)gUBlq%>gTe~DWM4fdkZ(C@#IR(eZs^FVdQ&MBb@0O~kG;s5{u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/swordGreenSapphire.png b/src/main/resources/assets/rpworld/textures/items/swordGreenSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..053dcfd05051268ded2491d7c38b6ce2a8870080 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLn>}1pV+oOT|u|w{`&8dJV9-%Jlp@L`l~1BF>Fc`@SVhX!=(90rxC;Sv_(7zmP;OGFyrm}ui(>_ z#>4!>xbqDj@UIqrEpx>7SZ@WGMI+VfF L)z4*}Q$iB}QLa%s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/swordRuby.png b/src/main/resources/assets/rpworld/textures/items/swordRuby.png new file mode 100644 index 0000000000000000000000000000000000000000..2019a6777907dd4c03a19b9045d4fdbb1791a127 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLn>}1pV+oOT|v~k`18N^ z#0>|w{`&8dJYku97TbUQ)7ca97&fH|_)cQHVbXl0(}-bu+9I9<%O#I8@S64gSMcdd z<6$=X+4`_eV6o(3ZiTaxkE9#`vDY&m$v7s}aiVQOJEtSF%~_ZK=|4{XZI^74QDfm{ z$b9D${(rsV@xStxVH}c7;T+o}S4rOWX5nr4Idh6n>qDj@UIqq3o8Kp1N#4@{I+VfF L)z4*}Q$iB}Uzt%- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/swordSapphire.png b/src/main/resources/assets/rpworld/textures/items/swordSapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d6daee71ddf6b81c025ff8cc8b4632c283dd73 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLn>}1pV+oOT|u z#0>|w{`&8dJVDL$vi$$2rFxU|7&fH|_)cQHVbXl0(}-bu+9I9<%O#I8nDO=gSMcdd z<6-{cYW%QGV6o(3ZiTZ+pC%swvDY&m$v7s}aiVQOJEtSF%~_ZK=|4{XZI^74QDfm{ z$b9D${(rsV@xStxVH}c7;T)SJmr36BX5nr4Idh6n>qDj@UIvCuLVwDoHCAZ@9m?S8 L>gTe~DWM4fY>iNh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rpworld/textures/items/woolCard.png b/src/main/resources/assets/rpworld/textures/items/woolCard.png new file mode 100644 index 0000000000000000000000000000000000000000..17af50c69fbeb1ed937276a1df95e2fc6e858a07 GIT binary patch literal 377 zcmV-<0fzpGP)Lv(J17RgY(9JT?El={T(}{3?%V;p z1e+mn13-QT+5F_mlm8hR8UL%RtN%wwM}rMZNlE#?ZrwVtOAM5`|6>>cv-#Y)bN|D_ z!v62ux9@*YP!QN=5Fg|XHF+Tn%_uG~Qso7^0HhdXV{>!!|A>f)|I3#z|F5Gai&Zm5 z80abS{CBfd`oDMYUa-yC+1X&5GyLTKgIq~mEI?f{Y0@OH&HBnb|7~>n{|DHJV>JY8 zIsj<`g$c+om>9?qY%al>5|K5-u(>8L+$G9Vod59}fD5C$gk%Fiu>mr~+d_~$1JE%5 XMScoV<(xyI00000NkvXXu0mjf)Qhw7 literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..368ff77 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,136 @@ +[ +{ + "modid": "RedPowerCore", + "name": "RedPower", + "description": "Power your world, comrade!", + "version": "2.0 Prerelease 6", + "credits": "Made by Eloraam. Ported by Radviger.", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerBase", + "name": "RP Base", + "description": "Power your world, comrade! (Core items)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerWiring", + "name": "RP Wiring", + "description": "Power your world, comrade! (Wires)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerLogic", + "name": "RP Logic", + "description": "Power your world, comrade! (Logic Gates)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerLighting", + "name": "RP Lighting", + "description": "Power your world, comrade! (Lighting)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerWorld", + "name": "RP World", + "description": "Power your world, comrade! (World Gen)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerMachine", + "name": "RP Machine", + "description": "Power your world, comrade! (Machines)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerControl", + "name": "RP Control", + "description": "Power your world, comrade! (Computers)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +}, +{ + "modid": "RedPowerCompat", + "name": "RP Compat", + "description": "Power your world, comrade! (Compatibility)", + "version": "", + "credits": "Made by Eloraam. Ported by Radviger", + "logoFile": "assets/rpbase/rpbanner.png", + + "url": "http://www.eloraam.com/", + "authors": [ "Eloraam" ], + "parent": "RedPowerCore", + "dependencies": [ + "mod_MinecraftForge" + ] +} +]