From 2c7ba4f0706846e487406f664841723955537c0e Mon Sep 17 00:00:00 2001 From: Calclavia Date: Wed, 14 Jan 2015 19:06:03 +0800 Subject: [PATCH] Renamed RI to EDX --- .../lang/de_DE.lang | 0 src/main/resources/assets/edx/lang/en_US.lang | 385 ++++++++++ .../lang/pl_PL.lang | 0 .../lang/ru_RU.lang | 0 .../models/LaserGun.png | Bin .../models/MiningLaserGun.tcn | Bin .../models/armbot.png | Bin .../models/battery.obj | 0 .../models/battery/battery.png | Bin .../models/battery/battery.tcn | Bin .../models/belt/frame0.png | Bin .../models/belt/frame1.png | Bin .../models/belt/frame10.png | Bin .../models/belt/frame11.png | Bin .../models/belt/frame12.png | Bin .../models/belt/frame13.png | Bin .../models/belt/frame2.png | Bin .../models/belt/frame3.png | Bin .../models/belt/frame4.png | Bin .../models/belt/frame5.png | Bin .../models/belt/frame6.png | Bin .../models/belt/frame7.png | Bin .../models/belt/frame8.png | Bin .../models/belt/frame9.png | Bin .../models/castingMold.png | Bin .../models/castingMold.tcn | Bin .../models/centrifuge.png | Bin .../models/centrifuge.tcn | Bin .../models/charger.png | Bin .../models/charger.tcn | Bin .../models/chemicalExtractor.png | Bin .../models/chemicalExtractor.tcn | Bin .../models/em_contractor.png | Bin .../models/em_contractor_push.png | Bin .../models/fadedSphere.png | Bin .../models/fissileMaterial.png | Bin .../models/focusCrystal.png | Bin .../models/focusCrystal.tcn | Bin .../models/fusionReactor.png | Bin .../models/fusionReactor.tcn | Bin .../models/gears.obj | 0 .../models/glassJar.png | Bin .../models/glassJar.tcn | Bin .../models/grinder.obj | 0 .../models/gutter.png | Bin .../models/gutter.tcn | Bin .../models/hazmat.png | Bin .../models/laserEmitter.png | Bin .../models/laserEmitter.tcn | Bin .../models/laserReceiver.png | Bin .../models/laserReceiver.tcn | Bin .../models/levitator.tcn | Bin .../models/levitator_off.png | Bin .../models/levitator_on.png | Bin .../models/manipulator1.png | Bin .../models/manipulator2.png | Bin .../models/mirror.png | Bin .../models/mirror.tcn | Bin .../models/mixer.png | Bin .../models/mixer.tcn | Bin .../models/motor.png | Bin .../models/motor.tcn | Bin .../models/nuclearBoiler.png | Bin .../models/nuclearBoiler.tcn | Bin .../models/pipe.png | Bin .../models/pipe.tcn | Bin .../models/piston/mechanicalPiston.tcn | Bin .../piston/mechanicalPiston_diamond.png | Bin .../models/piston/mechanicalPiston_iron.png | Bin .../models/piston/mechanicalPiston_stone.png | Bin .../models/piston/mechanicalPiston_wood.png | Bin .../models/piston/mechanicalPiston_wool.png | Bin .../models/pump.png | Bin .../models/pump.tcn | Bin .../models/quantumAssembler.png | Bin .../models/quantumAssembler.tcn | Bin .../models/reactorCellBottom.png | Bin .../models/reactorCellBottom.tcn | Bin .../models/reactorCellMiddle.png | Bin .../models/reactorCellMiddle.tcn | Bin .../models/reactorCellTop.png | Bin .../models/reactorCellTop.tcn | Bin .../models/rejector.png | Bin .../models/rejector.tcn | Bin .../models/slantedbelt/frame0.png | Bin .../models/slantedbelt/frame1.png | Bin .../models/slantedbelt/frame10.png | Bin .../models/slantedbelt/frame11.png | Bin .../models/slantedbelt/frame12.png | Bin .../models/slantedbelt/frame13.png | Bin .../models/slantedbelt/frame14.png | Bin .../models/slantedbelt/frame15.png | Bin .../models/slantedbelt/frame16.png | Bin .../models/slantedbelt/frame17.png | Bin .../models/slantedbelt/frame18.png | Bin .../models/slantedbelt/frame19.png | Bin .../models/slantedbelt/frame2.png | Bin .../models/slantedbelt/frame20.png | Bin .../models/slantedbelt/frame21.png | Bin .../models/slantedbelt/frame22.png | Bin .../models/slantedbelt/frame23.png | Bin .../models/slantedbelt/frame3.png | Bin .../models/slantedbelt/frame4.png | Bin .../models/slantedbelt/frame5.png | Bin .../models/slantedbelt/frame6.png | Bin .../models/slantedbelt/frame7.png | Bin .../models/slantedbelt/frame8.png | Bin .../models/slantedbelt/frame9.png | Bin .../models/sorter.png | Bin .../models/sorter.tcn | Bin .../models/teslaBottom.tcn | Bin .../models/teslaMiddle.tcn | Bin .../models/teslaTop.tcn | Bin .../models/tesla_bottom.png | Bin .../models/tesla_middle.png | Bin .../models/tesla_top.png | Bin .../models/transformer.obj | 0 .../models/transformer_winding.png | Bin .../models/turbineLarge.png | Bin .../models/turbineLarge.tcn | Bin .../models/turbineSmall.png | Bin .../models/turbineSmall.tcn | Bin .../models/waterTurbines.obj | 0 .../models/white.png | Bin .../models/windTurbines.obj | 0 .../models/wire.obj | 0 .../models/wireShine.obj | 0 .../models/workbench_0.obj | 0 .../models/workbench_0.png | Bin .../models/workbench_1.obj | 0 .../models/workbench_1.png | Bin .../{resonantinduction => edx}/sounds.json | 0 .../sounds/accelerator.ogg | Bin .../sounds/alarm.ogg | Bin .../sounds/antimatter.ogg | Bin .../sounds/assembler.ogg | Bin .../sounds/conveyor.ogg | Bin .../sounds/electricshock1.ogg | Bin .../sounds/electricshock2.ogg | Bin .../sounds/electricshock3.ogg | Bin .../sounds/electricshock4.ogg | Bin .../sounds/electricshock5.ogg | Bin .../sounds/electricshock6.ogg | Bin .../sounds/electricshock7.ogg | Bin .../sounds/gearCrank.ogg | Bin .../sounds/glyph_0.png | Bin .../sounds/glyph_1.png | Bin .../sounds/glyph_2.png | Bin .../sounds/glyph_3.png | Bin .../sounds/grinder1.ogg | Bin .../sounds/grinder2.ogg | Bin .../sounds/grinder3.ogg | Bin .../sounds/grinder4.ogg | Bin .../sounds/hammer.ogg | Bin .../sounds/powerup.ogg | Bin .../sounds/reactorcell.ogg | Bin .../sounds/strangematter.ogg | Bin .../sounds/turbine.ogg | Bin .../textures/blocks/accelerator.png | Bin .../textures/blocks/armbot.png | Bin .../textures/blocks/atomic_edge.png | Bin .../textures/blocks/breaker.png | Bin .../textures/blocks/breaker_back.png | Bin .../textures/blocks/breaker_front.png | Bin .../textures/blocks/centrifuge.png | Bin .../textures/blocks/chemicalExtractor.png | Bin .../textures/blocks/circularSawBase.png | Bin .../textures/blocks/controlRod.png | Bin .../textures/blocks/crate_iron.png | Bin .../textures/blocks/crate_steel.png | Bin .../textures/blocks/crate_wood.png | Bin .../textures/blocks/detector_front_green.png | Bin .../textures/blocks/detector_front_red.png | Bin .../textures/blocks/detector_side_green.png | Bin .../textures/blocks/detector_side_red.png | Bin .../textures/blocks/deuterium.png | Bin .../textures/blocks/disk_tray.png | Bin .../textures/blocks/electricFurnace.png | Bin .../textures/blocks/electromagnet.png | Bin .../textures/blocks/electromagnetGlass.png | Bin .../textures/blocks/electromagnet_top.png | Bin .../textures/blocks/encoder_bottom.png | Bin .../textures/blocks/encoder_side.png | Bin .../textures/blocks/encoder_top.png | Bin .../blocks/engineeringTable_front.png | Bin .../textures/blocks/engineeringTable_side.png | Bin .../textures/blocks/engineeringTable_top.png | Bin .../textures/blocks/filter.png | Bin .../blocks/firebox_electric_side_off.png | Bin .../blocks/firebox_electric_side_on.png | Bin .../blocks/firebox_electric_top_off.png | Bin .../blocks/firebox_electric_top_on.png | Bin .../textures/blocks/firebox_front_off.png | Bin .../textures/blocks/firebox_front_on.png | Bin .../textures/blocks/firebox_side_off.png | Bin .../textures/blocks/firebox_side_on.png | Bin .../textures/blocks/firebox_top_off.png | Bin .../textures/blocks/firebox_top_on.png | Bin .../textures/blocks/fulmination.png | Bin .../textures/blocks/funnel.png | Bin .../textures/blocks/funnel_edge.png | Bin .../textures/blocks/funnel_top.png | Bin .../textures/blocks/glyph_0.png | Bin .../textures/blocks/glyph_1.png | Bin .../textures/blocks/glyph_2.png | Bin .../textures/blocks/glyph_3.png | Bin .../textures/blocks/grate.png | Bin .../textures/blocks/grate_front.png | Bin .../textures/blocks/hotPlate.png | Bin .../textures/blocks/hotPlate_on.png | Bin .../textures/blocks/imprinter_bottom.png | Bin .../textures/blocks/imprinter_side.png | Bin .../textures/blocks/imprinter_top.png | Bin .../textures/blocks/machine.png | Bin .../textures/blocks/material_metal_side.png | Bin .../textures/blocks/material_metal_top.png | Bin .../textures/blocks/material_sand.png | Bin .../textures/blocks/material_steel.png | Bin .../textures/blocks/material_steel_dark.png | Bin .../textures/blocks/material_steel_tint.png | Bin .../textures/blocks/material_stone.png | Bin .../textures/blocks/material_stone_brick.png | Bin .../textures/blocks/material_stone_brick2.png | Bin .../blocks/material_stone_chiseled.png | Bin .../textures/blocks/material_stone_cobble.png | Bin .../blocks/material_stone_cracked.png | Bin .../textures/blocks/material_stone_mossy.png | Bin .../textures/blocks/material_stone_slab.png | Bin .../textures/blocks/material_wood_surface.png | Bin .../textures/blocks/material_wood_top.png | Bin .../textures/blocks/millstone_side.png | Bin .../textures/blocks/millstone_top.png | Bin .../textures/blocks/mixture_flow.png | Bin .../textures/blocks/mixture_flow.png.mcmeta | 0 .../textures/blocks/models/flatWire.png | Bin .../textures/blocks/models/insulation.png | Bin .../textures/blocks/models/wire.png | Bin .../textures/blocks/molten_flow.png | Bin .../textures/blocks/molten_flow.png.mcmeta | 0 .../textures/blocks/multimeter_screen.png | Bin .../textures/blocks/nuclearBoiler.png | Bin .../textures/blocks/oreUranium.png | Bin .../textures/blocks/placer.png | Bin .../textures/blocks/placer_back.png | Bin .../textures/blocks/placer_front.png | Bin .../textures/blocks/plasma.png | Bin .../textures/blocks/plasmaHeater.png | Bin .../textures/blocks/radioactive.png | Bin .../textures/blocks/radioactive_bottom.png | Bin .../textures/blocks/radioactive_top.png | Bin .../textures/blocks/reactorDrain.png | Bin .../textures/blocks/reactorDrain_front.png | Bin .../textures/blocks/siren.png | Bin .../textures/blocks/solarPanel_bottom.png | Bin .../textures/blocks/solarPanel_side.png | Bin .../textures/blocks/solarPanel_top.png | Bin .../textures/blocks/steam.png | Bin .../textures/blocks/tank.png | Bin .../textures/blocks/tankEdge.png | Bin .../textures/blocks/thermometer.png | Bin .../textures/blocks/thermopile.png | Bin .../textures/blocks/thermopile_top.png | Bin .../textures/blocks/toxicWaste.png | Bin .../textures/blocks/toxicWaste.png.mcmeta | 0 .../textures/blocks/tritium.png | Bin .../textures/blocks/turntable.png | Bin .../textures/blocks/turntable_side.png | Bin .../textures/blocks/uraniumHexafluoride.png | Bin .../textures/fx/laserEnd.png | Bin .../textures/fx/laserMiddle.png | Bin .../textures/fx/laserStart.png | Bin .../textures/fx/noise.png | Bin .../textures/fx/scorch.png | Bin .../textures/gui/gui_accelerator.png | Bin .../textures/gui/gui_atomic_assembler.png | Bin .../textures/gui/gui_machine.png | Bin .../textures/items/antimatter_gram.png | Bin .../textures/items/antimatter_gram.png.mcmeta | 0 .../textures/items/antimatter_milligram.png | Bin .../items/antimatter_milligram.png.mcmeta | 0 .../textures/items/biomass.png | Bin .../textures/items/breederFuel.png | Bin .../textures/items/bucketMixture.png | Bin .../textures/items/bucketMolten.png | Bin .../textures/items/bucketToxicWaste.png | Bin .../textures/items/cellCorrosive.png | Bin .../textures/items/cellDeuterium.png | Bin .../textures/items/cellEmpty.png | Bin .../textures/items/cellTritium.png | Bin .../textures/items/cellWater.png | Bin .../textures/items/darkMatter.png | Bin .../textures/items/darkMatter.png.mcmeta | 0 .../textures/items/devStaff.png | Bin .../textures/items/disk.png | Bin .../textures/items/dough.png | Bin .../textures/items/electronicChip.png | Bin .../textures/items/flour.png | Bin .../textures/items/focusingMatrix.png | Bin .../textures/items/hammer.png | Bin .../textures/items/handCrank.png | Bin .../textures/items/hazmatBody.png | Bin .../textures/items/hazmatBoots.png | Bin .../textures/items/hazmatLeggings.png | Bin .../textures/items/hazmatMask.png | Bin .../textures/items/imprint.png | Bin .../textures/items/insulation.png | Bin .../textures/items/oreDust.png | Bin .../textures/items/oreRefinedDust.png | Bin .../textures/items/oreRubble.png | Bin .../textures/items/pipeGauge.png | Bin .../textures/items/rodFissileFuel.png | Bin .../textures/items/thermometer.png | Bin .../textures/items/uranium.png | Bin .../textures/items/wire.png | Bin .../textures/items/yellowcake.png | Bin .../assets/resonantinduction/lang/en_US.lang | 385 ---------- src/main/resources/edx-logo.png | Bin 0 -> 63534 bytes src/main/resources/mcmod.info | 12 +- src/main/resources/ri_logo.png | Bin 97272 -> 0 bytes src/main/scala/edx/basic/BasicContent.scala | 77 ++ .../scala/edx/basic/blocks/ItemImprint.scala | 131 ++++ .../edx/basic/blocks/TileFilterable.scala | 153 ++++ .../basic}/blocks/TileImprinter.scala | 140 ++-- .../basic}/blocks/TileTurntable.scala | 6 +- .../basic}/crate/BlockCrate.scala | 12 +- .../scala/edx/basic/crate/CrateRecipe.scala | 44 ++ .../basic}/crate/InventoryCrate.scala | 2 +- .../basic}/crate/ItemBlockCrate.scala | 2 +- .../edx/basic/crate/PathfinderCrate.scala | 114 +++ .../basic}/crate/RenderCrate.scala | 2 +- .../basic}/crate/TileCrate.scala | 154 ++-- .../basic}/engineering/ItemHammer.scala | 2 +- .../engineering/TileEngineeringTable.scala | 685 ++++++++++++++++++ .../edx/basic/firebox/RenderHotPlate.scala | 23 + .../basic}/firebox/TileFirebox.scala | 4 +- .../basic}/firebox/TileHotPlate.scala | 38 +- .../basic}/fluid/grate/TileGrate.scala | 54 +- .../fluid/gutter/NodeFluidGravity.scala | 4 +- .../basic}/fluid/gutter/TileGutter.scala | 64 +- .../basic}/fluid/tank/ItemBlockTank.scala | 22 +- .../basic}/fluid/tank/TileTank.scala | 18 +- .../edx/basic/process/RenderCastingMold.scala | 38 + .../edx/basic/process/RenderMillstone.scala | 23 + .../edx/basic/process/TileCastingMold.scala | 165 +++++ .../basic}/process/TileMillstone.scala | 6 +- .../basic}/process/TileWorkbench.scala | 8 +- .../basic}/process/mixing/ItemGlassJar.scala | 4 +- .../basic}/process/mixing/TileGlassJar.scala | 12 +- src/main/scala/edx/basic/waila/Waila.scala | 30 + .../scala/edx/basic/waila/WailaCrate.scala | 52 ++ .../edx/basic/waila/WailaFluidTank.scala | 48 ++ .../edx/basic/waila/WailaRegistrar.scala | 14 + .../core/ClientProxy.scala | 52 +- src/main/scala/edx/core/CommonProxy.scala | 137 ++++ src/main/scala/edx/core/EDXCreativeTab.scala | 18 + .../core/Electrodynamics.scala} | 26 +- .../core/Reference.scala | 12 +- .../core/ResonantPartFactory.scala | 4 +- src/main/scala/edx/core/Settings.scala | 72 ++ .../core/handler/TextureHookHandler.scala | 18 +- .../core/interfaces/TNodeMechanical.scala | 2 +- .../core/prefab/node/NodeFluidPressure.scala | 6 +- .../core/prefab/node/TMultipartNode.scala | 2 +- .../core/prefab/node/TileFluidProvider.scala | 10 +- .../prefab/part/ChickenBonesWrapper.scala | 2 +- .../core/prefab/part/CuboidShapes.scala | 2 +- .../core/prefab/part/IHighlight.scala | 2 +- .../core/prefab/part/PacketMultiPart.scala | 2 +- .../core/prefab/part/PartFace.scala | 4 +- .../prefab/part/connector/PartAbstract.scala | 4 +- .../part/connector/PartFramedNode.scala | 9 +- .../prefab/part/connector/TColorable.scala | 28 +- .../prefab/part/connector/TInsulatable.scala | 76 +- .../prefab/part/connector/TMaterial.scala | 2 +- .../part/connector/TPartNodeProvider.scala | 2 +- .../core/prefab/pass/TNodeProvider.java | 5 +- src/main/scala/edx/core/render/InvertX.scala | 16 + .../core/resource/AutoResourceFactory.scala | 10 +- .../core/resource/alloy/Alloy.scala | 6 +- .../core/resource/alloy/AlloyUtility.scala | 2 +- .../core/resource/alloy/TAlloyItem.scala | 2 +- .../resource/content/BlockDecoration.scala | 48 ++ .../resource/content/BlockFluidMaterial.scala | 2 +- .../core/resource/content/FluidColored.scala | 2 +- .../core/resource/content/ItemAlloyDust.scala | 6 +- .../core/resource/content/ItemDust.scala | 4 +- .../resource/content/ItemMoltenBucket.scala | 4 +- .../resource/content/ItemRefinedDust.scala | 8 +- .../core/resource/content/ItemRubble.scala | 4 +- .../core/resource/content/TBucket.scala | 2 +- .../core/resource/content/TileDust.scala | 4 +- .../core/util/MultipartUtil.scala | 2 +- .../core/util/ResonantUtil.scala | 4 +- .../electrical/ElectricalContent.scala | 32 +- .../electrical/battery/GridBattery.scala | 4 +- .../electrical/battery/ItemBlockBattery.scala | 153 ++++ .../electrical/battery/TileBattery.scala | 4 +- .../electrical/generator/TileMotor.scala | 6 +- .../electrical/generator/TileSolarPanel.scala | 4 +- .../electrical/generator/TileThermopile.scala | 76 +- .../multimeter/ContainerMultimeter.scala | 4 +- .../electrical/multimeter/GuiMultimeter.scala | 2 +- .../multimeter/ItemMultimeter.scala | 8 +- .../multimeter/MultimeterGrid.scala | 54 +- .../multimeter/PartMultimeter.scala | 172 ++--- .../multimeter/RenderMultimeter.scala | 86 +-- .../electrical/multimeter/graph/Graph.java | 3 +- .../electrical/multimeter/graph/GraphD.java | 2 +- .../electrical/multimeter/graph/GraphF.java | 2 +- .../electrical/multimeter/graph/GraphI.java | 2 +- .../electrical/multimeter/graph/GraphL.java | 2 +- .../scala/edx/electrical/tesla/ITesla.scala | 22 + .../edx/electrical/tesla/RenderTesla.scala | 51 ++ .../electrical/tesla/TeslaGrid.java | 32 +- .../electrical/tesla/TileTesla.scala | 184 ++--- .../transformer/ElectricTransformerNode.scala | 2 +- .../transformer/ItemElectricTransformer.scala | 35 + .../transformer/PartElectricTransformer.scala | 16 +- .../transformer/RenderTransformer.scala | 4 +- .../electrical/wire/ItemWire.scala | 15 +- .../electrical/wire/base/TWire.scala | 14 +- .../electrical/wire/base/WireMaterial.java | 7 +- .../electrical/wire/flat/PartFlatWire.scala | 64 +- .../electrical/wire/flat/RenderFlatWire.scala | 45 +- .../wire/flat/WireModelGenerator.scala | 8 +- .../wire/framed/PartFramedWire.scala | 8 +- .../wire/framed/RenderFramedWire.scala | 8 +- .../mechanical/MechanicalContent.scala | 36 +- .../MicroblockHighlightHandler.scala | 4 +- .../mechanical/fluid/pipe/ItemPipe.scala | 8 +- .../mechanical/fluid/pipe/NodePipe.scala | 10 +- .../mechanical/fluid/pipe/PartPipe.scala | 16 +- .../mechanical/fluid/pipe/PipeMaterials.scala | 7 +- .../mechanical/fluid/pipe/RenderPipe.scala | 62 +- .../mechanical/fluid/transport/NodePump.scala | 8 +- .../mechanical/fluid/transport/TilePump.scala | 26 +- .../edx/mechanical/machine/TileDetector.scala | 160 ++++ .../mechanical/machine/edit/TileBreaker.scala | 172 +++++ .../mechanical/machine/edit/TilePlacer.scala | 2 +- .../mechanical/mech/PartMechanical.scala | 47 +- .../mechanical/mech/TileMechanical.scala | 28 +- .../mech/gear/GearMultiBlockHandler.scala | 5 +- .../mechanical/mech/gear/ItemGear.scala | 8 +- .../mechanical/mech/gear/ItemHandCrank.scala | 2 +- .../mechanical/mech/gear/NodeGear.scala | 12 +- .../mechanical/mech/gear/PartGear.scala | 37 +- .../mechanical/mech/gear/RenderGear.scala | 43 +- .../mech/gearshaft/ItemGearShaft.scala | 6 +- .../mech/gearshaft/NodeGearShaft.scala | 12 +- .../mech/gearshaft/PartGearShaft.scala | 10 +- .../mech/gearshaft/RenderGearShaft.scala | 5 +- .../mechanical/mech/grid/MechanicalGrid.scala | 2 +- .../mechanical/mech/grid/NodeMechanical.scala | 26 +- .../crusher/NodeMechanicalPiston.scala | 20 + .../crusher/RenderMechanicalPiston.scala | 61 ++ .../crusher/TileMechanicalPiston.scala | 194 +++++ .../mech/process/grinder/NodeGrinder.scala | 10 +- .../process/grinder/TileGrindingWheel.scala | 18 +- .../mech/process/mixer/MixerNode.scala | 23 + .../mech/process/mixer/RenderMixer.scala | 6 +- .../mech/process/mixer/TileMixer.scala | 6 +- .../mechanical/mech/turbine/NodeTurbine.scala | 10 +- .../mech/turbine/RenderWaterTurbine.scala | 127 ++++ .../mechanical/mech/turbine/TileTurbine.scala | 26 +- .../mech/turbine/TileWaterTurbine.scala | 6 +- .../mech/turbine/TileWindTurbine.scala | 31 +- .../mech/turbine/TurbineMBlockHandler.scala | 21 + .../quantum/QuantumContent.scala} | 156 ++-- .../edx/quantum/blocks/BlockRadioactive.scala | 120 +++ .../edx/quantum/blocks/BlockToxicWaste.scala | 43 ++ .../edx/quantum/blocks/BlockUraniumOre.scala | 39 + .../quantum/blocks/TileElectromagnet.scala | 129 ++++ .../scala/edx/quantum/blocks/TileSiren.scala | 54 ++ .../quantum}/gate/IQuantumGate.java | 2 +- .../quantum}/gate/ItemQuantumGlyph.scala | 6 +- .../quantum}/gate/PartQuantumGlyph.scala | 6 +- .../quantum}/gate/QuantumGateManager.java | 2 +- .../quantum}/gate/RenderQuantumGlyph.scala | 4 +- .../quantum}/gate/TraitQuantumGate.scala | 2 +- .../edx/quantum/items/ItemAntimatter.scala | 54 ++ .../edx/quantum/items/ItemBreederFuel.scala | 24 + .../scala/edx/quantum/items/ItemCell.scala | 32 + .../edx/quantum/items/ItemFissileFuel.scala | 95 +++ .../scala/edx/quantum/items/ItemHazmat.scala | 68 ++ .../edx/quantum/items/ItemRadioactive.scala | 21 + .../scala/edx/quantum/items/ItemUranium.scala | 48 ++ .../quantum}/laser/ILaserHandler.java | 2 +- .../quantum}/laser/Laser.scala | 18 +- .../quantum}/laser/TileLaserEmitter.scala | 4 +- .../quantum}/laser/TileLaserReceiver.scala | 4 +- .../quantum}/laser/focus/IFocus.java | 2 +- .../laser/focus/ItemFocusingMatrix.scala | 6 +- .../quantum}/laser/focus/TileFocus.scala | 2 +- .../laser/focus/TileFocusCrystal.scala | 8 +- .../quantum}/laser/focus/TileMirror.scala | 8 +- .../laser/fx/EntityBlockParticleFX.scala | 2 +- .../quantum}/laser/fx/EntityLaserFX.scala | 8 +- .../quantum}/laser/fx/EntityScorchFX.scala | 6 +- .../quantum}/machine/TileFunnel.scala | 2 +- .../accelerator/ContainerAccelerator.scala | 66 ++ .../machine/accelerator/EntityParticle.scala | 300 ++++++++ .../machine/accelerator/GuiAccelerator.scala | 55 ++ .../machine/accelerator/RenderParticle.scala | 79 ++ .../machine/accelerator/TileAccelerator.scala | 118 +-- .../boiler/ContainerNuclearBoiler.scala | 99 +++ .../machine/boiler/GuiNuclearBoiler.scala | 49 ++ .../machine/boiler/RenderNuclearBoiler.scala | 48 ++ .../machine/boiler/TileNuclearBoiler.scala | 38 +- .../centrifuge/ContainerCentrifuge.scala | 95 +++ .../machine/centrifuge/GuiCentrifuge.scala | 52 ++ .../machine/centrifuge/RenderCentrifuge.scala | 42 ++ .../machine/centrifuge/TileCentrifuge.scala | 58 +- .../ContainerChemicalExtractor.scala | 28 + .../extractor/GuiChemicalExtractor.scala | 42 ++ .../extractor/RenderChemicalExtractor.scala | 48 ++ .../extractor/TileChemicalExtractor.scala | 36 +- .../machine/extractor/TileProcess.scala | 96 +++ .../fulmination/FulminationHandler.scala | 26 +- .../machine/fulmination/TileFulmination.scala | 2 +- .../machine/plasma/RenderPlasmaHeater.scala | 36 + .../quantum}/machine/plasma/TilePlasma.scala | 2 +- .../machine/plasma/TilePlasmaHeater.scala | 14 +- .../quantum/ContainerQuantumAssembler.scala | 97 +++ .../machine/quantum/GuiQuantumAssembler.scala | 56 ++ .../quantum/RenderQuantumAssembler.scala | 59 ++ .../quantum/TileQuantumAssembler.scala | 106 +-- .../reactor/ContainerReactorCell.scala | 68 ++ .../machine/reactor/GuiReactorCell.scala | 50 ++ .../machine/reactor/RenderReactorCell.scala | 85 +++ .../machine/reactor/TileControlRod.scala | 6 +- .../machine/reactor/TileReactorCell.scala | 66 +- .../machine/reactor/TileReactorDrain.scala | 56 +- .../thermometer/ItemBlockThermometer.scala | 4 +- .../thermometer/RenderThermometer.scala | 28 + .../machine/thermometer/TileThermometer.scala | 44 +- .../schematic/SchematicAccelerator.scala | 39 + .../schematic/SchematicBreedingReactor.scala | 63 ++ .../schematic/SchematicFissionReactor.scala | 14 +- .../schematic/SchematicFusionReactor.scala | 62 ++ .../archaic/ArchaicContent.scala | 88 --- .../archaic/blocks/ItemImprint.scala | 131 ---- .../archaic/blocks/TileFilterable.scala | 153 ---- .../archaic/crate/CrateRecipe.scala | 44 -- .../archaic/crate/PathfinderCrate.scala | 116 --- .../engineering/TileEngineeringTable.scala | 685 ------------------ .../archaic/firebox/RenderHotPlate.scala | 24 - .../archaic/process/RenderCastingMold.scala | 41 -- .../archaic/process/RenderMillstone.scala | 24 - .../archaic/process/TileCastingMold.scala | 165 ----- .../archaic/waila/Waila.scala | 30 - .../archaic/waila/WailaCrate.scala | 53 -- .../archaic/waila/WailaFluidTank.scala | 49 -- .../archaic/waila/WailaRegistrar.scala | 14 - .../atomic/blocks/BlockRadioactive.scala | 119 --- .../atomic/blocks/BlockToxicWaste.scala | 43 -- .../atomic/blocks/BlockUraniumOre.scala | 39 - .../atomic/blocks/TileElectromagnet.scala | 128 ---- .../atomic/blocks/TileSiren.scala | 54 -- .../atomic/items/ItemAntimatter.scala | 56 -- .../atomic/items/ItemBreederFuel.scala | 24 - .../atomic/items/ItemCell.scala | 32 - .../atomic/items/ItemFissileFuel.scala | 95 --- .../atomic/items/ItemHazmat.scala | 71 -- .../atomic/items/ItemRadioactive.scala | 23 - .../atomic/items/ItemUranium.scala | 48 -- .../accelerator/ContainerAccelerator.scala | 66 -- .../machine/accelerator/EntityParticle.scala | 299 -------- .../machine/accelerator/GuiAccelerator.scala | 55 -- .../machine/accelerator/RenderParticle.scala | 79 -- .../boiler/ContainerNuclearBoiler.scala | 99 --- .../machine/boiler/GuiNuclearBoiler.scala | 49 -- .../machine/boiler/RenderNuclearBoiler.scala | 50 -- .../centrifuge/ContainerCentrifuge.scala | 95 --- .../machine/centrifuge/GuiCentrifuge.scala | 52 -- .../machine/centrifuge/RenderCentrifuge.scala | 42 -- .../ContainerChemicalExtractor.scala | 29 - .../extractor/GuiChemicalExtractor.scala | 42 -- .../extractor/RenderChemicalExtractor.scala | 50 -- .../machine/extractor/TileProcess.scala | 96 --- .../machine/plasma/RenderPlasmaHeater.scala | 38 - .../quantum/ContainerQuantumAssembler.scala | 97 --- .../machine/quantum/GuiQuantumAssembler.scala | 56 -- .../quantum/RenderQuantumAssembler.scala | 59 -- .../reactor/ContainerReactorCell.scala | 68 -- .../machine/reactor/GuiReactorCell.scala | 50 -- .../machine/reactor/RenderReactorCell.scala | 83 --- .../thermometer/RenderThermometer.scala | 28 - .../schematic/SchematicAccelerator.scala | 39 - .../schematic/SchematicBreedingReactor.scala | 63 -- .../schematic/SchematicFusionReactor.scala | 62 -- .../resonantinduction/core/CommonProxy.scala | 138 ---- .../core/RICreativeTab.scala | 19 - .../resonantinduction/core/Settings.scala | 75 -- .../core/render/InvertX.scala | 14 - .../resource/content/BlockDecoration.scala | 48 -- .../electrical/battery/ItemBlockBattery.scala | 154 ---- .../electrical/tesla/ITesla.scala | 22 - .../electrical/tesla/RenderTesla.scala | 53 -- .../transformer/ItemElectricTransformer.scala | 35 - .../mechanical/machine/TileDetector.scala | 160 ---- .../mechanical/machine/edit/TileBreaker.scala | 172 ----- .../crusher/NodeMechanicalPiston.scala | 20 - .../crusher/RenderMechanicalPiston.scala | 63 -- .../crusher/TileMechanicalPiston.scala | 194 ----- .../mech/process/mixer/MixerNode.scala | 23 - .../mech/turbine/RenderWaterTurbine.scala | 129 ---- .../mech/turbine/TurbineMBlockHandler.scala | 21 - 607 files changed, 7349 insertions(+), 7395 deletions(-) rename src/main/resources/assets/{resonantinduction => edx}/lang/de_DE.lang (100%) create mode 100644 src/main/resources/assets/edx/lang/en_US.lang rename src/main/resources/assets/{resonantinduction => edx}/lang/pl_PL.lang (100%) rename src/main/resources/assets/{resonantinduction => edx}/lang/ru_RU.lang (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/LaserGun.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/MiningLaserGun.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/armbot.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/battery.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/battery/battery.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/battery/battery.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame0.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame10.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame11.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame12.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame13.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame3.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame4.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame5.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame6.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame7.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame8.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/belt/frame9.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/castingMold.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/castingMold.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/centrifuge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/centrifuge.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/charger.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/charger.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/chemicalExtractor.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/chemicalExtractor.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/em_contractor.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/em_contractor_push.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/fadedSphere.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/fissileMaterial.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/focusCrystal.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/focusCrystal.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/fusionReactor.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/fusionReactor.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/gears.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/glassJar.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/glassJar.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/grinder.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/gutter.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/gutter.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/hazmat.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/laserEmitter.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/laserEmitter.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/laserReceiver.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/laserReceiver.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/levitator.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/levitator_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/levitator_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/manipulator1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/manipulator2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/mirror.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/mirror.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/mixer.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/mixer.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/motor.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/motor.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/nuclearBoiler.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/nuclearBoiler.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/pipe.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/pipe.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston_diamond.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston_iron.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston_stone.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston_wood.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/piston/mechanicalPiston_wool.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/pump.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/pump.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/quantumAssembler.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/quantumAssembler.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellBottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellBottom.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellMiddle.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellMiddle.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellTop.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/reactorCellTop.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/rejector.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/rejector.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame0.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame10.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame11.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame12.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame13.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame14.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame15.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame16.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame17.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame18.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame19.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame20.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame21.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame22.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame23.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame3.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame4.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame5.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame6.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame7.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame8.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/slantedbelt/frame9.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/sorter.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/sorter.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/teslaBottom.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/teslaMiddle.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/teslaTop.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/tesla_bottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/tesla_middle.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/tesla_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/transformer.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/transformer_winding.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/turbineLarge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/turbineLarge.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/turbineSmall.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/turbineSmall.tcn (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/waterTurbines.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/white.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/windTurbines.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/wire.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/wireShine.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/workbench_0.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/workbench_0.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/workbench_1.obj (100%) rename src/main/resources/assets/{resonantinduction => edx}/models/workbench_1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds.json (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/accelerator.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/alarm.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/antimatter.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/assembler.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/conveyor.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock1.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock2.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock3.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock4.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock5.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock6.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/electricshock7.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/gearCrank.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/glyph_0.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/glyph_1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/glyph_2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/glyph_3.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/grinder1.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/grinder2.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/grinder3.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/grinder4.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/hammer.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/powerup.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/reactorcell.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/strangematter.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/sounds/turbine.ogg (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/accelerator.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/armbot.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/atomic_edge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/breaker.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/breaker_back.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/breaker_front.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/centrifuge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/chemicalExtractor.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/circularSawBase.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/controlRod.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/crate_iron.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/crate_steel.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/crate_wood.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/detector_front_green.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/detector_front_red.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/detector_side_green.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/detector_side_red.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/deuterium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/disk_tray.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/electricFurnace.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/electromagnet.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/electromagnetGlass.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/electromagnet_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/encoder_bottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/encoder_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/encoder_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/engineeringTable_front.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/engineeringTable_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/engineeringTable_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/filter.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_electric_side_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_electric_side_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_electric_top_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_electric_top_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_front_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_front_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_side_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_side_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_top_off.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/firebox_top_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/fulmination.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/funnel.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/funnel_edge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/funnel_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/glyph_0.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/glyph_1.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/glyph_2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/glyph_3.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/grate.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/grate_front.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/hotPlate.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/hotPlate_on.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/imprinter_bottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/imprinter_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/imprinter_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/machine.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_metal_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_metal_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_sand.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_steel.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_steel_dark.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_steel_tint.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_brick.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_brick2.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_chiseled.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_cobble.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_cracked.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_mossy.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_stone_slab.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_wood_surface.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/material_wood_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/millstone_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/millstone_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/mixture_flow.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/mixture_flow.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/models/flatWire.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/models/insulation.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/models/wire.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/molten_flow.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/molten_flow.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/multimeter_screen.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/nuclearBoiler.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/oreUranium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/placer.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/placer_back.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/placer_front.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/plasma.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/plasmaHeater.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/radioactive.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/radioactive_bottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/radioactive_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/reactorDrain.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/reactorDrain_front.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/siren.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/solarPanel_bottom.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/solarPanel_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/solarPanel_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/steam.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/tank.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/tankEdge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/thermometer.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/thermopile.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/thermopile_top.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/toxicWaste.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/toxicWaste.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/tritium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/turntable.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/turntable_side.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/blocks/uraniumHexafluoride.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/fx/laserEnd.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/fx/laserMiddle.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/fx/laserStart.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/fx/noise.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/fx/scorch.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/gui/gui_accelerator.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/gui/gui_atomic_assembler.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/gui/gui_machine.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/antimatter_gram.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/antimatter_gram.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/antimatter_milligram.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/antimatter_milligram.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/biomass.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/breederFuel.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/bucketMixture.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/bucketMolten.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/bucketToxicWaste.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/cellCorrosive.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/cellDeuterium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/cellEmpty.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/cellTritium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/cellWater.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/darkMatter.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/darkMatter.png.mcmeta (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/devStaff.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/disk.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/dough.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/electronicChip.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/flour.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/focusingMatrix.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/hammer.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/handCrank.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/hazmatBody.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/hazmatBoots.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/hazmatLeggings.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/hazmatMask.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/imprint.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/insulation.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/oreDust.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/oreRefinedDust.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/oreRubble.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/pipeGauge.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/rodFissileFuel.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/thermometer.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/uranium.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/wire.png (100%) rename src/main/resources/assets/{resonantinduction => edx}/textures/items/yellowcake.png (100%) delete mode 100644 src/main/resources/assets/resonantinduction/lang/en_US.lang create mode 100644 src/main/resources/edx-logo.png delete mode 100644 src/main/resources/ri_logo.png create mode 100644 src/main/scala/edx/basic/BasicContent.scala create mode 100644 src/main/scala/edx/basic/blocks/ItemImprint.scala create mode 100644 src/main/scala/edx/basic/blocks/TileFilterable.scala rename src/main/scala/{resonantinduction/archaic => edx/basic}/blocks/TileImprinter.scala (99%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/blocks/TileTurntable.scala (97%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/crate/BlockCrate.scala (97%) create mode 100644 src/main/scala/edx/basic/crate/CrateRecipe.scala rename src/main/scala/{resonantinduction/archaic => edx/basic}/crate/InventoryCrate.scala (97%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/crate/ItemBlockCrate.scala (99%) create mode 100644 src/main/scala/edx/basic/crate/PathfinderCrate.scala rename src/main/scala/{resonantinduction/archaic => edx/basic}/crate/RenderCrate.scala (95%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/crate/TileCrate.scala (97%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/engineering/ItemHammer.scala (79%) create mode 100644 src/main/scala/edx/basic/engineering/TileEngineeringTable.scala create mode 100644 src/main/scala/edx/basic/firebox/RenderHotPlate.scala rename src/main/scala/{resonantinduction/archaic => edx/basic}/firebox/TileFirebox.scala (99%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/firebox/TileHotPlate.scala (98%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/fluid/grate/TileGrate.scala (98%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/fluid/gutter/NodeFluidGravity.scala (92%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/fluid/gutter/TileGutter.scala (97%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/fluid/tank/ItemBlockTank.scala (99%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/fluid/tank/TileTank.scala (93%) create mode 100644 src/main/scala/edx/basic/process/RenderCastingMold.scala create mode 100644 src/main/scala/edx/basic/process/RenderMillstone.scala create mode 100644 src/main/scala/edx/basic/process/TileCastingMold.scala rename src/main/scala/{resonantinduction/archaic => edx/basic}/process/TileMillstone.scala (96%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/process/TileWorkbench.scala (93%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/process/mixing/ItemGlassJar.scala (91%) rename src/main/scala/{resonantinduction/archaic => edx/basic}/process/mixing/TileGlassJar.scala (94%) create mode 100644 src/main/scala/edx/basic/waila/Waila.scala create mode 100644 src/main/scala/edx/basic/waila/WailaCrate.scala create mode 100644 src/main/scala/edx/basic/waila/WailaFluidTank.scala create mode 100644 src/main/scala/edx/basic/waila/WailaRegistrar.scala rename src/main/scala/{resonantinduction => edx}/core/ClientProxy.scala (77%) create mode 100644 src/main/scala/edx/core/CommonProxy.scala create mode 100644 src/main/scala/edx/core/EDXCreativeTab.scala rename src/main/scala/{resonantinduction/core/ResonantInduction.scala => edx/core/Electrodynamics.scala} (65%) rename src/main/scala/{resonantinduction => edx}/core/Reference.scala (78%) rename src/main/scala/{resonantinduction => edx}/core/ResonantPartFactory.scala (91%) create mode 100644 src/main/scala/edx/core/Settings.scala rename src/main/scala/{resonantinduction => edx}/core/handler/TextureHookHandler.scala (69%) rename src/main/scala/{resonantinduction => edx}/core/interfaces/TNodeMechanical.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/prefab/node/NodeFluidPressure.scala (99%) rename src/main/scala/{resonantinduction => edx}/core/prefab/node/TMultipartNode.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/prefab/node/TileFluidProvider.scala (98%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/ChickenBonesWrapper.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/CuboidShapes.scala (98%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/IHighlight.scala (57%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/PacketMultiPart.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/PartFace.scala (96%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/PartAbstract.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/PartFramedNode.scala (96%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/TColorable.scala (94%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/TInsulatable.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/TMaterial.scala (93%) rename src/main/scala/{resonantinduction => edx}/core/prefab/part/connector/TPartNodeProvider.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/prefab/pass/TNodeProvider.java (95%) create mode 100644 src/main/scala/edx/core/render/InvertX.scala rename src/main/scala/{resonantinduction => edx}/core/resource/AutoResourceFactory.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/resource/alloy/Alloy.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/resource/alloy/AlloyUtility.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/resource/alloy/TAlloyItem.scala (95%) create mode 100644 src/main/scala/edx/core/resource/content/BlockDecoration.scala rename src/main/scala/{resonantinduction => edx}/core/resource/content/BlockFluidMaterial.scala (96%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/FluidColored.scala (84%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/ItemAlloyDust.scala (75%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/ItemDust.scala (76%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/ItemMoltenBucket.scala (76%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/ItemRefinedDust.scala (95%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/ItemRubble.scala (75%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/TBucket.scala (98%) rename src/main/scala/{resonantinduction => edx}/core/resource/content/TileDust.scala (90%) rename src/main/scala/{resonantinduction => edx}/core/util/MultipartUtil.scala (97%) rename src/main/scala/{resonantinduction => edx}/core/util/ResonantUtil.scala (96%) rename src/main/scala/{resonantinduction => edx}/electrical/ElectricalContent.scala (86%) rename src/main/scala/{resonantinduction => edx}/electrical/battery/GridBattery.scala (95%) create mode 100644 src/main/scala/edx/electrical/battery/ItemBlockBattery.scala rename src/main/scala/{resonantinduction => edx}/electrical/battery/TileBattery.scala (99%) rename src/main/scala/{resonantinduction => edx}/electrical/generator/TileMotor.scala (96%) rename src/main/scala/{resonantinduction => edx}/electrical/generator/TileSolarPanel.scala (94%) rename src/main/scala/{resonantinduction => edx}/electrical/generator/TileThermopile.scala (66%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/ContainerMultimeter.scala (87%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/GuiMultimeter.scala (98%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/ItemMultimeter.scala (93%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/MultimeterGrid.scala (97%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/PartMultimeter.scala (96%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/RenderMultimeter.scala (98%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/graph/Graph.java (95%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/graph/GraphD.java (96%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/graph/GraphF.java (96%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/graph/GraphI.java (96%) rename src/main/scala/{resonantinduction => edx}/electrical/multimeter/graph/GraphL.java (96%) create mode 100644 src/main/scala/edx/electrical/tesla/ITesla.scala create mode 100644 src/main/scala/edx/electrical/tesla/RenderTesla.scala rename src/main/scala/{resonantinduction => edx}/electrical/tesla/TeslaGrid.java (96%) rename src/main/scala/{resonantinduction => edx}/electrical/tesla/TileTesla.scala (96%) rename src/main/scala/{resonantinduction => edx}/electrical/transformer/ElectricTransformerNode.scala (96%) create mode 100644 src/main/scala/edx/electrical/transformer/ItemElectricTransformer.scala rename src/main/scala/{resonantinduction => edx}/electrical/transformer/PartElectricTransformer.scala (95%) rename src/main/scala/{resonantinduction => edx}/electrical/transformer/RenderTransformer.scala (97%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/ItemWire.scala (87%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/base/TWire.scala (91%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/base/WireMaterial.java (83%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/flat/PartFlatWire.scala (98%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/flat/RenderFlatWire.scala (90%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/flat/WireModelGenerator.scala (97%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/framed/PartFramedWire.scala (89%) rename src/main/scala/{resonantinduction => edx}/electrical/wire/framed/RenderFramedWire.scala (92%) rename src/main/scala/{resonantinduction => edx}/mechanical/MechanicalContent.scala (83%) rename src/main/scala/{resonantinduction => edx}/mechanical/MicroblockHighlightHandler.scala (93%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/pipe/ItemPipe.scala (92%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/pipe/NodePipe.scala (90%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/pipe/PartPipe.scala (89%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/pipe/PipeMaterials.scala (91%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/pipe/RenderPipe.scala (97%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/transport/NodePump.scala (88%) rename src/main/scala/{resonantinduction => edx}/mechanical/fluid/transport/TilePump.scala (95%) create mode 100644 src/main/scala/edx/mechanical/machine/TileDetector.scala create mode 100644 src/main/scala/edx/mechanical/machine/edit/TileBreaker.scala rename src/main/scala/{resonantinduction => edx}/mechanical/machine/edit/TilePlacer.scala (99%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/PartMechanical.scala (88%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/TileMechanical.scala (95%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/GearMultiBlockHandler.scala (84%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/ItemGear.scala (88%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/ItemHandCrank.scala (85%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/NodeGear.scala (97%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/PartGear.scala (94%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gear/RenderGear.scala (93%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gearshaft/ItemGearShaft.scala (87%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gearshaft/NodeGearShaft.scala (91%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gearshaft/PartGearShaft.scala (94%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/gearshaft/RenderGearShaft.scala (96%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/grid/MechanicalGrid.scala (98%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/grid/NodeMechanical.scala (95%) create mode 100644 src/main/scala/edx/mechanical/mech/process/crusher/NodeMechanicalPiston.scala create mode 100644 src/main/scala/edx/mechanical/mech/process/crusher/RenderMechanicalPiston.scala create mode 100644 src/main/scala/edx/mechanical/mech/process/crusher/TileMechanicalPiston.scala rename src/main/scala/{resonantinduction => edx}/mechanical/mech/process/grinder/NodeGrinder.scala (64%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/process/grinder/TileGrindingWheel.scala (94%) create mode 100644 src/main/scala/edx/mechanical/mech/process/mixer/MixerNode.scala rename src/main/scala/{resonantinduction => edx}/mechanical/mech/process/mixer/RenderMixer.scala (89%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/process/mixer/TileMixer.scala (97%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/turbine/NodeTurbine.scala (87%) create mode 100644 src/main/scala/edx/mechanical/mech/turbine/RenderWaterTurbine.scala rename src/main/scala/{resonantinduction => edx}/mechanical/mech/turbine/TileTurbine.scala (97%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/turbine/TileWaterTurbine.scala (96%) rename src/main/scala/{resonantinduction => edx}/mechanical/mech/turbine/TileWindTurbine.scala (98%) create mode 100644 src/main/scala/edx/mechanical/mech/turbine/TurbineMBlockHandler.scala rename src/main/scala/{resonantinduction/atomic/AtomicContent.scala => edx/quantum/QuantumContent.scala} (82%) create mode 100644 src/main/scala/edx/quantum/blocks/BlockRadioactive.scala create mode 100644 src/main/scala/edx/quantum/blocks/BlockToxicWaste.scala create mode 100644 src/main/scala/edx/quantum/blocks/BlockUraniumOre.scala create mode 100644 src/main/scala/edx/quantum/blocks/TileElectromagnet.scala create mode 100644 src/main/scala/edx/quantum/blocks/TileSiren.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/IQuantumGate.java (84%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/ItemQuantumGlyph.scala (92%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/PartQuantumGlyph.scala (98%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/QuantumGateManager.java (99%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/RenderQuantumGlyph.scala (93%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/gate/TraitQuantumGate.scala (95%) create mode 100644 src/main/scala/edx/quantum/items/ItemAntimatter.scala create mode 100644 src/main/scala/edx/quantum/items/ItemBreederFuel.scala create mode 100644 src/main/scala/edx/quantum/items/ItemCell.scala create mode 100644 src/main/scala/edx/quantum/items/ItemFissileFuel.scala create mode 100644 src/main/scala/edx/quantum/items/ItemHazmat.scala create mode 100644 src/main/scala/edx/quantum/items/ItemRadioactive.scala create mode 100644 src/main/scala/edx/quantum/items/ItemUranium.scala rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/ILaserHandler.java (86%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/Laser.scala (90%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/TileLaserEmitter.scala (97%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/TileLaserReceiver.scala (98%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/focus/IFocus.java (89%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/focus/ItemFocusingMatrix.scala (96%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/focus/TileFocus.scala (96%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/focus/TileFocusCrystal.scala (93%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/focus/TileMirror.scala (94%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/fx/EntityBlockParticleFX.scala (98%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/fx/EntityLaserFX.scala (96%) rename src/main/scala/{resonantinduction/electrical => edx/quantum}/laser/fx/EntityScorchFX.scala (95%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/TileFunnel.scala (98%) create mode 100644 src/main/scala/edx/quantum/machine/accelerator/ContainerAccelerator.scala create mode 100644 src/main/scala/edx/quantum/machine/accelerator/EntityParticle.scala create mode 100644 src/main/scala/edx/quantum/machine/accelerator/GuiAccelerator.scala create mode 100644 src/main/scala/edx/quantum/machine/accelerator/RenderParticle.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/accelerator/TileAccelerator.scala (92%) create mode 100644 src/main/scala/edx/quantum/machine/boiler/ContainerNuclearBoiler.scala create mode 100644 src/main/scala/edx/quantum/machine/boiler/GuiNuclearBoiler.scala create mode 100644 src/main/scala/edx/quantum/machine/boiler/RenderNuclearBoiler.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/boiler/TileNuclearBoiler.scala (80%) create mode 100644 src/main/scala/edx/quantum/machine/centrifuge/ContainerCentrifuge.scala create mode 100644 src/main/scala/edx/quantum/machine/centrifuge/GuiCentrifuge.scala create mode 100644 src/main/scala/edx/quantum/machine/centrifuge/RenderCentrifuge.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/centrifuge/TileCentrifuge.scala (83%) create mode 100644 src/main/scala/edx/quantum/machine/extractor/ContainerChemicalExtractor.scala create mode 100644 src/main/scala/edx/quantum/machine/extractor/GuiChemicalExtractor.scala create mode 100644 src/main/scala/edx/quantum/machine/extractor/RenderChemicalExtractor.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/extractor/TileChemicalExtractor.scala (81%) create mode 100644 src/main/scala/edx/quantum/machine/extractor/TileProcess.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/fulmination/FulminationHandler.scala (82%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/fulmination/TileFulmination.scala (93%) create mode 100644 src/main/scala/edx/quantum/machine/plasma/RenderPlasmaHeater.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/plasma/TilePlasma.scala (97%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/plasma/TilePlasmaHeater.scala (92%) create mode 100644 src/main/scala/edx/quantum/machine/quantum/ContainerQuantumAssembler.scala create mode 100644 src/main/scala/edx/quantum/machine/quantum/GuiQuantumAssembler.scala create mode 100644 src/main/scala/edx/quantum/machine/quantum/RenderQuantumAssembler.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/quantum/TileQuantumAssembler.scala (94%) create mode 100644 src/main/scala/edx/quantum/machine/reactor/ContainerReactorCell.scala create mode 100644 src/main/scala/edx/quantum/machine/reactor/GuiReactorCell.scala create mode 100644 src/main/scala/edx/quantum/machine/reactor/RenderReactorCell.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/reactor/TileControlRod.scala (64%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/reactor/TileReactorCell.scala (94%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/reactor/TileReactorDrain.scala (99%) rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/thermometer/ItemBlockThermometer.scala (97%) create mode 100644 src/main/scala/edx/quantum/machine/thermometer/RenderThermometer.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/machine/thermometer/TileThermometer.scala (98%) create mode 100644 src/main/scala/edx/quantum/schematic/SchematicAccelerator.scala create mode 100644 src/main/scala/edx/quantum/schematic/SchematicBreedingReactor.scala rename src/main/scala/{resonantinduction/atomic => edx/quantum}/schematic/SchematicFissionReactor.scala (90%) create mode 100644 src/main/scala/edx/quantum/schematic/SchematicFusionReactor.scala delete mode 100644 src/main/scala/resonantinduction/archaic/ArchaicContent.scala delete mode 100644 src/main/scala/resonantinduction/archaic/blocks/ItemImprint.scala delete mode 100644 src/main/scala/resonantinduction/archaic/blocks/TileFilterable.scala delete mode 100644 src/main/scala/resonantinduction/archaic/crate/CrateRecipe.scala delete mode 100644 src/main/scala/resonantinduction/archaic/crate/PathfinderCrate.scala delete mode 100644 src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.scala delete mode 100644 src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.scala delete mode 100644 src/main/scala/resonantinduction/archaic/process/RenderCastingMold.scala delete mode 100644 src/main/scala/resonantinduction/archaic/process/RenderMillstone.scala delete mode 100644 src/main/scala/resonantinduction/archaic/process/TileCastingMold.scala delete mode 100644 src/main/scala/resonantinduction/archaic/waila/Waila.scala delete mode 100644 src/main/scala/resonantinduction/archaic/waila/WailaCrate.scala delete mode 100644 src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.scala delete mode 100644 src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.scala delete mode 100644 src/main/scala/resonantinduction/atomic/blocks/BlockRadioactive.scala delete mode 100644 src/main/scala/resonantinduction/atomic/blocks/BlockToxicWaste.scala delete mode 100644 src/main/scala/resonantinduction/atomic/blocks/BlockUraniumOre.scala delete mode 100644 src/main/scala/resonantinduction/atomic/blocks/TileElectromagnet.scala delete mode 100644 src/main/scala/resonantinduction/atomic/blocks/TileSiren.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemAntimatter.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemBreederFuel.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemCell.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemFissileFuel.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemHazmat.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemRadioactive.scala delete mode 100644 src/main/scala/resonantinduction/atomic/items/ItemUranium.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/accelerator/ContainerAccelerator.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/accelerator/EntityParticle.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/accelerator/GuiAccelerator.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/accelerator/RenderParticle.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/boiler/ContainerNuclearBoiler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/boiler/GuiNuclearBoiler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/boiler/RenderNuclearBoiler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/centrifuge/ContainerCentrifuge.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/centrifuge/GuiCentrifuge.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/centrifuge/RenderCentrifuge.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/extractor/ContainerChemicalExtractor.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/extractor/GuiChemicalExtractor.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/extractor/RenderChemicalExtractor.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/extractor/TileProcess.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/plasma/RenderPlasmaHeater.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/quantum/ContainerQuantumAssembler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/quantum/GuiQuantumAssembler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/quantum/RenderQuantumAssembler.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/reactor/ContainerReactorCell.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/reactor/GuiReactorCell.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/reactor/RenderReactorCell.scala delete mode 100644 src/main/scala/resonantinduction/atomic/machine/thermometer/RenderThermometer.scala delete mode 100644 src/main/scala/resonantinduction/atomic/schematic/SchematicAccelerator.scala delete mode 100644 src/main/scala/resonantinduction/atomic/schematic/SchematicBreedingReactor.scala delete mode 100644 src/main/scala/resonantinduction/atomic/schematic/SchematicFusionReactor.scala delete mode 100644 src/main/scala/resonantinduction/core/CommonProxy.scala delete mode 100644 src/main/scala/resonantinduction/core/RICreativeTab.scala delete mode 100644 src/main/scala/resonantinduction/core/Settings.scala delete mode 100644 src/main/scala/resonantinduction/core/render/InvertX.scala delete mode 100644 src/main/scala/resonantinduction/core/resource/content/BlockDecoration.scala delete mode 100644 src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.scala delete mode 100644 src/main/scala/resonantinduction/electrical/tesla/ITesla.scala delete mode 100644 src/main/scala/resonantinduction/electrical/tesla/RenderTesla.scala delete mode 100644 src/main/scala/resonantinduction/electrical/transformer/ItemElectricTransformer.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/machine/TileDetector.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/machine/edit/TileBreaker.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/process/crusher/NodeMechanicalPiston.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/process/crusher/RenderMechanicalPiston.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/process/crusher/TileMechanicalPiston.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/process/mixer/MixerNode.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/turbine/RenderWaterTurbine.scala delete mode 100644 src/main/scala/resonantinduction/mechanical/mech/turbine/TurbineMBlockHandler.scala diff --git a/src/main/resources/assets/resonantinduction/lang/de_DE.lang b/src/main/resources/assets/edx/lang/de_DE.lang similarity index 100% rename from src/main/resources/assets/resonantinduction/lang/de_DE.lang rename to src/main/resources/assets/edx/lang/de_DE.lang diff --git a/src/main/resources/assets/edx/lang/en_US.lang b/src/main/resources/assets/edx/lang/en_US.lang new file mode 100644 index 000000000..71455e811 --- /dev/null +++ b/src/main/resources/assets/edx/lang/en_US.lang @@ -0,0 +1,385 @@ +# English @author Calclavia, Alex_hawks +# If a localization includes %v it is some data that is calculated. Such as attributes on a cable. +# The %v may be followed by a number if there are multiple pieces of calculated data, but it will be explained in a comment. +# A % followed by a number is used for colors. The exact usage will be outlined in the comment above the localization. + +itemGroup.edx=Resonant Induction +itemGroup.edx.core=Resonant Induction Core +meta.edx.description=Resonant Induction is a Minecraft mod focusing on the manipulation of electricity and wireless technology. Ever wanted blazing electrical shocks flying off your evil lairs? You've came to the right place! +meta.edx.credits=Visit website for credits. + +fluid.mixture=Mixture +toolmode.link.name=Linking + +### Schematics +schematic.windTurbine.name=Wind Turbine +schematic.waterTurbine.name=Water Turbine + +### Core +item.edx:ingot.name=%v Ingot +item.edx:oreDust.name=%v Dust +item.edx:alloyDust.name=Alloy Dust +item.edx:oreDust.tooltip=Shift-right click on a cauldron to refine. +item.edx:oreRefinedDust.name=%v Refined Dust +item.edx:oreRubble.name=%v Rubble +item.edx:bucketMixture.name=%v Bucket +item.edx:bucketMolten.name=%v Bucket +item.edx:bucketMolten.name=%v Bucket + +#Misc +misc.ingot=Ingot +misc.ingot=Ingot +misc.rubble=Rubble +misc.dust=Dust +misc.refinedDust=Refined Dust +misc.bucketMolten=Molten Bucket + +# Blocks +tile.edx:oreCopper.name=Copper Ore +tile.edx:oreTin.name=Tin Ore +tile.edx:glassJar.name=Glass Jar + +# Items +item.edx:circuitBasic.name=Basic Circuit +item.edx:circuitAdvanced.name=Advanced Circuit +item.edx:circuitElite.name=Elite Circuit +item.edx:screwdriver.name=Screwdriver +item.edx:screwdriver.tooltip=Used to configure blocks. Shift-right click to change mode. +item.edx:motor.name=Motor + +item.edx:plateCopper.name=Copper Plate +item.edx:plateTin.name=Tin Plate +item.edx:plateBronze.name=Bronze Plate +item.edx:plateSteel.name=Steel Plate +item.edx:plateIron.name=Iron Plate +item.edx:plateGold.name=Gold Plate + +item.edx:ingotCopper.name=Copper Ingot +item.edx:ingotTin.name=Tin Ingot +item.edx:ingotBronze.name=Bronze Ingot +item.edx:ingotSteel.name=Steel Ingot + +item.edx:dustBronze.name=Bronze Dust +item.edx:dustSteel.name=Steel Dust + +### Archaic Module +tile.edx:gutter.name=Gutter +tile.edx:gutter.tooltip=A primitive way of transferring fluid. + +## Industrial Stone Blocks +tile.edx:industrialStone.0.name=Industrial Brick +tile.edx:industrialStone.1.name=Industrial Double Slab Brick +tile.edx:industrialStone.2.name=Industrial Chiseled Brick +tile.edx:industrialStone.3.name=Industrial Cobblestone +tile.edx:industrialStone.4.name=Industrial Cracked Stone +tile.edx:industrialStone.5.name=Industrial Stone +tile.edx:industrialStone.6.name=Industrial Stone Slab +tile.edx:industrialStone.7.name=Industrial Mossy Stone +tile.edx:industrialStone.8.name=Dark Iron +tile.edx:industrialStone.9.name=Tinted Steel +tile.edx:industrialStone.10.name=Steel + +## Items +item.edx:imprint.name=Imprint +item.edx:hammer.name=Hammer +item.edx:handCrank.name=Hand Crank +item.edx:biomass.name=Biomass +item.edx:focusingMatrix.name=Focusing Matrix + +## Machines +tile.edx:castingMold.name=Casting Mold +tile.edx:castingMold.tooltip=Pour molten metal into the cast to form an ingot. +tile.edx:millstone.name=Millstone +tile.edx:millstone.tooltip=Put some rubble in the millstone and use a hand crank to grind rubble into dust. +tile.edx:imprinter.name=Imprinter + +tile.edx:firebox.name=Firebox +tile.edx:firebox.0.name=Firebox +tile.edx:firebox.1.name=Electric Firebox + +tile.edx:hotPlate.name=Hot Plate + +tile.edx:workbench.name=Workbench +tile.edx:workbench.tooltip=The workbench is used for hammering and sawing resources. +tile.edx:engineeringTable.name=Engineering Table +engineerTable.config.inventory.true=Engineering table is now connected to nearby inventories. +engineerTable.config.inventory.false=Engineering table is now disconnected from nearby inventories. + +## Transport +tile.edx:turntable.name=Turntable +tile.edx:crate.0.name=Wooden Crate +tile.edx:crate.1.name=Iron Crate +tile.edx:crate.2.name=Steel Crate + +info.waila.crate.stack=Item: +info.waila.crate.stored=Stored: +info.waila.crate.empty=Empty + +crate.orefilter.true= Same OreName stacking enabled +crate.orefilter.false= Same OreName stacking disabled +crate.tooltip.amount= Amount: + +tile.edx:crate.0.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter +tile.edx:crate.1.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter +tile.edx:crate.2.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter + +tile.edx:tank.name=Tank +tile.edx:tank.0.name=Tank +tile.edx:tank.tooltip=Shift right click to pick up with fluid contained within. +info.waila.tank.fluid=Fluid: +info.waila.tank.vol=Volume: +info.waila.tank.empty=Empty + +### Mechanical Module +## Energy +item.edx:gear.0.name=Wooden Gear +item.edx:gear.1.name=Stone Gear +item.edx:gear.2.name=Metal Gear + +item.edx:gearShaft.0.name=Wooden Gear Shaft +item.edx:gearShaft.1.name=Stone Gear Shaft +item.edx:gearShaft.2.name=Metal Gear Shaft + +tile.edx:windTurbine.name=Wind Turbine +tile.edx:windTurbine.0.name=Wooden Wind Turbine +tile.edx:windTurbine.0.tooltip=The wooden wind turbine is light, fragile and spins fast. +tile.edx:windTurbine.1.name=Stone Wind Turbine +tile.edx:windTurbine.1.tooltip=The stone turbine is heavy, strong and durable. +tile.edx:windTurbine.2.name=Metal Wind Turbine +tile.edx:windTurbine.2.tooltip=The metal wind turbine is strong and agile. + +tile.edx:waterTurbine.name=Water Turbine +tile.edx:waterTurbine.0.name=Wooden Water Turbine +tile.edx:waterTurbine.0.tooltip=The wooden water turbine is light and moves fast. +tile.edx:waterTurbine.1.name=Stone Water Turbine +tile.edx:waterTurbine.1.tooltip=The stone water turbine is heavy, strong and durable. +tile.edx:waterTurbine.2.name=Metal Water Turbine +tile.edx:waterTurbine.2.tooltip=The metal water turbine is strong and agile. + +## Transport +item.edx:pipe.ceramic.name=Ceramic Pipe +item.edx:pipe.bronze.name=Bronze Pipe +item.edx:pipe.plastic.name=Plastic Pipe +item.edx:pipe.iron.name=Iron Pipe +item.edx:pipe.steel.name=Steel Pipe +item.edx:pipe.fiberglass.name=Fiberglass Pipe +tile.edx:pump.name=Pump +tile.edx:grate.name=Grate +tile.edx:conveyorBelt.name=Conveyor Belt + +tile.edx:detector.name=Detector +tile.edx:detector.tooltip=Outputs a Redstone signal upon item detection. Configure to invert imprint filter. +tile.edx:manipulator.name=Manipulator +tile.edx:rejector.name=Rejector +tile.edx:sorter.name=Sorter +tile.edx:breaker.name=Breaker +tile.edx:placer.name=Placer + +## Machines and Processing +tile.edx:mixer.name=Mixer +tile.edx:mixer.tooltip=The mixer mixes dusts with water to wash and refine the ore dust. Mixer prefers more angular velocity (spin) to process dusts. +tile.edx:mechanicalPiston.name=Mechanical Piston +tile.edx:grindingWheel.name=Grinding Wheel +tile.edx:grindingWheel.tooltip=The grinding wheel grinds ores into rubble and dust. Larger torque allows faster grinding. +tile.edx:filter.name=Filter +edx.machine.grinder=Grinder +edx.machine.crusher=Crusher +edx.machine.mixer=Mixer +edx.machine.sawmill=Saw-mill +edx.machine.smelter=Smelter + +### Electrical +## Blocks +tile.edx:tesla.name=Tesla Coil +tile.edx:tesla.tooltip=Transfer electricity wirelessly. Link with a configurator for cross dimension teleportation. +item.edx:levitator.name=Electromagnetic Levitator +tile.edx:battery.name=Battery +tile.edx:armbot.name=Armbot +tile.edx:encoder.name=Encoder +item.edx:charger.name=Charging Plate +item.edx:insulation.name=Insulation +tile.edx:laserEmitter.name=Laser Emitter +tile.edx:laserReceiver.name=Laser Receiver +tile.edx:focusCrystal.name=Focus Crystal +tile.edx:mirror.name=Mirror + +tool.mode.set=Mode set to: +laser.toolmode.remove=Remove +laser.toolmode.smelt=Smelt +laser.toolmode.damage=Damage + +## Generators +tile.edx:solarPanel.name=Solar Panel +tile.edx:motor.name=Electric Motor +tile.edx:thermopile.name=Thermopile +tile.edx:thermopile.tooltip=Generates a voltage proportional to local temperature difference. + +#Transport +item.edx:disk.name=Program Disk + +## Energy +item.edx:wire.copper.name=Copper Wire +item.edx:wire.tin.name=Tin Wire +item.edx:wire.iron.name=Iron Wire +item.edx:wire.aluminum.name=Aluminum Wire +item.edx:wire.silver.name=Silver Wire +item.edx:wire.superconductor.name=Superconductor Wire +item.edx:electricTransformer.name=Transformer +item.edx:multimeter.name=Multimeter +item.edx:multimeter.tooltip=Multimeter is a panel that display the energy and fluid information of a block. + +### Quantum Tier +tile.edx:quantumGate.name=Quantum Gate +item.edx:quantumGlyph.0.name=Nought Glyph +item.edx:quantumGlyph.1.name=Monogon Glyph +item.edx:quantumGlyph.2.name=Digon Glyph +item.edx:quantumGlyph.3.name=Trigon Glyph +item.edx:quantumGlyph.4.name=Tetragon Glyph + +## Tool-tips +tooltip.pipe.rate=Flow Rate: #v +tooltip.pipe.pressure=Max Pressure: #v + +tooltip.wire.resistance=Resistance: #v +tooltip.wire.current=Current: #v +tooltip.wire.damage=Damage: #v +tooltip.wire.helpText=Higher voltages will increase transfer rate and decrease energy loss. Shift right click to place a framed wire. +# %0 is the color for the charge level, %1 is grey to reset it back to normal (optional), %v0 is the current charge, %v1 is the max charge +tooltip.battery.energy=Energy: %0%v0 / %v1 +tooltip.noInformation=No Information +tooltip.tier=Tier +tooltip.empty=Empty +tooltip.noOutput=No Output +tooltip.noImprint=No Imprint + +tooltip.graph.energy=Energy +tooltip.graph.power=Power +tooltip.graph.capacity=Capacity +tooltip.graph.voltage=Voltage +tooltip.graph.torque=Torque +tooltip.graph.speed=Speed +tooltip.graph.fluid=Fluid +tooltip.graph.temperature=Temperature +tooltip.graph.pressure=Pressure + +## GUI Strings that can't be any other localization +gui.edx.multimeter.toggle=Toggle +gui.edx.multimeter.toggleDetection=Toggle Detection +gui.edx.multimeter.toggleGraph=Toggle Graph +gui.edx.multimeter.capacity=Capacity: +gui.edx.multimeter.energy=Energy: +gui.edx.multimeter.redstone=Output Redstone If... +gui.edx.multimeter.logic=Logic: + +gui.edx.multimeter.none=None +gui.edx.multimeter.lessThan=Less Than +gui.edx.multimeter.lessThanOrEqual=Less Than or Equal +gui.edx.multimeter.equal=Equal +gui.edx.multimeter.greaterThanOrEqual=Greater Than or Equal +gui.edx.multimeter.greaterThan=Greater Than + +## Messages to players +message.multimeter.onUse=Energy: %v J +message.tesla.toggleAttack=Toggled entity attack to: %v +# %v0 is the tile that's linking to the other (usually %v0 is a tesla), the others are coordinates in the standard [x, y, z] +message.tesla.pair=Linked %v0 with [%v1, %v2, %v3] +message.tesla.mode=Tesla receive mode is now %v + +### Atomic Module +potion.radiation=Radiation +death.attack.radiation=%1$s died from radiation. + +## Schematic +schematic.accelerator.name=Particle Accelerator +schematic.breedingReactor.name=Breeding Reactor +schematic.fissionReactor.name=Fission Reactor +schematic.fusionReactor.name=Fusion Reactor + +## Fluids +fluid.uraniumhexafluoride=Uranium Hexafluoride +fluid.deuterium=Deuterium +fluid.tritium=Tritium +fluid.plasma=Plasma +fluid.steam=Steam +fluid.toxicwaste=Toxic Waste +fluid.tile.water=Water + +item.edx:hazmatMask.name=Hazmat Mask +item.edx:hazmatBody.name=Hazmat Body +item.edx:hazmatLeggings.name=Hazmat Leggings +item.edx:hazmatBoots.name=Hazmat Boots +item.edx:bucketToxicWaste.name=Toxic Waste Bucket + +## Cells +item.edx:cellEmpty.0.name=Empty Cell +item.edx:cellWater.0.name=Water Cell +item.edx:cellDeuterium.0.name=Deuterium Cell +item.edx:cellTritium.0.name=Tritium Cell +item.edx:darkMatter.0.name=Dark Matter +item.edx:antimatter.0.name=Antimatter +item.edx:antimatter.0.tooltip=125 Milligrams +item.edx:antimatter.1.name=Antimatter +item.edx:antimatter.1.tooltip=1 Gram + +## Uranium Related Items +item.edx:yellowCake.name=Yellowcake +item.edx:uranium.0.name=Uranium-235 +item.edx:uranium.0.tooltip=Enriched Uranium +item.edx:uranium.1.name=Uranium-238 +item.edx:uranium.1.tooltip=Breeding Uranium +item.edx:fissileFuel.name=Fissile Fuel Rod +item.edx:fissileFuel.tooltip=The primary fuel source for fission reactors. +item.edx:breederFuel.name=Breeder Fuel Rod +item.edx:breederFuel.tooltip=The fuel source for re-breeding decayed fissile fuels. +item.edx:uraniumHexafluoride.name=Uranium Hexafluoride +item.edx:steam.name=Steam + +## Blocks +tile.edx:oreUranium.name=Uranium Ore +tile.edx:oreUraniumOre.tooltip=A precious and useful ore used for fission reactions. +tile.edx:reactorDrain.name=Reactor Drain +tile.edx:reactorDrain.tooltip=Extracts fluids out of the reactor, such as toxic waste. +tile.edx:nuclearBoiler.name=Nuclear Boiler +tile.edx:nuclearBoiler.tooltip=Boils yellowcake into uranium hexaflouride gas. +tile.edx:centrifuge.name=Centrifuge +tile.edx:centrifuge.tooltip=Refines Uranium Hexafluoride gas into usable uranium. +tile.edx:reactorCell.name=Reactor Cell +tile.edx:reactorCell.tooltip=The primary components for all types of reactors. Fuel rods or plasma may be injected into the cell. +tile.edx:plasmaHeater.name=Plasma Heater +tile.edx:plasmaHeater.tooltip=A plasma heater is used to heat deuterium and tritium to plasma state for fusion power. Plasma must be moved into the reactor cell. +tile.edx:electricTurbine.name=Electric Turbine +tile.edx:electricTurbine.tooltip=Transform the kinetic energy from moving steam into electrical energy. +tile.edx:radioactive.name=Radioactive Waste +tile.edx:radioactive.tooltip=Generates harmful radiation and spreads around the world, mutating organisms. +tile.edx:thermometer.name=Thermometer +tile.edx:thermometer.tooltip=Reads the temperature at the current coordinate. Shift-right click to lock the reading to a specific coordinate. +tile.edx:electromagnet.name=Electromagnet +tile.edx:electromagnet.0.name=Electromagnet +tile.edx:electromagnet.1.name=Electromagnet +tile.edx:electromagnet.tooltip=Creates an electromagnetic field preventing plasma and particles from getting near. +tile.edx:chemicalExtractor.name=Chemical Extractor +tile.edx:chemicalExtractor.tooltip=Extracts uranium ores to yellowcake, water to deuterium and deuterium to tritium. +tile.edx:siren.name=Siren +tile.edx:siren.tooltip=Creates an alarm with customizable pitch and volume with a Redstone signal. +tile.edx:controlRod.name=Control Rod +tile.edx:controlRod.tooltip=Suppresses fission reaction in adjacent reactor cells. +tile.edx:plasma.name=Plasma +tile.edx:plasma.tooltip=Generates extreme heat for boiling water. +tile.edx:funnel.name=Gas Funnel +tile.edx:funnel.tooltip=Captures gas to allow it to be transported with piping. +tile.edx:accelerator.name=Particle Accelerator +tile.edx:accelerator.tooltip=Accelerates particles and creates antimatter and dark matter. +tile.edx:fulmination.name=Fulmination Generator +tile.edx:fulmination.tooltip=Transforms the kinetic energy from explosions into electrical energy. +tile.edx:quantumAssembler.name=Quantum Assembler +tile.edx:quantumAssembler.tooltip=Reassembles Dark Matter atoms into usable materials. +tile.edx:toxicWaste.name=Toxic Waste +tile.edx:toxicWaste.tooltip=Toxic, nuclear waste that pollutes the world. +tile.edx:mirror.name = Mirror + +## Tooltips +tooltip.energy=Energy +tooltip.temperature=Temperature +tooltip.remainingTime=Remaining Time +tooltip.trackingTemperature=Tracking temperature at: +tooltip.notTrackingTemperature=Not tracking temperature. diff --git a/src/main/resources/assets/resonantinduction/lang/pl_PL.lang b/src/main/resources/assets/edx/lang/pl_PL.lang similarity index 100% rename from src/main/resources/assets/resonantinduction/lang/pl_PL.lang rename to src/main/resources/assets/edx/lang/pl_PL.lang diff --git a/src/main/resources/assets/resonantinduction/lang/ru_RU.lang b/src/main/resources/assets/edx/lang/ru_RU.lang similarity index 100% rename from src/main/resources/assets/resonantinduction/lang/ru_RU.lang rename to src/main/resources/assets/edx/lang/ru_RU.lang diff --git a/src/main/resources/assets/resonantinduction/models/LaserGun.png b/src/main/resources/assets/edx/models/LaserGun.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/LaserGun.png rename to src/main/resources/assets/edx/models/LaserGun.png diff --git a/src/main/resources/assets/resonantinduction/models/MiningLaserGun.tcn b/src/main/resources/assets/edx/models/MiningLaserGun.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/MiningLaserGun.tcn rename to src/main/resources/assets/edx/models/MiningLaserGun.tcn diff --git a/src/main/resources/assets/resonantinduction/models/armbot.png b/src/main/resources/assets/edx/models/armbot.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/armbot.png rename to src/main/resources/assets/edx/models/armbot.png diff --git a/src/main/resources/assets/resonantinduction/models/battery.obj b/src/main/resources/assets/edx/models/battery.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/battery.obj rename to src/main/resources/assets/edx/models/battery.obj diff --git a/src/main/resources/assets/resonantinduction/models/battery/battery.png b/src/main/resources/assets/edx/models/battery/battery.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/battery/battery.png rename to src/main/resources/assets/edx/models/battery/battery.png diff --git a/src/main/resources/assets/resonantinduction/models/battery/battery.tcn b/src/main/resources/assets/edx/models/battery/battery.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/battery/battery.tcn rename to src/main/resources/assets/edx/models/battery/battery.tcn diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame0.png b/src/main/resources/assets/edx/models/belt/frame0.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame0.png rename to src/main/resources/assets/edx/models/belt/frame0.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame1.png b/src/main/resources/assets/edx/models/belt/frame1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame1.png rename to src/main/resources/assets/edx/models/belt/frame1.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame10.png b/src/main/resources/assets/edx/models/belt/frame10.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame10.png rename to src/main/resources/assets/edx/models/belt/frame10.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame11.png b/src/main/resources/assets/edx/models/belt/frame11.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame11.png rename to src/main/resources/assets/edx/models/belt/frame11.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame12.png b/src/main/resources/assets/edx/models/belt/frame12.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame12.png rename to src/main/resources/assets/edx/models/belt/frame12.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame13.png b/src/main/resources/assets/edx/models/belt/frame13.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame13.png rename to src/main/resources/assets/edx/models/belt/frame13.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame2.png b/src/main/resources/assets/edx/models/belt/frame2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame2.png rename to src/main/resources/assets/edx/models/belt/frame2.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame3.png b/src/main/resources/assets/edx/models/belt/frame3.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame3.png rename to src/main/resources/assets/edx/models/belt/frame3.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame4.png b/src/main/resources/assets/edx/models/belt/frame4.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame4.png rename to src/main/resources/assets/edx/models/belt/frame4.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame5.png b/src/main/resources/assets/edx/models/belt/frame5.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame5.png rename to src/main/resources/assets/edx/models/belt/frame5.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame6.png b/src/main/resources/assets/edx/models/belt/frame6.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame6.png rename to src/main/resources/assets/edx/models/belt/frame6.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame7.png b/src/main/resources/assets/edx/models/belt/frame7.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame7.png rename to src/main/resources/assets/edx/models/belt/frame7.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame8.png b/src/main/resources/assets/edx/models/belt/frame8.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame8.png rename to src/main/resources/assets/edx/models/belt/frame8.png diff --git a/src/main/resources/assets/resonantinduction/models/belt/frame9.png b/src/main/resources/assets/edx/models/belt/frame9.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/belt/frame9.png rename to src/main/resources/assets/edx/models/belt/frame9.png diff --git a/src/main/resources/assets/resonantinduction/models/castingMold.png b/src/main/resources/assets/edx/models/castingMold.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/castingMold.png rename to src/main/resources/assets/edx/models/castingMold.png diff --git a/src/main/resources/assets/resonantinduction/models/castingMold.tcn b/src/main/resources/assets/edx/models/castingMold.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/castingMold.tcn rename to src/main/resources/assets/edx/models/castingMold.tcn diff --git a/src/main/resources/assets/resonantinduction/models/centrifuge.png b/src/main/resources/assets/edx/models/centrifuge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/centrifuge.png rename to src/main/resources/assets/edx/models/centrifuge.png diff --git a/src/main/resources/assets/resonantinduction/models/centrifuge.tcn b/src/main/resources/assets/edx/models/centrifuge.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/centrifuge.tcn rename to src/main/resources/assets/edx/models/centrifuge.tcn diff --git a/src/main/resources/assets/resonantinduction/models/charger.png b/src/main/resources/assets/edx/models/charger.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/charger.png rename to src/main/resources/assets/edx/models/charger.png diff --git a/src/main/resources/assets/resonantinduction/models/charger.tcn b/src/main/resources/assets/edx/models/charger.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/charger.tcn rename to src/main/resources/assets/edx/models/charger.tcn diff --git a/src/main/resources/assets/resonantinduction/models/chemicalExtractor.png b/src/main/resources/assets/edx/models/chemicalExtractor.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/chemicalExtractor.png rename to src/main/resources/assets/edx/models/chemicalExtractor.png diff --git a/src/main/resources/assets/resonantinduction/models/chemicalExtractor.tcn b/src/main/resources/assets/edx/models/chemicalExtractor.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/chemicalExtractor.tcn rename to src/main/resources/assets/edx/models/chemicalExtractor.tcn diff --git a/src/main/resources/assets/resonantinduction/models/em_contractor.png b/src/main/resources/assets/edx/models/em_contractor.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/em_contractor.png rename to src/main/resources/assets/edx/models/em_contractor.png diff --git a/src/main/resources/assets/resonantinduction/models/em_contractor_push.png b/src/main/resources/assets/edx/models/em_contractor_push.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/em_contractor_push.png rename to src/main/resources/assets/edx/models/em_contractor_push.png diff --git a/src/main/resources/assets/resonantinduction/models/fadedSphere.png b/src/main/resources/assets/edx/models/fadedSphere.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/fadedSphere.png rename to src/main/resources/assets/edx/models/fadedSphere.png diff --git a/src/main/resources/assets/resonantinduction/models/fissileMaterial.png b/src/main/resources/assets/edx/models/fissileMaterial.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/fissileMaterial.png rename to src/main/resources/assets/edx/models/fissileMaterial.png diff --git a/src/main/resources/assets/resonantinduction/models/focusCrystal.png b/src/main/resources/assets/edx/models/focusCrystal.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/focusCrystal.png rename to src/main/resources/assets/edx/models/focusCrystal.png diff --git a/src/main/resources/assets/resonantinduction/models/focusCrystal.tcn b/src/main/resources/assets/edx/models/focusCrystal.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/focusCrystal.tcn rename to src/main/resources/assets/edx/models/focusCrystal.tcn diff --git a/src/main/resources/assets/resonantinduction/models/fusionReactor.png b/src/main/resources/assets/edx/models/fusionReactor.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/fusionReactor.png rename to src/main/resources/assets/edx/models/fusionReactor.png diff --git a/src/main/resources/assets/resonantinduction/models/fusionReactor.tcn b/src/main/resources/assets/edx/models/fusionReactor.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/fusionReactor.tcn rename to src/main/resources/assets/edx/models/fusionReactor.tcn diff --git a/src/main/resources/assets/resonantinduction/models/gears.obj b/src/main/resources/assets/edx/models/gears.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/gears.obj rename to src/main/resources/assets/edx/models/gears.obj diff --git a/src/main/resources/assets/resonantinduction/models/glassJar.png b/src/main/resources/assets/edx/models/glassJar.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/glassJar.png rename to src/main/resources/assets/edx/models/glassJar.png diff --git a/src/main/resources/assets/resonantinduction/models/glassJar.tcn b/src/main/resources/assets/edx/models/glassJar.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/glassJar.tcn rename to src/main/resources/assets/edx/models/glassJar.tcn diff --git a/src/main/resources/assets/resonantinduction/models/grinder.obj b/src/main/resources/assets/edx/models/grinder.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/grinder.obj rename to src/main/resources/assets/edx/models/grinder.obj diff --git a/src/main/resources/assets/resonantinduction/models/gutter.png b/src/main/resources/assets/edx/models/gutter.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/gutter.png rename to src/main/resources/assets/edx/models/gutter.png diff --git a/src/main/resources/assets/resonantinduction/models/gutter.tcn b/src/main/resources/assets/edx/models/gutter.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/gutter.tcn rename to src/main/resources/assets/edx/models/gutter.tcn diff --git a/src/main/resources/assets/resonantinduction/models/hazmat.png b/src/main/resources/assets/edx/models/hazmat.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/hazmat.png rename to src/main/resources/assets/edx/models/hazmat.png diff --git a/src/main/resources/assets/resonantinduction/models/laserEmitter.png b/src/main/resources/assets/edx/models/laserEmitter.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/laserEmitter.png rename to src/main/resources/assets/edx/models/laserEmitter.png diff --git a/src/main/resources/assets/resonantinduction/models/laserEmitter.tcn b/src/main/resources/assets/edx/models/laserEmitter.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/laserEmitter.tcn rename to src/main/resources/assets/edx/models/laserEmitter.tcn diff --git a/src/main/resources/assets/resonantinduction/models/laserReceiver.png b/src/main/resources/assets/edx/models/laserReceiver.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/laserReceiver.png rename to src/main/resources/assets/edx/models/laserReceiver.png diff --git a/src/main/resources/assets/resonantinduction/models/laserReceiver.tcn b/src/main/resources/assets/edx/models/laserReceiver.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/laserReceiver.tcn rename to src/main/resources/assets/edx/models/laserReceiver.tcn diff --git a/src/main/resources/assets/resonantinduction/models/levitator.tcn b/src/main/resources/assets/edx/models/levitator.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/levitator.tcn rename to src/main/resources/assets/edx/models/levitator.tcn diff --git a/src/main/resources/assets/resonantinduction/models/levitator_off.png b/src/main/resources/assets/edx/models/levitator_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/levitator_off.png rename to src/main/resources/assets/edx/models/levitator_off.png diff --git a/src/main/resources/assets/resonantinduction/models/levitator_on.png b/src/main/resources/assets/edx/models/levitator_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/levitator_on.png rename to src/main/resources/assets/edx/models/levitator_on.png diff --git a/src/main/resources/assets/resonantinduction/models/manipulator1.png b/src/main/resources/assets/edx/models/manipulator1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/manipulator1.png rename to src/main/resources/assets/edx/models/manipulator1.png diff --git a/src/main/resources/assets/resonantinduction/models/manipulator2.png b/src/main/resources/assets/edx/models/manipulator2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/manipulator2.png rename to src/main/resources/assets/edx/models/manipulator2.png diff --git a/src/main/resources/assets/resonantinduction/models/mirror.png b/src/main/resources/assets/edx/models/mirror.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/mirror.png rename to src/main/resources/assets/edx/models/mirror.png diff --git a/src/main/resources/assets/resonantinduction/models/mirror.tcn b/src/main/resources/assets/edx/models/mirror.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/mirror.tcn rename to src/main/resources/assets/edx/models/mirror.tcn diff --git a/src/main/resources/assets/resonantinduction/models/mixer.png b/src/main/resources/assets/edx/models/mixer.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/mixer.png rename to src/main/resources/assets/edx/models/mixer.png diff --git a/src/main/resources/assets/resonantinduction/models/mixer.tcn b/src/main/resources/assets/edx/models/mixer.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/mixer.tcn rename to src/main/resources/assets/edx/models/mixer.tcn diff --git a/src/main/resources/assets/resonantinduction/models/motor.png b/src/main/resources/assets/edx/models/motor.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/motor.png rename to src/main/resources/assets/edx/models/motor.png diff --git a/src/main/resources/assets/resonantinduction/models/motor.tcn b/src/main/resources/assets/edx/models/motor.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/motor.tcn rename to src/main/resources/assets/edx/models/motor.tcn diff --git a/src/main/resources/assets/resonantinduction/models/nuclearBoiler.png b/src/main/resources/assets/edx/models/nuclearBoiler.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/nuclearBoiler.png rename to src/main/resources/assets/edx/models/nuclearBoiler.png diff --git a/src/main/resources/assets/resonantinduction/models/nuclearBoiler.tcn b/src/main/resources/assets/edx/models/nuclearBoiler.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/nuclearBoiler.tcn rename to src/main/resources/assets/edx/models/nuclearBoiler.tcn diff --git a/src/main/resources/assets/resonantinduction/models/pipe.png b/src/main/resources/assets/edx/models/pipe.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/pipe.png rename to src/main/resources/assets/edx/models/pipe.png diff --git a/src/main/resources/assets/resonantinduction/models/pipe.tcn b/src/main/resources/assets/edx/models/pipe.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/pipe.tcn rename to src/main/resources/assets/edx/models/pipe.tcn diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston.tcn b/src/main/resources/assets/edx/models/piston/mechanicalPiston.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston.tcn rename to src/main/resources/assets/edx/models/piston/mechanicalPiston.tcn diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_diamond.png b/src/main/resources/assets/edx/models/piston/mechanicalPiston_diamond.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_diamond.png rename to src/main/resources/assets/edx/models/piston/mechanicalPiston_diamond.png diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_iron.png b/src/main/resources/assets/edx/models/piston/mechanicalPiston_iron.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_iron.png rename to src/main/resources/assets/edx/models/piston/mechanicalPiston_iron.png diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_stone.png b/src/main/resources/assets/edx/models/piston/mechanicalPiston_stone.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_stone.png rename to src/main/resources/assets/edx/models/piston/mechanicalPiston_stone.png diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wood.png b/src/main/resources/assets/edx/models/piston/mechanicalPiston_wood.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wood.png rename to src/main/resources/assets/edx/models/piston/mechanicalPiston_wood.png diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wool.png b/src/main/resources/assets/edx/models/piston/mechanicalPiston_wool.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wool.png rename to src/main/resources/assets/edx/models/piston/mechanicalPiston_wool.png diff --git a/src/main/resources/assets/resonantinduction/models/pump.png b/src/main/resources/assets/edx/models/pump.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/pump.png rename to src/main/resources/assets/edx/models/pump.png diff --git a/src/main/resources/assets/resonantinduction/models/pump.tcn b/src/main/resources/assets/edx/models/pump.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/pump.tcn rename to src/main/resources/assets/edx/models/pump.tcn diff --git a/src/main/resources/assets/resonantinduction/models/quantumAssembler.png b/src/main/resources/assets/edx/models/quantumAssembler.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/quantumAssembler.png rename to src/main/resources/assets/edx/models/quantumAssembler.png diff --git a/src/main/resources/assets/resonantinduction/models/quantumAssembler.tcn b/src/main/resources/assets/edx/models/quantumAssembler.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/quantumAssembler.tcn rename to src/main/resources/assets/edx/models/quantumAssembler.tcn diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellBottom.png b/src/main/resources/assets/edx/models/reactorCellBottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellBottom.png rename to src/main/resources/assets/edx/models/reactorCellBottom.png diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellBottom.tcn b/src/main/resources/assets/edx/models/reactorCellBottom.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellBottom.tcn rename to src/main/resources/assets/edx/models/reactorCellBottom.tcn diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellMiddle.png b/src/main/resources/assets/edx/models/reactorCellMiddle.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellMiddle.png rename to src/main/resources/assets/edx/models/reactorCellMiddle.png diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellMiddle.tcn b/src/main/resources/assets/edx/models/reactorCellMiddle.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellMiddle.tcn rename to src/main/resources/assets/edx/models/reactorCellMiddle.tcn diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellTop.png b/src/main/resources/assets/edx/models/reactorCellTop.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellTop.png rename to src/main/resources/assets/edx/models/reactorCellTop.png diff --git a/src/main/resources/assets/resonantinduction/models/reactorCellTop.tcn b/src/main/resources/assets/edx/models/reactorCellTop.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/reactorCellTop.tcn rename to src/main/resources/assets/edx/models/reactorCellTop.tcn diff --git a/src/main/resources/assets/resonantinduction/models/rejector.png b/src/main/resources/assets/edx/models/rejector.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/rejector.png rename to src/main/resources/assets/edx/models/rejector.png diff --git a/src/main/resources/assets/resonantinduction/models/rejector.tcn b/src/main/resources/assets/edx/models/rejector.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/rejector.tcn rename to src/main/resources/assets/edx/models/rejector.tcn diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame0.png b/src/main/resources/assets/edx/models/slantedbelt/frame0.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame0.png rename to src/main/resources/assets/edx/models/slantedbelt/frame0.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame1.png b/src/main/resources/assets/edx/models/slantedbelt/frame1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame1.png rename to src/main/resources/assets/edx/models/slantedbelt/frame1.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame10.png b/src/main/resources/assets/edx/models/slantedbelt/frame10.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame10.png rename to src/main/resources/assets/edx/models/slantedbelt/frame10.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame11.png b/src/main/resources/assets/edx/models/slantedbelt/frame11.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame11.png rename to src/main/resources/assets/edx/models/slantedbelt/frame11.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame12.png b/src/main/resources/assets/edx/models/slantedbelt/frame12.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame12.png rename to src/main/resources/assets/edx/models/slantedbelt/frame12.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame13.png b/src/main/resources/assets/edx/models/slantedbelt/frame13.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame13.png rename to src/main/resources/assets/edx/models/slantedbelt/frame13.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame14.png b/src/main/resources/assets/edx/models/slantedbelt/frame14.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame14.png rename to src/main/resources/assets/edx/models/slantedbelt/frame14.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame15.png b/src/main/resources/assets/edx/models/slantedbelt/frame15.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame15.png rename to src/main/resources/assets/edx/models/slantedbelt/frame15.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame16.png b/src/main/resources/assets/edx/models/slantedbelt/frame16.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame16.png rename to src/main/resources/assets/edx/models/slantedbelt/frame16.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame17.png b/src/main/resources/assets/edx/models/slantedbelt/frame17.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame17.png rename to src/main/resources/assets/edx/models/slantedbelt/frame17.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame18.png b/src/main/resources/assets/edx/models/slantedbelt/frame18.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame18.png rename to src/main/resources/assets/edx/models/slantedbelt/frame18.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame19.png b/src/main/resources/assets/edx/models/slantedbelt/frame19.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame19.png rename to src/main/resources/assets/edx/models/slantedbelt/frame19.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame2.png b/src/main/resources/assets/edx/models/slantedbelt/frame2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame2.png rename to src/main/resources/assets/edx/models/slantedbelt/frame2.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame20.png b/src/main/resources/assets/edx/models/slantedbelt/frame20.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame20.png rename to src/main/resources/assets/edx/models/slantedbelt/frame20.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame21.png b/src/main/resources/assets/edx/models/slantedbelt/frame21.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame21.png rename to src/main/resources/assets/edx/models/slantedbelt/frame21.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame22.png b/src/main/resources/assets/edx/models/slantedbelt/frame22.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame22.png rename to src/main/resources/assets/edx/models/slantedbelt/frame22.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame23.png b/src/main/resources/assets/edx/models/slantedbelt/frame23.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame23.png rename to src/main/resources/assets/edx/models/slantedbelt/frame23.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame3.png b/src/main/resources/assets/edx/models/slantedbelt/frame3.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame3.png rename to src/main/resources/assets/edx/models/slantedbelt/frame3.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame4.png b/src/main/resources/assets/edx/models/slantedbelt/frame4.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame4.png rename to src/main/resources/assets/edx/models/slantedbelt/frame4.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame5.png b/src/main/resources/assets/edx/models/slantedbelt/frame5.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame5.png rename to src/main/resources/assets/edx/models/slantedbelt/frame5.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame6.png b/src/main/resources/assets/edx/models/slantedbelt/frame6.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame6.png rename to src/main/resources/assets/edx/models/slantedbelt/frame6.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame7.png b/src/main/resources/assets/edx/models/slantedbelt/frame7.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame7.png rename to src/main/resources/assets/edx/models/slantedbelt/frame7.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame8.png b/src/main/resources/assets/edx/models/slantedbelt/frame8.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame8.png rename to src/main/resources/assets/edx/models/slantedbelt/frame8.png diff --git a/src/main/resources/assets/resonantinduction/models/slantedbelt/frame9.png b/src/main/resources/assets/edx/models/slantedbelt/frame9.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/slantedbelt/frame9.png rename to src/main/resources/assets/edx/models/slantedbelt/frame9.png diff --git a/src/main/resources/assets/resonantinduction/models/sorter.png b/src/main/resources/assets/edx/models/sorter.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/sorter.png rename to src/main/resources/assets/edx/models/sorter.png diff --git a/src/main/resources/assets/resonantinduction/models/sorter.tcn b/src/main/resources/assets/edx/models/sorter.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/sorter.tcn rename to src/main/resources/assets/edx/models/sorter.tcn diff --git a/src/main/resources/assets/resonantinduction/models/teslaBottom.tcn b/src/main/resources/assets/edx/models/teslaBottom.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/teslaBottom.tcn rename to src/main/resources/assets/edx/models/teslaBottom.tcn diff --git a/src/main/resources/assets/resonantinduction/models/teslaMiddle.tcn b/src/main/resources/assets/edx/models/teslaMiddle.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/teslaMiddle.tcn rename to src/main/resources/assets/edx/models/teslaMiddle.tcn diff --git a/src/main/resources/assets/resonantinduction/models/teslaTop.tcn b/src/main/resources/assets/edx/models/teslaTop.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/teslaTop.tcn rename to src/main/resources/assets/edx/models/teslaTop.tcn diff --git a/src/main/resources/assets/resonantinduction/models/tesla_bottom.png b/src/main/resources/assets/edx/models/tesla_bottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/tesla_bottom.png rename to src/main/resources/assets/edx/models/tesla_bottom.png diff --git a/src/main/resources/assets/resonantinduction/models/tesla_middle.png b/src/main/resources/assets/edx/models/tesla_middle.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/tesla_middle.png rename to src/main/resources/assets/edx/models/tesla_middle.png diff --git a/src/main/resources/assets/resonantinduction/models/tesla_top.png b/src/main/resources/assets/edx/models/tesla_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/tesla_top.png rename to src/main/resources/assets/edx/models/tesla_top.png diff --git a/src/main/resources/assets/resonantinduction/models/transformer.obj b/src/main/resources/assets/edx/models/transformer.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/transformer.obj rename to src/main/resources/assets/edx/models/transformer.obj diff --git a/src/main/resources/assets/resonantinduction/models/transformer_winding.png b/src/main/resources/assets/edx/models/transformer_winding.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/transformer_winding.png rename to src/main/resources/assets/edx/models/transformer_winding.png diff --git a/src/main/resources/assets/resonantinduction/models/turbineLarge.png b/src/main/resources/assets/edx/models/turbineLarge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/turbineLarge.png rename to src/main/resources/assets/edx/models/turbineLarge.png diff --git a/src/main/resources/assets/resonantinduction/models/turbineLarge.tcn b/src/main/resources/assets/edx/models/turbineLarge.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/turbineLarge.tcn rename to src/main/resources/assets/edx/models/turbineLarge.tcn diff --git a/src/main/resources/assets/resonantinduction/models/turbineSmall.png b/src/main/resources/assets/edx/models/turbineSmall.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/turbineSmall.png rename to src/main/resources/assets/edx/models/turbineSmall.png diff --git a/src/main/resources/assets/resonantinduction/models/turbineSmall.tcn b/src/main/resources/assets/edx/models/turbineSmall.tcn similarity index 100% rename from src/main/resources/assets/resonantinduction/models/turbineSmall.tcn rename to src/main/resources/assets/edx/models/turbineSmall.tcn diff --git a/src/main/resources/assets/resonantinduction/models/waterTurbines.obj b/src/main/resources/assets/edx/models/waterTurbines.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/waterTurbines.obj rename to src/main/resources/assets/edx/models/waterTurbines.obj diff --git a/src/main/resources/assets/resonantinduction/models/white.png b/src/main/resources/assets/edx/models/white.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/white.png rename to src/main/resources/assets/edx/models/white.png diff --git a/src/main/resources/assets/resonantinduction/models/windTurbines.obj b/src/main/resources/assets/edx/models/windTurbines.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/windTurbines.obj rename to src/main/resources/assets/edx/models/windTurbines.obj diff --git a/src/main/resources/assets/resonantinduction/models/wire.obj b/src/main/resources/assets/edx/models/wire.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/wire.obj rename to src/main/resources/assets/edx/models/wire.obj diff --git a/src/main/resources/assets/resonantinduction/models/wireShine.obj b/src/main/resources/assets/edx/models/wireShine.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/wireShine.obj rename to src/main/resources/assets/edx/models/wireShine.obj diff --git a/src/main/resources/assets/resonantinduction/models/workbench_0.obj b/src/main/resources/assets/edx/models/workbench_0.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/workbench_0.obj rename to src/main/resources/assets/edx/models/workbench_0.obj diff --git a/src/main/resources/assets/resonantinduction/models/workbench_0.png b/src/main/resources/assets/edx/models/workbench_0.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/workbench_0.png rename to src/main/resources/assets/edx/models/workbench_0.png diff --git a/src/main/resources/assets/resonantinduction/models/workbench_1.obj b/src/main/resources/assets/edx/models/workbench_1.obj similarity index 100% rename from src/main/resources/assets/resonantinduction/models/workbench_1.obj rename to src/main/resources/assets/edx/models/workbench_1.obj diff --git a/src/main/resources/assets/resonantinduction/models/workbench_1.png b/src/main/resources/assets/edx/models/workbench_1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/models/workbench_1.png rename to src/main/resources/assets/edx/models/workbench_1.png diff --git a/src/main/resources/assets/resonantinduction/sounds.json b/src/main/resources/assets/edx/sounds.json similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds.json rename to src/main/resources/assets/edx/sounds.json diff --git a/src/main/resources/assets/resonantinduction/sounds/accelerator.ogg b/src/main/resources/assets/edx/sounds/accelerator.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/accelerator.ogg rename to src/main/resources/assets/edx/sounds/accelerator.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/alarm.ogg b/src/main/resources/assets/edx/sounds/alarm.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/alarm.ogg rename to src/main/resources/assets/edx/sounds/alarm.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/antimatter.ogg b/src/main/resources/assets/edx/sounds/antimatter.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/antimatter.ogg rename to src/main/resources/assets/edx/sounds/antimatter.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/assembler.ogg b/src/main/resources/assets/edx/sounds/assembler.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/assembler.ogg rename to src/main/resources/assets/edx/sounds/assembler.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/conveyor.ogg b/src/main/resources/assets/edx/sounds/conveyor.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/conveyor.ogg rename to src/main/resources/assets/edx/sounds/conveyor.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock1.ogg b/src/main/resources/assets/edx/sounds/electricshock1.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock1.ogg rename to src/main/resources/assets/edx/sounds/electricshock1.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock2.ogg b/src/main/resources/assets/edx/sounds/electricshock2.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock2.ogg rename to src/main/resources/assets/edx/sounds/electricshock2.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock3.ogg b/src/main/resources/assets/edx/sounds/electricshock3.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock3.ogg rename to src/main/resources/assets/edx/sounds/electricshock3.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock4.ogg b/src/main/resources/assets/edx/sounds/electricshock4.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock4.ogg rename to src/main/resources/assets/edx/sounds/electricshock4.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock5.ogg b/src/main/resources/assets/edx/sounds/electricshock5.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock5.ogg rename to src/main/resources/assets/edx/sounds/electricshock5.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock6.ogg b/src/main/resources/assets/edx/sounds/electricshock6.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock6.ogg rename to src/main/resources/assets/edx/sounds/electricshock6.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/electricshock7.ogg b/src/main/resources/assets/edx/sounds/electricshock7.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/electricshock7.ogg rename to src/main/resources/assets/edx/sounds/electricshock7.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/gearCrank.ogg b/src/main/resources/assets/edx/sounds/gearCrank.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/gearCrank.ogg rename to src/main/resources/assets/edx/sounds/gearCrank.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/glyph_0.png b/src/main/resources/assets/edx/sounds/glyph_0.png similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/glyph_0.png rename to src/main/resources/assets/edx/sounds/glyph_0.png diff --git a/src/main/resources/assets/resonantinduction/sounds/glyph_1.png b/src/main/resources/assets/edx/sounds/glyph_1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/glyph_1.png rename to src/main/resources/assets/edx/sounds/glyph_1.png diff --git a/src/main/resources/assets/resonantinduction/sounds/glyph_2.png b/src/main/resources/assets/edx/sounds/glyph_2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/glyph_2.png rename to src/main/resources/assets/edx/sounds/glyph_2.png diff --git a/src/main/resources/assets/resonantinduction/sounds/glyph_3.png b/src/main/resources/assets/edx/sounds/glyph_3.png similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/glyph_3.png rename to src/main/resources/assets/edx/sounds/glyph_3.png diff --git a/src/main/resources/assets/resonantinduction/sounds/grinder1.ogg b/src/main/resources/assets/edx/sounds/grinder1.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/grinder1.ogg rename to src/main/resources/assets/edx/sounds/grinder1.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/grinder2.ogg b/src/main/resources/assets/edx/sounds/grinder2.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/grinder2.ogg rename to src/main/resources/assets/edx/sounds/grinder2.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/grinder3.ogg b/src/main/resources/assets/edx/sounds/grinder3.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/grinder3.ogg rename to src/main/resources/assets/edx/sounds/grinder3.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/grinder4.ogg b/src/main/resources/assets/edx/sounds/grinder4.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/grinder4.ogg rename to src/main/resources/assets/edx/sounds/grinder4.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/hammer.ogg b/src/main/resources/assets/edx/sounds/hammer.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/hammer.ogg rename to src/main/resources/assets/edx/sounds/hammer.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/powerup.ogg b/src/main/resources/assets/edx/sounds/powerup.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/powerup.ogg rename to src/main/resources/assets/edx/sounds/powerup.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/reactorcell.ogg b/src/main/resources/assets/edx/sounds/reactorcell.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/reactorcell.ogg rename to src/main/resources/assets/edx/sounds/reactorcell.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/strangematter.ogg b/src/main/resources/assets/edx/sounds/strangematter.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/strangematter.ogg rename to src/main/resources/assets/edx/sounds/strangematter.ogg diff --git a/src/main/resources/assets/resonantinduction/sounds/turbine.ogg b/src/main/resources/assets/edx/sounds/turbine.ogg similarity index 100% rename from src/main/resources/assets/resonantinduction/sounds/turbine.ogg rename to src/main/resources/assets/edx/sounds/turbine.ogg diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/accelerator.png b/src/main/resources/assets/edx/textures/blocks/accelerator.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/accelerator.png rename to src/main/resources/assets/edx/textures/blocks/accelerator.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/armbot.png b/src/main/resources/assets/edx/textures/blocks/armbot.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/armbot.png rename to src/main/resources/assets/edx/textures/blocks/armbot.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/atomic_edge.png b/src/main/resources/assets/edx/textures/blocks/atomic_edge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/atomic_edge.png rename to src/main/resources/assets/edx/textures/blocks/atomic_edge.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/breaker.png b/src/main/resources/assets/edx/textures/blocks/breaker.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/breaker.png rename to src/main/resources/assets/edx/textures/blocks/breaker.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/breaker_back.png b/src/main/resources/assets/edx/textures/blocks/breaker_back.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/breaker_back.png rename to src/main/resources/assets/edx/textures/blocks/breaker_back.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/breaker_front.png b/src/main/resources/assets/edx/textures/blocks/breaker_front.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/breaker_front.png rename to src/main/resources/assets/edx/textures/blocks/breaker_front.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/centrifuge.png b/src/main/resources/assets/edx/textures/blocks/centrifuge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/centrifuge.png rename to src/main/resources/assets/edx/textures/blocks/centrifuge.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/chemicalExtractor.png b/src/main/resources/assets/edx/textures/blocks/chemicalExtractor.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/chemicalExtractor.png rename to src/main/resources/assets/edx/textures/blocks/chemicalExtractor.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/circularSawBase.png b/src/main/resources/assets/edx/textures/blocks/circularSawBase.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/circularSawBase.png rename to src/main/resources/assets/edx/textures/blocks/circularSawBase.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/controlRod.png b/src/main/resources/assets/edx/textures/blocks/controlRod.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/controlRod.png rename to src/main/resources/assets/edx/textures/blocks/controlRod.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/crate_iron.png b/src/main/resources/assets/edx/textures/blocks/crate_iron.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/crate_iron.png rename to src/main/resources/assets/edx/textures/blocks/crate_iron.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/crate_steel.png b/src/main/resources/assets/edx/textures/blocks/crate_steel.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/crate_steel.png rename to src/main/resources/assets/edx/textures/blocks/crate_steel.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/crate_wood.png b/src/main/resources/assets/edx/textures/blocks/crate_wood.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/crate_wood.png rename to src/main/resources/assets/edx/textures/blocks/crate_wood.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/detector_front_green.png b/src/main/resources/assets/edx/textures/blocks/detector_front_green.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/detector_front_green.png rename to src/main/resources/assets/edx/textures/blocks/detector_front_green.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/detector_front_red.png b/src/main/resources/assets/edx/textures/blocks/detector_front_red.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/detector_front_red.png rename to src/main/resources/assets/edx/textures/blocks/detector_front_red.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/detector_side_green.png b/src/main/resources/assets/edx/textures/blocks/detector_side_green.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/detector_side_green.png rename to src/main/resources/assets/edx/textures/blocks/detector_side_green.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/detector_side_red.png b/src/main/resources/assets/edx/textures/blocks/detector_side_red.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/detector_side_red.png rename to src/main/resources/assets/edx/textures/blocks/detector_side_red.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/deuterium.png b/src/main/resources/assets/edx/textures/blocks/deuterium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/deuterium.png rename to src/main/resources/assets/edx/textures/blocks/deuterium.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/disk_tray.png b/src/main/resources/assets/edx/textures/blocks/disk_tray.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/disk_tray.png rename to src/main/resources/assets/edx/textures/blocks/disk_tray.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/electricFurnace.png b/src/main/resources/assets/edx/textures/blocks/electricFurnace.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/electricFurnace.png rename to src/main/resources/assets/edx/textures/blocks/electricFurnace.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/electromagnet.png b/src/main/resources/assets/edx/textures/blocks/electromagnet.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/electromagnet.png rename to src/main/resources/assets/edx/textures/blocks/electromagnet.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/electromagnetGlass.png b/src/main/resources/assets/edx/textures/blocks/electromagnetGlass.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/electromagnetGlass.png rename to src/main/resources/assets/edx/textures/blocks/electromagnetGlass.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/electromagnet_top.png b/src/main/resources/assets/edx/textures/blocks/electromagnet_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/electromagnet_top.png rename to src/main/resources/assets/edx/textures/blocks/electromagnet_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/encoder_bottom.png b/src/main/resources/assets/edx/textures/blocks/encoder_bottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/encoder_bottom.png rename to src/main/resources/assets/edx/textures/blocks/encoder_bottom.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/encoder_side.png b/src/main/resources/assets/edx/textures/blocks/encoder_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/encoder_side.png rename to src/main/resources/assets/edx/textures/blocks/encoder_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/encoder_top.png b/src/main/resources/assets/edx/textures/blocks/encoder_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/encoder_top.png rename to src/main/resources/assets/edx/textures/blocks/encoder_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_front.png b/src/main/resources/assets/edx/textures/blocks/engineeringTable_front.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_front.png rename to src/main/resources/assets/edx/textures/blocks/engineeringTable_front.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_side.png b/src/main/resources/assets/edx/textures/blocks/engineeringTable_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_side.png rename to src/main/resources/assets/edx/textures/blocks/engineeringTable_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_top.png b/src/main/resources/assets/edx/textures/blocks/engineeringTable_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/engineeringTable_top.png rename to src/main/resources/assets/edx/textures/blocks/engineeringTable_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/filter.png b/src/main/resources/assets/edx/textures/blocks/filter.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/filter.png rename to src/main/resources/assets/edx/textures/blocks/filter.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_side_off.png b/src/main/resources/assets/edx/textures/blocks/firebox_electric_side_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_side_off.png rename to src/main/resources/assets/edx/textures/blocks/firebox_electric_side_off.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_side_on.png b/src/main/resources/assets/edx/textures/blocks/firebox_electric_side_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_side_on.png rename to src/main/resources/assets/edx/textures/blocks/firebox_electric_side_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_top_off.png b/src/main/resources/assets/edx/textures/blocks/firebox_electric_top_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_top_off.png rename to src/main/resources/assets/edx/textures/blocks/firebox_electric_top_off.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_top_on.png b/src/main/resources/assets/edx/textures/blocks/firebox_electric_top_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_electric_top_on.png rename to src/main/resources/assets/edx/textures/blocks/firebox_electric_top_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_off.png b/src/main/resources/assets/edx/textures/blocks/firebox_front_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_off.png rename to src/main/resources/assets/edx/textures/blocks/firebox_front_off.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_on.png b/src/main/resources/assets/edx/textures/blocks/firebox_front_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_on.png rename to src/main/resources/assets/edx/textures/blocks/firebox_front_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png b/src/main/resources/assets/edx/textures/blocks/firebox_side_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png rename to src/main/resources/assets/edx/textures/blocks/firebox_side_off.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png b/src/main/resources/assets/edx/textures/blocks/firebox_side_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png rename to src/main/resources/assets/edx/textures/blocks/firebox_side_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png b/src/main/resources/assets/edx/textures/blocks/firebox_top_off.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png rename to src/main/resources/assets/edx/textures/blocks/firebox_top_off.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png b/src/main/resources/assets/edx/textures/blocks/firebox_top_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png rename to src/main/resources/assets/edx/textures/blocks/firebox_top_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/fulmination.png b/src/main/resources/assets/edx/textures/blocks/fulmination.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/fulmination.png rename to src/main/resources/assets/edx/textures/blocks/fulmination.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/funnel.png b/src/main/resources/assets/edx/textures/blocks/funnel.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/funnel.png rename to src/main/resources/assets/edx/textures/blocks/funnel.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/funnel_edge.png b/src/main/resources/assets/edx/textures/blocks/funnel_edge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/funnel_edge.png rename to src/main/resources/assets/edx/textures/blocks/funnel_edge.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/funnel_top.png b/src/main/resources/assets/edx/textures/blocks/funnel_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/funnel_top.png rename to src/main/resources/assets/edx/textures/blocks/funnel_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/glyph_0.png b/src/main/resources/assets/edx/textures/blocks/glyph_0.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/glyph_0.png rename to src/main/resources/assets/edx/textures/blocks/glyph_0.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/glyph_1.png b/src/main/resources/assets/edx/textures/blocks/glyph_1.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/glyph_1.png rename to src/main/resources/assets/edx/textures/blocks/glyph_1.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/glyph_2.png b/src/main/resources/assets/edx/textures/blocks/glyph_2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/glyph_2.png rename to src/main/resources/assets/edx/textures/blocks/glyph_2.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/glyph_3.png b/src/main/resources/assets/edx/textures/blocks/glyph_3.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/glyph_3.png rename to src/main/resources/assets/edx/textures/blocks/glyph_3.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/grate.png b/src/main/resources/assets/edx/textures/blocks/grate.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/grate.png rename to src/main/resources/assets/edx/textures/blocks/grate.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/grate_front.png b/src/main/resources/assets/edx/textures/blocks/grate_front.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/grate_front.png rename to src/main/resources/assets/edx/textures/blocks/grate_front.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/hotPlate.png b/src/main/resources/assets/edx/textures/blocks/hotPlate.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/hotPlate.png rename to src/main/resources/assets/edx/textures/blocks/hotPlate.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/hotPlate_on.png b/src/main/resources/assets/edx/textures/blocks/hotPlate_on.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/hotPlate_on.png rename to src/main/resources/assets/edx/textures/blocks/hotPlate_on.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/imprinter_bottom.png b/src/main/resources/assets/edx/textures/blocks/imprinter_bottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/imprinter_bottom.png rename to src/main/resources/assets/edx/textures/blocks/imprinter_bottom.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/imprinter_side.png b/src/main/resources/assets/edx/textures/blocks/imprinter_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/imprinter_side.png rename to src/main/resources/assets/edx/textures/blocks/imprinter_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/imprinter_top.png b/src/main/resources/assets/edx/textures/blocks/imprinter_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/imprinter_top.png rename to src/main/resources/assets/edx/textures/blocks/imprinter_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/machine.png b/src/main/resources/assets/edx/textures/blocks/machine.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/machine.png rename to src/main/resources/assets/edx/textures/blocks/machine.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_metal_side.png b/src/main/resources/assets/edx/textures/blocks/material_metal_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_metal_side.png rename to src/main/resources/assets/edx/textures/blocks/material_metal_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_metal_top.png b/src/main/resources/assets/edx/textures/blocks/material_metal_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_metal_top.png rename to src/main/resources/assets/edx/textures/blocks/material_metal_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_sand.png b/src/main/resources/assets/edx/textures/blocks/material_sand.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_sand.png rename to src/main/resources/assets/edx/textures/blocks/material_sand.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png b/src/main/resources/assets/edx/textures/blocks/material_steel.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png rename to src/main/resources/assets/edx/textures/blocks/material_steel.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png b/src/main/resources/assets/edx/textures/blocks/material_steel_dark.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png rename to src/main/resources/assets/edx/textures/blocks/material_steel_dark.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_tint.png b/src/main/resources/assets/edx/textures/blocks/material_steel_tint.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_steel_tint.png rename to src/main/resources/assets/edx/textures/blocks/material_steel_tint.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone.png b/src/main/resources/assets/edx/textures/blocks/material_stone.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone.png rename to src/main/resources/assets/edx/textures/blocks/material_stone.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_brick.png b/src/main/resources/assets/edx/textures/blocks/material_stone_brick.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_brick.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_brick.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_brick2.png b/src/main/resources/assets/edx/textures/blocks/material_stone_brick2.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_brick2.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_brick2.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_chiseled.png b/src/main/resources/assets/edx/textures/blocks/material_stone_chiseled.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_chiseled.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_chiseled.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_cobble.png b/src/main/resources/assets/edx/textures/blocks/material_stone_cobble.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_cobble.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_cobble.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_cracked.png b/src/main/resources/assets/edx/textures/blocks/material_stone_cracked.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_cracked.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_cracked.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_mossy.png b/src/main/resources/assets/edx/textures/blocks/material_stone_mossy.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_mossy.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_mossy.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_stone_slab.png b/src/main/resources/assets/edx/textures/blocks/material_stone_slab.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_stone_slab.png rename to src/main/resources/assets/edx/textures/blocks/material_stone_slab.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_wood_surface.png b/src/main/resources/assets/edx/textures/blocks/material_wood_surface.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_wood_surface.png rename to src/main/resources/assets/edx/textures/blocks/material_wood_surface.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_wood_top.png b/src/main/resources/assets/edx/textures/blocks/material_wood_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/material_wood_top.png rename to src/main/resources/assets/edx/textures/blocks/material_wood_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/millstone_side.png b/src/main/resources/assets/edx/textures/blocks/millstone_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/millstone_side.png rename to src/main/resources/assets/edx/textures/blocks/millstone_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/millstone_top.png b/src/main/resources/assets/edx/textures/blocks/millstone_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/millstone_top.png rename to src/main/resources/assets/edx/textures/blocks/millstone_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/mixture_flow.png b/src/main/resources/assets/edx/textures/blocks/mixture_flow.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/mixture_flow.png rename to src/main/resources/assets/edx/textures/blocks/mixture_flow.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/mixture_flow.png.mcmeta b/src/main/resources/assets/edx/textures/blocks/mixture_flow.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/mixture_flow.png.mcmeta rename to src/main/resources/assets/edx/textures/blocks/mixture_flow.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/models/flatWire.png b/src/main/resources/assets/edx/textures/blocks/models/flatWire.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/models/flatWire.png rename to src/main/resources/assets/edx/textures/blocks/models/flatWire.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/models/insulation.png b/src/main/resources/assets/edx/textures/blocks/models/insulation.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/models/insulation.png rename to src/main/resources/assets/edx/textures/blocks/models/insulation.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/models/wire.png b/src/main/resources/assets/edx/textures/blocks/models/wire.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/models/wire.png rename to src/main/resources/assets/edx/textures/blocks/models/wire.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/molten_flow.png b/src/main/resources/assets/edx/textures/blocks/molten_flow.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/molten_flow.png rename to src/main/resources/assets/edx/textures/blocks/molten_flow.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/molten_flow.png.mcmeta b/src/main/resources/assets/edx/textures/blocks/molten_flow.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/molten_flow.png.mcmeta rename to src/main/resources/assets/edx/textures/blocks/molten_flow.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/multimeter_screen.png b/src/main/resources/assets/edx/textures/blocks/multimeter_screen.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/multimeter_screen.png rename to src/main/resources/assets/edx/textures/blocks/multimeter_screen.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/nuclearBoiler.png b/src/main/resources/assets/edx/textures/blocks/nuclearBoiler.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/nuclearBoiler.png rename to src/main/resources/assets/edx/textures/blocks/nuclearBoiler.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/oreUranium.png b/src/main/resources/assets/edx/textures/blocks/oreUranium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/oreUranium.png rename to src/main/resources/assets/edx/textures/blocks/oreUranium.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/placer.png b/src/main/resources/assets/edx/textures/blocks/placer.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/placer.png rename to src/main/resources/assets/edx/textures/blocks/placer.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/placer_back.png b/src/main/resources/assets/edx/textures/blocks/placer_back.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/placer_back.png rename to src/main/resources/assets/edx/textures/blocks/placer_back.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/placer_front.png b/src/main/resources/assets/edx/textures/blocks/placer_front.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/placer_front.png rename to src/main/resources/assets/edx/textures/blocks/placer_front.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/plasma.png b/src/main/resources/assets/edx/textures/blocks/plasma.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/plasma.png rename to src/main/resources/assets/edx/textures/blocks/plasma.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/plasmaHeater.png b/src/main/resources/assets/edx/textures/blocks/plasmaHeater.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/plasmaHeater.png rename to src/main/resources/assets/edx/textures/blocks/plasmaHeater.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/radioactive.png b/src/main/resources/assets/edx/textures/blocks/radioactive.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/radioactive.png rename to src/main/resources/assets/edx/textures/blocks/radioactive.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/radioactive_bottom.png b/src/main/resources/assets/edx/textures/blocks/radioactive_bottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/radioactive_bottom.png rename to src/main/resources/assets/edx/textures/blocks/radioactive_bottom.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/radioactive_top.png b/src/main/resources/assets/edx/textures/blocks/radioactive_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/radioactive_top.png rename to src/main/resources/assets/edx/textures/blocks/radioactive_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/reactorDrain.png b/src/main/resources/assets/edx/textures/blocks/reactorDrain.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/reactorDrain.png rename to src/main/resources/assets/edx/textures/blocks/reactorDrain.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/reactorDrain_front.png b/src/main/resources/assets/edx/textures/blocks/reactorDrain_front.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/reactorDrain_front.png rename to src/main/resources/assets/edx/textures/blocks/reactorDrain_front.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/siren.png b/src/main/resources/assets/edx/textures/blocks/siren.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/siren.png rename to src/main/resources/assets/edx/textures/blocks/siren.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_bottom.png b/src/main/resources/assets/edx/textures/blocks/solarPanel_bottom.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_bottom.png rename to src/main/resources/assets/edx/textures/blocks/solarPanel_bottom.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_side.png b/src/main/resources/assets/edx/textures/blocks/solarPanel_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_side.png rename to src/main/resources/assets/edx/textures/blocks/solarPanel_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_top.png b/src/main/resources/assets/edx/textures/blocks/solarPanel_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/solarPanel_top.png rename to src/main/resources/assets/edx/textures/blocks/solarPanel_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/steam.png b/src/main/resources/assets/edx/textures/blocks/steam.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/steam.png rename to src/main/resources/assets/edx/textures/blocks/steam.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/tank.png b/src/main/resources/assets/edx/textures/blocks/tank.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/tank.png rename to src/main/resources/assets/edx/textures/blocks/tank.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/tankEdge.png b/src/main/resources/assets/edx/textures/blocks/tankEdge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/tankEdge.png rename to src/main/resources/assets/edx/textures/blocks/tankEdge.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/thermometer.png b/src/main/resources/assets/edx/textures/blocks/thermometer.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/thermometer.png rename to src/main/resources/assets/edx/textures/blocks/thermometer.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/thermopile.png b/src/main/resources/assets/edx/textures/blocks/thermopile.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/thermopile.png rename to src/main/resources/assets/edx/textures/blocks/thermopile.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/thermopile_top.png b/src/main/resources/assets/edx/textures/blocks/thermopile_top.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/thermopile_top.png rename to src/main/resources/assets/edx/textures/blocks/thermopile_top.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/toxicWaste.png b/src/main/resources/assets/edx/textures/blocks/toxicWaste.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/toxicWaste.png rename to src/main/resources/assets/edx/textures/blocks/toxicWaste.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/toxicWaste.png.mcmeta b/src/main/resources/assets/edx/textures/blocks/toxicWaste.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/toxicWaste.png.mcmeta rename to src/main/resources/assets/edx/textures/blocks/toxicWaste.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/tritium.png b/src/main/resources/assets/edx/textures/blocks/tritium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/tritium.png rename to src/main/resources/assets/edx/textures/blocks/tritium.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/turntable.png b/src/main/resources/assets/edx/textures/blocks/turntable.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/turntable.png rename to src/main/resources/assets/edx/textures/blocks/turntable.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/turntable_side.png b/src/main/resources/assets/edx/textures/blocks/turntable_side.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/turntable_side.png rename to src/main/resources/assets/edx/textures/blocks/turntable_side.png diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/uraniumHexafluoride.png b/src/main/resources/assets/edx/textures/blocks/uraniumHexafluoride.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/blocks/uraniumHexafluoride.png rename to src/main/resources/assets/edx/textures/blocks/uraniumHexafluoride.png diff --git a/src/main/resources/assets/resonantinduction/textures/fx/laserEnd.png b/src/main/resources/assets/edx/textures/fx/laserEnd.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/fx/laserEnd.png rename to src/main/resources/assets/edx/textures/fx/laserEnd.png diff --git a/src/main/resources/assets/resonantinduction/textures/fx/laserMiddle.png b/src/main/resources/assets/edx/textures/fx/laserMiddle.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/fx/laserMiddle.png rename to src/main/resources/assets/edx/textures/fx/laserMiddle.png diff --git a/src/main/resources/assets/resonantinduction/textures/fx/laserStart.png b/src/main/resources/assets/edx/textures/fx/laserStart.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/fx/laserStart.png rename to src/main/resources/assets/edx/textures/fx/laserStart.png diff --git a/src/main/resources/assets/resonantinduction/textures/fx/noise.png b/src/main/resources/assets/edx/textures/fx/noise.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/fx/noise.png rename to src/main/resources/assets/edx/textures/fx/noise.png diff --git a/src/main/resources/assets/resonantinduction/textures/fx/scorch.png b/src/main/resources/assets/edx/textures/fx/scorch.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/fx/scorch.png rename to src/main/resources/assets/edx/textures/fx/scorch.png diff --git a/src/main/resources/assets/resonantinduction/textures/gui/gui_accelerator.png b/src/main/resources/assets/edx/textures/gui/gui_accelerator.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/gui/gui_accelerator.png rename to src/main/resources/assets/edx/textures/gui/gui_accelerator.png diff --git a/src/main/resources/assets/resonantinduction/textures/gui/gui_atomic_assembler.png b/src/main/resources/assets/edx/textures/gui/gui_atomic_assembler.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/gui/gui_atomic_assembler.png rename to src/main/resources/assets/edx/textures/gui/gui_atomic_assembler.png diff --git a/src/main/resources/assets/resonantinduction/textures/gui/gui_machine.png b/src/main/resources/assets/edx/textures/gui/gui_machine.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/gui/gui_machine.png rename to src/main/resources/assets/edx/textures/gui/gui_machine.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/antimatter_gram.png b/src/main/resources/assets/edx/textures/items/antimatter_gram.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/antimatter_gram.png rename to src/main/resources/assets/edx/textures/items/antimatter_gram.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/antimatter_gram.png.mcmeta b/src/main/resources/assets/edx/textures/items/antimatter_gram.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/antimatter_gram.png.mcmeta rename to src/main/resources/assets/edx/textures/items/antimatter_gram.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/items/antimatter_milligram.png b/src/main/resources/assets/edx/textures/items/antimatter_milligram.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/antimatter_milligram.png rename to src/main/resources/assets/edx/textures/items/antimatter_milligram.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/antimatter_milligram.png.mcmeta b/src/main/resources/assets/edx/textures/items/antimatter_milligram.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/antimatter_milligram.png.mcmeta rename to src/main/resources/assets/edx/textures/items/antimatter_milligram.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/items/biomass.png b/src/main/resources/assets/edx/textures/items/biomass.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/biomass.png rename to src/main/resources/assets/edx/textures/items/biomass.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/breederFuel.png b/src/main/resources/assets/edx/textures/items/breederFuel.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/breederFuel.png rename to src/main/resources/assets/edx/textures/items/breederFuel.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/bucketMixture.png b/src/main/resources/assets/edx/textures/items/bucketMixture.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/bucketMixture.png rename to src/main/resources/assets/edx/textures/items/bucketMixture.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/bucketMolten.png b/src/main/resources/assets/edx/textures/items/bucketMolten.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/bucketMolten.png rename to src/main/resources/assets/edx/textures/items/bucketMolten.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/bucketToxicWaste.png b/src/main/resources/assets/edx/textures/items/bucketToxicWaste.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/bucketToxicWaste.png rename to src/main/resources/assets/edx/textures/items/bucketToxicWaste.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/cellCorrosive.png b/src/main/resources/assets/edx/textures/items/cellCorrosive.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/cellCorrosive.png rename to src/main/resources/assets/edx/textures/items/cellCorrosive.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/cellDeuterium.png b/src/main/resources/assets/edx/textures/items/cellDeuterium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/cellDeuterium.png rename to src/main/resources/assets/edx/textures/items/cellDeuterium.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/cellEmpty.png b/src/main/resources/assets/edx/textures/items/cellEmpty.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/cellEmpty.png rename to src/main/resources/assets/edx/textures/items/cellEmpty.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/cellTritium.png b/src/main/resources/assets/edx/textures/items/cellTritium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/cellTritium.png rename to src/main/resources/assets/edx/textures/items/cellTritium.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/cellWater.png b/src/main/resources/assets/edx/textures/items/cellWater.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/cellWater.png rename to src/main/resources/assets/edx/textures/items/cellWater.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/darkMatter.png b/src/main/resources/assets/edx/textures/items/darkMatter.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/darkMatter.png rename to src/main/resources/assets/edx/textures/items/darkMatter.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/darkMatter.png.mcmeta b/src/main/resources/assets/edx/textures/items/darkMatter.png.mcmeta similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/darkMatter.png.mcmeta rename to src/main/resources/assets/edx/textures/items/darkMatter.png.mcmeta diff --git a/src/main/resources/assets/resonantinduction/textures/items/devStaff.png b/src/main/resources/assets/edx/textures/items/devStaff.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/devStaff.png rename to src/main/resources/assets/edx/textures/items/devStaff.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/disk.png b/src/main/resources/assets/edx/textures/items/disk.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/disk.png rename to src/main/resources/assets/edx/textures/items/disk.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/dough.png b/src/main/resources/assets/edx/textures/items/dough.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/dough.png rename to src/main/resources/assets/edx/textures/items/dough.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/electronicChip.png b/src/main/resources/assets/edx/textures/items/electronicChip.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/electronicChip.png rename to src/main/resources/assets/edx/textures/items/electronicChip.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/flour.png b/src/main/resources/assets/edx/textures/items/flour.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/flour.png rename to src/main/resources/assets/edx/textures/items/flour.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/focusingMatrix.png b/src/main/resources/assets/edx/textures/items/focusingMatrix.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/focusingMatrix.png rename to src/main/resources/assets/edx/textures/items/focusingMatrix.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/hammer.png b/src/main/resources/assets/edx/textures/items/hammer.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/hammer.png rename to src/main/resources/assets/edx/textures/items/hammer.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/handCrank.png b/src/main/resources/assets/edx/textures/items/handCrank.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/handCrank.png rename to src/main/resources/assets/edx/textures/items/handCrank.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/hazmatBody.png b/src/main/resources/assets/edx/textures/items/hazmatBody.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/hazmatBody.png rename to src/main/resources/assets/edx/textures/items/hazmatBody.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/hazmatBoots.png b/src/main/resources/assets/edx/textures/items/hazmatBoots.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/hazmatBoots.png rename to src/main/resources/assets/edx/textures/items/hazmatBoots.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/hazmatLeggings.png b/src/main/resources/assets/edx/textures/items/hazmatLeggings.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/hazmatLeggings.png rename to src/main/resources/assets/edx/textures/items/hazmatLeggings.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/hazmatMask.png b/src/main/resources/assets/edx/textures/items/hazmatMask.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/hazmatMask.png rename to src/main/resources/assets/edx/textures/items/hazmatMask.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/imprint.png b/src/main/resources/assets/edx/textures/items/imprint.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/imprint.png rename to src/main/resources/assets/edx/textures/items/imprint.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/insulation.png b/src/main/resources/assets/edx/textures/items/insulation.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/insulation.png rename to src/main/resources/assets/edx/textures/items/insulation.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/oreDust.png b/src/main/resources/assets/edx/textures/items/oreDust.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/oreDust.png rename to src/main/resources/assets/edx/textures/items/oreDust.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/oreRefinedDust.png b/src/main/resources/assets/edx/textures/items/oreRefinedDust.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/oreRefinedDust.png rename to src/main/resources/assets/edx/textures/items/oreRefinedDust.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/oreRubble.png b/src/main/resources/assets/edx/textures/items/oreRubble.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/oreRubble.png rename to src/main/resources/assets/edx/textures/items/oreRubble.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/pipeGauge.png b/src/main/resources/assets/edx/textures/items/pipeGauge.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/pipeGauge.png rename to src/main/resources/assets/edx/textures/items/pipeGauge.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/rodFissileFuel.png b/src/main/resources/assets/edx/textures/items/rodFissileFuel.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/rodFissileFuel.png rename to src/main/resources/assets/edx/textures/items/rodFissileFuel.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/thermometer.png b/src/main/resources/assets/edx/textures/items/thermometer.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/thermometer.png rename to src/main/resources/assets/edx/textures/items/thermometer.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/uranium.png b/src/main/resources/assets/edx/textures/items/uranium.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/uranium.png rename to src/main/resources/assets/edx/textures/items/uranium.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/wire.png b/src/main/resources/assets/edx/textures/items/wire.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/wire.png rename to src/main/resources/assets/edx/textures/items/wire.png diff --git a/src/main/resources/assets/resonantinduction/textures/items/yellowcake.png b/src/main/resources/assets/edx/textures/items/yellowcake.png similarity index 100% rename from src/main/resources/assets/resonantinduction/textures/items/yellowcake.png rename to src/main/resources/assets/edx/textures/items/yellowcake.png diff --git a/src/main/resources/assets/resonantinduction/lang/en_US.lang b/src/main/resources/assets/resonantinduction/lang/en_US.lang deleted file mode 100644 index fec69a3d4..000000000 --- a/src/main/resources/assets/resonantinduction/lang/en_US.lang +++ /dev/null @@ -1,385 +0,0 @@ -# English @author Calclavia, Alex_hawks -# If a localization includes %v it is some data that is calculated. Such as attributes on a cable. -# The %v may be followed by a number if there are multiple pieces of calculated data, but it will be explained in a comment. -# A % followed by a number is used for colors. The exact usage will be outlined in the comment above the localization. - -itemGroup.resonantinduction=Resonant Induction -itemGroup.resonantinduction.core=Resonant Induction Core -meta.resonantinduction.description=Resonant Induction is a Minecraft mod focusing on the manipulation of electricity and wireless technology. Ever wanted blazing electrical shocks flying off your evil lairs? You've came to the right place! -meta.resonantinduction.credits=Visit website for credits. - -fluid.mixture=Mixture -toolmode.link.name=Linking - -### Schematics -schematic.windTurbine.name=Wind Turbine -schematic.waterTurbine.name=Water Turbine - -### Core -item.resonantinduction:ingot.name=%v Ingot -item.resonantinduction:oreDust.name=%v Dust -item.resonantinduction:alloyDust.name=Alloy Dust -item.resonantinduction:oreDust.tooltip=Shift-right click on a cauldron to refine. -item.resonantinduction:oreRefinedDust.name=%v Refined Dust -item.resonantinduction:oreRubble.name=%v Rubble -item.resonantinduction:bucketMixture.name=%v Bucket -item.resonantinduction:bucketMolten.name=%v Bucket -item.resonantinduction:bucketMolten.name=%v Bucket - -#Misc -misc.ingot=Ingot -misc.ingot=Ingot -misc.rubble=Rubble -misc.dust=Dust -misc.refinedDust=Refined Dust -misc.bucketMolten=Molten Bucket - -# Blocks -tile.resonantinduction:oreCopper.name=Copper Ore -tile.resonantinduction:oreTin.name=Tin Ore -tile.resonantinduction:glassJar.name=Glass Jar - -# Items -item.resonantinduction:circuitBasic.name=Basic Circuit -item.resonantinduction:circuitAdvanced.name=Advanced Circuit -item.resonantinduction:circuitElite.name=Elite Circuit -item.resonantinduction:screwdriver.name=Screwdriver -item.resonantinduction:screwdriver.tooltip=Used to configure blocks. Shift-right click to change mode. -item.resonantinduction:motor.name=Motor - -item.resonantinduction:plateCopper.name=Copper Plate -item.resonantinduction:plateTin.name=Tin Plate -item.resonantinduction:plateBronze.name=Bronze Plate -item.resonantinduction:plateSteel.name=Steel Plate -item.resonantinduction:plateIron.name=Iron Plate -item.resonantinduction:plateGold.name=Gold Plate - -item.resonantinduction:ingotCopper.name=Copper Ingot -item.resonantinduction:ingotTin.name=Tin Ingot -item.resonantinduction:ingotBronze.name=Bronze Ingot -item.resonantinduction:ingotSteel.name=Steel Ingot - -item.resonantinduction:dustBronze.name=Bronze Dust -item.resonantinduction:dustSteel.name=Steel Dust - -### Archaic Module -tile.resonantinduction:gutter.name=Gutter -tile.resonantinduction:gutter.tooltip=A primitive way of transferring fluid. - -## Industrial Stone Blocks -tile.resonantinduction:industrialStone.0.name=Industrial Brick -tile.resonantinduction:industrialStone.1.name=Industrial Double Slab Brick -tile.resonantinduction:industrialStone.2.name=Industrial Chiseled Brick -tile.resonantinduction:industrialStone.3.name=Industrial Cobblestone -tile.resonantinduction:industrialStone.4.name=Industrial Cracked Stone -tile.resonantinduction:industrialStone.5.name=Industrial Stone -tile.resonantinduction:industrialStone.6.name=Industrial Stone Slab -tile.resonantinduction:industrialStone.7.name=Industrial Mossy Stone -tile.resonantinduction:industrialStone.8.name=Dark Iron -tile.resonantinduction:industrialStone.9.name=Tinted Steel -tile.resonantinduction:industrialStone.10.name=Steel - -## Items -item.resonantinduction:imprint.name=Imprint -item.resonantinduction:hammer.name=Hammer -item.resonantinduction:handCrank.name=Hand Crank -item.resonantinduction:biomass.name=Biomass -item.resonantinduction:focusingMatrix.name=Focusing Matrix - -## Machines -tile.resonantinduction:castingMold.name=Casting Mold -tile.resonantinduction:castingMold.tooltip=Pour molten metal into the cast to form an ingot. -tile.resonantinduction:millstone.name=Millstone -tile.resonantinduction:millstone.tooltip=Put some rubble in the millstone and use a hand crank to grind rubble into dust. -tile.resonantinduction:imprinter.name=Imprinter - -tile.resonantinduction:firebox.name=Firebox -tile.resonantinduction:firebox.0.name=Firebox -tile.resonantinduction:firebox.1.name=Electric Firebox - -tile.resonantinduction:hotPlate.name=Hot Plate - -tile.resonantinduction:workbench.name=Workbench -tile.resonantinduction:workbench.tooltip=The workbench is used for hammering and sawing resources. -tile.resonantinduction:engineeringTable.name=Engineering Table -engineerTable.config.inventory.true=Engineering table is now connected to nearby inventories. -engineerTable.config.inventory.false=Engineering table is now disconnected from nearby inventories. - -## Transport -tile.resonantinduction:turntable.name=Turntable -tile.resonantinduction:crate.0.name=Wooden Crate -tile.resonantinduction:crate.1.name=Iron Crate -tile.resonantinduction:crate.2.name=Steel Crate - -info.waila.crate.stack=Item: -info.waila.crate.stored=Stored: -info.waila.crate.empty=Empty - -crate.orefilter.true= Same OreName stacking enabled -crate.orefilter.false= Same OreName stacking disabled -crate.tooltip.amount= Amount: - -tile.resonantinduction:crate.0.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter -tile.resonantinduction:crate.1.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter -tile.resonantinduction:crate.2.tooltip=Right click to add items Left click to remove items Ctrl Click sets itemstack filter - -tile.resonantinduction:tank.name=Tank -tile.resonantinduction:tank.0.name=Tank -tile.resonantinduction:tank.tooltip=Shift right click to pick up with fluid contained within. -info.waila.tank.fluid=Fluid: -info.waila.tank.vol=Volume: -info.waila.tank.empty=Empty - -### Mechanical Module -## Energy -item.resonantinduction:gear.0.name=Wooden Gear -item.resonantinduction:gear.1.name=Stone Gear -item.resonantinduction:gear.2.name=Metal Gear - -item.resonantinduction:gearShaft.0.name=Wooden Gear Shaft -item.resonantinduction:gearShaft.1.name=Stone Gear Shaft -item.resonantinduction:gearShaft.2.name=Metal Gear Shaft - -tile.resonantinduction:windTurbine.name=Wind Turbine -tile.resonantinduction:windTurbine.0.name=Wooden Wind Turbine -tile.resonantinduction:windTurbine.0.tooltip=The wooden wind turbine is light, fragile and spins fast. -tile.resonantinduction:windTurbine.1.name=Stone Wind Turbine -tile.resonantinduction:windTurbine.1.tooltip=The stone turbine is heavy, strong and durable. -tile.resonantinduction:windTurbine.2.name=Metal Wind Turbine -tile.resonantinduction:windTurbine.2.tooltip=The metal wind turbine is strong and agile. - -tile.resonantinduction:waterTurbine.name=Water Turbine -tile.resonantinduction:waterTurbine.0.name=Wooden Water Turbine -tile.resonantinduction:waterTurbine.0.tooltip=The wooden water turbine is light and moves fast. -tile.resonantinduction:waterTurbine.1.name=Stone Water Turbine -tile.resonantinduction:waterTurbine.1.tooltip=The stone water turbine is heavy, strong and durable. -tile.resonantinduction:waterTurbine.2.name=Metal Water Turbine -tile.resonantinduction:waterTurbine.2.tooltip=The metal water turbine is strong and agile. - -## Transport -item.resonantinduction:pipe.ceramic.name=Ceramic Pipe -item.resonantinduction:pipe.bronze.name=Bronze Pipe -item.resonantinduction:pipe.plastic.name=Plastic Pipe -item.resonantinduction:pipe.iron.name=Iron Pipe -item.resonantinduction:pipe.steel.name=Steel Pipe -item.resonantinduction:pipe.fiberglass.name=Fiberglass Pipe -tile.resonantinduction:pump.name=Pump -tile.resonantinduction:grate.name=Grate -tile.resonantinduction:conveyorBelt.name=Conveyor Belt - -tile.resonantinduction:detector.name=Detector -tile.resonantinduction:detector.tooltip=Outputs a Redstone signal upon item detection. Configure to invert imprint filter. -tile.resonantinduction:manipulator.name=Manipulator -tile.resonantinduction:rejector.name=Rejector -tile.resonantinduction:sorter.name=Sorter -tile.resonantinduction:breaker.name=Breaker -tile.resonantinduction:placer.name=Placer - -## Machines and Processing -tile.resonantinduction:mixer.name=Mixer -tile.resonantinduction:mixer.tooltip=The mixer mixes dusts with water to wash and refine the ore dust. Mixer prefers more angular velocity (spin) to process dusts. -tile.resonantinduction:mechanicalPiston.name=Mechanical Piston -tile.resonantinduction:grindingWheel.name=Grinding Wheel -tile.resonantinduction:grindingWheel.tooltip=The grinding wheel grinds ores into rubble and dust. Larger torque allows faster grinding. -tile.resonantinduction:filter.name=Filter -resonantinduction.machine.grinder=Grinder -resonantinduction.machine.crusher=Crusher -resonantinduction.machine.mixer=Mixer -resonantinduction.machine.sawmill=Saw-mill -resonantinduction.machine.smelter=Smelter - -### Electrical -## Blocks -tile.resonantinduction:tesla.name=Tesla Coil -tile.resonantinduction:tesla.tooltip=Transfer electricity wirelessly. Link with a configurator for cross dimension teleportation. -item.resonantinduction:levitator.name=Electromagnetic Levitator -tile.resonantinduction:battery.name=Battery -tile.resonantinduction:armbot.name=Armbot -tile.resonantinduction:encoder.name=Encoder -item.resonantinduction:charger.name=Charging Plate -item.resonantinduction:insulation.name=Insulation -tile.resonantinduction:laserEmitter.name=Laser Emitter -tile.resonantinduction:laserReceiver.name=Laser Receiver -tile.resonantinduction:focusCrystal.name=Focus Crystal -tile.resonantinduction:mirror.name=Mirror - -tool.mode.set=Mode set to: -laser.toolmode.remove=Remove -laser.toolmode.smelt=Smelt -laser.toolmode.damage=Damage - -## Generators -tile.resonantinduction:solarPanel.name=Solar Panel -tile.resonantinduction:motor.name=Electric Motor -tile.resonantinduction:thermopile.name=Thermopile -tile.resonantinduction:thermopile.tooltip=Generates a voltage proportional to local temperature difference. - -#Transport -item.resonantinduction:disk.name=Program Disk - -## Energy -item.resonantinduction:wire.copper.name=Copper Wire -item.resonantinduction:wire.tin.name=Tin Wire -item.resonantinduction:wire.iron.name=Iron Wire -item.resonantinduction:wire.aluminum.name=Aluminum Wire -item.resonantinduction:wire.silver.name=Silver Wire -item.resonantinduction:wire.superconductor.name=Superconductor Wire -item.resonantinduction:electricTransformer.name=Transformer -item.resonantinduction:multimeter.name=Multimeter -item.resonantinduction:multimeter.tooltip=Multimeter is a panel that display the energy and fluid information of a block. - -### Quantum Tier -tile.resonantinduction:quantumGate.name=Quantum Gate -item.resonantinduction:quantumGlyph.0.name=Nought Glyph -item.resonantinduction:quantumGlyph.1.name=Monogon Glyph -item.resonantinduction:quantumGlyph.2.name=Digon Glyph -item.resonantinduction:quantumGlyph.3.name=Trigon Glyph -item.resonantinduction:quantumGlyph.4.name=Tetragon Glyph - -## Tool-tips -tooltip.pipe.rate=Flow Rate: #v -tooltip.pipe.pressure=Max Pressure: #v - -tooltip.wire.resistance=Resistance: #v -tooltip.wire.current=Current: #v -tooltip.wire.damage=Damage: #v -tooltip.wire.helpText=Higher voltages will increase transfer rate and decrease energy loss. Shift right click to place a framed wire. -# %0 is the color for the charge level, %1 is grey to reset it back to normal (optional), %v0 is the current charge, %v1 is the max charge -tooltip.battery.energy=Energy: %0%v0 / %v1 -tooltip.noInformation=No Information -tooltip.tier=Tier -tooltip.empty=Empty -tooltip.noOutput=No Output -tooltip.noImprint=No Imprint - -tooltip.graph.energy=Energy -tooltip.graph.power=Power -tooltip.graph.capacity=Capacity -tooltip.graph.voltage=Voltage -tooltip.graph.torque=Torque -tooltip.graph.speed=Speed -tooltip.graph.fluid=Fluid -tooltip.graph.temperature=Temperature -tooltip.graph.pressure=Pressure - -## GUI Strings that can't be any other localization -gui.resonantinduction.multimeter.toggle=Toggle -gui.resonantinduction.multimeter.toggleDetection=Toggle Detection -gui.resonantinduction.multimeter.toggleGraph=Toggle Graph -gui.resonantinduction.multimeter.capacity=Capacity: -gui.resonantinduction.multimeter.energy=Energy: -gui.resonantinduction.multimeter.redstone=Output Redstone If... -gui.resonantinduction.multimeter.logic=Logic: - -gui.resonantinduction.multimeter.none=None -gui.resonantinduction.multimeter.lessThan=Less Than -gui.resonantinduction.multimeter.lessThanOrEqual=Less Than or Equal -gui.resonantinduction.multimeter.equal=Equal -gui.resonantinduction.multimeter.greaterThanOrEqual=Greater Than or Equal -gui.resonantinduction.multimeter.greaterThan=Greater Than - -## Messages to players -message.multimeter.onUse=Energy: %v J -message.tesla.toggleAttack=Toggled entity attack to: %v -# %v0 is the tile that's linking to the other (usually %v0 is a tesla), the others are coordinates in the standard [x, y, z] -message.tesla.pair=Linked %v0 with [%v1, %v2, %v3] -message.tesla.mode=Tesla receive mode is now %v - -### Atomic Module -potion.radiation=Radiation -death.attack.radiation=%1$s died from radiation. - -## Schematic -schematic.accelerator.name=Particle Accelerator -schematic.breedingReactor.name=Breeding Reactor -schematic.fissionReactor.name=Fission Reactor -schematic.fusionReactor.name=Fusion Reactor - -## Fluids -fluid.uraniumhexafluoride=Uranium Hexafluoride -fluid.deuterium=Deuterium -fluid.tritium=Tritium -fluid.plasma=Plasma -fluid.steam=Steam -fluid.toxicwaste=Toxic Waste -fluid.tile.water=Water - -item.resonantinduction:hazmatMask.name=Hazmat Mask -item.resonantinduction:hazmatBody.name=Hazmat Body -item.resonantinduction:hazmatLeggings.name=Hazmat Leggings -item.resonantinduction:hazmatBoots.name=Hazmat Boots -item.resonantinduction:bucketToxicWaste.name=Toxic Waste Bucket - -## Cells -item.resonantinduction:cellEmpty.0.name=Empty Cell -item.resonantinduction:cellWater.0.name=Water Cell -item.resonantinduction:cellDeuterium.0.name=Deuterium Cell -item.resonantinduction:cellTritium.0.name=Tritium Cell -item.resonantinduction:darkMatter.0.name=Dark Matter -item.resonantinduction:antimatter.0.name=Antimatter -item.resonantinduction:antimatter.0.tooltip=125 Milligrams -item.resonantinduction:antimatter.1.name=Antimatter -item.resonantinduction:antimatter.1.tooltip=1 Gram - -## Uranium Related Items -item.resonantinduction:yellowCake.name=Yellowcake -item.resonantinduction:uranium.0.name=Uranium-235 -item.resonantinduction:uranium.0.tooltip=Enriched Uranium -item.resonantinduction:uranium.1.name=Uranium-238 -item.resonantinduction:uranium.1.tooltip=Breeding Uranium -item.resonantinduction:fissileFuel.name=Fissile Fuel Rod -item.resonantinduction:fissileFuel.tooltip=The primary fuel source for fission reactors. -item.resonantinduction:breederFuel.name=Breeder Fuel Rod -item.resonantinduction:breederFuel.tooltip=The fuel source for re-breeding decayed fissile fuels. -item.resonantinduction:uraniumHexafluoride.name=Uranium Hexafluoride -item.resonantinduction:steam.name=Steam - -## Blocks -tile.resonantinduction:oreUranium.name=Uranium Ore -tile.resonantinduction:oreUraniumOre.tooltip=A precious and useful ore used for fission reactions. -tile.resonantinduction:reactorDrain.name=Reactor Drain -tile.resonantinduction:reactorDrain.tooltip=Extracts fluids out of the reactor, such as toxic waste. -tile.resonantinduction:nuclearBoiler.name=Nuclear Boiler -tile.resonantinduction:nuclearBoiler.tooltip=Boils yellowcake into uranium hexaflouride gas. -tile.resonantinduction:centrifuge.name=Centrifuge -tile.resonantinduction:centrifuge.tooltip=Refines Uranium Hexafluoride gas into usable uranium. -tile.resonantinduction:reactorCell.name=Reactor Cell -tile.resonantinduction:reactorCell.tooltip=The primary components for all types of reactors. Fuel rods or plasma may be injected into the cell. -tile.resonantinduction:plasmaHeater.name=Plasma Heater -tile.resonantinduction:plasmaHeater.tooltip=A plasma heater is used to heat deuterium and tritium to plasma state for fusion power. Plasma must be moved into the reactor cell. -tile.resonantinduction:electricTurbine.name=Electric Turbine -tile.resonantinduction:electricTurbine.tooltip=Transform the kinetic energy from moving steam into electrical energy. -tile.resonantinduction:radioactive.name=Radioactive Waste -tile.resonantinduction:radioactive.tooltip=Generates harmful radiation and spreads around the world, mutating organisms. -tile.resonantinduction:thermometer.name=Thermometer -tile.resonantinduction:thermometer.tooltip=Reads the temperature at the current coordinate. Shift-right click to lock the reading to a specific coordinate. -tile.resonantinduction:electromagnet.name=Electromagnet -tile.resonantinduction:electromagnet.0.name=Electromagnet -tile.resonantinduction:electromagnet.1.name=Electromagnet -tile.resonantinduction:electromagnet.tooltip=Creates an electromagnetic field preventing plasma and particles from getting near. -tile.resonantinduction:chemicalExtractor.name=Chemical Extractor -tile.resonantinduction:chemicalExtractor.tooltip=Extracts uranium ores to yellowcake, water to deuterium and deuterium to tritium. -tile.resonantinduction:siren.name=Siren -tile.resonantinduction:siren.tooltip=Creates an alarm with customizable pitch and volume with a Redstone signal. -tile.resonantinduction:controlRod.name=Control Rod -tile.resonantinduction:controlRod.tooltip=Suppresses fission reaction in adjacent reactor cells. -tile.resonantinduction:plasma.name=Plasma -tile.resonantinduction:plasma.tooltip=Generates extreme heat for boiling water. -tile.resonantinduction:funnel.name=Gas Funnel -tile.resonantinduction:funnel.tooltip=Captures gas to allow it to be transported with piping. -tile.resonantinduction:accelerator.name=Particle Accelerator -tile.resonantinduction:accelerator.tooltip=Accelerates particles and creates antimatter and dark matter. -tile.resonantinduction:fulmination.name=Fulmination Generator -tile.resonantinduction:fulmination.tooltip=Transforms the kinetic energy from explosions into electrical energy. -tile.resonantinduction:quantumAssembler.name=Quantum Assembler -tile.resonantinduction:quantumAssembler.tooltip=Reassembles Dark Matter atoms into usable materials. -tile.resonantinduction:toxicWaste.name=Toxic Waste -tile.resonantinduction:toxicWaste.tooltip=Toxic, nuclear waste that pollutes the world. -tile.resonantinduction:mirror.name = Mirror - -## Tooltips -tooltip.energy=Energy -tooltip.temperature=Temperature -tooltip.remainingTime=Remaining Time -tooltip.trackingTemperature=Tracking temperature at: -tooltip.notTrackingTemperature=Not tracking temperature. diff --git a/src/main/resources/edx-logo.png b/src/main/resources/edx-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c684c2c9f1f72e096936eae8c36b1b9568b7c2ac GIT binary patch literal 63534 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 17cc6bcb6..d2dd09dbf 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,14 +1,14 @@ [{ - "modid": "ResonantInductionCore", - "name": "Resonant Induction", - "description": "Resonant Induction is a Minecraft mod that brings in realistic, world-based technology advancement experience into Minecraft.", + "modid": "EDX", + "name": "Electrodynamics", + "description": "Electrodynamics is a mod that brings in realistic, world-based technological advancement experience into Minecraft.", "version": "${version}", "mcversion": "${mcversion}", - "url": "http://www.calclavia.com/resonant-induction", + "url": "http://www.calclavia.com/electrodynamics", "updateUrl": "", - "authors": ["Calclavia", "DarkCow"], + "authors": ["Calclavia", "CyanideX"], "credits": "", - "logoFile": "", + "logoFile": "edx-logo.png", "screenshots": [], "parent": "", "requiredMods": [], diff --git a/src/main/resources/ri_logo.png b/src/main/resources/ri_logo.png deleted file mode 100644 index d71e3e6fe564701388bd5815ee33c5e7939efa43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97272 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

neQ?e<6jyMXd?}uQKC}jZ# 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%0DRz1ifpS(@A!MSnRL#)EL-DjxpJBMt8v;&%P{ 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 F!u*R}ajN+pCMgP3m3sS>JbqIuQj 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 DjOntC diff --git a/src/main/scala/edx/basic/BasicContent.scala b/src/main/scala/edx/basic/BasicContent.scala new file mode 100644 index 000000000..5e159d640 --- /dev/null +++ b/src/main/scala/edx/basic/BasicContent.scala @@ -0,0 +1,77 @@ +package edx.basic + +import edx.basic.blocks.{ItemImprint, TileImprinter, TileTurntable} +import edx.basic.engineering.ItemHammer +import edx.basic.firebox.{TileFirebox, TileHotPlate} +import edx.basic.fluid.grate.TileGrate +import edx.basic.fluid.gutter.TileGutter +import edx.basic.fluid.tank.TileTank +import edx.basic.process.mixing.TileGlassJar +import edx.basic.process.{TileCastingMold, TileMillstone, TileWorkbench} +import edx.core.resource.content.{ItemAlloyDust, TileDust} +import edx.core.{EDXCreativeTab, Reference} +import edx.mechanical.mech.gear.ItemHandCrank +import net.minecraft.block.Block +import net.minecraft.init.{Blocks, Items} +import net.minecraft.item.{Item, ItemStack} +import resonant.lib.mod.content.ContentHolder +import resonant.lib.utility.recipe.UniversalRecipe +; + +object BasicContent extends ContentHolder +{ + /** + * Resources + */ + var itemAlloyDust: Item = new ItemAlloyDust + var blockDust: Block = new TileDust + + var itemImprint: Item = new ItemImprint + var itemHammer: Item = new ItemHammer + var itemHandCrank: Item = new ItemHandCrank + + // var blockEngineeringTable: Block = new TileEngineeringTable + var blockCrate: Block = null + //manager.newBlock(classOf[BlockCrate]) + var blockImprinter: Block = new TileImprinter + var blockTurntable: Block = new TileTurntable + var blockFirebox: Block = new TileFirebox + var blockHotPlate: Block = new TileHotPlate + var blockMillstone: Block = new TileMillstone + var blockCast: Block = new TileCastingMold + //var blockFilter: Block = contentRegistry.newBlock( classOf[ TileFilter ] ) + var blockGrate: Block = new TileGrate + var blockGutter: Block = new TileGutter + var blockTank: Block = new TileTank + var blockWorkbench: Block = new TileWorkbench + var blockJar: Block = new TileGlassJar + + //Constructor + manager.setTab(EDXCreativeTab) + manager.setPrefix(Reference.prefix) + + override def postInit() + { + //recipes += shaped(ArchaicContent.blockEngineeringTable, "P", "C", 'P', Blocks.wooden_pressure_plate, 'C', Blocks.crafting_table) + //recipes += shaped(ArchaicBlocks.blockFilter, "B", "P", "B", 'B', Blocks.iron_bars, 'P', Items.paper) + + //recipes += shaped(new ItemStack(ArchaicBlocks.blockCrate, 1, 0), "WWW", "WSW", "WWW", 'S', "stickWood", 'W', "logWood") + //recipes += new CrateRecipe(new ItemStack(ArchaicBlocks.blockCrate, 1, 1), "WWW", "WSW", "WWW", 'S', new ItemStack(ArchaicBlocks.blockCrate, 1, 0), 'W', "ingotIron") + //recipes +=new CrateRecipe(new ItemStack(ArchaicBlocks.blockCrate, 1, 2), "WWW", "WSW", "WWW", 'S', new ItemStack(ArchaicBlocks.blockCrate, 1, 1), 'W', UniversalRecipe.PRIMARY_METAL.get) + + recipes += shaped(BasicContent.blockFirebox, "III", "SFS", "SSS", 'I', Items.iron_ingot, 'F', Blocks.furnace, 'S', Blocks.stone) + recipes += shaped(new ItemStack(BasicContent.blockFirebox, 1, 1), "III", "SFS", "SSS", 'I', UniversalRecipe.PRIMARY_METAL.get, 'F', new ItemStack(BasicContent.blockFirebox, 1, 0), 'S', UniversalRecipe.WIRE.get) + recipes += shaped(BasicContent.blockImprinter, "SSS", "W W", "PPP", 'S', Blocks.stone, 'P', Blocks.piston, 'W', "logWood") + recipes += shaped(BasicContent.blockTurntable, "SSS", "PGP", "WWW", 'S', Blocks.stone, 'G', Items.redstone, 'P', Blocks.piston, 'W', "logWood") + recipes += shaped(BasicContent.blockCast, "I I", "IBI", "III", 'S', Items.iron_ingot, 'B', Blocks.iron_bars) + recipes += shaped(BasicContent.blockGutter, "S S", "I I", "III", 'S', Items.stick, 'I', "cobblestone") + recipes += shaped(BasicContent.blockGrate, "WBW", "B B", "WBW", 'B', Blocks.iron_bars, 'W', "plankWood") + recipes += shaped(BasicContent.blockHotPlate, "SSS", "III", 'I', Items.iron_ingot, 'S', Blocks.stone) + recipes += shaped(BasicContent.blockMillstone, "SPS", "SAS", "SSS", 'P', Blocks.piston, 'A', Items.stone_pickaxe, 'S', Blocks.stone) + recipes += shaped(BasicContent.blockTank, "GGG", "GSG", "GGG", 'G', Blocks.glass, 'S', Items.iron_ingot) + + recipes += shaped(itemHandCrank, "S ", "SSS", " S", 'S', "stickWood") + recipes += shaped(itemImprint, "PPP", "PIP", "PPP", 'P', Items.paper, 'I', new ItemStack(Items.dye, 0)) + recipes += shaped(itemHammer, "CC ", "CS ", " S", 'C', "cobblestone", 'S', "stickWood") + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/blocks/ItemImprint.scala b/src/main/scala/edx/basic/blocks/ItemImprint.scala new file mode 100644 index 000000000..506e16162 --- /dev/null +++ b/src/main/scala/edx/basic/blocks/ItemImprint.scala @@ -0,0 +1,131 @@ +package edx.basic.blocks + +import java.util +import java.util.{ArrayList, List} + +import edx.core.{EDXCreativeTab, Reference} +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.entity.{Entity, EntityList, EntityLivingBase, IProjectile} +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.nbt.{NBTTagCompound, NBTTagList} +import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.nbt.NBTUtility +import resonant.lib.wrapper.WrapList._ + +import scala.collection.JavaConversions._ + +object ItemImprint +{ + /** + * Saves the list of items to filter out inside. + */ + def setFilters(itemStack: ItemStack, filterStacks: java.util.List[ItemStack]) + { + if (itemStack.getTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + val nbt: NBTTagList = new NBTTagList + import scala.collection.JavaConversions._ + for (filterStack <- filterStacks) + { + val newCompound: NBTTagCompound = new NBTTagCompound + filterStack.writeToNBT(newCompound) + nbt.appendTag(newCompound) + } + itemStack.getTagCompound.setTag("Items", nbt) + } + + def isFiltering(filter: ItemStack, itemStack: ItemStack): Boolean = + { + if (filter != null && itemStack != null) + { + val checkStacks: List[ItemStack] = getFilters(filter) + if (checkStacks != null) + { + import scala.collection.JavaConversions._ + for (stack <- checkStacks) + { + if (stack.isItemEqual(itemStack)) + { + return true + } + } + } + } + return false + } + + def getFilters(itemStack: ItemStack): List[ItemStack] = + { + val filterStacks: List[ItemStack] = new util.LinkedList[ItemStack] + val nbt: NBTTagCompound = NBTUtility.getNBTTagCompound(itemStack) + val tagList: NBTTagList = nbt.getTagList("Items", 0) + + for (i <- 0 to tagList.tagCount) + { + val var4: NBTTagCompound = tagList.getCompoundTagAt(i) + filterStacks.add(ItemStack.loadItemStackFromNBT(var4)) + } + + return filterStacks + } + + def getFilterList(itemStack: ItemStack): List[ItemStack] = + { + val filterStacks: List[ItemStack] = new ArrayList[ItemStack] + val nbt: NBTTagCompound = NBTUtility.getNBTTagCompound(itemStack) + val tagList: NBTTagList = nbt.getTagList("Items", 0) + + for (i <- 0 to tagList.tagCount) + { + val var4: NBTTagCompound = tagList.getCompoundTagAt(i) + filterStacks.add(ItemStack.loadItemStackFromNBT(var4)) + + } + return filterStacks + } +} + +class ItemImprint extends Item +{ + //Constructor + setUnlocalizedName(Reference.prefix + "imprint") + setTextureName(Reference.prefix + "imprint") + setCreativeTab(EDXCreativeTab) + setHasSubtypes(true) + setMaxStackSize(1) + + override def onLeftClickEntity(stack: ItemStack, player: EntityPlayer, entity: Entity): Boolean = + { + if (entity != null && !(entity.isInstanceOf[IProjectile]) && !(entity.isInstanceOf[EntityPlayer])) + { + val stringName: String = EntityList.getEntityString(entity) + return true + } + return false + } + + def itemInteractionForEntity(par1ItemStack: ItemStack, par2EntityLiving: EntityLivingBase): Boolean = + { + return false + } + + override def addInformation(itemStack: ItemStack, par2EntityPlayer: EntityPlayer, list: java.util.List[_], par4: Boolean) + { + val filterItems: List[ItemStack] = ItemImprint.getFilters(itemStack) + + if (filterItems.size > 0) + { + for (filterItem <- filterItems) + { + if (filterItem != null) + list.add(filterItem.getDisplayName) + } + } + else + { + list.add(LanguageUtility.getLocal("tooltip.noImprint")) + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/blocks/TileFilterable.scala b/src/main/scala/edx/basic/blocks/TileFilterable.scala new file mode 100644 index 000000000..9391e565b --- /dev/null +++ b/src/main/scala/edx/basic/blocks/TileFilterable.scala @@ -0,0 +1,153 @@ +package edx.basic.blocks + +import net.minecraft.block.material.Material +import net.minecraft.entity.item.EntityItem +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.ForgeDirection +import resonant.api.tile.{IFilterable, IRotatable} +import resonant.lib.prefab.tile.TileInventory +import resonant.lib.transform.vector.Vector3 + +object TileFilterable +{ + final val FILTER_SLOT: Int = 0 + final val BATERY_DRAIN_SLOT: Int = 1 +} + +abstract class TileFilterable(material: Material) extends TileInventory(material: Material) with IRotatable with IFilterable +{ + private var filterItem: ItemStack = null + private var inverted: Boolean = false + + def this() + { + this(Material.wood) + this.setSizeInventory(2) + } + + /** + * Allows filters to be placed inside of this block. + */ + override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = + { + val containingStack: ItemStack = getFilter + if (containingStack != null) + { + if (!world.isRemote) + { + val dropStack: EntityItem = new EntityItem(world, player.posX, player.posY, player.posZ, containingStack) + dropStack.delayBeforeCanPickup = 0 + world.spawnEntityInWorld(dropStack) + } + setFilter(null) + return true + } + else + { + if (player.getCurrentEquippedItem != null) + { + if (player.getCurrentEquippedItem.getItem.isInstanceOf[ItemImprint]) + { + setFilter(player.getCurrentEquippedItem) + player.inventory.setInventorySlotContents(player.inventory.currentItem, null) + return true + } + } + } + return false + } + + def setFilter(filter: ItemStack) + { + this.filterItem = filter + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) + } + + override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = + { + toggleInversion + markUpdate + markRender + return true + } + + def toggleInversion + { + setInverted(!isInverted) + } + + def isInverted: Boolean = + { + return this.inverted + } + + def setInverted(inverted: Boolean) + { + this.inverted = inverted + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) + } + + /** + * Looks through the things in the filter and finds out which item is being filtered. + * + * @return Is this filterable block filtering this specific ItemStack? + */ + def isFiltering(itemStack: ItemStack): Boolean = + { + if (this.getFilter != null && itemStack != null) + { + val checkStacks: java.util.List[ItemStack] = ItemImprint.getFilters(getFilter) + if (checkStacks != null) + { + import scala.collection.JavaConversions._ + for (stack <- checkStacks) + { + if (stack.isItemEqual(itemStack)) + { + return !inverted + } + } + } + } + return inverted + } + + def getFilter: ItemStack = + { + return this.filterItem + } + + override def getDirection: ForgeDirection = + { + return ForgeDirection.getOrientation(if (getBlockType != null) getBlockMetadata else 0) + } + + override def setDirection(facingDirection: ForgeDirection) + { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal, 3) + } + + override def writeToNBT(nbt: NBTTagCompound) + { + super.writeToNBT(nbt) + nbt.setBoolean("inverted", inverted) + } + + override def readFromNBT(nbt: NBTTagCompound) + { + super.readFromNBT(nbt) + if (nbt.hasKey("filter")) + { + this.getInventory.setInventorySlotContents(0, ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter"))) + } + inverted = nbt.getBoolean("inverted") + } + + protected def isFunctioning: Boolean = + { + return true + } + +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/blocks/TileImprinter.scala b/src/main/scala/edx/basic/blocks/TileImprinter.scala similarity index 99% rename from src/main/scala/resonantinduction/archaic/blocks/TileImprinter.scala rename to src/main/scala/edx/basic/blocks/TileImprinter.scala index b199494aa..26301da25 100644 --- a/src/main/scala/resonantinduction/archaic/blocks/TileImprinter.scala +++ b/src/main/scala/edx/basic/blocks/TileImprinter.scala @@ -1,10 +1,11 @@ -package resonantinduction.archaic.blocks +package edx.basic.blocks import java.util.{HashSet, Iterator, Set} import codechicken.multipart.ControlKeyModifer import cpw.mods.fml.common.network.ByteBufUtils import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -25,7 +26,6 @@ import resonant.lib.prefab.tile.spatial.{SpatialBlock, SpatialTile} import resonant.lib.render.RenderItemOverlayUtility import resonant.lib.transform.vector.{Vector2, Vector3} import resonant.lib.utility.inventory.InventoryUtility -import resonantinduction.core.Reference import scala.collection.JavaConversions._ @@ -61,16 +61,6 @@ class TileImprinter extends SpatialTile(Material.circuits) with ISidedInventory nbt.setTag("Items", var2) } - def getSizeInventory: Int = - { - return this.inventory.length - } - - def getStackInSlot(slot: Int): ItemStack = - { - return this.inventory(slot) - } - def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) { try @@ -119,6 +109,11 @@ class TileImprinter extends SpatialTile(Material.circuits) with ISidedInventory } } + def getSizeInventory: Int = + { + return this.inventory.length + } + /** * Inventory methods. */ @@ -187,64 +182,6 @@ class TileImprinter extends SpatialTile(Material.circuits) with ISidedInventory this.onInventoryChanged } - /** - * Updates all the output slots. Call this to update the Imprinter. - */ - def onInventoryChanged - { - if (!this.worldObj.isRemote) - { - val fitlerStack: ItemStack = this.inventory(9) - if (fitlerStack != null && fitlerStack.getItem.isInstanceOf[ItemImprint]) - { - val outputStack: ItemStack = fitlerStack.copy - val filters: java.util.List[ItemStack] = ItemImprint.getFilters(outputStack) - val toAdd: Set[ItemStack] = new HashSet[ItemStack] - val toBeImprinted: Set[ItemStack] = new HashSet[ItemStack] - - var i: Int = 0 - while (i < 9) - { - val stackInInventory: ItemStack = inventory(i) - if (stackInInventory != null) - { - for (check <- toBeImprinted) - { - if (check.isItemEqual(stackInInventory)) - { - i = 10 - } - } - toBeImprinted.add(stackInInventory) - } - i += 1; - } - - for (stackInInventory <- toBeImprinted) - { - val it: Iterator[ItemStack] = filters.iterator - var removed: Boolean = false - while (it.hasNext) - { - val filteredStack: ItemStack = it.next - if (filteredStack.isItemEqual(stackInInventory)) - { - it.remove - removed = true - } - } - if (!removed) - { - toAdd.add(stackInInventory) - } - } - filters.addAll(toAdd) - ItemImprint.setFilters(outputStack, filters) - this.inventory(9) = outputStack - } - } - } - def closeInventory { this.onInventoryChanged @@ -288,6 +225,11 @@ class TileImprinter extends SpatialTile(Material.circuits) with ISidedInventory GL11.glPopMatrix } + def getStackInSlot(slot: Int): ItemStack = + { + return this.inventory(slot) + } + @SideOnly(Side.CLIENT) override def registerIcons(iconReg: IIconRegister) { super.registerIcons(iconReg) @@ -404,4 +346,62 @@ class TileImprinter extends SpatialTile(Material.circuits) with ISidedInventory onInventoryChanged } } + + /** + * Updates all the output slots. Call this to update the Imprinter. + */ + def onInventoryChanged + { + if (!this.worldObj.isRemote) + { + val fitlerStack: ItemStack = this.inventory(9) + if (fitlerStack != null && fitlerStack.getItem.isInstanceOf[ItemImprint]) + { + val outputStack: ItemStack = fitlerStack.copy + val filters: java.util.List[ItemStack] = ItemImprint.getFilters(outputStack) + val toAdd: Set[ItemStack] = new HashSet[ItemStack] + val toBeImprinted: Set[ItemStack] = new HashSet[ItemStack] + + var i: Int = 0 + while (i < 9) + { + val stackInInventory: ItemStack = inventory(i) + if (stackInInventory != null) + { + for (check <- toBeImprinted) + { + if (check.isItemEqual(stackInInventory)) + { + i = 10 + } + } + toBeImprinted.add(stackInInventory) + } + i += 1; + } + + for (stackInInventory <- toBeImprinted) + { + val it: Iterator[ItemStack] = filters.iterator + var removed: Boolean = false + while (it.hasNext) + { + val filteredStack: ItemStack = it.next + if (filteredStack.isItemEqual(stackInInventory)) + { + it.remove + removed = true + } + } + if (!removed) + { + toAdd.add(stackInInventory) + } + } + filters.addAll(toAdd) + ItemImprint.setFilters(outputStack, filters) + this.inventory(9) = outputStack + } + } + } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala b/src/main/scala/edx/basic/blocks/TileTurntable.scala similarity index 97% rename from src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala rename to src/main/scala/edx/basic/blocks/TileTurntable.scala index 3fff8be5f..a73b2a4e6 100644 --- a/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala +++ b/src/main/scala/edx/basic/blocks/TileTurntable.scala @@ -1,7 +1,8 @@ -package resonantinduction.archaic.blocks +package edx.basic.blocks import codechicken.multipart.TileMultipart import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister @@ -9,10 +10,9 @@ import net.minecraft.util.IIcon import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.IRotatable -import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.prefab.tile.spatial.SpatialBlock +import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference object TileTurntable { diff --git a/src/main/scala/resonantinduction/archaic/crate/BlockCrate.scala b/src/main/scala/edx/basic/crate/BlockCrate.scala similarity index 97% rename from src/main/scala/resonantinduction/archaic/crate/BlockCrate.scala rename to src/main/scala/edx/basic/crate/BlockCrate.scala index 660855753..c45aaa4e6 100644 --- a/src/main/scala/resonantinduction/archaic/crate/BlockCrate.scala +++ b/src/main/scala/edx/basic/crate/BlockCrate.scala @@ -1,9 +1,11 @@ -package resonantinduction.archaic.crate +package edx.basic.crate import java.util.List import codechicken.multipart.ControlKeyModifer import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.BasicContent +import edx.core.Reference import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.creativetab.CreativeTabs @@ -15,8 +17,6 @@ import net.minecraft.world.World import net.minecraftforge.oredict.OreDictionary import resonant.lib.prefab.tile.spatial.SpatialBlock import resonant.lib.wrapper.WrapList._ -import resonantinduction.archaic.ArchaicContent -import resonantinduction.core.Reference import scala.collection.JavaConversions._ import scala.util.control.Breaks._ @@ -33,7 +33,7 @@ object BlockCrate /** Puts an itemStack into the crate. * * @param tileEntity - * @param itemStack */ + * @param itemStack*/ def addStackToCrate(tileEntity: TileCrate, itemStack: ItemStack): ItemStack = { if (itemStack == null || itemStack.getItem.isDamageable && itemStack.getItem.getDamage(itemStack) > 0) @@ -253,7 +253,7 @@ class BlockCrate extends SpatialBlock(Material.iron) val currentStack: ItemStack = player.getCurrentEquippedItem if (currentStack != null) { - if (currentStack.getItem() == Item.getItemFromBlock(ArchaicContent.blockCrate)) + if (currentStack.getItem() == Item.getItemFromBlock(BasicContent.blockCrate)) { val containedStack: ItemStack = ItemBlockCrate.getContainingItemStack(currentStack) val crateStack: ItemStack = tileEntity.getSampleStack @@ -294,7 +294,7 @@ class BlockCrate extends SpatialBlock(Material.iron) { requestStack = player.getCurrentEquippedItem } - if (requestStack != null && requestStack.getItem != Item.getItemFromBlock(ArchaicContent.blockCrate)) + if (requestStack != null && requestStack.getItem != Item.getItemFromBlock(BasicContent.blockCrate)) { var success: Boolean = false for (i <- 0 until player.inventory.getSizeInventory) diff --git a/src/main/scala/edx/basic/crate/CrateRecipe.scala b/src/main/scala/edx/basic/crate/CrateRecipe.scala new file mode 100644 index 000000000..b6109534c --- /dev/null +++ b/src/main/scala/edx/basic/crate/CrateRecipe.scala @@ -0,0 +1,44 @@ +package edx.basic.crate + +import edx.basic.BasicContent +import net.minecraft.block.Block +import net.minecraft.inventory.InventoryCrafting +import net.minecraft.item.{Item, ItemStack} +import net.minecraftforge.oredict.ShapedOreRecipe + +/** + * Crafting handler for crates + * + * @author Darkguardsman + */ +class CrateRecipe(result: ItemStack, recipe: AnyRef*) extends ShapedOreRecipe(result, recipe) +{ + def this(result: Block, recipe: AnyRef*) + { + this(new ItemStack(result), recipe) + } + + def this(result: Item, recipe: AnyRef*) + { + this(new ItemStack(result), recipe) + } + + override def getCraftingResult(grid: InventoryCrafting): ItemStack = + { + val result: ItemStack = super.getCraftingResult(grid) + val crateItem: Item = Item.getItemFromBlock(BasicContent.blockCrate) + if (result != null && result.getItem == crateItem) + { + val centerStack: ItemStack = grid.getStackInSlot(4) + if (centerStack != null && centerStack.getItem == crateItem) + { + val containedStack: ItemStack = ItemBlockCrate.getContainingItemStack(centerStack) + if (centerStack != null) + { + ItemBlockCrate.setContainingItemStack(result, containedStack) + } + } + } + return result + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.scala b/src/main/scala/edx/basic/crate/InventoryCrate.scala similarity index 97% rename from src/main/scala/resonantinduction/archaic/crate/InventoryCrate.scala rename to src/main/scala/edx/basic/crate/InventoryCrate.scala index f237f6883..1125bf088 100644 --- a/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.scala +++ b/src/main/scala/edx/basic/crate/InventoryCrate.scala @@ -1,4 +1,4 @@ -package resonantinduction.archaic.crate +package edx.basic.crate import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound diff --git a/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.scala b/src/main/scala/edx/basic/crate/ItemBlockCrate.scala similarity index 99% rename from src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.scala rename to src/main/scala/edx/basic/crate/ItemBlockCrate.scala index 443cf210f..097246ebf 100644 --- a/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.scala +++ b/src/main/scala/edx/basic/crate/ItemBlockCrate.scala @@ -1,4 +1,4 @@ -package resonantinduction.archaic.crate +package edx.basic.crate import java.util.List diff --git a/src/main/scala/edx/basic/crate/PathfinderCrate.scala b/src/main/scala/edx/basic/crate/PathfinderCrate.scala new file mode 100644 index 000000000..5dc0e51e1 --- /dev/null +++ b/src/main/scala/edx/basic/crate/PathfinderCrate.scala @@ -0,0 +1,114 @@ +package edx.basic.crate + +import java.util.{ArrayList, List} + +import net.minecraft.tileentity.TileEntity +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.transform.vector.VectorWorld + +/** + * A class that allows flexible path finding in Minecraft Blocks. Back Ported from UE 1.3.0. + *

+ * TODO: Will need to change when MC 1.5 comes out. + * + * @author Calclavia + */ +object PathfinderCrate +{ + + abstract trait IPathCallBack + { + /** + * Is this a valid node to search for? + * + * @return + */ + def isValidNode(finder: PathfinderCrate, direction: ForgeDirection, provider: TileEntity, node: TileEntity): Boolean + + /** + * Called when looping through nodes. + * + * @param finder + * @param provider + * @return True to stop the path finding operation. + */ + def onSearch(finder: PathfinderCrate, provider: TileEntity): Boolean + } + +} + +class PathfinderCrate +{ + /** + * A pathfinding call back interface used to call back on paths. + */ + var callBackCheck: PathfinderCrate.IPathCallBack = null + /** + * A list of nodes that the pathfinder went through. + */ + var iteratedNodes: List[TileEntity] = null + /** + * The results and findings found by the pathfinder. + */ + var results: List[Any] = null + + this.callBackCheck = new PathfinderCrate.IPathCallBack + { + def isValidNode(finder: PathfinderCrate, direction: ForgeDirection, provider: TileEntity, node: TileEntity): Boolean = + { + return node.isInstanceOf[TileCrate] + } + + def onSearch(finder: PathfinderCrate, provider: TileEntity): Boolean = + { + return false + } + } + this.clear + + def findNodes(provider: TileEntity): Boolean = + { + if (provider != null) + { + this.iteratedNodes.add(provider) + if (this.callBackCheck.onSearch(this, provider)) + { + return false + } + for (i <- 0 to 6) + { + val vec: VectorWorld = new VectorWorld(provider) + vec.addEquals(ForgeDirection.getOrientation(i)) + val connectedTile: TileEntity = vec.getTileEntity + if (!iteratedNodes.contains(connectedTile)) + { + if (this.callBackCheck.isValidNode(this, ForgeDirection.getOrientation(i), provider, connectedTile)) + { + if (!this.findNodes(connectedTile)) + { + return false + } + } + } + } + } + return true + } + + /** + * Called to execute the pathfinding operation. + */ + def init(provider: TileEntity): PathfinderCrate = + { + this.findNodes(provider) + return this + } + + def clear: PathfinderCrate = + { + this.iteratedNodes = new ArrayList[TileEntity] + this.results = new ArrayList[Any] + return this + } + +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/crate/RenderCrate.scala b/src/main/scala/edx/basic/crate/RenderCrate.scala similarity index 95% rename from src/main/scala/resonantinduction/archaic/crate/RenderCrate.scala rename to src/main/scala/edx/basic/crate/RenderCrate.scala index 2179e82b7..8684040cf 100644 --- a/src/main/scala/resonantinduction/archaic/crate/RenderCrate.scala +++ b/src/main/scala/edx/basic/crate/RenderCrate.scala @@ -1,4 +1,4 @@ -package resonantinduction.archaic.crate +package edx.basic.crate import cpw.mods.fml.relauncher.{Side, SideOnly} import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer diff --git a/src/main/scala/resonantinduction/archaic/crate/TileCrate.scala b/src/main/scala/edx/basic/crate/TileCrate.scala similarity index 97% rename from src/main/scala/resonantinduction/archaic/crate/TileCrate.scala rename to src/main/scala/edx/basic/crate/TileCrate.scala index 856634d7b..d23cb601b 100644 --- a/src/main/scala/resonantinduction/archaic/crate/TileCrate.scala +++ b/src/main/scala/edx/basic/crate/TileCrate.scala @@ -1,8 +1,9 @@ -package resonantinduction.archaic.crate +package edx.basic.crate import java.util import java.util.List +import edx.basic.BasicContent import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer @@ -16,7 +17,6 @@ import resonant.lib.network.discriminator.PacketType import resonant.lib.network.handle.{TPacketReceiver, TPacketSender} import resonant.lib.prefab.tile.TileInventory import resonant.lib.wrapper.ByteBufWrapper._ -import resonantinduction.archaic.ArchaicContent /** Basic single stack inventory. *

@@ -169,6 +169,80 @@ class TileCrate extends TileInventory(Material.rock) with TPacketReceiver with T return getSampleStack == null || stack != null && (stack.isItemEqual(getSampleStack) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack) == OreDictionary.getOreID(stack))) } + /** Gets the sample stack that represent the total inventory */ + def getSampleStack: ItemStack = + { + if (this.sampleStack == null) + { + this.buildSampleStack() + } + return this.sampleStack + } + + /** Builds the sample stack using the inventory as a point of reference. Assumes all items match + * each other, and only takes into account stack sizes */ + def buildSampleStack() + { + buildSampleStack(true) + } + + def buildSampleStack(buildInv: Boolean) + { + if (worldObj == null || !worldObj.isRemote) + { + var newSampleStack: ItemStack = null + var rebuildBase: Boolean = false + for (slot <- 0 until getSizeInventory) + { + + val slotStack: ItemStack = this.getInventory.getStackInSlot(slot) + if (slotStack != null && slotStack.getItem != null && slotStack.stackSize > 0) + { + if (newSampleStack == null) + { + newSampleStack = slotStack.copy + } + else + { + newSampleStack.stackSize += slotStack.stackSize + } + if (slotStack.stackSize > slotStack.getMaxStackSize) + { + rebuildBase = true + } + } + } + + + + if (newSampleStack == null || newSampleStack.getItem == null || newSampleStack.stackSize <= 0) + { + this.sampleStack = if (this.getFilter != null) this.getFilter.copy else null + } + else + { + this.sampleStack = newSampleStack.copy + } + if (buildInv && this.sampleStack != null && (rebuildBase || this.getInventory.getContainedItems.length > this.getSizeInventory)) + { + this.getInventory.asInstanceOf[InventoryCrate].buildInventory(this.sampleStack) + } + } + } + + override def getSizeInventory: Int = TileCrate.getSlotCount(getBlockMetadata) + + def getFilter: ItemStack = + { + return this.filterStack + } + + def setFilter(filter: ItemStack) + { + this.filterStack = filter + this.onInventoryChanged + } + /** Gets the current slot count for the crate */ def getSlotCount: Int = { @@ -250,7 +324,7 @@ class TileCrate extends TileInventory(Material.rock) with TPacketReceiver with T { val list = new util.ArrayList[ItemStack]() val sampleStack: ItemStack = getSampleStack - val drop: ItemStack = new ItemStack(Item.getItemFromBlock(ArchaicContent.blockCrate), 1, this.getBlockMetadata) + val drop: ItemStack = new ItemStack(Item.getItemFromBlock(BasicContent.blockCrate), 1, this.getBlockMetadata) if (sampleStack != null && sampleStack.stackSize > 0) { ItemBlockCrate.setContainingItemStack(drop, sampleStack) @@ -258,78 +332,4 @@ class TileCrate extends TileInventory(Material.rock) with TPacketReceiver with T list.add(drop) return list } - - /** Gets the sample stack that represent the total inventory */ - def getSampleStack: ItemStack = - { - if (this.sampleStack == null) - { - this.buildSampleStack() - } - return this.sampleStack - } - - /** Builds the sample stack using the inventory as a point of reference. Assumes all items match - * each other, and only takes into account stack sizes */ - def buildSampleStack() - { - buildSampleStack(true) - } - - def buildSampleStack(buildInv: Boolean) - { - if (worldObj == null || !worldObj.isRemote) - { - var newSampleStack: ItemStack = null - var rebuildBase: Boolean = false - for (slot <- 0 until getSizeInventory) - { - - val slotStack: ItemStack = this.getInventory.getStackInSlot(slot) - if (slotStack != null && slotStack.getItem != null && slotStack.stackSize > 0) - { - if (newSampleStack == null) - { - newSampleStack = slotStack.copy - } - else - { - newSampleStack.stackSize += slotStack.stackSize - } - if (slotStack.stackSize > slotStack.getMaxStackSize) - { - rebuildBase = true - } - } - } - - - - if (newSampleStack == null || newSampleStack.getItem == null || newSampleStack.stackSize <= 0) - { - this.sampleStack = if (this.getFilter != null) this.getFilter.copy else null - } - else - { - this.sampleStack = newSampleStack.copy - } - if (buildInv && this.sampleStack != null && (rebuildBase || this.getInventory.getContainedItems.length > this.getSizeInventory)) - { - this.getInventory.asInstanceOf[InventoryCrate].buildInventory(this.sampleStack) - } - } - } - - override def getSizeInventory: Int = TileCrate.getSlotCount(getBlockMetadata) - - def getFilter: ItemStack = - { - return this.filterStack - } - - def setFilter(filter: ItemStack) - { - this.filterStack = filter - this.onInventoryChanged - } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.scala b/src/main/scala/edx/basic/engineering/ItemHammer.scala similarity index 79% rename from src/main/scala/resonantinduction/archaic/engineering/ItemHammer.scala rename to src/main/scala/edx/basic/engineering/ItemHammer.scala index 429eb4c8a..ad2dc0b44 100644 --- a/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.scala +++ b/src/main/scala/edx/basic/engineering/ItemHammer.scala @@ -1,4 +1,4 @@ -package resonantinduction.archaic.engineering +package edx.basic.engineering ; diff --git a/src/main/scala/edx/basic/engineering/TileEngineeringTable.scala b/src/main/scala/edx/basic/engineering/TileEngineeringTable.scala new file mode 100644 index 000000000..23f4d61a5 --- /dev/null +++ b/src/main/scala/edx/basic/engineering/TileEngineeringTable.scala @@ -0,0 +1,685 @@ +package edx.basic.engineering + +import java.util.ArrayList + +import codechicken.multipart.ControlKeyModifer +import cpw.mods.fml.common.network.ByteBufUtils +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.blocks.ItemImprint +import edx.core.{Electrodynamics, Reference} +import io.netty.buffer.ByteBuf +import net.minecraft.block.Block +import net.minecraft.block.material.Material +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP, InventoryPlayer} +import net.minecraft.inventory.{IInventory, ISidedInventory, InventoryCrafting} +import net.minecraft.item.crafting.CraftingManager +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.nbt.{NBTTagCompound, NBTTagList} +import net.minecraft.network.Packet +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.{ChatComponentText, IIcon} +import net.minecraftforge.common.util.ForgeDirection +import net.minecraftforge.oredict.OreDictionary +import org.apache.commons.lang3.ArrayUtils +import org.lwjgl.opengl.GL11 +import resonant.api.gui.ISlotPickResult +import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} +import resonant.api.tile.IRotatable +import resonant.engine.ResonantEngine +import resonant.lib.collection.Pair +import resonant.lib.network.discriminator.{PacketTile, PacketType} +import resonant.lib.network.handle.IPacketReceiver +import resonant.lib.prefab.gui.ContainerDummy +import resonant.lib.prefab.tile.TileInventory +import resonant.lib.prefab.tile.item.ItemBlockSaved +import resonant.lib.render.RenderItemOverlayUtility +import resonant.lib.transform.region.Cuboid +import resonant.lib.transform.vector.{Vector2, Vector3} +import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.inventory.AutoCraftingManager.IAutoCrafter +import resonant.lib.utility.inventory.{AutoCraftingManager, InventoryUtility} + +import scala.collection.JavaConversions._ + +/** + * Advanced crafting table that stores its crafting grid, can craft out of the player's inv, and be + * configed to auto craft. + * + * @author DarkGuardsman, Calclavia + */ +object TileEngineeringTable +{ + val CRAFTING_MATRIX_END: Int = 9 + val CRAFTING_OUTPUT_END: Int = CRAFTING_MATRIX_END + 1 + val PLAYER_OUTPUT_END: Int = CRAFTING_OUTPUT_END + 40 + val CENTER_SLOT: Int = 4 + val CRAFTING_OUTPUT_SLOT: Int = 0 + /** + * 9 slots for crafting, 1 slot for a output. + */ + val CRAFTING_MATRIX_SIZE: Int = 9 + val craftingSlots: Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8) + + @SideOnly(Side.CLIENT) private var iconTop: IIcon = null + @SideOnly(Side.CLIENT) private var iconFront: IIcon = null + @SideOnly(Side.CLIENT) private var iconSide: IIcon = null +} + +class TileEngineeringTable extends TileInventory(Material.wood) with IPacketReceiver with IRotatable with ISidedInventory with ISlotPickResult with IAutoCrafter +{ + + var craftingMatrix: Array[ItemStack] = new Array[ItemStack](TileEngineeringTable.CRAFTING_MATRIX_SIZE) + /** + * The output inventory containing slots. + */ + var outputInventory: Array[ItemStack] = new Array[ItemStack](1) + /** + * The ability for the engineering table to search nearby inventories. + */ + var searchInventories: Boolean = true + private var craftManager: AutoCraftingManager = null + /** + * Temporary player inventory stored to draw the player's items. + */ + private var invPlayer: InventoryPlayer = null + private var playerSlots: Array[Int] = null + + //Constructor + bounds(new Cuboid(0, 0, 0, 1, 0.9f, 1)) + isOpaqueCube(false) + itemBlock(classOf[ItemBlockSaved]) + + @SideOnly(Side.CLIENT) + override def getIcon(side: Int, meta: Int): IIcon = + { + return if (side == 1) TileEngineeringTable.iconTop else (if (side == meta) TileEngineeringTable.iconFront else TileEngineeringTable.iconSide) + } + + @SideOnly(Side.CLIENT) + override def registerIcons(iconRegister: IIconRegister) + { + TileEngineeringTable.iconTop = iconRegister.registerIcon(getTextureName + "_top") + TileEngineeringTable.iconFront = iconRegister.registerIcon(getTextureName + "_front") + TileEngineeringTable.iconSide = iconRegister.registerIcon(getTextureName + "_side") + } + + override def click(player: EntityPlayer) + { + if (!world.isRemote && ControlKeyModifer.isControlDown(player)) + { + { + var i: Int = 0 + while (i < getSizeInventory - 1) + { + { + if (getStackInSlot(i) != null) + { + InventoryUtility.dropItemStack(world, new Vector3(player), getStackInSlot(i)) + setInventorySlotContents(i, null) + } + } + ({ + i += 1; + i + }) + } + } + } + } + + override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean = + { + if (player.getCurrentEquippedItem != null && player.getCurrentEquippedItem.getItem.isInstanceOf[ItemHammer]) + { + for (slot <- 0 to TileEngineeringTable.CRAFTING_OUTPUT_END) + { + val inputStack: ItemStack = getStackInSlot(slot) + if (inputStack != null) + { + val oreName: String = OreDictionary.getOreName(OreDictionary.getOreID(inputStack)) + if (oreName != null && !(oreName == "Unknown")) + { + val outputs: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.CRUSHER.name, oreName) + if (outputs != null && outputs.length > 0) + { + if (!world.isRemote && world.rand.nextFloat < 0.2) + { + for (resource <- outputs) + { + val outputStack: ItemStack = resource.getItemStack.copy + if (outputStack != null) + { + InventoryUtility.dropItemStack(world, new Vector3(player), outputStack, 0) + setInventorySlotContents(slot, if (({ + inputStack.stackSize -= 1; + inputStack.stackSize + }) <= 0) null + else inputStack) + } + } + } + Electrodynamics.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Item.getIdFromItem(inputStack.getItem), 1) + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, Reference.prefix + "hammer", 0.5f, 0.8f + (0.2f * world.rand.nextFloat)) + player.addExhaustion(0.1f) + player.getCurrentEquippedItem.damageItem(1, player) + return true + } + } + } + } + return true + } + if (hitSide == 1) + { + if (!world.isRemote) + { + val hitVector: Vector3 = new Vector3(hit.x, 0, hit.z) + val regionLength: Double = 1d / 3d + + for (j <- 0 to 3) + { + for (k <- 0 to 3) + { + val check: Vector2 = new Vector2(j, k).multiply(regionLength) + if (check.distance(hitVector.toVector2) < regionLength) + { + val slotID: Int = j * 3 + k + interactCurrentItem(this, slotID, player) + onInventoryChanged + return true + } + } + } + onInventoryChanged + } + return true + } + else if (hitSide != 0) + { + if (!world.isRemote) + { + setPlayerInventory(player.inventory) + var output: ItemStack = getStackInSlot(9) + var firstLoop: Boolean = true + while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) + { + onPickUpFromSlot(player, 9, output) + if (output.stackSize > 0) + { + InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) + } + setInventorySlotContents(9, null) + onInventoryChanged + output = getStackInSlot(9) + firstLoop = false + } + setPlayerInventory(null) + } + return true + } + return false + } + + /** + * Creates a "fake inventory" and hook the player up to the crafter to use the player's items. + */ + def setPlayerInventory(invPlayer: InventoryPlayer) + { + if (searchInventories) + { + if (invPlayer != null) + { + playerSlots = new Array[Int](invPlayer.getSizeInventory) + + for (i <- 0 until playerSlots.length) + { + playerSlots(i) = i + TileEngineeringTable.CRAFTING_OUTPUT_END + + } + } + else + { + playerSlots = null + } + this.invPlayer = invPlayer + } + } + + def onPickUpFromSlot(entityPlayer: EntityPlayer, slotID: Int, itemStack: ItemStack) + { + if (!worldObj.isRemote) + { + if (itemStack != null) + { + val idealRecipeItem: Pair[ItemStack, Array[ItemStack]] = getCraftingManager.getIdealRecipe(itemStack) + if (idealRecipeItem != null) + { + getCraftingManager.consumeItems(idealRecipeItem.right.clone: _*) + } + else + { + itemStack.stackSize = 0 + } + } + } + } + + override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = + { + if (player.isSneaking) + { + searchInventories = !searchInventories + if (!world.isRemote) + { + if (searchInventories) + { + player.addChatMessage(new ChatComponentText(LanguageUtility.getLocal("engineerTable.config.inventory.true"))) + } + else + { + player.addChatMessage(new ChatComponentText(LanguageUtility.getLocal("engineerTable.config.inventory.false"))) + } + } + markUpdate + return true + } + return super.configure(player, side, hit) + } + + override def getDrops(metadata: Int, fortune: Int): ArrayList[ItemStack] = new ArrayList[ItemStack] + + override def onRemove(block: Block, par6: Int) + { + val stack: ItemStack = ItemBlockSaved.getItemStackWithNBT(block, world, xi, yi, zi) + InventoryUtility.dropItemStack(world, center, stack) + } + + override def canUpdate: Boolean = + { + return false + } + + override def getDescriptionPacket: Packet = + { + val nbt: NBTTagCompound = new NBTTagCompound + this.writeToNBT(nbt) + return ResonantEngine.packetHandler.toMCPacket(new PacketTile(this, nbt)) + } + + /** + * Writes a tile entity to NBT. + */ + override def writeToNBT(nbt: NBTTagCompound) + { + super.writeToNBT(nbt) + val nbtList: NBTTagList = new NBTTagList + + for (i <- 0 to this.getSizeInventory) + { + if (this.getStackInSlot(i) != null) + { + val var4: NBTTagCompound = new NBTTagCompound + var4.setByte("Slot", i.asInstanceOf[Byte]) + this.getStackInSlot(i).writeToNBT(var4) + nbtList.appendTag(var4) + } + } + nbt.setTag("Items", nbtList) + nbt.setBoolean("searchInventories", this.searchInventories) + } + + def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) + { + try + { + readFromNBT(ByteBufUtils.readTag(data)) + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } + + /** + * NBT Data + */ + override def readFromNBT(nbt: NBTTagCompound) + { + super.readFromNBT(nbt) + val nbtList: NBTTagList = nbt.getTagList("Items", 0) + this.craftingMatrix = new Array[ItemStack](9) + this.outputInventory = new Array[ItemStack](1) + + for (i <- 0 to nbtList.tagCount) + { + val stackTag: NBTTagCompound = nbtList.getCompoundTagAt(i) + val id: Byte = stackTag.getByte("Slot") + if (id >= 0 && id < this.getSizeInventory) + { + this.setInventorySlotContents(id, ItemStack.loadItemStackFromNBT(stackTag)) + } + } + + this.searchInventories = nbt.getBoolean("searchInventories") + } + + override def setInventorySlotContents(slot: Int, itemStack: ItemStack) + { + if (slot < TileEngineeringTable.CRAFTING_MATRIX_END) + { + craftingMatrix(slot) = itemStack + } + else if (slot < TileEngineeringTable.CRAFTING_OUTPUT_END) + { + outputInventory(slot - TileEngineeringTable.CRAFTING_MATRIX_END) = itemStack + } + else if (slot < TileEngineeringTable.PLAYER_OUTPUT_END && this.invPlayer != null) + { + this.invPlayer.setInventorySlotContents(slot - TileEngineeringTable.CRAFTING_OUTPUT_END, itemStack) + val player: EntityPlayer = this.invPlayer.player + if (player.isInstanceOf[EntityPlayerMP]) + { + (player.asInstanceOf[EntityPlayerMP]).sendContainerToPlayer(player.inventoryContainer) + } + } + else if (searchInventories) + { + var idDisplacement: Int = TileEngineeringTable.PLAYER_OUTPUT_END + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { + val tile: TileEntity = toVectorWorld.add(dir).getTileEntity + if (tile.isInstanceOf[IInventory]) + { + val inventory: IInventory = tile.asInstanceOf[IInventory] + val slotID: Int = slot - idDisplacement + if (slotID >= 0 && slotID < inventory.getSizeInventory) + { + inventory.setInventorySlotContents(slotID, itemStack) + } + idDisplacement += inventory.getSizeInventory + } + } + } + onInventoryChanged + } + + /** + * Updates all the output slots. Call this to update the Engineering Table. + */ + override def onInventoryChanged + { + if (worldObj != null) + { + if (!worldObj.isRemote) + { + this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = null + var didCraft: Boolean = false + val inventoryCrafting: InventoryCrafting = this.getCraftingMatrix + val matrixOutput: ItemStack = CraftingManager.getInstance.findMatchingRecipe(inventoryCrafting, this.worldObj) + if (matrixOutput != null && this.getCraftingManager.getIdealRecipe(matrixOutput) != null) + { + this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = matrixOutput + didCraft = true + } + if (!didCraft) + { + val filterStack: ItemStack = craftingMatrix(TileEngineeringTable.CENTER_SLOT) + if (filterStack != null && filterStack.getItem.isInstanceOf[ItemImprint]) + { + val filters: java.util.List[ItemStack] = ItemImprint.getFilters(filterStack) + for (o <- filters) + { + val outputStack: ItemStack = o + if (outputStack != null) + { + val idealRecipe: Pair[ItemStack, Array[ItemStack]] = this.getCraftingManager.getIdealRecipe(outputStack) + if (idealRecipe != null) + { + val recipeOutput: ItemStack = idealRecipe.left + if (recipeOutput != null & recipeOutput.stackSize > 0) + { + this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = recipeOutput + didCraft = true + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) + return + } + } + } + } + } + } + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) + } + } + } + + /** + * Gets the AutoCraftingManager that does all the crafting results + */ + def getCraftingManager: AutoCraftingManager = + { + if (craftManager == null) + { + craftManager = new AutoCraftingManager(this) + } + return craftManager + } + + /** + * Construct an InventoryCrafting Matrix on the fly. + * + * @return + */ + def getCraftingMatrix: InventoryCrafting = + { + val inventoryCrafting: InventoryCrafting = new InventoryCrafting(new ContainerDummy(this), 3, 3) + + for (i <- 0 until this.craftingMatrix.length) + { + inventoryCrafting.setInventorySlotContents(i, this.craftingMatrix(i)) + } + return inventoryCrafting + } + + override def getSizeInventory: Int = + { + return 10 + (if (this.invPlayer != null) this.invPlayer.getSizeInventory else 0) + } + + override def decrStackSize(i: Int, amount: Int): ItemStack = + { + if (getStackInSlot(i) != null) + { + var stack: ItemStack = null + if (getStackInSlot(i).stackSize <= amount) + { + stack = getStackInSlot(i) + setInventorySlotContents(i, null) + return stack + } + else + { + stack = getStackInSlot(i).splitStack(amount) + if (getStackInSlot(i).stackSize == 0) + { + setInventorySlotContents(i, null) + } + return stack + } + } + else + { + return null + } + } + + /** + * When some containers are closed they call this on each slot, then drop whatever it returns as + * an EntityItem - like when you close a workbench GUI. + */ + override def getStackInSlotOnClosing(slot: Int): ItemStack = + { + if (this.getStackInSlot(slot) != null) + { + val var2: ItemStack = this.getStackInSlot(slot) + this.setInventorySlotContents(slot, null) + return var2 + } + else + { + return null + } + } + + override def isItemValidForSlot(i: Int, itemstack: ItemStack): Boolean = + { + return true + } + + override def getInventoryStackLimit: Int = + { + return 64 + } + + override def isUseableByPlayer(entityplayer: EntityPlayer): Boolean = + { + return if (this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) ne this) false else entityplayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) <= 64.0D + } + + override def getAccessibleSlotsFromSide(side: Int): Array[Int] = + { + return new Array[Int](0) + } + + /** + * Auto-crafting methods. + */ + override def canInsertItem(slot: Int, itemstack: ItemStack, side: Int): Boolean = + { + if (getStackInSlot(4) != null && getStackInSlot(4).getItem.isInstanceOf[ItemImprint]) + { + return true + } + var minSize: Int = 64 + var optimalSlot: Int = -1 + + for (i <- 0 to craftingMatrix.length) + { + val checkStack: ItemStack = getStackInSlot(i) + if (checkStack != null && checkStack.isItemEqual(itemstack)) + { + if (checkStack.stackSize < minSize || optimalSlot < 0) + { + optimalSlot = i + minSize = checkStack.stackSize + } + } + } + return slot == optimalSlot + } + + override def canExtractItem(slot: Int, itemstack: ItemStack, side: Int): Boolean = + { + val outputStack: ItemStack = getStackInSlot(TileEngineeringTable.CRAFTING_MATRIX_END) + if (outputStack != null) + { + val idealRecipeItem: Pair[ItemStack, Array[ItemStack]] = this.getCraftingManager.getIdealRecipe(outputStack) + val doubleResults: Array[ItemStack] = ArrayUtils.addAll(idealRecipeItem.right, idealRecipeItem.right: _*) + if (!getCraftingManager.consumeItems(false, doubleResults: _*)) + { + return false + } + } + return slot == TileEngineeringTable.CRAFTING_MATRIX_END + } + + def getCraftingInv: Array[Int] = + { + var slots: Array[Int] = TileEngineeringTable.craftingSlots + if (playerSlots != null) + { + slots = ArrayUtils.addAll(playerSlots, slots: _*) + } + if (searchInventories) + { + var temporaryInvID: Int = TileEngineeringTable.PLAYER_OUTPUT_END + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { + val tile: TileEntity = toVectorWorld.add(dir).getTileEntity(worldObj) + if (tile.isInstanceOf[IInventory]) + { + val inventory: IInventory = tile.asInstanceOf[IInventory] + val nearbySlots: Array[Int] = new Array[Int](inventory.getSizeInventory) + + for (i <- 0 to inventory.getSizeInventory) + { + temporaryInvID = temporaryInvID + 1; + nearbySlots(i) = temporaryInvID; + + } + slots = ArrayUtils.addAll(nearbySlots, slots: _*) + } + } + } + return slots + } + + override def renderDynamic(position: Vector3, frame: Float, pass: Int) + { + GL11.glPushMatrix + RenderItemOverlayUtility.renderItemOnSides(TileEngineeringTable.this, getStackInSlot(9), position.x, position.y, position.z) + RenderItemOverlayUtility.renderTopOverlay(TileEngineeringTable.this, craftingMatrix, getDirection, position.x, position.y - 0.1, position.z) + GL11.glPopMatrix + } + + /** + * DO NOT USE THIS INTERNALLY. FOR EXTERNAL USE ONLY! + */ + override def getStackInSlot(slot: Int): ItemStack = + { + if (slot < TileEngineeringTable.CRAFTING_MATRIX_END) + { + return this.craftingMatrix(slot) + } + else if (slot < TileEngineeringTable.CRAFTING_OUTPUT_END) + { + return outputInventory(slot - TileEngineeringTable.CRAFTING_MATRIX_END) + } + else if (slot < TileEngineeringTable.PLAYER_OUTPUT_END && invPlayer != null) + { + return this.invPlayer.getStackInSlot(slot - TileEngineeringTable.CRAFTING_OUTPUT_END) + } + else if (searchInventories) + { + var idDisplacement: Int = TileEngineeringTable.PLAYER_OUTPUT_END + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { + val tile: TileEntity = toVectorWorld.add(dir).getTileEntity + if (tile.isInstanceOf[IInventory]) + { + val inventory: IInventory = tile.asInstanceOf[IInventory] + val slotID: Int = slot - idDisplacement + if (slotID >= 0 && slotID < inventory.getSizeInventory) + { + return inventory.getStackInSlot(slotID) + } + idDisplacement += inventory.getSizeInventory + } + } + } + return null + } + + override def getDirection: ForgeDirection = + { + return null + } + + override def setDirection(direction: ForgeDirection) + { + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/firebox/RenderHotPlate.scala b/src/main/scala/edx/basic/firebox/RenderHotPlate.scala new file mode 100644 index 000000000..dc445a5b6 --- /dev/null +++ b/src/main/scala/edx/basic/firebox/RenderHotPlate.scala @@ -0,0 +1,23 @@ +package edx.basic.firebox + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.client.renderer.RenderBlocks +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.render.RenderItemOverlayUtility + +@SideOnly(Side.CLIENT) class RenderHotPlate extends TileEntitySpecialRenderer +{ + private final val renderBlocks: RenderBlocks = new RenderBlocks + + def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) + { + if (tileEntity.isInstanceOf[TileHotPlate]) + { + val tile: TileHotPlate = tileEntity.asInstanceOf[TileHotPlate] + RenderItemOverlayUtility.renderTopOverlay(tileEntity, tile.getInventory.getContainedItems, ForgeDirection.EAST, 2, 2, x, y - 0.8, z, 1f) + } + } + +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.scala b/src/main/scala/edx/basic/firebox/TileFirebox.scala similarity index 99% rename from src/main/scala/resonantinduction/archaic/firebox/TileFirebox.scala rename to src/main/scala/edx/basic/firebox/TileFirebox.scala index a9e2bfbd9..f278bfbac 100644 --- a/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.scala +++ b/src/main/scala/edx/basic/firebox/TileFirebox.scala @@ -1,8 +1,9 @@ -package resonantinduction.archaic.firebox +package edx.basic.firebox import java.util.List import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister @@ -27,7 +28,6 @@ import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.FluidUtility import resonant.lib.wrapper.ByteBufWrapper._ import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.Reference /** * Meant to replace the furnace class. diff --git a/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.scala b/src/main/scala/edx/basic/firebox/TileHotPlate.scala similarity index 98% rename from src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.scala rename to src/main/scala/edx/basic/firebox/TileHotPlate.scala index 6bf481fbb..de02cd63f 100644 --- a/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.scala +++ b/src/main/scala/edx/basic/firebox/TileHotPlate.scala @@ -1,6 +1,7 @@ -package resonantinduction.archaic.firebox +package edx.basic.firebox import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister @@ -18,7 +19,6 @@ import resonant.lib.transform.region.Cuboid import resonant.lib.transform.vector.{Vector2, Vector3} import resonant.lib.wrapper.ByteBufWrapper._ import resonant.lib.wrapper.RandomWrapper._ -import resonantinduction.core.Reference /** * For smelting items. @@ -85,19 +85,7 @@ class TileHotPlate extends SpatialTile(Material.iron) with TInventory with TPack } } - def canRun: Boolean = - { - val tileEntity = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord) - - if (tileEntity.isInstanceOf[TileFirebox]) - { - if ((tileEntity.asInstanceOf[TileFirebox]).isBurning) - { - return true - } - } - return false - } + def canSmelt(stack: ItemStack): Boolean = stack != null && FurnaceRecipes.smelting.getSmeltingResult(stack) != null override def randomDisplayTick() { @@ -131,13 +119,13 @@ class TileHotPlate extends SpatialTile(Material.iron) with TInventory with TPack return smeltTime(i) } + override def getSizeInventory: Int = 4 + override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean = { return i < getSizeInventory && canSmelt(itemStack) } - def canSmelt(stack: ItemStack): Boolean = stack != null && FurnaceRecipes.smelting.getSmeltingResult(stack) != null - override def write(buf: ByteBuf, id: Int) { super.write(buf, id) @@ -154,8 +142,6 @@ class TileHotPlate extends SpatialTile(Material.iron) with TInventory with TPack (0 until getSizeInventory).foreach(i => nbt.setInteger("smeltTime" + i, smeltTime(i))) } - override def getSizeInventory: Int = 4 - override def read(buf: ByteBuf, id: Int, packetType: PacketType) { super.read(buf, id, packetType) @@ -189,6 +175,20 @@ class TileHotPlate extends SpatialTile(Material.iron) with TInventory with TPack return if (access.getBlockMetadata(xi, yi, zi) == 1) SpatialBlock.icon.get("electricHotPlate") else (if (canRun) SpatialBlock.icon.get("hotPlate_on") else SpatialBlock.icon.get(getTextureName)) } + def canRun: Boolean = + { + val tileEntity = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord) + + if (tileEntity.isInstanceOf[TileFirebox]) + { + if ((tileEntity.asInstanceOf[TileFirebox]).isBurning) + { + return true + } + } + return false + } + @SideOnly(Side.CLIENT) override def getIcon(side: Int, meta: Int): IIcon = { diff --git a/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.scala b/src/main/scala/edx/basic/fluid/grate/TileGrate.scala similarity index 98% rename from src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.scala rename to src/main/scala/edx/basic/fluid/grate/TileGrate.scala index d41b16726..bb337e326 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.scala +++ b/src/main/scala/edx/basic/fluid/grate/TileGrate.scala @@ -1,8 +1,11 @@ -package resonantinduction.archaic.fluid.grate +package edx.basic.fluid.grate import java.util.{Collections, Comparator, HashMap, PriorityQueue} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.fluid.grate.TileGrate._ +import edx.core.Reference +import edx.core.prefab.node.{NodeFluidPressure, TileFluidProvider} import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.entity.player.EntityPlayer @@ -15,9 +18,6 @@ import resonant.lib.mod.config.Config import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.FluidUtility -import resonantinduction.archaic.fluid.grate.TileGrate._ -import resonantinduction.core.Reference -import resonantinduction.core.prefab.node.{NodeFluidPressure, TileFluidProvider} object TileGrate { @@ -235,6 +235,29 @@ class TileGrate extends TileFluidProvider(Material.rock) with TRotatable } } + def isConnected(nCheck: Vector3): Boolean = + { + var check = nCheck + + if (check.equals(start)) + return true + + //Trace back in the navigation map to see if it reaches the starting point + do + { + check = navigationMap.get(check) + + if (check.equals(null)) + return false + + if (check.equals(start)) + return true + } + while (FluidUtility.getFluidFromBlock(TileGrate.this.worldObj, check) != null && fluidType.getID == FluidUtility.getFluidFromBlock(TileGrate.this.worldObj, check).getID) + + return false + } + def startDrain(start: Vector3): Boolean = { fluidType = null @@ -346,29 +369,6 @@ class TileGrate extends TileFluidProvider(Material.rock) with TRotatable } null } - - def isConnected(nCheck: Vector3): Boolean = - { - var check = nCheck - - if (check.equals(start)) - return true - - //Trace back in the navigation map to see if it reaches the starting point - do - { - check = navigationMap.get(check) - - if (check.equals(null)) - return false - - if (check.equals(start)) - return true - } - while (FluidUtility.getFluidFromBlock(TileGrate.this.worldObj, check) != null && fluidType.getID == FluidUtility.getFluidFromBlock(TileGrate.this.worldObj, check).getID) - - return false - } } class ComparableVector(var position: Vector3, var iterations: Int) extends Comparable[ComparableVector] diff --git a/src/main/scala/resonantinduction/archaic/fluid/gutter/NodeFluidGravity.scala b/src/main/scala/edx/basic/fluid/gutter/NodeFluidGravity.scala similarity index 92% rename from src/main/scala/resonantinduction/archaic/fluid/gutter/NodeFluidGravity.scala rename to src/main/scala/edx/basic/fluid/gutter/NodeFluidGravity.scala index 520987f00..cb9b35113 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/gutter/NodeFluidGravity.scala +++ b/src/main/scala/edx/basic/fluid/gutter/NodeFluidGravity.scala @@ -1,8 +1,8 @@ -package resonantinduction.archaic.fluid.gutter +package edx.basic.fluid.gutter +import edx.core.prefab.node.{NodeFluidPressure, TileFluidProvider} import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.FluidContainerRegistry -import resonantinduction.core.prefab.node.{NodeFluidPressure, TileFluidProvider} /** * A node for fluid that follows pressure and gravity. diff --git a/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.scala b/src/main/scala/edx/basic/fluid/gutter/TileGutter.scala similarity index 97% rename from src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.scala rename to src/main/scala/edx/basic/fluid/gutter/TileGutter.scala index 5e6d83d21..85546c55d 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.scala +++ b/src/main/scala/edx/basic/fluid/gutter/TileGutter.scala @@ -1,8 +1,11 @@ -package resonantinduction.archaic.fluid.gutter +package edx.basic.fluid.gutter import java.util.{ArrayList, List} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.fluid.tank.TileTank +import edx.core.Reference +import edx.core.prefab.node.{NodeFluidPressure, TileFluidProvider} import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.entity.Entity @@ -23,9 +26,6 @@ import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.FluidUtility import resonant.lib.utility.inventory.InventoryUtility import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.archaic.fluid.tank.TileTank -import resonantinduction.core.Reference -import resonantinduction.core.prefab.node.{NodeFluidPressure, TileFluidProvider} import scala.collection.convert.wrapAll._ @@ -215,34 +215,6 @@ class TileGutter extends TileFluidProvider(Material.rock) render(0, 0x0) } - override def renderDynamic(pos: Vector3, frame: Float, pass: Int) - { - GL11.glPushMatrix() - GL11.glTranslated(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5) - - render(0, clientRenderMask) - - if (world != null) - { - val tank: IFluidTank = fluidNode - val percentageFilled = tank.getFluidAmount / tank.getCapacity.toDouble - - if (percentageFilled > 0.1) - { - GL11.glPushMatrix() - GL11.glScaled(0.99, 0.99, 0.99) - val ySouthEast = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.SOUTH, ForgeDirection.EAST) - val yNorthEast = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.NORTH, ForgeDirection.EAST) - val ySouthWest = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.SOUTH, ForgeDirection.WEST) - val yNorthWest = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.NORTH, ForgeDirection.WEST) - FluidRenderUtility.renderFluidTesselation(tank, ySouthEast, yNorthEast, ySouthWest, yNorthWest) - GL11.glPopMatrix() - } - } - - GL11.glPopMatrix() - } - def render(meta: Int, sides: Int) { RenderUtility.bind(TileGutter.texture) @@ -277,6 +249,34 @@ class TileGutter extends TileFluidProvider(Material.rock) } } + override def renderDynamic(pos: Vector3, frame: Float, pass: Int) + { + GL11.glPushMatrix() + GL11.glTranslated(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5) + + render(0, clientRenderMask) + + if (world != null) + { + val tank: IFluidTank = fluidNode + val percentageFilled = tank.getFluidAmount / tank.getCapacity.toDouble + + if (percentageFilled > 0.1) + { + GL11.glPushMatrix() + GL11.glScaled(0.99, 0.99, 0.99) + val ySouthEast = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.SOUTH, ForgeDirection.EAST) + val yNorthEast = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.NORTH, ForgeDirection.EAST) + val ySouthWest = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.SOUTH, ForgeDirection.WEST) + val yNorthWest = FluidUtility.getAveragePercentageFilledForSides(classOf[TileGutter], percentageFilled, world, toVectorWorld, ForgeDirection.NORTH, ForgeDirection.WEST) + FluidRenderUtility.renderFluidTesselation(tank, ySouthEast, yNorthEast, ySouthWest, yNorthWest) + GL11.glPopMatrix() + } + } + + GL11.glPopMatrix() + } + //Recurse through all gutter blocks private def findGutters(traverse: Set[NodeGutter] = Set(fluidNode.asInstanceOf[NodeGutter])): Set[NodeGutter] = { diff --git a/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.scala b/src/main/scala/edx/basic/fluid/tank/ItemBlockTank.scala similarity index 99% rename from src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.scala rename to src/main/scala/edx/basic/fluid/tank/ItemBlockTank.scala index 6a5b2d4c0..dd29fc5d6 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.scala +++ b/src/main/scala/edx/basic/fluid/tank/ItemBlockTank.scala @@ -1,4 +1,4 @@ -package resonantinduction.archaic.fluid.tank +package edx.basic.fluid.tank import java.util.List @@ -9,9 +9,9 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.tileentity.TileEntity import net.minecraft.world.World import net.minecraftforge.fluids.{FluidContainerRegistry, FluidStack, IFluidContainerItem} +import resonant.lib.utility.LanguageUtility import resonant.lib.utility.science.UnitDisplay import resonant.lib.utility.science.UnitDisplay.Unit -import resonant.lib.utility.LanguageUtility import resonant.lib.wrapper.WrapList._ /** @@ -41,15 +41,6 @@ class ItemBlockTank(block: Block) extends ItemBlock(block: Block) with IFluidCon } } - def getFluid(container: ItemStack): FluidStack = - { - if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("fluid")) - { - return null - } - return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("fluid")) - } - override def getItemStackLimit(stack: ItemStack): Int = { if (stack.getTagCompound != null && stack.getTagCompound.hasKey("fluid")) @@ -83,6 +74,15 @@ class ItemBlockTank(block: Block) extends ItemBlock(block: Block) with IFluidCon return false } + def getFluid(container: ItemStack): FluidStack = + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("fluid")) + { + return null + } + return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("fluid")) + } + def fill(container: ItemStack, resource: FluidStack, doFill: Boolean): Int = { if (resource == null) diff --git a/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.scala b/src/main/scala/edx/basic/fluid/tank/TileTank.scala similarity index 93% rename from src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.scala rename to src/main/scala/edx/basic/fluid/tank/TileTank.scala index 5c03769f0..5801e5bb4 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.scala +++ b/src/main/scala/edx/basic/fluid/tank/TileTank.scala @@ -1,9 +1,13 @@ -package resonantinduction.archaic.fluid.tank +package edx.basic.fluid.tank import java.awt.Color import java.util.{ArrayList, List} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.BasicContent +import edx.basic.fluid.gutter.NodeFluidGravity +import edx.core.Reference +import edx.core.prefab.node.TileFluidProvider import net.minecraft.block.material.Material import net.minecraft.client.renderer.RenderBlocks import net.minecraft.entity.player.EntityPlayer @@ -14,18 +18,14 @@ import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids._ import org.lwjgl.opengl.GL11 import resonant.api.tile.IRemovable -import IRemovable.ISneakPickup +import resonant.api.tile.IRemovable.ISneakPickup import resonant.api.tile.node.INode import resonant.lib.grid.node.Node import resonant.lib.render.block.RenderConnectedTexture -import resonant.lib.render.{RenderBlockUtility, FluidRenderUtility, RenderUtility} +import resonant.lib.render.{FluidRenderUtility, RenderBlockUtility, RenderUtility} import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.FluidUtility import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.archaic.ArchaicContent -import resonantinduction.archaic.fluid.gutter.NodeFluidGravity -import resonantinduction.core.Reference -import resonantinduction.core.prefab.node.TileFluidProvider /** * Tile/Block class for basic Dynamic tanks @@ -52,7 +52,7 @@ class TileTank extends TileFluidProvider(Material.iron) with ISneakPickup with R fluidNode.asInstanceOf[NodeFluidGravity].maxFlowRate = FluidContainerRegistry.BUCKET_VOLUME fluidNode.asInstanceOf[NodeFluidGravity].doPressureUpdate = false - fluidNode.onFluidChanged = () => if(!world.isRemote) sendPacket(1) + fluidNode.onFluidChanged = () => if (!world.isRemote) sendPacket(1) override def shouldSideBeRendered(access: IBlockAccess, x: Int, y: Int, z: Int, side: Int): Boolean = new Vector3(x, y, z).getBlock(access) != block @@ -174,7 +174,7 @@ class TileTank extends TileFluidProvider(Material.iron) with ISneakPickup with R def getRemovedItems(entity: EntityPlayer): List[ItemStack] = { val drops = new ArrayList[ItemStack] - val itemStack: ItemStack = new ItemStack(ArchaicContent.blockTank, 1, 0) + val itemStack: ItemStack = new ItemStack(BasicContent.blockTank, 1, 0) if (itemStack != null) { if (fluidNode != null && fluidNode.getFluid != null) diff --git a/src/main/scala/edx/basic/process/RenderCastingMold.scala b/src/main/scala/edx/basic/process/RenderCastingMold.scala new file mode 100644 index 000000000..1788cc3a5 --- /dev/null +++ b/src/main/scala/edx/basic/process/RenderCastingMold.scala @@ -0,0 +1,38 @@ +package edx.basic.process + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.{RenderItemOverlayUtility, RenderUtility} + +@SideOnly(Side.CLIENT) object RenderCastingMold +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "castingMold.tcn")) + var INSTANCE: RenderCastingMold = new RenderCastingMold +} + +@SideOnly(Side.CLIENT) class RenderCastingMold extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) + { + if (tileEntity.isInstanceOf[TileCastingMold]) + { + val tile: TileCastingMold = tileEntity.asInstanceOf[TileCastingMold] + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + GL11.glTranslated(0, -0.25, 0) + GL11.glScalef(0.5f, 0.5f, 0.5f) + RenderUtility.bind(Reference.domain, Reference.modelPath + "castingMold.png") + RenderCastingMold.MODEL.renderAll + GL11.glPopMatrix + if (tile.getWorldObj != null) + { + RenderItemOverlayUtility.renderItemOnSides(tileEntity, tile.getStackInSlot(0), x, y, z, "") + } + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/process/RenderMillstone.scala b/src/main/scala/edx/basic/process/RenderMillstone.scala new file mode 100644 index 000000000..313596cf1 --- /dev/null +++ b/src/main/scala/edx/basic/process/RenderMillstone.scala @@ -0,0 +1,23 @@ +package edx.basic.process + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.client.renderer.RenderBlocks +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import resonant.lib.render.RenderItemOverlayUtility + +@SideOnly(Side.CLIENT) +class RenderMillstone extends TileEntitySpecialRenderer +{ + private final val renderBlocks: RenderBlocks = new RenderBlocks + + def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) + { + if (tileEntity.isInstanceOf[TileMillstone]) + { + val tile: TileMillstone = tileEntity.asInstanceOf[TileMillstone] + RenderItemOverlayUtility.renderItemOnSides(tileEntity, tile.getStackInSlot(0), x, y, z, "") + } + } + +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/process/TileCastingMold.scala b/src/main/scala/edx/basic/process/TileCastingMold.scala new file mode 100644 index 000000000..b14aaff46 --- /dev/null +++ b/src/main/scala/edx/basic/process/TileCastingMold.scala @@ -0,0 +1,165 @@ +package edx.basic.process + +import cpw.mods.fml.common.network.ByteBufUtils +import edx.core.Reference +import io.netty.buffer.ByteBuf +import net.minecraft.block.material.Material +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.ForgeDirection +import net.minecraftforge.fluids._ +import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} +import resonant.lib.network.discriminator.{PacketTile, PacketType} +import resonant.lib.network.handle.IPacketReceiver +import resonant.lib.prefab.tile.TileInventory +import resonant.lib.transform.vector.Vector3 +import resonant.lib.utility.FluidUtility +import resonant.lib.utility.inventory.InventoryUtility + +/** + * Turns molten fuilds into ingots. + *

+ * 1 cubed meter of molten fluid = 1 block + * Approximately 100-110 L of fluid = 1 ingot. + + * @author Calclavia + */ +class TileCastingMold extends TileInventory(Material.rock) with IFluidHandler with IPacketReceiver +{ + private final val amountPerIngot: Int = 100 + protected var tank: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME) + + //Constructor + setTextureName(Reference.prefix + "material_metal_side") + normalRender = false + isOpaqueCube = false + + override def canUpdate: Boolean = + { + return false + } + + override def getDescPacket: PacketTile = + { + val nbt: NBTTagCompound = new NBTTagCompound + this.writeToNBT(nbt) + return new PacketTile(this, nbt) + } + + override def writeToNBT(tag: NBTTagCompound) + { + super.writeToNBT(tag) + tank.readFromNBT(tag) + } + + def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) + { + try + { + this.readFromNBT(ByteBufUtils.readTag(data)) + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } + + override def readFromNBT(tag: NBTTagCompound) + { + super.readFromNBT(tag) + tank.writeToNBT(tag) + } + + def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = + { + val fill: Int = tank.fill(resource, doFill) + updateEntity + return fill + } + + def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = + { + return null + } + + def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = + { + return null + } + + def canFill(from: ForgeDirection, fluid: Fluid): Boolean = + { + return fluid != null && fluid.getName.contains("molten") + } + + def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = + { + return false + } + + def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = + { + return Array[FluidTankInfo](tank.getInfo) + } + + override def click(player: EntityPlayer) + { + if (!world.isRemote) + { + val output: ItemStack = getStackInSlot(0) + if (output != null) + { + InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) + setInventorySlotContents(0, null) + } + onInventoryChanged + } + } + + override def onInventoryChanged + { + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) + } + } + + override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean = + { + update + val current: ItemStack = player.inventory.getCurrentItem + val output: ItemStack = getStackInSlot(0) + if (output != null) + { + InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) + setInventorySlotContents(0, null) + } + return true + } + + override def update + { + val checkPos: Vector3 = toVector3.add(0, 1, 0) + val drainStack: FluidStack = FluidUtility.drainBlock(worldObj, checkPos, false) + if (MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, drainStack).length > 0) + { + if (drainStack.amount == tank.fill(drainStack, false)) + { + tank.fill(FluidUtility.drainBlock(worldObj, checkPos, true), true) + } + } + while (tank.getFluidAmount >= amountPerIngot && (getStackInSlot(0) == null || getStackInSlot(0).stackSize < getStackInSlot(0).getMaxStackSize)) + { + val outputs: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, tank.getFluid) + for (output <- outputs) + { + incrStackSize(0, output.getItemStack) + } + tank.drain(amountPerIngot, true) + } + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/process/TileMillstone.scala b/src/main/scala/edx/basic/process/TileMillstone.scala similarity index 96% rename from src/main/scala/resonantinduction/archaic/process/TileMillstone.scala rename to src/main/scala/edx/basic/process/TileMillstone.scala index 1742a29cd..3774fc906 100644 --- a/src/main/scala/resonantinduction/archaic/process/TileMillstone.scala +++ b/src/main/scala/edx/basic/process/TileMillstone.scala @@ -1,6 +1,8 @@ -package resonantinduction.archaic.process +package edx.basic.process import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.mechanical.mech.gear.ItemHandCrank import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister @@ -16,8 +18,6 @@ import resonant.lib.prefab.tile.spatial.SpatialBlock import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.inventory.InventoryUtility import resonant.lib.wrapper.ByteBufWrapper._ -import resonantinduction.core.Reference -import resonantinduction.mechanical.mech.gear.ItemHandCrank class TileMillstone extends TileInventory(Material.rock) with TPacketSender with TPacketReceiver { diff --git a/src/main/scala/resonantinduction/archaic/process/TileWorkbench.scala b/src/main/scala/edx/basic/process/TileWorkbench.scala similarity index 93% rename from src/main/scala/resonantinduction/archaic/process/TileWorkbench.scala rename to src/main/scala/edx/basic/process/TileWorkbench.scala index 80529bda1..8dc447dfe 100644 --- a/src/main/scala/resonantinduction/archaic/process/TileWorkbench.scala +++ b/src/main/scala/edx/basic/process/TileWorkbench.scala @@ -1,5 +1,7 @@ -package resonantinduction.archaic.process +package edx.basic.process +import edx.basic.engineering.ItemHammer +import edx.core.{Electrodynamics, Reference} import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -19,8 +21,6 @@ import resonant.lib.render.{RenderItemOverlayUtility, RenderUtility} import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.inventory.InventoryUtility import resonant.lib.wrapper.ByteBufWrapper._ -import resonantinduction.archaic.engineering.ItemHammer -import resonantinduction.core.{Reference, ResonantInduction} /** * The workbench is meant for manual ore and wood processing. @@ -90,7 +90,7 @@ class TileWorkbench extends SpatialTile(Material.wood) with TInventory with TPac tryOutput(RecipeType.GRINDER.name, 0.05f) } - ResonantInduction.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Item.getIdFromItem(inputStack.getItem), 1) + Electrodynamics.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Item.getIdFromItem(inputStack.getItem), 1) world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, Reference.prefix + "hammer", 0.5f, 0.8f + (0.2f * world.rand.nextFloat)) player.addExhaustion(0.1f) player.getCurrentEquippedItem.damageItem(1, player) diff --git a/src/main/scala/resonantinduction/archaic/process/mixing/ItemGlassJar.scala b/src/main/scala/edx/basic/process/mixing/ItemGlassJar.scala similarity index 91% rename from src/main/scala/resonantinduction/archaic/process/mixing/ItemGlassJar.scala rename to src/main/scala/edx/basic/process/mixing/ItemGlassJar.scala index 3b23f91bf..54ac7c101 100644 --- a/src/main/scala/resonantinduction/archaic/process/mixing/ItemGlassJar.scala +++ b/src/main/scala/edx/basic/process/mixing/ItemGlassJar.scala @@ -1,5 +1,6 @@ -package resonantinduction.archaic.process.mixing +package edx.basic.process.mixing +import edx.core.resource.alloy.{Alloy, TAlloyItem} import net.minecraft.block.Block import net.minecraft.entity.Entity import net.minecraft.entity.player.EntityPlayer @@ -8,7 +9,6 @@ import net.minecraft.world.World import resonant.lib.prefab.tile.item.ItemBlockSaved import resonant.lib.transform.vector.{IVector3, Vector3} import resonant.lib.utility.nbt.NBTUtility -import resonantinduction.core.resource.alloy.{Alloy, TAlloyItem} /** * The ItemBlock for the glass jar diff --git a/src/main/scala/resonantinduction/archaic/process/mixing/TileGlassJar.scala b/src/main/scala/edx/basic/process/mixing/TileGlassJar.scala similarity index 94% rename from src/main/scala/resonantinduction/archaic/process/mixing/TileGlassJar.scala rename to src/main/scala/edx/basic/process/mixing/TileGlassJar.scala index c24dafab6..18497495e 100644 --- a/src/main/scala/resonantinduction/archaic/process/mixing/TileGlassJar.scala +++ b/src/main/scala/edx/basic/process/mixing/TileGlassJar.scala @@ -1,9 +1,13 @@ -package resonantinduction.archaic.process.mixing +package edx.basic.process.mixing import java.awt.Color import java.util.ArrayList import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.BasicContent +import edx.core.Reference +import edx.core.resource.alloy.{Alloy, AlloyUtility} +import edx.core.resource.content.{ItemDust, ItemRefinedDust} import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -28,10 +32,6 @@ import resonant.lib.transform.vector.{Vector3, VectorWorld} import resonant.lib.utility.inventory.InventoryUtility import resonant.lib.utility.nbt.NBTUtility import resonant.lib.wrapper.ByteBufWrapper._ -import resonantinduction.archaic.ArchaicContent -import resonantinduction.core.Reference -import resonantinduction.core.resource.alloy.{Alloy, AlloyUtility} -import resonantinduction.core.resource.content.{ItemDust, ItemRefinedDust} /** * A glass jar for mixing different dusts/refined together. @@ -215,7 +215,7 @@ class TileGlassJar extends SpatialTile(Material.wood) with TPacketReceiver with else if (mixed) { //Eject dust - InventoryUtility.dropItemStack(new VectorWorld(player), AlloyUtility.setAlloy(new ItemStack(ArchaicContent.itemAlloyDust, alloy.size), alloy)) + InventoryUtility.dropItemStack(new VectorWorld(player), AlloyUtility.setAlloy(new ItemStack(BasicContent.itemAlloyDust, alloy.size), alloy)) alloy = new Alloy(8) mixed = false sendDescPacket() diff --git a/src/main/scala/edx/basic/waila/Waila.scala b/src/main/scala/edx/basic/waila/Waila.scala new file mode 100644 index 000000000..9d97818a2 --- /dev/null +++ b/src/main/scala/edx/basic/waila/Waila.scala @@ -0,0 +1,30 @@ +package edx.basic.waila + +import cpw.mods.fml.common.event.FMLInterModComms +import resonant.lib.mod.compat.Mods +import resonant.lib.mod.loadable.ICompatProxy + +/** + * @author tgame14 + * @since 21/03/14 + */ +class Waila extends ICompatProxy +{ + def preInit + { + } + + def init + { + FMLInterModComms.sendMessage(Mods.WAILA, "register", "resonantinduction.archaic.waila.WailaRegistrar.wailaCallBack") + } + + def postInit + { + } + + def modId: String = + { + return Mods.WAILA + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/waila/WailaCrate.scala b/src/main/scala/edx/basic/waila/WailaCrate.scala new file mode 100644 index 000000000..bc39d6f85 --- /dev/null +++ b/src/main/scala/edx/basic/waila/WailaCrate.scala @@ -0,0 +1,52 @@ +package edx.basic.waila + +import java.util.List + +import edx.basic.crate.TileCrate +import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor, IWailaDataProvider} +import net.minecraft.item.ItemStack +import net.minecraft.tileentity.TileEntity +import resonant.lib.utility.LanguageUtility + +/** + * Waila support for crates + * + * @author Darkguardsman + */ +class WailaCrate extends IWailaDataProvider +{ + override def getWailaBody(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + val tile: TileEntity = accessor.getTileEntity + if (tile.isInstanceOf[TileCrate]) + { + val stored: ItemStack = (tile.asInstanceOf[TileCrate]).getSampleStack + val cap: Int = (tile.asInstanceOf[TileCrate]).getSlotCount * 64 + if (stored != null) + { + currenttip.add(LanguageUtility.getLocal("info.waila.crate.stack") + " " + stored.getDisplayName) + currenttip.add(LanguageUtility.getLocal("info.waila.crate.stored") + " " + stored.stackSize + " / " + cap) + } + else + { + currenttip.add(LanguageUtility.getLocal("info.waila.crate.empty")) + } + } + return currenttip + } + + override def getWailaHead(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + return currenttip + } + + override def getWailaStack(accessor: IWailaDataAccessor, config: IWailaConfigHandler): ItemStack = + { + return null + } + + override def getWailaTail(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + return currenttip + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/waila/WailaFluidTank.scala b/src/main/scala/edx/basic/waila/WailaFluidTank.scala new file mode 100644 index 000000000..9b630c969 --- /dev/null +++ b/src/main/scala/edx/basic/waila/WailaFluidTank.scala @@ -0,0 +1,48 @@ +package edx.basic.waila + +import java.util.List + +import edx.basic.fluid.tank.TileTank +import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor, IWailaDataProvider} +import net.minecraft.item.ItemStack +import net.minecraft.tileentity.TileEntity +import net.minecraftforge.fluids.IFluidTank +import resonant.lib.utility.LanguageUtility + +/** + * Waila support for tanks + * + * @author Darkguardsman + */ +class WailaFluidTank extends IWailaDataProvider +{ + override def getWailaBody(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + val tile: TileEntity = accessor.getTileEntity + if (tile.isInstanceOf[TileTank]) + { + val tank: IFluidTank = tile.asInstanceOf[TileTank].fluidNode + if (tank != null && tank.getFluid != null) + { + currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid.getFluid.getLocalizedName) + currenttip.add(LanguageUtility.getLocal("info.waila.tank.vol") + " " + tank.getFluidAmount + " / " + tank.getCapacity) + } + } + return currenttip + } + + override def getWailaHead(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + return currenttip + } + + override def getWailaStack(accessor: IWailaDataAccessor, config: IWailaConfigHandler): ItemStack = + { + return null + } + + override def getWailaTail(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = + { + return currenttip + } +} \ No newline at end of file diff --git a/src/main/scala/edx/basic/waila/WailaRegistrar.scala b/src/main/scala/edx/basic/waila/WailaRegistrar.scala new file mode 100644 index 000000000..e7fbc34be --- /dev/null +++ b/src/main/scala/edx/basic/waila/WailaRegistrar.scala @@ -0,0 +1,14 @@ +package edx.basic.waila + +import edx.basic.crate.TileCrate +import edx.basic.fluid.tank.TileTank +import mcp.mobius.waila.api.IWailaRegistrar + +object WailaRegistrar +{ + def wailaCallBack(registrar: IWailaRegistrar) + { + registrar.registerBodyProvider(new WailaCrate, classOf[TileCrate]) + registrar.registerBodyProvider(new WailaFluidTank, classOf[TileTank]) + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/ClientProxy.scala b/src/main/scala/edx/core/ClientProxy.scala similarity index 77% rename from src/main/scala/resonantinduction/core/ClientProxy.scala rename to src/main/scala/edx/core/ClientProxy.scala index 35ce61422..1ac16f5c0 100644 --- a/src/main/scala/resonantinduction/core/ClientProxy.scala +++ b/src/main/scala/edx/core/ClientProxy.scala @@ -1,4 +1,4 @@ -package resonantinduction.core +package edx.core import java.awt.Color @@ -6,6 +6,30 @@ import codechicken.multipart.{TMultiPart, TileMultipart} import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.client.registry.{ClientRegistry, RenderingRegistry} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.BasicContent +import edx.basic.firebox.{RenderHotPlate, TileHotPlate} +import edx.basic.process.mixing.TileGlassJar +import edx.basic.process.{RenderCastingMold, RenderMillstone, TileCastingMold, TileMillstone} +import edx.electrical.ElectricalContent +import edx.electrical.multimeter.{GuiMultimeter, PartMultimeter, RenderMultimeter} +import edx.electrical.tesla.{RenderTesla, TileTesla} +import edx.electrical.transformer.RenderTransformer +import edx.mechanical.MechanicalContent +import edx.mechanical.fluid.pipe.RenderPipe +import edx.mechanical.mech.gear.RenderGear +import edx.mechanical.mech.gearshaft.RenderGearShaft +import edx.mechanical.mech.process.crusher.{RenderMechanicalPiston, TileMechanicalPiston} +import edx.mechanical.mech.turbine._ +import edx.quantum.gate.RenderQuantumGlyph +import edx.quantum.laser.fx.{EntityBlockParticleFX, EntityLaserFX, EntityScorchFX} +import edx.quantum.machine.accelerator.{EntityParticle, GuiAccelerator, RenderParticle, TileAccelerator} +import edx.quantum.machine.boiler.{GuiNuclearBoiler, RenderNuclearBoiler, TileNuclearBoiler} +import edx.quantum.machine.centrifuge.{GuiCentrifuge, RenderCentrifuge, TileCentrifuge} +import edx.quantum.machine.extractor.{GuiChemicalExtractor, RenderChemicalExtractor, TileChemicalExtractor} +import edx.quantum.machine.plasma.{RenderPlasmaHeater, TilePlasmaHeater} +import edx.quantum.machine.quantum.{GuiQuantumAssembler, RenderQuantumAssembler, TileQuantumAssembler} +import edx.quantum.machine.reactor.{GuiReactorCell, RenderReactorCell, TileReactorCell} +import edx.quantum.machine.thermometer.{RenderThermometer, TileThermometer} import net.minecraft.block.Block import net.minecraft.client.gui.GuiScreen import net.minecraft.client.particle.{EntityDiggingFX, EntityFX} @@ -16,30 +40,6 @@ import net.minecraft.world.World import resonant.lib.render.fx.FXElectricBolt2 import resonant.lib.render.wrapper.ItemRenderHandler import resonant.lib.transform.vector.Vector3 -import resonantinduction.archaic.ArchaicContent -import resonantinduction.archaic.firebox.{RenderHotPlate, TileHotPlate} -import resonantinduction.archaic.process.mixing.TileGlassJar -import resonantinduction.archaic.process.{RenderCastingMold, RenderMillstone, TileCastingMold, TileMillstone} -import resonantinduction.atomic.gate.RenderQuantumGlyph -import resonantinduction.atomic.machine.accelerator.{EntityParticle, GuiAccelerator, RenderParticle, TileAccelerator} -import resonantinduction.atomic.machine.boiler.{GuiNuclearBoiler, RenderNuclearBoiler, TileNuclearBoiler} -import resonantinduction.atomic.machine.centrifuge.{GuiCentrifuge, RenderCentrifuge, TileCentrifuge} -import resonantinduction.atomic.machine.extractor.{GuiChemicalExtractor, RenderChemicalExtractor, TileChemicalExtractor} -import resonantinduction.atomic.machine.plasma.{RenderPlasmaHeater, TilePlasmaHeater} -import resonantinduction.atomic.machine.quantum.{GuiQuantumAssembler, RenderQuantumAssembler, TileQuantumAssembler} -import resonantinduction.atomic.machine.reactor.{GuiReactorCell, RenderReactorCell, TileReactorCell} -import resonantinduction.atomic.machine.thermometer.{RenderThermometer, TileThermometer} -import resonantinduction.electrical.ElectricalContent -import resonantinduction.electrical.laser.fx.{EntityBlockParticleFX, EntityLaserFX, EntityScorchFX} -import resonantinduction.electrical.multimeter.{GuiMultimeter, PartMultimeter, RenderMultimeter} -import resonantinduction.electrical.tesla.{RenderTesla, TileTesla} -import resonantinduction.electrical.transformer.RenderTransformer -import resonantinduction.mechanical.MechanicalContent -import resonantinduction.mechanical.fluid.pipe.RenderPipe -import resonantinduction.mechanical.mech.gear.RenderGear -import resonantinduction.mechanical.mech.gearshaft.RenderGearShaft -import resonantinduction.mechanical.mech.process.crusher.{RenderMechanicalPiston, TileMechanicalPiston} -import resonantinduction.mechanical.mech.turbine._ /** @author Calclavia */ @SideOnly(Side.CLIENT) class ClientProxy extends CommonProxy @@ -52,7 +52,7 @@ import resonantinduction.mechanical.mech.turbine._ override def init() { //Mech content TODO no-load if mech content is not loaded - ItemRenderHandler.register(Item.getItemFromBlock(ArchaicContent.blockJar), new TileGlassJar) + ItemRenderHandler.register(Item.getItemFromBlock(BasicContent.blockJar), new TileGlassJar) ItemRenderHandler.register(MechanicalContent.itemGear, RenderGear) ItemRenderHandler.register(MechanicalContent.itemGearShaft, RenderGearShaft) ItemRenderHandler.register(MechanicalContent.itemPipe, RenderPipe) diff --git a/src/main/scala/edx/core/CommonProxy.scala b/src/main/scala/edx/core/CommonProxy.scala new file mode 100644 index 000000000..5d8f2a23e --- /dev/null +++ b/src/main/scala/edx/core/CommonProxy.scala @@ -0,0 +1,137 @@ +package edx.core + +import java.awt._ + +import codechicken.multipart.{TMultiPart, TileMultipart} +import edx.electrical.multimeter.{ContainerMultimeter, PartMultimeter} +import edx.quantum.machine.accelerator.{ContainerAccelerator, TileAccelerator} +import edx.quantum.machine.boiler.{ContainerNuclearBoiler, TileNuclearBoiler} +import edx.quantum.machine.centrifuge.{ContainerCentrifuge, TileCentrifuge} +import edx.quantum.machine.extractor.{ContainerChemicalExtractor, TileChemicalExtractor} +import edx.quantum.machine.quantum.{ContainerQuantumAssembler, TileQuantumAssembler} +import edx.quantum.machine.reactor.{ContainerReactorCell, TileReactorCell} +import net.minecraft.block.Block +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.tileentity.TileEntity +import net.minecraft.world.World +import resonant.lib.mod.AbstractProxy +import resonant.lib.transform.vector.Vector3 + +/** + * @author Calclavia + */ +class CommonProxy extends AbstractProxy +{ + def getArmorIndex(armor: String): Int = + { + return 0 + } + + override def getServerGuiElement(id: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): AnyRef = + { + val tileEntity: TileEntity = world.getTileEntity(x, y, z) + if (tileEntity.isInstanceOf[TileMultipart]) + { + val part: TMultiPart = (tileEntity.asInstanceOf[TileMultipart]).partMap(id) + if (part.isInstanceOf[PartMultimeter]) + { + return new ContainerMultimeter(player.inventory, (part.asInstanceOf[PartMultimeter])) + } + } + else if (tileEntity.isInstanceOf[TileCentrifuge]) + { + return new ContainerCentrifuge(player.inventory, (tileEntity.asInstanceOf[TileCentrifuge])) + } + else if (tileEntity.isInstanceOf[TileChemicalExtractor]) + { + return new ContainerChemicalExtractor(player.inventory, (tileEntity.asInstanceOf[TileChemicalExtractor])) + } + else if (tileEntity.isInstanceOf[TileAccelerator]) + { + return new ContainerAccelerator(player, (tileEntity.asInstanceOf[TileAccelerator])) + } + else if (tileEntity.isInstanceOf[TileQuantumAssembler]) + { + return new ContainerQuantumAssembler(player.inventory, (tileEntity.asInstanceOf[TileQuantumAssembler])) + } + else if (tileEntity.isInstanceOf[TileNuclearBoiler]) + { + return new ContainerNuclearBoiler(player, (tileEntity.asInstanceOf[TileNuclearBoiler])) + } + else if (tileEntity.isInstanceOf[TileReactorCell]) + { + return new ContainerReactorCell(player, (tileEntity.asInstanceOf[TileReactorCell])) + } + return null + } + + def isPaused: Boolean = + { + return false + } + + def isGraphicsFancy: Boolean = + { + return false + } + + def renderBlockParticle(world: World, x: Double, y: Double, z: Double, velocity: Vector3, blockID: Int, scale: Float) + { + } + + def renderBlockParticle(world: World, position: Vector3, velocity: Vector3, blockID: Int, scale: Float) + { + } + + def renderBeam(world: World, position: Vector3, hit: Vector3, color: Color, age: Int) + { + } + + def renderBeam(world: World, position: Vector3, target: Vector3, red: Float, green: Float, blue: Float, age: Int) + { + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3, color: Color) + { + this.renderElectricShock(world, start, target, color.getRed / 255f, color.getGreen / 255f, color.getBlue / 255f) + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3, r: Float, g: Float, b: Float) + { + this.renderElectricShock(world, start, target, r, g, b, true) + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3, color: Color, split: Boolean) + { + this.renderElectricShock(world, start, target, color.getRed / 255f, color.getGreen / 255f, color.getBlue / 255f, split) + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3, r: Float, g: Float, b: Float, split: Boolean) + { + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3) + { + this.renderElectricShock(world, start, target, true) + } + + def renderElectricShock(world: World, start: Vector3, target: Vector3, b: Boolean) + { + this.renderElectricShock(world, start, target, 0.55f, 0.7f, 1f, b) + } + + def renderBlockParticle(world: World, position: Vector3, block: Block, side: Int) + { + + } + + def renderLaser(world: World, start: Vector3, end: Vector3, color: Vector3, energy: Double) + { + + } + + def renderScorch(world: World, position: Vector3, side: Int) + { + + } +} \ No newline at end of file diff --git a/src/main/scala/edx/core/EDXCreativeTab.scala b/src/main/scala/edx/core/EDXCreativeTab.scala new file mode 100644 index 000000000..7ca5ea1d4 --- /dev/null +++ b/src/main/scala/edx/core/EDXCreativeTab.scala @@ -0,0 +1,18 @@ +/** + * + */ +package edx.core + +import net.minecraft.creativetab.CreativeTabs +import net.minecraft.item.{Item, ItemStack} + +/** + * @author Calclavia + * + */ +object EDXCreativeTab extends CreativeTabs(CreativeTabs.getNextID, "edx") +{ + var itemStack: ItemStack = null + + override def getTabIconItem: Item = itemStack.getItem +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/ResonantInduction.scala b/src/main/scala/edx/core/Electrodynamics.scala similarity index 65% rename from src/main/scala/resonantinduction/core/ResonantInduction.scala rename to src/main/scala/edx/core/Electrodynamics.scala index 3badb20ed..ba7037f03 100644 --- a/src/main/scala/resonantinduction/core/ResonantInduction.scala +++ b/src/main/scala/edx/core/Electrodynamics.scala @@ -1,34 +1,34 @@ -package resonantinduction.core +package edx.core import cpw.mods.fml.common.Mod.EventHandler import cpw.mods.fml.common.event.{FMLInitializationEvent, FMLPostInitializationEvent, FMLPreInitializationEvent} import cpw.mods.fml.common.network.NetworkRegistry import cpw.mods.fml.common.{Mod, SidedProxy} +import edx.basic.BasicContent +import edx.core.handler.TextureHookHandler +import edx.core.resource.AutoResourceFactory +import edx.electrical.ElectricalContent +import edx.mechanical.{MechanicalContent, MicroblockHighlightHandler} +import edx.quantum.QuantumContent import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.config.Configuration import org.modstats.{ModstatInfo, Modstats} import resonant.engine.ResonantEngine import resonant.lib.mod.config.ConfigHandler import resonant.lib.mod.loadable.LoadableHandler -import resonantinduction.archaic.ArchaicContent -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.handler.TextureHookHandler -import resonantinduction.core.resource.AutoResourceFactory -import resonantinduction.electrical.ElectricalContent -import resonantinduction.mechanical.{MechanicalContent, MicroblockHighlightHandler} /** The core module of Resonant Induction * * @author Calclavia */ -@Mod(modid = Reference.coreID, name = Reference.name, version = Reference.version, modLanguage = "scala", dependencies = "required-after:ForgeMultipart@[1.0.0.244,);required-after:ResonantEngine;before:ThermalExpansion;before:Mekanism") -@ModstatInfo(prefix = "resonantin") -final object ResonantInduction +@Mod(modid = Reference.id, name = Reference.name, version = Reference.version, modLanguage = "scala", dependencies = "required-after:ForgeMultipart@[1.0.0.244,);required-after:ResonantEngine;before:ThermalExpansion;before:Mekanism") +@ModstatInfo(prefix = "edx") +object Electrodynamics { /** Packets */ val packetHandler = ResonantEngine.packetHandler val loadables = new LoadableHandler - @SidedProxy(clientSide = "resonantinduction.core.ClientProxy", serverSide = "resonantinduction.core.CommonProxy") + @SidedProxy(clientSide = "edx.core.ClientProxy", serverSide = "edx.core.CommonProxy") var proxy: CommonProxy = _ @EventHandler @@ -46,10 +46,10 @@ final object ResonantInduction loadables.applyModule(proxy) loadables.applyModule(packetHandler) - loadables.applyModule(ArchaicContent) + loadables.applyModule(BasicContent) loadables.applyModule(ElectricalContent) loadables.applyModule(MechanicalContent) - loadables.applyModule(AtomicContent) + loadables.applyModule(QuantumContent) loadables.preInit() } diff --git a/src/main/scala/resonantinduction/core/Reference.scala b/src/main/scala/edx/core/Reference.scala similarity index 78% rename from src/main/scala/resonantinduction/core/Reference.scala rename to src/main/scala/edx/core/Reference.scala index 9a36f912c..71091e64e 100644 --- a/src/main/scala/resonantinduction/core/Reference.scala +++ b/src/main/scala/edx/core/Reference.scala @@ -1,4 +1,4 @@ -package resonantinduction.core +package edx.core import java.util.logging.Logger @@ -7,13 +7,12 @@ import java.util.logging.Logger * * @author Calclavia */ -final object Reference +object Reference { - final val idPrefix = "ResonantInduction" - final val coreID = idPrefix + "Core" + final val id = "EDX" /** The official name of the mod */ - final val name = "Resonant Induction" + final val name = "Electrodynamics" final val logger = Logger.getLogger(Reference.name) final val majorVersion = "@MAJOR@" @@ -21,11 +20,10 @@ final object Reference final val revisionVersion = "@REVIS@" final val build = "@BUILD@" final val version = majorVersion + "." + minorVersion + "." + revisionVersion - final val channel: String = "resonindc" /** * Directory Information */ - final val domain: String = "resonantinduction" + final val domain: String = "edx" final val prefix: String = domain + ":" final val assetDirectory: String = "/assets/" + domain + "/" final val textureDirectory: String = "textures/" diff --git a/src/main/scala/resonantinduction/core/ResonantPartFactory.scala b/src/main/scala/edx/core/ResonantPartFactory.scala similarity index 91% rename from src/main/scala/resonantinduction/core/ResonantPartFactory.scala rename to src/main/scala/edx/core/ResonantPartFactory.scala index 71e1731af..a47638ade 100644 --- a/src/main/scala/resonantinduction/core/ResonantPartFactory.scala +++ b/src/main/scala/edx/core/ResonantPartFactory.scala @@ -1,4 +1,4 @@ -package resonantinduction.core +package edx.core import codechicken.multipart.MultiPartRegistry.IPartFactory import codechicken.multipart.{MultiPartRegistry, MultipartGenerator, TMultiPart} @@ -24,7 +24,7 @@ object ResonantPartFactory extends IPartFactory { MultiPartRegistry.registerParts(this, partMap.keys.toArray) - MultipartGenerator.registerTrait("resonant.api.tile.INodeProvider", "resonantinduction.core.prefab.pass.TNodeProvider") + MultipartGenerator.registerTrait("resonant.api.tile.INodeProvider", "edx.core.prefab.pass.TNodeProvider") MultipartGenerator.registerPassThroughInterface("net.minecraftforge.fluids.IFluidHandler") } diff --git a/src/main/scala/edx/core/Settings.scala b/src/main/scala/edx/core/Settings.scala new file mode 100644 index 000000000..b9327ad4c --- /dev/null +++ b/src/main/scala/edx/core/Settings.scala @@ -0,0 +1,72 @@ +package edx.core + +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import net.minecraft.block.Block +import net.minecraft.item.ItemStack +import net.minecraftforge.common.config.Configuration +import resonant.api.recipe.QuantumAssemblerRecipes +import resonant.lib.mod.config.Config +import resonant.lib.mod.config.ConfigEvent.PostConfigEvent +import resonant.lib.prefab.poison.PotionRadiation + +import scala.collection.convert.wrapAll._ + +/** @author Calclavia */ +object Settings +{ + @Config(category = "Power", key = "AcceleratorCostPerTick") + final val ACCELERATOR_ENERGY_COST_PER_TICK: Int = 4800000 + var config: Configuration = _ + @Config(key = "Tesla Sound FXs") + var SOUND_FXS = true + + //Turbine Settings + @Config(key = "Shiny silver Wires") + var SHINY_SILVER = true + @Config var allowTurbineStacking: Boolean = true + // Power Settings + @Config(category = "Power", key = "SolorPanel") + var solarPower: Int = 50 + @Config(category = "Power") + var fulminationOutputMultiplier: Double = 1 + @Config(category = "Power", key = "WindTubineRatio") + var WIND_POWER_RATIO: Int = 1 + @Config(category = "Power", key = "WaterTubineRatio") + var WATER_POWER_RATIO: Int = 1 + @Config(category = "Power", key = "TubineRatio", comment = "Restricts the output of all turbines") + var turbineOutputMultiplier: Double = 1 + + //Disable/Enable Settings + @Config(category = "Enable") + var allowToxicWaste: Boolean = true + @Config(category = "Enable") + var allowRadioactiveOres: Boolean = true + @Config(category = "Enable", key = "EngineeringTableAutocraft") + var ALLOW_ENGINEERING_AUTOCRAFT = true + + //Fluid Settings + @Config var fissionBoilVolumeMultiplier: Double = 1 + @Config var uraniumHexaflourideRatio: Int = 200 + @Config var waterPerDeutermium: Int = 4 + @Config var deutermiumPerTritium: Int = 4 + @Config var darkMatterSpawnChance: Double = 0.2 + @Config var steamMultiplier: Double = 1 + + //Recipe Settings + @Config var allowOreDictionaryCompatibility: Boolean = true + @Config var allowAlternateRecipes: Boolean = true + @Config(comment = "Put a list of block/item IDs to be used by the Quantum Assembler. Separate by commas, no space.") + var quantumAssemblerRecipes: Array[String] = _ + @Config(comment = "0 = Do not generate, 1 = Generate items only, 2 = Generate all") + var quantumAssemblerGenerateMode: Int = 1 + @Config var allowIC2UraniumCompression: Boolean = true + @Config + var ACCELERATOR_ANITMATTER_DENSITY_MULTIPLIER: Int = 1 + + @SubscribeEvent + def configEvent(evt: PostConfigEvent) + { + QuantumAssemblerRecipes.RECIPES.addAll(quantumAssemblerRecipes.map(x => new ItemStack(Block.blockRegistry.getObject(x).asInstanceOf[Block])).toList) + PotionRadiation.INSTANCE.getId + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/handler/TextureHookHandler.scala b/src/main/scala/edx/core/handler/TextureHookHandler.scala similarity index 69% rename from src/main/scala/resonantinduction/core/handler/TextureHookHandler.scala rename to src/main/scala/edx/core/handler/TextureHookHandler.scala index 4c99183a4..ef72e2275 100644 --- a/src/main/scala/resonantinduction/core/handler/TextureHookHandler.scala +++ b/src/main/scala/edx/core/handler/TextureHookHandler.scala @@ -1,11 +1,11 @@ -package resonantinduction.core.handler +package edx.core.handler import cpw.mods.fml.common.eventhandler.SubscribeEvent import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.quantum.QuantumContent import net.minecraftforge.client.event.TextureStitchEvent import resonant.lib.render.RenderUtility -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.Reference /** Event handler for texture events * @author Calclavia @@ -42,12 +42,12 @@ object TextureHookHandler @SideOnly(Side.CLIENT) def postTextureHook(event: TextureStitchEvent.Post) { - AtomicContent.FLUID_URANIUM_HEXAFLOURIDE.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "uraniumHexafluoride")) - AtomicContent.FLUID_STEAM.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "steam")) - AtomicContent.FLUID_DEUTERIUM.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "deuterium")) - AtomicContent.getFluidTritium.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "tritium")) - AtomicContent.getFluidToxicWaste.setIcons(AtomicContent.blockToxicWaste.getIcon(0, 0)) - AtomicContent.FLUID_PLASMA.setIcons(AtomicContent.blockPlasma.getIcon(0, 0)) + QuantumContent.FLUID_URANIUM_HEXAFLOURIDE.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "uraniumHexafluoride")) + QuantumContent.FLUID_STEAM.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "steam")) + QuantumContent.FLUID_DEUTERIUM.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "deuterium")) + QuantumContent.getFluidTritium.setIcons(RenderUtility.loadedIconMap.get(Reference.prefix + "tritium")) + QuantumContent.getFluidToxicWaste.setIcons(QuantumContent.blockToxicWaste.getIcon(0, 0)) + QuantumContent.FLUID_PLASMA.setIcons(QuantumContent.blockPlasma.getIcon(0, 0)) } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/interfaces/TNodeMechanical.scala b/src/main/scala/edx/core/interfaces/TNodeMechanical.scala similarity index 97% rename from src/main/scala/resonantinduction/core/interfaces/TNodeMechanical.scala rename to src/main/scala/edx/core/interfaces/TNodeMechanical.scala index ea31ab287..8424b55a3 100644 --- a/src/main/scala/resonantinduction/core/interfaces/TNodeMechanical.scala +++ b/src/main/scala/edx/core/interfaces/TNodeMechanical.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.interfaces +package edx.core.interfaces import resonant.api.tile.node.INode import resonant.lib.transform.vector.IVectorWorld diff --git a/src/main/scala/resonantinduction/core/prefab/node/NodeFluidPressure.scala b/src/main/scala/edx/core/prefab/node/NodeFluidPressure.scala similarity index 99% rename from src/main/scala/resonantinduction/core/prefab/node/NodeFluidPressure.scala rename to src/main/scala/edx/core/prefab/node/NodeFluidPressure.scala index 79b5294c9..8a6ff7a83 100644 --- a/src/main/scala/resonantinduction/core/prefab/node/NodeFluidPressure.scala +++ b/src/main/scala/edx/core/prefab/node/NodeFluidPressure.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.node +package edx.core.prefab.node import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.{FluidContainerRegistry, IFluidHandler} @@ -139,6 +139,8 @@ class NodeFluidPressure(parent: INodeProvider, volume: Int = FluidContainerRegis } } + def pressure(direction: ForgeDirection): Int = _pressure + protected def updatePressure() { var totalPressure = 0 @@ -178,8 +180,6 @@ class NodeFluidPressure(parent: INodeProvider, volume: Int = FluidContainerRegis def pressure: Int = _pressure - def pressure(direction: ForgeDirection): Int = _pressure - def pressure_=(pressure: Int) { this._pressure = pressure diff --git a/src/main/scala/resonantinduction/core/prefab/node/TMultipartNode.scala b/src/main/scala/edx/core/prefab/node/TMultipartNode.scala similarity index 95% rename from src/main/scala/resonantinduction/core/prefab/node/TMultipartNode.scala rename to src/main/scala/edx/core/prefab/node/TMultipartNode.scala index fc0591e00..8592510a3 100644 --- a/src/main/scala/resonantinduction/core/prefab/node/TMultipartNode.scala +++ b/src/main/scala/edx/core/prefab/node/TMultipartNode.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.node +package edx.core.prefab.node import codechicken.multipart.TMultiPart import net.minecraft.tileentity.TileEntity diff --git a/src/main/scala/resonantinduction/core/prefab/node/TileFluidProvider.scala b/src/main/scala/edx/core/prefab/node/TileFluidProvider.scala similarity index 98% rename from src/main/scala/resonantinduction/core/prefab/node/TileFluidProvider.scala rename to src/main/scala/edx/core/prefab/node/TileFluidProvider.scala index 20253f944..863f75961 100644 --- a/src/main/scala/resonantinduction/core/prefab/node/TileFluidProvider.scala +++ b/src/main/scala/edx/core/prefab/node/TileFluidProvider.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.node +package edx.core.prefab.node import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material @@ -94,6 +94,10 @@ abstract class TileFluidProvider(material: Material) extends SpatialTile(materia override def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = fluidNode.drain(from, maxDrain, doDrain) + override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canFill(from, fluid) + + override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canDrain(from, fluid) + def fluidNode = _fluidNode def fluidNode_=(newNode: NodeFluid) @@ -108,10 +112,6 @@ abstract class TileFluidProvider(material: Material) extends SpatialTile(materia nodes.add(fluidNode) } - override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canFill(from, fluid) - - override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canDrain(from, fluid) - override def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = fluidNode.fill(from, resource, doFill) override def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = fluidNode.getTankInfo(from) diff --git a/src/main/scala/resonantinduction/core/prefab/part/ChickenBonesWrapper.scala b/src/main/scala/edx/core/prefab/part/ChickenBonesWrapper.scala similarity index 95% rename from src/main/scala/resonantinduction/core/prefab/part/ChickenBonesWrapper.scala rename to src/main/scala/edx/core/prefab/part/ChickenBonesWrapper.scala index eb45f1b51..8ccdafb72 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/ChickenBonesWrapper.scala +++ b/src/main/scala/edx/core/prefab/part/ChickenBonesWrapper.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part +package edx.core.prefab.part import codechicken.lib.vec.Cuboid6 import resonant.lib.transform.region.Cuboid diff --git a/src/main/scala/resonantinduction/core/prefab/part/CuboidShapes.scala b/src/main/scala/edx/core/prefab/part/CuboidShapes.scala similarity index 98% rename from src/main/scala/resonantinduction/core/prefab/part/CuboidShapes.scala rename to src/main/scala/edx/core/prefab/part/CuboidShapes.scala index c92a0a15e..d72b5e497 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/CuboidShapes.scala +++ b/src/main/scala/edx/core/prefab/part/CuboidShapes.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part +package edx.core.prefab.part import codechicken.lib.raytracer.IndexedCuboid6 import codechicken.lib.vec.{Cuboid6, Rotation, Vector3} diff --git a/src/main/scala/resonantinduction/core/prefab/part/IHighlight.scala b/src/main/scala/edx/core/prefab/part/IHighlight.scala similarity index 57% rename from src/main/scala/resonantinduction/core/prefab/part/IHighlight.scala rename to src/main/scala/edx/core/prefab/part/IHighlight.scala index 863b93d16..1535088c7 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/IHighlight.scala +++ b/src/main/scala/edx/core/prefab/part/IHighlight.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part +package edx.core.prefab.part abstract trait IHighlight { diff --git a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala b/src/main/scala/edx/core/prefab/part/PacketMultiPart.scala similarity index 97% rename from src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala rename to src/main/scala/edx/core/prefab/part/PacketMultiPart.scala index 4ac84be66..3e908141c 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala +++ b/src/main/scala/edx/core/prefab/part/PacketMultiPart.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part +package edx.core.prefab.part import codechicken.multipart.{TMultiPart, TileMultipart} import io.netty.buffer.ByteBuf diff --git a/src/main/scala/resonantinduction/core/prefab/part/PartFace.scala b/src/main/scala/edx/core/prefab/part/PartFace.scala similarity index 96% rename from src/main/scala/resonantinduction/core/prefab/part/PartFace.scala rename to src/main/scala/edx/core/prefab/part/PartFace.scala index 2668ece66..10eab07b7 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PartFace.scala +++ b/src/main/scala/edx/core/prefab/part/PartFace.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part +package edx.core.prefab.part import java.lang.{Iterable => JIterable} import java.util.{ArrayList, List} @@ -7,11 +7,11 @@ import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.lib.vec.{Cuboid6, Rotation} import codechicken.microblock.FaceMicroClass import codechicken.multipart._ +import edx.core.prefab.part.connector.PartAbstract import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.MovingObjectPosition import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.core.prefab.part.connector.PartAbstract import scala.collection.convert.wrapAll._ diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/PartAbstract.scala b/src/main/scala/edx/core/prefab/part/connector/PartAbstract.scala similarity index 95% rename from src/main/scala/resonantinduction/core/prefab/part/connector/PartAbstract.scala rename to src/main/scala/edx/core/prefab/part/connector/PartAbstract.scala index 4f980753c..07b2eca4e 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/PartAbstract.scala +++ b/src/main/scala/edx/core/prefab/part/connector/PartAbstract.scala @@ -1,11 +1,11 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.multipart.{IRedstonePart, TMultiPart} +import edx.core.ResonantPartFactory import net.minecraft.item.ItemStack import net.minecraft.util.MovingObjectPosition import resonant.lib.prefab.TraitTicker -import resonantinduction.core.ResonantPartFactory import scala.collection.convert.wrapAll._ import scala.collection.mutable diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala b/src/main/scala/edx/core/prefab/part/connector/PartFramedNode.scala similarity index 96% rename from src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala rename to src/main/scala/edx/core/prefab/part/connector/PartFramedNode.scala index 38a16611e..fb9c88ff1 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala +++ b/src/main/scala/edx/core/prefab/part/connector/PartFramedNode.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import java.lang.{Iterable => JIterable} import java.util.Set @@ -8,29 +8,26 @@ import codechicken.lib.raytracer.IndexedCuboid6 import codechicken.lib.vec.Cuboid6 import codechicken.multipart._ import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.part.CuboidShapes import net.minecraft.entity.player.EntityPlayer import net.minecraft.util.{IIcon, MovingObjectPosition} import net.minecraftforge.common.util.ForgeDirection import resonant.lib.grid.node.NodeConnector import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.core.prefab.part.CuboidShapes import scala.collection.convert.wrapAll._ import scala.collection.mutable abstract class PartFramedNode extends PartAbstract with TPartNodeProvider with TSlottedPart with TNormalOcclusion with TIconHitEffects { + protected val node: NodeConnector[_] /** Bitmask connections */ var clientRenderMask = 0x00 - @SideOnly(Side.CLIENT) protected var breakIcon: IIcon = null - /** Client Side */ protected var testingSide: ForgeDirection = null - protected val node: NodeConnector[_] - //Check if lazy val will be null? nodes.add(node) diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/TColorable.scala b/src/main/scala/edx/core/prefab/part/connector/TColorable.scala similarity index 94% rename from src/main/scala/resonantinduction/core/prefab/part/connector/TColorable.scala rename to src/main/scala/edx/core/prefab/part/connector/TColorable.scala index 6c8c86d97..2dcc6ef1d 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/TColorable.scala +++ b/src/main/scala/edx/core/prefab/part/connector/TColorable.scala @@ -1,11 +1,11 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import codechicken.lib.data.{MCDataInput, MCDataOutput} +import edx.core.util.ResonantUtil import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.MovingObjectPosition -import resonantinduction.core.util.ResonantUtil /** * Trait applied to objects that can associates with a color. @@ -26,18 +26,6 @@ trait TColorable extends PartAbstract */ def getColor = colorID - def setColor(dye: Int) - { - colorID = dye - - if (!world.isRemote) - { - tile.notifyPartChange(this) - onPartChanged(this) - sendPacket(2) - } - } - /** * Changes the wire's color. */ @@ -62,6 +50,18 @@ trait TColorable extends PartAbstract return false } + def setColor(dye: Int) + { + colorID = dye + + if (!world.isRemote) + { + tile.notifyPartChange(this) + onPartChanged(this) + sendPacket(2) + } + } + override def write(packet: MCDataOutput, id: Int) { if (id == 0 || id == 2) diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/TInsulatable.scala b/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala similarity index 95% rename from src/main/scala/resonantinduction/core/prefab/part/connector/TInsulatable.scala rename to src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala index d3e49e210..addaf679d 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/TInsulatable.scala +++ b/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala @@ -1,7 +1,6 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import codechicken.lib.data.{MCDataInput, MCDataOutput} -import codechicken.multipart.TMultiPart import net.minecraft.entity.player.EntityPlayer import net.minecraft.init.Items import net.minecraft.item.{Item, ItemStack} @@ -17,43 +16,19 @@ import scala.collection.mutable */ trait TInsulatable extends PartAbstract { - /** - * The item that is used to insulate this object. - */ - protected val insulationItem: Item - /** * The item used to remove the insulation. Set to null to not require anything. */ protected lazy val insulationRemovalItem: Item = Items.shears + /** + * The item that is used to insulate this object. + */ + protected val insulationItem: Item /** * Is this object currently insulated? */ private var _insulated = false - /** - * Insulation Methods - */ - def insulated_=(insulated: Boolean) - { - _insulated = insulated - - if (!world.isRemote) - { - tile.notifyPartChange(this) - sendInsulationUpdate() - } - else - tile.markRender() - } - - def insulated: Boolean = _insulated - - def sendInsulationUpdate() - { - tile.getWriteStream(this).writeByte(1).writeBoolean(this._insulated) - } - /** * Changes the wire's color. */ @@ -88,14 +63,6 @@ trait TInsulatable extends PartAbstract return false } - protected override def getDrops(drops: mutable.Set[ItemStack]) - { - super.getDrops(drops) - - if (insulated) - drops += new ItemStack(insulationItem) - } - override def write(packet: MCDataOutput, id: Int) { super.write(packet, id) @@ -106,7 +73,7 @@ trait TInsulatable extends PartAbstract override def read(packet: MCDataInput, packetID: Int) { - super.read(packet,packetID) + super.read(packet, packetID) if (packetID <= 1) _insulated = packet.readBoolean @@ -118,9 +85,40 @@ trait TInsulatable extends PartAbstract nbt.setBoolean("isInsulated", insulated) } + def insulated: Boolean = _insulated + + /** + * Insulation Methods + */ + def insulated_=(insulated: Boolean) + { + _insulated = insulated + + if (!world.isRemote) + { + tile.notifyPartChange(this) + sendInsulationUpdate() + } + else + tile.markRender() + } + + def sendInsulationUpdate() + { + tile.getWriteStream(this).writeByte(1).writeBoolean(this._insulated) + } + override def load(nbt: NBTTagCompound) { super.load(nbt) _insulated = nbt.getBoolean("isInsulated") } + + protected override def getDrops(drops: mutable.Set[ItemStack]) + { + super.getDrops(drops) + + if (insulated) + drops += new ItemStack(insulationItem) + } } diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/TMaterial.scala b/src/main/scala/edx/core/prefab/part/connector/TMaterial.scala similarity index 93% rename from src/main/scala/resonantinduction/core/prefab/part/connector/TMaterial.scala rename to src/main/scala/edx/core/prefab/part/connector/TMaterial.scala index 2f0524973..61be490b1 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/TMaterial.scala +++ b/src/main/scala/edx/core/prefab/part/connector/TMaterial.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import codechicken.lib.data.{MCDataInput, MCDataOutput} import net.minecraft.nbt.NBTTagCompound diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/TPartNodeProvider.scala b/src/main/scala/edx/core/prefab/part/connector/TPartNodeProvider.scala similarity index 97% rename from src/main/scala/resonantinduction/core/prefab/part/connector/TPartNodeProvider.scala rename to src/main/scala/edx/core/prefab/part/connector/TPartNodeProvider.scala index 99d478c57..ba3082f7c 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/TPartNodeProvider.scala +++ b/src/main/scala/edx/core/prefab/part/connector/TPartNodeProvider.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.prefab.part.connector +package edx.core.prefab.part.connector import java.util diff --git a/src/main/scala/resonantinduction/core/prefab/pass/TNodeProvider.java b/src/main/scala/edx/core/prefab/pass/TNodeProvider.java similarity index 95% rename from src/main/scala/resonantinduction/core/prefab/pass/TNodeProvider.java rename to src/main/scala/edx/core/prefab/pass/TNodeProvider.java index 1221bb614..73a5405a4 100644 --- a/src/main/scala/resonantinduction/core/prefab/pass/TNodeProvider.java +++ b/src/main/scala/edx/core/prefab/pass/TNodeProvider.java @@ -1,15 +1,16 @@ -package resonantinduction.core.prefab.pass; +package edx.core.prefab.pass; import codechicken.multipart.PartMap; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; import net.minecraftforge.common.util.ForgeDirection; -import resonant.api.tile.node.INode; import resonant.api.tile.INodeProvider; +import resonant.api.tile.node.INode; /** * TNodeProvider multipart Trait. * Keep this in Java for smoother ASM. + * * @author Calclavia */ public class TNodeProvider extends TileMultipart implements INodeProvider diff --git a/src/main/scala/edx/core/render/InvertX.scala b/src/main/scala/edx/core/render/InvertX.scala new file mode 100644 index 000000000..14c9ca385 --- /dev/null +++ b/src/main/scala/edx/core/render/InvertX.scala @@ -0,0 +1,16 @@ +package edx.core.render + +import codechicken.lib.vec.{Matrix4, Transformation, VariableTransformation, Vector3} + +class InvertX extends VariableTransformation(new Matrix4(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1)) +{ + override def inverse: Transformation = + { + return this + } + + override def apply(vec: Vector3) + { + vec.x = -vec.x + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/resource/AutoResourceFactory.scala b/src/main/scala/edx/core/resource/AutoResourceFactory.scala similarity index 97% rename from src/main/scala/resonantinduction/core/resource/AutoResourceFactory.scala rename to src/main/scala/edx/core/resource/AutoResourceFactory.scala index e61d454ca..4398c7489 100644 --- a/src/main/scala/resonantinduction/core/resource/AutoResourceFactory.scala +++ b/src/main/scala/edx/core/resource/AutoResourceFactory.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource +package edx.core.resource import java.awt._ import java.awt.image.BufferedImage @@ -8,6 +8,9 @@ import javax.imageio.ImageIO import cpw.mods.fml.common.eventhandler.SubscribeEvent import cpw.mods.fml.common.registry.LanguageRegistry import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.BasicContent +import edx.core.resource.content._ +import edx.core.{Reference, Settings} import net.minecraft.block.Block import net.minecraft.client.Minecraft import net.minecraft.init.Blocks @@ -21,9 +24,6 @@ import resonant.api.recipe.{MachineRecipes, RecipeType} import resonant.lib.factory.resources.ResourceFactory import resonant.lib.utility.LanguageUtility import resonant.lib.wrapper.StringWrapper._ -import resonantinduction.archaic.ArchaicContent -import resonantinduction.core.resource.content._ -import resonantinduction.core.{Reference, Settings} import scala.collection.convert.wrapAll._ import scala.collection.mutable @@ -119,7 +119,7 @@ object AutoResourceFactory FluidRegistry.registerFluid(fluidMolten) LanguageRegistry.instance.addStringLocalization(fluidMolten.getUnlocalizedName, LanguageUtility.getLocal("misc.molten") + " " + localizedName) val blockFluidMaterial = new BlockFluidMaterial(fluidMolten) - ArchaicContent.manager.newBlock("molten" + nameCaps, blockFluidMaterial) + BasicContent.manager.newBlock("molten" + nameCaps, blockFluidMaterial) moltenFluidMap += (material -> blockFluidMaterial) //Generate resource items: moltenBucket, rubble, dust and refined dust diff --git a/src/main/scala/resonantinduction/core/resource/alloy/Alloy.scala b/src/main/scala/edx/core/resource/alloy/Alloy.scala similarity index 95% rename from src/main/scala/resonantinduction/core/resource/alloy/Alloy.scala rename to src/main/scala/edx/core/resource/alloy/Alloy.scala index a7ae8658d..d45e044fb 100644 --- a/src/main/scala/resonantinduction/core/resource/alloy/Alloy.scala +++ b/src/main/scala/edx/core/resource/alloy/Alloy.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.alloy +package edx.core.resource.alloy import net.minecraft.nbt.NBTTagCompound import resonant.lib.utility.nbt.ISaveObj @@ -25,10 +25,10 @@ class Alloy(val max: Int) extends ISaveObj def percentage(material: String): Float = content(material) / size.toFloat - def percentage = size / max.toFloat - def size = content.values.foldLeft(0)(_ + _) + def percentage = size / max.toFloat + /** * Mixes a dust material into this jar */ diff --git a/src/main/scala/resonantinduction/core/resource/alloy/AlloyUtility.scala b/src/main/scala/edx/core/resource/alloy/AlloyUtility.scala similarity index 97% rename from src/main/scala/resonantinduction/core/resource/alloy/AlloyUtility.scala rename to src/main/scala/edx/core/resource/alloy/AlloyUtility.scala index 1949fa4e7..7d6b4759d 100644 --- a/src/main/scala/resonantinduction/core/resource/alloy/AlloyUtility.scala +++ b/src/main/scala/edx/core/resource/alloy/AlloyUtility.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.alloy +package edx.core.resource.alloy import java.awt.Color diff --git a/src/main/scala/resonantinduction/core/resource/alloy/TAlloyItem.scala b/src/main/scala/edx/core/resource/alloy/TAlloyItem.scala similarity index 95% rename from src/main/scala/resonantinduction/core/resource/alloy/TAlloyItem.scala rename to src/main/scala/edx/core/resource/alloy/TAlloyItem.scala index d495c228b..d1e281556 100644 --- a/src/main/scala/resonantinduction/core/resource/alloy/TAlloyItem.scala +++ b/src/main/scala/edx/core/resource/alloy/TAlloyItem.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.alloy +package edx.core.resource.alloy import java.util diff --git a/src/main/scala/edx/core/resource/content/BlockDecoration.scala b/src/main/scala/edx/core/resource/content/BlockDecoration.scala new file mode 100644 index 000000000..4912fd2d0 --- /dev/null +++ b/src/main/scala/edx/core/resource/content/BlockDecoration.scala @@ -0,0 +1,48 @@ +package edx.core.resource.content + +import java.util.List + +import edx.core.Reference +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, ItemStack} +import net.minecraft.util.IIcon +import resonant.lib.prefab.tile.item.ItemBlockMetadata +import resonant.lib.prefab.tile.spatial.SpatialBlock +import resonant.lib.wrapper.WrapList._ + +/** + * A block used to build machines or decoration. + * + * @author Calclavia + * + */ +class BlockDecoration extends SpatialBlock(Material.rock) +{ + var iconNames = Array("material_stone_brick", "material_stone_brick2", "material_stone_chiseled", "material_stone_cobble", "material_stone_cracked", "material_stone", "material_stone_slab", "material_stone_mossy", "material_steel_dark", "material_steel_tint", "material_steel") + var icons = new Array[IIcon](iconNames.length) + + // Constructor + name = "industrialStone" + blockHardness = 1 + stepSound = Block.soundTypeStone + this.itemBlock = classOf[ItemBlockMetadata] + + override def getIcon(side: Int, metadata: Int): IIcon = + { + return icons(metadata) + } + + override def registerIcons(register: IIconRegister) + { + super.registerIcons(register) + (0 until icons.size) foreach (i => icons(i) = register.registerIcon(Reference.prefix + iconNames(i))) + } + + override def getSubBlocks(item: Item, par2CreativeTabs: CreativeTabs, list: List[_]) + { + (0 until iconNames.length) foreach (i => list.add(new ItemStack(item, 1, i))) + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/resource/content/BlockFluidMaterial.scala b/src/main/scala/edx/core/resource/content/BlockFluidMaterial.scala similarity index 96% rename from src/main/scala/resonantinduction/core/resource/content/BlockFluidMaterial.scala rename to src/main/scala/edx/core/resource/content/BlockFluidMaterial.scala index d242e6810..aa3a5372a 100644 --- a/src/main/scala/resonantinduction/core/resource/content/BlockFluidMaterial.scala +++ b/src/main/scala/edx/core/resource/content/BlockFluidMaterial.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content import cpw.mods.fml.relauncher.{Side, SideOnly} import net.minecraft.block.material.Material diff --git a/src/main/scala/resonantinduction/core/resource/content/FluidColored.scala b/src/main/scala/edx/core/resource/content/FluidColored.scala similarity index 84% rename from src/main/scala/resonantinduction/core/resource/content/FluidColored.scala rename to src/main/scala/edx/core/resource/content/FluidColored.scala index 802ab91e9..16c514255 100644 --- a/src/main/scala/resonantinduction/core/resource/content/FluidColored.scala +++ b/src/main/scala/edx/core/resource/content/FluidColored.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content import net.minecraftforge.fluids.Fluid diff --git a/src/main/scala/resonantinduction/core/resource/content/ItemAlloyDust.scala b/src/main/scala/edx/core/resource/content/ItemAlloyDust.scala similarity index 75% rename from src/main/scala/resonantinduction/core/resource/content/ItemAlloyDust.scala rename to src/main/scala/edx/core/resource/content/ItemAlloyDust.scala index 1dd7594a4..865814f11 100644 --- a/src/main/scala/resonantinduction/core/resource/content/ItemAlloyDust.scala +++ b/src/main/scala/edx/core/resource/content/ItemAlloyDust.scala @@ -1,8 +1,8 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.core.Reference +import edx.core.resource.alloy.{AlloyUtility, TAlloyItem} import net.minecraft.item.{Item, ItemStack} -import resonantinduction.core.Reference -import resonantinduction.core.resource.alloy.{AlloyUtility, TAlloyItem} /** * An alloy dust is a dust that contains mixed metals diff --git a/src/main/scala/resonantinduction/core/resource/content/ItemDust.scala b/src/main/scala/edx/core/resource/content/ItemDust.scala similarity index 76% rename from src/main/scala/resonantinduction/core/resource/content/ItemDust.scala rename to src/main/scala/edx/core/resource/content/ItemDust.scala index cbac3f5c9..ec3d1121c 100644 --- a/src/main/scala/resonantinduction/core/resource/content/ItemDust.scala +++ b/src/main/scala/edx/core/resource/content/ItemDust.scala @@ -1,8 +1,8 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.core.Reference import net.minecraft.creativetab.CreativeTabs import resonant.lib.factory.resources.item.TItemResource -import resonantinduction.core.Reference /** * Item for ore dusts diff --git a/src/main/scala/resonantinduction/core/resource/content/ItemMoltenBucket.scala b/src/main/scala/edx/core/resource/content/ItemMoltenBucket.scala similarity index 76% rename from src/main/scala/resonantinduction/core/resource/content/ItemMoltenBucket.scala rename to src/main/scala/edx/core/resource/content/ItemMoltenBucket.scala index 90d03a78c..7cd3b3cb8 100644 --- a/src/main/scala/resonantinduction/core/resource/content/ItemMoltenBucket.scala +++ b/src/main/scala/edx/core/resource/content/ItemMoltenBucket.scala @@ -1,8 +1,8 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.core.Reference import net.minecraft.creativetab.CreativeTabs import resonant.lib.factory.resources.item.TItemResource -import resonantinduction.core.Reference /** * @author Calclavia diff --git a/src/main/scala/resonantinduction/core/resource/content/ItemRefinedDust.scala b/src/main/scala/edx/core/resource/content/ItemRefinedDust.scala similarity index 95% rename from src/main/scala/resonantinduction/core/resource/content/ItemRefinedDust.scala rename to src/main/scala/edx/core/resource/content/ItemRefinedDust.scala index 47b2ed699..6b8962ee0 100644 --- a/src/main/scala/resonantinduction/core/resource/content/ItemRefinedDust.scala +++ b/src/main/scala/edx/core/resource/content/ItemRefinedDust.scala @@ -1,5 +1,7 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.basic.BasicContent +import edx.core.Reference import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.init.Blocks @@ -7,8 +9,6 @@ import net.minecraft.item.{Item, ItemStack} import net.minecraft.world.World import resonant.lib.factory.resources.item.TItemResource import resonant.lib.transform.vector.Vector3 -import resonantinduction.archaic.ArchaicContent -import resonantinduction.core.Reference /** * @author Calclavia @@ -113,5 +113,5 @@ class ItemRefinedDust extends Item with TItemResource return true } - def getBlock = ArchaicContent.blockDust + def getBlock = BasicContent.blockDust } diff --git a/src/main/scala/resonantinduction/core/resource/content/ItemRubble.scala b/src/main/scala/edx/core/resource/content/ItemRubble.scala similarity index 75% rename from src/main/scala/resonantinduction/core/resource/content/ItemRubble.scala rename to src/main/scala/edx/core/resource/content/ItemRubble.scala index 0bdfb137c..ecd51818f 100644 --- a/src/main/scala/resonantinduction/core/resource/content/ItemRubble.scala +++ b/src/main/scala/edx/core/resource/content/ItemRubble.scala @@ -1,8 +1,8 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.core.Reference import net.minecraft.creativetab.CreativeTabs import resonant.lib.factory.resources.item.TItemResource -import resonantinduction.core.Reference /** * @author Calclavia diff --git a/src/main/scala/resonantinduction/core/resource/content/TBucket.scala b/src/main/scala/edx/core/resource/content/TBucket.scala similarity index 98% rename from src/main/scala/resonantinduction/core/resource/content/TBucket.scala rename to src/main/scala/edx/core/resource/content/TBucket.scala index f10892f1a..27e295d65 100644 --- a/src/main/scala/resonantinduction/core/resource/content/TBucket.scala +++ b/src/main/scala/edx/core/resource/content/TBucket.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound diff --git a/src/main/scala/resonantinduction/core/resource/content/TileDust.scala b/src/main/scala/edx/core/resource/content/TileDust.scala similarity index 90% rename from src/main/scala/resonantinduction/core/resource/content/TileDust.scala rename to src/main/scala/edx/core/resource/content/TileDust.scala index a4042dd88..2bfbdfd86 100644 --- a/src/main/scala/resonantinduction/core/resource/content/TileDust.scala +++ b/src/main/scala/edx/core/resource/content/TileDust.scala @@ -1,10 +1,10 @@ -package resonantinduction.core.resource.content +package edx.core.resource.content +import edx.core.Reference import net.minecraft.block.material.Material import net.minecraft.nbt.NBTTagCompound import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.transform.region.Cuboid -import resonantinduction.core.Reference /** * A block for physical dust blocks diff --git a/src/main/scala/resonantinduction/core/util/MultipartUtil.scala b/src/main/scala/edx/core/util/MultipartUtil.scala similarity index 97% rename from src/main/scala/resonantinduction/core/util/MultipartUtil.scala rename to src/main/scala/edx/core/util/MultipartUtil.scala index ed7e00cfe..9d1ca76ce 100644 --- a/src/main/scala/resonantinduction/core/util/MultipartUtil.scala +++ b/src/main/scala/edx/core/util/MultipartUtil.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.util +package edx.core.util import codechicken.multipart.{TMultiPart, TileMultipart} import net.minecraft.block.Block diff --git a/src/main/scala/resonantinduction/core/util/ResonantUtil.scala b/src/main/scala/edx/core/util/ResonantUtil.scala similarity index 96% rename from src/main/scala/resonantinduction/core/util/ResonantUtil.scala rename to src/main/scala/edx/core/util/ResonantUtil.scala index 61901f35e..e44cecaef 100644 --- a/src/main/scala/resonantinduction/core/util/ResonantUtil.scala +++ b/src/main/scala/edx/core/util/ResonantUtil.scala @@ -1,4 +1,4 @@ -package resonantinduction.core.util +package edx.core.util import net.minecraft.item.ItemStack import net.minecraftforge.oredict.OreDictionary @@ -22,7 +22,5 @@ object ResonantUtil */ def getColorHex(id: Int): Int = dyeColors(id) - - def convertRGBtoRGBA(color: Int): Int = color << 8 | (255 & 0xFF) } diff --git a/src/main/scala/resonantinduction/electrical/ElectricalContent.scala b/src/main/scala/edx/electrical/ElectricalContent.scala similarity index 86% rename from src/main/scala/resonantinduction/electrical/ElectricalContent.scala rename to src/main/scala/edx/electrical/ElectricalContent.scala index 2c1435ca5..d7896e993 100644 --- a/src/main/scala/resonantinduction/electrical/ElectricalContent.scala +++ b/src/main/scala/edx/electrical/ElectricalContent.scala @@ -1,9 +1,22 @@ -package resonantinduction.electrical +package edx.electrical import cpw.mods.fml.common.Loader import cpw.mods.fml.common.eventhandler.SubscribeEvent import cpw.mods.fml.common.registry.GameRegistry import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{EDXCreativeTab, Reference, ResonantPartFactory} +import edx.electrical.battery.{ItemBlockBattery, TileBattery} +import edx.electrical.generator.{TileMotor, TileSolarPanel, TileThermopile} +import edx.electrical.multimeter.{ItemMultimeter, PartMultimeter} +import edx.electrical.tesla.TileTesla +import edx.electrical.transformer.{ItemElectricTransformer, PartElectricTransformer} +import edx.electrical.wire.ItemWire +import edx.electrical.wire.base.WireMaterial +import edx.electrical.wire.flat.{PartFlatWire, RenderFlatWire} +import edx.electrical.wire.framed.{PartFramedWire, RenderFramedWire} +import edx.quantum.gate.{ItemQuantumGlyph, PartQuantumGlyph} +import edx.quantum.laser.focus.{ItemFocusingMatrix, TileFocusCrystal, TileMirror} +import edx.quantum.laser.{TileLaserEmitter, TileLaserReceiver} import ic2.api.item.IC2Items import net.minecraft.block.Block import net.minecraft.init.{Blocks, Items} @@ -12,21 +25,8 @@ import net.minecraft.util.ResourceLocation import net.minecraftforge.client.event.TextureStitchEvent import net.minecraftforge.common.MinecraftForge import net.minecraftforge.oredict.{OreDictionary, ShapelessOreRecipe} -import resonant.lib.mod.content.{ExplicitContentName, ContentHolder} +import resonant.lib.mod.content.{ContentHolder, ExplicitContentName} import resonant.lib.utility.recipe.UniversalRecipe -import resonantinduction.atomic.gate.{ItemQuantumGlyph, PartQuantumGlyph} -import resonantinduction.core.{RICreativeTab, Reference, ResonantPartFactory} -import resonantinduction.electrical.battery.{ItemBlockBattery, TileBattery} -import resonantinduction.electrical.generator.{TileMotor, TileSolarPanel, TileThermopile} -import resonantinduction.electrical.laser.focus.{ItemFocusingMatrix, TileFocusCrystal, TileMirror} -import resonantinduction.electrical.laser.{TileLaserEmitter, TileLaserReceiver} -import resonantinduction.electrical.multimeter.{ItemMultimeter, PartMultimeter} -import resonantinduction.electrical.tesla.TileTesla -import resonantinduction.electrical.transformer.{ItemElectricTransformer, PartElectricTransformer} -import resonantinduction.electrical.wire.ItemWire -import resonantinduction.electrical.wire.base.WireMaterial -import resonantinduction.electrical.wire.flat.{PartFlatWire, RenderFlatWire} -import resonantinduction.electrical.wire.framed.{PartFramedWire, RenderFramedWire} object ElectricalContent extends ContentHolder { @@ -55,7 +55,7 @@ object ElectricalContent extends ContentHolder var tierTwoBattery: ItemStack = null var tierThreeBattery: ItemStack = null - manager.setTab(RICreativeTab).setPrefix(Reference.prefix) + manager.setTab(EDXCreativeTab).setPrefix(Reference.prefix) override def preInit() { diff --git a/src/main/scala/resonantinduction/electrical/battery/GridBattery.scala b/src/main/scala/edx/electrical/battery/GridBattery.scala similarity index 95% rename from src/main/scala/resonantinduction/electrical/battery/GridBattery.scala rename to src/main/scala/edx/electrical/battery/GridBattery.scala index 5138b77fc..6075cea62 100644 --- a/src/main/scala/resonantinduction/electrical/battery/GridBattery.scala +++ b/src/main/scala/edx/electrical/battery/GridBattery.scala @@ -1,10 +1,8 @@ -package resonantinduction.electrical.battery +package edx.electrical.battery import java.util.{Arrays, LinkedHashSet, Set} -import resonant.lib.content.prefab.TEnergyStorage import resonant.lib.grid.Grid -import resonant.lib.grid.node.NodeEnergy import scala.collection.JavaConversions._ diff --git a/src/main/scala/edx/electrical/battery/ItemBlockBattery.scala b/src/main/scala/edx/electrical/battery/ItemBlockBattery.scala new file mode 100644 index 000000000..19ff8d74f --- /dev/null +++ b/src/main/scala/edx/electrical/battery/ItemBlockBattery.scala @@ -0,0 +1,153 @@ +package edx.electrical.battery + +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, ItemBlock, ItemStack} +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.world.World +import resonant.api.items.IEnergyItem +import resonant.lib.mod.compat.energy.Compatibility +import resonant.lib.render.EnumColor +import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.science.UnitDisplay +import resonant.lib.wrapper.WrapList._ + +object ItemBlockBattery +{ + def setTier(itemStack: ItemStack, tier: Int): ItemStack = + { + if (itemStack.getTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + itemStack.getTagCompound.setByte("tier", tier.toByte) + return itemStack + } + + def getTier(itemStack: ItemStack): Int = + { + if (itemStack.getTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + return itemStack.getTagCompound.getByte("tier") + } +} + +class ItemBlockBattery(block: Block) extends ItemBlock(block) with IEnergyItem +{ + this.setMaxStackSize(1) + this.setMaxDamage(100) + this.setNoRepair + + override def addInformation(itemStack: ItemStack, entityPlayer: EntityPlayer, list: List[_], par4: Boolean) + { + list.add(LanguageUtility.getLocal("tooltip.tier") + ": " + (ItemBlockBattery.getTier(itemStack) + 1)) + var color: String = "" + val joules: Double = this.getEnergy(itemStack) + if (joules <= this.getEnergyCapacity(itemStack) / 3) + { + color = "\u00a74" + } + else if (joules > this.getEnergyCapacity(itemStack) * 2 / 3) + { + color = "\u00a72" + } + else + { + color = "\u00a76" + } + itemStack.getItemDamageForDisplay + list.add(LanguageUtility.getLocal("tooltip.battery.energy").replace("%0", color).replace("%1", EnumColor.GREY.toString).replace("%v0", new UnitDisplay(UnitDisplay.Unit.JOULES, joules).toString).replace("%v1", new UnitDisplay(UnitDisplay.Unit.JOULES, this.getEnergyCapacity(itemStack), true).toString)) + } + + /** + * Makes sure the item is uncharged when it is crafted and not charged. Change this if you do + * not want this to happen! + */ + override def onCreated(itemStack: ItemStack, par2World: World, par3EntityPlayer: EntityPlayer) + { + this.setEnergy(itemStack, 0) + } + + def recharge(itemStack: ItemStack, energy: Double, doReceive: Boolean): Double = + { + val rejectedElectricity: Double = Math.max((this.getEnergy(itemStack) + energy) - this.getEnergyCapacity(itemStack), 0) + val energyToReceive: Double = Math.min(energy - rejectedElectricity, getTransferRate(itemStack)) + if (doReceive) + { + this.setEnergy(itemStack, this.getEnergy(itemStack) + energyToReceive) + } + return energyToReceive + } + + def discharge(itemStack: ItemStack, energy: Double, doTransfer: Boolean): Double = + { + val energyToExtract: Double = Math.min(Math.min(this.getEnergy(itemStack), energy), getTransferRate(itemStack)) + if (doTransfer) + { + this.setEnergy(itemStack, this.getEnergy(itemStack) - energyToExtract) + } + return energyToExtract + } + + def setEnergy(itemStack: ItemStack, joules: Double) + { + if (itemStack.getTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + val electricityStored: Double = Math.max(Math.min(joules, this.getEnergyCapacity(itemStack)), 0) + itemStack.getTagCompound.setDouble("electricity", electricityStored) + } + + def getTransferRate(itemStack: ItemStack): Double = + { + return this.getEnergyCapacity(itemStack) / 100 + } + + def getVoltage(itemStack: ItemStack): Double = + { + return 240 + } + + def getTransfer(itemStack: ItemStack): Double = + { + return this.getEnergyCapacity(itemStack) - this.getEnergy(itemStack) + } + + override def getDisplayDamage(stack: ItemStack): Int = + { + return (100 - (this.getEnergy(stack).asInstanceOf[Double] / getEnergyCapacity(stack).asInstanceOf[Double]) * 100).asInstanceOf[Int] + } + + /** Gets the energy stored in the item. Energy is stored using item NBT */ + def getEnergy(itemStack: ItemStack): Double = + { + if (itemStack.getTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + val energyStored: Long = itemStack.getTagCompound.getLong("electricity") + return energyStored + } + + def getEnergyCapacity(theItem: ItemStack): Double = + { + return TileBattery.getEnergyForTier(ItemBlockBattery.getTier(theItem)) + } + + @SuppressWarnings(Array("unchecked")) + override def getSubItems(par1: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) + { + for (tier <- 0 to TileBattery.maxTier) + { + par3List.add(Compatibility.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(this), tier.asInstanceOf[Byte]), 0)) + par3List.add(Compatibility.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(this), tier.asInstanceOf[Byte]), TileBattery.getEnergyForTier(tier))) + + } + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/battery/TileBattery.scala b/src/main/scala/edx/electrical/battery/TileBattery.scala similarity index 99% rename from src/main/scala/resonantinduction/electrical/battery/TileBattery.scala rename to src/main/scala/edx/electrical/battery/TileBattery.scala index 3dcd4aed1..0eaaae596 100644 --- a/src/main/scala/resonantinduction/electrical/battery/TileBattery.scala +++ b/src/main/scala/edx/electrical/battery/TileBattery.scala @@ -1,8 +1,9 @@ -package resonantinduction.electrical.battery +package edx.electrical.battery import java.util.{ArrayList, Arrays, List} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase @@ -21,7 +22,6 @@ import resonant.lib.network.netty.AbstractPacket import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference /** A modular battery box that allows shared connections with boxes next to it. * diff --git a/src/main/scala/resonantinduction/electrical/generator/TileMotor.scala b/src/main/scala/edx/electrical/generator/TileMotor.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/generator/TileMotor.scala rename to src/main/scala/edx/electrical/generator/TileMotor.scala index c813efc5f..a4c6022fa 100644 --- a/src/main/scala/resonantinduction/electrical/generator/TileMotor.scala +++ b/src/main/scala/edx/electrical/generator/TileMotor.scala @@ -1,6 +1,8 @@ -package resonantinduction.electrical.generator +package edx.electrical.generator import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.mechanical.mech.grid.NodeMechanical import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer @@ -16,8 +18,6 @@ import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference -import resonantinduction.mechanical.mech.grid.NodeMechanical /** * A kinetic energy to electrical energy converter. diff --git a/src/main/scala/resonantinduction/electrical/generator/TileSolarPanel.scala b/src/main/scala/edx/electrical/generator/TileSolarPanel.scala similarity index 94% rename from src/main/scala/resonantinduction/electrical/generator/TileSolarPanel.scala rename to src/main/scala/edx/electrical/generator/TileSolarPanel.scala index 4fc1159f0..930afb7e7 100644 --- a/src/main/scala/resonantinduction/electrical/generator/TileSolarPanel.scala +++ b/src/main/scala/edx/electrical/generator/TileSolarPanel.scala @@ -1,6 +1,7 @@ -package resonantinduction.electrical.generator +package edx.electrical.generator import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Reference, Settings} import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.util.IIcon @@ -8,7 +9,6 @@ import resonant.lib.prefab.tile.TileElectric import resonant.lib.prefab.tile.spatial.SpatialBlock import resonant.lib.render.block.RenderConnectedTexture import resonant.lib.transform.region.Cuboid -import resonantinduction.core.{Reference, Settings} class TileSolarPanel extends TileElectric(Material.iron) with RenderConnectedTexture { diff --git a/src/main/scala/resonantinduction/electrical/generator/TileThermopile.scala b/src/main/scala/edx/electrical/generator/TileThermopile.scala similarity index 66% rename from src/main/scala/resonantinduction/electrical/generator/TileThermopile.scala rename to src/main/scala/edx/electrical/generator/TileThermopile.scala index d8f0a51e2..61f680a97 100644 --- a/src/main/scala/resonantinduction/electrical/generator/TileThermopile.scala +++ b/src/main/scala/edx/electrical/generator/TileThermopile.scala @@ -1,7 +1,7 @@ -package resonantinduction.electrical.generator +package edx.electrical.generator -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IIconRegister @@ -10,56 +10,79 @@ import net.minecraft.util.IIcon import net.minecraftforge.common.util.ForgeDirection import resonant.lib.prefab.tile.TileElectric import resonant.lib.prefab.tile.spatial.SpatialBlock -import resonantinduction.core.Reference import resonant.lib.transform.vector.Vector3 -class TileThermopile extends TileElectric(Material.rock) { +class TileThermopile extends TileElectric(Material.rock) +{ - this.ioMap = 728.asInstanceOf[Short] + this.ioMap = 728.asInstanceOf[Short] - override def update { + private final val MAX_USE_TICKS: Int = 120 * 20 + /** + * The amount of ticks the thermopile will use the temperature differences before turning all + * adjacent sides to thermal equilibrium. + */ + private var usingTicks: Int = 0 + + override def update + { super.update - if (!this.worldObj.isRemote) { + if (!this.worldObj.isRemote) + { var heatSources: Int = 0 var coolingSources: Int = 0 - for (dir <- ForgeDirection.VALID_DIRECTIONS) { + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { val checkPos: Vector3 = toVector3.add(dir) val block: Block = checkPos.getBlock(worldObj) - if (block eq Blocks.water) { + if (block eq Blocks.water) + { coolingSources += 1 } - else if (block eq Blocks.snow) { + else if (block eq Blocks.snow) + { coolingSources += 2 } - else if (block eq Blocks.ice) { + else if (block eq Blocks.ice) + { coolingSources += 2 } - else if (block eq Blocks.fire) { + else if (block eq Blocks.fire) + { heatSources += 1 } - else if (block eq Blocks.lava) { + else if (block eq Blocks.lava) + { heatSources += 2 } } val multiplier: Int = (3 - Math.abs(heatSources - coolingSources)) - if (multiplier > 0 && coolingSources > 0 && heatSources > 0) { -// electricNode.addEnergy(ForgeDirection.UNKNOWN, 15 * multiplier, true) + if (multiplier > 0 && coolingSources > 0 && heatSources > 0) + { + // electricNode.addEnergy(ForgeDirection.UNKNOWN, 15 * multiplier, true) if (({ - usingTicks += 1; usingTicks - }) >= MAX_USE_TICKS) { - for (dir <- ForgeDirection.VALID_DIRECTIONS) { + usingTicks += 1; + usingTicks + }) >= MAX_USE_TICKS) + { + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { val checkPos: Vector3 = toVector3.add(dir) val blockID: Block = checkPos.getBlock(worldObj) - if (blockID eq Blocks.water) { + if (blockID eq Blocks.water) + { checkPos.setBlockToAir(worldObj) } - else if (blockID eq Blocks.ice) { + else if (blockID eq Blocks.ice) + { checkPos.setBlock(worldObj, Blocks.water) } - else if (blockID eq Blocks.fire) { + else if (blockID eq Blocks.fire) + { checkPos.setBlockToAir(worldObj) } - else if (blockID eq Blocks.lava) { + else if (blockID eq Blocks.lava) + { checkPos.setBlock(worldObj, Blocks.stone) } } @@ -83,11 +106,4 @@ class TileThermopile extends TileElectric(Material.rock) { } return super.getIcon(side, meta) } - - private final val MAX_USE_TICKS: Int = 120 * 20 - /** - * The amount of ticks the thermopile will use the temperature differences before turning all - * adjacent sides to thermal equilibrium. - */ - private var usingTicks: Int = 0 } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala b/src/main/scala/edx/electrical/multimeter/ContainerMultimeter.scala similarity index 87% rename from src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala rename to src/main/scala/edx/electrical/multimeter/ContainerMultimeter.scala index ea6400147..9c6bed1c3 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala +++ b/src/main/scala/edx/electrical/multimeter/ContainerMultimeter.scala @@ -1,7 +1,7 @@ /** * */ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} import net.minecraft.inventory.{Container, Slot} @@ -28,5 +28,5 @@ class ContainerMultimeter(inventoryPlayer: InventoryPlayer, tileEntity: PartMult super.onContainerClosed(entityPlayer) } - def canInteractWith(entityplayer: EntityPlayer): Boolean = true + def canInteractWith(entityplayer: EntityPlayer): Boolean = true } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala b/src/main/scala/edx/electrical/multimeter/GuiMultimeter.scala similarity index 98% rename from src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala rename to src/main/scala/edx/electrical/multimeter/GuiMultimeter.scala index 2a3227158..7fed58d94 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala +++ b/src/main/scala/edx/electrical/multimeter/GuiMultimeter.scala @@ -1,7 +1,7 @@ /** * */ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter import cpw.mods.fml.relauncher.{Side, SideOnly} import net.minecraft.client.gui.{GuiButton, GuiTextField} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala b/src/main/scala/edx/electrical/multimeter/ItemMultimeter.scala similarity index 93% rename from src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala rename to src/main/scala/edx/electrical/multimeter/ItemMultimeter.scala index 7cd915d03..c466fe9b3 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala +++ b/src/main/scala/edx/electrical/multimeter/ItemMultimeter.scala @@ -1,10 +1,12 @@ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} import codechicken.microblock.FacePlacementGrid import codechicken.multipart.{JItemMultiPart, PartMap, TMultiPart, TileMultipart} +import edx.core.ResonantPartFactory +import edx.core.prefab.part.IHighlight import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -15,8 +17,6 @@ import org.lwjgl.input.Keyboard import resonant.lib.render.EnumColor import resonant.lib.utility.LanguageUtility import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.ResonantPartFactory -import resonantinduction.core.prefab.part.IHighlight class ItemMultimeter extends JItemMultiPart with IHighlight { @@ -76,5 +76,5 @@ class ItemMultimeter extends JItemMultiPart with IHighlight itemStack.stackTagCompound.setFloat("detection", detection) } - def getHighlightType: Int = 0 + def getHighlightType: Int = 0 } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala b/src/main/scala/edx/electrical/multimeter/MultimeterGrid.scala similarity index 97% rename from src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala rename to src/main/scala/edx/electrical/multimeter/MultimeterGrid.scala index cda30a687..205d02215 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala +++ b/src/main/scala/edx/electrical/multimeter/MultimeterGrid.scala @@ -1,12 +1,12 @@ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter +import edx.electrical.multimeter.graph._ import net.minecraft.nbt.{NBTTagCompound, NBTTagList} import resonant.api.IUpdate -import resonant.lib.grid.{UpdateTicker, Grid} -import resonant.lib.utility.science.UnitDisplay -import resonant.lib.utility.LanguageUtility -import resonantinduction.electrical.multimeter.graph._ +import resonant.lib.grid.{Grid, UpdateTicker} import resonant.lib.transform.vector.Vector3 +import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.science.UnitDisplay import scala.collection.convert.wrapAll._ import scala.collection.mutable.ArrayBuffer @@ -14,12 +14,6 @@ import scala.collection.mutable.ArrayBuffer class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with IUpdate { final val displayInformation = new ArrayBuffer[String] - - /** - * Maximum data points a graph can store. - */ - private val maxData: Int = 1 - /** * The available graphs to be handled. */ @@ -33,6 +27,10 @@ class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with final val fluidGraph: GraphI = new GraphI("fluid", maxData) final val thermalGraph: GraphF = new GraphF("temperature", maxData) final val pressureGraph: GraphI = new GraphI("pressure", maxData) + /** + * Maximum data points a graph can store. + */ + private val maxData: Int = 1 /** * The absolute center of the multimeter screens. */ @@ -46,12 +44,12 @@ class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with * The overall size of the multimeter */ var size: Vector3 = new Vector3 - private var doUpdate: Boolean = false /** * If the screen is not a perfect rectangle, don't render. */ var isEnabled: Boolean = true var primaryMultimeter: PartMultimeter = null + private var doUpdate: Boolean = false graphs += energyGraph graphs += powerGraph @@ -141,22 +139,6 @@ class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with } } - protected override def reconstructNode(node: PartMultimeter) - { - node.setNetwork(this) - if (primaryMultimeter == null) primaryMultimeter = node - if (upperBound == null) - { - upperBound = node.getPosition.add(1) - } - if (lowerBound == null) - { - lowerBound = node.getPosition - } - upperBound = upperBound.max(node.getPosition.add(1)) - lowerBound = lowerBound.min(node.getPosition) - } - def load(nbt: NBTTagCompound) { val nbtList: NBTTagList = nbt.getTagList("graphs", 0) @@ -177,4 +159,20 @@ class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with return nbt } + protected override def reconstructNode(node: PartMultimeter) + { + node.setNetwork(this) + if (primaryMultimeter == null) primaryMultimeter = node + if (upperBound == null) + { + upperBound = node.getPosition.add(1) + } + if (lowerBound == null) + { + lowerBound = node.getPosition + } + upperBound = upperBound.max(node.getPosition.add(1)) + lowerBound = lowerBound.min(node.getPosition) + } + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.scala b/src/main/scala/edx/electrical/multimeter/PartMultimeter.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.scala rename to src/main/scala/edx/electrical/multimeter/PartMultimeter.scala index 4e13cafc7..c0ebe3320 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.scala +++ b/src/main/scala/edx/electrical/multimeter/PartMultimeter.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter import java.util.{ArrayList, HashSet, List, Set} @@ -7,6 +7,11 @@ import codechicken.lib.vec import codechicken.lib.vec.Cuboid6 import codechicken.multipart.{IRedstonePart, TMultiPart, TileMultipart} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Electrodynamics +import edx.core.interfaces.TNodeMechanical +import edx.core.prefab.part.ChickenBonesWrapper._ +import edx.core.prefab.part.PartFace +import edx.electrical.ElectricalContent import io.netty.buffer.ByteBuf import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -16,16 +21,11 @@ import net.minecraft.util.{ChatComponentText, MovingObjectPosition} import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.{FluidTankInfo, IFluidHandler} import resonant.api.tile.{INodeProvider, IRemovable} +import resonant.lib.mod.compat.energy.Compatibility import resonant.lib.network.discriminator.PacketType import resonant.lib.network.handle.IPacketReceiver -import resonant.lib.mod.compat.energy.Compatibility import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.WrenchUtility -import resonantinduction.core.ResonantInduction -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.core.prefab.part.ChickenBonesWrapper._ -import resonantinduction.core.prefab.part.PartFace -import resonantinduction.electrical.ElectricalContent import scala.collection.convert.wrapAll._ @@ -36,35 +36,17 @@ import scala.collection.convert.wrapAll._ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver with IRemovable.ISneakWrenchable { - object DetectModes extends Enumeration - { - - case class DetectMode(display: String) extends super.Val(nextId) - - val NONE = DetectMode("none") - val LESS_THAN = DetectMode("lessThan") - val LESS_THAN_EQUAL = DetectMode("lessThanOrEqual") - val EQUAL = DetectMode("equal") - val GREATER_THAN_EQUAL = DetectMode("greaterThanOrEqual") - val GREATER_THAN = DetectMode("greaterThan") - } - var playersUsing: Set[EntityPlayer] = new HashSet[EntityPlayer] /** Detection */ var redstoneTriggerLimit: Double = .0 var detectType: Byte = 0 var graphType: Byte = 0 - private var detectMode = DetectModes.NONE var redstoneOn: Boolean = false - private var doDetect: Boolean = true var isPrimary: Boolean = false + private var detectMode = DetectModes.NONE + private var doDetect: Boolean = true private var network: MultimeterGrid = null - def hasMultimeter(x: Int, y: Int, z: Int): Boolean = - { - return getMultimeter(x, y, z) != null - } - override def preRemove { if (!world.isRemote) @@ -76,28 +58,6 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi writeDesc(getWriteStream) } - def updateGraph() - { - sendPacket(2) - } - - /** Gets the multimeter on the same plane. */ - def getMultimeter(x: Int, y: Int, z: Int): PartMultimeter = - { - val tileEntity: TileEntity = world.getTileEntity(x, y, z) - - if (tileEntity.isInstanceOf[TileMultipart]) - { - val part: TMultiPart = (tileEntity.asInstanceOf[TileMultipart]).partMap(placementSide.ordinal) - if (part.isInstanceOf[PartMultimeter]) - { - return part.asInstanceOf[PartMultimeter] - } - } - - return null - } - override def activate(player: EntityPlayer, part: MovingObjectPosition, item: ItemStack): Boolean = { if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem, x, y, z)) @@ -110,7 +70,7 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi } return true } - player.openGui(ResonantInduction, placementSide.ordinal, world, x, y, z) + player.openGui(Electrodynamics, placementSide.ordinal, world, x, y, z) return true } @@ -159,6 +119,11 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi } } + def updateGraph() + { + sendPacket(2) + } + def updateDetections() { val receivingSide: ForgeDirection = getDirection.getOpposite @@ -190,6 +155,17 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi getNetwork.energyCapacityGraph.queue(Compatibility.getMaxEnergy(tileEntity, receivingSide)) } + def getDetectedTile: TileEntity = + { + val direction: ForgeDirection = getDirection + return world.getTileEntity(x + direction.offsetX, y + direction.offsetY, z + direction.offsetZ) + } + + def getDirection: ForgeDirection = + { + return ForgeDirection.getOrientation(this.placementSide.ordinal) + } + override def write(packet: MCDataOutput, id: Int) { super.write(packet, id) @@ -260,23 +236,16 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi redstoneTriggerLimit = data.readDouble } - def getDetectedTile: TileEntity = - { - val direction: ForgeDirection = getDirection - return world.getTileEntity(x + direction.offsetX, y + direction.offsetY, z + direction.offsetZ) - } - - def getDirection: ForgeDirection = - { - return ForgeDirection.getOrientation(this.placementSide.ordinal) - } - def toggleGraphType { graphType = ((graphType + 1) % getNetwork.graphs.size).asInstanceOf[Byte] updateServer } + def updateServer + { + } + def toggleMode { detectMode = DetectModes((detectMode.id + 1) % DetectModes.values.size).asInstanceOf[DetectModes.DetectMode] @@ -289,10 +258,6 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi updateServer } - def updateServer - { - } - override def load(nbt: NBTTagCompound) { super.load(nbt) @@ -327,11 +292,6 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi return true } - protected def getItem: ItemStack = - { - return new ItemStack(ElectricalContent.itemMultimeter) - } - @SideOnly(Side.CLIENT) override def renderDynamic(pos: vec.Vector3, frame: Float, pass: Int) { @@ -356,21 +316,6 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi return if (redstoneOn) 14 else 0 } - def getNetwork: MultimeterGrid = - { - if (network == null) - { - network = new MultimeterGrid - network.add(this) - } - return network - } - - def setNetwork(network: MultimeterGrid) - { - this.network = network - } - def canConnect(direction: ForgeDirection, obj: AnyRef): Boolean = { return obj.isInstanceOf[PartMultimeter] @@ -393,6 +338,28 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi return connections } + def hasMultimeter(x: Int, y: Int, z: Int): Boolean = + { + return getMultimeter(x, y, z) != null + } + + /** Gets the multimeter on the same plane. */ + def getMultimeter(x: Int, y: Int, z: Int): PartMultimeter = + { + val tileEntity: TileEntity = world.getTileEntity(x, y, z) + + if (tileEntity.isInstanceOf[TileMultipart]) + { + val part: TMultiPart = (tileEntity.asInstanceOf[TileMultipart]).partMap(placementSide.ordinal) + if (part.isInstanceOf[PartMultimeter]) + { + return part.asInstanceOf[PartMultimeter] + } + } + + return null + } + def getPosition: Vector3 = { return new Vector3(x, y, z) @@ -405,5 +372,40 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi return Cuboid6.full } + def getNetwork: MultimeterGrid = + { + if (network == null) + { + network = new MultimeterGrid + network.add(this) + } + return network + } + + def setNetwork(network: MultimeterGrid) + { + this.network = network + } + override def toString: String = "[PartMultimeter]" + x + "x " + y + "y " + z + "z " + getSlotMask + "s " + + protected def getItem: ItemStack = + { + return new ItemStack(ElectricalContent.itemMultimeter) + } + + object DetectModes extends Enumeration + { + + val NONE = DetectMode("none") + val LESS_THAN = DetectMode("lessThan") + val LESS_THAN_EQUAL = DetectMode("lessThanOrEqual") + val EQUAL = DetectMode("equal") + val GREATER_THAN_EQUAL = DetectMode("greaterThanOrEqual") + val GREATER_THAN = DetectMode("greaterThan") + + case class DetectMode(display: String) extends super.Val(nextId) + + } + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.scala b/src/main/scala/edx/electrical/multimeter/RenderMultimeter.scala similarity index 98% rename from src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.scala rename to src/main/scala/edx/electrical/multimeter/RenderMultimeter.scala index a27ac1da5..c4a7e8bae 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.scala +++ b/src/main/scala/edx/electrical/multimeter/RenderMultimeter.scala @@ -1,6 +1,7 @@ -package resonantinduction.electrical.multimeter +package edx.electrical.multimeter import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.client.renderer.texture.TextureMap import net.minecraft.init.Blocks import net.minecraft.item.ItemStack @@ -12,7 +13,6 @@ import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.LanguageUtility -import resonantinduction.core.Reference /** * Class used to render text onto the multimeter block. @@ -27,47 +27,6 @@ object RenderMultimeter extends ISimpleItemRenderer { private final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "multimeter.png") - def render() - { - GL11.glPushMatrix() - GL11.glRotatef(90, 1, 0, 0) - RenderUtility.bind(TextureMap.locationBlocksTexture) - RenderUtility.renderCube(-0.5, -0.05, -0.5, 0.5, 0.05, 0.5, Blocks.iron_block, RenderUtility.loadedIconMap.get(Reference.prefix + "multimeter_screen")) - val dir: ForgeDirection = ForgeDirection.NORTH - val metadata: Int = 8 - RenderUtility.renderCube(-0.501, -0.0501, -0.501, 0.501, 0.0501, -0.44, Blocks.iron_block, null, metadata) - RenderUtility.renderCube(-0.501, -0.0501, 0.44, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) - - for (i <- 0 until 6) - { - val check: ForgeDirection = ForgeDirection.getOrientation(i) - if (dir.offsetX != 0 && check.offsetZ != 0) - { - if (dir.offsetX != check.offsetZ) - { - RenderUtility.renderCube(-0.501, -0.0501, -0.501, -0.44, 0.0501, 0.501, Blocks.iron_block, null, metadata) - } - else if (dir.offsetX == check.offsetZ) - { - RenderUtility.renderCube(0.44, -0.0501, -0.501, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) - } - } - if (dir.offsetZ != 0 && check.offsetX != 0) - { - if (dir.offsetZ == check.offsetX) - { - RenderUtility.renderCube(-0.501, -0.0501, -0.501, -0.44, 0.0501, 0.501, Blocks.iron_block, null, metadata) - } - else if (dir.offsetZ != check.offsetX) - { - RenderUtility.renderCube(0.44, -0.0501, -0.501, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) - } - } - } - - GL11.glPopMatrix() - } - def render(part: PartMultimeter, x: Double, y: Double, z: Double) { val dir: ForgeDirection = part.getDirection @@ -175,4 +134,45 @@ object RenderMultimeter extends ISimpleItemRenderer { render } + + def render() + { + GL11.glPushMatrix() + GL11.glRotatef(90, 1, 0, 0) + RenderUtility.bind(TextureMap.locationBlocksTexture) + RenderUtility.renderCube(-0.5, -0.05, -0.5, 0.5, 0.05, 0.5, Blocks.iron_block, RenderUtility.loadedIconMap.get(Reference.prefix + "multimeter_screen")) + val dir: ForgeDirection = ForgeDirection.NORTH + val metadata: Int = 8 + RenderUtility.renderCube(-0.501, -0.0501, -0.501, 0.501, 0.0501, -0.44, Blocks.iron_block, null, metadata) + RenderUtility.renderCube(-0.501, -0.0501, 0.44, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) + + for (i <- 0 until 6) + { + val check: ForgeDirection = ForgeDirection.getOrientation(i) + if (dir.offsetX != 0 && check.offsetZ != 0) + { + if (dir.offsetX != check.offsetZ) + { + RenderUtility.renderCube(-0.501, -0.0501, -0.501, -0.44, 0.0501, 0.501, Blocks.iron_block, null, metadata) + } + else if (dir.offsetX == check.offsetZ) + { + RenderUtility.renderCube(0.44, -0.0501, -0.501, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) + } + } + if (dir.offsetZ != 0 && check.offsetX != 0) + { + if (dir.offsetZ == check.offsetX) + { + RenderUtility.renderCube(-0.501, -0.0501, -0.501, -0.44, 0.0501, 0.501, Blocks.iron_block, null, metadata) + } + else if (dir.offsetZ != check.offsetX) + { + RenderUtility.renderCube(0.44, -0.0501, -0.501, 0.501, 0.0501, 0.501, Blocks.iron_block, null, metadata) + } + } + } + + GL11.glPopMatrix() + } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java b/src/main/scala/edx/electrical/multimeter/graph/Graph.java similarity index 95% rename from src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java rename to src/main/scala/edx/electrical/multimeter/graph/Graph.java index 9c0b248df..88c64fe67 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java +++ b/src/main/scala/edx/electrical/multimeter/graph/Graph.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter.graph; +package edx.electrical.multimeter.graph; import net.minecraft.nbt.NBTTagCompound; import resonant.lib.collection.EvictingList; @@ -7,7 +7,6 @@ import resonant.lib.collection.EvictingList; * Graph for the multimeter * * @author Calclavia - * */ public abstract class Graph> { diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphD.java b/src/main/scala/edx/electrical/multimeter/graph/GraphD.java similarity index 96% rename from src/main/scala/resonantinduction/electrical/multimeter/graph/GraphD.java rename to src/main/scala/edx/electrical/multimeter/graph/GraphD.java index 87cdfa8e6..6fe0752c7 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphD.java +++ b/src/main/scala/edx/electrical/multimeter/graph/GraphD.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter.graph; +package edx.electrical.multimeter.graph; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphF.java b/src/main/scala/edx/electrical/multimeter/graph/GraphF.java similarity index 96% rename from src/main/scala/resonantinduction/electrical/multimeter/graph/GraphF.java rename to src/main/scala/edx/electrical/multimeter/graph/GraphF.java index 6db4b3112..f76d0526c 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphF.java +++ b/src/main/scala/edx/electrical/multimeter/graph/GraphF.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter.graph; +package edx.electrical.multimeter.graph; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphI.java b/src/main/scala/edx/electrical/multimeter/graph/GraphI.java similarity index 96% rename from src/main/scala/resonantinduction/electrical/multimeter/graph/GraphI.java rename to src/main/scala/edx/electrical/multimeter/graph/GraphI.java index f7e655b23..a28646c7f 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphI.java +++ b/src/main/scala/edx/electrical/multimeter/graph/GraphI.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter.graph; +package edx.electrical.multimeter.graph; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphL.java b/src/main/scala/edx/electrical/multimeter/graph/GraphL.java similarity index 96% rename from src/main/scala/resonantinduction/electrical/multimeter/graph/GraphL.java rename to src/main/scala/edx/electrical/multimeter/graph/GraphL.java index 5bae342de..a3fecde71 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/GraphL.java +++ b/src/main/scala/edx/electrical/multimeter/graph/GraphL.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.multimeter.graph; +package edx.electrical.multimeter.graph; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; diff --git a/src/main/scala/edx/electrical/tesla/ITesla.scala b/src/main/scala/edx/electrical/tesla/ITesla.scala new file mode 100644 index 000000000..f1f2b5d43 --- /dev/null +++ b/src/main/scala/edx/electrical/tesla/ITesla.scala @@ -0,0 +1,22 @@ +/** + * + */ +package edx.electrical.tesla + +import net.minecraft.tileentity.TileEntity + +/** + * @author Calclavia + * + */ +abstract trait ITesla +{ + /** + * @param transferEnergy - The energy amount in kilojoules. + * @param doTransfer - Actually transfer + * @return Energy actually transfered. + */ + def teslaTransfer(transferEnergy: Double, doTransfer: Boolean): Double + + def canTeslaTransfer(transferTile: TileEntity): Boolean +} \ No newline at end of file diff --git a/src/main/scala/edx/electrical/tesla/RenderTesla.scala b/src/main/scala/edx/electrical/tesla/RenderTesla.scala new file mode 100644 index 000000000..87816d7a9 --- /dev/null +++ b/src/main/scala/edx/electrical/tesla/RenderTesla.scala @@ -0,0 +1,51 @@ +package edx.electrical.tesla + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 + +/** + * @author Calclavia + * + */ +@SideOnly(Side.CLIENT) object RenderTesla +{ + final val TEXTURE_BOTTOM: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_bottom.png") + final val TEXTURE_MIDDLE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_middle.png") + final val TEXTURE_TOP: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_top.png") + final val MODEL_BOTTOM: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaBottom.tcn")) + final val MODEL_MIDDLE: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaMiddle.tcn")) + final val MODEL_TOP: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaTop.tcn")) +} + +@SideOnly(Side.CLIENT) +class RenderTesla extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + val meta: Int = if (t.getBlockType != null) t.getBlockMetadata else 0 + + if (meta == 1) + { + bindTexture(RenderTesla.TEXTURE_MIDDLE) + RenderTesla.MODEL_MIDDLE.renderAll + } + else if (meta == 2) + { + bindTexture(RenderTesla.TEXTURE_TOP) + RenderTesla.MODEL_TOP.renderAll + } + else + { + bindTexture(RenderTesla.TEXTURE_BOTTOM) + RenderTesla.MODEL_BOTTOM.renderAll + } + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/tesla/TeslaGrid.java b/src/main/scala/edx/electrical/tesla/TeslaGrid.java similarity index 96% rename from src/main/scala/resonantinduction/electrical/tesla/TeslaGrid.java rename to src/main/scala/edx/electrical/tesla/TeslaGrid.java index 3579f776e..8446cd6e5 100644 --- a/src/main/scala/resonantinduction/electrical/tesla/TeslaGrid.java +++ b/src/main/scala/edx/electrical/tesla/TeslaGrid.java @@ -1,18 +1,18 @@ /** * */ -package resonantinduction.electrical.tesla; +package edx.electrical.tesla; + +import net.minecraft.tileentity.TileEntity; +import resonant.api.mffs.fortron.IServerThread; import java.util.Collections; import java.util.Iterator; import java.util.Set; import java.util.WeakHashMap; -import net.minecraft.tileentity.TileEntity; -import resonant.api.mffs.fortron.IServerThread; /** * @author Calclavia - * */ @Deprecated // TODO "Should be replaced with a shared frequency grid" - from Darkguardsman public class TeslaGrid @@ -22,6 +22,18 @@ public class TeslaGrid private final Set tileEntities = Collections.newSetFromMap(new WeakHashMap()); + public static TeslaGrid instance() + { + Thread thr = Thread.currentThread(); + + if (thr instanceof IServerThread) + { + return INSTANCE_SERVER; + } + + return INSTANCE_CLIENT; + } + public void register(ITesla iTesla) { Iterator it = this.tileEntities.iterator(); @@ -54,16 +66,4 @@ public class TeslaGrid { return this.tileEntities; } - - public static TeslaGrid instance() - { - Thread thr = Thread.currentThread(); - - if (thr instanceof IServerThread) - { - return INSTANCE_SERVER; - } - - return INSTANCE_CLIENT; - } } diff --git a/src/main/scala/resonantinduction/electrical/tesla/TileTesla.scala b/src/main/scala/edx/electrical/tesla/TileTesla.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/tesla/TileTesla.scala rename to src/main/scala/edx/electrical/tesla/TileTesla.scala index 96de093d1..015bb6846 100644 --- a/src/main/scala/resonantinduction/electrical/tesla/TileTesla.scala +++ b/src/main/scala/edx/electrical/tesla/TileTesla.scala @@ -1,11 +1,13 @@ /** * */ -package resonantinduction.electrical.tesla +package edx.electrical.tesla import java.util.{ArrayList, Comparator, HashSet, List, PriorityQueue, Set} import cpw.mods.fml.common.network.ByteBufUtils +import edx.core.util.ResonantUtil +import edx.core.{Electrodynamics, Reference, Settings} import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -20,15 +22,13 @@ import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection import resonant.lib.content.prefab.TEnergyStorage import resonant.lib.grid.energy.EnergyStorage -import resonant.lib.prefab.tile.multiblock.reference.{IMultiBlockStructure, MultiBlockHandler} import resonant.lib.network.discriminator.{PacketTile, PacketType} import resonant.lib.network.handle.{TPacketIDReceiver, TPacketSender} import resonant.lib.prefab.tile.TileElectric +import resonant.lib.prefab.tile.multiblock.reference.{IMultiBlockStructure, MultiBlockHandler} import resonant.lib.render.EnumColor import resonant.lib.transform.vector.{Vector3, VectorWorld} import resonant.lib.utility.{LanguageUtility, LinkUtility} -import resonantinduction.core.util.ResonantUtil -import resonantinduction.core.{Reference, ResonantInduction, Settings} import scala.collection.JavaConversions._ @@ -49,18 +49,14 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti { final val TRANSFER_CAP: Double = 10000D + /** Prevents transfer loops */ + final val outputBlacklist: Set[TileTesla] = new HashSet[TileTesla] + final val connectedTeslas: Set[TileTesla] = new HashSet[TileTesla] var dyeID: Int = TileTesla.DEFAULT_COLOR var canReceive: Boolean = true var attackEntities: Boolean = true /** Client side to do sparks */ var doTransfer: Boolean = true - /** Prevents transfer loops */ - final val outputBlacklist: Set[TileTesla] = new HashSet[TileTesla] - final val connectedTeslas: Set[TileTesla] = new HashSet[TileTesla] - /** - * Multiblock Methods. - */ - private var multiBlock: MultiBlockHandler[TileTesla] = null /** * Quantum Tesla */ @@ -73,6 +69,10 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti var isLinkedClient: Boolean = false var isTransfering: Boolean = false var topCache: TileTesla = null + /** + * Multiblock Methods. + */ + private var multiBlock: MultiBlockHandler[TileTesla] = null //Constructor //TODO: Dummy @@ -118,7 +118,7 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti } else { - ResonantInduction.proxy.renderElectricShock(this.worldObj, topTeslaVector.clone.add(0.5), topTeslaVector + new Vector3(0.5, java.lang.Double.POSITIVE_INFINITY, 0.5), false) + Electrodynamics.proxy.renderElectricShock(this.worldObj, topTeslaVector.clone.add(0.5), topTeslaVector + new Vector3(0.5, java.lang.Double.POSITIVE_INFINITY, 0.5), false) } } else @@ -179,7 +179,7 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti heightRange = (tesla.asInstanceOf[TileTesla]).getHeight } val distance: Double = topTeslaVector.distance(targetVector) - ResonantInduction.proxy.renderElectricShock(this.worldObj, topTesla.toVector3 + new Vector3(0.5), targetVector + new Vector3(0.5, Math.random * heightRange / 3 - heightRange / 3, 0.5), EnumColor.DYES(this.dyeID).toColor) + Electrodynamics.proxy.renderElectricShock(this.worldObj, topTesla.toVector3 + new Vector3(0.5), targetVector + new Vector3(0.5, Math.random * heightRange / 3 - heightRange / 3, 0.5), EnumColor.DYES(this.dyeID).toColor) this.transfer(tesla, Math.min(transferEnergy, TRANSFER_CAP)) if (!sentPacket && transferEnergy > 0) { @@ -202,15 +202,6 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti this.topCache = null } - private def transfer(tesla: ITesla, transferEnergy: Double) - { - if (transferEnergy > 0) - { - tesla.teslaTransfer(transferEnergy, true) - this.teslaTransfer(-transferEnergy, true) - } - } - def canTeslaTransfer(tileEntity: TileEntity): Boolean = { if (tileEntity.isInstanceOf[TileTesla]) @@ -281,6 +272,12 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti return false } + def getMultiBlock: MultiBlockHandler[TileTesla] = + { + if (multiBlock == null) multiBlock = new MultiBlockHandler[TileTesla](this) + return multiBlock + } + def teslaTransfer(e: Double, doTransfer: Boolean): Double = { var transferEnergy = e @@ -312,27 +309,6 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti return Math.min(4 * (this.getHeight - 1), 50) } - def updatePositionStatus - { - val mainTile: TileTesla = getLowestTesla - mainTile.getMultiBlock.deconstruct - mainTile.getMultiBlock.construct - val isTop: Boolean = (toVector3 + new Vector3(0, 1, 0)).getTileEntity(this.worldObj).isInstanceOf[TileTesla] - val isBottom: Boolean = (toVector3 + new Vector3(0, -1, 0)).getTileEntity(this.worldObj).isInstanceOf[TileTesla] - if (isTop && isBottom) - { - this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 1, 3) - } - else if (isBottom) - { - this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 2, 3) - } - else - { - this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 0, 3) - } - } - /** * Called only on bottom. * @@ -401,26 +377,6 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti super.invalidate } - def setDye(id: Int) - { - this.dyeID = id - this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord) - } - - def toggleReceive: Boolean = - { - this.canReceive = !this.canReceive - return canReceive - } - - def toggleEntityAttack: Boolean = - { - this.attackEntities = !this.attackEntities - val returnBool: Boolean = attackEntities - this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord) - return returnBool - } - /** * Reads a tile entity from NBT. */ @@ -523,41 +479,14 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti return vectors } - def getLowestTesla: TileTesla = - { - var lowest: TileTesla = this - val checkPosition: Vector3 = toVector3 - var exit = false - while (!exit) - { - val t: TileEntity = checkPosition.getTileEntity(this.worldObj) - if (t.isInstanceOf[TileTesla]) - { - lowest = t.asInstanceOf[TileTesla] - } - else - { - exit = true - } - checkPosition.add(0, -1, 0) - } - return lowest - } - - def getWorld: World = - { - return worldObj - } - def getPosition: Vector3 = { return toVector3 } - def getMultiBlock: MultiBlockHandler[TileTesla] = + def getWorld: World = { - if (multiBlock == null) multiBlock = new MultiBlockHandler[TileTesla](this) - return multiBlock + return worldObj } override def setIO(dir: ForgeDirection, `type`: Int) @@ -621,6 +550,26 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti return false } + def setDye(id: Int) + { + this.dyeID = id + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord) + } + + def toggleReceive: Boolean = + { + this.canReceive = !this.canReceive + return canReceive + } + + def toggleEntityAttack: Boolean = + { + this.attackEntities = !this.attackEntities + val returnBool: Boolean = attackEntities + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord) + return returnBool + } + override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { val itemStack: ItemStack = player.getCurrentEquippedItem @@ -646,4 +595,55 @@ class TileTesla extends TileElectric(Material.iron) with IMultiBlockStructure[Ti updatePositionStatus } + def updatePositionStatus + { + val mainTile: TileTesla = getLowestTesla + mainTile.getMultiBlock.deconstruct + mainTile.getMultiBlock.construct + val isTop: Boolean = (toVector3 + new Vector3(0, 1, 0)).getTileEntity(this.worldObj).isInstanceOf[TileTesla] + val isBottom: Boolean = (toVector3 + new Vector3(0, -1, 0)).getTileEntity(this.worldObj).isInstanceOf[TileTesla] + if (isTop && isBottom) + { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 1, 3) + } + else if (isBottom) + { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 2, 3) + } + else + { + this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, 0, 3) + } + } + + def getLowestTesla: TileTesla = + { + var lowest: TileTesla = this + val checkPosition: Vector3 = toVector3 + var exit = false + while (!exit) + { + val t: TileEntity = checkPosition.getTileEntity(this.worldObj) + if (t.isInstanceOf[TileTesla]) + { + lowest = t.asInstanceOf[TileTesla] + } + else + { + exit = true + } + checkPosition.add(0, -1, 0) + } + return lowest + } + + private def transfer(tesla: ITesla, transferEnergy: Double) + { + if (transferEnergy > 0) + { + tesla.teslaTransfer(transferEnergy, true) + this.teslaTransfer(-transferEnergy, true) + } + } + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/transformer/ElectricTransformerNode.scala b/src/main/scala/edx/electrical/transformer/ElectricTransformerNode.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/transformer/ElectricTransformerNode.scala rename to src/main/scala/edx/electrical/transformer/ElectricTransformerNode.scala index 9e7c2658b..5921e7aca 100644 --- a/src/main/scala/resonantinduction/electrical/transformer/ElectricTransformerNode.scala +++ b/src/main/scala/edx/electrical/transformer/ElectricTransformerNode.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.transformer +package edx.electrical.transformer import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.INodeProvider diff --git a/src/main/scala/edx/electrical/transformer/ItemElectricTransformer.scala b/src/main/scala/edx/electrical/transformer/ItemElectricTransformer.scala new file mode 100644 index 000000000..e36d9ad46 --- /dev/null +++ b/src/main/scala/edx/electrical/transformer/ItemElectricTransformer.scala @@ -0,0 +1,35 @@ +package edx.electrical.transformer + +import codechicken.lib.vec.{BlockCoord, Vector3} +import codechicken.microblock.FacePlacementGrid +import codechicken.multipart.{JItemMultiPart, TMultiPart} +import edx.core.ResonantPartFactory +import edx.core.prefab.part.IHighlight +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.util.MathHelper +import net.minecraft.world.World + +/** + * Item for Electric Transformer that handles block/part placement + */ +class ItemElectricTransformer extends JItemMultiPart with IHighlight +{ + override def newPart(itemStack: ItemStack, player: EntityPlayer, world: World, pos: BlockCoord, s: Int, hit: Vector3): TMultiPart = + { + val side: Int = FacePlacementGrid.getHitSlot(hit, s) + val part: PartElectricTransformer = ResonantPartFactory.create(classOf[PartElectricTransformer]) + if (part != null) + { + val l: Int = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3 + val facing: Int = if (l == 0) 2 else (if (l == 1) 5 else (if (l == 2) 3 else (if (l == 3) 4 else 0))) + part.preparePlacement(side, facing) + } + return part + } + + override def getHighlightType: Int = + { + return 0 + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/transformer/PartElectricTransformer.scala b/src/main/scala/edx/electrical/transformer/PartElectricTransformer.scala similarity index 95% rename from src/main/scala/resonantinduction/electrical/transformer/PartElectricTransformer.scala rename to src/main/scala/edx/electrical/transformer/PartElectricTransformer.scala index 0e3e7a698..c8caaeccb 100644 --- a/src/main/scala/resonantinduction/electrical/transformer/PartElectricTransformer.scala +++ b/src/main/scala/edx/electrical/transformer/PartElectricTransformer.scala @@ -1,8 +1,10 @@ -package resonantinduction.electrical.transformer +package edx.electrical.transformer import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.lib.vec.Vector3 import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.part.PartFace +import edx.electrical.ElectricalContent import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -11,8 +13,6 @@ import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.INodeProvider import resonant.api.tile.node.INode import resonant.lib.utility.WrenchUtility -import resonantinduction.core.prefab.part.PartFace -import resonantinduction.electrical.ElectricalContent /** * TODO: We can't use face parts, need to use thicker ones. Also, transformer is currently NO-OP @@ -53,11 +53,6 @@ class PartElectricTransformer extends PartFace with INodeProvider override def doesTick: Boolean = false - protected def getItem: ItemStack = - { - return new ItemStack(ElectricalContent.itemTransformer) - } - @SideOnly(Side.CLIENT) override def renderDynamic(pos: Vector3, frame: Float, pass: Int) { @@ -121,4 +116,9 @@ class PartElectricTransformer extends PartFace with INodeProvider return null.asInstanceOf[N] } + + protected def getItem: ItemStack = + { + return new ItemStack(ElectricalContent.itemTransformer) + } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/transformer/RenderTransformer.scala b/src/main/scala/edx/electrical/transformer/RenderTransformer.scala similarity index 97% rename from src/main/scala/resonantinduction/electrical/transformer/RenderTransformer.scala rename to src/main/scala/edx/electrical/transformer/RenderTransformer.scala index 492bb4a8e..ccd8ed968 100644 --- a/src/main/scala/resonantinduction/electrical/transformer/RenderTransformer.scala +++ b/src/main/scala/edx/electrical/transformer/RenderTransformer.scala @@ -1,7 +1,8 @@ -package resonantinduction.electrical.transformer +package edx.electrical.transformer import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import net.minecraftforge.client.IItemRenderer @@ -10,7 +11,6 @@ import net.minecraftforge.client.model.obj.WavefrontObject import org.lwjgl.opengl.GL11 import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference @SideOnly(Side.CLIENT) object RenderTransformer extends ISimpleItemRenderer diff --git a/src/main/scala/resonantinduction/electrical/wire/ItemWire.scala b/src/main/scala/edx/electrical/wire/ItemWire.scala similarity index 87% rename from src/main/scala/resonantinduction/electrical/wire/ItemWire.scala rename to src/main/scala/edx/electrical/wire/ItemWire.scala index a22440eb8..62456a027 100644 --- a/src/main/scala/resonantinduction/electrical/wire/ItemWire.scala +++ b/src/main/scala/edx/electrical/wire/ItemWire.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.wire +package edx.electrical.wire import java.awt.Color import java.util.List @@ -6,7 +6,11 @@ import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} import codechicken.multipart._ import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.texture.IIconRegister +import edx.core.util.MultipartUtil +import edx.core.{Reference, ResonantPartFactory} +import edx.electrical.wire.base.WireMaterial +import edx.electrical.wire.flat.PartFlatWire +import edx.electrical.wire.framed.PartFramedWire import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} @@ -14,14 +18,9 @@ import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.input.Keyboard import resonant.lib.render.EnumColor -import resonant.lib.utility.science.UnitDisplay import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.science.UnitDisplay import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.util.MultipartUtil -import resonantinduction.core.{Reference, ResonantPartFactory, RICreativeTab} -import resonantinduction.electrical.wire.base.WireMaterial -import resonantinduction.electrical.wire.flat.{PartFlatWire, RenderFlatWire} -import resonantinduction.electrical.wire.framed.PartFramedWire class ItemWire extends TItemMultiPart { diff --git a/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala b/src/main/scala/edx/electrical/wire/base/TWire.scala similarity index 91% rename from src/main/scala/resonantinduction/electrical/wire/base/TWire.scala rename to src/main/scala/edx/electrical/wire/base/TWire.scala index 36a71143e..9e2e86daa 100644 --- a/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala +++ b/src/main/scala/edx/electrical/wire/base/TWire.scala @@ -1,10 +1,10 @@ -package resonantinduction.electrical.wire.base +package edx.electrical.wire.base import codechicken.lib.data.{MCDataInput, MCDataOutput} +import edx.core.prefab.part.connector._ +import edx.electrical.ElectricalContent import net.minecraft.item.{Item, ItemStack} import net.minecraft.nbt.NBTTagCompound -import resonantinduction.core.prefab.part.connector._ -import resonantinduction.electrical.ElectricalContent /** * Abstract class extended by both flat and framed wires to handle material, insulation, color and multipart node logic. @@ -30,10 +30,6 @@ trait TWire extends PartAbstract with TPartNodeProvider with TMaterial[WireMater material = WireMaterial.values()(i) } - override def getMaterialID = material.ordinal() - - override protected def getItem = new ItemStack(ElectricalContent.itemWire, getMaterialID) - /** * Packet Methods */ @@ -67,4 +63,8 @@ trait TWire extends PartAbstract with TPartNodeProvider with TMaterial[WireMater super[TInsulatable].save(nbt) super[TColorable].save(nbt) } + + override protected def getItem = new ItemStack(ElectricalContent.itemWire, getMaterialID) + + override def getMaterialID = material.ordinal() } diff --git a/src/main/scala/resonantinduction/electrical/wire/base/WireMaterial.java b/src/main/scala/edx/electrical/wire/base/WireMaterial.java similarity index 83% rename from src/main/scala/resonantinduction/electrical/wire/base/WireMaterial.java rename to src/main/scala/edx/electrical/wire/base/WireMaterial.java index e4afcc927..d655b0d69 100644 --- a/src/main/scala/resonantinduction/electrical/wire/base/WireMaterial.java +++ b/src/main/scala/edx/electrical/wire/base/WireMaterial.java @@ -1,9 +1,4 @@ -package resonantinduction.electrical.wire.base; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; +package edx.electrical.wire.base; /** * An enumerator for different wire materials. The metadata of the wire determines the type of the diff --git a/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala b/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala similarity index 98% rename from src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala rename to src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala index cc0705724..2f018a4b0 100644 --- a/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala +++ b/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.wire.flat +package edx.electrical.wire.flat import java.lang.{Iterable => JIterable} @@ -8,6 +8,11 @@ import codechicken.lib.render.{CCRenderState, TextureUtils} import codechicken.lib.vec.{BlockCoord, Cuboid6, Rotation, Vector3} import codechicken.multipart._ import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.node.TMultipartNode +import edx.core.prefab.part.ChickenBonesWrapper._ +import edx.core.prefab.part.connector.{PartAbstract, TColorable} +import edx.core.util.MultipartUtil +import edx.electrical.wire.base.TWire import net.minecraft.client.renderer.RenderBlocks import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -18,11 +23,6 @@ import org.lwjgl.opengl.GL11 import resonant.api.tile.INodeProvider import resonant.lib.grid.UpdateTicker import resonant.lib.grid.electric.NodeDirectCurrent -import resonantinduction.core.prefab.node.TMultipartNode -import resonantinduction.core.prefab.part.ChickenBonesWrapper._ -import resonantinduction.core.prefab.part.connector.{PartAbstract, TColorable} -import resonantinduction.core.util.MultipartUtil -import resonantinduction.electrical.wire.base.TWire import scala.collection.convert.wrapAll._ @@ -223,28 +223,6 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc super.onChunkLoad() } - def dropIfCantStay: Boolean = - { - if (!canStay) - { - drop - return true - } - return false - } - - def canStay: Boolean = - { - val pos: BlockCoord = new BlockCoord(tile).offset(side) - return MultipartUtil.canPlaceWireOnSide(world, pos.x, pos.y, pos.z, ForgeDirection.getOrientation(side ^ 1), false) - } - - def drop - { - TileMultipart.dropItem(getItem, world, Vector3.fromTileEntityCenter(tile)) - tile.remPart(this) - } - override def onAdded() { super.onAdded() @@ -273,6 +251,28 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc sendPacket(3) } + def dropIfCantStay: Boolean = + { + if (!canStay) + { + drop + return true + } + return false + } + + def canStay: Boolean = + { + val pos: BlockCoord = new BlockCoord(tile).offset(side) + return MultipartUtil.canPlaceWireOnSide(world, pos.x, pos.y, pos.z, ForgeDirection.getOrientation(side ^ 1), false) + } + + def drop + { + TileMultipart.dropItem(getItem, world, Vector3.fromTileEntityCenter(tile)) + tile.remPart(this) + } + def maskOpen(r: Int): Boolean = { return (connectionMask & 0x1000 << r) != 0 @@ -287,10 +287,10 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc override def getSubParts: JIterable[IndexedCuboid6] = Seq(new IndexedCuboid6(0, PartFlatWire.selectionBounds(getThickness)(side))) - def getOcclusionBoxes: JIterable[Cuboid6] = Seq(PartFlatWire.occlusionBounds(getThickness)(side)) - def getThickness: Int = if (insulated) 2 else 1 + def getOcclusionBoxes: JIterable[Cuboid6] = Seq(PartFlatWire.occlusionBounds(getThickness)(side)) + override def solid(arg0: Int) = false /** @@ -312,8 +312,6 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc return false } - def useStaticRenderer: Boolean = true - @SideOnly(Side.CLIENT) override def renderDynamic(pos: Vector3, frame: Float, pass: Int) { @@ -329,6 +327,8 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc } } + def useStaticRenderer: Boolean = true + @SideOnly(Side.CLIENT) override def drawBreaking(renderBlocks: RenderBlocks) { diff --git a/src/main/scala/resonantinduction/electrical/wire/flat/RenderFlatWire.scala b/src/main/scala/edx/electrical/wire/flat/RenderFlatWire.scala similarity index 90% rename from src/main/scala/resonantinduction/electrical/wire/flat/RenderFlatWire.scala rename to src/main/scala/edx/electrical/wire/flat/RenderFlatWire.scala index 12f078362..87d998a2b 100644 --- a/src/main/scala/resonantinduction/electrical/wire/flat/RenderFlatWire.scala +++ b/src/main/scala/edx/electrical/wire/flat/RenderFlatWire.scala @@ -1,17 +1,17 @@ -package resonantinduction.electrical.wire.flat +package edx.electrical.wire.flat -import java.util.{Arrays, LinkedList} +import java.util.LinkedList import codechicken.lib.lighting.LightModel -import codechicken.lib.math.MathHelper import codechicken.lib.render._ import codechicken.lib.render.uv._ import codechicken.lib.vec.{Cuboid6, Rotation, Transformation, Translation, Vector3} +import edx.core.util.ResonantUtil import net.minecraft.util.IIcon -import resonantinduction.core.util.ResonantUtil object RenderFlatWire { + val gen_inst = new WireModelGenerator var wireIcon: IIcon = null var reorientSide: Array[Int] = Array[Int](0, 3, 3, 0, 0, 3) /** @@ -19,7 +19,6 @@ object RenderFlatWire */ var wireModels: Array[CCModel] = new Array[CCModel](3 * 6 * 256) var invModels: Array[CCModel] = new Array[CCModel](3) - val gen_inst = new WireModelGenerator /** * Puts verts into model m starting at index k @@ -31,7 +30,7 @@ object RenderFlatWire while (i < verts.length) { m.verts(k + i) = verts(i) - ({i += 1; i - 1 }) + ({i += 1; i - 1}) } } return k + verts.length @@ -46,6 +45,20 @@ object RenderFlatWire return m } + def render(wire: PartFlatWire, pos: Vector3) + { + //If it is insulated, render the insulation color. Otherwise, render the material color. + val colorCode = if (wire.insulated) ResonantUtil.convertRGBtoRGBA(ResonantUtil.getColorHex(wire.getColor)) else ResonantUtil.convertRGBtoRGBA(wire.material.color) + + val model = getOrGenerateModel(modelKey(wire)) + model.render(new Translation(pos), new IconTransformation(wire.getIcon), new ColourMultiplier(colorCode)) + } + + def modelKey(w: PartFlatWire): Int = + { + return modelKey(w.side, w.getThickness, w.connectionMask) + } + /** * Returns a tightly packed unique index for the specific model represented * by this wire. The mask is split into 3 sections the combination of @@ -74,33 +87,19 @@ object RenderFlatWire return key } - def modelKey(w: PartFlatWire): Int = - { - return modelKey(w.side, w.getThickness, w.connectionMask) - } - def getOrGenerateModel(key: Int): CCModel = { var m: CCModel = wireModels(key) if (m == null) wireModels(key) = - {m = gen_inst.generateModel(key, false); m } + {m = gen_inst.generateModel(key, false); m} return m } - def render(wire: PartFlatWire, pos: Vector3) - { - //If it is insulated, render the insulation color. Otherwise, render the material color. - val colorCode = if(wire.insulated) ResonantUtil.convertRGBtoRGBA(ResonantUtil.getColorHex(wire.getColor)) else ResonantUtil.convertRGBtoRGBA(wire.material.color) - - val model = getOrGenerateModel(modelKey(wire)) - model.render(new Translation(pos), new IconTransformation(wire.getIcon), new ColourMultiplier(colorCode)) - } - def renderInv(thickness: Int, t: Transformation, icon: IIcon) { var m: CCModel = invModels(thickness) if (m == null) invModels(thickness) = - {m = gen_inst.generateInvModel(thickness); m } + {m = gen_inst.generateInvModel(thickness); m} m.render(t, new IconTransformation(icon)) } @@ -139,7 +138,6 @@ object RenderFlatWire } } - class UVT(t: Transformation) extends UVTransformation { val vec = new Vector3 @@ -156,4 +154,5 @@ object RenderFlatWire } } + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/wire/flat/WireModelGenerator.scala b/src/main/scala/edx/electrical/wire/flat/WireModelGenerator.scala similarity index 97% rename from src/main/scala/resonantinduction/electrical/wire/flat/WireModelGenerator.scala rename to src/main/scala/edx/electrical/wire/flat/WireModelGenerator.scala index 825191820..63ce266a0 100644 --- a/src/main/scala/resonantinduction/electrical/wire/flat/WireModelGenerator.scala +++ b/src/main/scala/edx/electrical/wire/flat/WireModelGenerator.scala @@ -1,11 +1,11 @@ -package resonantinduction.electrical.wire.flat +package edx.electrical.wire.flat import java.util.Arrays import codechicken.lib.math.MathHelper import codechicken.lib.render.uv.{UVTransformation, UVTranslation} -import codechicken.lib.render.{Vertex5, CCModel} -import codechicken.lib.vec.{Transformation, Vector3, Rotation} +import codechicken.lib.render.{CCModel, Vertex5} +import codechicken.lib.vec.{Rotation, Transformation, Vector3} /** * @author Calclavia @@ -82,7 +82,7 @@ class WireModelGenerator while (r < 4) { generateSide(r) - ({r += 1; r - 1 }) + ({r += 1; r - 1}) } model.apply(Rotation.sideOrientation(side, 0).at(Vector3.center)) diff --git a/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.scala b/src/main/scala/edx/electrical/wire/framed/PartFramedWire.scala similarity index 89% rename from src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.scala rename to src/main/scala/edx/electrical/wire/framed/PartFramedWire.scala index 012b783da..8ab454b58 100644 --- a/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.scala +++ b/src/main/scala/edx/electrical/wire/framed/PartFramedWire.scala @@ -1,17 +1,17 @@ -package resonantinduction.electrical.wire.framed +package edx.electrical.wire.framed import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.lib.render.CCRenderState import codechicken.lib.vec.Vector3 import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.node.TMultipartNode +import edx.core.prefab.part.connector.PartFramedNode +import edx.electrical.wire.base.TWire import net.minecraft.client.renderer.RenderBlocks import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection import resonant.lib.grid.electric.NodeDirectCurrent import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.core.prefab.node.TMultipartNode -import resonantinduction.core.prefab.part.connector.PartFramedNode -import resonantinduction.electrical.wire.base.TWire /** * Fluid transport pipe diff --git a/src/main/scala/resonantinduction/electrical/wire/framed/RenderFramedWire.scala b/src/main/scala/edx/electrical/wire/framed/RenderFramedWire.scala similarity index 92% rename from src/main/scala/resonantinduction/electrical/wire/framed/RenderFramedWire.scala rename to src/main/scala/edx/electrical/wire/framed/RenderFramedWire.scala index b06ada282..2b9208adb 100644 --- a/src/main/scala/resonantinduction/electrical/wire/framed/RenderFramedWire.scala +++ b/src/main/scala/edx/electrical/wire/framed/RenderFramedWire.scala @@ -1,16 +1,16 @@ -package resonantinduction.electrical.wire.framed +package edx.electrical.wire.framed import codechicken.lib.lighting.LightModel import codechicken.lib.render.uv.IconTransformation import codechicken.lib.render.{CCModel, CCRenderState, ColourMultiplier, TextureUtils} import codechicken.lib.vec.{Rotation, Translation} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.core.render.InvertX +import edx.core.util.ResonantUtil import net.minecraft.util.{IIcon, ResourceLocation} import net.minecraftforge.common.util.ForgeDirection import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.core.Reference -import resonantinduction.core.render.InvertX -import resonantinduction.core.util.ResonantUtil import scala.collection.convert.wrapAll._ import scala.collection.mutable diff --git a/src/main/scala/resonantinduction/mechanical/MechanicalContent.scala b/src/main/scala/edx/mechanical/MechanicalContent.scala similarity index 83% rename from src/main/scala/resonantinduction/mechanical/MechanicalContent.scala rename to src/main/scala/edx/mechanical/MechanicalContent.scala index dde374ff8..161056383 100644 --- a/src/main/scala/resonantinduction/mechanical/MechanicalContent.scala +++ b/src/main/scala/edx/mechanical/MechanicalContent.scala @@ -1,26 +1,26 @@ -package resonantinduction.mechanical +package edx.mechanical +import edx.core.interfaces.TNodeMechanical +import edx.core.{EDXCreativeTab, Reference, ResonantPartFactory} +import edx.mechanical.fluid.pipe.{ItemPipe, PartPipe, PipeMaterials} +import edx.mechanical.fluid.transport.TilePump +import edx.mechanical.machine.TileDetector +import edx.mechanical.machine.edit.{TileBreaker, TilePlacer} +import edx.mechanical.mech.gear.{ItemGear, PartGear} +import edx.mechanical.mech.gearshaft.{ItemGearShaft, PartGearShaft} +import edx.mechanical.mech.grid.NodeMechanical +import edx.mechanical.mech.process.crusher.TileMechanicalPiston +import edx.mechanical.mech.process.grinder.TileGrindingWheel +import edx.mechanical.mech.process.mixer.TileMixer +import edx.mechanical.mech.turbine.{TileWaterTurbine, TileWindTurbine} import net.minecraft.block.Block import net.minecraft.init.{Blocks, Items} import net.minecraft.item.{Item, ItemStack} import resonant.api.tile.node.NodeRegistry -import resonant.lib.network.discriminator.PacketAnnotationManager import resonant.lib.mod.content.ContentHolder +import resonant.lib.network.discriminator.PacketAnnotationManager import resonant.lib.utility.recipe.UniversalRecipe import resonant.lib.world.schematic.{SchematicPlate, SchematicRegistry} -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.core.{RICreativeTab, Reference, ResonantPartFactory} -import resonantinduction.mechanical.fluid.pipe.{ItemPipe, PartPipe, PipeMaterials} -import resonantinduction.mechanical.fluid.transport.TilePump -import resonantinduction.mechanical.machine.TileDetector -import resonantinduction.mechanical.machine.edit.{TileBreaker, TilePlacer} -import resonantinduction.mechanical.mech.gear.{ItemGear, PartGear} -import resonantinduction.mechanical.mech.gearshaft.{ItemGearShaft, PartGearShaft} -import resonantinduction.mechanical.mech.grid.NodeMechanical -import resonantinduction.mechanical.mech.process.crusher.TileMechanicalPiston -import resonantinduction.mechanical.mech.process.grinder.TileGrindingWheel -import resonantinduction.mechanical.mech.process.mixer.TileMixer -import resonantinduction.mechanical.mech.turbine.{TileWaterTurbine, TileWindTurbine} /** * The core contents of Resonant Induction @@ -29,12 +29,12 @@ import resonantinduction.mechanical.mech.turbine.{TileWaterTurbine, TileWindTurb object MechanicalContent extends ContentHolder { //Constructor - manager.setTab(RICreativeTab) + manager.setTab(EDXCreativeTab) manager.setPrefix(Reference.prefix) //Content var itemGear: Item = new ItemGear - var itemGearShaft: Item = new ItemGearShaft + var itemGearShaft: Item = new ItemGearShaft var itemPipe: Item = new ItemPipe var blockWindTurbine: Block = new TileWindTurbine @@ -51,7 +51,7 @@ object MechanicalContent extends ContentHolder { super.preInit() - RICreativeTab.itemStack = new ItemStack(itemGear) + EDXCreativeTab.itemStack = new ItemStack(itemGear) SchematicRegistry.register("resonantinduction.mechanical.waterTurbine", new SchematicPlate("schematic.waterTurbine.name", MechanicalContent.blockWaterTurbine)) SchematicRegistry.register("resonantinduction.mechanical.windTurbine", new SchematicPlate("schematic.windTurbine.name", MechanicalContent.blockWindTurbine)) diff --git a/src/main/scala/resonantinduction/mechanical/MicroblockHighlightHandler.scala b/src/main/scala/edx/mechanical/MicroblockHighlightHandler.scala similarity index 93% rename from src/main/scala/resonantinduction/mechanical/MicroblockHighlightHandler.scala rename to src/main/scala/edx/mechanical/MicroblockHighlightHandler.scala index e64fac211..4cf250b10 100644 --- a/src/main/scala/resonantinduction/mechanical/MicroblockHighlightHandler.scala +++ b/src/main/scala/edx/mechanical/MicroblockHighlightHandler.scala @@ -1,14 +1,14 @@ -package resonantinduction.mechanical +package edx.mechanical import codechicken.lib.render.RenderUtils import codechicken.lib.vec.Vector3 import codechicken.microblock.{CornerPlacementGrid, FacePlacementGrid} import cpw.mods.fml.common.eventhandler.SubscribeEvent import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.part.IHighlight import net.minecraft.util.MovingObjectPosition import net.minecraftforge.client.event.DrawBlockHighlightEvent import org.lwjgl.opengl.GL11 -import resonantinduction.core.prefab.part.IHighlight object MicroblockHighlightHandler { diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.scala b/src/main/scala/edx/mechanical/fluid/pipe/ItemPipe.scala similarity index 92% rename from src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.scala rename to src/main/scala/edx/mechanical/fluid/pipe/ItemPipe.scala index 23efd37ea..4c4b9308b 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.scala +++ b/src/main/scala/edx/mechanical/fluid/pipe/ItemPipe.scala @@ -1,19 +1,19 @@ -package resonantinduction.mechanical.fluid.pipe +package edx.mechanical.fluid.pipe import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} -import codechicken.multipart.{MultiPartRegistry, TItemMultiPart, TMultiPart} +import codechicken.multipart.{TItemMultiPart, TMultiPart} +import edx.core.ResonantPartFactory import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} import net.minecraft.world.World import org.lwjgl.input.Keyboard import resonant.lib.render.EnumColor -import resonant.lib.utility.science.UnitDisplay import resonant.lib.utility.LanguageUtility +import resonant.lib.utility.science.UnitDisplay import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.ResonantPartFactory class ItemPipe extends TItemMultiPart { diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/NodePipe.scala b/src/main/scala/edx/mechanical/fluid/pipe/NodePipe.scala similarity index 90% rename from src/main/scala/resonantinduction/mechanical/fluid/pipe/NodePipe.scala rename to src/main/scala/edx/mechanical/fluid/pipe/NodePipe.scala index 8cfd04695..14f7a5834 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/NodePipe.scala +++ b/src/main/scala/edx/mechanical/fluid/pipe/NodePipe.scala @@ -1,10 +1,10 @@ -package resonantinduction.mechanical.fluid.pipe +package edx.mechanical.fluid.pipe +import edx.core.prefab.node.{NodeFluidPressure, TMultipartNode} +import edx.core.prefab.part.connector.TColorable import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.IFluidHandler import resonant.api.tile.INodeProvider -import resonantinduction.core.prefab.node.{NodeFluidPressure, TMultipartNode} -import resonantinduction.core.prefab.part.connector.TColorable /** * Pressure node for the pipe @@ -13,8 +13,6 @@ import resonantinduction.core.prefab.part.connector.TColorable */ class NodePipe(parent: PartPipe) extends NodeFluidPressure(parent) with TMultipartNode[IFluidHandler] { - def pipe: PartPipe = getParent.asInstanceOf[PartPipe] - override def rebuild() { for (dir <- ForgeDirection.VALID_DIRECTIONS) @@ -63,4 +61,6 @@ class NodePipe(parent: PartPipe) extends NodeFluidPressure(parent) with TMultipa return false } + + def pipe: PartPipe = getParent.asInstanceOf[PartPipe] } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala b/src/main/scala/edx/mechanical/fluid/pipe/PartPipe.scala similarity index 89% rename from src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala rename to src/main/scala/edx/mechanical/fluid/pipe/PartPipe.scala index a6b76bc5d..d6598a043 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala +++ b/src/main/scala/edx/mechanical/fluid/pipe/PartPipe.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.fluid.pipe +package edx.mechanical.fluid.pipe import java.lang.{Iterable => JIterable} @@ -7,6 +7,10 @@ import codechicken.lib.raytracer.IndexedCuboid6 import codechicken.lib.render.CCRenderState import codechicken.lib.vec.{Cuboid6, Vector3} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.prefab.part.CuboidShapes +import edx.core.prefab.part.connector.{PartFramedNode, TColorable, TMaterial} +import edx.mechanical.MechanicalContent +import edx.mechanical.fluid.pipe.PipeMaterials.PipeMaterial import net.minecraft.client.renderer.RenderBlocks import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -16,10 +20,6 @@ import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids._ import resonant.lib.collection.EvictingList import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.core.prefab.part.CuboidShapes -import resonantinduction.core.prefab.part.connector.{PartFramedNode, TColorable, TMaterial} -import resonantinduction.mechanical.MechanicalContent -import resonantinduction.mechanical.fluid.pipe.PipeMaterials.PipeMaterial import scala.collection.convert.wrapAll._ import scala.collection.mutable @@ -80,9 +80,9 @@ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorab /** * Changes the wire's color. */ - override def activate(player: EntityPlayer, part: MovingObjectPosition, itemStack: ItemStack) : Boolean = + override def activate(player: EntityPlayer, part: MovingObjectPosition, itemStack: ItemStack): Boolean = { - if(!world.isRemote) + if (!world.isRemote) println(node.pressure + " : " + node.getFluidAmount) return super.activate(player, part, itemStack) @@ -102,7 +102,7 @@ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorab //node Packet val nbt = new NBTTagCompound val averageAmount = averageTankData.reduce(_ + _) / averageTankData.size - val tempTank = node.getPrimaryTank//if (node.getFluid != null) new FluidTank(node.getFluid.getFluid, averageAmount, node.getCapacity) else new FluidTank(node.getCapacity) + val tempTank = node.getPrimaryTank //if (node.getFluid != null) new FluidTank(node.getFluid.getFluid, averageAmount, node.getCapacity) else new FluidTank(node.getCapacity) tempTank.writeToNBT(nbt) packet.writeInt(node.getCapacity).writeNBTTagCompound(nbt) } diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PipeMaterials.scala b/src/main/scala/edx/mechanical/fluid/pipe/PipeMaterials.scala similarity index 91% rename from src/main/scala/resonantinduction/mechanical/fluid/pipe/PipeMaterials.scala rename to src/main/scala/edx/mechanical/fluid/pipe/PipeMaterials.scala index 6924a7ea3..4dbb41378 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PipeMaterials.scala +++ b/src/main/scala/edx/mechanical/fluid/pipe/PipeMaterials.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.fluid.pipe +package edx.mechanical.fluid.pipe /** * Enumerator to hold info about each pipe material. @@ -7,13 +7,14 @@ package resonantinduction.mechanical.fluid.pipe */ object PipeMaterials extends Enumeration { - case class PipeMaterial(maxPressure: Int, maxFlow: Int, color: Int) extends Val - val ceramic = PipeMaterial(5, 5, 0xB3866F) val bronze = PipeMaterial(25, 25, 0xD49568) val plastic = PipeMaterial(50, 30, 0xDAF4F7) val iron = PipeMaterial(100, 50, 0x5C6362) val steel = PipeMaterial(100, 100, 0x888888) val fiberglass = PipeMaterial(1000, 200, 0x9F9691) + + case class PipeMaterial(maxPressure: Int, maxFlow: Int, color: Int) extends Val + } diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.scala b/src/main/scala/edx/mechanical/fluid/pipe/RenderPipe.scala similarity index 97% rename from src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.scala rename to src/main/scala/edx/mechanical/fluid/pipe/RenderPipe.scala index f96016ed8..5823193b0 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.scala +++ b/src/main/scala/edx/mechanical/fluid/pipe/RenderPipe.scala @@ -1,8 +1,9 @@ -package resonantinduction.mechanical.fluid.pipe +package edx.mechanical.fluid.pipe import java.awt.Color import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.item.{ItemDye, ItemStack} import net.minecraft.util.ResourceLocation import net.minecraftforge.client.IItemRenderer.ItemRenderType @@ -14,7 +15,6 @@ import resonant.lib.render.{FluidRenderUtility, RenderUtility} import resonant.lib.transform.vector.Vector3 import resonant.lib.world.WorldUtility import resonant.lib.wrapper.BitmaskWrapper._ -import resonantinduction.core.Reference @SideOnly(Side.CLIENT) object RenderPipe extends ISimpleItemRenderer @@ -22,6 +22,35 @@ object RenderPipe extends ISimpleItemRenderer val model = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "pipe.tcn")) var texture = new ResourceLocation(Reference.domain, Reference.modelPath + "pipe.png") + /** + * Render pipe in world + */ + def render(part: PartPipe, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix() + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + render(part.getMaterialID, if (part.getColor > 0) ItemDye.field_150922_c(part.getColor) else -1, part.clientRenderMask) + + val fluid = part.node.getFluid + val pos = new Vector3(x, y, z) + + if (fluid != null && fluid.amount > 0) + { + ForgeDirection.VALID_DIRECTIONS.filter(d => part.clientRenderMask.mask(d.ordinal())).foreach( + dir => + { + GL11.glPushMatrix() + GL11.glTranslated(dir.offsetX * 0.33, dir.offsetY * 0.33, dir.offsetZ * 0.33) + GL11.glScaled(0.33, 0.33, 0.33) + val tank = part.node + FluidRenderUtility.renderFluidTesselation(tank, 1, 1, 1, 1) + GL11.glPopMatrix() + }) + } + + GL11.glPopMatrix() + } + /** * Render Pipe Model */ @@ -75,35 +104,6 @@ object RenderPipe extends ISimpleItemRenderer RenderUtility.disableBlending() } - /** - * Render pipe in world - */ - def render(part: PartPipe, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix() - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - render(part.getMaterialID, if (part.getColor > 0) ItemDye.field_150922_c(part.getColor) else -1, part.clientRenderMask) - - val fluid = part.node.getFluid - val pos = new Vector3(x, y, z) - - if (fluid != null && fluid.amount > 0) - { - ForgeDirection.VALID_DIRECTIONS.filter(d => part.clientRenderMask.mask(d.ordinal())).foreach( - dir => - { - GL11.glPushMatrix() - GL11.glTranslated(dir.offsetX * 0.33, dir.offsetY * 0.33, dir.offsetZ * 0.33) - GL11.glScaled(0.33, 0.33, 0.33) - val tank = part.node - FluidRenderUtility.renderFluidTesselation(tank, 1, 1, 1, 1) - GL11.glPopMatrix() - }) - } - - GL11.glPopMatrix() - } - /** * Render inventory pipe */ diff --git a/src/main/scala/resonantinduction/mechanical/fluid/transport/NodePump.scala b/src/main/scala/edx/mechanical/fluid/transport/NodePump.scala similarity index 88% rename from src/main/scala/resonantinduction/mechanical/fluid/transport/NodePump.scala rename to src/main/scala/edx/mechanical/fluid/transport/NodePump.scala index 580b03769..df4fd05fb 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/transport/NodePump.scala +++ b/src/main/scala/edx/mechanical/fluid/transport/NodePump.scala @@ -1,9 +1,9 @@ -package resonantinduction.mechanical.fluid.transport +package edx.mechanical.fluid.transport +import edx.core.prefab.node.NodeFluidPressure import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.IFluidHandler import resonant.api.tile.INodeProvider -import resonantinduction.core.prefab.node.NodeFluidPressure /** * A node for the pump @@ -11,8 +11,6 @@ import resonantinduction.core.prefab.node.NodeFluidPressure */ class NodePump(parent: INodeProvider) extends NodeFluidPressure(parent) { - def pump: TilePump = getParent.asInstanceOf[TilePump] - override def pressure(dir: ForgeDirection): Int = { if (pump.mechanicalNode.power > 0) @@ -28,6 +26,8 @@ class NodePump(parent: INodeProvider) extends NodeFluidPressure(parent) return 0 } + def pump: TilePump = getParent.asInstanceOf[TilePump] + override def canConnect[B <: IFluidHandler](source: B, from: ForgeDirection): Boolean = { return super.canConnect(source, from) && (from == pump.getDirection || from == pump.getDirection.getOpposite) diff --git a/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.scala b/src/main/scala/edx/mechanical/fluid/transport/TilePump.scala similarity index 95% rename from src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.scala rename to src/main/scala/edx/mechanical/fluid/transport/TilePump.scala index 0536b2476..a90f2b6f4 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.scala +++ b/src/main/scala/edx/mechanical/fluid/transport/TilePump.scala @@ -1,5 +1,7 @@ -package resonantinduction.mechanical.fluid.transport +package edx.mechanical.fluid.transport +import edx.core.Reference +import edx.mechanical.mech.TileMechanical import net.minecraft.block.material.Material import net.minecraft.tileentity.TileEntity import net.minecraft.util.ResourceLocation @@ -10,8 +12,6 @@ import org.lwjgl.opengl.GL11 import resonant.api.tile.IRotatable import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference -import resonantinduction.mechanical.mech.TileMechanical import scala.collection.mutable @@ -51,6 +51,16 @@ class TilePump extends TileMechanical(Material.iron) with IRotatable with IFluid } } + def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = + { + if (from == getDirection.getOpposite) + { + val tileOut: TileEntity = toVector3.add(from.getOpposite).getTileEntity(this.worldObj) + if (tileOut.isInstanceOf[IFluidHandler]) return (tileOut.asInstanceOf[IFluidHandler]).fill(from, resource, doFill) + } + return 0 + } + override def renderDynamic(pos: Vector3, frame: Float, pass: Int): Unit = { GL11.glPushMatrix() @@ -77,16 +87,6 @@ class TilePump extends TileMechanical(Material.iron) with IRotatable with IFluid GL11.glPopMatrix() } - def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = - { - if (from == getDirection.getOpposite) - { - val tileOut: TileEntity = toVector3.add(from.getOpposite).getTileEntity(this.worldObj) - if (tileOut.isInstanceOf[IFluidHandler]) return (tileOut.asInstanceOf[IFluidHandler]).fill(from, resource, doFill) - } - return 0 - } - def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = null def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = null diff --git a/src/main/scala/edx/mechanical/machine/TileDetector.scala b/src/main/scala/edx/mechanical/machine/TileDetector.scala new file mode 100644 index 000000000..9013dd09e --- /dev/null +++ b/src/main/scala/edx/mechanical/machine/TileDetector.scala @@ -0,0 +1,160 @@ +package edx.mechanical.machine + +import java.util.ArrayList + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.basic.blocks.TileFilterable +import edx.core.Reference +import edx.mechanical.MechanicalContent +import io.netty.buffer.ByteBuf +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.Entity +import net.minecraft.entity.item.EntityItem +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.network.Packet +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.{AxisAlignedBB, IIcon} +import net.minecraft.world.IBlockAccess +import net.minecraftforge.common.util.ForgeDirection +import resonant.engine.ResonantEngine +import resonant.lib.network.discriminator.{PacketTile, PacketType} +import resonant.lib.network.handle.IPacketIDReceiver +import resonant.lib.prefab.tile.spatial.SpatialBlock + +class TileDetector extends TileFilterable with IPacketIDReceiver +{ + private var powering: Boolean = false + + //constructor + setTextureName(Reference.prefix + "material_metal_side") + this.canProvidePower(true) + + override def update + { + super.update + if (!this.worldObj.isRemote && this.ticks % 10 == 0) + { + val metadata: Int = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) + val testArea: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.xCoord, this.yCoord, this.zCoord, this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) + val dir: ForgeDirection = ForgeDirection.getOrientation(metadata) + testArea.offset(dir.offsetX, dir.offsetY, dir.offsetZ) + val entities: ArrayList[Entity] = this.worldObj.getEntitiesWithinAABB(classOf[EntityItem], testArea).asInstanceOf[ArrayList[Entity]] + var powerCheck: Boolean = false + if (entities.size > 0) + { + if (getFilter != null) + { + { + var i: Int = 0 + while (i < entities.size) + { + { + val e: EntityItem = entities.get(i).asInstanceOf[EntityItem] + val itemStack: ItemStack = e.getEntityItem + powerCheck = this.isFiltering(itemStack) + } + ({ + i += 1; + i - 1 + }) + } + } + } + else + { + powerCheck = true + } + } + else + { + powerCheck = false + } + if (powerCheck != this.powering) + { + this.powering = powerCheck + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, MechanicalContent.blockDetector) + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, MechanicalContent.blockDetector) + + for (x <- (this.xCoord - 1) to (this.xCoord + 1)) + { + for (z <- (this.zCoord - 1) to (this.zCoord + 1)) + { + this.worldObj.notifyBlocksOfNeighborChange(x, this.yCoord + 1, z, MechanicalContent.blockDetector) + } + } + ResonantEngine.packetHandler.sendToAllAround(new PacketTile(xi, yi, zi, Array[Any](0, this.isInverted)), this) + } + } + } + + override def invalidate + { + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, MechanicalContent.blockDetector) + this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, MechanicalContent.blockDetector) + super.invalidate + } + + override def readFromNBT(tag: NBTTagCompound) + { + super.readFromNBT(tag) + this.powering = tag.getBoolean("powering") + } + + override def writeToNBT(tag: NBTTagCompound) + { + super.writeToNBT(tag) + tag.setBoolean("powering", this.powering) + } + + override def getDescriptionPacket: Packet = + { + return ResonantEngine.packetHandler.toMCPacket(new PacketTile(xi, yi, zi, Array[Any](0, this.isInverted))) + } + + override def read(data: ByteBuf, id: Int, player: EntityPlayer, `type`: PacketType): Boolean = + { + if (id == 0) this.setInverted(data.readBoolean) + return true + } + + @SideOnly(Side.CLIENT) override def registerIcons(iconReg: IIconRegister) + { + SpatialBlock.icon.put("detector_front_green", iconReg.registerIcon(Reference.prefix + "detector_front_green")) + SpatialBlock.icon.put("detector_front_red", iconReg.registerIcon(Reference.prefix + "detector_front_red")) + SpatialBlock.icon.put("detector_side_green", iconReg.registerIcon(Reference.prefix + "detector_side_green")) + SpatialBlock.icon.put("detector_side_red", iconReg.registerIcon(Reference.prefix + "detector_side_red")) + } + + @SideOnly(Side.CLIENT) override def getIcon(side: Int, metadata: Int): IIcon = + { + if (side == ForgeDirection.SOUTH.ordinal) + { + return SpatialBlock.icon.get("detector_front_green") + } + return SpatialBlock.icon.get("detector_side_green") + } + + @SideOnly(Side.CLIENT) override def getIcon(iBlockAccess: IBlockAccess, side: Int): IIcon = + { + var isInverted: Boolean = false + var isFront: Boolean = false + val tileEntity: TileEntity = iBlockAccess.getTileEntity(xi, yi, zi) + if (tileEntity.isInstanceOf[TileDetector]) + { + isFront = side == (tileEntity.asInstanceOf[TileDetector]).getDirection.ordinal + isInverted = (tileEntity.asInstanceOf[TileDetector]).isInverted + } + return if (isInverted) (if (isFront) SpatialBlock.icon.get("detector_front_red") else SpatialBlock.icon.get("detector_side_red")) else (if (isFront) SpatialBlock.icon.get("detector_front_green") else SpatialBlock.icon.get("detector_side_green")) + } + + override def getStrongRedstonePower(access: IBlockAccess, side: Int): Int = + { + if (side != getDirection.getOpposite.ordinal) + { + return if (powering) 15 else 0 + } + return 0 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/mechanical/machine/edit/TileBreaker.scala b/src/main/scala/edx/mechanical/machine/edit/TileBreaker.scala new file mode 100644 index 000000000..61a885aa3 --- /dev/null +++ b/src/main/scala/edx/mechanical/machine/edit/TileBreaker.scala @@ -0,0 +1,172 @@ +package edx.mechanical.machine.edit + +import java.util.ArrayList + +import cpw.mods.fml.common.network.ByteBufUtils +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Electrodynamics +import io.netty.buffer.ByteBuf +import net.minecraft.block.Block +import net.minecraft.block.material.Material +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.util.IIcon +import net.minecraft.world.IBlockAccess +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.network.discriminator.{PacketTile, PacketType} +import resonant.lib.network.handle.IPacketReceiver +import resonant.lib.prefab.tile.spatial.SpatialTile +import resonant.lib.prefab.tile.traits.TRotatable +import resonant.lib.transform.vector.{Vector3, VectorWorld} +import resonant.lib.utility.inventory.InternalInventoryHandler + +/** + * @author tgame14 + * @since 18/03/14 + */ +object TileBreaker +{ + @SideOnly(Side.CLIENT) private var iconFront: IIcon = null + @SideOnly(Side.CLIENT) private var iconBack: IIcon = null +} + +class TileBreaker extends SpatialTile(Material.iron) with TRotatable with IPacketReceiver +{ + private var _doWork: Boolean = false + private var invHandler: InternalInventoryHandler = null + private var place_delay: Int = 0 + + override def onAdded + { + work + } + + override def onNeighborChanged(block: Block) + { + work + } + + def work + { + if (isIndirectlyPowered) + { + _doWork = true + place_delay = 0 + } + } + + override def update + { + if (_doWork) + { + if (place_delay < java.lang.Byte.MAX_VALUE) + { + place_delay += 1 + } + if (place_delay >= 10) + { + _doWork = false + place_delay = 0 + } + } + } + + def doWork + { + if (isIndirectlyPowered) + { + val dir: ForgeDirection = getDirection + val check: Vector3 = toVector3.add(dir) + val put: VectorWorld = toVector3.add(dir.getOpposite).asInstanceOf[VectorWorld] + val block: Block = check.getBlock(world) + if (block != null) + { + val candidateMeta: Int = world.getBlockMetadata(check.xi, check.yi, check.zi) + val flag: Boolean = true + val drops: ArrayList[ItemStack] = block.getDrops(getWorldObj, check.xi, check.yi, check.zi, candidateMeta, 0) + import scala.collection.JavaConversions._ + for (stack <- drops) + { + var insert: ItemStack = stack.copy + insert = getInvHandler.storeItem(insert, this.getDirection.getOpposite) + if (insert != null) + { + getInvHandler.throwItem(this.getDirection.getOpposite, insert) + } + } + Electrodynamics.proxy.renderBlockParticle(worldObj, check.xi, check.yi, check.zi, new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Block.getIdFromBlock(block), 1) + getWorldObj.setBlockToAir(check.xi, check.yi, check.zi) + getWorldObj.playAuxSFX(1012, check.xi, check.yi, check.zi, 0) + } + } + } + + def getInvHandler: InternalInventoryHandler = + { + if (invHandler == null) + { + invHandler = new InternalInventoryHandler(this) + } + return invHandler + } + + override def getDescPacket: PacketTile = + { + val nbt: NBTTagCompound = new NBTTagCompound + writeToNBT(nbt) + return new PacketTile(this, nbt) + } + + @SideOnly(Side.CLIENT) override def getIcon(access: IBlockAccess, side: Int): IIcon = + { + val meta: Int = access.getBlockMetadata(xi, yi, zi) + if (side == meta) + { + return TileBreaker.iconFront + } + else if (side == (meta ^ 1)) + { + return TileBreaker.iconBack + } + return getIcon + } + + @SideOnly(Side.CLIENT) + override def getIcon(side: Int, meta: Int): IIcon = + { + if (side == (meta ^ 1)) + { + return TileBreaker.iconFront + } + else if (side == meta) + { + return TileBreaker.iconBack + } + return getIcon + } + + @SideOnly(Side.CLIENT) + override def registerIcons(iconRegister: IIconRegister) + { + super.registerIcons(iconRegister) + TileBreaker.iconFront = iconRegister.registerIcon(getTextureName + "_front") + TileBreaker.iconBack = iconRegister.registerIcon(getTextureName + "_back") + } + + def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) + { + try + { + readFromNBT(ByteBufUtils.readTag(data)) + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/machine/edit/TilePlacer.scala b/src/main/scala/edx/mechanical/machine/edit/TilePlacer.scala similarity index 99% rename from src/main/scala/resonantinduction/mechanical/machine/edit/TilePlacer.scala rename to src/main/scala/edx/mechanical/machine/edit/TilePlacer.scala index 6b4294b2c..01361a46e 100644 --- a/src/main/scala/resonantinduction/mechanical/machine/edit/TilePlacer.scala +++ b/src/main/scala/edx/mechanical/machine/edit/TilePlacer.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.machine.edit +package edx.mechanical.machine.edit import java.util.EnumSet diff --git a/src/main/scala/resonantinduction/mechanical/mech/PartMechanical.scala b/src/main/scala/edx/mechanical/mech/PartMechanical.scala similarity index 88% rename from src/main/scala/resonantinduction/mechanical/mech/PartMechanical.scala rename to src/main/scala/edx/mechanical/mech/PartMechanical.scala index fa5bcfe5e..9a76f5f25 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/PartMechanical.scala +++ b/src/main/scala/edx/mechanical/mech/PartMechanical.scala @@ -1,35 +1,31 @@ -package resonantinduction.mechanical.mech +package edx.mechanical.mech import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.multipart._ +import edx.core.prefab.part.connector.{PartAbstract, TPartNodeProvider} +import edx.mechanical.mech.grid.NodeMechanical import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection import resonant.lib.transform.vector.VectorWorld -import resonantinduction.core.prefab.part.connector.{PartAbstract, TPartNodeProvider} -import resonantinduction.mechanical.mech.grid.NodeMechanical /** We assume all the force acting on the gear is 90 degrees. * * @author Calclavia */ abstract class PartMechanical extends PartAbstract with JNormalOcclusion with TFacePart with TPartNodeProvider with TCuboidPart { - /** Node that handles resonantinduction.mechanical action of the machine */ - private var _mechanicalNode: NodeMechanical = null - - def mechanicalNode = _mechanicalNode - - def mechanicalNode_=(mech: NodeMechanical) - { - _mechanicalNode = mech - mechanicalNode.onVelocityChanged = () => if (world != null) sendPacket(1) - nodes.add(mechanicalNode) - } - /** Side of the block this is placed on */ var placementSide: ForgeDirection = ForgeDirection.UNKNOWN - /** The tier of this mechanical part */ var tier = 0 + def mechanicalNode = _mechanicalNode + /** Node that handles resonantinduction.mechanical action of the machine */ + private var _mechanicalNode: NodeMechanical = null + def mechanicalNode_=(mech: NodeMechanical) +{ + _mechanicalNode = mech + mechanicalNode.onVelocityChanged = () => if (world != null) sendPacket(1) + nodes.add(mechanicalNode) +} def preparePlacement(side: Int, itemDamage: Int) { @@ -55,6 +51,12 @@ abstract class PartMechanical extends PartAbstract with JNormalOcclusion with TF } } + override def save(nbt: NBTTagCompound) + { + nbt.setByte("side", placementSide.ordinal.asInstanceOf[Byte]) + nbt.setByte("tier", tier.asInstanceOf[Byte]) + } + override def read(packet: MCDataInput, id: Int) { super.read(packet, id) @@ -70,23 +72,18 @@ abstract class PartMechanical extends PartAbstract with JNormalOcclusion with TF } } - override def redstoneConductionMap: Int = 0 - - override def solid(arg0: Int): Boolean = true - override def load(nbt: NBTTagCompound) { placementSide = ForgeDirection.getOrientation(nbt.getByte("side")) tier = nbt.getByte("tier") } - override def save(nbt: NBTTagCompound) - { - nbt.setByte("side", placementSide.ordinal.asInstanceOf[Byte]) - nbt.setByte("tier", tier.asInstanceOf[Byte]) - } + override def redstoneConductionMap: Int = 0 + + override def solid(arg0: Int): Boolean = true def getPosition: VectorWorld = new VectorWorld(world, x, y, z) override def toString: String = "[" + getClass.getSimpleName + "]" + x + "x " + y + "y " + z + "z " + getSlotMask + "s " + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/TileMechanical.scala b/src/main/scala/edx/mechanical/mech/TileMechanical.scala similarity index 95% rename from src/main/scala/resonantinduction/mechanical/mech/TileMechanical.scala rename to src/main/scala/edx/mechanical/mech/TileMechanical.scala index e07141399..3d6600394 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/TileMechanical.scala +++ b/src/main/scala/edx/mechanical/mech/TileMechanical.scala @@ -1,5 +1,6 @@ -package resonantinduction.mechanical.mech +package edx.mechanical.mech +import edx.mechanical.mech.grid.NodeMechanical import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer @@ -11,7 +12,6 @@ import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 import resonant.lib.wrapper.ByteBufWrapper._ -import resonantinduction.mechanical.mech.grid.NodeMechanical import scala.collection.convert.wrapAll._ @@ -31,8 +31,6 @@ abstract class TileMechanical(material: Material) extends SpatialTile(material: nodes.foreach(_.reconstruct()) } - def mechanicalNode = _mechanicalNode - override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { if (!world.isRemote) @@ -44,16 +42,6 @@ abstract class TileMechanical(material: Material) extends SpatialTile(material: return false } - def mechanicalNode_=(newNode: NodeMechanical) - { - _mechanicalNode = newNode - mechanicalNode.onVelocityChanged = () => sendPacket(1) - nodes.removeAll(nodes.filter(_.isInstanceOf[NodeMechanical])) - nodes.add(mechanicalNode) - } - - mechanicalNode = new NodeMechanical(this) - override def write(buf: ByteBuf, id: Int) { super.write(buf, id) @@ -76,4 +64,16 @@ abstract class TileMechanical(material: Material) extends SpatialTile(material: } } + mechanicalNode = new NodeMechanical(this) + + def mechanicalNode = _mechanicalNode + + def mechanicalNode_=(newNode: NodeMechanical) + { + _mechanicalNode = newNode + mechanicalNode.onVelocityChanged = () => sendPacket(1) + nodes.removeAll(nodes.filter(_.isInstanceOf[NodeMechanical])) + nodes.add(mechanicalNode) + } + } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/GearMultiBlockHandler.scala b/src/main/scala/edx/mechanical/mech/gear/GearMultiBlockHandler.scala similarity index 84% rename from src/main/scala/resonantinduction/mechanical/mech/gear/GearMultiBlockHandler.scala rename to src/main/scala/edx/mechanical/mech/gear/GearMultiBlockHandler.scala index 50b3bb973..fa391db77 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/GearMultiBlockHandler.scala +++ b/src/main/scala/edx/mechanical/mech/gear/GearMultiBlockHandler.scala @@ -1,7 +1,6 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear -import codechicken.multipart.{TMultiPart, TileMultipart} -import net.minecraft.tileentity.TileEntity +import codechicken.multipart.TileMultipart import net.minecraftforge.common.util.ForgeDirection import resonant.lib.prefab.tile.multiblock.reference.MultiBlockHandler import resonant.lib.transform.vector.Vector3 diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/ItemGear.scala b/src/main/scala/edx/mechanical/mech/gear/ItemGear.scala similarity index 88% rename from src/main/scala/resonantinduction/mechanical/mech/gear/ItemGear.scala rename to src/main/scala/edx/mechanical/mech/gear/ItemGear.scala index 7f5f9af93..aa24fba84 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/ItemGear.scala +++ b/src/main/scala/edx/mechanical/mech/gear/ItemGear.scala @@ -1,19 +1,19 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} import codechicken.microblock.FacePlacementGrid import codechicken.multipart.{JItemMultiPart, PartMap, TMultiPart, TileMultipart} +import edx.core.ResonantPartFactory +import edx.core.prefab.part.IHighlight +import edx.mechanical.mech.gearshaft.PartGearShaft import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} import net.minecraft.tileentity.TileEntity import net.minecraft.world.World import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.ResonantPartFactory -import resonantinduction.core.prefab.part.IHighlight -import resonantinduction.mechanical.mech.gearshaft.PartGearShaft class ItemGear extends JItemMultiPart with IHighlight { diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/ItemHandCrank.scala b/src/main/scala/edx/mechanical/mech/gear/ItemHandCrank.scala similarity index 85% rename from src/main/scala/resonantinduction/mechanical/mech/gear/ItemHandCrank.scala rename to src/main/scala/edx/mechanical/mech/gear/ItemHandCrank.scala index fdcdb51d6..151408c9e 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/ItemHandCrank.scala +++ b/src/main/scala/edx/mechanical/mech/gear/ItemHandCrank.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.Item diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/NodeGear.scala b/src/main/scala/edx/mechanical/mech/gear/NodeGear.scala similarity index 97% rename from src/main/scala/resonantinduction/mechanical/mech/gear/NodeGear.scala rename to src/main/scala/edx/mechanical/mech/gear/NodeGear.scala index 45b33359d..ea345ebfe 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/NodeGear.scala +++ b/src/main/scala/edx/mechanical/mech/gear/NodeGear.scala @@ -1,15 +1,15 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear import codechicken.lib.vec.Rotation import codechicken.multipart.TileMultipart +import edx.core.interfaces.TNodeMechanical +import edx.mechanical.mech.gearshaft.{NodeGearShaft, PartGearShaft} +import edx.mechanical.mech.grid.NodeMechanical import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.INodeProvider import resonant.lib.transform.vector.Vector3 import resonant.lib.wrapper.ForgeDirectionWrapper._ -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.mechanical.mech.gearshaft.{NodeGearShaft, PartGearShaft} -import resonantinduction.mechanical.mech.grid.NodeMechanical /** * Node for the gear @@ -20,8 +20,6 @@ class NodeGear(parent: PartGear) extends NodeMechanical(parent: PartGear) { override def angleDisplacement = if (gear.getMultiBlock.isConstructed) Math.PI / 36 else Math.PI / 12 - protected def gear = getParent.asInstanceOf[PartGear] - override def getLoad: Double = { return gear.tier match @@ -104,6 +102,8 @@ class NodeGear(parent: PartGear) extends NodeMechanical(parent: PartGear) } } + protected def gear = getParent.asInstanceOf[PartGear] + /** * Can this gear be connected BY the source? * diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/PartGear.scala b/src/main/scala/edx/mechanical/mech/gear/PartGear.scala similarity index 94% rename from src/main/scala/resonantinduction/mechanical/mech/gear/PartGear.scala rename to src/main/scala/edx/mechanical/mech/gear/PartGear.scala index 05986f701..f946c852c 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/PartGear.scala +++ b/src/main/scala/edx/mechanical/mech/gear/PartGear.scala @@ -1,10 +1,14 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear import java.util import codechicken.lib.vec.{Cuboid6, Vector3} import codechicken.microblock.FaceMicroClass import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.core.prefab.part.CuboidShapes +import edx.mechanical.MechanicalContent +import edx.mechanical.mech.PartMechanical import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -12,13 +16,8 @@ import net.minecraft.util.MovingObjectPosition import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.node.INode -import resonant.lib.grid.UpdateTicker import resonant.lib.prefab.tile.multiblock.reference.IMultiBlockStructure import resonant.lib.utility.WrenchUtility -import resonantinduction.core.Reference -import resonantinduction.core.prefab.part.CuboidShapes -import resonantinduction.mechanical.MechanicalContent -import resonantinduction.mechanical.mech.PartMechanical /** * We assume all the force acting on the gear is 90 degrees. @@ -27,10 +26,10 @@ import resonantinduction.mechanical.mech.PartMechanical */ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] { + val multiBlock = new GearMultiBlockHandler(this) var isClockwiseCrank = true var manualCrankTime = 0 var multiBlockRadius = 1 - val multiBlock = new GearMultiBlockHandler(this) //Constructor mechanicalNode = new NodeGear(this) @@ -101,6 +100,8 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] getMultiBlock.deconstruct() } + override def getMultiBlock: GearMultiBlockHandler = multiBlock + /** * Is this gear block the one in the center-edge of the multiblock that can interact with other gears? * @return Returning true implies that this gear is able to connect to other ones side-by-side. @@ -115,11 +116,6 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] return (primaryPos.xi == x && placementSide.offsetX == 0) || (primaryPos.yi == y && placementSide.offsetY == 0) || (primaryPos.zi == z && placementSide.offsetZ == 0) } - protected def getItem: ItemStack = - { - return new ItemStack(MechanicalContent.itemGear, 1, tier) - } - @SideOnly(Side.CLIENT) override def renderDynamic(pos: Vector3, frame: Float, pass: Int) { @@ -160,8 +156,6 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] } } - override def getMultiBlock: GearMultiBlockHandler = multiBlock - override def getNode[N <: INode](nodeType: Class[_ <: N], from: ForgeDirection): N = { if (nodeType.isAssignableFrom(mechanicalNode.getClass) && from == placementSide) @@ -181,11 +175,6 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] return list } - def getSlotMask: Int = - { - return 1 << this.placementSide.ordinal - } - def getBounds: Cuboid6 = { return FaceMicroClass.aBounds(0x10 | this.placementSide.ordinal) @@ -195,4 +184,14 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear] override def getRenderBounds: Cuboid6 = Cuboid6.full.copy.expand(multiBlockRadius) override def toString = "[PartGear]" + x + "x " + y + "y " + z + "z " + getSlotMask + "s " + + def getSlotMask: Int = + { + return 1 << this.placementSide.ordinal + } + + protected def getItem: ItemStack = + { + return new ItemStack(MechanicalContent.itemGear, 1, tier) + } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/gear/RenderGear.scala b/src/main/scala/edx/mechanical/mech/gear/RenderGear.scala similarity index 93% rename from src/main/scala/resonantinduction/mechanical/mech/gear/RenderGear.scala rename to src/main/scala/edx/mechanical/mech/gear/RenderGear.scala index 1a110fbbe..4d933ce25 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gear/RenderGear.scala +++ b/src/main/scala/edx/mechanical/mech/gear/RenderGear.scala @@ -1,6 +1,7 @@ -package resonantinduction.mechanical.mech.gear +package edx.mechanical.mech.gear import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import net.minecraftforge.client.IItemRenderer @@ -9,14 +10,31 @@ import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11 import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility -import resonant.lib.wrapper.ForgeDirectionWrapper._ -import resonantinduction.core.Reference @SideOnly(Side.CLIENT) object RenderGear extends ISimpleItemRenderer { final val model: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "gears.obj")) + def renderDynamic(part: PartGear, x: Double, y: Double, z: Double, tier: Int) + { + if (part.getMultiBlock.isPrimary) + { + GL11.glPushMatrix() + GL11.glTranslatef(x.toFloat + 0.5f, y.toFloat + 0.5f, z.toFloat + 0.5f) + GL11.glPushMatrix() + renderGear(part.placementSide.ordinal, part.tier, part.getMultiBlock.isConstructed, Math.toDegrees(part.mechanicalNode.angle)) + GL11.glPopMatrix() + GL11.glPopMatrix() + } + } + + def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*) + { + GL11.glRotatef(90, 1, 0, 0) + renderGear(-1, itemStack.getItemDamage, false, 0) + } + def renderGear(side: Int, tier: Int, isLarge: Boolean, angle: Double) { if (tier == 1) @@ -44,23 +62,4 @@ object RenderGear extends ISimpleItemRenderer else RenderGear.model.renderOnly("SmallGear") } - - def renderDynamic(part: PartGear, x: Double, y: Double, z: Double, tier: Int) - { - if (part.getMultiBlock.isPrimary) - { - GL11.glPushMatrix() - GL11.glTranslatef(x.toFloat + 0.5f, y.toFloat + 0.5f, z.toFloat + 0.5f) - GL11.glPushMatrix() - renderGear(part.placementSide.ordinal, part.tier, part.getMultiBlock.isConstructed, Math.toDegrees(part.mechanicalNode.angle)) - GL11.glPopMatrix() - GL11.glPopMatrix() - } - } - - def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*) - { - GL11.glRotatef(90, 1, 0, 0) - renderGear(-1, itemStack.getItemDamage, false, 0) - } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/ItemGearShaft.scala b/src/main/scala/edx/mechanical/mech/gearshaft/ItemGearShaft.scala similarity index 87% rename from src/main/scala/resonantinduction/mechanical/mech/gearshaft/ItemGearShaft.scala rename to src/main/scala/edx/mechanical/mech/gearshaft/ItemGearShaft.scala index cddb99fbb..913b785ca 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/ItemGearShaft.scala +++ b/src/main/scala/edx/mechanical/mech/gearshaft/ItemGearShaft.scala @@ -1,16 +1,16 @@ -package resonantinduction.mechanical.mech.gearshaft +package edx.mechanical.mech.gearshaft import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} import codechicken.multipart.{TItemMultiPart, TMultiPart} +import edx.core.ResonantPartFactory +import edx.core.prefab.part.IHighlight import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} import net.minecraft.world.World import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.ResonantPartFactory -import resonantinduction.core.prefab.part.IHighlight class ItemGearShaft extends Item with TItemMultiPart with IHighlight { diff --git a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/NodeGearShaft.scala b/src/main/scala/edx/mechanical/mech/gearshaft/NodeGearShaft.scala similarity index 91% rename from src/main/scala/resonantinduction/mechanical/mech/gearshaft/NodeGearShaft.scala rename to src/main/scala/edx/mechanical/mech/gearshaft/NodeGearShaft.scala index f275023a7..b25bc4610 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/NodeGearShaft.scala +++ b/src/main/scala/edx/mechanical/mech/gearshaft/NodeGearShaft.scala @@ -1,12 +1,12 @@ -package resonantinduction.mechanical.mech.gearshaft +package edx.mechanical.mech.gearshaft +import edx.core.interfaces.TNodeMechanical +import edx.mechanical.mech.gear.{NodeGear, PartGear} +import edx.mechanical.mech.grid.NodeMechanical import net.minecraftforge.common.util.ForgeDirection import resonant.api.tile.INodeProvider import resonant.lib.transform.vector.Vector3 import resonant.lib.wrapper.ForgeDirectionWrapper._ -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.mechanical.mech.gear.{NodeGear, PartGear} -import resonantinduction.mechanical.mech.grid.NodeMechanical class NodeGearShaft(parent: PartGearShaft) extends NodeMechanical(parent) { @@ -20,6 +20,8 @@ class NodeGearShaft(parent: PartGearShaft) extends NodeMechanical(parent) } } + def shaft: PartGearShaft = getParent.asInstanceOf[PartGearShaft] + override def rebuild() { //Check only two possible sides for connections @@ -72,6 +74,4 @@ class NodeGearShaft(parent: PartGearShaft) extends NodeMechanical(parent) } override def inverseRotation(other: TNodeMechanical): Boolean = other.isInstanceOf[NodeGear] && other.asInstanceOf[NodeGear].parent.asInstanceOf[PartGear].placementSide.offset < Vector3.zero - - def shaft: PartGearShaft = getParent.asInstanceOf[PartGearShaft] } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/PartGearShaft.scala b/src/main/scala/edx/mechanical/mech/gearshaft/PartGearShaft.scala similarity index 94% rename from src/main/scala/resonantinduction/mechanical/mech/gearshaft/PartGearShaft.scala rename to src/main/scala/edx/mechanical/mech/gearshaft/PartGearShaft.scala index a2e184873..e700c8ce3 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/PartGearShaft.scala +++ b/src/main/scala/edx/mechanical/mech/gearshaft/PartGearShaft.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.mech.gearshaft +package edx.mechanical.mech.gearshaft import java.util.{Collection, HashSet, Set} @@ -6,10 +6,10 @@ import codechicken.lib.raytracer.IndexedCuboid6 import codechicken.lib.vec.{Cuboid6, Vector3} import codechicken.multipart.PartMap import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.mechanical.MechanicalContent +import edx.mechanical.mech.PartMechanical import net.minecraft.item.ItemStack import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.mechanical.MechanicalContent -import resonantinduction.mechanical.mech.PartMechanical /** * We assume all the force acting on the gear is 90 degrees. @@ -41,8 +41,6 @@ class PartGearShaft extends PartMechanical tier = itemDamage } - protected def getItem: ItemStack = new ItemStack(MechanicalContent.itemGearShaft, 1, tier) - @SideOnly(Side.CLIENT) override def renderDynamic(pos: Vector3, frame: Float, pass: Int) { @@ -83,4 +81,6 @@ class PartGearShaft extends PartMechanical } def getBounds: Cuboid6 = new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625) + + protected def getItem: ItemStack = new ItemStack(MechanicalContent.itemGearShaft, 1, tier) } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/RenderGearShaft.scala b/src/main/scala/edx/mechanical/mech/gearshaft/RenderGearShaft.scala similarity index 96% rename from src/main/scala/resonantinduction/mechanical/mech/gearshaft/RenderGearShaft.scala rename to src/main/scala/edx/mechanical/mech/gearshaft/RenderGearShaft.scala index 8fd2966ba..bd020d4e3 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/gearshaft/RenderGearShaft.scala +++ b/src/main/scala/edx/mechanical/mech/gearshaft/RenderGearShaft.scala @@ -1,6 +1,7 @@ -package resonantinduction.mechanical.mech.gearshaft +package edx.mechanical.mech.gearshaft import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import net.minecraftforge.client.IItemRenderer @@ -10,8 +11,8 @@ import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11.glRotatef import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference import resonant.lib.wrapper.ForgeDirectionWrapper._ + @SideOnly(Side.CLIENT) object RenderGearShaft extends ISimpleItemRenderer { diff --git a/src/main/scala/resonantinduction/mechanical/mech/grid/MechanicalGrid.scala b/src/main/scala/edx/mechanical/mech/grid/MechanicalGrid.scala similarity index 98% rename from src/main/scala/resonantinduction/mechanical/mech/grid/MechanicalGrid.scala rename to src/main/scala/edx/mechanical/mech/grid/MechanicalGrid.scala index acc93ce17..17ef87525 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/grid/MechanicalGrid.scala +++ b/src/main/scala/edx/mechanical/mech/grid/MechanicalGrid.scala @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.mech.grid +package edx.mechanical.mech.grid import resonant.api.IUpdate import resonant.lib.grid.{GridNode, UpdateTicker} diff --git a/src/main/scala/resonantinduction/mechanical/mech/grid/NodeMechanical.scala b/src/main/scala/edx/mechanical/mech/grid/NodeMechanical.scala similarity index 95% rename from src/main/scala/resonantinduction/mechanical/mech/grid/NodeMechanical.scala rename to src/main/scala/edx/mechanical/mech/grid/NodeMechanical.scala index 17dcfa2b5..81cada03e 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/grid/NodeMechanical.scala +++ b/src/main/scala/edx/mechanical/mech/grid/NodeMechanical.scala @@ -1,12 +1,12 @@ -package resonantinduction.mechanical.mech.grid +package edx.mechanical.mech.grid +import edx.core.interfaces.TNodeMechanical +import edx.core.prefab.node.TMultipartNode import resonant.api.tile.INodeProvider import resonant.lib.debug.DebugInfo import resonant.lib.grid.GridNode import resonant.lib.grid.node.{NodeGrid, TTileConnector} import resonant.lib.transform.vector.IVectorWorld -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.core.prefab.node.TMultipartNode import scala.beans.BeanProperty import scala.collection.convert.wrapAll._ @@ -80,16 +80,6 @@ class NodeMechanical(parent: INodeProvider) extends NodeGrid[NodeMechanical](par def power: Double = torque * angularVelocity - def getMechanicalGrid: MechanicalGrid = super.grid.asInstanceOf[MechanicalGrid] - - override def newGrid: GridNode[NodeMechanical] = new MechanicalGrid - - override def isValidConnection(other: AnyRef): Boolean = other.isInstanceOf[NodeMechanical] - - override def getDebugInfo = List(toString) - - override def toString = "NodeMechanical [" + connections.size() + " Torque: " + BigDecimal(torque).setScale(2, BigDecimal.RoundingMode.HALF_UP) + " Velocity: " + BigDecimal(angularVelocity).setScale(2, BigDecimal.RoundingMode.HALF_UP) + "]" - /** * Gets the angular velocity of the mechanical device from a specific side * @@ -108,6 +98,16 @@ class NodeMechanical(parent: INodeProvider) extends NodeGrid[NodeMechanical](par def torque_=(newTorque: Double) = _torque = newTorque + def getMechanicalGrid: MechanicalGrid = super.grid.asInstanceOf[MechanicalGrid] + + override def newGrid: GridNode[NodeMechanical] = new MechanicalGrid + + override def isValidConnection(other: AnyRef): Boolean = other.isInstanceOf[NodeMechanical] + + override def getDebugInfo = List(toString) + + override def toString = "NodeMechanical [" + connections.size() + " Torque: " + BigDecimal(torque).setScale(2, BigDecimal.RoundingMode.HALF_UP) + " Velocity: " + BigDecimal(angularVelocity).setScale(2, BigDecimal.RoundingMode.HALF_UP) + "]" + /** * The class used to compare when making connections */ diff --git a/src/main/scala/edx/mechanical/mech/process/crusher/NodeMechanicalPiston.scala b/src/main/scala/edx/mechanical/mech/process/crusher/NodeMechanicalPiston.scala new file mode 100644 index 000000000..a9d4bf2d3 --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/process/crusher/NodeMechanicalPiston.scala @@ -0,0 +1,20 @@ +package edx.mechanical.mech.process.crusher + +import edx.mechanical.mech.grid.NodeMechanical +import net.minecraftforge.common.util.ForgeDirection + +/** + * Created by robert on 8/28/2014. + */ +class NodeMechanicalPiston(parent: TileMechanicalPiston) extends NodeMechanical(parent) +{ + override def canConnect(dir: ForgeDirection): Boolean = + { + return dir ne (getParent.asInstanceOf[TileMechanicalPiston]).getDirection + } + + protected def revolve + { + getParent.asInstanceOf[TileMechanicalPiston].markRevolve = true + } +} \ No newline at end of file diff --git a/src/main/scala/edx/mechanical/mech/process/crusher/RenderMechanicalPiston.scala b/src/main/scala/edx/mechanical/mech/process/crusher/RenderMechanicalPiston.scala new file mode 100644 index 000000000..490599608 --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/process/crusher/RenderMechanicalPiston.scala @@ -0,0 +1,61 @@ +package edx.mechanical.mech.process.crusher + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import net.minecraftforge.common.util.ForgeDirection +import org.apache.commons.lang3.ArrayUtils +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility + +@SideOnly(Side.CLIENT) object RenderMechanicalPiston +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "piston/mechanicalPiston.tcn")) + var TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "piston/mechanicalPiston_iron.png") +} + +@SideOnly(Side.CLIENT) class RenderMechanicalPiston extends TileEntitySpecialRenderer +{ + private[crusher] final val staticParts: Array[String] = Array("baseRing", "leg1", "leg2", "leg3", "leg4", "connector", "basePlate", "basePlateTop", "connectorBar", "centerPiston") + private[crusher] final val shaftParts: Array[String] = Array("topPlate", "outerPiston") + + def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + val tile: TileMechanicalPiston = tileEntity.asInstanceOf[TileMechanicalPiston] + GL11.glRotated(-90, 0, 1, 0) + GL11.glRotated(180, 0, 0, 1) + if (tile.getWorldObj != null) + { + if (tile.getDirection == ForgeDirection.NORTH || tile.getDirection == ForgeDirection.SOUTH) RenderUtility.rotateBlockBasedOnDirection(tile.getDirection.getOpposite) + else RenderUtility.rotateBlockBasedOnDirection(tile.getDirection) + } + RenderUtility.bind(RenderMechanicalPiston.TEXTURE) + val angle: Double = tile.mechanicalNode.angle + GL11.glPushMatrix + GL11.glRotated(-Math.toDegrees(angle), 0, 0, 1) + RenderMechanicalPiston.MODEL.renderAllExcept(ArrayUtils.addAll(shaftParts, staticParts: _*): _*) + GL11.glPopMatrix + GL11.glPushMatrix + if (tile.getWorldObj != null) + { + val dir: ForgeDirection = tile.getDirection + if (tile.world.isAirBlock(tile.xi + dir.offsetX, tile.yi + dir.offsetY, tile.zi + dir.offsetZ)) + { + GL11.glTranslated(0, 0, (0.4 * Math.sin(angle)) - 0.5) + } + else + { + GL11.glTranslated(0, 0, (0.06 * Math.sin(angle)) - 0.03) + } + } + RenderMechanicalPiston.MODEL.renderOnly(shaftParts: _*) + GL11.glPopMatrix + RenderMechanicalPiston.MODEL.renderOnly(staticParts: _*) + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/edx/mechanical/mech/process/crusher/TileMechanicalPiston.scala b/src/main/scala/edx/mechanical/mech/process/crusher/TileMechanicalPiston.scala new file mode 100644 index 000000000..72a766401 --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/process/crusher/TileMechanicalPiston.scala @@ -0,0 +1,194 @@ +package edx.mechanical.mech.process.crusher + +import java.lang.reflect.Method + +import edx.core.Electrodynamics +import edx.mechanical.mech.TileMechanical +import net.minecraft.block.Block +import net.minecraft.block.material.Material +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.tileentity.TileEntity +import net.minecraft.world.World +import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} +import resonant.lib.mod.config.Config +import resonant.lib.transform.vector.Vector3 +import resonant.lib.utility.MovementUtility +import resonant.lib.utility.inventory.InventoryUtility + +/** + * Mechanical driven piston that can be used to move basic blocks and crush ores + * @author Calclavia + */ +object TileMechanicalPiston +{ + @Config private var mechanicalPistonMultiplier: Int = 2 +} + +class TileMechanicalPiston extends TileMechanical(Material.piston) +{ + var markRevolve: Boolean = false + + //Constructor + mechanicalNode = new NodeMechanicalPiston(this) + isOpaqueCube = false + normalRender = false + customItemRender = true + rotationMask = 63 + setTextureName("material_steel_dark") + + override def update + { + super.update + if (markRevolve) + { + val movePosition: Vector3 = toVector3.add(getDirection) + if (!hitOreBlock(movePosition)) + { + if (!worldObj.isRemote) + { + val moveNewPosition: Vector3 = movePosition.clone.add(getDirection) + if (canMove(movePosition, moveNewPosition)) + { + move(movePosition, moveNewPosition) + } + } + } + markRevolve = false + } + } + + def hitOreBlock(blockPos: Vector3): Boolean = + { + val block: Block = blockPos.getBlock(world) + if (block != null) + { + val blockStack: ItemStack = new ItemStack(block) + val resources: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.CRUSHER.name, blockStack) + if (resources.length > 0) + { + if (!worldObj.isRemote) + { + for (recipe <- resources) + { + if (Math.random <= recipe.getChance) + { + InventoryUtility.dropItemStack(world, blockPos.clone.add(0.5), recipe.getItemStack, 10, 0) + } + } + blockPos.setBlockToAir(world) + } + Electrodynamics.proxy.renderBlockParticle(worldObj, blockPos.clone.add(0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Block.getIdFromBlock(block), 1) + return true + } + } + if (!worldObj.isRemote) + { + world.destroyBlockInWorldPartially(0, blockPos.xi, blockPos.yi, blockPos.zi, -1) + } + return false + } + + def canMove(from: Vector3, to: Vector3): Boolean = + { + if (this == to.getTileEntity(getWorldObj)) + { + return false + } + val targetBlock: Block = to.getBlock(worldObj) + if (!(worldObj.isAirBlock(to.xi, to.yi, to.zi) || (targetBlock != null && (targetBlock.canBeReplacedByLeaves(worldObj, to.xi, to.yi, to.zi))))) + { + return false + } + return true + } + + def move(from: Vector3, to: Vector3) + { + val blockID: Block = from.getBlock(worldObj) + val blockMetadata: Int = from.getBlockMetadata(worldObj) + val tileEntity: TileEntity = from.getTileEntity(worldObj) + val tileData: NBTTagCompound = new NBTTagCompound + if (tileEntity != null) + { + tileEntity.writeToNBT(tileData) + } + MovementUtility.setBlockSneaky(worldObj, from, null, 0, null) + if (tileEntity != null && tileData != null) + { + val isMultipart: Boolean = tileData.getString("id") == "savedMultipart" + var newTile: TileEntity = null + if (isMultipart) + { + try + { + val multipart: Class[_] = Class.forName("codechicken.multipart.MultipartHelper") + val m: Method = multipart.getMethod("createTileFromNBT", classOf[World], classOf[NBTTagCompound]) + newTile = m.invoke(null, worldObj, tileData).asInstanceOf[TileEntity] + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } + else + { + newTile = TileEntity.createAndLoadEntity(tileData) + } + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, newTile) + if (newTile != null && isMultipart) + { + try + { + val multipart: Class[_] = Class.forName("codechicken.multipart.MultipartHelper") + multipart.getMethod("sendDescPacket", classOf[World], classOf[TileEntity]).invoke(null, worldObj, newTile) + val tileMultipart: Class[_] = Class.forName("codechicken.multipart.TileMultipart") + tileMultipart.getMethod("onMoved").invoke(newTile) + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } + } + else + { + MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, null) + } + notifyChanges(from) + notifyChanges(to) + } + + def notifyChanges(pos: Vector3) + { + worldObj.notifyBlocksOfNeighborChange(pos.xi, pos.yi, pos.zi, pos.getBlock(worldObj)) + /* val newTile: TileEntity = pos.getTileEntity(worldObj) + if (newTile != null) + { + if (Loader.isModLoaded("BuildCraft|Factory")) + { + try + { + val clazz: Class[_ <: Any] = Class.forName("buildcraft.factory.TileQuarry") + if (newTile == clazz) + { + ReflectionHelper.setPrivateValue(clazz, newTile, true, "isAlive") + } + } + catch + { + case e: Exception => + { + e.printStackTrace + } + } + } + } */ + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/grinder/NodeGrinder.scala b/src/main/scala/edx/mechanical/mech/process/grinder/NodeGrinder.scala similarity index 64% rename from src/main/scala/resonantinduction/mechanical/mech/process/grinder/NodeGrinder.scala rename to src/main/scala/edx/mechanical/mech/process/grinder/NodeGrinder.scala index 5c30f500a..4337607d0 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/process/grinder/NodeGrinder.scala +++ b/src/main/scala/edx/mechanical/mech/process/grinder/NodeGrinder.scala @@ -1,9 +1,9 @@ -package resonantinduction.mechanical.mech.process.grinder +package edx.mechanical.mech.process.grinder +import edx.core.interfaces.TNodeMechanical +import edx.mechanical.mech.gear.NodeGear +import edx.mechanical.mech.grid.NodeMechanical import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.mechanical.mech.gear.NodeGear -import resonantinduction.mechanical.mech.grid.NodeMechanical /** * @author Calclavia @@ -14,7 +14,7 @@ class NodeGrinder(parent: TileGrindingWheel) extends NodeMechanical(parent: Tile override def canConnect[B <: NodeMechanical](other: B, from: ForgeDirection): Boolean = parent.getDirection == from || parent.getDirection.getOpposite == from - override def inverseRotation(other: TNodeMechanical): Boolean = if (other.isInstanceOf[NodeGear]) (toVector3 - other.asInstanceOf[NodeMechanical].toVector3).toArray.sum < 0 else false + override def inverseRotation(other: TNodeMechanical): Boolean = if (other.isInstanceOf[NodeGear]) (toVector3 - other.asInstanceOf[NodeMechanical].toVector3).toArray.sum < 0 else false override def inverseNext(other: TNodeMechanical): Boolean = if (other.isInstanceOf[NodeGear]) (toVector3 - other.asInstanceOf[NodeMechanical].toVector3).toArray.sum < 0 else false } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/grinder/TileGrindingWheel.scala b/src/main/scala/edx/mechanical/mech/process/grinder/TileGrindingWheel.scala similarity index 94% rename from src/main/scala/resonantinduction/mechanical/mech/process/grinder/TileGrindingWheel.scala rename to src/main/scala/edx/mechanical/mech/process/grinder/TileGrindingWheel.scala index 46b0bbc08..673020e9c 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/process/grinder/TileGrindingWheel.scala +++ b/src/main/scala/edx/mechanical/mech/process/grinder/TileGrindingWheel.scala @@ -1,6 +1,8 @@ -package resonantinduction.mechanical.mech.process.grinder +package edx.mechanical.mech.process.grinder import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Electrodynamics, Reference} +import edx.mechanical.mech.TileMechanical import net.minecraft.block.material.Material import net.minecraft.entity.Entity import net.minecraft.entity.item.EntityItem @@ -16,8 +18,6 @@ import resonant.lib.render.RenderUtility import resonant.lib.transform.region.Cuboid import resonant.lib.transform.rotation.AngleAxis import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.{Reference, ResonantInduction} -import resonantinduction.mechanical.mech.TileMechanical /** * The grinding wheel. This block will face the direction in which it can rotate. @@ -89,7 +89,7 @@ class TileGrindingWheel extends TileMechanical(Material.rock) grindingItem.delayBeforeCanPickup = 20 if (grindingItem.getEntityItem.getItem.isInstanceOf[ItemBlock]) { - ResonantInduction.proxy.renderBlockParticle(worldObj, new Vector3(grindingItem), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), 3, 1) + Electrodynamics.proxy.renderBlockParticle(worldObj, new Vector3(grindingItem), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), 3, 1) } else { @@ -137,6 +137,11 @@ class TileGrindingWheel extends TileMechanical(Material.rock) return results.length > 0 } + /** + * Can this machine work this tick? + */ + def canWork: Boolean = counter >= requiredTorque + override def collide(entity: Entity) { if (entity.isInstanceOf[EntityItem]) @@ -180,11 +185,6 @@ class TileGrindingWheel extends TileMechanical(Material.rock) } } - /** - * Can this machine work this tick? - */ - def canWork: Boolean = counter >= requiredTorque - def canGrind(itemStack: ItemStack): Boolean = MachineRecipes.instance.getOutput(RecipeType.GRINDER.name, itemStack).length > 0 override def renderDynamic(pos: Vector3, frame: Float, pass: Int): Unit = diff --git a/src/main/scala/edx/mechanical/mech/process/mixer/MixerNode.scala b/src/main/scala/edx/mechanical/mech/process/mixer/MixerNode.scala new file mode 100644 index 000000000..a61e59e88 --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/process/mixer/MixerNode.scala @@ -0,0 +1,23 @@ +package edx.mechanical.mech.process.mixer + +import edx.mechanical.mech.grid.NodeMechanical +import net.minecraftforge.common.util.ForgeDirection +import resonant.api.tile.INodeProvider + +/** + * Node designed just for the Mixer to use + * @param parent - instance of TileMixer that will host this node, should never be null + */ +class MixerNode(parent: INodeProvider) extends NodeMechanical(parent) +{ + override def canConnect(direction: ForgeDirection): Boolean = + { + return direction == ForgeDirection.DOWN || direction == ForgeDirection.UP + } + + /* + override def inverseRotation(dir: ForgeDirection): Boolean = + { + return dir == ForgeDirection.DOWN + }*/ +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/RenderMixer.scala b/src/main/scala/edx/mechanical/mech/process/mixer/RenderMixer.scala similarity index 89% rename from src/main/scala/resonantinduction/mechanical/mech/process/mixer/RenderMixer.scala rename to src/main/scala/edx/mechanical/mech/process/mixer/RenderMixer.scala index e1ad4a51c..770910bcb 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/RenderMixer.scala +++ b/src/main/scala/edx/mechanical/mech/process/mixer/RenderMixer.scala @@ -1,6 +1,7 @@ -package resonantinduction.mechanical.mech.process.mixer +package edx.mechanical.mech.process.mixer import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer import net.minecraft.item.ItemStack import net.minecraft.tileentity.TileEntity @@ -8,10 +9,9 @@ import net.minecraft.util.ResourceLocation import net.minecraftforge.client.IItemRenderer import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} import org.lwjgl.opengl.GL11 -import org.lwjgl.opengl.GL11.{glPopMatrix, glPushMatrix, glRotatef, glTranslatef} +import org.lwjgl.opengl.GL11.{glPopMatrix, glPushMatrix, glTranslatef} import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference /** * @author Calclavia diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/TileMixer.scala b/src/main/scala/edx/mechanical/mech/process/mixer/TileMixer.scala similarity index 97% rename from src/main/scala/resonantinduction/mechanical/mech/process/mixer/TileMixer.scala rename to src/main/scala/edx/mechanical/mech/process/mixer/TileMixer.scala index f415ef5f6..86f913a62 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/TileMixer.scala +++ b/src/main/scala/edx/mechanical/mech/process/mixer/TileMixer.scala @@ -1,8 +1,10 @@ -package resonantinduction.mechanical.mech.process.mixer +package edx.mechanical.mech.process.mixer import java.util.{LinkedHashSet, List, Set} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.mechanical.mech.TileMechanical import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.entity.Entity @@ -18,8 +20,6 @@ import resonant.lib.collection.Timer import resonant.lib.render.RenderUtility import resonant.lib.transform.rotation.Quaternion import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference -import resonantinduction.mechanical.mech.TileMechanical import scala.collection.JavaConversions._ diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/NodeTurbine.scala b/src/main/scala/edx/mechanical/mech/turbine/NodeTurbine.scala similarity index 87% rename from src/main/scala/resonantinduction/mechanical/mech/turbine/NodeTurbine.scala rename to src/main/scala/edx/mechanical/mech/turbine/NodeTurbine.scala index 8bab6e5bf..ce5292ac3 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/NodeTurbine.scala +++ b/src/main/scala/edx/mechanical/mech/turbine/NodeTurbine.scala @@ -1,8 +1,8 @@ -package resonantinduction.mechanical.mech.turbine +package edx.mechanical.mech.turbine +import edx.core.interfaces.TNodeMechanical +import edx.mechanical.mech.grid.NodeMechanical import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.core.interfaces.TNodeMechanical -import resonantinduction.mechanical.mech.grid.NodeMechanical /** * Turbine's Mechanical node @@ -33,12 +33,12 @@ class NodeTurbine(parent: TileTurbine) extends NodeMechanical(parent) return parent.multiBlockRadius } - def turbine: TileTurbine = getParent.asInstanceOf[TileTurbine] - override def canConnect[B <: NodeMechanical](other: B, from: ForgeDirection): Boolean = { return turbine.getMultiBlock.isPrimary && other.isInstanceOf[NodeMechanical] && !other.isInstanceOf[NodeTurbine] && canConnect(from) } override def canConnect(from: ForgeDirection) = from == turbine.getDirection + + def turbine: TileTurbine = getParent.asInstanceOf[TileTurbine] } \ No newline at end of file diff --git a/src/main/scala/edx/mechanical/mech/turbine/RenderWaterTurbine.scala b/src/main/scala/edx/mechanical/mech/turbine/RenderWaterTurbine.scala new file mode 100644 index 000000000..a077ac27d --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/turbine/RenderWaterTurbine.scala @@ -0,0 +1,127 @@ +package edx.mechanical.mech.turbine + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.item.ItemStack +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.IItemRenderer +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.api.items.ISimpleItemRenderer +import resonant.lib.render.RenderUtility + +@SideOnly(Side.CLIENT) object RenderWaterTurbine +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "waterTurbines.obj")) +} + +@SideOnly(Side.CLIENT) class RenderWaterTurbine extends TileEntitySpecialRenderer with ISimpleItemRenderer +{ + def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) + { + val tile: TileTurbine = t.asInstanceOf[TileTurbine] + if (tile.getMultiBlock.isPrimary) + { + GL11.glPushMatrix + GL11.glTranslatef(x.asInstanceOf[Float] + 0.5f, y.asInstanceOf[Float] + 0.5f, z.asInstanceOf[Float] + 0.5f) + GL11.glPushMatrix + RenderUtility.rotateBlockBasedOnDirectionUp(tile.getDirection) + val mechanicalNodeRenderAngle: Double = tile.mechanicalNode.angle + var renderAngleInDegrees: Float = 0 + if (!java.lang.Double.isNaN(mechanicalNodeRenderAngle)) + { + renderAngleInDegrees = Math.toDegrees(mechanicalNodeRenderAngle).asInstanceOf[Float] + } + GL11.glRotatef(renderAngleInDegrees, 0, 1, 0) + if (tile.getDirection.offsetY != 0) + { + renderWaterTurbine(tile.tier, tile.multiBlockRadius, tile.getMultiBlock.isConstructed) + } + else + { + renderWaterWheel(tile.tier, tile.multiBlockRadius, tile.getMultiBlock.isConstructed) + } + GL11.glPopMatrix + GL11.glPopMatrix + } + } + + def renderWaterWheel(tier: Int, size: Int, isLarge: Boolean) + { + if (isLarge) + { + GL11.glScalef(0.3f, 1, 0.3f) + GL11.glScalef(size * 2 + 1, Math.min(size, 2), size * 2 + 1) + GL11.glPushMatrix + GL11.glScalef(1, 1.6f, 1) + RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") + RenderWaterTurbine.MODEL.renderOnly("bigwheel_endknot", "horizontal_centre_shaft") + GL11.glPopMatrix + GL11.glPushMatrix + GL11.glScalef(1, 1.4f, 1) + RenderUtility.bind(Reference.blockTextureDirectory + "planks_spruce.png") + RenderWaterTurbine.MODEL.renderOnly("bigwheel_supporters") + bindTexture(tier) + RenderWaterTurbine.MODEL.renderOnly("bigwheel_scoops", "bigwheel_supportercircle") + GL11.glPopMatrix + } + else + { + GL11.glPushMatrix + GL11.glScalef(0.7f, 1, 0.7f) + RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") + RenderWaterTurbine.MODEL.renderOnly("small_waterwheel_endknot") + bindTexture(tier) + RenderWaterTurbine.MODEL.renderOnly("small_waterwheel", "small_waterwheel_supporters", "horizontal_centre_shaft") + GL11.glPopMatrix + } + } + + def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*) + { + GL11.glPushMatrix + GL11.glTranslatef(0.5f, 0.5f, 0.5f) + renderWaterTurbine(itemStack.getItemDamage, 1, false) + GL11.glPopMatrix + } + + def renderWaterTurbine(tier: Int, size: Int, isLarge: Boolean) + { + if (isLarge) + { + GL11.glScalef(0.3f, 1, 0.3f) + GL11.glScalef(size * 2 + 1, Math.min(size, 2), size * 2 + 1) + bindTexture(tier) + RenderWaterTurbine.MODEL.renderOnly("turbine_centre") + RenderWaterTurbine.MODEL.renderOnly("turbine_blades") + } + else + { + GL11.glPushMatrix + GL11.glScalef(0.9f, 1f, 0.9f) + RenderUtility.bind(Reference.blockTextureDirectory + "log_oak.png") + RenderWaterTurbine.MODEL.renderOnly("small_waterwheel_endknot") + bindTexture(tier) + RenderWaterTurbine.MODEL.renderOnly("small_turbine_blades") + GL11.glPopMatrix + } + } + + def bindTexture(tier: Int) + { + if (tier == 0) + { + RenderUtility.bind(Reference.blockTextureDirectory + "planks_oak.png") + } + else if (tier == 1) + { + RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") + } + else if (tier == 2) + { + RenderUtility.bind(Reference.blockTextureDirectory + "iron_block.png") + } + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileTurbine.scala b/src/main/scala/edx/mechanical/mech/turbine/TileTurbine.scala similarity index 97% rename from src/main/scala/resonantinduction/mechanical/mech/turbine/TileTurbine.scala rename to src/main/scala/edx/mechanical/mech/turbine/TileTurbine.scala index eb1486be6..6f4199644 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileTurbine.scala +++ b/src/main/scala/edx/mechanical/mech/turbine/TileTurbine.scala @@ -1,8 +1,9 @@ -package resonantinduction.mechanical.mech.turbine +package edx.mechanical.mech.turbine import java.util.{HashSet, Set} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.mechanical.mech.TileMechanical import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -11,23 +12,22 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.AxisAlignedBB import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.prefab.tile.multiblock.reference.IMultiBlockStructure -import resonant.lib.wrapper.ByteBufWrapper._ import resonant.lib.network.discriminator.PacketType +import resonant.lib.prefab.tile.multiblock.reference.IMultiBlockStructure import resonant.lib.transform.vector.Vector3 -import resonantinduction.mechanical.mech.TileMechanical +import resonant.lib.wrapper.ByteBufWrapper._ import scala.collection.JavaConversions._ /** Reduced version of the main turbine class */ class TileTurbine extends TileMechanical(Material.wood) with IMultiBlockStructure[TileTurbine] { + /** MutliBlock methods. */ + private val multiBlock = new TurbineMBlockHandler(this) /** Tier of the turbine */ var tier = 0 /** Radius of large turbine? */ var multiBlockRadius = 1 - /** MutliBlock methods. */ - private val multiBlock = new TurbineMBlockHandler(this) //Constructor mechanicalNode = new NodeTurbine(this) @@ -57,13 +57,13 @@ class TileTurbine extends TileMechanical(Material.wood) with IMultiBlockStructur } } - def getArea: Int = (((multiBlockRadius + 0.5) * 2) * ((multiBlockRadius + 0.5) * 2)).toInt - /** Called to play sound effects */ def playSound() { } + def getArea: Int = (((multiBlockRadius + 0.5) * 2) * ((multiBlockRadius + 0.5) * 2)).toInt + @SideOnly(Side.CLIENT) override def getRenderBoundingBox: AxisAlignedBB = { @@ -98,11 +98,6 @@ class TileTurbine extends TileMechanical(Material.wood) with IMultiBlockStructur return toVector3 } - def getMultiBlock: TurbineMBlockHandler = - { - return multiBlock - } - def onMultiBlockChanged() { worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, if (getBlockType != null) getBlockType else null) @@ -127,6 +122,11 @@ class TileTurbine extends TileMechanical(Material.wood) with IMultiBlockStructur getMultiBlock.save(nbt) } + def getMultiBlock: TurbineMBlockHandler = + { + return multiBlock + } + override def read(buf: ByteBuf, id: Int, packetType: PacketType) { super.read(buf, id, packetType) diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileWaterTurbine.scala b/src/main/scala/edx/mechanical/mech/turbine/TileWaterTurbine.scala similarity index 96% rename from src/main/scala/resonantinduction/mechanical/mech/turbine/TileWaterTurbine.scala rename to src/main/scala/edx/mechanical/mech/turbine/TileWaterTurbine.scala index 27d08e3b6..8bc57c232 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileWaterTurbine.scala +++ b/src/main/scala/edx/mechanical/mech/turbine/TileWaterTurbine.scala @@ -1,8 +1,10 @@ -package resonantinduction.mechanical.mech.turbine +package edx.mechanical.mech.turbine import java.util.List import cpw.mods.fml.relauncher.ReflectionHelper +import edx.core.Settings +import edx.mechanical.mech.grid.NodeMechanical import net.minecraft.block.BlockLiquid import net.minecraft.creativetab.CreativeTabs import net.minecraft.init.Blocks @@ -15,8 +17,6 @@ import resonant.api.tile.INodeProvider import resonant.lib.prefab.tile.item.ItemBlockMetadata import resonant.lib.transform.vector.Vector3 import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.Settings -import resonantinduction.mechanical.mech.grid.NodeMechanical /** * The vertical water turbine collects flowing water flowing on X axis. diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileWindTurbine.scala b/src/main/scala/edx/mechanical/mech/turbine/TileWindTurbine.scala similarity index 98% rename from src/main/scala/resonantinduction/mechanical/mech/turbine/TileWindTurbine.scala rename to src/main/scala/edx/mechanical/mech/turbine/TileWindTurbine.scala index 9e00860f7..b9ca522aa 100644 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/TileWindTurbine.scala +++ b/src/main/scala/edx/mechanical/mech/turbine/TileWindTurbine.scala @@ -1,8 +1,9 @@ -package resonantinduction.mechanical.mech.turbine +package edx.mechanical.mech.turbine import java.util.List import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Reference, Settings} import net.minecraft.creativetab.CreativeTabs import net.minecraft.init.{Blocks, Items} import net.minecraft.item.{Item, ItemStack} @@ -21,7 +22,6 @@ import resonant.lib.utility.MathUtility import resonant.lib.utility.inventory.InventoryUtility import resonant.lib.wrapper.NBTWrapper._ import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.{Reference, Settings} /** * The vertical wind turbine collects airflow. @@ -38,6 +38,10 @@ object TileWindTurbine class TileWindTurbine extends TileTurbine with IBoilHandler { + /** + * Steam simulations + */ + private val gasTank = new FluidTank(1000) /** * Wind simulations */ @@ -47,11 +51,6 @@ class TileWindTurbine extends TileTurbine with IBoilHandler private var windPower = 0d private var nextWindPower = 0d - /** - * Steam simulations - */ - private val gasTank = new FluidTank(1000) - //Constructor this.itemBlock = classOf[ItemBlockMetadata] @@ -196,15 +195,6 @@ class TileWindTurbine extends TileTurbine with IBoilHandler } } - @SideOnly(Side.CLIENT) - override def renderInventory(itemStack: ItemStack) - { - GL11.glPushMatrix() - GL11.glTranslatef(0.5f, 0.5f, 0.5f) - render(itemStack.getItemDamage, 1, false) - GL11.glPopMatrix() - } - @SideOnly(Side.CLIENT) def render(tier: Int, size: Int, isConstructed: Boolean) { @@ -248,4 +238,13 @@ class TileWindTurbine extends TileTurbine with IBoilHandler TileWindTurbine.model.renderOnly("SmallHub") } } + + @SideOnly(Side.CLIENT) + override def renderInventory(itemStack: ItemStack) + { + GL11.glPushMatrix() + GL11.glTranslatef(0.5f, 0.5f, 0.5f) + render(itemStack.getItemDamage, 1, false) + GL11.glPopMatrix() + } } \ No newline at end of file diff --git a/src/main/scala/edx/mechanical/mech/turbine/TurbineMBlockHandler.scala b/src/main/scala/edx/mechanical/mech/turbine/TurbineMBlockHandler.scala new file mode 100644 index 000000000..05acca8fb --- /dev/null +++ b/src/main/scala/edx/mechanical/mech/turbine/TurbineMBlockHandler.scala @@ -0,0 +1,21 @@ +package edx.mechanical.mech.turbine + +import net.minecraft.tileentity.TileEntity +import resonant.lib.prefab.tile.multiblock.reference.MultiBlockHandler +import resonant.lib.transform.vector.Vector3 + +class TurbineMBlockHandler(wrapper: TileTurbine) extends MultiBlockHandler[TileTurbine](wrapper) +{ + override def getWrapperAt(position: Vector3): TileTurbine = + { + val tile: TileEntity = position.getTileEntity(this.tile.getWorld) + if (tile != null && wrapperClass.isAssignableFrom(tile.getClass)) + { + if (tile.asInstanceOf[TileTurbine].getDirection == this.tile.getDirection && tile.asInstanceOf[TileTurbine].tier == this.tile.tier) + { + return tile.asInstanceOf[TileTurbine] + } + } + return null + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/AtomicContent.scala b/src/main/scala/edx/quantum/QuantumContent.scala similarity index 82% rename from src/main/scala/resonantinduction/atomic/AtomicContent.scala rename to src/main/scala/edx/quantum/QuantumContent.scala index d3fa5f662..b29307061 100644 --- a/src/main/scala/resonantinduction/atomic/AtomicContent.scala +++ b/src/main/scala/edx/quantum/QuantumContent.scala @@ -1,10 +1,23 @@ -package resonantinduction.atomic +package edx.quantum import java.util.List import cpw.mods.fml.common.Loader import cpw.mods.fml.common.eventhandler.{Event, SubscribeEvent} import cpw.mods.fml.common.registry.{EntityRegistry, GameRegistry} +import edx.core.{EDXCreativeTab, Electrodynamics, Reference, Settings} +import edx.quantum.blocks._ +import edx.quantum.items._ +import edx.quantum.machine.TileFunnel +import edx.quantum.machine.accelerator.{EntityParticle, TileAccelerator} +import edx.quantum.machine.boiler.TileNuclearBoiler +import edx.quantum.machine.centrifuge.TileCentrifuge +import edx.quantum.machine.extractor.TileChemicalExtractor +import edx.quantum.machine.fulmination.{FulminationHandler, TileFulmination} +import edx.quantum.machine.plasma.{TilePlasma, TilePlasmaHeater} +import edx.quantum.machine.quantum.TileQuantumAssembler +import edx.quantum.machine.reactor.{TileControlRod, TileReactorCell} +import edx.quantum.schematic.{SchematicAccelerator, SchematicBreedingReactor, SchematicFissionReactor, SchematicFusionReactor} import ic2.api.item.IC2Items import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -29,29 +42,16 @@ import resonant.lib.network.discriminator.PacketAnnotationManager import resonant.lib.transform.vector.VectorWorld import resonant.lib.utility.recipe.UniversalRecipe import resonant.lib.world.schematic.SchematicRegistry -import resonantinduction.atomic.blocks._ -import resonantinduction.atomic.items._ -import resonantinduction.atomic.machine.TileFunnel -import resonantinduction.atomic.machine.accelerator.{EntityParticle, TileAccelerator} -import resonantinduction.atomic.machine.boiler.TileNuclearBoiler -import resonantinduction.atomic.machine.centrifuge.TileCentrifuge -import resonantinduction.atomic.machine.extractor.TileChemicalExtractor -import resonantinduction.atomic.machine.fulmination.{FulminationHandler, TileFulmination} -import resonantinduction.atomic.machine.plasma.{TilePlasma, TilePlasmaHeater} -import resonantinduction.atomic.machine.quantum.TileQuantumAssembler -import resonantinduction.atomic.machine.reactor.{TileControlRod, TileReactorCell} -import resonantinduction.atomic.schematic.{SchematicAccelerator, SchematicBreedingReactor, SchematicFissionReactor, SchematicFusionReactor} -import resonantinduction.core.{RICreativeTab, Reference, ResonantInduction, Settings} import scala.collection.JavaConversions._ /** * Created by robert on 8/10/2014. */ -object AtomicContent extends ContentHolder +object QuantumContent extends ContentHolder { //Constructor - manager.setTab(RICreativeTab).setPrefix(Reference.prefix) + manager.setTab(EDXCreativeTab).setPrefix(Reference.prefix) val ENTITY_ID_PREFIX: Int = 49 val SECOND_IN_TICKS: Int = 20 @@ -89,8 +89,8 @@ object AtomicContent extends ContentHolder @ExplicitContentName(value = "cellWater") var itemWaterCell: Item = new ItemCell("cellWater") @ExplicitContentName - var itemYellowCake: Item = new ItemRadioactive().setTextureName(Reference.prefix + "yellowcake").setCreativeTab(RICreativeTab) - var itemUranium: Item = new ItemUranium().setCreativeTab(RICreativeTab) + var itemYellowCake: Item = new ItemRadioactive().setTextureName(Reference.prefix + "yellowcake").setCreativeTab(EDXCreativeTab) + var itemUranium: Item = new ItemUranium().setCreativeTab(EDXCreativeTab) //Buckets var itemBucketToxic: Item = null @@ -114,12 +114,12 @@ object AtomicContent extends ContentHolder MinecraftForge.EVENT_BUS.register(FulminationHandler.INSTANCE) //Register Fluids - FluidRegistry.registerFluid(AtomicContent.FLUID_URANIUM_HEXAFLOURIDE) - FluidRegistry.registerFluid(AtomicContent.FLUID_STEAM) - FluidRegistry.registerFluid(AtomicContent.getFluidTritium) - FluidRegistry.registerFluid(AtomicContent.FLUID_DEUTERIUM) - FluidRegistry.registerFluid(AtomicContent.getFluidToxicWaste) - FluidRegistry.registerFluid(AtomicContent.FLUID_PLASMA) + FluidRegistry.registerFluid(QuantumContent.FLUID_URANIUM_HEXAFLOURIDE) + FluidRegistry.registerFluid(QuantumContent.FLUID_STEAM) + FluidRegistry.registerFluid(QuantumContent.getFluidTritium) + FluidRegistry.registerFluid(QuantumContent.FLUID_DEUTERIUM) + FluidRegistry.registerFluid(QuantumContent.getFluidToxicWaste) + FluidRegistry.registerFluid(QuantumContent.FLUID_PLASMA) Settings.config.load @@ -132,7 +132,7 @@ object AtomicContent extends ContentHolder PacketAnnotationManager.INSTANCE.register(classOf[TileAccelerator]) //Buckets - itemBucketToxic = manager.newItem("bucketToxicWaste", new ItemBucket(AtomicContent.blockPlasma)).setCreativeTab(RICreativeTab).setContainerItem(Items.bucket).setTextureName(Reference.prefix + "bucketToxicWaste") + itemBucketToxic = manager.newItem("bucketToxicWaste", new ItemBucket(QuantumContent.blockPlasma)).setCreativeTab(EDXCreativeTab).setContainerItem(Items.bucket).setTextureName(Reference.prefix + "bucketToxicWaste") //Schematics SchematicRegistry.register("resonantInduction.atomic.accelerator", new SchematicAccelerator) @@ -141,11 +141,11 @@ object AtomicContent extends ContentHolder SchematicRegistry.register("resonantInduction.atomic.fusionReactor", new SchematicFusionReactor) //Fluid Containers - AtomicContent.FLUID_PLASMA.setBlock(AtomicContent.blockPlasma) - FluidContainerRegistry.registerFluidContainer(FluidRegistry.getFluid("toxicwaste"), new ItemStack(AtomicContent.itemBucketToxic), new ItemStack(Items.bucket)) - FluidContainerRegistry.registerFluidContainer(FluidRegistry.WATER, new ItemStack(AtomicContent.itemWaterCell), new ItemStack(AtomicContent.itemCell)) - FluidContainerRegistry.registerFluidContainer(new FluidStack(FluidRegistry.getFluid("deuterium"), 200), new ItemStack(AtomicContent.itemDeuteriumCell), new ItemStack(AtomicContent.itemCell)) - FluidContainerRegistry.registerFluidContainer(new FluidStack(FluidRegistry.getFluid("tritium"), 200), new ItemStack(AtomicContent.itemTritiumCell), new ItemStack(AtomicContent.itemCell)) + QuantumContent.FLUID_PLASMA.setBlock(QuantumContent.blockPlasma) + FluidContainerRegistry.registerFluidContainer(FluidRegistry.getFluid("toxicwaste"), new ItemStack(QuantumContent.itemBucketToxic), new ItemStack(Items.bucket)) + FluidContainerRegistry.registerFluidContainer(FluidRegistry.WATER, new ItemStack(QuantumContent.itemWaterCell), new ItemStack(QuantumContent.itemCell)) + FluidContainerRegistry.registerFluidContainer(new FluidStack(FluidRegistry.getFluid("deuterium"), 200), new ItemStack(QuantumContent.itemDeuteriumCell), new ItemStack(QuantumContent.itemCell)) + FluidContainerRegistry.registerFluidContainer(new FluidStack(FluidRegistry.getFluid("tritium"), 200), new ItemStack(QuantumContent.itemTritiumCell), new ItemStack(QuantumContent.itemCell)) //Uranium ore Gen settings TODO re-enable //AtomicContent.uraniumOreGeneration = new OreGenReplaceStone("Uranium Ore", new ItemStack(AtomicContent.blockUraniumOre), 25, 9, 3) @@ -193,40 +193,6 @@ object AtomicContent extends ContentHolder def FLUID_PLASMA: Fluid = new Fluid("plasma").setGaseous(true) - def FLUID_STEAM: Fluid = - { - var fluid: Fluid = FluidRegistry.getFluid("steam"); - if (fluid == null) - { - fluid = new Fluid("steam").setGaseous(true) - FluidRegistry.registerFluid(fluid) - } - return fluid - } - - def FLUID_DEUTERIUM: Fluid = - { - var fluid: Fluid = FluidRegistry.getFluid("deuterium"); - if (fluid == null) - { - fluid = new Fluid("deuterium").setGaseous(true) - FluidRegistry.registerFluid(fluid) - } - return fluid - } - - /** Gets the Fluid instance of Toxic Waste */ - def getFluidToxicWaste: Fluid = - { - var fluid: Fluid = FluidRegistry.getFluid("toxicwaste"); - if (fluid == null) - { - fluid = new Fluid("toxicwaste").setGaseous(true) - FluidRegistry.registerFluid(fluid) - } - return fluid - } - override def postInit() { super.postInit() @@ -238,13 +204,13 @@ object AtomicContent extends ContentHolder if (cellEmptyName == "Unknown") { } - GameRegistry.addRecipe(new ShapelessOreRecipe(AtomicContent.itemYellowCake, IC2Items.getItem("reactorUraniumSimple"))) - GameRegistry.addRecipe(new ShapelessOreRecipe(IC2Items.getItem("cell"), AtomicContent.itemCell)) - GameRegistry.addRecipe(new ShapelessOreRecipe(AtomicContent.itemCell, "cellEmpty")) + GameRegistry.addRecipe(new ShapelessOreRecipe(QuantumContent.itemYellowCake, IC2Items.getItem("reactorUraniumSimple"))) + GameRegistry.addRecipe(new ShapelessOreRecipe(IC2Items.getItem("cell"), QuantumContent.itemCell)) + GameRegistry.addRecipe(new ShapelessOreRecipe(QuantumContent.itemCell, "cellEmpty")) } EntityRegistry.registerGlobalEntityID(classOf[EntityParticle], "ASParticle", EntityRegistry.findGlobalUniqueEntityId) - EntityRegistry.registerModEntity(classOf[EntityParticle], "ASParticle", ENTITY_ID_PREFIX, ResonantInduction, 80, 3, true) + EntityRegistry.registerModEntity(classOf[EntityParticle], "ASParticle", ENTITY_ID_PREFIX, Electrodynamics, 80, 3, true) Settings.config.load() for (oreName <- OreDictionary.getOreNames) @@ -263,8 +229,8 @@ object AtomicContent extends ContentHolder Settings.config.save() - recipes += shapeless(new ItemStack(itemAntimatter, 1, 1), itemAntimatter, itemAntimatter, itemAntimatter, itemAntimatter, itemAntimatter, AtomicContent.itemAntimatter, itemAntimatter, itemAntimatter) - recipes += shapeless(new ItemStack(itemAntimatter, 8, 0), new ItemStack(AtomicContent.itemAntimatter, 1, 1)) + recipes += shapeless(new ItemStack(itemAntimatter, 1, 1), itemAntimatter, itemAntimatter, itemAntimatter, itemAntimatter, itemAntimatter, QuantumContent.itemAntimatter, itemAntimatter, itemAntimatter) + recipes += shapeless(new ItemStack(itemAntimatter, 8, 0), new ItemStack(QuantumContent.itemAntimatter, 1, 1)) recipes += shaped(new ItemStack(blockSteamFunnel, 2), " B ", "B B", "B B", 'B', UniversalRecipe.SECONDARY_METAL.get) @@ -279,7 +245,7 @@ object AtomicContent extends ContentHolder recipes += shaped(new ItemStack(blockSiren, 2), "NPN", 'N', Blocks.noteblock, 'P', UniversalRecipe.SECONDARY_PLATE.get) recipes += shaped(blockReactorCell, "SCS", "MEM", "SCS", 'E', "cellEmpty", 'C', UniversalRecipe.CIRCUIT_T2.get, 'S', UniversalRecipe.PRIMARY_PLATE.get, 'M', UniversalRecipe.MOTOR.get) - recipes += shaped(blockFusionCore, "CPC", "PFP", "CPC", 'P', UniversalRecipe.PRIMARY_PLATE.get, 'F', AtomicContent.blockReactorCell, 'C', UniversalRecipe.CIRCUIT_T3.get) + recipes += shaped(blockFusionCore, "CPC", "PFP", "CPC", 'P', UniversalRecipe.PRIMARY_PLATE.get, 'F', QuantumContent.blockReactorCell, 'C', UniversalRecipe.CIRCUIT_T3.get) recipes += shaped(new ItemStack(itemCell, 16), " T ", "TGT", " T ", 'T', "ingotTin", 'G', Blocks.glass) recipes += shaped(blockControlRod, "I", "I", "I", 'I', Items.iron_ingot) recipes += shaped(itemFissileFuel, "CUC", "CUC", "CUC", 'U', "ingotUranium", 'C', "cellEmpty") @@ -293,9 +259,9 @@ object AtomicContent extends ContentHolder //Electro magnets recipes += shaped(new ItemStack(blockElectromagnet, 2, 0), "BBB", "BMB", "BBB", 'B', UniversalRecipe.SECONDARY_METAL.get, 'M', UniversalRecipe.MOTOR.get) - recipes += shapeless(new ItemStack(AtomicContent.blockElectromagnet, 1, 1), AtomicContent.blockElectromagnet, Blocks.glass) + recipes += shapeless(new ItemStack(QuantumContent.blockElectromagnet, 1, 1), QuantumContent.blockElectromagnet, Blocks.glass) - recipes += shapeless(new ItemStack(AtomicContent.itemWaterCell), "cellEmpty", Items.water_bucket) + recipes += shapeless(new ItemStack(QuantumContent.itemWaterCell), "cellEmpty", Items.water_bucket) } @@ -305,10 +271,10 @@ object AtomicContent extends ContentHolder if (!evt.world.isRemote && evt.target != null && evt.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { val pos: VectorWorld = new VectorWorld(evt.world, evt.target) - if (pos.getBlock eq AtomicContent.blockToxicWaste) + if (pos.getBlock eq QuantumContent.blockToxicWaste) { pos.setBlockToAir - evt.result = new ItemStack(AtomicContent.itemBucketToxic) + evt.result = new ItemStack(QuantumContent.itemBucketToxic) evt.setResult(Event.Result.ALLOW) } } @@ -319,7 +285,7 @@ object AtomicContent extends ContentHolder { val pos: VectorWorld = evt.position val block: Block = pos.getBlock - if (block == AtomicContent.blockElectromagnet) + if (block == QuantumContent.blockElectromagnet) { evt.heatLoss = evt.deltaTemperature * 0.6f } @@ -344,7 +310,7 @@ object AtomicContent extends ContentHolder else { evt.world.setBlockToAir(evt.x, evt.y, evt.z) - evt.world.setBlock(evt.x, evt.y, evt.z, AtomicContent.blockPlasma) + evt.world.setBlock(evt.x, evt.y, evt.z, QuantumContent.blockPlasma) } } } @@ -411,7 +377,7 @@ object AtomicContent extends ContentHolder def FLUIDSTACK_WATER: FluidStack = new FluidStack(FluidRegistry.WATER, 0) - def FLUIDSTACK_URANIUM_HEXAFLOURIDE: FluidStack = new FluidStack(AtomicContent.FLUID_URANIUM_HEXAFLOURIDE, 0) + def FLUIDSTACK_URANIUM_HEXAFLOURIDE: FluidStack = new FluidStack(QuantumContent.FLUID_URANIUM_HEXAFLOURIDE, 0) def FLUID_URANIUM_HEXAFLOURIDE: Fluid = { @@ -426,8 +392,30 @@ object AtomicContent extends ContentHolder def FLUIDSTACK_STEAM: FluidStack = new FluidStack(FLUID_STEAM, 0) + def FLUID_STEAM: Fluid = + { + var fluid: Fluid = FluidRegistry.getFluid("steam"); + if (fluid == null) + { + fluid = new Fluid("steam").setGaseous(true) + FluidRegistry.registerFluid(fluid) + } + return fluid + } + def FLUIDSTACK_DEUTERIUM: FluidStack = new FluidStack(FLUID_DEUTERIUM, 0) + def FLUID_DEUTERIUM: Fluid = + { + var fluid: Fluid = FluidRegistry.getFluid("deuterium"); + if (fluid == null) + { + fluid = new Fluid("deuterium").setGaseous(true) + FluidRegistry.registerFluid(fluid) + } + return fluid + } + def getFluidStackTritium: FluidStack = new FluidStack(getFluidTritium, 0) /** Gets the Fluid instance of Tritium */ @@ -444,4 +432,16 @@ object AtomicContent extends ContentHolder /** Gets a FluidStack of Toxic Waste */ def getStackToxicWaste: FluidStack = new FluidStack(getFluidToxicWaste, 0) + + /** Gets the Fluid instance of Toxic Waste */ + def getFluidToxicWaste: Fluid = + { + var fluid: Fluid = FluidRegistry.getFluid("toxicwaste"); + if (fluid == null) + { + fluid = new Fluid("toxicwaste").setGaseous(true) + FluidRegistry.registerFluid(fluid) + } + return fluid + } } diff --git a/src/main/scala/edx/quantum/blocks/BlockRadioactive.scala b/src/main/scala/edx/quantum/blocks/BlockRadioactive.scala new file mode 100644 index 000000000..9b6438ddb --- /dev/null +++ b/src/main/scala/edx/quantum/blocks/BlockRadioactive.scala @@ -0,0 +1,120 @@ +package edx.quantum.blocks + +import java.util.{List, Random} + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.block.Block +import net.minecraft.block.material.Material +import net.minecraft.client.Minecraft +import net.minecraft.client.particle.EntitySmokeFX +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.entity.{Entity, EntityLiving, EntityLivingBase} +import net.minecraft.init.Blocks +import net.minecraft.util.{AxisAlignedBB, IIcon} +import net.minecraft.world.World +import resonant.lib.prefab.poison.PoisonRadiation +import resonant.lib.transform.vector.Vector3 + +import scala.collection.JavaConversions._ + +class BlockRadioactive(material: Material) extends Block(material) +{ + var canSpread: Boolean = true + var radius: Float = 5 + var amplifier: Int = 2 + var canWalkPoison: Boolean = true + var isRandomlyRadioactive: Boolean = true + var spawnParticle: Boolean = true + private var iconTop: IIcon = null + private var iconBottom: IIcon = null + + //Constructor + this.setTickRandomly(true) + this.setHardness(0.2F) + + override def getIcon(side: Int, metadata: Int): IIcon = + { + return if (side == 1) this.iconTop else (if (side == 0) this.iconBottom else this.blockIcon) + } + + @SideOnly(Side.CLIENT) override def registerBlockIcons(iconRegister: IIconRegister) + { + super.registerBlockIcons(iconRegister) + this.iconTop = iconRegister.registerIcon(this.getUnlocalizedName.replace("tile.", "") + "_top") + this.iconBottom = iconRegister.registerIcon(this.getUnlocalizedName.replace("tile.", "") + "_bottom") + } + + /** + * Ticks the block if it's been scheduled + */ + override def updateTick(world: World, x: Int, y: Int, z: Int, rand: Random) + { + if (!world.isRemote) + { + if (this.isRandomlyRadioactive) + { + val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(x - this.radius, y - this.radius, z - this.radius, x + this.radius, y + this.radius, z + this.radius) + val entitiesNearby: List[_] = world.getEntitiesWithinAABB(classOf[EntityLivingBase], bounds) + for (entity <- entitiesNearby) + { + PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), entity.asInstanceOf[EntityLiving], amplifier) + } + } + if (this.canSpread) + { + for (i <- 0 to 4) + { + val newX: Int = x + rand.nextInt(3) - 1 + val newY: Int = y + rand.nextInt(5) - 3 + val newZ: Int = z + rand.nextInt(3) - 1 + val block: Block = world.getBlock(newX, newY, newZ) + if (rand.nextFloat > 0.4 && (block == Blocks.farmland || block == Blocks.grass)) + { + world.setBlock(newX, newY, newZ, this) + } + } + if (rand.nextFloat > 0.85) + { + world.setBlock(x, y, z, Blocks.dirt) + } + } + } + } + + /** + * Called whenever an entity is walking on top of this block. Args: world, x, y, z, entity + */ + override def onEntityWalking(par1World: World, x: Int, y: Int, z: Int, par5Entity: Entity) + { + if (par5Entity.isInstanceOf[EntityLiving] && this.canWalkPoison) + { + PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), par5Entity.asInstanceOf[EntityLiving]) + } + } + + override def quantityDropped(par1Random: Random): Int = + { + return 0 + } + + @SideOnly(Side.CLIENT) override def randomDisplayTick(world: World, x: Int, y: Int, z: Int, par5Random: Random) + { + if (this.spawnParticle) + { + if (Minecraft.getMinecraft.gameSettings.particleSetting == 0) + { + val radius: Int = 3 + for (i <- 0 to 2) + { + val pos: Vector3 = new Vector3(x, y, z) + pos.add(Math.random * radius - radius / 2, Math.random * radius - radius / 2, Math.random * radius - radius / 2) + val fx: EntitySmokeFX = new EntitySmokeFX(world, pos.x, pos.y, pos.z, (Math.random - 0.5) / 2, (Math.random - 0.5) / 2, (Math.random - 0.5) / 2) + fx.setRBGColorF(0.2f, 0.8f, 0) + Minecraft.getMinecraft.effectRenderer.addEffect(fx) + + } + } + } + } + +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/blocks/BlockToxicWaste.scala b/src/main/scala/edx/quantum/blocks/BlockToxicWaste.scala new file mode 100644 index 000000000..527a8cef3 --- /dev/null +++ b/src/main/scala/edx/quantum/blocks/BlockToxicWaste.scala @@ -0,0 +1,43 @@ +package edx.quantum.blocks + +import java.util.Random + +import edx.quantum.QuantumContent +import net.minecraft.block.material.Material +import net.minecraft.entity.{Entity, EntityLivingBase} +import net.minecraft.util.DamageSource +import net.minecraft.world.World +import net.minecraftforge.fluids.BlockFluidClassic +import resonant.lib.prefab.poison.PoisonRadiation +import resonant.lib.transform.vector.Vector3 + +class BlockToxicWaste extends BlockFluidClassic(QuantumContent.getFluidToxicWaste, Material.water) +{ + //Constructor + setTickRate(20) + + override def randomDisplayTick(par1World: World, x: Int, y: Int, z: Int, par5Random: Random) + { + super.randomDisplayTick(par1World, x, y, z, par5Random) + if (par5Random.nextInt(100) == 0) + { + val d5: Double = x + par5Random.nextFloat + val d7: Double = y + this.maxY + val d6: Double = z + par5Random.nextFloat + par1World.spawnParticle("suspended", d5, d7, d6, 0.0D, 0.0D, 0.0D) + } + if (par5Random.nextInt(200) == 0) + { + par1World.playSound(x, y, z, "liquid.lava", 0.2F + par5Random.nextFloat * 0.2F, 0.9F + par5Random.nextFloat * 0.15F, false) + } + } + + override def onEntityCollidedWithBlock(par1World: World, x: Int, y: Int, z: Int, entity: Entity) + { + if (entity.isInstanceOf[EntityLivingBase]) + { + entity.attackEntityFrom(DamageSource.wither, 3) + PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), entity.asInstanceOf[EntityLivingBase], 4) + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/blocks/BlockUraniumOre.scala b/src/main/scala/edx/quantum/blocks/BlockUraniumOre.scala new file mode 100644 index 000000000..0b048a41b --- /dev/null +++ b/src/main/scala/edx/quantum/blocks/BlockUraniumOre.scala @@ -0,0 +1,39 @@ +package edx.quantum.blocks + +import java.util.Random + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Reference, Settings} +import net.minecraft.block.material.Material +import net.minecraft.world.World + +/** + * Uranium ore block + */ +class BlockUraniumOre extends BlockRadioactive(Material.rock) +{ + //Constructor + this.setBlockName(Reference.prefix + "oreUranium") + this.setStepSound(net.minecraft.block.Block.soundTypeStone) + this.setHardness(2f) + this.setBlockTextureName(Reference.prefix + "oreUranium") + this.isRandomlyRadioactive = Settings.allowRadioactiveOres + this.canWalkPoison = Settings.allowRadioactiveOres + this.canSpread = false + this.radius = 1f + this.amplifier = 0 + this.spawnParticle = true + + @SideOnly(Side.CLIENT) override def randomDisplayTick(world: World, x: Int, y: Int, z: Int, par5Random: Random) + { + if (Settings.allowRadioactiveOres) + { + super.randomDisplayTick(world, x, y, z, par5Random) + } + } + + override def quantityDropped(par1Random: Random): Int = + { + return 1 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/blocks/TileElectromagnet.scala b/src/main/scala/edx/quantum/blocks/TileElectromagnet.scala new file mode 100644 index 000000000..c17948a70 --- /dev/null +++ b/src/main/scala/edx/quantum/blocks/TileElectromagnet.scala @@ -0,0 +1,129 @@ +package edx.quantum.blocks + +import java.util.List + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.block.material.Material +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.creativetab.CreativeTabs +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.util.IIcon +import net.minecraft.world.IBlockAccess +import net.minecraftforge.common.util.ForgeDirection +import org.lwjgl.opengl.GL11._ +import resonant.api.tile.IElectromagnet +import resonant.lib.prefab.tile.item.ItemBlockMetadata +import resonant.lib.prefab.tile.spatial.SpatialBlock +import resonant.lib.render.{RenderBlockUtility, RenderUtility} +import resonant.lib.transform.vector.Vector3 +import resonant.lib.world.WorldUtility +import resonant.lib.wrapper.WrapList._ + +/** + * Electromagnet block + */ +class TileElectromagnet extends SpatialBlock(Material.iron) with IElectromagnet +{ + private val edgeTexture: String = "stone" + private var iconTop: IIcon = null + private var iconGlass: IIcon = null + + //Constructor + blockResistance = 20 + forceItemToRenderAsBlock = true + normalRender = false + isOpaqueCube = false + renderStaticBlock = true + this.itemBlock(classOf[ItemBlockMetadata]) + + override def getIcon(side: Int, metadata: Int): IIcon = + { + if (metadata == 1) + { + return iconGlass + } + if (side == 0 || side == 1) + { + return iconTop + } + return super.getIcon(side, metadata) + } + + @SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister) + { + super.registerIcons(iconRegister) + iconTop = iconRegister.registerIcon(domain + textureName + "_top") + iconGlass = iconRegister.registerIcon(domain + "electromagnetGlass") + } + + override def metadataDropped(meta: Int, fortune: Int): Int = + { + return meta + } + + override def canUpdate: Boolean = + { + return false + } + + override def shouldSideBeRendered(access: IBlockAccess, x: Int, y: Int, z: Int, side: Int): Boolean = + { + if (access.getBlockMetadata(x, y, z) != 1) + { + return super.shouldSideBeRendered(access, x, y, z, side) + } + return true + } + + override def getRenderBlockPass: Int = + { + return 0 + } + + override def getSubBlocks(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) + { + super.getSubBlocks(item, par2CreativeTabs, par3List) + par3List.add(new ItemStack(item, 1, 1)) + } + + def isRunning: Boolean = + { + return true + } + + @SideOnly(Side.CLIENT) + override def renderInventory(itemStack: ItemStack) + { + if (itemStack != null) + { + glPushMatrix() + glTranslated(0.5, 0.5, 0.5) + RenderBlockUtility.tessellateBlockWithConnectedTextures(itemStack.getItemDamage(), block, null, RenderUtility.getIcon(edgeTexture)) + glPopMatrix() + } + else + { + super.renderInventory(itemStack) + } + } + + @SideOnly(Side.CLIENT) + override def renderDynamic(pos: Vector3, frame: Float, pass: Int) + { + var sideMap = 0 + + for (dir <- ForgeDirection.VALID_DIRECTIONS) + { + val check = toVector3 + dir + val checkTile = check.getTileEntity(world) + + if (checkTile != null && checkTile.getClass == tile.getClass && check.getBlockMetadata(world) == tile.getBlockMetadata) + { + sideMap = WorldUtility.setEnableSide(sideMap, dir, true) + } + } + + RenderBlockUtility.tessellateBlockWithConnectedTextures(sideMap, world, xi, yi, zi, tile.getBlockType, null, RenderUtility.getIcon(edgeTexture)) + } + +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/blocks/TileSiren.scala b/src/main/scala/edx/quantum/blocks/TileSiren.scala new file mode 100644 index 000000000..b71df69d1 --- /dev/null +++ b/src/main/scala/edx/quantum/blocks/TileSiren.scala @@ -0,0 +1,54 @@ +package edx.quantum.blocks + +import edx.core.Reference +import net.minecraft.block.material.Material +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.world.World +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.prefab.tile.spatial.SpatialBlock +import resonant.lib.transform.vector.Vector3 + +/** + * Siren block + */ +class TileSiren extends SpatialBlock(Material.wood) +{ + + override def update + { + val world: World = worldObj + if (world != null) + { + val metadata: Int = world.getBlockMetadata(xi, yi, zi) + if (world.getBlockPowerInput(xi, yi, zi) > 0) + { + var volume: Float = 0.5f + for (i <- 0 to 6) + { + val check: Vector3 = toVector3.add(ForgeDirection.getOrientation(i)) + if (check.getBlock(world) eq getBlockType) + { + volume *= 1.5f + } + } + world.playSoundEffect(x, y, z, Reference.prefix + "alarm", volume, 1f - 0.18f * (metadata / 15f)) + } + } + } + + override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = + { + var metadata: Int = world.getBlockMetadata(xi, yi, zi) + if (player.isSneaking) + { + metadata -= 1 + } + else + { + metadata += 1 + } + metadata = Math.max(metadata % 16, 0) + world.setBlockMetadataWithNotify(xi, yi, zi, metadata, 2) + return true + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/gate/IQuantumGate.java b/src/main/scala/edx/quantum/gate/IQuantumGate.java similarity index 84% rename from src/main/scala/resonantinduction/atomic/gate/IQuantumGate.java rename to src/main/scala/edx/quantum/gate/IQuantumGate.java index c38272279..3107e28fe 100644 --- a/src/main/scala/resonantinduction/atomic/gate/IQuantumGate.java +++ b/src/main/scala/edx/quantum/gate/IQuantumGate.java @@ -1,4 +1,4 @@ -package resonantinduction.atomic.gate; +package edx.quantum.gate; import resonant.api.tile.IBlockFrequency; diff --git a/src/main/scala/resonantinduction/atomic/gate/ItemQuantumGlyph.scala b/src/main/scala/edx/quantum/gate/ItemQuantumGlyph.scala similarity index 92% rename from src/main/scala/resonantinduction/atomic/gate/ItemQuantumGlyph.scala rename to src/main/scala/edx/quantum/gate/ItemQuantumGlyph.scala index e6147b79b..8b30a2812 100644 --- a/src/main/scala/resonantinduction/atomic/gate/ItemQuantumGlyph.scala +++ b/src/main/scala/edx/quantum/gate/ItemQuantumGlyph.scala @@ -1,17 +1,17 @@ -package resonantinduction.atomic.gate +package edx.quantum.gate import java.util.List import codechicken.lib.vec.{BlockCoord, Vector3} import codechicken.microblock.CornerPlacementGrid import codechicken.multipart._ +import edx.core.ResonantPartFactory +import edx.core.prefab.part.IHighlight import net.minecraft.creativetab.CreativeTabs import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} import net.minecraft.world.World import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.ResonantPartFactory -import resonantinduction.core.prefab.part.IHighlight class ItemQuantumGlyph extends Item with TItemMultiPart with IHighlight { diff --git a/src/main/scala/resonantinduction/atomic/gate/PartQuantumGlyph.scala b/src/main/scala/edx/quantum/gate/PartQuantumGlyph.scala similarity index 98% rename from src/main/scala/resonantinduction/atomic/gate/PartQuantumGlyph.scala rename to src/main/scala/edx/quantum/gate/PartQuantumGlyph.scala index fe6930e23..7faab73fd 100644 --- a/src/main/scala/resonantinduction/atomic/gate/PartQuantumGlyph.scala +++ b/src/main/scala/edx/quantum/gate/PartQuantumGlyph.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.gate +package edx.quantum.gate import java.lang.{Iterable => JIterable} import java.util.{ArrayList, List, Set} @@ -7,15 +7,15 @@ import codechicken.lib.data.{MCDataInput, MCDataOutput} import codechicken.lib.vec.{Cuboid6, Vector3} import codechicken.multipart.{JCuboidPart, JNormalOcclusion, TSlottedPart} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.electrical.ElectricalContent import net.minecraft.entity.Entity import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.tileentity.TileEntity import net.minecraft.util.{ChatComponentText, MovingObjectPosition} -import resonant.api.tile.IBlockFrequency import resonant.api.mffs.fortron.FrequencyGridRegistry -import resonantinduction.electrical.ElectricalContent +import resonant.api.tile.IBlockFrequency import resonant.lib.transform.vector.VectorWorld import scala.collection.JavaConversions._ diff --git a/src/main/scala/resonantinduction/atomic/gate/QuantumGateManager.java b/src/main/scala/edx/quantum/gate/QuantumGateManager.java similarity index 99% rename from src/main/scala/resonantinduction/atomic/gate/QuantumGateManager.java rename to src/main/scala/edx/quantum/gate/QuantumGateManager.java index 14659c770..2536e4a7f 100644 --- a/src/main/scala/resonantinduction/atomic/gate/QuantumGateManager.java +++ b/src/main/scala/edx/quantum/gate/QuantumGateManager.java @@ -1,4 +1,4 @@ -package resonantinduction.atomic.gate; +package edx.quantum.gate; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; diff --git a/src/main/scala/resonantinduction/atomic/gate/RenderQuantumGlyph.scala b/src/main/scala/edx/quantum/gate/RenderQuantumGlyph.scala similarity index 93% rename from src/main/scala/resonantinduction/atomic/gate/RenderQuantumGlyph.scala rename to src/main/scala/edx/quantum/gate/RenderQuantumGlyph.scala index a48f3f73a..0a4a51efa 100644 --- a/src/main/scala/resonantinduction/atomic/gate/RenderQuantumGlyph.scala +++ b/src/main/scala/edx/quantum/gate/RenderQuantumGlyph.scala @@ -1,6 +1,7 @@ -package resonantinduction.atomic.gate +package edx.quantum.gate import codechicken.lib.vec.Cuboid6 +import edx.core.Reference import net.minecraft.client.renderer.texture.TextureMap import net.minecraft.init.Blocks import net.minecraft.item.ItemStack @@ -8,7 +9,6 @@ import net.minecraftforge.client.IItemRenderer import org.lwjgl.opengl.GL11 import resonant.api.items.ISimpleItemRenderer import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference object RenderQuantumGlyph extends ISimpleItemRenderer { diff --git a/src/main/scala/resonantinduction/atomic/gate/TraitQuantumGate.scala b/src/main/scala/edx/quantum/gate/TraitQuantumGate.scala similarity index 95% rename from src/main/scala/resonantinduction/atomic/gate/TraitQuantumGate.scala rename to src/main/scala/edx/quantum/gate/TraitQuantumGate.scala index 53cc3112b..419144ac2 100644 --- a/src/main/scala/resonantinduction/atomic/gate/TraitQuantumGate.scala +++ b/src/main/scala/edx/quantum/gate/TraitQuantumGate.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.gate +package edx.quantum.gate import codechicken.multipart.TileMultipart import resonant.api.tile.IBlockFrequency diff --git a/src/main/scala/edx/quantum/items/ItemAntimatter.scala b/src/main/scala/edx/quantum/items/ItemAntimatter.scala new file mode 100644 index 000000000..70a371f2b --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemAntimatter.scala @@ -0,0 +1,54 @@ +package edx.quantum.items + +import java.util.List + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{EDXCreativeTab, Reference} +import net.minecraft.client.renderer.texture.IIconRegister +import net.minecraft.creativetab.CreativeTabs +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.util.IIcon +import net.minecraft.world.World +import resonant.lib.wrapper.WrapList._ + +class ItemAntimatter extends ItemCell +{ + + private var iconGram: IIcon = null + + //Constructor + this.setMaxDamage(0) + this.setHasSubtypes(true) + this.setUnlocalizedName(Reference.prefix + "antimatter") + this.setTextureName(Reference.prefix + "antimatter") + setCreativeTab(EDXCreativeTab) + + @SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister) + { + this.itemIcon = iconRegister.registerIcon(Reference.prefix + "antimatter_milligram") + this.iconGram = iconRegister.registerIcon(Reference.prefix + "antimatter_gram") + } + + override def getIconFromDamage(metadata: Int): IIcon = + { + if (metadata >= 1) + { + return this.iconGram + } + else + { + return this.itemIcon + } + } + + override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) + { + par3List.add(new ItemStack(item, 1, 0)) + par3List.add(new ItemStack(item, 1, 1)) + } + + override def getEntityLifespan(itemStack: ItemStack, world: World): Int = + { + return 160 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemBreederFuel.scala b/src/main/scala/edx/quantum/items/ItemBreederFuel.scala new file mode 100644 index 000000000..0595a1912 --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemBreederFuel.scala @@ -0,0 +1,24 @@ +package edx.quantum.items + +import net.minecraft.item.ItemStack +import resonant.api.tile.{IReactor, IReactorComponent} + +/** + * Breeder rods + */ +class ItemBreederFuel extends ItemRadioactive with IReactorComponent +{ + //Constructor + this.setMaxDamage(ItemFissileFuel.DECAY) + this.setMaxStackSize(1) + this.setNoRepair + + override def onReact(itemStack: ItemStack, reactor: IReactor) + { + reactor.heat(ItemFissileFuel.ENERGY_PER_TICK / 2) + if (reactor.world.getWorldTime % 20 == 0) + { + itemStack.setItemDamage(Math.min(itemStack.getItemDamage + 1, itemStack.getMaxDamage)) + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemCell.scala b/src/main/scala/edx/quantum/items/ItemCell.scala new file mode 100644 index 000000000..26de6cade --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemCell.scala @@ -0,0 +1,32 @@ +package edx.quantum.items + +import edx.core.{EDXCreativeTab, Reference} +import edx.quantum.QuantumContent +import net.minecraft.item.ItemStack +import resonant.lib.prefab.item.ItemTooltip +import resonant.lib.utility.LanguageUtility + +class ItemCell extends ItemTooltip +{ + //Constructor + setContainerItem(QuantumContent.itemCell) + + def this(name: String) + { + this() + if (!name.equalsIgnoreCase("cellEmpty")) this.setContainerItem(QuantumContent.itemCell) + this.setUnlocalizedName(Reference.prefix + name) + this.setTextureName(Reference.prefix + name) + setCreativeTab(EDXCreativeTab) + } + + override def getUnlocalizedName(itemstack: ItemStack): String = + { + val localized: String = LanguageUtility.getLocal(getUnlocalizedName() + "." + itemstack.getItemDamage + ".name") + if (localized != null && !localized.isEmpty) + { + return getUnlocalizedName() + "." + itemstack.getItemDamage + } + return getUnlocalizedName() + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemFissileFuel.scala b/src/main/scala/edx/quantum/items/ItemFissileFuel.scala new file mode 100644 index 000000000..7cfc7fa62 --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemFissileFuel.scala @@ -0,0 +1,95 @@ +package edx.quantum.items + +import java.util.List + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{EDXCreativeTab, Reference, Settings} +import edx.quantum.QuantumContent +import edx.quantum.machine.reactor.TileReactorCell +import net.minecraft.creativetab.CreativeTabs +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.tileentity.TileEntity +import net.minecraft.world.World +import net.minecraftforge.common.util.ForgeDirection +import net.minecraftforge.fluids.FluidStack +import resonant.api.tile.{IReactor, IReactorComponent} +import resonant.lib.transform.vector.Vector3 +import resonant.lib.wrapper.WrapList._ + +/** + * Fissile fuel rod + */ +object ItemFissileFuel +{ + final val DECAY: Int = 2500 + /** + * Temperature at which the fuel rod will begin to re-enrich itself. + */ + final val BREEDING_TEMP: Int = 1100 + /** + * The energy in one KG of uranium is: 72PJ, 100TJ in one cell of uranium. + */ + final val ENERGY: Long = 100000000000L + /** + * Approximately 20,000,000J per tick. 400 MW. + */ + final val ENERGY_PER_TICK: Long = ENERGY / 50000 +} + +class ItemFissileFuel extends ItemRadioactive with IReactorComponent +{ + + //Constructor + this.setMaxStackSize(1) + this.setMaxDamage(ItemFissileFuel.DECAY) + this.setNoRepair + this.setUnlocalizedName(Reference.prefix + "rodBreederFuel") + this.setTextureName(Reference.prefix + "breederFuel") + setCreativeTab(EDXCreativeTab) + + def onReact(itemStack: ItemStack, reactor: IReactor) + { + val tileEntity: TileEntity = reactor.asInstanceOf[TileEntity] + val worldObj: World = tileEntity.getWorldObj + var reactors: Int = 0 + + for (i <- 0 to 6) + { + val checkPos: Vector3 = new Vector3(tileEntity).add(ForgeDirection.getOrientation(i)) + val tile: TileEntity = checkPos.getTileEntity(worldObj) + if (tile.isInstanceOf[TileReactorCell] && (tile.asInstanceOf[TileReactorCell]).getTemperature > ItemFissileFuel.BREEDING_TEMP) + { + reactors += 1 + } + } + + if (reactors >= 2) + { + if (worldObj.rand.nextInt(1000) <= 100 && reactor.getTemperature > (ItemFissileFuel.BREEDING_TEMP / 2)) + { + val healAmt: Int = worldObj.rand.nextInt(5) + itemStack.setItemDamage(Math.max(itemStack.getItemDamage - healAmt, 0)) + } + } + else + { + reactor.heat(ItemFissileFuel.ENERGY_PER_TICK) + if (reactor.world.getWorldTime % 20 == 0) + { + itemStack.setItemDamage(Math.min(itemStack.getItemDamage + 1, itemStack.getMaxDamage)) + } + if (Settings.allowToxicWaste && worldObj.rand.nextFloat > 0.5) + { + val fluid: FluidStack = QuantumContent.getStackToxicWaste.copy + fluid.amount = 1 + reactor.fill(ForgeDirection.UNKNOWN, fluid, true) + } + } + } + + @SideOnly(Side.CLIENT) override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) + { + par3List.add(new ItemStack(item, 1, 0)) + par3List.add(new ItemStack(item, 1, getMaxDamage - 1)) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemHazmat.scala b/src/main/scala/edx/quantum/items/ItemHazmat.scala new file mode 100644 index 000000000..84d2704ad --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemHazmat.scala @@ -0,0 +1,68 @@ +package edx.quantum.items + +import edx.core.{EDXCreativeTab, Electrodynamics, Reference} +import net.minecraft.entity.{Entity, EntityLivingBase} +import net.minecraft.item.{Item, ItemArmor, ItemStack} +import net.minecraft.util.DamageSource +import net.minecraftforge.common.util.EnumHelper +import resonant.api.armor.IAntiPoisonArmor + +/** + * Hazmat + */ +object ItemHazmat +{ + final val hazmatArmorMaterial: ItemArmor.ArmorMaterial = EnumHelper.addArmorMaterial("HAZMAT", 0, Array[Int](0, 0, 0, 0), 0) +} + +class ItemHazmat(slot: Int) extends ItemArmor(ItemHazmat.hazmatArmorMaterial, Electrodynamics.proxy.getArmorIndex("hazmat"), slot) with IAntiPoisonArmor +{ + def this(name: String, slot: Int) + { + this(slot) + this.setUnlocalizedName(Reference.prefix + name) + this.setCreativeTab(EDXCreativeTab) + this.setMaxDamage(200000) + } + + override def setUnlocalizedName(par1Str: String): Item = + { + super.setUnlocalizedName(par1Str) + this.setTextureName(par1Str) + return this + } + + override def getArmorTexture(stack: ItemStack, entity: Entity, slot: Int, `type`: String): String = + { + return Reference.prefix + Reference.modelPath + "hazmat.png" + } + + def isProtectedFromPoison(itemStack: ItemStack, entityLiving: EntityLivingBase, `type`: String): Boolean = + { + return `type`.equalsIgnoreCase("radiation") || `type`.equalsIgnoreCase("chemical") || `type`.equalsIgnoreCase("contagious") + } + + def onProtectFromPoison(itemStack: ItemStack, entityLiving: EntityLivingBase, `type`: String) + { + itemStack.damageItem(1, entityLiving) + } + + def getArmorType: Int = + { + return this.armorType + } + + def isPartOfSet(armorStack: ItemStack, compareStack: ItemStack): Boolean = + { + if (armorStack != null && compareStack != null) + { + return armorStack.getItem == compareStack.getItem + } + return false + } + + def areAllPartsNeeded(armorStack: ItemStack, entity: EntityLivingBase, source: DamageSource, data: AnyRef*): Boolean = + { + return true + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemRadioactive.scala b/src/main/scala/edx/quantum/items/ItemRadioactive.scala new file mode 100644 index 000000000..80faf89ae --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemRadioactive.scala @@ -0,0 +1,21 @@ +package edx.quantum.items + +import net.minecraft.entity.{Entity, EntityLivingBase} +import net.minecraft.item.{Item, ItemStack} +import net.minecraft.world.World +import resonant.lib.prefab.poison.PoisonRadiation +import resonant.lib.transform.vector.Vector3 + +/** + * Radioactive Items + */ +class ItemRadioactive extends Item +{ + override def onUpdate(par1ItemStack: ItemStack, par2World: World, entity: Entity, par4: Int, par5: Boolean) + { + if (entity.isInstanceOf[EntityLivingBase]) + { + PoisonRadiation.INSTANCE.poisonEntity(new Vector3(entity), entity.asInstanceOf[EntityLivingBase], 1) + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/items/ItemUranium.scala b/src/main/scala/edx/quantum/items/ItemUranium.scala new file mode 100644 index 000000000..59a0c7f89 --- /dev/null +++ b/src/main/scala/edx/quantum/items/ItemUranium.scala @@ -0,0 +1,48 @@ +package edx.quantum.items + +import java.util.List + +import net.minecraft.creativetab.CreativeTabs +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.{Item, ItemStack} +import org.lwjgl.input.Keyboard +import resonant.lib.render.EnumColor +import resonant.lib.utility.LanguageUtility +import resonant.lib.wrapper.WrapList._ + +/** + * Uranium + */ +class ItemUranium extends ItemRadioactive +{ + //Constructor + this.setHasSubtypes(true) + this.setMaxDamage(0) + + override def addInformation(itemStack: ItemStack, par2EntityPlayer: EntityPlayer, list: List[_], par4: Boolean) + { + val tooltip: String = LanguageUtility.getLocal(getUnlocalizedName(itemStack) + ".tooltip") + if (tooltip != null && tooltip.length > 0) + { + if (!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + list.add(LanguageUtility.getLocal("tooltip.noShift").replace("#0", EnumColor.AQUA.toString).replace("#1", EnumColor.GREY.toString)) + } + else + { + list.addAll(LanguageUtility.splitStringPerWord(tooltip, 5)) + } + } + } + + override def getUnlocalizedName(itemStack: ItemStack): java.lang.String = + { + return super.getUnlocalizedName() + "." + itemStack.getItemDamage + } + + override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, list: List[_]) + { + list.add(new ItemStack(item, 1, 0)) + list.add(new ItemStack(item, 1, 1)) + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/laser/ILaserHandler.java b/src/main/scala/edx/quantum/laser/ILaserHandler.java similarity index 86% rename from src/main/scala/resonantinduction/electrical/laser/ILaserHandler.java rename to src/main/scala/edx/quantum/laser/ILaserHandler.java index 22e309417..69e5390f9 100644 --- a/src/main/scala/resonantinduction/electrical/laser/ILaserHandler.java +++ b/src/main/scala/edx/quantum/laser/ILaserHandler.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.laser; +package edx.quantum.laser; import net.minecraft.util.MovingObjectPosition; import resonant.lib.transform.vector.Vector3; diff --git a/src/main/scala/resonantinduction/electrical/laser/Laser.scala b/src/main/scala/edx/quantum/laser/Laser.scala similarity index 90% rename from src/main/scala/resonantinduction/electrical/laser/Laser.scala rename to src/main/scala/edx/quantum/laser/Laser.scala index f655cce70..fbab9034c 100644 --- a/src/main/scala/resonantinduction/electrical/laser/Laser.scala +++ b/src/main/scala/edx/quantum/laser/Laser.scala @@ -1,8 +1,9 @@ -package resonantinduction.electrical.laser +package edx.quantum.laser import java.awt.Color import cpw.mods.fml.relauncher.ReflectionHelper +import edx.core.Electrodynamics import net.minecraft.block.material.Material import net.minecraft.block.{Block, BlockStainedGlass, BlockStainedGlassPane, BlockTNT} import net.minecraft.init.Blocks @@ -10,7 +11,6 @@ import net.minecraft.item.ItemDye import net.minecraft.tileentity.TileEntityFurnace import net.minecraft.util.{DamageSource, MovingObjectPosition} import net.minecraft.world.World -import resonantinduction.core.ResonantInduction import resonant.lib.transform.vector.Vector3 import scala.collection.mutable @@ -67,12 +67,12 @@ object Laser { if (!hitTile.asInstanceOf[ILaserHandler].onLaserHit(renderStart, direction, hit, color, energy)) { - ResonantInduction.proxy.renderLaser(world, renderStart, hitVec, color, energy) + Electrodynamics.proxy.renderLaser(world, renderStart, hitVec, color, energy) } } else if (hitBlock.getMaterial == Material.glass) { - ResonantInduction.proxy.renderLaser(world, renderStart, hitVec, color, energy) + Electrodynamics.proxy.renderLaser(world, renderStart, hitVec, color, energy) var newColor = color if (hitBlock.isInstanceOf[BlockStainedGlass] || hitBlock.isInstanceOf[BlockStainedGlassPane]) @@ -168,13 +168,13 @@ object Laser /** * Render laser hit */ - ResonantInduction.proxy.renderLaser(world, renderStart, hitVec, color, energy) + Electrodynamics.proxy.renderLaser(world, renderStart, hitVec, color, energy) /** * Render scorch and particles */ - ResonantInduction.proxy.renderScorch(world, hitVec - (direction * 0.02), hit.sideHit) - ResonantInduction.proxy.renderBlockParticle(world, hitVec, hitBlock, hit.sideHit) + Electrodynamics.proxy.renderScorch(world, hitVec - (direction * 0.02), hit.sideHit) + Electrodynamics.proxy.renderBlockParticle(world, hitVec, hitBlock, hit.sideHit) } } else if (hit.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) @@ -190,13 +190,13 @@ object Laser } } - ResonantInduction.proxy.renderLaser(world, renderStart, new Vector3(hit.hitVec), color, energy) + Electrodynamics.proxy.renderLaser(world, renderStart, new Vector3(hit.hitVec), color, energy) } return } - ResonantInduction.proxy.renderLaser(world, renderStart, maxPos, color, energy) + Electrodynamics.proxy.renderLaser(world, renderStart, maxPos, color, energy) } } diff --git a/src/main/scala/resonantinduction/electrical/laser/TileLaserEmitter.scala b/src/main/scala/edx/quantum/laser/TileLaserEmitter.scala similarity index 97% rename from src/main/scala/resonantinduction/electrical/laser/TileLaserEmitter.scala rename to src/main/scala/edx/quantum/laser/TileLaserEmitter.scala index ca2abc5ff..013209cc3 100644 --- a/src/main/scala/resonantinduction/electrical/laser/TileLaserEmitter.scala +++ b/src/main/scala/edx/quantum/laser/TileLaserEmitter.scala @@ -1,7 +1,8 @@ -package resonantinduction.electrical.laser +package edx.quantum.laser import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.block.BlockPistonBase import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase @@ -16,7 +17,6 @@ import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference /** * An emitter that shoots out lasers. diff --git a/src/main/scala/resonantinduction/electrical/laser/TileLaserReceiver.scala b/src/main/scala/edx/quantum/laser/TileLaserReceiver.scala similarity index 98% rename from src/main/scala/resonantinduction/electrical/laser/TileLaserReceiver.scala rename to src/main/scala/edx/quantum/laser/TileLaserReceiver.scala index 4283d9662..b9cca5a0c 100644 --- a/src/main/scala/resonantinduction/electrical/laser/TileLaserReceiver.scala +++ b/src/main/scala/edx/quantum/laser/TileLaserReceiver.scala @@ -1,7 +1,8 @@ -package resonantinduction.electrical.laser +package edx.quantum.laser import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import net.minecraft.block.BlockPistonBase import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase @@ -15,7 +16,6 @@ import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.render.RenderUtility import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.Reference /** * A block that receives laser light and generates a voltage. diff --git a/src/main/scala/resonantinduction/electrical/laser/focus/IFocus.java b/src/main/scala/edx/quantum/laser/focus/IFocus.java similarity index 89% rename from src/main/scala/resonantinduction/electrical/laser/focus/IFocus.java rename to src/main/scala/edx/quantum/laser/focus/IFocus.java index b8960bcab..f32f8ad61 100644 --- a/src/main/scala/resonantinduction/electrical/laser/focus/IFocus.java +++ b/src/main/scala/edx/quantum/laser/focus/IFocus.java @@ -1,4 +1,4 @@ -package resonantinduction.electrical.laser.focus; +package edx.quantum.laser.focus; import resonant.lib.transform.vector.Vector3; diff --git a/src/main/scala/resonantinduction/electrical/laser/focus/ItemFocusingMatrix.scala b/src/main/scala/edx/quantum/laser/focus/ItemFocusingMatrix.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/laser/focus/ItemFocusingMatrix.scala rename to src/main/scala/edx/quantum/laser/focus/ItemFocusingMatrix.scala index 1996aefa7..569410836 100644 --- a/src/main/scala/resonantinduction/electrical/laser/focus/ItemFocusingMatrix.scala +++ b/src/main/scala/edx/quantum/laser/focus/ItemFocusingMatrix.scala @@ -1,12 +1,12 @@ -package resonantinduction.electrical.laser.focus +package edx.quantum.laser.focus import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{EDXCreativeTab, Reference} import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.{Item, ItemStack} import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.{ChatComponentText, EnumChatFormatting} import net.minecraft.world.World -import resonantinduction.core.{RICreativeTab, Reference} import resonant.lib.transform.rotation.Quaternion import resonant.lib.transform.vector.Vector3 @@ -20,7 +20,7 @@ class ItemFocusingMatrix extends Item { setUnlocalizedName(Reference.prefix + "focusingMatrix") setTextureName(Reference.prefix + "focusingMatrix") - setCreativeTab(RICreativeTab) + setCreativeTab(EDXCreativeTab) /** * allows items to add custom lines of information to the mouseover description diff --git a/src/main/scala/resonantinduction/electrical/laser/focus/TileFocus.scala b/src/main/scala/edx/quantum/laser/focus/TileFocus.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/laser/focus/TileFocus.scala rename to src/main/scala/edx/quantum/laser/focus/TileFocus.scala index e01d43398..e4901c31d 100644 --- a/src/main/scala/resonantinduction/electrical/laser/focus/TileFocus.scala +++ b/src/main/scala/edx/quantum/laser/focus/TileFocus.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.laser.focus +package edx.quantum.laser.focus import net.minecraft.block.material.Material import net.minecraft.entity.EntityLivingBase diff --git a/src/main/scala/resonantinduction/electrical/laser/focus/TileFocusCrystal.scala b/src/main/scala/edx/quantum/laser/focus/TileFocusCrystal.scala similarity index 93% rename from src/main/scala/resonantinduction/electrical/laser/focus/TileFocusCrystal.scala rename to src/main/scala/edx/quantum/laser/focus/TileFocusCrystal.scala index 96be931e4..511190483 100644 --- a/src/main/scala/resonantinduction/electrical/laser/focus/TileFocusCrystal.scala +++ b/src/main/scala/edx/quantum/laser/focus/TileFocusCrystal.scala @@ -1,6 +1,8 @@ -package resonantinduction.electrical.laser.focus +package edx.quantum.laser.focus import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Electrodynamics, Reference} +import edx.quantum.laser.{ILaserHandler, Laser} import net.minecraft.block.material.Material import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -13,8 +15,6 @@ import org.lwjgl.opengl.GL11._ import resonant.lib.render.RenderUtility import resonant.lib.transform.rotation.Quaternion import resonant.lib.transform.vector.Vector3 -import resonantinduction.core.{Reference, ResonantInduction} -import resonantinduction.electrical.laser.{ILaserHandler, Laser} /** * Redirects lasers to one point @@ -81,7 +81,7 @@ class TileFocusCrystal extends TileFocus(Material.rock) with ILaserHandler with override def onLaserHit(renderStart: Vector3, incidentDirection: Vector3, hit: MovingObjectPosition, color: Vector3, energy: Double): Boolean = { - ResonantInduction.proxy.renderLaser(worldObj, renderStart, toVector3 + 0.5, color, energy) + Electrodynamics.proxy.renderLaser(worldObj, renderStart, toVector3 + 0.5, color, energy) this.energy += energy this.color = (this.color + color) / 2 return true diff --git a/src/main/scala/resonantinduction/electrical/laser/focus/TileMirror.scala b/src/main/scala/edx/quantum/laser/focus/TileMirror.scala similarity index 94% rename from src/main/scala/resonantinduction/electrical/laser/focus/TileMirror.scala rename to src/main/scala/edx/quantum/laser/focus/TileMirror.scala index 13d213d4e..654125131 100644 --- a/src/main/scala/resonantinduction/electrical/laser/focus/TileMirror.scala +++ b/src/main/scala/edx/quantum/laser/focus/TileMirror.scala @@ -1,7 +1,9 @@ -package resonantinduction.electrical.laser.focus +package edx.quantum.laser.focus import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Electrodynamics, Reference} +import edx.quantum.laser.{ILaserHandler, Laser} import net.minecraft.block.material.Material import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -11,8 +13,6 @@ import net.minecraft.util.{MovingObjectPosition, ResourceLocation} import net.minecraftforge.client.model.AdvancedModelLoader import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11._ -import resonantinduction.core.{Reference, ResonantInduction} -import resonantinduction.electrical.laser.{ILaserHandler, Laser} import resonant.lib.transform.rotation.Quaternion import resonant.lib.transform.vector.Vector3 @@ -89,7 +89,7 @@ class TileMirror extends TileFocus(Material.glass) with ILaserHandler with IFocu /** * Render incoming laser */ - ResonantInduction.proxy.renderLaser(worldObj, renderStart, toVector3 + 0.5, color, energy) + Electrodynamics.proxy.renderLaser(worldObj, renderStart, toVector3 + 0.5, color, energy) /** * Calculate Reflection diff --git a/src/main/scala/resonantinduction/electrical/laser/fx/EntityBlockParticleFX.scala b/src/main/scala/edx/quantum/laser/fx/EntityBlockParticleFX.scala similarity index 98% rename from src/main/scala/resonantinduction/electrical/laser/fx/EntityBlockParticleFX.scala rename to src/main/scala/edx/quantum/laser/fx/EntityBlockParticleFX.scala index 7a35f1edd..11f3b8f67 100644 --- a/src/main/scala/resonantinduction/electrical/laser/fx/EntityBlockParticleFX.scala +++ b/src/main/scala/edx/quantum/laser/fx/EntityBlockParticleFX.scala @@ -1,4 +1,4 @@ -package resonantinduction.electrical.laser.fx +package edx.quantum.laser.fx import net.minecraft.block.Block import net.minecraft.client.particle.EntityFX diff --git a/src/main/scala/resonantinduction/electrical/laser/fx/EntityLaserFX.scala b/src/main/scala/edx/quantum/laser/fx/EntityLaserFX.scala similarity index 96% rename from src/main/scala/resonantinduction/electrical/laser/fx/EntityLaserFX.scala rename to src/main/scala/edx/quantum/laser/fx/EntityLaserFX.scala index 1091ed1e4..0ba3f32ac 100644 --- a/src/main/scala/resonantinduction/electrical/laser/fx/EntityLaserFX.scala +++ b/src/main/scala/edx/quantum/laser/fx/EntityLaserFX.scala @@ -1,15 +1,15 @@ -package resonantinduction.electrical.laser.fx +package edx.quantum.laser.fx import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.electrical.ElectricalContent +import edx.quantum.laser.Laser import net.minecraft.client.particle.EntityFX import net.minecraft.client.renderer.Tessellator import net.minecraft.util.ResourceLocation import net.minecraft.world.World import org.lwjgl.opengl.GL11._ -import resonantinduction.core.Reference -import resonantinduction.electrical.ElectricalContent -import resonantinduction.electrical.laser.Laser import resonant.lib.transform.vector.Vector3 /** diff --git a/src/main/scala/resonantinduction/electrical/laser/fx/EntityScorchFX.scala b/src/main/scala/edx/quantum/laser/fx/EntityScorchFX.scala similarity index 95% rename from src/main/scala/resonantinduction/electrical/laser/fx/EntityScorchFX.scala rename to src/main/scala/edx/quantum/laser/fx/EntityScorchFX.scala index a7ba8052a..38059c15d 100644 --- a/src/main/scala/resonantinduction/electrical/laser/fx/EntityScorchFX.scala +++ b/src/main/scala/edx/quantum/laser/fx/EntityScorchFX.scala @@ -1,15 +1,15 @@ -package resonantinduction.electrical.laser.fx +package edx.quantum.laser.fx import cpw.mods.fml.client.FMLClientHandler import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.electrical.ElectricalContent import net.minecraft.client.particle.EntityFX import net.minecraft.client.renderer.Tessellator import net.minecraft.util.ResourceLocation import net.minecraft.world.World import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11._ -import resonantinduction.core.Reference -import resonantinduction.electrical.ElectricalContent import resonant.lib.transform.vector.Vector3 /** diff --git a/src/main/scala/resonantinduction/atomic/machine/TileFunnel.scala b/src/main/scala/edx/quantum/machine/TileFunnel.scala similarity index 98% rename from src/main/scala/resonantinduction/atomic/machine/TileFunnel.scala rename to src/main/scala/edx/quantum/machine/TileFunnel.scala index 6cc3920eb..da6669f52 100644 --- a/src/main/scala/resonantinduction/atomic/machine/TileFunnel.scala +++ b/src/main/scala/edx/quantum/machine/TileFunnel.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine +package edx.quantum.machine import cpw.mods.fml.relauncher.{Side, SideOnly} import net.minecraft.block.material.Material diff --git a/src/main/scala/edx/quantum/machine/accelerator/ContainerAccelerator.scala b/src/main/scala/edx/quantum/machine/accelerator/ContainerAccelerator.scala new file mode 100644 index 000000000..c74435c64 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/accelerator/ContainerAccelerator.scala @@ -0,0 +1,66 @@ +package edx.quantum.machine.accelerator + +import edx.quantum.QuantumContent +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.inventory.{IInventory, Slot, SlotFurnace} +import net.minecraft.item.ItemStack +import resonant.lib.prefab.gui.ContainerBase + +/** + * Accelerator container + */ +class ContainerAccelerator(player: EntityPlayer, tileEntity: TileAccelerator) extends ContainerBase(player, tileEntity.asInstanceOf[IInventory]) +{ + //Constructor + addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 0, 132, 26)) + addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 132, 51)) + addSlotToContainer(new SlotFurnace(player, tileEntity.asInstanceOf[IInventory], 2, 132, 75)) + addSlotToContainer(new SlotFurnace(player, tileEntity.asInstanceOf[IInventory], 3, 106, 75)) + addPlayerInventory(player) + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = + { + var var2: ItemStack = null + val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] + if (var3 != null && var3.getHasStack) + { + val itemStack: ItemStack = var3.getStack + var2 = itemStack.copy + if (par1 > 2) + { + if (itemStack.getItem eq QuantumContent.itemCell) + { + if (!this.mergeItemStack(itemStack, 1, 2, false)) + { + return null + } + } + else if (!this.mergeItemStack(itemStack, 0, 1, false)) + { + return null + } + } + else if (!this.mergeItemStack(itemStack, 3, 36 + 3, false)) + { + return null + } + if (itemStack.stackSize == 0) + { + var3.putStack(null.asInstanceOf[ItemStack]) + } + else + { + var3.onSlotChanged + } + if (itemStack.stackSize == var2.stackSize) + { + return null + } + var3.onPickupFromSlot(par1EntityPlayer, itemStack) + } + return var2 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/accelerator/EntityParticle.scala b/src/main/scala/edx/quantum/machine/accelerator/EntityParticle.scala new file mode 100644 index 000000000..76fdb4ba9 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/accelerator/EntityParticle.scala @@ -0,0 +1,300 @@ +package edx.quantum.machine.accelerator + +import java.util.List + +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData +import edx.core.{Electrodynamics, Reference} +import io.netty.buffer.ByteBuf +import net.minecraft.block.Block +import net.minecraft.entity.{Entity, EntityLiving} +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.AxisAlignedBB +import net.minecraft.world.{ChunkCoordIntPair, World} +import net.minecraftforge.common.ForgeChunkManager +import net.minecraftforge.common.ForgeChunkManager.Type +import net.minecraftforge.common.util.ForgeDirection +import resonant.api.tile.IElectromagnet +import resonant.lib.prefab.poison.PoisonRadiation +import resonant.lib.transform.vector.Vector3 + +import scala.collection.JavaConversions._ + +/** + * The particle entity used to determine the particle acceleration. + */ +object EntityParticle +{ + /** Speed by which a particle will turn into anitmatter */ + val ANITMATTER_CREATION_SPEED: Float = 0.9f + val MOVEMENT_DIRECTION_DATAWATCHER_ID: Int = 20 + + /** + * Checks to see if a new particle can be spawned at the location. + * @param world - world to check in + * @param pos - location to check + * @return true if the spawn location is clear and 2 electromagnets are next to the location + */ + def canSpawnParticle(world: World, pos: Vector3): Boolean = + { + val block: Block = pos.getBlock(world) + if (block == null || !block.isAir(world, pos.xi, pos.yi, pos.zi)) + { + var electromagnetCount = 0 + for (i <- 0 until 6) + { + val dir: ForgeDirection = ForgeDirection.getOrientation(i) + if (isElectromagnet(world, pos, dir)) + { + electromagnetCount += 1 + } + } + return electromagnetCount >= 2 + } + return false + } + + /** + * Checks to see if the block is an instance of IElectromagnet and is turned on + * @param world - world to check in + * @param position - position to look for the block/tile + * @param dir - direction to check in + * @return true if the location contains an active electromagnet block + */ + def isElectromagnet(world: World, position: Vector3, dir: ForgeDirection): Boolean = + { + val checkPos: Vector3 = position.clone.add(dir) + val tile: TileEntity = checkPos.getTileEntity(world) + if (tile.isInstanceOf[IElectromagnet]) + { + return (tile.asInstanceOf[IElectromagnet]).isRunning + } + return false + } +} + +class EntityParticle(par1World: World) extends Entity(par1World) with IEntityAdditionalSpawnData +{ + var updateTicket: ForgeChunkManager.Ticket = null + var didParticleCollide: Boolean = false + private var lastTurn: Int = 60 + private var movementVector: Vector3 = new Vector3 + private var movementDirection: ForgeDirection = ForgeDirection.NORTH + + //Constructor + this.setSize(0.3f, 0.3f) + this.renderDistanceWeight = 4f + this.ignoreFrustumCheck = true + + def this(world: World, pos: Vector3, movementVec: Vector3, dir: ForgeDirection) + { + this(world) + this.setPosition(pos.x, pos.y, pos.z) + this.movementVector = movementVec + this.movementDirection = dir + } + + override def writeSpawnData(data: ByteBuf) + { + data.writeInt(this.movementVector.xi) + data.writeInt(this.movementVector.yi) + data.writeInt(this.movementVector.zi) + data.writeInt(this.movementDirection.ordinal) + } + + override def readSpawnData(data: ByteBuf) + { + this.movementVector = new Vector3(data) + this.movementDirection = ForgeDirection.getOrientation(data.readInt) + } + + override def onUpdate + { + val t: TileEntity = this.worldObj.getTileEntity(this.movementVector.xi, this.movementVector.yi, this.movementVector.zi) + val tileEntity: TileAccelerator = if (t != null && t.isInstanceOf[TileAccelerator]) t.asInstanceOf[TileAccelerator] else null + var acceleration: Double = 0.0006f + + if (this.ticksExisted % 10 == 0) + { + this.worldObj.playSoundAtEntity(this, Reference.prefix + "accelerator", 1f, (0.6f + (0.4 * (this.getParticleVelocity / EntityParticle.ANITMATTER_CREATION_SPEED))).asInstanceOf[Float]) + } + + + + //Sanity check + if (tileEntity == null) + { + setDead + return + } + else if (tileEntity.entityParticle == null) + { + tileEntity.entityParticle = this + } + + //Force load chunks TODO calculate direction so to only load two chunks instead of 5 + for (x <- -1 to 1) + { + for (z <- -1 to 1) + { + ForgeChunkManager.forceChunk(this.updateTicket, new ChunkCoordIntPair((this.posX.asInstanceOf[Int] >> 4) + x, (this.posZ.asInstanceOf[Int] >> 4) + z)) + + } + } + + //Update data watcher + if (!this.worldObj.isRemote) + { + this.dataWatcher.updateObject(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID, this.movementDirection.ordinal.asInstanceOf[Byte]) + } + else + { + this.movementDirection = ForgeDirection.getOrientation(this.dataWatcher.getWatchableObjectByte(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID)) + } + + + if ((!EntityParticle.isElectromagnet(worldObj, new Vector3(this), movementDirection.getRotation(ForgeDirection.UP)) || !EntityParticle.isElectromagnet(worldObj, new Vector3(this), movementDirection.getRotation(ForgeDirection.DOWN))) && this.lastTurn <= 0) + { + acceleration = turn + this.motionX = 0 + this.motionY = 0 + this.motionZ = 0 + this.lastTurn = 40 + } + this.lastTurn -= 1 + if (!EntityParticle.canSpawnParticle(this.worldObj, new Vector3(this)) || this.isCollided) + { + handleCollisionWithEntity + return + } + val dongLi: Vector3 = new Vector3 + dongLi.add(this.movementDirection) + dongLi.multiply(acceleration) + this.motionX = Math.min(dongLi.x + this.motionX, EntityParticle.ANITMATTER_CREATION_SPEED) + this.motionY = Math.min(dongLi.y + this.motionY, EntityParticle.ANITMATTER_CREATION_SPEED) + this.motionZ = Math.min(dongLi.z + this.motionZ, EntityParticle.ANITMATTER_CREATION_SPEED) + this.isAirBorne = true + this.lastTickPosX = this.posX + this.lastTickPosY = this.posY + this.lastTickPosZ = this.posZ + this.moveEntity(this.motionX, this.motionY, this.motionZ) + this.setPosition(this.posX, this.posY, this.posZ) + if (this.lastTickPosX == this.posX && this.lastTickPosY == this.posY && this.lastTickPosZ == this.posZ && this.getParticleVelocity <= 0 && this.lastTurn <= 0) + { + this.setDead + } + this.worldObj.spawnParticle("portal", this.posX, this.posY, this.posZ, 0, 0, 0) + this.worldObj.spawnParticle("largesmoke", this.posX, this.posY, this.posZ, 0, 0, 0) + val radius: Float = 0.5f + + // Handle collision with entities TODO turn into a ray trace call so we know what we hit + val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) + val entitiesNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[Entity], bounds) + if (entitiesNearby.size > 1) + { + this.handleCollisionWithEntity + return + } + } + + /** + * Try to move the particle left or right depending on which side is empty. + * + * @return The new velocity. + */ + private def turn: Double = + { + //TODO rewrite to allow for up and down turning + val RELATIVE_MATRIX: Array[Array[Int]] = Array(Array(3, 2, 1, 0, 5, 4), Array(4, 5, 0, 1, 2, 3), Array(0, 1, 3, 2, 4, 5), Array(0, 1, 2, 3, 5, 4), Array(0, 1, 5, 4, 3, 2), Array(0, 1, 4, 5, 2, 3)) + val zuoFangXiang: ForgeDirection = ForgeDirection.getOrientation(RELATIVE_MATRIX(this.movementDirection.ordinal)(ForgeDirection.EAST.ordinal)) + val zuoBian: Vector3 = new Vector3(this).floor + zuoBian.add(zuoFangXiang) + val youFangXiang: ForgeDirection = ForgeDirection.getOrientation(RELATIVE_MATRIX(this.movementDirection.ordinal)(ForgeDirection.WEST.ordinal)) + val youBian: Vector3 = new Vector3(this).floor + youBian.add(youFangXiang) + if (zuoBian.getBlock(this.worldObj) == null) + { + this.movementDirection = zuoFangXiang + } + else if (youBian.getBlock(this.worldObj) == null) + { + this.movementDirection = youFangXiang + } + else + { + setDead + return 0 + } + this.setPosition(Math.floor(this.posX) + 0.5, Math.floor(this.posY) + 0.5, Math.floor(this.posZ) + 0.5) + return this.getParticleVelocity - (this.getParticleVelocity / Math.min(Math.max(70 * this.getParticleVelocity, 4), 30)) + } + + def handleCollisionWithEntity + { + this.worldObj.playSoundAtEntity(this, Reference.prefix + "antimatter", 1.5f, 1f - this.worldObj.rand.nextFloat * 0.3f) + if (!this.worldObj.isRemote) + { + if (this.getParticleVelocity > EntityParticle.ANITMATTER_CREATION_SPEED / 2) + { + val radius: Float = 1f + val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) + val entitiesNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[EntityParticle], bounds) + if (entitiesNearby.size > 0) + { + didParticleCollide = true + setDead + return + } + } + this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, this.getParticleVelocity.asInstanceOf[Float] * 2.5f, true) + } + val radius: Float = 6 + val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) + val livingNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[EntityLiving], bounds) + + for (entity <- livingNearby) + { + PoisonRadiation.INSTANCE.poisonEntity(new Vector3(entity.asInstanceOf[Entity]), entity.asInstanceOf[EntityLiving]) + } + setDead + } + + def getParticleVelocity: Double = + { + return Math.abs(this.motionX) + Math.abs(this.motionY) + Math.abs(this.motionZ) + } + + override def setDead + { + ForgeChunkManager.releaseTicket(this.updateTicket) + super.setDead + } + + override def applyEntityCollision(par1Entity: Entity) + { + this.handleCollisionWithEntity + } + + protected override def entityInit + { + this.dataWatcher.addObject(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID, 3.asInstanceOf[Byte]) + if (this.updateTicket == null) + { + this.updateTicket = ForgeChunkManager.requestTicket(Electrodynamics, this.worldObj, Type.ENTITY) + this.updateTicket.getModData + this.updateTicket.bindEntity(this) + } + } + + protected def readEntityFromNBT(nbt: NBTTagCompound) + { + this.movementVector = new Vector3(nbt.getCompoundTag("jiqi")) + ForgeDirection.getOrientation(nbt.getByte("fangXiang")) + } + + protected def writeEntityToNBT(nbt: NBTTagCompound) + { + nbt.setTag("jiqi", this.movementVector.writeNBT(new NBTTagCompound)) + nbt.setByte("fangXiang", this.movementDirection.ordinal.asInstanceOf[Byte]) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/accelerator/GuiAccelerator.scala b/src/main/scala/edx/quantum/machine/accelerator/GuiAccelerator.scala new file mode 100644 index 000000000..656aab30e --- /dev/null +++ b/src/main/scala/edx/quantum/machine/accelerator/GuiAccelerator.scala @@ -0,0 +1,55 @@ +package edx.quantum.machine.accelerator + +import edx.core.Settings +import net.minecraft.entity.player.EntityPlayer +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.transform.vector.Vector3 +import resonant.lib.utility.science.UnitDisplay + +class GuiAccelerator(player: EntityPlayer, tileEntity: TileAccelerator) extends GuiContainerBase(new ContainerAccelerator(player, tileEntity)) +{ + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(x: Int, y: Int) + { + this.fontRendererObj.drawString("Accelerator", 40, 10, 4210752) + var status: String = "" + val position: Vector3 = tileEntity.toVector3 + tileEntity.getDirection.getOpposite + if (!EntityParticle.canSpawnParticle(this.tileEntity.world, position)) + { + status = "\u00a74Fail to emit; try rotating." + } + else if (this.tileEntity.entityParticle != null && this.tileEntity.velocity > 0) + { + status = "\u00a76Accelerating" + } + else + { + status = "\u00a72Idle" + } + this.fontRendererObj.drawString("Velocity: " + Math.round((this.tileEntity.velocity / EntityParticle.ANITMATTER_CREATION_SPEED) * 100) + "%", 8, 27, 4210752) + this.fontRendererObj.drawString("Energy Used:", 8, 38, 4210752) + this.fontRendererObj.drawString(new UnitDisplay(UnitDisplay.Unit.JOULES, this.tileEntity.totalEnergyConsumed).toString, 8, 49, 4210752) + this.fontRendererObj.drawString(new UnitDisplay(UnitDisplay.Unit.WATT, Settings.ACCELERATOR_ENERGY_COST_PER_TICK * 20).toString, 8, 60, 4210752) + this.fontRendererObj.drawString("Voltage: N?A", 8, 70, 4210752) + this.fontRendererObj.drawString("Antimatter: " + this.tileEntity.antimatter + " mg", 8, 80, 4210752) + this.fontRendererObj.drawString("Status:", 8, 90, 4210752) + this.fontRendererObj.drawString(status, 8, 100, 4210752) + // this.fontRendererObj.drawString("Buffer: " + this.tileEntity.energy.getEnergy + "/" + new UnitDisplay(UnitDisplay.Unit.JOULES, this.tileEntity.energy.getEnergyCapacity, true), 8, 110, 4210752) + this.fontRendererObj.drawString("Facing: " + this.tileEntity.getDirection.getOpposite, 100, 123, 4210752) + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) + { + super.drawGuiContainerBackgroundLayer(par1, x, y) + this.drawSlot(131, 25) + this.drawSlot(131, 50) + this.drawSlot(131, 74) + this.drawSlot(105, 74) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/accelerator/RenderParticle.scala b/src/main/scala/edx/quantum/machine/accelerator/RenderParticle.scala new file mode 100644 index 000000000..0e78e7513 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/accelerator/RenderParticle.scala @@ -0,0 +1,79 @@ +package edx.quantum.machine.accelerator + +import java.util.Random + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.client.renderer.entity.Render +import net.minecraft.client.renderer.{RenderHelper, Tessellator} +import net.minecraft.entity.Entity +import net.minecraft.util.ResourceLocation +import org.lwjgl.opengl.GL11 + +@SideOnly(Side.CLIENT) class RenderParticle extends Render +{ + def doRender(entity: Entity, x: Double, y: Double, z: Double, var8: Float, var9: Float) + { + val tessellator: Tessellator = Tessellator.instance + var par2: Float = (entity.ticksExisted) + while (par2 > 200) + { + par2 -= 100 + } + RenderHelper.disableStandardItemLighting + val var41: Float = (5 + par2) / 200.0F + var var51: Float = 0.0F + if (var41 > 0.8F) + { + var51 = (var41 - 0.8F) / 0.2F + } + val rand: Random = new Random(432L) + GL11.glPushMatrix + GL11.glTranslatef(x.asInstanceOf[Float], y.asInstanceOf[Float], z.asInstanceOf[Float]) + GL11.glScalef(0.15f, 0.15f, 0.15f) + GL11.glDisable(GL11.GL_TEXTURE_2D) + GL11.glShadeModel(GL11.GL_SMOOTH) + GL11.glEnable(GL11.GL_BLEND) + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE) + GL11.glDisable(GL11.GL_ALPHA_TEST) + GL11.glEnable(GL11.GL_CULL_FACE) + GL11.glDepthMask(false) + GL11.glPushMatrix + GL11.glTranslatef(0.0F, -1.0F, -2.0F) + + for (i1 <- 0 to ((var41 + var41 * var41) / 2.0F * 60.0F).asInstanceOf[Int]) + { + GL11.glRotatef(rand.nextFloat * 360.0F, 1.0F, 0.0F, 0.0F) + GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 1.0F, 0.0F) + GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 0.0F, 1.0F) + GL11.glRotatef(rand.nextFloat * 360.0F, 1.0F, 0.0F, 0.0F) + GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 1.0F, 0.0F) + GL11.glRotatef(rand.nextFloat * 360.0F + var41 * 90.0F, 0.0F, 0.0F, 1.0F) + tessellator.startDrawing(6) + val var81: Float = rand.nextFloat * 20.0F + 5.0F + var51 * 10.0F + val var91: Float = rand.nextFloat * 2.0F + 1.0F + var51 * 2.0F + tessellator.setColorRGBA_I(16777215, (255.0F * (1.0F - var51)).asInstanceOf[Int]) + tessellator.addVertex(0.0D, 0.0D, 0.0D) + tessellator.setColorRGBA_I(0, 0) + tessellator.addVertex(-0.866D * var91, var81, -0.5F * var91) + tessellator.addVertex(0.866D * var91, var81, -0.5F * var91) + tessellator.addVertex(0.0D, var81, 1.0F * var91) + tessellator.addVertex(-0.866D * var91, var81, -0.5F * var91) + tessellator.draw + } + GL11.glPopMatrix + GL11.glDepthMask(true) + GL11.glDisable(GL11.GL_CULL_FACE) + GL11.glDisable(GL11.GL_BLEND) + GL11.glShadeModel(GL11.GL_FLAT) + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F) + GL11.glEnable(GL11.GL_TEXTURE_2D) + GL11.glEnable(GL11.GL_ALPHA_TEST) + RenderHelper.enableStandardItemLighting + GL11.glPopMatrix + } + + protected def getEntityTexture(entity: Entity): ResourceLocation = + { + return null + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/accelerator/TileAccelerator.scala b/src/main/scala/edx/quantum/machine/accelerator/TileAccelerator.scala similarity index 92% rename from src/main/scala/resonantinduction/atomic/machine/accelerator/TileAccelerator.scala rename to src/main/scala/edx/quantum/machine/accelerator/TileAccelerator.scala index d1495311d..aa8294bda 100644 --- a/src/main/scala/resonantinduction/atomic/machine/accelerator/TileAccelerator.scala +++ b/src/main/scala/edx/quantum/machine/accelerator/TileAccelerator.scala @@ -1,6 +1,9 @@ -package resonantinduction.atomic.machine.accelerator +package edx.quantum.machine.accelerator import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.{Electrodynamics, Reference, Settings} +import edx.quantum.QuantumContent +import edx.quantum.items.ItemAntimatter import io.netty.buffer.ByteBuf import net.minecraft.block.Block import net.minecraft.block.material.Material @@ -9,27 +12,20 @@ import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.IIcon import net.minecraftforge.common.util.ForgeDirection -import resonant.api.tile.{IRotatable, IElectromagnet} +import resonant.api.tile.{IElectromagnet, IRotatable} import resonant.lib.content.prefab.TEnergyStorage +import resonant.lib.grid.energy.EnergyStorage import resonant.lib.network.discriminator.{PacketTile, PacketType} import resonant.lib.network.handle.{TPacketIDReceiver, TPacketSender} -import resonant.lib.grid.energy.EnergyStorage import resonant.lib.prefab.tile.TileElectricInventory import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.BlockUtility -import resonantinduction.atomic.AtomicContent -import resonantinduction.atomic.items.ItemAntimatter -import resonantinduction.core.{Reference, ResonantInduction, Settings} import scala.collection.JavaConversions._ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectromagnet with IRotatable with TPacketIDReceiver with TPacketSender with TEnergyStorage { final val DESC_PACKET_ID = 2; - /** - * Multiplier that is used to give extra anti-matter based on density (hardness) of a given ore. - */ - private var antiMatterDensityMultiplyer: Int = Settings.ACCELERATOR_ANITMATTER_DENSITY_MULTIPLIER /** * The total amount of energy consumed by this particle. In Joules. */ @@ -42,6 +38,10 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro var velocity: Float = 0 var clientEnergy: Double = 0 var lastSpawnTick: Int = 0 + /** + * Multiplier that is used to give extra anti-matter based on density (hardness) of a given ore. + */ + private var antiMatterDensityMultiplyer: Int = Settings.ACCELERATOR_ANITMATTER_DENSITY_MULTIPLIER //Constructor this.setSizeInventory(4) @@ -91,7 +91,7 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro { if (worldObj.rand.nextFloat <= Settings.darkMatterSpawnChance) { - incrStackSize(3, new ItemStack(AtomicContent.itemDarkMatter)) + incrStackSize(3, new ItemStack(QuantumContent.itemDarkMatter)) } } entityParticle = null @@ -149,7 +149,7 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro def outputAntimatter() { //Do we have an empty cell in slot one - if (AtomicContent.isItemStackEmptyCell(getStackInSlot(1)) && getStackInSlot(1).stackSize > 0) + if (QuantumContent.isItemStackEmptyCell(getStackInSlot(1)) && getStackInSlot(1).stackSize > 0) { // Each cell can only hold 125mg of antimatter TODO maybe a config for this? if (antimatter >= 125) @@ -157,7 +157,7 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro if (getStackInSlot(2) != null) { // If the output slot is not empty we must increase stack size - if (getStackInSlot(2).getItem == AtomicContent.itemAntimatter) + if (getStackInSlot(2).getItem == QuantumContent.itemAntimatter) { val newStack: ItemStack = getStackInSlot(2).copy if (newStack.stackSize < newStack.getMaxStackSize) @@ -174,18 +174,12 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro //Output to slot 2 and decrease volume of antimatter antimatter -= 125 decrStackSize(1, 1) - setInventorySlotContents(2, new ItemStack(AtomicContent.itemAntimatter)) + setInventorySlotContents(2, new ItemStack(QuantumContent.itemAntimatter)) } } } } - override def activate(player: EntityPlayer, side: Int, hit: Vector3): Boolean = - { - player.openGui(ResonantInduction, 0, world, xi, yi, zi) - return true - } - private def CalculateParticleDensity { val itemToAccelerate: ItemStack = this.getStackInSlot(0) @@ -209,10 +203,48 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro } } + override def getDescPacket: PacketTile = + { + return new PacketTile(xi, yi, zi, Array[Any](DESC_PACKET_ID, velocity, totalEnergyConsumed, antimatter, energy.getEnergy)) + } + ///////////////////////////////////////// /// Packet Handling /// //////////////////////////////////////// + override def getDirection: ForgeDirection = + { + return ForgeDirection.getOrientation(getBlockMetadata) + } + + override def setDirection(direction: ForgeDirection) + { + world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal, 3) + } + + ///////////////////////////////////////// + /// Save handling /// + //////////////////////////////////////// + + /** get velocity for the particle and @return it as a float */ + def getParticleVel(): Float = + { + if (entityParticle != null) + return entityParticle.getParticleVelocity.asInstanceOf[Float] + else + return 0 + } + + override def activate(player: EntityPlayer, side: Int, hit: Vector3): Boolean = + { + player.openGui(Electrodynamics, 0, world, xi, yi, zi) + return true + } + + ///////////////////////////////////////// + /// Inventory Overrides /// + //////////////////////////////////////// + override def read(buf: ByteBuf, id: Int, player: EntityPlayer, packet: PacketType): Boolean = { //Client only packets @@ -231,15 +263,6 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro return true } - override def getDescPacket: PacketTile = - { - return new PacketTile(xi, yi, zi, Array[Any](DESC_PACKET_ID, velocity, totalEnergyConsumed, antimatter, energy.getEnergy)) - } - - ///////////////////////////////////////// - /// Save handling /// - //////////////////////////////////////// - override def readFromNBT(par1NBTTagCompound: NBTTagCompound) { super.readFromNBT(par1NBTTagCompound) @@ -255,7 +278,7 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro } ///////////////////////////////////////// - /// Inventory Overrides /// + /// Field Getters & Setters /// //////////////////////////////////////// override def canInsertItem(slotID: Int, itemStack: ItemStack, j: Int): Boolean = @@ -263,11 +286,6 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro return isItemValidForSlot(slotID, itemStack) && slotID != 2 && slotID != 3 } - override def canExtractItem(slotID: Int, itemstack: ItemStack, j: Int): Boolean = - { - return slotID == 2 || slotID == 3 - } - override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean = { i match @@ -275,7 +293,7 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro case 0 => return true case 1 => - return AtomicContent.isItemStackEmptyCell(itemStack) + return QuantumContent.isItemStackEmptyCell(itemStack) case 2 => return itemStack.getItem.isInstanceOf[ItemAntimatter] case 3 => @@ -284,40 +302,22 @@ class TileAccelerator extends TileElectricInventory(Material.iron) with IElectro return false } - ///////////////////////////////////////// - /// Field Getters & Setters /// - //////////////////////////////////////// + override def canExtractItem(slotID: Int, itemstack: ItemStack, j: Int): Boolean = + { + return slotID == 2 || slotID == 3 + } override def isRunning: Boolean = { return true } - override def getDirection: ForgeDirection = - { - return ForgeDirection.getOrientation(getBlockMetadata) - } - - override def setDirection(direction: ForgeDirection) - { - world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal, 3) - } - - /** get velocity for the particle and @return it as a float */ - def getParticleVel(): Float = - { - if (entityParticle != null) - return entityParticle.getParticleVelocity.asInstanceOf[Float] - else - return 0 - } - @SideOnly(Side.CLIENT) override def getIcon(side: Int, meta: Int): IIcon = { if (side == getDirection.getOpposite.ordinal()) { - return AtomicContent.blockElectromagnet.getIcon(side, meta) + return QuantumContent.blockElectromagnet.getIcon(side, meta) } return getIcon } diff --git a/src/main/scala/edx/quantum/machine/boiler/ContainerNuclearBoiler.scala b/src/main/scala/edx/quantum/machine/boiler/ContainerNuclearBoiler.scala new file mode 100644 index 000000000..011e3bd3b --- /dev/null +++ b/src/main/scala/edx/quantum/machine/boiler/ContainerNuclearBoiler.scala @@ -0,0 +1,99 @@ +package edx.quantum.machine.boiler + +import edx.quantum.QuantumContent +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.inventory.{IInventory, Slot} +import net.minecraft.item.ItemStack +import net.minecraftforge.fluids.FluidContainerRegistry +import resonant.lib.prefab.gui.ContainerBase +import resonant.lib.prefab.gui.slot.{SlotEnergyItem, SlotSpecific} + +/** + * Nuclear boiler container + */ +object ContainerNuclearBoiler +{ + private final val slotCount: Int = 4 +} + +class ContainerNuclearBoiler(player: EntityPlayer, tileEntity: TileNuclearBoiler) extends ContainerBase(player, tileEntity.asInstanceOf[IInventory]) +{ + //Constructor + this.addSlotToContainer(new SlotEnergyItem(tileEntity.asInstanceOf[IInventory], 0, 56, 26)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 25, 50)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 2, 136, 50)) + this.addSlotToContainer(new SlotSpecific(tileEntity.asInstanceOf[IInventory], 3, 81, 26, new ItemStack(QuantumContent.itemYellowCake), new ItemStack(QuantumContent.blockUraniumOre))) + this.addPlayerInventory(player) + + override def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = + { + return this.tileEntity.isUseableByPlayer(par1EntityPlayer) + } + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + override def transferStackInSlot(par1EntityPlayer: EntityPlayer, slotID: Int): ItemStack = + { + var var2: ItemStack = null + val slot: Slot = this.inventorySlots.get(slotID).asInstanceOf[Slot] + if (slot != null && slot.getHasStack) + { + val itemStack: ItemStack = slot.getStack + var2 = itemStack.copy + if (slotID >= slotCount) + { + if (this.getSlot(0).isItemValid(itemStack)) + { + if (!this.mergeItemStack(itemStack, 0, 1, false)) + { + return null + } + } + else if (QuantumContent.FLUIDSTACK_WATER.isFluidEqual(FluidContainerRegistry.getFluidForFilledItem(itemStack))) + { + if (!this.mergeItemStack(itemStack, 1, 2, false)) + { + return null + } + } + else if (this.getSlot(3).isItemValid(itemStack)) + { + if (!this.mergeItemStack(itemStack, 3, 4, false)) + { + return null + } + } + else if (slotID < 27 + slotCount) + { + if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) + { + return null + } + } + else if (slotID >= 27 + slotCount && slotID < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) + { + return null + } + } + else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) + { + return null + } + if (itemStack.stackSize == 0) + { + slot.putStack(null.asInstanceOf[ItemStack]) + } + else + { + slot.onSlotChanged + } + if (itemStack.stackSize == var2.stackSize) + { + return null + } + slot.onPickupFromSlot(par1EntityPlayer, itemStack) + } + return var2 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/boiler/GuiNuclearBoiler.scala b/src/main/scala/edx/quantum/machine/boiler/GuiNuclearBoiler.scala new file mode 100644 index 000000000..10727df5c --- /dev/null +++ b/src/main/scala/edx/quantum/machine/boiler/GuiNuclearBoiler.scala @@ -0,0 +1,49 @@ +package edx.quantum.machine.boiler + +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.util.StatCollector +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.prefab.gui.GuiContainerBase.SlotType +import resonant.lib.utility.science.UnitDisplay + +class GuiNuclearBoiler(player: EntityPlayer, tileEntity: TileNuclearBoiler) extends GuiContainerBase(new ContainerNuclearBoiler(player, tileEntity)) +{ + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) + { + this.fontRendererObj.drawString("Boiler", 52, 6, 4210752) + this.renderUniversalDisplay(8, 112, TileNuclearBoiler.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) + //this.renderUniversalDisplay(110, 112, tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) + this.fontRendererObj.drawString("The nuclear boiler can boil", 8, 75, 4210752) + this.fontRendererObj.drawString("yellow cake into uranium", 8, 85, 4210752) + this.fontRendererObj.drawString("hexafluoride gas to be refined.", 8, 95, 4210752) + this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) + + //if (this.isPointInRegion(8, 18, this.meterWidth, this.meterHeight, mouseX, mouseY) && this.tileEntity.waterTank.getFluid() != null) + //{ + // this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop + 10, this.tileEntity.waterTank.getFluid().getFluid().getLocalizedName(), this.tileEntity.waterTank.getFluid().amount + " L"); + //} + //else if (this.isPointInRegion(155, 18, this.meterWidth, this.meterHeight, mouseX, mouseY) && this.tileEntity.gasTank.getFluid() != null) + //{ + // this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop + 10, this.tileEntity.gasTank.getFluid().getFluid().getLocalizedName(), this.tileEntity.gasTank.getFluid().amount + " L"); + //} + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) + { + super.drawGuiContainerBackgroundLayer(par1, x, y) + this.drawSlot(55, 25, SlotType.BATTERY) + this.drawSlot(80, 25) + this.drawBar(110, 26, this.tileEntity.timer.asInstanceOf[Float] / this.tileEntity.SHI_JIAN.asInstanceOf[Float]) + this.drawMeter(8, 18, this.tileEntity.waterTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.waterTank.getCapacity.asInstanceOf[Float], this.tileEntity.waterTank.getFluid) + this.drawSlot(24, 49, SlotType.LIQUID) + this.drawMeter(155, 18, this.tileEntity.gasTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.gasTank.getCapacity.asInstanceOf[Float], this.tileEntity.gasTank.getFluid) + this.drawSlot(135, 49, SlotType.GAS) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/boiler/RenderNuclearBoiler.scala b/src/main/scala/edx/quantum/machine/boiler/RenderNuclearBoiler.scala new file mode 100644 index 000000000..4ab9e6818 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/boiler/RenderNuclearBoiler.scala @@ -0,0 +1,48 @@ +package edx.quantum.machine.boiler + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility +import resonant.lib.render.model.FixedTechneModel + +@SideOnly(Side.CLIENT) object RenderNuclearBoiler +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "nuclearBoiler.tcn")) + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "nuclearBoiler.png") +} + +@SideOnly(Side.CLIENT) class RenderNuclearBoiler extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) + { + this.renderAModelAt(tileEntity.asInstanceOf[TileNuclearBoiler], var2, var4, var6, var8) + } + + def renderAModelAt(tileEntity: TileNuclearBoiler, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + GL11.glRotatef(90, 0, 1, 0) + if (tileEntity.world != null) + { + RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) + } + bindTexture(RenderNuclearBoiler.TEXTURE) + if (RenderNuclearBoiler.MODEL.isInstanceOf[FixedTechneModel]) + { + (RenderNuclearBoiler.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(Math.toDegrees(tileEntity.rotation), 0, 1, 0, "FUEL BAR SUPPORT 1 ROTATES", "FUEL BAR 1 ROTATES") + (RenderNuclearBoiler.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(-Math.toDegrees(tileEntity.rotation), 0, 1, 0, "FUEL BAR SUPPORT 2 ROTATES", "FUEL BAR 2 ROTATES") + RenderNuclearBoiler.MODEL.renderAllExcept("FUEL BAR SUPPORT 1 ROTATES", "FUEL BAR SUPPORT 2 ROTATES", "FUEL BAR 1 ROTATES", "FUEL BAR 2 ROTATES") + } + else + { + RenderNuclearBoiler.MODEL.renderAll + } + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/boiler/TileNuclearBoiler.scala b/src/main/scala/edx/quantum/machine/boiler/TileNuclearBoiler.scala similarity index 80% rename from src/main/scala/resonantinduction/atomic/machine/boiler/TileNuclearBoiler.scala rename to src/main/scala/edx/quantum/machine/boiler/TileNuclearBoiler.scala index ff82607fe..85abee446 100644 --- a/src/main/scala/resonantinduction/atomic/machine/boiler/TileNuclearBoiler.scala +++ b/src/main/scala/edx/quantum/machine/boiler/TileNuclearBoiler.scala @@ -1,5 +1,7 @@ -package resonantinduction.atomic.machine.boiler +package edx.quantum.machine.boiler +import edx.core.Settings +import edx.quantum.QuantumContent import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer @@ -17,8 +19,6 @@ import resonant.lib.network.handle.IPacketReceiver import resonant.lib.prefab.tile.TileElectricInventory import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.Settings /** * Nuclear boiler TileEntity @@ -33,10 +33,10 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke final val SHI_JIAN: Int = 20 * 15 @Synced - final val waterTank: FluidTank = new FluidTank(AtomicContent.FLUIDSTACK_WATER.copy, FluidContainerRegistry.BUCKET_VOLUME * 5) + final val waterTank: FluidTank = new FluidTank(QuantumContent.FLUIDSTACK_WATER.copy, FluidContainerRegistry.BUCKET_VOLUME * 5) @Synced - final val gasTank: FluidTank = new FluidTank(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy, FluidContainerRegistry.BUCKET_VOLUME * 5) + final val gasTank: FluidTank = new FluidTank(QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy, FluidContainerRegistry.BUCKET_VOLUME * 5) @Synced var timer: Int = 0 @@ -65,7 +65,7 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke if (FluidContainerRegistry.isFilledContainer(getStackInSlot(1))) { val liquid: FluidStack = FluidContainerRegistry.getFluidForFilledItem(getStackInSlot(1)) - if (liquid.isFluidEqual(AtomicContent.FLUIDSTACK_WATER)) + if (liquid.isFluidEqual(QuantumContent.FLUIDSTACK_WATER)) { if (this.fill(ForgeDirection.UNKNOWN, liquid, false) > 0) { @@ -134,7 +134,7 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke if (this.nengYong) { this.waterTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true) - val liquid: FluidStack = AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy + val liquid: FluidStack = QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.copy liquid.amount = Settings.uraniumHexaflourideRatio * 2 this.gasTank.fill(liquid, true) this.decrStackSize(3, 1) @@ -149,9 +149,9 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke { if (getStackInSlot(3) != null) { - if (AtomicContent.itemYellowCake == getStackInSlot(3).getItem || AtomicContent.isItemStackUraniumOre(getStackInSlot(3))) + if (QuantumContent.itemYellowCake == getStackInSlot(3).getItem || QuantumContent.isItemStackUraniumOre(getStackInSlot(3))) { - if (AtomicContent.getFluidAmount(this.gasTank.getFluid) < this.gasTank.getCapacity) + if (QuantumContent.getFluidAmount(this.gasTank.getFluid) < this.gasTank.getCapacity) { return true } @@ -167,7 +167,7 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke */ def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = { - if (AtomicContent.FLUIDSTACK_WATER.isFluidEqual(resource)) + if (QuantumContent.FLUIDSTACK_WATER.isFluidEqual(resource)) { return this.waterTank.fill(resource, doFill) } @@ -176,8 +176,8 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) { - this.waterTank.setFluid(new FluidStack(AtomicContent.FLUIDSTACK_WATER.fluidID, data.readInt)) - this.gasTank.setFluid(new FluidStack(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID, data.readInt)) + this.waterTank.setFluid(new FluidStack(QuantumContent.FLUIDSTACK_WATER.fluidID, data.readInt)) + this.gasTank.setFluid(new FluidStack(QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID, data.readInt)) this.timer = data.readInt } @@ -188,12 +188,12 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke override def getDescPacket: PacketTile = { - return new PacketTile(xi, yi, zi, Array[Any](this.timer, AtomicContent.getFluidAmount(this.waterTank.getFluid), AtomicContent.getFluidAmount(this.gasTank.getFluid))) + return new PacketTile(xi, yi, zi, Array[Any](this.timer, QuantumContent.getFluidAmount(this.waterTank.getFluid), QuantumContent.getFluidAmount(this.gasTank.getFluid))) } override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { - openGui(player, AtomicContent) + openGui(player, QuantumContent) return true } @@ -233,7 +233,7 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = { - if (AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.isFluidEqual(resource)) + if (QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.isFluidEqual(resource)) { return this.gasTank.drain(resource.amount, doDrain) } @@ -247,12 +247,12 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke def canFill(from: ForgeDirection, fluid: Fluid): Boolean = { - return AtomicContent.FLUIDSTACK_WATER.fluidID == fluid.getID + return QuantumContent.FLUIDSTACK_WATER.fluidID == fluid.getID } def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = { - return AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID == fluid.getID + return QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID == fluid.getID } def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = @@ -277,11 +277,11 @@ class TileNuclearBoiler extends TileElectricInventory(Material.iron) with IPacke { if (slotID == 1) { - return AtomicContent.isItemStackWaterCell(itemStack) + return QuantumContent.isItemStackWaterCell(itemStack) } else if (slotID == 3) { - return itemStack.getItem eq AtomicContent.itemYellowCake + return itemStack.getItem eq QuantumContent.itemYellowCake } return false } diff --git a/src/main/scala/edx/quantum/machine/centrifuge/ContainerCentrifuge.scala b/src/main/scala/edx/quantum/machine/centrifuge/ContainerCentrifuge.scala new file mode 100644 index 000000000..b499b39e1 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/centrifuge/ContainerCentrifuge.scala @@ -0,0 +1,95 @@ +package edx.quantum.machine.centrifuge + +import edx.quantum.QuantumContent +import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} +import net.minecraft.inventory.{IInventory, Slot, SlotFurnace} +import net.minecraft.item.ItemStack +import resonant.lib.prefab.gui.ContainerBase +import resonant.lib.prefab.gui.slot.SlotEnergyItem + +class ContainerCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends ContainerBase(tileEntity) +{ + //Constructor + this.addSlotToContainer(new SlotEnergyItem(tileEntity.asInstanceOf[IInventory], 0, 131, 26)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 25, 50)) + this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 2, 81, 26)) + this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 3, 101, 26)) + this.addPlayerInventory(par1InventoryPlayer.player) + + override def onContainerClosed(entityplayer: EntityPlayer) + { + super.onContainerClosed(entityplayer) + } + + override def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = + { + return this.tileEntity.isUseableByPlayer(par1EntityPlayer) + } + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = + { + var var2: ItemStack = null + val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] + if (var3 != null && var3.getHasStack) + { + val itemStack: ItemStack = var3.getStack + var2 = itemStack.copy + if (par1 >= slotCount) + { + if (this.getSlot(0).isItemValid(itemStack)) + { + if (!this.mergeItemStack(itemStack, 0, 1, false)) + { + return null + } + } + else if (QuantumContent.isItemStackUraniumOre(itemStack)) + { + if (!this.mergeItemStack(itemStack, 1, 2, false)) + { + return null + } + } + else if (QuantumContent.isItemStackEmptyCell(itemStack)) + { + if (!this.mergeItemStack(itemStack, 3, 4, false)) + { + return null + } + } + else if (par1 < 27 + slotCount) + { + if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) + { + return null + } + } + else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) + { + return null + } + } + else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) + { + return null + } + if (itemStack.stackSize == 0) + { + var3.putStack(null.asInstanceOf[ItemStack]) + } + else + { + var3.onSlotChanged + } + if (itemStack.stackSize == var2.stackSize) + { + return null + } + var3.onPickupFromSlot(par1EntityPlayer, itemStack) + } + return var2 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/centrifuge/GuiCentrifuge.scala b/src/main/scala/edx/quantum/machine/centrifuge/GuiCentrifuge.scala new file mode 100644 index 000000000..fc66ebd66 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/centrifuge/GuiCentrifuge.scala @@ -0,0 +1,52 @@ +package edx.quantum.machine.centrifuge + +import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.util.StatCollector +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.prefab.gui.GuiContainerBase.SlotType +import resonant.lib.utility.science.UnitDisplay + +class GuiCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends GuiContainerBase(new ContainerCentrifuge(par1InventoryPlayer, tileEntity)) +{ + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) + { + this.fontRendererObj.drawString("Centrifuge", 60, 6, 4210752) + var displayText: String = "" + if (this.tileEntity.timer > 0) + { + displayText = "Processing" + } + else if (this.tileEntity.nengYong) + { + displayText = "Ready" + } + else + { + displayText = "Idle" + } + this.fontRendererObj.drawString("Status: " + displayText, 70, 50, 4210752) + this.renderUniversalDisplay(8, 112, TileCentrifuge.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) + this.renderUniversalDisplay(100, 112, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) + this.fontRendererObj.drawString("The centrifuge spins", 8, 75, 4210752) + this.fontRendererObj.drawString("uranium hexafluoride gas into", 8, 85, 4210752) + this.fontRendererObj.drawString("enriched uranium for fission.", 8, 95, 4210752) + this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) + { + super.drawGuiContainerBackgroundLayer(par1, x, y) + this.drawSlot(80, 25) + this.drawSlot(100, 25) + this.drawSlot(130, 25, SlotType.BATTERY) + this.drawBar(40, 26, this.tileEntity.timer.asInstanceOf[Float] / TileCentrifuge.SHI_JIAN.asInstanceOf[Float]) + this.drawMeter(8, 18, this.tileEntity.gasTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.gasTank.getCapacity.asInstanceOf[Float], this.tileEntity.gasTank.getFluid) + this.drawSlot(24, 49, SlotType.GAS) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/centrifuge/RenderCentrifuge.scala b/src/main/scala/edx/quantum/machine/centrifuge/RenderCentrifuge.scala new file mode 100644 index 000000000..e38bb4441 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/centrifuge/RenderCentrifuge.scala @@ -0,0 +1,42 @@ +package edx.quantum.machine.centrifuge + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility + +@SideOnly(Side.CLIENT) object RenderCentrifuge +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.tcn")) + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.png") +} + +@SideOnly(Side.CLIENT) +class RenderCentrifuge extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) + { + this.render(tileEntity.asInstanceOf[TileCentrifuge], var2, var4, var6, var8) + } + + def render(tileEntity: TileCentrifuge, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + if (tileEntity.getWorldObj != null) + { + RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) + } + bindTexture(RenderCentrifuge.TEXTURE) + GL11.glPushMatrix + GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0) + RenderCentrifuge.MODEL.renderOnly("C", "JROT", "KROT", "LROT", "MROT") + GL11.glPopMatrix + RenderCentrifuge.MODEL.renderAllExcept("C", "JROT", "KROT", "LROT", "MROT") + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/centrifuge/TileCentrifuge.scala b/src/main/scala/edx/quantum/machine/centrifuge/TileCentrifuge.scala similarity index 83% rename from src/main/scala/resonantinduction/atomic/machine/centrifuge/TileCentrifuge.scala rename to src/main/scala/edx/quantum/machine/centrifuge/TileCentrifuge.scala index 78faa2a4d..be3e570ce 100644 --- a/src/main/scala/resonantinduction/atomic/machine/centrifuge/TileCentrifuge.scala +++ b/src/main/scala/edx/quantum/machine/centrifuge/TileCentrifuge.scala @@ -1,5 +1,7 @@ -package resonantinduction.atomic.machine.centrifuge +package edx.quantum.machine.centrifuge +import edx.core.Settings +import edx.quantum.QuantumContent import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer @@ -17,8 +19,6 @@ import resonant.lib.network.handle.IPacketReceiver import resonant.lib.prefab.tile.TileElectricInventory import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.Settings /** * Centrifuge TileEntity @@ -62,8 +62,8 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe val fluidHandler: IFluidHandler = (tileEntity.asInstanceOf[IFluidHandler]) if (fluidHandler != null) { - val requestFluid: FluidStack = AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE - requestFluid.amount = this.gasTank.getCapacity - AtomicContent.getFluidAmount(this.gasTank.getFluid) + val requestFluid: FluidStack = QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE + requestFluid.amount = this.gasTank.getCapacity - QuantumContent.getFluidAmount(this.gasTank.getFluid) val receiveFluid: FluidStack = fluidHandler.drain(direction.getOpposite, requestFluid, true) if (receiveFluid != null) { @@ -124,11 +124,11 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe this.gasTank.drain(Settings.uraniumHexaflourideRatio, true) if (this.worldObj.rand.nextFloat > 0.6) { - this.incrStackSize(2, new ItemStack(AtomicContent.itemUranium)) + this.incrStackSize(2, new ItemStack(QuantumContent.itemUranium)) } else { - this.incrStackSize(3, new ItemStack(AtomicContent.itemUranium, 1, 1)) + this.incrStackSize(3, new ItemStack(QuantumContent.itemUranium, 1, 1)) } } } @@ -142,44 +142,28 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe { if (this.gasTank.getFluid.amount >= Settings.uraniumHexaflourideRatio) { - return isItemValidForSlot(2, new ItemStack(AtomicContent.itemUranium)) && isItemValidForSlot(3, new ItemStack(AtomicContent.itemUranium, 1, 1)) + return isItemValidForSlot(2, new ItemStack(QuantumContent.itemUranium)) && isItemValidForSlot(3, new ItemStack(QuantumContent.itemUranium, 1, 1)) } } return false } - override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean = - { - i match - { - case 0 => - return Compatibility.isHandler(itemStack.getItem, null) - case 1 => - return true - case 2 => - return itemStack.getItem eq AtomicContent.itemUranium - case 3 => - return itemStack.getItem eq AtomicContent.itemUranium - } - return false - } - override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { - openGui(player, AtomicContent) + openGui(player, QuantumContent) return true } def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) { this.timer = data.readInt - this.gasTank.setFluid(new FluidStack(AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID, data.readInt)) + this.gasTank.setFluid(new FluidStack(QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID, data.readInt)) } override def getDescPacket: PacketTile = { - return new PacketTile(xi, yi, zi, Array[Any](this.timer, AtomicContent.getFluidAmount(this.gasTank.getFluid))) + return new PacketTile(xi, yi, zi, Array[Any](this.timer, QuantumContent.getFluidAmount(this.gasTank.getFluid))) } /** @@ -213,7 +197,7 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe */ def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = { - if (AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.isFluidEqual(resource)) + if (QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.isFluidEqual(resource)) { return this.gasTank.fill(resource, doFill) } @@ -232,7 +216,7 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe def canFill(from: ForgeDirection, fluid: Fluid): Boolean = { - return AtomicContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID == fluid.getID + return QuantumContent.FLUIDSTACK_URANIUM_HEXAFLOURIDE.fluidID == fluid.getID } def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = @@ -258,6 +242,22 @@ class TileCentrifuge extends TileElectricInventory(Material.iron) with IPacketRe return slotID == 1 && this.isItemValidForSlot(slotID, itemStack) } + override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean = + { + i match + { + case 0 => + return Compatibility.isHandler(itemStack.getItem, null) + case 1 => + return true + case 2 => + return itemStack.getItem eq QuantumContent.itemUranium + case 3 => + return itemStack.getItem eq QuantumContent.itemUranium + } + return false + } + override def canExtractItem(slotID: Int, itemstack: ItemStack, j: Int): Boolean = { return slotID == 2 || slotID == 3 diff --git a/src/main/scala/edx/quantum/machine/extractor/ContainerChemicalExtractor.scala b/src/main/scala/edx/quantum/machine/extractor/ContainerChemicalExtractor.scala new file mode 100644 index 000000000..376b84474 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/extractor/ContainerChemicalExtractor.scala @@ -0,0 +1,28 @@ +package edx.quantum.machine.extractor + +import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.inventory.{Slot, SlotFurnace} +import resonant.lib.prefab.gui.ContainerBase +import resonant.lib.prefab.gui.slot.SlotEnergyItem + +/** + * Chemical extractor container + */ +object ContainerChemicalExtractor +{ + private final val slotCount: Int = 5 +} + +class ContainerChemicalExtractor(par1InventoryPlayer: InventoryPlayer, tileEntity: TileChemicalExtractor) extends ContainerBase(tileEntity) +{ + //Constructor + addSlotToContainer(new SlotEnergyItem(tileEntity, 0, 80, 50)) + addSlotToContainer(new Slot(tileEntity, 1, 53, 25)) + addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity, 2, 107, 25)) + addSlotToContainer(new Slot(tileEntity, 3, 25, 19)) + addSlotToContainer(new Slot(tileEntity, 4, 25, 50)) + addSlotToContainer(new Slot(tileEntity, 5, 135, 19)) + addSlotToContainer(new Slot(tileEntity, 6, 135, 50)) + addPlayerInventory(par1InventoryPlayer.player) + +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/extractor/GuiChemicalExtractor.scala b/src/main/scala/edx/quantum/machine/extractor/GuiChemicalExtractor.scala new file mode 100644 index 000000000..ac80d73db --- /dev/null +++ b/src/main/scala/edx/quantum/machine/extractor/GuiChemicalExtractor.scala @@ -0,0 +1,42 @@ +package edx.quantum.machine.extractor + +import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.util.StatCollector +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.prefab.gui.GuiContainerBase.SlotType +import resonant.lib.utility.science.UnitDisplay + +class GuiChemicalExtractor(par1InventoryPlayer: InventoryPlayer, tileEntity: TileChemicalExtractor) extends GuiContainerBase(new ContainerChemicalExtractor(par1InventoryPlayer, tileEntity)) +{ + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) + { + this.fontRendererObj.drawString("Chemical Extractor", 45, 6, 4210752) + this.renderUniversalDisplay(8, 112, TileChemicalExtractor.ENERGY * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) + this.renderUniversalDisplay(100, 112, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) + this.fontRendererObj.drawString("The extractor can extract", 8, 75, 4210752) + this.fontRendererObj.drawString("uranium, deuterium and tritium.", 8, 85, 4210752) + this.fontRendererObj.drawString("Place them in the input slot.", 8, 95, 4210752) + this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) + { + super.drawGuiContainerBackgroundLayer(par1, x, y) + drawSlot(79, 49, SlotType.BATTERY) + drawSlot(52, 24) + drawSlot(106, 24) + drawBar(75, 24, tileEntity.time.asInstanceOf[Float] / TileChemicalExtractor.TICK_TIME.asInstanceOf[Float]) + drawMeter(8, 18, tileEntity.inputTank.getFluidAmount.asInstanceOf[Float] / tileEntity.inputTank.getCapacity.asInstanceOf[Float], tileEntity.inputTank.getFluid) + drawSlot(24, 18, SlotType.LIQUID) + drawSlot(24, 49, SlotType.LIQUID) + drawMeter(154, 18, tileEntity.outputTank.getFluidAmount.asInstanceOf[Float] / tileEntity.outputTank.getCapacity.asInstanceOf[Float], tileEntity.outputTank.getFluid) + drawSlot(134, 18, SlotType.LIQUID) + drawSlot(134, 49, SlotType.LIQUID) + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/extractor/RenderChemicalExtractor.scala b/src/main/scala/edx/quantum/machine/extractor/RenderChemicalExtractor.scala new file mode 100644 index 000000000..64e460ca4 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/extractor/RenderChemicalExtractor.scala @@ -0,0 +1,48 @@ +package edx.quantum.machine.extractor + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility +import resonant.lib.render.model.FixedTechneModel + +@SideOnly(Side.CLIENT) object RenderChemicalExtractor +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "chemicalExtractor.tcn")) + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "chemicalExtractor.png") +} + +@SideOnly(Side.CLIENT) class RenderChemicalExtractor extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) + { + this.render(tileEntity.asInstanceOf[TileChemicalExtractor], var2, var4, var6, var8) + } + + def render(tileEntity: TileChemicalExtractor, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + if (tileEntity.getWorldObj != null) + { + RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) + } + bindTexture(RenderChemicalExtractor.TEXTURE) + if (RenderChemicalExtractor.MODEL.isInstanceOf[FixedTechneModel]) + { + GL11.glPushMatrix + (RenderChemicalExtractor.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(Math.toDegrees(tileEntity.rotation), 0, 0, 1, "MAIN CHAMBER-ROTATES", "MAGNET 1-ROTATES", "MAGNET 2-ROTATES") + GL11.glPopMatrix + RenderChemicalExtractor.MODEL.renderAllExcept("MAIN CHAMBER-ROTATES", "MAGNET 1-ROTATES", "MAGNET 2-ROTATES") + } + else + { + RenderChemicalExtractor.MODEL.renderAll + } + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/extractor/TileChemicalExtractor.scala b/src/main/scala/edx/quantum/machine/extractor/TileChemicalExtractor.scala similarity index 81% rename from src/main/scala/resonantinduction/atomic/machine/extractor/TileChemicalExtractor.scala rename to src/main/scala/edx/quantum/machine/extractor/TileChemicalExtractor.scala index 8953e6280..0681547b3 100644 --- a/src/main/scala/resonantinduction/atomic/machine/extractor/TileChemicalExtractor.scala +++ b/src/main/scala/edx/quantum/machine/extractor/TileChemicalExtractor.scala @@ -1,5 +1,7 @@ -package resonantinduction.atomic.machine.extractor +package edx.quantum.machine.extractor +import edx.core.Settings +import edx.quantum.QuantumContent import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack @@ -15,8 +17,6 @@ import resonant.lib.network.Synced import resonant.lib.network.discriminator.PacketAnnotation import resonant.lib.prefab.tile.traits.TRotatable import resonant.lib.transform.vector.Vector3 -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.Settings /** * Chemical extractor TileEntity @@ -105,7 +105,7 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { - openGui(player, AtomicContent) + openGui(player, QuantumContent) return true } @@ -113,25 +113,25 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle { if (inputTank.getFluid != null) { - if (inputTank.getFluid.amount >= FluidContainerRegistry.BUCKET_VOLUME && AtomicContent.isItemStackUraniumOre(getStackInSlot(inputSlot))) + if (inputTank.getFluid.amount >= FluidContainerRegistry.BUCKET_VOLUME && QuantumContent.isItemStackUraniumOre(getStackInSlot(inputSlot))) { - if (isItemValidForSlot(outputSlot, new ItemStack(AtomicContent.itemYellowCake))) + if (isItemValidForSlot(outputSlot, new ItemStack(QuantumContent.itemYellowCake))) { return true } } if (outputTank.getFluidAmount < outputTank.getCapacity) { - if (inputTank.getFluid.getFluid.getID == AtomicContent.FLUID_DEUTERIUM.getID && inputTank.getFluid.amount >= Settings.deutermiumPerTritium * TileChemicalExtractor.EXTRACT_SPEED) + if (inputTank.getFluid.getFluid.getID == QuantumContent.FLUID_DEUTERIUM.getID && inputTank.getFluid.amount >= Settings.deutermiumPerTritium * TileChemicalExtractor.EXTRACT_SPEED) { - if (outputTank.getFluid == null || (AtomicContent.getFluidStackTritium == outputTank.getFluid)) + if (outputTank.getFluid == null || (QuantumContent.getFluidStackTritium == outputTank.getFluid)) { return true } } if (inputTank.getFluid.getFluid.getID == FluidRegistry.WATER.getID && inputTank.getFluid.amount >= Settings.waterPerDeutermium * TileChemicalExtractor.EXTRACT_SPEED) { - if (outputTank.getFluid == null || (AtomicContent.FLUIDSTACK_DEUTERIUM == outputTank.getFluid)) + if (outputTank.getFluid == null || (QuantumContent.FLUIDSTACK_DEUTERIUM == outputTank.getFluid)) { return true } @@ -148,10 +148,10 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle { if (canUse) { - if (AtomicContent.isItemStackUraniumOre(getStackInSlot(inputSlot))) + if (QuantumContent.isItemStackUraniumOre(getStackInSlot(inputSlot))) { inputTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true) - incrStackSize(outputSlot, new ItemStack(AtomicContent.itemYellowCake, 3)) + incrStackSize(outputSlot, new ItemStack(QuantumContent.itemYellowCake, 3)) decrStackSize(inputSlot, 1) return true } @@ -166,7 +166,7 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle val drain: FluidStack = inputTank.drain(Settings.waterPerDeutermium * TileChemicalExtractor.EXTRACT_SPEED, false) if (drain != null && drain.amount >= 1 && drain.getFluid.getID == FluidRegistry.WATER.getID) { - if (outputTank.fill(new FluidStack(AtomicContent.FLUIDSTACK_DEUTERIUM, TileChemicalExtractor.EXTRACT_SPEED), true) >= TileChemicalExtractor.EXTRACT_SPEED) + if (outputTank.fill(new FluidStack(QuantumContent.FLUIDSTACK_DEUTERIUM, TileChemicalExtractor.EXTRACT_SPEED), true) >= TileChemicalExtractor.EXTRACT_SPEED) { inputTank.drain(Settings.waterPerDeutermium * TileChemicalExtractor.EXTRACT_SPEED, true) return true @@ -182,9 +182,9 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle { val waterUsage: Int = Settings.deutermiumPerTritium val drain: FluidStack = inputTank.drain(Settings.deutermiumPerTritium * TileChemicalExtractor.EXTRACT_SPEED, false) - if (drain != null && drain.amount >= 1 && drain.getFluid.getID == AtomicContent.FLUID_DEUTERIUM.getID) + if (drain != null && drain.amount >= 1 && drain.getFluid.getID == QuantumContent.FLUID_DEUTERIUM.getID) { - if (outputTank.fill(new FluidStack(AtomicContent.getFluidStackTritium, TileChemicalExtractor.EXTRACT_SPEED), true) >= TileChemicalExtractor.EXTRACT_SPEED) + if (outputTank.fill(new FluidStack(QuantumContent.getFluidStackTritium, TileChemicalExtractor.EXTRACT_SPEED), true) >= TileChemicalExtractor.EXTRACT_SPEED) { inputTank.drain(Settings.deutermiumPerTritium * TileChemicalExtractor.EXTRACT_SPEED, true) return true @@ -242,7 +242,7 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle def canFill(from: ForgeDirection, fluid: Fluid): Boolean = { - return FluidRegistry.WATER.getID == fluid.getID || AtomicContent.FLUID_DEUTERIUM.getID == fluid.getID + return FluidRegistry.WATER.getID == fluid.getID || QuantumContent.FLUID_DEUTERIUM.getID == fluid.getID } def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = @@ -283,15 +283,15 @@ class TileChemicalExtractor extends TileProcess(Material.iron) with IFluidHandle } if (slotID == 1) { - return AtomicContent.isItemStackWaterCell(itemStack) + return QuantumContent.isItemStackWaterCell(itemStack) } if (slotID == 2) { - return AtomicContent.isItemStackDeuteriumCell(itemStack) || AtomicContent.isItemStackTritiumCell(itemStack) + return QuantumContent.isItemStackDeuteriumCell(itemStack) || QuantumContent.isItemStackTritiumCell(itemStack) } if (slotID == 3) { - return AtomicContent.isItemStackEmptyCell(itemStack) || AtomicContent.isItemStackUraniumOre(itemStack) || AtomicContent.isItemStackDeuteriumCell(itemStack) + return QuantumContent.isItemStackEmptyCell(itemStack) || QuantumContent.isItemStackUraniumOre(itemStack) || QuantumContent.isItemStackDeuteriumCell(itemStack) } return false } diff --git a/src/main/scala/edx/quantum/machine/extractor/TileProcess.scala b/src/main/scala/edx/quantum/machine/extractor/TileProcess.scala new file mode 100644 index 000000000..03508ba95 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/extractor/TileProcess.scala @@ -0,0 +1,96 @@ +package edx.quantum.machine.extractor + +import net.minecraft.block.material.Material +import net.minecraft.item.ItemStack +import net.minecraftforge.fluids.{FluidContainerRegistry, FluidStack, FluidTank} +import resonant.api.recipe.{MachineRecipes, RecipeResource} +import resonant.lib.prefab.tile.TileElectricInventory + +/** + * General class for all machines that do traditional recipe processing + * + * @author Calclavia + */ +abstract class TileProcess(material: Material) extends TileElectricInventory(material) +{ + protected var inputSlot: Int = 0 + protected var outputSlot: Int = 0 + protected var tankInputFillSlot: Int = 0 + protected var tankInputDrainSlot: Int = 0 + protected var tankOutputFillSlot: Int = 0 + protected var tankOutputDrainSlot: Int = 0 + protected var machineName: String = null + + override def update + { + super.update + if (getInputTank != null) + { + fillOrDrainTank(tankInputFillSlot, tankInputDrainSlot, getInputTank) + } + if (getOutputTank != null) + { + fillOrDrainTank(tankOutputFillSlot, tankOutputDrainSlot, getOutputTank) + } + } + + /** + * Takes an fluid container item and try to fill the tank, dropping the remains in the output slot. + */ + def fillOrDrainTank(containerInput: Int, containerOutput: Int, tank: FluidTank) + { + val inputStack: ItemStack = getStackInSlot(containerInput) + val outputStack: ItemStack = getStackInSlot(containerOutput) + if (FluidContainerRegistry.isFilledContainer(inputStack)) + { + val fluidStack: FluidStack = FluidContainerRegistry.getFluidForFilledItem(inputStack) + val result: ItemStack = inputStack.getItem.getContainerItem(inputStack) + if (result != null && tank.fill(fluidStack, false) >= fluidStack.amount && (outputStack == null || result.isItemEqual(outputStack))) + { + tank.fill(fluidStack, true) + decrStackSize(containerInput, 1) + incrStackSize(containerOutput, result) + } + } + else if (FluidContainerRegistry.isEmptyContainer(inputStack)) + { + val avaliable: FluidStack = tank.getFluid + if (avaliable != null) + { + val result: ItemStack = FluidContainerRegistry.fillFluidContainer(avaliable, inputStack) + val filled: FluidStack = FluidContainerRegistry.getFluidForFilledItem(result) + if (result != null && filled != null && (outputStack == null || result.isItemEqual(outputStack))) + { + decrStackSize(containerInput, 1) + incrStackSize(containerOutput, result) + tank.drain(filled.amount, true) + } + } + } + } + + /** + * Gets the current result of the input set up. + * + * @return + */ + def getResults: Array[RecipeResource] = + { + val inputStack: ItemStack = getStackInSlot(inputSlot) + val mixedResult: Array[RecipeResource] = MachineRecipes.instance.getOutput(machineName, inputStack, getInputTank.getFluid) + if (mixedResult.length > 0) + { + return mixedResult + } + return MachineRecipes.instance.getOutput(machineName, inputStack) + } + + def hasResult: Boolean = + { + return getResults.length > 0 + } + + def getInputTank: FluidTank + + def getOutputTank: FluidTank +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/fulmination/FulminationHandler.scala b/src/main/scala/edx/quantum/machine/fulmination/FulminationHandler.scala similarity index 82% rename from src/main/scala/resonantinduction/atomic/machine/fulmination/FulminationHandler.scala rename to src/main/scala/edx/quantum/machine/fulmination/FulminationHandler.scala index 56f3879b1..4c41ea0f8 100644 --- a/src/main/scala/resonantinduction/atomic/machine/fulmination/FulminationHandler.scala +++ b/src/main/scala/edx/quantum/machine/fulmination/FulminationHandler.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.fulmination +package edx.quantum.machine.fulmination import java.util.{ArrayList, List} @@ -7,27 +7,27 @@ import java.util.{ArrayList, List} */ object FulminationHandler { - final val INSTANCE: FulminationHandler = new FulminationHandler - final val list: List[TileFulmination] = new ArrayList[TileFulmination] + final val INSTANCE: FulminationHandler = new FulminationHandler + final val list: List[TileFulmination] = new ArrayList[TileFulmination] } class FulminationHandler { - def register(tileEntity: TileFulmination) + def register(tileEntity: TileFulmination) + { + if (!FulminationHandler.list.contains(tileEntity)) { - if (!FulminationHandler.list.contains(tileEntity)) - { - FulminationHandler.list.add(tileEntity) - } + FulminationHandler.list.add(tileEntity) } + } - def unregister(tileEntity: TileFulmination) - { - FulminationHandler.list.remove(tileEntity) - } + def unregister(tileEntity: TileFulmination) + { + FulminationHandler.list.remove(tileEntity) + } /** - //@SubscribeEvent def BaoZha(evt: ExplosionEvent.DoExplosionEvent) + //@SubscribeEvent def BaoZha(evt: ExplosionEvent.DoExplosionEvent) { if (evt.iExplosion != null) { diff --git a/src/main/scala/resonantinduction/atomic/machine/fulmination/TileFulmination.scala b/src/main/scala/edx/quantum/machine/fulmination/TileFulmination.scala similarity index 93% rename from src/main/scala/resonantinduction/atomic/machine/fulmination/TileFulmination.scala rename to src/main/scala/edx/quantum/machine/fulmination/TileFulmination.scala index 755ed0f80..5a4060d79 100644 --- a/src/main/scala/resonantinduction/atomic/machine/fulmination/TileFulmination.scala +++ b/src/main/scala/edx/quantum/machine/fulmination/TileFulmination.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.fulmination +package edx.quantum.machine.fulmination import net.minecraft.block.material.Material import resonant.lib.content.prefab.TEnergyStorage diff --git a/src/main/scala/edx/quantum/machine/plasma/RenderPlasmaHeater.scala b/src/main/scala/edx/quantum/machine/plasma/RenderPlasmaHeater.scala new file mode 100644 index 000000000..00c1707c6 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/plasma/RenderPlasmaHeater.scala @@ -0,0 +1,36 @@ +package edx.quantum.machine.plasma + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderTaggedTile + +@SideOnly(Side.CLIENT) object RenderPlasmaHeater +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "fusionReactor.tcn")) + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "fusionReactor.png") +} + +@SideOnly(Side.CLIENT) class RenderPlasmaHeater extends RenderTaggedTile +{ + override def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) + { + val tileEntity: TilePlasmaHeater = t.asInstanceOf[TilePlasmaHeater] + if (tileEntity.world != null) + { + super.renderTileEntityAt(t, x, y, z, f) + } + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + bindTexture(RenderPlasmaHeater.TEXTURE) + GL11.glPushMatrix + GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0) + RenderPlasmaHeater.MODEL.renderOnly(Array("rrot", "srot"): _*) + GL11.glPopMatrix + RenderPlasmaHeater.MODEL.renderAllExcept(Array("rrot", "srot"): _*) + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasma.scala b/src/main/scala/edx/quantum/machine/plasma/TilePlasma.scala similarity index 97% rename from src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasma.scala rename to src/main/scala/edx/quantum/machine/plasma/TilePlasma.scala index 7ddf506f3..8f027a64b 100644 --- a/src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasma.scala +++ b/src/main/scala/edx/quantum/machine/plasma/TilePlasma.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.plasma +package edx.quantum.machine.plasma import java.util.ArrayList diff --git a/src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasmaHeater.scala b/src/main/scala/edx/quantum/machine/plasma/TilePlasmaHeater.scala similarity index 92% rename from src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasmaHeater.scala rename to src/main/scala/edx/quantum/machine/plasma/TilePlasmaHeater.scala index ed51af216..3cff8e65e 100644 --- a/src/main/scala/resonantinduction/atomic/machine/plasma/TilePlasmaHeater.scala +++ b/src/main/scala/edx/quantum/machine/plasma/TilePlasmaHeater.scala @@ -1,8 +1,9 @@ -package resonantinduction.atomic.machine.plasma +package edx.quantum.machine.plasma import java.util.HashMap import cpw.mods.fml.common.network.ByteBufUtils +import edx.quantum.QuantumContent import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.player.EntityPlayer @@ -21,7 +22,6 @@ import resonant.lib.prefab.tile.TileElectric import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.science.UnitDisplay import resonant.lib.utility.{FluidUtility, LanguageUtility} -import resonantinduction.atomic.AtomicContent object TilePlasmaHeater { @@ -57,7 +57,7 @@ class TilePlasmaHeater extends TileElectric(Material.iron) with IPacketReceiver { tankInputDeuterium.drain(TilePlasmaHeater.plasmaHeatAmount, true) tankInputTritium.drain(TilePlasmaHeater.plasmaHeatAmount, true) - tankOutput.fill(new FluidStack(AtomicContent.FLUID_PLASMA, tankOutput.getCapacity), true) + tankOutput.fill(new FluidStack(QuantumContent.FLUID_PLASMA, tankOutput.getCapacity), true) energy.extractEnergy } } @@ -153,11 +153,11 @@ class TilePlasmaHeater extends TileElectric(Material.iron) with IPacketReceiver def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = { - if (resource.isFluidEqual(AtomicContent.FLUIDSTACK_DEUTERIUM)) + if (resource.isFluidEqual(QuantumContent.FLUIDSTACK_DEUTERIUM)) { return tankInputDeuterium.fill(resource, doFill) } - if (resource.isFluidEqual(AtomicContent.getFluidStackTritium)) + if (resource.isFluidEqual(QuantumContent.getFluidStackTritium)) { return tankInputTritium.fill(resource, doFill) } @@ -176,12 +176,12 @@ class TilePlasmaHeater extends TileElectric(Material.iron) with IPacketReceiver def canFill(from: ForgeDirection, fluid: Fluid): Boolean = { - return fluid.getID == AtomicContent.FLUID_DEUTERIUM.getID || fluid.getID == AtomicContent.getFluidTritium.getID + return fluid.getID == QuantumContent.FLUID_DEUTERIUM.getID || fluid.getID == QuantumContent.getFluidTritium.getID } def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = { - return fluid eq AtomicContent.FLUID_PLASMA + return fluid eq QuantumContent.FLUID_PLASMA } def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = diff --git a/src/main/scala/edx/quantum/machine/quantum/ContainerQuantumAssembler.scala b/src/main/scala/edx/quantum/machine/quantum/ContainerQuantumAssembler.scala new file mode 100644 index 000000000..c4f1f98eb --- /dev/null +++ b/src/main/scala/edx/quantum/machine/quantum/ContainerQuantumAssembler.scala @@ -0,0 +1,97 @@ +package edx.quantum.machine.quantum + +import edx.quantum.QuantumContent +import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} +import net.minecraft.inventory.{Container, IInventory, Slot} +import net.minecraft.item.ItemStack + +class ContainerQuantumAssembler extends Container +{ + private var tileEntity: TileQuantumAssembler = null + + def this(par1InventoryPlayer: InventoryPlayer, tileEntity: TileQuantumAssembler) + { + this() + this.tileEntity = tileEntity + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 0, 80, 40)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 53, 56)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 2, 107, 56)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 3, 53, 88)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 4, 107, 88)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 5, 80, 103)) + this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 6, 80, 72)) + + for (var3 <- 0 to 3) + { + var var4: Int = 0 + for (var4 <- 0 to 9) + { + this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 148 + var3 * 18)) + + } + } + for (var3 <- 0 to 9) + { + this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 206)) + } + } + + override def onContainerClosed(entityplayer: EntityPlayer) + { + super.onContainerClosed(entityplayer) + } + + def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = + { + return this.tileEntity.isUseableByPlayer(par1EntityPlayer) + } + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = + { + var var2: ItemStack = null + val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] + if (var3 != null && var3.getHasStack) + { + val itemStack: ItemStack = var3.getStack + var2 = itemStack.copy + if (par1 > 6) + { + if (itemStack.getItem eq QuantumContent.itemDarkMatter) + { + if (!this.mergeItemStack(itemStack, 0, 6, false)) + { + return null + } + } + else if (!this.getSlot(6).getHasStack) + { + if (!this.mergeItemStack(itemStack, 6, 7, false)) + { + return null + } + } + } + else if (!this.mergeItemStack(itemStack, 7, 36 + 7, false)) + { + return null + } + if (itemStack.stackSize == 0) + { + var3.putStack(null.asInstanceOf[ItemStack]) + } + else + { + var3.onSlotChanged + } + if (itemStack.stackSize == var2.stackSize) + { + return null + } + var3.onPickupFromSlot(par1EntityPlayer, itemStack) + } + return var2 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/quantum/GuiQuantumAssembler.scala b/src/main/scala/edx/quantum/machine/quantum/GuiQuantumAssembler.scala new file mode 100644 index 000000000..a98b9c7b6 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/quantum/GuiQuantumAssembler.scala @@ -0,0 +1,56 @@ +package edx.quantum.machine.quantum + +import edx.core.Reference +import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.util.ResourceLocation +import org.lwjgl.opengl.GL11 +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.utility.science.UnitDisplay + +object GuiQuantumAssembler +{ + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.guiDirectory + "gui_atomic_assembler.png") +} + +class GuiQuantumAssembler(par1InventoryPlayer: InventoryPlayer, tileEntity: TileQuantumAssembler) extends GuiContainerBase(new ContainerQuantumAssembler(par1InventoryPlayer, tileEntity)) +{ + //Constructor + this.ySize = 230 + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) + { + this.fontRendererObj.drawString("Assembler", 65 - "Assembler".length, 6, 4210752) + var displayText: String = "" + if (this.tileEntity.time > 0) + { + displayText = "Process: " + (100 - (this.tileEntity.time.asInstanceOf[Float] / this.tileEntity.MAX_TIME.asInstanceOf[Float]) * 100).asInstanceOf[Int] + "%" + } + else if (this.tileEntity.canProcess) + { + displayText = "Ready" + } + else + { + displayText = "Idle" + } + this.fontRendererObj.drawString(displayText, 9, this.ySize - 106, 4210752) + this.renderUniversalDisplay(100, this.ySize - 94, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) + this.renderUniversalDisplay(8, this.ySize - 95, tileEntity.MAX_TIME, mouseX, mouseY, UnitDisplay.Unit.WATT) + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, par2: Int, par3: Int) + { + this.mc.renderEngine.bindTexture(GuiQuantumAssembler.TEXTURE) + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F) + this.containerWidth = (this.width - this.xSize) / 2 + this.containerHeight = (this.height - this.ySize) / 2 + this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, this.xSize, this.ySize) + } + +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/quantum/RenderQuantumAssembler.scala b/src/main/scala/edx/quantum/machine/quantum/RenderQuantumAssembler.scala new file mode 100644 index 000000000..ae35d9aac --- /dev/null +++ b/src/main/scala/edx/quantum/machine/quantum/RenderQuantumAssembler.scala @@ -0,0 +1,59 @@ +package edx.quantum.machine.quantum + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.entity.{RenderItem, RenderManager} +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.entity.item.EntityItem +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 + +@SideOnly(Side.CLIENT) object RenderQuantumAssembler +{ + final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "quantumAssembler.tcn")) + final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "quantumAssembler.png") + final val hands: Array[java.lang.String] = Array[java.lang.String]("Back Arm Upper", "Back Arm Lower", "Right Arm Upper", "Right Arm Lower", "Front Arm Upper", "Front Arm Lower", "Left Arm Upper", "Left Arm Lower") + final val arms: Array[java.lang.String] = Array[java.lang.String]("Middle Rotor Focus Lazer", "Middle Rotor Uppper Arm", "Middle Rotor Lower Arm", "Middle Rotor Arm Base", "Middle Rotor") + final val largeArms: Array[java.lang.String] = Array[java.lang.String]("Bottom Rotor Upper Arm", "Bottom Rotor Lower Arm", "Bottom Rotor Arm Base", "Bottom Rotor", "Bottom Rotor Resonator Arm") + final val all: Array[java.lang.String] = Array[java.lang.String]("Resonance_Crystal", "Back Arm Upper", "Back Arm Lower", "Right Arm Upper", "Right Arm Lower", "Front Arm Upper", "Front Arm Lower", "Left Arm Upper", "Left Arm Lower", "Middle Rotor Focus Lazer", "Middle Rotor Uppper Arm", "Middle Rotor Lower Arm", "Middle Rotor Arm Base", "Middle Rotor", "Bottom Rotor Upper Arm", "Bottom Rotor Lower Arm", "Bottom Rotor Arm Base", "Bottom Rotor", "Bottom Rotor Resonator Arm") + +} + +@SideOnly(Side.CLIENT) class RenderQuantumAssembler extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) + { + this.render(tileEntity.asInstanceOf[TileQuantumAssembler], var2, var4, var6, var8) + } + + def render(tileEntity: TileQuantumAssembler, x: Double, y: Double, z: Double, f: Float) + { + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + bindTexture(RenderQuantumAssembler.TEXTURE) + GL11.glPushMatrix + GL11.glRotatef(-tileEntity.rotation.xf, 0, 1f, 0) + RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.hands: _*) + RenderQuantumAssembler.MODEL.renderOnly("Resonance_Crystal") + GL11.glPopMatrix + GL11.glPushMatrix + GL11.glRotatef(tileEntity.rotation.yf, 0, 1f, 0) + RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.arms: _*) + GL11.glPopMatrix + GL11.glPushMatrix + GL11.glRotatef(-tileEntity.rotation.zf, 0, 1f, 0) + RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.largeArms: _*) + GL11.glPopMatrix + RenderQuantumAssembler.MODEL.renderAllExcept(RenderQuantumAssembler.all: _*) + GL11.glPopMatrix + val renderItem: RenderItem = (RenderManager.instance.getEntityClassRenderObject(classOf[EntityItem]).asInstanceOf[RenderItem]) + GL11.glPushMatrix + if (tileEntity.entityItem != null) + { + renderItem.doRender(tileEntity.entityItem, x + 0.5, y + 0.4, z + 0.5, 0, 0) + } + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/quantum/TileQuantumAssembler.scala b/src/main/scala/edx/quantum/machine/quantum/TileQuantumAssembler.scala similarity index 94% rename from src/main/scala/resonantinduction/atomic/machine/quantum/TileQuantumAssembler.scala rename to src/main/scala/edx/quantum/machine/quantum/TileQuantumAssembler.scala index f403c9b68..74376fa5a 100644 --- a/src/main/scala/resonantinduction/atomic/machine/quantum/TileQuantumAssembler.scala +++ b/src/main/scala/edx/quantum/machine/quantum/TileQuantumAssembler.scala @@ -1,5 +1,7 @@ -package resonantinduction.atomic.machine.quantum +package edx.quantum.machine.quantum +import edx.core.Reference +import edx.quantum.QuantumContent import io.netty.buffer.ByteBuf import net.minecraft.block.material.Material import net.minecraft.entity.item.EntityItem @@ -8,13 +10,11 @@ import net.minecraft.item.{Item, ItemStack} import net.minecraft.nbt.NBTTagCompound import resonant.api.recipe.QuantumAssemblerRecipes import resonant.lib.content.prefab.TEnergyStorage +import resonant.lib.grid.energy.EnergyStorage import resonant.lib.network.discriminator.{PacketTile, PacketType} import resonant.lib.network.handle.IPacketReceiver -import resonant.lib.grid.energy.EnergyStorage import resonant.lib.prefab.tile.TileElectricInventory import resonant.lib.transform.vector.Vector3 -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.Reference /** * Atomic assembler of items * @@ -54,7 +54,7 @@ class TileQuantumAssembler extends TileElectricInventory(Material.iron) with IPa { if (!world.isRemote) { - player.openGui(AtomicContent, 0, world, xi, yi, zi) + player.openGui(QuantumContent, 0, world, xi, yi, zi) } return true } @@ -126,53 +126,6 @@ class TileQuantumAssembler extends TileElectricInventory(Material.iron) with IPa } } - def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) - { - this.time = data.readInt - val itemID: Int = data.readInt - val itemAmount: Int = data.readInt - val itemMeta: Int = data.readInt - if (itemID != -1 && itemAmount != -1 && itemMeta != -1) - { - this.setInventorySlotContents(6, new ItemStack(Item.getItemById(itemID), itemAmount, itemMeta)) - } - } - - override def getDescPacket: PacketTile = - { - if (this.getStackInSlot(6) != null) - { - return new PacketTile(xi, yi, zi, Array[Any](time, getStackInSlot(6))) - } - return new PacketTile(xi, yi, zi, Array[Any](time, -1, -1, -1)) - } - - /** - * Checks to see if the assembler can run - */ - def canProcess: Boolean = - { - if (getStackInSlot(6) != null) - { - if (QuantumAssemblerRecipes.hasItemStack(getStackInSlot(6))) - { - for (i <- 0 to 6) - { - if (getStackInSlot(i) == null) - { - return false - } - if (getStackInSlot(i).getItem ne AtomicContent.itemDarkMatter) - { - return false - } - } - return getStackInSlot(6).stackSize < 64 - } - } - return false - } - /** * Turn one item from the furnace source stack into the appropriate smelted item in the furnace * result stack @@ -195,6 +148,53 @@ class TileQuantumAssembler extends TileElectricInventory(Material.iron) with IPa } } + /** + * Checks to see if the assembler can run + */ + def canProcess: Boolean = + { + if (getStackInSlot(6) != null) + { + if (QuantumAssemblerRecipes.hasItemStack(getStackInSlot(6))) + { + for (i <- 0 to 6) + { + if (getStackInSlot(i) == null) + { + return false + } + if (getStackInSlot(i).getItem ne QuantumContent.itemDarkMatter) + { + return false + } + } + return getStackInSlot(6).stackSize < 64 + } + } + return false + } + + def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) + { + this.time = data.readInt + val itemID: Int = data.readInt + val itemAmount: Int = data.readInt + val itemMeta: Int = data.readInt + if (itemID != -1 && itemAmount != -1 && itemMeta != -1) + { + this.setInventorySlotContents(6, new ItemStack(Item.getItemById(itemID), itemAmount, itemMeta)) + } + } + + override def getDescPacket: PacketTile = + { + if (this.getStackInSlot(6) != null) + { + return new PacketTile(xi, yi, zi, Array[Any](time, getStackInSlot(6))) + } + return new PacketTile(xi, yi, zi, Array[Any](time, -1, -1, -1)) + } + override def readFromNBT(nbt: NBTTagCompound) { super.readFromNBT(nbt) @@ -213,6 +213,6 @@ class TileQuantumAssembler extends TileElectricInventory(Material.iron) with IPa { return true } - return itemStack.getItem eq AtomicContent.itemDarkMatter + return itemStack.getItem eq QuantumContent.itemDarkMatter } } \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/reactor/ContainerReactorCell.scala b/src/main/scala/edx/quantum/machine/reactor/ContainerReactorCell.scala new file mode 100644 index 000000000..59fc77b8c --- /dev/null +++ b/src/main/scala/edx/quantum/machine/reactor/ContainerReactorCell.scala @@ -0,0 +1,68 @@ +package edx.quantum.machine.reactor + +import edx.quantum.items.{ItemBreederFuel, ItemFissileFuel} +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.inventory.Slot +import net.minecraft.item.ItemStack +import resonant.lib.prefab.gui.ContainerBase +import resonant.lib.prefab.gui.slot.SlotSpecific + +class ContainerReactorCell(player: EntityPlayer, tileEntity: TileReactorCell) extends ContainerBase(tileEntity) +{ + //Constructor + this.addSlotToContainer(new SlotSpecific(tileEntity, 0, 79, 17, classOf[ItemFissileFuel], classOf[ItemBreederFuel])) + this.addPlayerInventory(player) + + /** + * Called to transfer a stack from one inventory to the other eg. when shift clicking. + */ + override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = + { + var var2: ItemStack = null + val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] + if (var3 != null && var3.getHasStack) + { + val itemStack: ItemStack = var3.getStack + var2 = itemStack.copy + if (par1 >= this.slotCount) + { + if (this.getSlot(0).isItemValid(itemStack)) + { + if (!this.mergeItemStack(itemStack, 0, 1, false)) + { + return null + } + } + else if (par1 < 27 + this.slotCount) + { + if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) + { + return null + } + } + else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) + { + return null + } + } + else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) + { + return null + } + if (itemStack.stackSize == 0) + { + var3.putStack(null.asInstanceOf[ItemStack]) + } + else + { + var3.onSlotChanged + } + if (itemStack.stackSize == var2.stackSize) + { + return null + } + var3.onPickupFromSlot(par1EntityPlayer, itemStack) + } + return var2 + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/reactor/GuiReactorCell.scala b/src/main/scala/edx/quantum/machine/reactor/GuiReactorCell.scala new file mode 100644 index 000000000..17f46700a --- /dev/null +++ b/src/main/scala/edx/quantum/machine/reactor/GuiReactorCell.scala @@ -0,0 +1,50 @@ +package edx.quantum.machine.reactor + +import net.minecraft.entity.player.InventoryPlayer +import org.lwjgl.opengl.GL11 +import resonant.lib.prefab.gui.GuiContainerBase +import resonant.lib.utility.LanguageUtility + +class GuiReactorCell(inventory: InventoryPlayer, tileEntity: TileReactorCell) extends GuiContainerBase(new ContainerReactorCell(inventory.player, tileEntity)) +{ + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + override def drawGuiContainerForegroundLayer(x: Int, y: Int) + { + fontRendererObj.drawString(tileEntity.getInvName, xSize / 2 - fontRendererObj.getStringWidth(tileEntity.getInvName) / 2, 6, 4210752) + if (tileEntity.getStackInSlot(0) != null) + { + fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.temperature"), 9, 45, 4210752) + fontRendererObj.drawString(String.valueOf(tileEntity.getTemperature.asInstanceOf[Int]) + "/" + String.valueOf(TileReactorCell.MELTING_POINT) + " K", 9, 58, 4210752) + val secondsLeft: Int = (tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage) + fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.remainingTime"), 100, 45, 4210752) + fontRendererObj.drawString(secondsLeft + " seconds", 100, 58, 4210752) + } + fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.remainingTime"), 100, 45, 4210752) + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) + { + super.drawGuiContainerBackgroundLayer(par1, x, y) + drawSlot(78, 16) + drawMeter(80, 36, tileEntity.tank.getFluidAmount.asInstanceOf[Float] / tileEntity.tank.getCapacity.asInstanceOf[Float], tileEntity.tank.getFluid) + if (tileEntity.getStackInSlot(0) != null) + { + GL11.glPushMatrix + GL11.glTranslatef(32 * 2, 0, 0) + GL11.glScalef(0.5f, 1, 1) + drawForce(20, 70, (tileEntity.getTemperature) / (TileReactorCell.MELTING_POINT)) + GL11.glPopMatrix + GL11.glPushMatrix + GL11.glTranslatef(68 * 2, 0, 0) + GL11.glScalef(0.5f, 1, 1) + val ticksLeft: Float = (tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage) + drawElectricity(70, 70, ticksLeft / tileEntity.getStackInSlot(0).getMaxDamage) + GL11.glPopMatrix + } + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/machine/reactor/RenderReactorCell.scala b/src/main/scala/edx/quantum/machine/reactor/RenderReactorCell.scala new file mode 100644 index 000000000..b789d2ac3 --- /dev/null +++ b/src/main/scala/edx/quantum/machine/reactor/RenderReactorCell.scala @@ -0,0 +1,85 @@ +package edx.quantum.machine.reactor + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility +import resonant.lib.render.model.ModelCube + +@SideOnly(Side.CLIENT) object RenderReactorCell +{ + final val MODEL_TOP: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellTop.tcn")) + final val MODEL_MIDDLE: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellMiddle.tcn")) + final val MODEL_BOTTOM: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellBottom.tcn")) + final val TEXTURE_TOP: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellTop.png") + final val TEXTURE_MIDDLE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellMiddle.png") + final val TEXTURE_BOTTOM: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellBottom.png") + final val TEXTURE_FISSILE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "fissileMaterial.png") +} + +@SideOnly(Side.CLIENT) class RenderReactorCell extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) + { + val tileEntity: TileReactorCell = t.asInstanceOf[TileReactorCell] + GL11.glPushMatrix + GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) + var meta: Int = 2 + if (tileEntity.world != null) + { + meta = tileEntity.getBlockMetadata + } + val hasBelow: Boolean = tileEntity.world != null && t.getWorldObj.getTileEntity(t.xCoord, t.yCoord - 1, t.zCoord).isInstanceOf[TileReactorCell] + + if (meta == 0) + { + bindTexture(RenderReactorCell.TEXTURE_BOTTOM) + RenderReactorCell.MODEL_BOTTOM.renderAll + } + else if (meta == 1) + { + bindTexture(RenderReactorCell.TEXTURE_MIDDLE) + GL11.glTranslatef(0, 0.075f, 0) + GL11.glScalef(1f, 1.15f, 1f) + RenderReactorCell.MODEL_MIDDLE.renderAll + } + else + { + bindTexture(RenderReactorCell.TEXTURE_TOP) + if (hasBelow) + { + GL11.glScalef(1f, 1.32f, 1f) + } + else + { + GL11.glTranslatef(0, 0.1f, 0) + GL11.glScalef(1f, 1.2f, 1f) + } + if (hasBelow) + { + RenderReactorCell.MODEL_TOP.renderAllExcept("BottomPad", "BaseDepth", "BaseWidth", "Base") + } + else + { + RenderReactorCell.MODEL_TOP.renderAll + } + } + GL11.glPopMatrix + if (tileEntity.getStackInSlot(0) != null) + { + val height: Float = tileEntity.getHeight * ((tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage).asInstanceOf[Float] / tileEntity.getStackInSlot(0).getMaxDamage.asInstanceOf[Float]) + GL11.glPushMatrix + GL11.glTranslatef(x.asInstanceOf[Float] + 0.5F, y.asInstanceOf[Float] + 0.5F * height, z.asInstanceOf[Float] + 0.5F) + GL11.glScalef(0.4f, 0.9f * height, 0.4f) + bindTexture(RenderReactorCell.TEXTURE_FISSILE) + RenderUtility.disableLighting + ModelCube.INSTNACE.render + RenderUtility.enableLighting + GL11.glPopMatrix + } + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/TileControlRod.scala b/src/main/scala/edx/quantum/machine/reactor/TileControlRod.scala similarity index 64% rename from src/main/scala/resonantinduction/atomic/machine/reactor/TileControlRod.scala rename to src/main/scala/edx/quantum/machine/reactor/TileControlRod.scala index c2006c3f4..552b5607c 100644 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/TileControlRod.scala +++ b/src/main/scala/edx/quantum/machine/reactor/TileControlRod.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.reactor +package edx.quantum.machine.reactor import net.minecraft.block.material.Material import resonant.lib.prefab.tile.spatial.SpatialBlock @@ -9,6 +9,6 @@ import resonant.lib.transform.region.Cuboid */ class TileControlRod extends SpatialBlock(Material.iron) { - bounds(new Cuboid(0.3f, 0f, 0.3f, 0.7f, 1f, 0.7f)) - isOpaqueCube(false) + bounds(new Cuboid(0.3f, 0f, 0.3f, 0.7f, 1f, 0.7f)) + isOpaqueCube(false) } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorCell.scala b/src/main/scala/edx/quantum/machine/reactor/TileReactorCell.scala similarity index 94% rename from src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorCell.scala rename to src/main/scala/edx/quantum/machine/reactor/TileReactorCell.scala index 535856286..a9a80eb32 100644 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorCell.scala +++ b/src/main/scala/edx/quantum/machine/reactor/TileReactorCell.scala @@ -1,8 +1,11 @@ -package resonantinduction.atomic.machine.reactor +package edx.quantum.machine.reactor import java.util.{ArrayList, List} import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference +import edx.quantum.QuantumContent +import edx.quantum.machine.plasma.TilePlasma import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.entity.EntityLiving @@ -17,19 +20,16 @@ import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.{Fluid, FluidContainerRegistry, FluidStack, FluidTank, FluidTankInfo, IFluidHandler} import resonant.api.event.PlasmaEvent -import resonant.api.tile.{IReactorComponent, IReactor} +import resonant.api.tile.{IReactor, IReactorComponent} import resonant.lib.grid.thermal.{ThermalGrid, ThermalPhysics} -import resonant.lib.prefab.tile.multiblock.reference.{IMultiBlockStructure, MultiBlockHandler} import resonant.lib.network.Synced import resonant.lib.network.Synced.{SyncedInput, SyncedOutput} import resonant.lib.network.discriminator.PacketAnnotation import resonant.lib.prefab.poison.PoisonRadiation import resonant.lib.prefab.tile.TileInventory +import resonant.lib.prefab.tile.multiblock.reference.{IMultiBlockStructure, MultiBlockHandler} import resonant.lib.transform.vector.{Vector3, VectorWorld} import resonant.lib.utility.inventory.InventoryUtility -import resonantinduction.atomic.AtomicContent -import resonantinduction.atomic.machine.plasma.TilePlasma -import resonantinduction.core.Reference import scala.collection.convert.wrapAll._ @@ -68,11 +68,6 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc updatePositionStatus } - override def onNeighborChanged(block: Block) - { - updatePositionStatus - } - /** Multiblock Methods */ def updatePositionStatus { @@ -115,6 +110,11 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc return lowest } + override def onNeighborChanged(block: Block) + { + updatePositionStatus + } + override def update { super.update @@ -135,7 +135,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc } if (!getWorld.isRemote) { - if (getMultiBlock().isPrimary() && tank.getFluid != null && tank.getFluid.fluidID == AtomicContent.FLUID_PLASMA.getID) + if (getMultiBlock().isPrimary() && tank.getFluid != null && tank.getFluid.fluidID == QuantumContent.FLUID_PLASMA.getID) { val drain: FluidStack = tank.drain(FluidContainerRegistry.BUCKET_VOLUME, false) if (drain != null && drain.amount >= FluidContainerRegistry.BUCKET_VOLUME) @@ -189,7 +189,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc { { val checkAdjacent: Vector3 = toVector3.add(ForgeDirection.getOrientation(i)) - if (checkAdjacent.getBlock(worldObj) == AtomicContent.blockControlRod) + if (checkAdjacent.getBlock(worldObj) == QuantumContent.blockControlRod) { deltaT /= 1.1f rods += 1 @@ -205,7 +205,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc { worldObj.playSoundEffect(this.xCoord + 0.5F, this.yCoord + 0.5F, this.zCoord + 0.5F, "Fluid.lavapop", 0.5F, 2.6F + (worldObj.rand.nextFloat - worldObj.rand.nextFloat) * 0.8F) } - if (worldObj.getWorldTime % (AtomicContent.SECOND_IN_TICKS * 5.0F) == 0 && this.getTemperature >= 373) + if (worldObj.getWorldTime % (QuantumContent.SECOND_IN_TICKS * 5.0F) == 0 && this.getTemperature >= 373) { val percentage: Float = Math.min(this.getTemperature / TileReactorCell.MELTING_POINT, 1.0F) worldObj.playSoundEffect(this.xCoord + 0.5F, this.yCoord + 0.5F, this.zCoord + 0.5F, Reference.prefix + "reactorcell", percentage, 1.0F) @@ -238,7 +238,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc val block: Block = leakPos.getBlock if (block == Blocks.grass) { - leakPos.setBlock(world, AtomicContent.blockRadioactive) + leakPos.setBlock(world, QuantumContent.blockRadioactive) tank.drain(FluidContainerRegistry.BUCKET_VOLUME, true) } else if (block == null) @@ -270,7 +270,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc def isOverToxic: Boolean = { - return tank.getFluid != null && tank.getFluid.fluidID == AtomicContent.getFluidToxicWaste.getID && tank.getFluid.amount >= tank.getCapacity + return tank.getFluid != null && tank.getFluid.fluidID == QuantumContent.getFluidToxicWaste.getID && tank.getFluid.amount >= tank.getCapacity } def getWorld: World = @@ -292,11 +292,6 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc return height } - override def getDescPacket: PacketAnnotation = - { - return new PacketAnnotation(this) - } - private def meltDown { if (!worldObj.isRemote) @@ -313,6 +308,11 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc return temperature } + override def getDescPacket: PacketAnnotation = + { + return new PacketAnnotation(this) + } + def onMultiBlockChanged { } @@ -381,15 +381,6 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc return false } - override def getMultiBlock: MultiBlockHandler[TileReactorCell] = - { - if (multiBlock == null) - { - multiBlock = new MultiBlockHandler[TileReactorCell](this) - } - return multiBlock - } - override def isUseableByPlayer(par1EntityPlayer: EntityPlayer): Boolean = { return if (worldObj.getTileEntity(xCoord, yCoord, zCoord) ne this) false else par1EntityPlayer.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64.0D @@ -406,6 +397,15 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc return getMultiBlock.get.tank.fill(resource, doFill) } + override def getMultiBlock: MultiBlockHandler[TileReactorCell] = + { + if (multiBlock == null) + { + multiBlock = new MultiBlockHandler[TileReactorCell](this) + } + return multiBlock + } + override def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = { return tank.drain(maxDrain, doDrain) @@ -422,12 +422,12 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = { - return fluid == AtomicContent.FLUID_PLASMA + return fluid == QuantumContent.FLUID_PLASMA } override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = { - return fluid == AtomicContent.getFluidToxicWaste + return fluid == QuantumContent.getFluidToxicWaste } override def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = @@ -477,7 +477,7 @@ class TileReactorCell extends TileInventory(Material.iron) with IMultiBlockStruc } else { - player.openGui(AtomicContent, 0, world, tile.xCoord, tile.yCoord, tile.zCoord) + player.openGui(QuantumContent, 0, world, tile.xCoord, tile.yCoord, tile.zCoord) } } return true diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorDrain.scala b/src/main/scala/edx/quantum/machine/reactor/TileReactorDrain.scala similarity index 99% rename from src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorDrain.scala rename to src/main/scala/edx/quantum/machine/reactor/TileReactorDrain.scala index 0a0f567fc..b186c4a61 100644 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/TileReactorDrain.scala +++ b/src/main/scala/edx/quantum/machine/reactor/TileReactorDrain.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.reactor +package edx.quantum.machine.reactor import java.util.{ArrayList, HashSet, List, Set} @@ -47,6 +47,33 @@ class TileReactorDrain extends SpatialTile(Material.iron) with IFluidHandler wit return null } + def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = + { + return null + } + + def canFill(from: ForgeDirection, fluid: Fluid): Boolean = + { + return false + } + + def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = + { + return true + } + + def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = + { + val tankInfoList: List[FluidTankInfo] = new ArrayList[FluidTankInfo] + this.getOptimalTank + import scala.collection.JavaConversions._ + for (tank <- this.tanks) + { + tankInfoList.add(tank.getInfo) + } + return tankInfoList.toArray(new Array[FluidTankInfo](0)) + } + def getOptimalTank: IFluidTank = { if (this.lastFindTime == -1 || this.worldObj.getWorldTime - this.lastFindTime > 20) @@ -130,33 +157,6 @@ class TileReactorDrain extends SpatialTile(Material.iron) with IFluidHandler wit return 0 } - def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = - { - return null - } - - def canFill(from: ForgeDirection, fluid: Fluid): Boolean = - { - return false - } - - def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = - { - return true - } - - def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = - { - val tankInfoList: List[FluidTankInfo] = new ArrayList[FluidTankInfo] - this.getOptimalTank - import scala.collection.JavaConversions._ - for (tank <- this.tanks) - { - tankInfoList.add(tank.getInfo) - } - return tankInfoList.toArray(new Array[FluidTankInfo](0)) - } - @SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister) { super.registerIcons(iconRegister) diff --git a/src/main/scala/resonantinduction/atomic/machine/thermometer/ItemBlockThermometer.scala b/src/main/scala/edx/quantum/machine/thermometer/ItemBlockThermometer.scala similarity index 97% rename from src/main/scala/resonantinduction/atomic/machine/thermometer/ItemBlockThermometer.scala rename to src/main/scala/edx/quantum/machine/thermometer/ItemBlockThermometer.scala index b0065e04f..cd8b867f0 100644 --- a/src/main/scala/resonantinduction/atomic/machine/thermometer/ItemBlockThermometer.scala +++ b/src/main/scala/edx/quantum/machine/thermometer/ItemBlockThermometer.scala @@ -1,4 +1,4 @@ -package resonantinduction.atomic.machine.thermometer +package edx.quantum.machine.thermometer import java.util.List @@ -9,10 +9,10 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.ChatComponentText import net.minecraft.world.World import resonant.lib.prefab.tile.item.ItemBlockSaved +import resonant.lib.transform.vector.Vector3 import resonant.lib.utility.LanguageUtility import resonant.lib.utility.nbt.NBTUtility import resonant.lib.wrapper.WrapList._ -import resonant.lib.transform.vector.Vector3 class ItemBlockThermometer(block: Block) extends ItemBlockSaved(block: Block) { diff --git a/src/main/scala/edx/quantum/machine/thermometer/RenderThermometer.scala b/src/main/scala/edx/quantum/machine/thermometer/RenderThermometer.scala new file mode 100644 index 000000000..d3448963d --- /dev/null +++ b/src/main/scala/edx/quantum/machine/thermometer/RenderThermometer.scala @@ -0,0 +1,28 @@ +package edx.quantum.machine.thermometer + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer +import net.minecraft.tileentity.TileEntity +import org.lwjgl.opengl.GL11 +import resonant.lib.render.RenderUtility + +@SideOnly(Side.CLIENT) class RenderThermometer extends TileEntitySpecialRenderer +{ + def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) + { + val tile: TileThermometer = tileEntity.asInstanceOf[TileThermometer] + GL11.glPushMatrix + RenderUtility.enableLightmap + + for (side <- 2 to 6) + { + RenderUtility.renderText((if (tile.isOverThreshold) "\u00a74" else "") + Math.round(tile.detectedTemperature) + " K", side, 0.8f, x, y + 0.1, z) + RenderUtility.renderText((if (tile.isOverThreshold) "\u00a74" else "\u00a71") + "Threshold: " + (tile.getThershold) + " K", side, 1, x, y - 0.1, z) + if (tile.trackCoordinate != null) + { + RenderUtility.renderText(tile.trackCoordinate.xi + ", " + tile.trackCoordinate.yi + ", " + tile.trackCoordinate.zi, side, 0.5f, x, y - 0.3, z) + } + } + GL11.glPopMatrix + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/thermometer/TileThermometer.scala b/src/main/scala/edx/quantum/machine/thermometer/TileThermometer.scala similarity index 98% rename from src/main/scala/resonantinduction/atomic/machine/thermometer/TileThermometer.scala rename to src/main/scala/edx/quantum/machine/thermometer/TileThermometer.scala index 696e683d0..bc3e05ecc 100644 --- a/src/main/scala/resonantinduction/atomic/machine/thermometer/TileThermometer.scala +++ b/src/main/scala/edx/quantum/machine/thermometer/TileThermometer.scala @@ -1,9 +1,10 @@ -package resonantinduction.atomic.machine.thermometer +package edx.quantum.machine.thermometer import java.util.ArrayList import cpw.mods.fml.common.Optional import cpw.mods.fml.relauncher.{Side, SideOnly} +import edx.core.Reference import li.cil.oc.api.machine.{Arguments, Callback, Context} import li.cil.oc.api.network.SimpleComponent import net.minecraft.block.Block @@ -21,7 +22,6 @@ import resonant.lib.prefab.tile.item.ItemBlockSaved import resonant.lib.prefab.tile.spatial.SpatialTile import resonant.lib.transform.vector.{Vector3, VectorWorld} import resonant.lib.utility.inventory.InventoryUtility -import resonantinduction.core.Reference /** * Thermometer TileEntity @@ -72,6 +72,16 @@ class TileThermometer extends SpatialTile(Material.piston) with SimpleComponent return true } + def setThreshold(newThreshold: Int) + { + threshold = newThreshold % TileThermometer.MAX_THRESHOLD + if (threshold <= 0) + { + threshold = TileThermometer.MAX_THRESHOLD + } + markUpdate + } + override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = { if (player.isSneaking) @@ -127,6 +137,16 @@ class TileThermometer extends SpatialTile(Material.piston) with SimpleComponent } } + def isOverThreshold: Boolean = + { + return detectedTemperature >= getThershold + } + + def getThershold: Int = + { + return threshold + } + override def getDescPacket: PacketAnnotation = { return new PacketAnnotation(this) @@ -188,16 +208,6 @@ class TileThermometer extends SpatialTile(Material.piston) with SimpleComponent return Array[Any](this.isOverThreshold) } - def isOverThreshold: Boolean = - { - return detectedTemperature >= getThershold - } - - def getThershold: Int = - { - return threshold - } - @Callback @Optional.Method(modid = "OpenComputers") def setWarningTemperature(context: Context, args: Arguments): Array[Any] = @@ -221,16 +231,6 @@ class TileThermometer extends SpatialTile(Material.piston) with SimpleComponent return Array[Any](this.threshold == args.checkInteger(0)) } - def setThreshold(newThreshold: Int) - { - threshold = newThreshold % TileThermometer.MAX_THRESHOLD - if (threshold <= 0) - { - threshold = TileThermometer.MAX_THRESHOLD - } - markUpdate - } - def getComponentName: String = { return "Thermometer" diff --git a/src/main/scala/edx/quantum/schematic/SchematicAccelerator.scala b/src/main/scala/edx/quantum/schematic/SchematicAccelerator.scala new file mode 100644 index 000000000..d857c6601 --- /dev/null +++ b/src/main/scala/edx/quantum/schematic/SchematicAccelerator.scala @@ -0,0 +1,39 @@ +package edx.quantum.schematic + +import java.util.HashMap + +import edx.quantum.QuantumContent +import net.minecraft.block.Block +import net.minecraft.init.Blocks +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.collection.Pair +import resonant.lib.transform.vector.Vector3 +import resonant.lib.world.schematic.Schematic + +class SchematicAccelerator extends Schematic +{ + override def getName: String = + { + return "schematic.accelerator.name" + } + + def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = + { + val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] + + //Bottom + returnMap.putAll(getBox(new Vector3(0, 0, 0), QuantumContent.blockElectromagnet, 1, size)) + returnMap.putAll(getBox(new Vector3(0, 0, 0), QuantumContent.blockElectromagnet, 0, size - 1)) + returnMap.putAll(getBox(new Vector3(0, 0, 0), QuantumContent.blockElectromagnet, 0, size + 1)) + //Mid + returnMap.putAll(getBox(new Vector3(0, 1, 0), Blocks.air, 0, size)) + returnMap.putAll(getBox(new Vector3(0, 1, 0), QuantumContent.blockElectromagnet, 1, size - 1)) + returnMap.putAll(getBox(new Vector3(0, 1, 0), QuantumContent.blockElectromagnet, 1, size + 1)) + //Top + returnMap.putAll(getBox(new Vector3(0, 2, 0), QuantumContent.blockElectromagnet, 1, size)) + returnMap.putAll(getBox(new Vector3(0, 2, 0), QuantumContent.blockElectromagnet, 0, size - 1)) + returnMap.putAll(getBox(new Vector3(0, 2, 0), QuantumContent.blockElectromagnet, 0, size + 1)) + + return returnMap + } +} \ No newline at end of file diff --git a/src/main/scala/edx/quantum/schematic/SchematicBreedingReactor.scala b/src/main/scala/edx/quantum/schematic/SchematicBreedingReactor.scala new file mode 100644 index 000000000..d63ffa5ed --- /dev/null +++ b/src/main/scala/edx/quantum/schematic/SchematicBreedingReactor.scala @@ -0,0 +1,63 @@ +package edx.quantum.schematic + +import java.util.HashMap + +import edx.quantum.QuantumContent +import net.minecraft.block.Block +import net.minecraft.init.Blocks +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.collection.Pair +import resonant.lib.transform.vector.Vector3 +import resonant.lib.world.schematic.Schematic + +class SchematicBreedingReactor extends Schematic +{ + override def getName: String = + { + return "schematic.breedingReactor.name" + } + + override def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = + { + val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] + var r: Int = Math.max(size, 2) + + for (x <- -r to r) + { + for (z <- -r to r) + { + returnMap.put(new Vector3(x, 0, z), new Pair[Block, Integer](Blocks.water, 0)) + } + } + + r -= 1 + + for (x <- -r to r) + { + for (z <- -r to r) + { + val targetPosition: Vector3 = new Vector3(x, 1, z) + if (new Vector3(x, 0, z).magnitude <= 2) + { + if (!((x == -r || x == r) && (z == -r || z == r))) + { + returnMap.put(new Vector3(x, 0, z), new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) + returnMap.put(new Vector3(x, -3, z), new Pair[Block, Integer](QuantumContent.blockSiren, 0)) + returnMap.put(new Vector3(x, -2, z), new Pair[Block, Integer](Blocks.redstone_wire, 0)) + } + else + { + returnMap.put(new Vector3(x, -1, z), new Pair[Block, Integer](QuantumContent.blockControlRod, 0)) + returnMap.put(new Vector3(x, -2, z), new Pair[Block, Integer](Blocks.piston, 1)) + } + } + } + } + + returnMap.put(new Vector3(0, -2, 0), new Pair[Block, Integer](Blocks.stone, 0)) + returnMap.put(new Vector3(0, -3, 0), new Pair[Block, Integer](Blocks.stone, 0)) + returnMap.put(new Vector3, new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) + return returnMap + } + +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/schematic/SchematicFissionReactor.scala b/src/main/scala/edx/quantum/schematic/SchematicFissionReactor.scala similarity index 90% rename from src/main/scala/resonantinduction/atomic/schematic/SchematicFissionReactor.scala rename to src/main/scala/edx/quantum/schematic/SchematicFissionReactor.scala index 463fce4b9..26beb99dc 100644 --- a/src/main/scala/resonantinduction/atomic/schematic/SchematicFissionReactor.scala +++ b/src/main/scala/edx/quantum/schematic/SchematicFissionReactor.scala @@ -1,14 +1,14 @@ -package resonantinduction.atomic.schematic +package edx.quantum.schematic import java.util.HashMap +import edx.quantum.QuantumContent import net.minecraft.block.Block import net.minecraft.init.Blocks import net.minecraftforge.common.util.ForgeDirection import resonant.lib.collection.Pair import resonant.lib.transform.vector.Vector3 import resonant.lib.world.schematic.Schematic -import resonantinduction.atomic.AtomicContent class SchematicFissionReactor extends Schematic { @@ -37,14 +37,14 @@ class SchematicFissionReactor extends Schematic returnMap.put(targetPosition, new Pair[Block, Integer](Block.getBlockFromName("electricTurbine"), 0)) if (!((x == -r || x == r) && (z == -r || z == r)) && new Vector3(x, 0, z).magnitude <= 1) { - returnMap.put(new Vector3(x, -1, z), new Pair[Block, Integer](AtomicContent.blockControlRod, 0)) + returnMap.put(new Vector3(x, -1, z), new Pair[Block, Integer](QuantumContent.blockControlRod, 0)) returnMap.put(new Vector3(x, -2, z), new Pair[Block, Integer](Blocks.sticky_piston, 1)) } } - returnMap.put(new Vector3(0, -3, 0), new Pair[Block, Integer](AtomicContent.blockSiren, 0)) + returnMap.put(new Vector3(0, -3, 0), new Pair[Block, Integer](QuantumContent.blockSiren, 0)) returnMap.put(new Vector3(0, -2, 0), new Pair[Block, Integer](Blocks.redstone_wire, 0)) - returnMap.put(new Vector3, new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) + returnMap.put(new Vector3, new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) } else { @@ -58,7 +58,7 @@ class SchematicFissionReactor extends Schematic { if (targetPosition.distance(leveledPosition) == 2) { - returnMap.put(targetPosition, new Pair[Block, Integer](AtomicContent.blockControlRod, 0)) + returnMap.put(targetPosition, new Pair[Block, Integer](QuantumContent.blockControlRod, 0)) var rotationMetadata: Int = 0 val offset: Vector3 = new Vector3(x, 0, z).normalize for (checkDir <- ForgeDirection.VALID_DIRECTIONS) @@ -76,7 +76,7 @@ class SchematicFissionReactor extends Schematic } else if (x == 0 && z == 0) { - returnMap.put(targetPosition, new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) + returnMap.put(targetPosition, new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) } else { diff --git a/src/main/scala/edx/quantum/schematic/SchematicFusionReactor.scala b/src/main/scala/edx/quantum/schematic/SchematicFusionReactor.scala new file mode 100644 index 000000000..84a173970 --- /dev/null +++ b/src/main/scala/edx/quantum/schematic/SchematicFusionReactor.scala @@ -0,0 +1,62 @@ +package edx.quantum.schematic + +import java.util.HashMap + +import edx.quantum.QuantumContent +import net.minecraft.block.Block +import net.minecraft.init.Blocks +import net.minecraftforge.common.util.ForgeDirection +import resonant.lib.collection.Pair +import resonant.lib.transform.vector.Vector3 +import resonant.lib.world.schematic.Schematic + +class SchematicFusionReactor extends Schematic +{ + override def getName: String = + { + return "schematic.fusionReactor.name" + } + + def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = + { + val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] + val r: Int = size + 2 + for (y <- 0 to size; x <- -r to r; z <- -r to r) + { + val position: Vector3 = new Vector3(x, y, z) + val magnitude: Double = Math.sqrt(x * x + z * z) + if (!returnMap.containsKey(position)) + { + returnMap.put(position, new Pair[Block, Integer](Blocks.air, 0)) + } + if (magnitude <= r) + { + if (y == 0 || y == size) + { + if (magnitude >= 1) + { + val yDeviation: Double = (if (y == 0) size / 3 else -size / 3) + (if (y == 0) -1 else 1) * Math.sin(magnitude / r * Math.PI) * size / 2d + val newPos: Vector3 = position.clone.add(0, yDeviation, 0) + returnMap.put(newPos.round, new Pair[Block, Integer](QuantumContent.blockElectromagnet, 1)) + } + } + else if (magnitude > r - 1) + { + returnMap.put(position, new Pair[Block, Integer](QuantumContent.blockElectromagnet, 0)) + } + } + } + + for (y <- 0 to size) + { + returnMap.put(new Vector3(0, y, 0), new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) + returnMap.put(new Vector3(1, y, 0), new Pair[Block, Integer](QuantumContent.blockElectromagnet, 0)) + returnMap.put(new Vector3(0, y, 1), new Pair[Block, Integer](QuantumContent.blockElectromagnet, 0)) + returnMap.put(new Vector3(0, y, -1), new Pair[Block, Integer](QuantumContent.blockElectromagnet, 0)) + returnMap.put(new Vector3(-1, y, 0), new Pair[Block, Integer](QuantumContent.blockElectromagnet, 0)) + + } + returnMap.put(new Vector3(0, 0, 0), new Pair[Block, Integer](QuantumContent.blockReactorCell, 0)) + return returnMap + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/ArchaicContent.scala b/src/main/scala/resonantinduction/archaic/ArchaicContent.scala deleted file mode 100644 index 89daf7976..000000000 --- a/src/main/scala/resonantinduction/archaic/ArchaicContent.scala +++ /dev/null @@ -1,88 +0,0 @@ -package resonantinduction.archaic - -import net.minecraft.block.Block -import net.minecraft.init.{Blocks, Items} -import net.minecraft.item.{Item, ItemStack} -import net.minecraftforge.oredict.OreDictionary -import resonant.lib.mod.content.ContentHolder -import resonant.lib.utility.recipe.UniversalRecipe -import resonantinduction.archaic.blocks.{ItemImprint, TileImprinter, TileTurntable} -import resonantinduction.archaic.engineering.ItemHammer -import resonantinduction.archaic.firebox.{TileFirebox, TileHotPlate} -import resonantinduction.archaic.fluid.grate.TileGrate -import resonantinduction.archaic.fluid.gutter.TileGutter -import resonantinduction.archaic.fluid.tank.TileTank -import resonantinduction.archaic.process.mixing.TileGlassJar -import resonantinduction.archaic.process.{TileCastingMold, TileMillstone, TileWorkbench} -import resonantinduction.core.resource.content.{ItemAlloyDust, TileDust} -import resonantinduction.core.{RICreativeTab, Reference} -import resonantinduction.mechanical.mech.gear.ItemHandCrank -; - -object ArchaicContent extends ContentHolder -{ - /** - * Resources - */ - var itemAlloyDust: Item = new ItemAlloyDust - var blockDust: Block = new TileDust - - var itemImprint: Item = new ItemImprint - var itemHammer: Item = new ItemHammer - var itemHandCrank: Item = new ItemHandCrank - - // var blockEngineeringTable: Block = new TileEngineeringTable - var blockCrate: Block = null - //manager.newBlock(classOf[BlockCrate]) - var blockImprinter: Block = new TileImprinter - var blockTurntable: Block = new TileTurntable - var blockFirebox: Block = new TileFirebox - var blockHotPlate: Block = new TileHotPlate - var blockMillstone: Block = new TileMillstone - var blockCast: Block = new TileCastingMold - //var blockFilter: Block = contentRegistry.newBlock( classOf[ TileFilter ] ) - var blockGrate: Block = new TileGrate - var blockGutter: Block = new TileGutter - var blockTank: Block = new TileTank - var blockWorkbench: Block = new TileWorkbench - var blockJar: Block = new TileGlassJar - - //Constructor - manager.setTab(RICreativeTab) - manager.setPrefix(Reference.prefix) - - override def postInit() - { - if (OreDictionary.getOres("cobblestone") == null) - { - OreDictionary.registerOre("cobblestone", Blocks.cobblestone) - } - - if (OreDictionary.getOres("stickWood") == null) - { - OreDictionary.registerOre("stickWood", Items.stick) - } - - // recipes += shaped(ArchaicContent.blockEngineeringTable, "P", "C", 'P', Blocks.wooden_pressure_plate, 'C', Blocks.crafting_table) - //recipes += shaped(ArchaicBlocks.blockFilter, "B", "P", "B", 'B', Blocks.iron_bars, 'P', Items.paper) - - //recipes += shaped(new ItemStack(ArchaicBlocks.blockCrate, 1, 0), "WWW", "WSW", "WWW", 'S', "stickWood", 'W', "logWood") - //recipes += new CrateRecipe(new ItemStack(ArchaicBlocks.blockCrate, 1, 1), "WWW", "WSW", "WWW", 'S', new ItemStack(ArchaicBlocks.blockCrate, 1, 0), 'W', "ingotIron") - //recipes +=new CrateRecipe(new ItemStack(ArchaicBlocks.blockCrate, 1, 2), "WWW", "WSW", "WWW", 'S', new ItemStack(ArchaicBlocks.blockCrate, 1, 1), 'W', UniversalRecipe.PRIMARY_METAL.get) - - recipes += shaped(ArchaicContent.blockFirebox, "III", "SFS", "SSS", 'I', Items.iron_ingot, 'F', Blocks.furnace, 'S', Blocks.stone) - recipes += shaped(new ItemStack(ArchaicContent.blockFirebox, 1, 1), "III", "SFS", "SSS", 'I', UniversalRecipe.PRIMARY_METAL.get, 'F', new ItemStack(ArchaicContent.blockFirebox, 1, 0), 'S', UniversalRecipe.WIRE.get) - recipes += shaped(ArchaicContent.blockImprinter, "SSS", "W W", "PPP", 'S', Blocks.stone, 'P', Blocks.piston, 'W', "logWood") - recipes += shaped(ArchaicContent.blockTurntable, "SSS", "PGP", "WWW", 'S', Blocks.stone, 'G', Items.redstone, 'P', Blocks.piston, 'W', "logWood") - recipes += shaped(ArchaicContent.blockCast, "I I", "IBI", "III", 'S', Items.iron_ingot, 'B', Blocks.iron_bars) - recipes += shaped(ArchaicContent.blockGutter, "S S", "I I", "III", 'S', Items.stick, 'I', "cobblestone") - recipes += shaped(ArchaicContent.blockGrate, "WBW", "B B", "WBW", 'B', Blocks.iron_bars, 'W', "plankWood") - recipes += shaped(ArchaicContent.blockHotPlate, "SSS", "III", 'I', Items.iron_ingot, 'S', Blocks.stone) - recipes += shaped(ArchaicContent.blockMillstone, "SPS", "SAS", "SSS", 'P', Blocks.piston, 'A', Items.stone_pickaxe, 'S', Blocks.stone) - recipes += shaped(ArchaicContent.blockTank, "GGG", "GSG", "GGG", 'G', Blocks.glass, 'S', Items.iron_ingot) - - recipes += shaped(itemHandCrank, "S ", "SSS", " S", 'S', "stickWood") - recipes += shaped(itemImprint, "PPP", "PIP", "PPP", 'P', Items.paper, 'I', new ItemStack(Items.dye, 0)) - recipes += shaped(itemHammer, "CC ", "CS ", " S", 'C', "cobblestone", 'S', "stickWood") - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/blocks/ItemImprint.scala b/src/main/scala/resonantinduction/archaic/blocks/ItemImprint.scala deleted file mode 100644 index 1b05238a8..000000000 --- a/src/main/scala/resonantinduction/archaic/blocks/ItemImprint.scala +++ /dev/null @@ -1,131 +0,0 @@ -package resonantinduction.archaic.blocks - -import java.util -import java.util.{ArrayList, List} - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.entity.{Entity, EntityList, EntityLivingBase, IProjectile} -import net.minecraft.item.{Item, ItemStack} -import net.minecraft.nbt.{NBTTagCompound, NBTTagList} -import resonant.lib.utility.LanguageUtility -import resonant.lib.utility.nbt.NBTUtility -import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.{Reference, RICreativeTab} - -import scala.collection.JavaConversions._ - -object ItemImprint -{ - /** - * Saves the list of items to filter out inside. - */ - def setFilters(itemStack: ItemStack, filterStacks: java.util.List[ItemStack]) - { - if (itemStack.getTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound) - } - val nbt: NBTTagList = new NBTTagList - import scala.collection.JavaConversions._ - for (filterStack <- filterStacks) - { - val newCompound: NBTTagCompound = new NBTTagCompound - filterStack.writeToNBT(newCompound) - nbt.appendTag(newCompound) - } - itemStack.getTagCompound.setTag("Items", nbt) - } - - def isFiltering(filter: ItemStack, itemStack: ItemStack): Boolean = - { - if (filter != null && itemStack != null) - { - val checkStacks: List[ItemStack] = getFilters(filter) - if (checkStacks != null) - { - import scala.collection.JavaConversions._ - for (stack <- checkStacks) - { - if (stack.isItemEqual(itemStack)) - { - return true - } - } - } - } - return false - } - - def getFilters(itemStack: ItemStack): List[ItemStack] = - { - val filterStacks: List[ItemStack] = new util.LinkedList[ItemStack] - val nbt: NBTTagCompound = NBTUtility.getNBTTagCompound(itemStack) - val tagList: NBTTagList = nbt.getTagList("Items", 0) - - for (i <- 0 to tagList.tagCount) - { - val var4: NBTTagCompound = tagList.getCompoundTagAt(i) - filterStacks.add(ItemStack.loadItemStackFromNBT(var4)) - } - - return filterStacks - } - - def getFilterList(itemStack: ItemStack): List[ItemStack] = - { - val filterStacks: List[ItemStack] = new ArrayList[ItemStack] - val nbt: NBTTagCompound = NBTUtility.getNBTTagCompound(itemStack) - val tagList: NBTTagList = nbt.getTagList("Items", 0) - - for (i <- 0 to tagList.tagCount) - { - val var4: NBTTagCompound = tagList.getCompoundTagAt(i) - filterStacks.add(ItemStack.loadItemStackFromNBT(var4)) - - } - return filterStacks - } -} - -class ItemImprint extends Item -{ - //Constructor - setUnlocalizedName(Reference.prefix + "imprint") - setTextureName(Reference.prefix + "imprint") - setCreativeTab(RICreativeTab) - setHasSubtypes(true) - setMaxStackSize(1) - - override def onLeftClickEntity(stack: ItemStack, player: EntityPlayer, entity: Entity): Boolean = - { - if (entity != null && !(entity.isInstanceOf[IProjectile]) && !(entity.isInstanceOf[EntityPlayer])) - { - val stringName: String = EntityList.getEntityString(entity) - return true - } - return false - } - - def itemInteractionForEntity(par1ItemStack: ItemStack, par2EntityLiving: EntityLivingBase): Boolean = - { - return false - } - - override def addInformation(itemStack: ItemStack, par2EntityPlayer: EntityPlayer, list: java.util.List[_], par4: Boolean) - { - val filterItems: List[ItemStack] = ItemImprint.getFilters(itemStack) - - if (filterItems.size > 0) - { - for (filterItem <- filterItems) - { - if(filterItem != null) - list.add(filterItem.getDisplayName) - } - } - else - { - list.add(LanguageUtility.getLocal("tooltip.noImprint")) - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/blocks/TileFilterable.scala b/src/main/scala/resonantinduction/archaic/blocks/TileFilterable.scala deleted file mode 100644 index bf553b23b..000000000 --- a/src/main/scala/resonantinduction/archaic/blocks/TileFilterable.scala +++ /dev/null @@ -1,153 +0,0 @@ -package resonantinduction.archaic.blocks - -import net.minecraft.block.material.Material -import net.minecraft.entity.item.EntityItem -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraftforge.common.util.ForgeDirection -import resonant.api.tile.{IRotatable, IFilterable} -import resonant.lib.prefab.tile.TileInventory -import resonant.lib.transform.vector.Vector3 - -object TileFilterable -{ - final val FILTER_SLOT: Int = 0 - final val BATERY_DRAIN_SLOT: Int = 1 -} - -abstract class TileFilterable(material: Material) extends TileInventory(material: Material) with IRotatable with IFilterable -{ - private var filterItem: ItemStack = null - private var inverted: Boolean = false - - def this() - { - this(Material.wood) - this.setSizeInventory(2) - } - - protected def isFunctioning: Boolean = - { - return true - } - - /** - * Allows filters to be placed inside of this block. - */ - override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean = - { - val containingStack: ItemStack = getFilter - if (containingStack != null) - { - if (!world.isRemote) - { - val dropStack: EntityItem = new EntityItem(world, player.posX, player.posY, player.posZ, containingStack) - dropStack.delayBeforeCanPickup = 0 - world.spawnEntityInWorld(dropStack) - } - setFilter(null) - return true - } - else - { - if (player.getCurrentEquippedItem != null) - { - if (player.getCurrentEquippedItem.getItem.isInstanceOf[ItemImprint]) - { - setFilter(player.getCurrentEquippedItem) - player.inventory.setInventorySlotContents(player.inventory.currentItem, null) - return true - } - } - } - return false - } - - override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = - { - toggleInversion - markUpdate - markRender - return true - } - - /** - * Looks through the things in the filter and finds out which item is being filtered. - * - * @return Is this filterable block filtering this specific ItemStack? - */ - def isFiltering(itemStack: ItemStack): Boolean = - { - if (this.getFilter != null && itemStack != null) - { - val checkStacks: java.util.List[ItemStack] = ItemImprint.getFilters(getFilter) - if (checkStacks != null) - { - import scala.collection.JavaConversions._ - for (stack <- checkStacks) - { - if (stack.isItemEqual(itemStack)) - { - return !inverted - } - } - } - } - return inverted - } - - def getFilter: ItemStack = - { - return this.filterItem - } - - def setFilter(filter: ItemStack) - { - this.filterItem = filter - this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) - } - - def isInverted: Boolean = - { - return this.inverted - } - - def setInverted(inverted: Boolean) - { - this.inverted = inverted - this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) - } - - def toggleInversion - { - setInverted(!isInverted) - } - - override def getDirection: ForgeDirection = - { - return ForgeDirection.getOrientation(if (getBlockType != null) getBlockMetadata else 0) - } - - override def setDirection(facingDirection: ForgeDirection) - { - this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal, 3) - } - - override def writeToNBT(nbt: NBTTagCompound) - { - super.writeToNBT(nbt) - nbt.setBoolean("inverted", inverted) - } - - override def readFromNBT(nbt: NBTTagCompound) - { - super.readFromNBT(nbt) - if (nbt.hasKey("filter")) - { - this.getInventory.setInventorySlotContents(0, ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter"))) - } - inverted = nbt.getBoolean("inverted") - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/crate/CrateRecipe.scala b/src/main/scala/resonantinduction/archaic/crate/CrateRecipe.scala deleted file mode 100644 index 7421166e1..000000000 --- a/src/main/scala/resonantinduction/archaic/crate/CrateRecipe.scala +++ /dev/null @@ -1,44 +0,0 @@ -package resonantinduction.archaic.crate - -import net.minecraft.block.Block -import net.minecraft.inventory.InventoryCrafting -import net.minecraft.item.{Item, ItemStack} -import net.minecraftforge.oredict.ShapedOreRecipe -import resonantinduction.archaic.ArchaicContent - -/** - * Crafting handler for crates - * - * @author Darkguardsman - */ -class CrateRecipe(result: ItemStack, recipe: AnyRef*) extends ShapedOreRecipe(result, recipe) -{ - def this(result: Block, recipe: AnyRef*) - { - this(new ItemStack(result), recipe) - } - - def this(result: Item, recipe: AnyRef*) - { - this(new ItemStack(result), recipe) - } - - override def getCraftingResult(grid: InventoryCrafting): ItemStack = - { - val result: ItemStack = super.getCraftingResult(grid) - val crateItem: Item = Item.getItemFromBlock(ArchaicContent.blockCrate) - if (result != null && result.getItem == crateItem) - { - val centerStack: ItemStack = grid.getStackInSlot(4) - if (centerStack != null && centerStack.getItem == crateItem) - { - val containedStack: ItemStack = ItemBlockCrate.getContainingItemStack(centerStack) - if (centerStack != null) - { - ItemBlockCrate.setContainingItemStack(result, containedStack) - } - } - } - return result - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/crate/PathfinderCrate.scala b/src/main/scala/resonantinduction/archaic/crate/PathfinderCrate.scala deleted file mode 100644 index 17b573f9e..000000000 --- a/src/main/scala/resonantinduction/archaic/crate/PathfinderCrate.scala +++ /dev/null @@ -1,116 +0,0 @@ -package resonantinduction.archaic.crate - -import java.util.{ArrayList, List} - -import net.minecraft.tileentity.TileEntity -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.transform.vector.VectorWorld - -/** - * A class that allows flexible path finding in Minecraft Blocks. Back Ported from UE 1.3.0. - *

- * TODO: Will need to change when MC 1.5 comes out. - * - * @author Calclavia - */ -object PathfinderCrate -{ - - - abstract trait IPathCallBack - { - /** - * Is this a valid node to search for? - * - * @return - */ - def isValidNode(finder: PathfinderCrate, direction: ForgeDirection, provider: TileEntity, node: TileEntity): Boolean - - /** - * Called when looping through nodes. - * - * @param finder - * @param provider - * @return True to stop the path finding operation. - */ - def onSearch(finder: PathfinderCrate, provider: TileEntity): Boolean - } - -} - -class PathfinderCrate -{ - /** - * A pathfinding call back interface used to call back on paths. - */ - var callBackCheck: PathfinderCrate.IPathCallBack = null - /** - * A list of nodes that the pathfinder went through. - */ - var iteratedNodes: List[TileEntity] = null - /** - * The results and findings found by the pathfinder. - */ - var results: List[Any] = null - - this.callBackCheck = new PathfinderCrate.IPathCallBack - { - def isValidNode(finder: PathfinderCrate, direction: ForgeDirection, provider: TileEntity, node: TileEntity): Boolean = - { - return node.isInstanceOf[TileCrate] - } - - def onSearch(finder: PathfinderCrate, provider: TileEntity): Boolean = - { - return false - } - } - this.clear - - def findNodes(provider: TileEntity): Boolean = - { - if (provider != null) - { - this.iteratedNodes.add(provider) - if (this.callBackCheck.onSearch(this, provider)) - { - return false - } - for (i <- 0 to 6) - { - val vec: VectorWorld = new VectorWorld(provider) - vec.addEquals(ForgeDirection.getOrientation(i)) - val connectedTile: TileEntity = vec.getTileEntity - if (!iteratedNodes.contains(connectedTile)) - { - if (this.callBackCheck.isValidNode(this, ForgeDirection.getOrientation(i), provider, connectedTile)) - { - if (!this.findNodes(connectedTile)) - { - return false - } - } - } - } - } - return true - } - - /** - * Called to execute the pathfinding operation. - */ - def init(provider: TileEntity): PathfinderCrate = - { - this.findNodes(provider) - return this - } - - def clear: PathfinderCrate = - { - this.iteratedNodes = new ArrayList[TileEntity] - this.results = new ArrayList[Any] - return this - } - - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.scala b/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.scala deleted file mode 100644 index accdd4291..000000000 --- a/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.scala +++ /dev/null @@ -1,685 +0,0 @@ -package resonantinduction.archaic.engineering - -import java.util.ArrayList - -import codechicken.multipart.ControlKeyModifer -import cpw.mods.fml.common.network.ByteBufUtils -import cpw.mods.fml.relauncher.{Side, SideOnly} -import io.netty.buffer.ByteBuf -import net.minecraft.block.Block -import net.minecraft.block.material.Material -import net.minecraft.client.renderer.texture.IIconRegister -import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP, InventoryPlayer} -import net.minecraft.inventory.{IInventory, ISidedInventory, InventoryCrafting} -import net.minecraft.item.crafting.CraftingManager -import net.minecraft.item.{Item, ItemStack} -import net.minecraft.nbt.{NBTTagCompound, NBTTagList} -import net.minecraft.network.Packet -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.{ChatComponentText, IIcon} -import net.minecraftforge.common.util.ForgeDirection -import net.minecraftforge.oredict.OreDictionary -import org.apache.commons.lang3.ArrayUtils -import org.lwjgl.opengl.GL11 -import resonant.api.gui.ISlotPickResult -import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} -import resonant.api.tile.IRotatable -import resonant.engine.ResonantEngine -import resonant.lib.collection.Pair -import resonant.lib.network.discriminator.{PacketTile, PacketType} -import resonant.lib.network.handle.IPacketReceiver -import resonant.lib.prefab.gui.ContainerDummy -import resonant.lib.prefab.tile.TileInventory -import resonant.lib.prefab.tile.item.ItemBlockSaved -import resonant.lib.render.RenderItemOverlayUtility -import resonant.lib.transform.region.Cuboid -import resonant.lib.transform.vector.{Vector2, Vector3} -import resonant.lib.utility.LanguageUtility -import resonant.lib.utility.inventory.AutoCraftingManager.IAutoCrafter -import resonant.lib.utility.inventory.{AutoCraftingManager, InventoryUtility} -import resonantinduction.archaic.blocks.ItemImprint -import resonantinduction.core.{Reference, ResonantInduction} - -import scala.collection.JavaConversions._ - -/** - * Advanced crafting table that stores its crafting grid, can craft out of the player's inv, and be - * configed to auto craft. - * - * @author DarkGuardsman, Calclavia - */ -object TileEngineeringTable -{ - val CRAFTING_MATRIX_END: Int = 9 - val CRAFTING_OUTPUT_END: Int = CRAFTING_MATRIX_END + 1 - val PLAYER_OUTPUT_END: Int = CRAFTING_OUTPUT_END + 40 - val CENTER_SLOT: Int = 4 - val CRAFTING_OUTPUT_SLOT: Int = 0 - /** - * 9 slots for crafting, 1 slot for a output. - */ - val CRAFTING_MATRIX_SIZE: Int = 9 - val craftingSlots: Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8) - - @SideOnly(Side.CLIENT) private var iconTop: IIcon = null - @SideOnly(Side.CLIENT) private var iconFront: IIcon = null - @SideOnly(Side.CLIENT) private var iconSide: IIcon = null -} - -class TileEngineeringTable extends TileInventory(Material.wood) with IPacketReceiver with IRotatable with ISidedInventory with ISlotPickResult with IAutoCrafter -{ - - var craftingMatrix: Array[ItemStack] = new Array[ItemStack](TileEngineeringTable.CRAFTING_MATRIX_SIZE) - /** - * The output inventory containing slots. - */ - var outputInventory: Array[ItemStack] = new Array[ItemStack](1) - /** - * The ability for the engineering table to search nearby inventories. - */ - var searchInventories: Boolean = true - private var craftManager: AutoCraftingManager = null - /** - * Temporary player inventory stored to draw the player's items. - */ - private var invPlayer: InventoryPlayer = null - private var playerSlots: Array[Int] = null - - //Constructor - bounds(new Cuboid(0, 0, 0, 1, 0.9f, 1)) - isOpaqueCube(false) - itemBlock(classOf[ItemBlockSaved]) - - @SideOnly(Side.CLIENT) - override def getIcon(side: Int, meta: Int): IIcon = - { - return if (side == 1) TileEngineeringTable.iconTop else (if (side == meta) TileEngineeringTable.iconFront else TileEngineeringTable.iconSide) - } - - @SideOnly(Side.CLIENT) - override def registerIcons(iconRegister: IIconRegister) - { - TileEngineeringTable.iconTop = iconRegister.registerIcon(getTextureName + "_top") - TileEngineeringTable.iconFront = iconRegister.registerIcon(getTextureName + "_front") - TileEngineeringTable.iconSide = iconRegister.registerIcon(getTextureName + "_side") - } - - override def click(player: EntityPlayer) - { - if (!world.isRemote && ControlKeyModifer.isControlDown(player)) - { - { - var i: Int = 0 - while (i < getSizeInventory - 1) - { - { - if (getStackInSlot(i) != null) - { - InventoryUtility.dropItemStack(world, new Vector3(player), getStackInSlot(i)) - setInventorySlotContents(i, null) - } - } - ({ - i += 1; - i - }) - } - } - } - } - - override def setInventorySlotContents(slot: Int, itemStack: ItemStack) - { - if (slot < TileEngineeringTable.CRAFTING_MATRIX_END) - { - craftingMatrix(slot) = itemStack - } - else if (slot < TileEngineeringTable.CRAFTING_OUTPUT_END) - { - outputInventory(slot - TileEngineeringTable.CRAFTING_MATRIX_END) = itemStack - } - else if (slot < TileEngineeringTable.PLAYER_OUTPUT_END && this.invPlayer != null) - { - this.invPlayer.setInventorySlotContents(slot - TileEngineeringTable.CRAFTING_OUTPUT_END, itemStack) - val player: EntityPlayer = this.invPlayer.player - if (player.isInstanceOf[EntityPlayerMP]) - { - (player.asInstanceOf[EntityPlayerMP]).sendContainerToPlayer(player.inventoryContainer) - } - } - else if (searchInventories) - { - var idDisplacement: Int = TileEngineeringTable.PLAYER_OUTPUT_END - for (dir <- ForgeDirection.VALID_DIRECTIONS) - { - val tile: TileEntity = toVectorWorld.add(dir).getTileEntity - if (tile.isInstanceOf[IInventory]) - { - val inventory: IInventory = tile.asInstanceOf[IInventory] - val slotID: Int = slot - idDisplacement - if (slotID >= 0 && slotID < inventory.getSizeInventory) - { - inventory.setInventorySlotContents(slotID, itemStack) - } - idDisplacement += inventory.getSizeInventory - } - } - } - onInventoryChanged - } - - /** - * Updates all the output slots. Call this to update the Engineering Table. - */ - override def onInventoryChanged - { - if (worldObj != null) - { - if (!worldObj.isRemote) - { - this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = null - var didCraft: Boolean = false - val inventoryCrafting: InventoryCrafting = this.getCraftingMatrix - val matrixOutput: ItemStack = CraftingManager.getInstance.findMatchingRecipe(inventoryCrafting, this.worldObj) - if (matrixOutput != null && this.getCraftingManager.getIdealRecipe(matrixOutput) != null) - { - this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = matrixOutput - didCraft = true - } - if (!didCraft) - { - val filterStack: ItemStack = craftingMatrix(TileEngineeringTable.CENTER_SLOT) - if (filterStack != null && filterStack.getItem.isInstanceOf[ItemImprint]) - { - val filters: java.util.List[ItemStack] = ItemImprint.getFilters(filterStack) - for (o <- filters) - { - val outputStack: ItemStack = o - if (outputStack != null) - { - val idealRecipe: Pair[ItemStack, Array[ItemStack]] = this.getCraftingManager.getIdealRecipe(outputStack) - if (idealRecipe != null) - { - val recipeOutput: ItemStack = idealRecipe.left - if (recipeOutput != null & recipeOutput.stackSize > 0) - { - this.outputInventory(TileEngineeringTable.CRAFTING_OUTPUT_SLOT) = recipeOutput - didCraft = true - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) - return - } - } - } - } - } - } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) - } - } - } - - /** - * Gets the AutoCraftingManager that does all the crafting results - */ - def getCraftingManager: AutoCraftingManager = - { - if (craftManager == null) - { - craftManager = new AutoCraftingManager(this) - } - return craftManager - } - - /** - * Construct an InventoryCrafting Matrix on the fly. - * - * @return - */ - def getCraftingMatrix: InventoryCrafting = - { - val inventoryCrafting: InventoryCrafting = new InventoryCrafting(new ContainerDummy(this), 3, 3) - - for (i <- 0 until this.craftingMatrix.length) - { - inventoryCrafting.setInventorySlotContents(i, this.craftingMatrix(i)) - } - return inventoryCrafting - } - - override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean = - { - if (player.getCurrentEquippedItem != null && player.getCurrentEquippedItem.getItem.isInstanceOf[ItemHammer]) - { - for (slot <- 0 to TileEngineeringTable.CRAFTING_OUTPUT_END) - { - val inputStack: ItemStack = getStackInSlot(slot) - if (inputStack != null) - { - val oreName: String = OreDictionary.getOreName(OreDictionary.getOreID(inputStack)) - if (oreName != null && !(oreName == "Unknown")) - { - val outputs: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.CRUSHER.name, oreName) - if (outputs != null && outputs.length > 0) - { - if (!world.isRemote && world.rand.nextFloat < 0.2) - { - for (resource <- outputs) - { - val outputStack: ItemStack = resource.getItemStack.copy - if (outputStack != null) - { - InventoryUtility.dropItemStack(world, new Vector3(player), outputStack, 0) - setInventorySlotContents(slot, if (({ - inputStack.stackSize -= 1; - inputStack.stackSize - }) <= 0) null - else inputStack) - } - } - } - ResonantInduction.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Item.getIdFromItem(inputStack.getItem), 1) - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, Reference.prefix + "hammer", 0.5f, 0.8f + (0.2f * world.rand.nextFloat)) - player.addExhaustion(0.1f) - player.getCurrentEquippedItem.damageItem(1, player) - return true - } - } - } - } - return true - } - if (hitSide == 1) - { - if (!world.isRemote) - { - val hitVector: Vector3 = new Vector3(hit.x, 0, hit.z) - val regionLength: Double = 1d / 3d - - for (j <- 0 to 3) - { - for (k <- 0 to 3) - { - val check: Vector2 = new Vector2(j, k).multiply(regionLength) - if (check.distance(hitVector.toVector2) < regionLength) - { - val slotID: Int = j * 3 + k - interactCurrentItem(this, slotID, player) - onInventoryChanged - return true - } - } - } - onInventoryChanged - } - return true - } - else if (hitSide != 0) - { - if (!world.isRemote) - { - setPlayerInventory(player.inventory) - var output: ItemStack = getStackInSlot(9) - var firstLoop: Boolean = true - while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) - { - onPickUpFromSlot(player, 9, output) - if (output.stackSize > 0) - { - InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) - } - setInventorySlotContents(9, null) - onInventoryChanged - output = getStackInSlot(9) - firstLoop = false - } - setPlayerInventory(null) - } - return true - } - return false - } - - /** - * Creates a "fake inventory" and hook the player up to the crafter to use the player's items. - */ - def setPlayerInventory(invPlayer: InventoryPlayer) - { - if (searchInventories) - { - if (invPlayer != null) - { - playerSlots = new Array[Int](invPlayer.getSizeInventory) - - for (i <- 0 until playerSlots.length) - { - playerSlots(i) = i + TileEngineeringTable.CRAFTING_OUTPUT_END - - } - } - else - { - playerSlots = null - } - this.invPlayer = invPlayer - } - } - - def onPickUpFromSlot(entityPlayer: EntityPlayer, slotID: Int, itemStack: ItemStack) - { - if (!worldObj.isRemote) - { - if (itemStack != null) - { - val idealRecipeItem: Pair[ItemStack, Array[ItemStack]] = getCraftingManager.getIdealRecipe(itemStack) - if (idealRecipeItem != null) - { - getCraftingManager.consumeItems(idealRecipeItem.right.clone: _*) - } - else - { - itemStack.stackSize = 0 - } - } - } - } - - override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = - { - if (player.isSneaking) - { - searchInventories = !searchInventories - if (!world.isRemote) - { - if (searchInventories) - { - player.addChatMessage(new ChatComponentText(LanguageUtility.getLocal("engineerTable.config.inventory.true"))) - } - else - { - player.addChatMessage(new ChatComponentText(LanguageUtility.getLocal("engineerTable.config.inventory.false"))) - } - } - markUpdate - return true - } - return super.configure(player, side, hit) - } - - override def getDrops(metadata: Int, fortune: Int): ArrayList[ItemStack] = new ArrayList[ItemStack] - - override def onRemove(block: Block, par6: Int) - { - val stack: ItemStack = ItemBlockSaved.getItemStackWithNBT(block, world, xi, yi, zi) - InventoryUtility.dropItemStack(world, center, stack) - } - - override def canUpdate: Boolean = - { - return false - } - - override def getDescriptionPacket: Packet = - { - val nbt: NBTTagCompound = new NBTTagCompound - this.writeToNBT(nbt) - return ResonantEngine.packetHandler.toMCPacket(new PacketTile(this, nbt)) - } - - /** - * Writes a tile entity to NBT. - */ - override def writeToNBT(nbt: NBTTagCompound) - { - super.writeToNBT(nbt) - val nbtList: NBTTagList = new NBTTagList - - for (i <- 0 to this.getSizeInventory) - { - if (this.getStackInSlot(i) != null) - { - val var4: NBTTagCompound = new NBTTagCompound - var4.setByte("Slot", i.asInstanceOf[Byte]) - this.getStackInSlot(i).writeToNBT(var4) - nbtList.appendTag(var4) - } - } - nbt.setTag("Items", nbtList) - nbt.setBoolean("searchInventories", this.searchInventories) - } - - /** - * DO NOT USE THIS INTERNALLY. FOR EXTERNAL USE ONLY! - */ - override def getStackInSlot(slot: Int): ItemStack = - { - if (slot < TileEngineeringTable.CRAFTING_MATRIX_END) - { - return this.craftingMatrix(slot) - } - else if (slot < TileEngineeringTable.CRAFTING_OUTPUT_END) - { - return outputInventory(slot - TileEngineeringTable.CRAFTING_MATRIX_END) - } - else if (slot < TileEngineeringTable.PLAYER_OUTPUT_END && invPlayer != null) - { - return this.invPlayer.getStackInSlot(slot - TileEngineeringTable.CRAFTING_OUTPUT_END) - } - else if (searchInventories) - { - var idDisplacement: Int = TileEngineeringTable.PLAYER_OUTPUT_END - for (dir <- ForgeDirection.VALID_DIRECTIONS) - { - val tile: TileEntity = toVectorWorld.add(dir).getTileEntity - if (tile.isInstanceOf[IInventory]) - { - val inventory: IInventory = tile.asInstanceOf[IInventory] - val slotID: Int = slot - idDisplacement - if (slotID >= 0 && slotID < inventory.getSizeInventory) - { - return inventory.getStackInSlot(slotID) - } - idDisplacement += inventory.getSizeInventory - } - } - } - return null - } - - override def getSizeInventory: Int = - { - return 10 + (if (this.invPlayer != null) this.invPlayer.getSizeInventory else 0) - } - - def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) - { - try - { - readFromNBT(ByteBufUtils.readTag(data)) - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } - - /** - * NBT Data - */ - override def readFromNBT(nbt: NBTTagCompound) - { - super.readFromNBT(nbt) - val nbtList: NBTTagList = nbt.getTagList("Items", 0) - this.craftingMatrix = new Array[ItemStack](9) - this.outputInventory = new Array[ItemStack](1) - - for (i <- 0 to nbtList.tagCount) - { - val stackTag: NBTTagCompound = nbtList.getCompoundTagAt(i) - val id: Byte = stackTag.getByte("Slot") - if (id >= 0 && id < this.getSizeInventory) - { - this.setInventorySlotContents(id, ItemStack.loadItemStackFromNBT(stackTag)) - } - } - - this.searchInventories = nbt.getBoolean("searchInventories") - } - - override def decrStackSize(i: Int, amount: Int): ItemStack = - { - if (getStackInSlot(i) != null) - { - var stack: ItemStack = null - if (getStackInSlot(i).stackSize <= amount) - { - stack = getStackInSlot(i) - setInventorySlotContents(i, null) - return stack - } - else - { - stack = getStackInSlot(i).splitStack(amount) - if (getStackInSlot(i).stackSize == 0) - { - setInventorySlotContents(i, null) - } - return stack - } - } - else - { - return null - } - } - - /** - * When some containers are closed they call this on each slot, then drop whatever it returns as - * an EntityItem - like when you close a workbench GUI. - */ - override def getStackInSlotOnClosing(slot: Int): ItemStack = - { - if (this.getStackInSlot(slot) != null) - { - val var2: ItemStack = this.getStackInSlot(slot) - this.setInventorySlotContents(slot, null) - return var2 - } - else - { - return null - } - } - - override def isItemValidForSlot(i: Int, itemstack: ItemStack): Boolean = - { - return true - } - - override def getInventoryStackLimit: Int = - { - return 64 - } - - override def isUseableByPlayer(entityplayer: EntityPlayer): Boolean = - { - return if (this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) ne this) false else entityplayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) <= 64.0D - } - - override def getAccessibleSlotsFromSide(side: Int): Array[Int] = - { - return new Array[Int](0) - } - - /** - * Auto-crafting methods. - */ - override def canInsertItem(slot: Int, itemstack: ItemStack, side: Int): Boolean = - { - if (getStackInSlot(4) != null && getStackInSlot(4).getItem.isInstanceOf[ItemImprint]) - { - return true - } - var minSize: Int = 64 - var optimalSlot: Int = -1 - - for (i <- 0 to craftingMatrix.length) - { - val checkStack: ItemStack = getStackInSlot(i) - if (checkStack != null && checkStack.isItemEqual(itemstack)) - { - if (checkStack.stackSize < minSize || optimalSlot < 0) - { - optimalSlot = i - minSize = checkStack.stackSize - } - } - } - return slot == optimalSlot - } - - override def canExtractItem(slot: Int, itemstack: ItemStack, side: Int): Boolean = - { - val outputStack: ItemStack = getStackInSlot(TileEngineeringTable.CRAFTING_MATRIX_END) - if (outputStack != null) - { - val idealRecipeItem: Pair[ItemStack, Array[ItemStack]] = this.getCraftingManager.getIdealRecipe(outputStack) - val doubleResults: Array[ItemStack] = ArrayUtils.addAll(idealRecipeItem.right, idealRecipeItem.right: _*) - if (!getCraftingManager.consumeItems(false, doubleResults : _*)) - { - return false - } - } - return slot == TileEngineeringTable.CRAFTING_MATRIX_END - } - - def getCraftingInv: Array[Int] = - { - var slots: Array[Int] = TileEngineeringTable.craftingSlots - if (playerSlots != null) - { - slots = ArrayUtils.addAll(playerSlots, slots: _*) - } - if (searchInventories) - { - var temporaryInvID: Int = TileEngineeringTable.PLAYER_OUTPUT_END - for (dir <- ForgeDirection.VALID_DIRECTIONS) - { - val tile: TileEntity = toVectorWorld.add(dir).getTileEntity(worldObj) - if (tile.isInstanceOf[IInventory]) - { - val inventory: IInventory = tile.asInstanceOf[IInventory] - val nearbySlots: Array[Int] = new Array[Int](inventory.getSizeInventory) - - for (i <- 0 to inventory.getSizeInventory) - { - temporaryInvID = temporaryInvID + 1; - nearbySlots(i) = temporaryInvID; - - } - slots = ArrayUtils.addAll(nearbySlots, slots: _*) - } - } - } - return slots - } - - override def renderDynamic(position: Vector3, frame: Float, pass: Int) - { - GL11.glPushMatrix - RenderItemOverlayUtility.renderItemOnSides(TileEngineeringTable.this, getStackInSlot(9), position.x, position.y, position.z) - RenderItemOverlayUtility.renderTopOverlay(TileEngineeringTable.this, craftingMatrix, getDirection, position.x, position.y - 0.1, position.z) - GL11.glPopMatrix - } - - override def getDirection: ForgeDirection = - { - return null - } - - override def setDirection(direction: ForgeDirection) - { - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.scala b/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.scala deleted file mode 100644 index b89ae7e01..000000000 --- a/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.scala +++ /dev/null @@ -1,24 +0,0 @@ -package resonantinduction.archaic.firebox - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.RenderBlocks -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.render.RenderItemOverlayUtility - -@SideOnly(Side.CLIENT) class RenderHotPlate extends TileEntitySpecialRenderer -{ - private final val renderBlocks: RenderBlocks = new RenderBlocks - - def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) - { - if (tileEntity.isInstanceOf[TileHotPlate]) - { - val tile: TileHotPlate = tileEntity.asInstanceOf[TileHotPlate] - RenderItemOverlayUtility.renderTopOverlay(tileEntity, tile.getInventory.getContainedItems, ForgeDirection.EAST, 2, 2, x, y - 0.8, z, 1f) - } - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.scala b/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.scala deleted file mode 100644 index 479360346..000000000 --- a/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.scala +++ /dev/null @@ -1,41 +0,0 @@ -package resonantinduction.archaic.process - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderItemOverlayUtility -import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderCastingMold -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "castingMold.tcn")) - var INSTANCE: RenderCastingMold = new RenderCastingMold -} - -@SideOnly(Side.CLIENT) class RenderCastingMold extends TileEntitySpecialRenderer -{ - def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) - { - if (tileEntity.isInstanceOf[TileCastingMold]) - { - val tile: TileCastingMold = tileEntity.asInstanceOf[TileCastingMold] - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - GL11.glTranslated(0, -0.25, 0) - GL11.glScalef(0.5f, 0.5f, 0.5f) - RenderUtility.bind(Reference.domain, Reference.modelPath + "castingMold.png") - RenderCastingMold.MODEL.renderAll - GL11.glPopMatrix - if (tile.getWorldObj != null) - { - RenderItemOverlayUtility.renderItemOnSides(tileEntity, tile.getStackInSlot(0), x, y, z, "") - } - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/process/RenderMillstone.scala b/src/main/scala/resonantinduction/archaic/process/RenderMillstone.scala deleted file mode 100644 index 0371d02db..000000000 --- a/src/main/scala/resonantinduction/archaic/process/RenderMillstone.scala +++ /dev/null @@ -1,24 +0,0 @@ -package resonantinduction.archaic.process - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.RenderBlocks -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import resonant.lib.render.RenderItemOverlayUtility - -@SideOnly(Side.CLIENT) -class RenderMillstone extends TileEntitySpecialRenderer -{ - private final val renderBlocks: RenderBlocks = new RenderBlocks - - def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) - { - if (tileEntity.isInstanceOf[TileMillstone]) - { - val tile: TileMillstone = tileEntity.asInstanceOf[TileMillstone] - RenderItemOverlayUtility.renderItemOnSides(tileEntity, tile.getStackInSlot(0), x, y, z, "") - } - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/process/TileCastingMold.scala b/src/main/scala/resonantinduction/archaic/process/TileCastingMold.scala deleted file mode 100644 index 43ad7aa4a..000000000 --- a/src/main/scala/resonantinduction/archaic/process/TileCastingMold.scala +++ /dev/null @@ -1,165 +0,0 @@ -package resonantinduction.archaic.process - -import cpw.mods.fml.common.network.ByteBufUtils -import io.netty.buffer.ByteBuf -import net.minecraft.block.material.Material -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraftforge.common.util.ForgeDirection -import net.minecraftforge.fluids._ -import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} -import resonant.lib.network.discriminator.{PacketTile, PacketType} -import resonant.lib.network.handle.IPacketReceiver -import resonant.lib.prefab.tile.TileInventory -import resonant.lib.transform.vector.Vector3 -import resonant.lib.utility.FluidUtility -import resonant.lib.utility.inventory.InventoryUtility -import resonantinduction.core.Reference - -/** - * Turns molten fuilds into ingots. - *

- * 1 cubed meter of molten fluid = 1 block - * Approximately 100-110 L of fluid = 1 ingot. - - * @author Calclavia - */ -class TileCastingMold extends TileInventory(Material.rock) with IFluidHandler with IPacketReceiver -{ - private final val amountPerIngot: Int = 100 - protected var tank: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME) - - //Constructor - setTextureName(Reference.prefix + "material_metal_side") - normalRender = false - isOpaqueCube = false - - override def canUpdate: Boolean = - { - return false - } - - override def getDescPacket: PacketTile = - { - val nbt: NBTTagCompound = new NBTTagCompound - this.writeToNBT(nbt) - return new PacketTile(this, nbt) - } - - override def writeToNBT(tag: NBTTagCompound) - { - super.writeToNBT(tag) - tank.readFromNBT(tag) - } - - def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) - { - try - { - this.readFromNBT(ByteBufUtils.readTag(data)) - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } - - override def readFromNBT(tag: NBTTagCompound) - { - super.readFromNBT(tag) - tank.writeToNBT(tag) - } - - def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = - { - val fill: Int = tank.fill(resource, doFill) - updateEntity - return fill - } - - def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = - { - return null - } - - def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = - { - return null - } - - def canFill(from: ForgeDirection, fluid: Fluid): Boolean = - { - return fluid != null && fluid.getName.contains("molten") - } - - def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = - { - return false - } - - def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = - { - return Array[FluidTankInfo](tank.getInfo) - } - - override def click(player: EntityPlayer) - { - if (!world.isRemote) - { - val output: ItemStack = getStackInSlot(0) - if (output != null) - { - InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) - setInventorySlotContents(0, null) - } - onInventoryChanged - } - } - - override def onInventoryChanged - { - if (worldObj != null) - { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord) - } - } - - override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean = - { - update - val current: ItemStack = player.inventory.getCurrentItem - val output: ItemStack = getStackInSlot(0) - if (output != null) - { - InventoryUtility.dropItemStack(world, new Vector3(player), output, 0) - setInventorySlotContents(0, null) - } - return true - } - - override def update - { - val checkPos: Vector3 = toVector3.add(0, 1, 0) - val drainStack: FluidStack = FluidUtility.drainBlock(worldObj, checkPos, false) - if (MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, drainStack).length > 0) - { - if (drainStack.amount == tank.fill(drainStack, false)) - { - tank.fill(FluidUtility.drainBlock(worldObj, checkPos, true), true) - } - } - while (tank.getFluidAmount >= amountPerIngot && (getStackInSlot(0) == null || getStackInSlot(0).stackSize < getStackInSlot(0).getMaxStackSize)) - { - val outputs: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, tank.getFluid) - for (output <- outputs) - { - incrStackSize(0, output.getItemStack) - } - tank.drain(amountPerIngot, true) - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/waila/Waila.scala b/src/main/scala/resonantinduction/archaic/waila/Waila.scala deleted file mode 100644 index 77e3e3635..000000000 --- a/src/main/scala/resonantinduction/archaic/waila/Waila.scala +++ /dev/null @@ -1,30 +0,0 @@ -package resonantinduction.archaic.waila - -import cpw.mods.fml.common.event.FMLInterModComms -import resonant.lib.mod.compat.Mods -import resonant.lib.mod.loadable.ICompatProxy - -/** - * @author tgame14 - * @since 21/03/14 - */ -class Waila extends ICompatProxy -{ - def preInit - { - } - - def init - { - FMLInterModComms.sendMessage(Mods.WAILA, "register", "resonantinduction.archaic.waila.WailaRegistrar.wailaCallBack") - } - - def postInit - { - } - - def modId: String = - { - return Mods.WAILA - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/waila/WailaCrate.scala b/src/main/scala/resonantinduction/archaic/waila/WailaCrate.scala deleted file mode 100644 index 25b306539..000000000 --- a/src/main/scala/resonantinduction/archaic/waila/WailaCrate.scala +++ /dev/null @@ -1,53 +0,0 @@ -package resonantinduction.archaic.waila - -import mcp.mobius.waila.api.IWailaConfigHandler -import mcp.mobius.waila.api.IWailaDataAccessor -import mcp.mobius.waila.api.IWailaDataProvider -import net.minecraft.item.ItemStack -import net.minecraft.tileentity.TileEntity -import resonant.lib.utility.LanguageUtility -import resonantinduction.archaic.crate.TileCrate -import java.util.List - -/** - * Waila support for crates - * - * @author Darkguardsman - */ -class WailaCrate extends IWailaDataProvider -{ - override def getWailaBody(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - val tile: TileEntity = accessor.getTileEntity - if (tile.isInstanceOf[TileCrate]) - { - val stored: ItemStack = (tile.asInstanceOf[TileCrate]).getSampleStack - val cap: Int = (tile.asInstanceOf[TileCrate]).getSlotCount * 64 - if (stored != null) - { - currenttip.add(LanguageUtility.getLocal("info.waila.crate.stack") + " " + stored.getDisplayName) - currenttip.add(LanguageUtility.getLocal("info.waila.crate.stored") + " " + stored.stackSize + " / " + cap) - } - else - { - currenttip.add(LanguageUtility.getLocal("info.waila.crate.empty")) - } - } - return currenttip - } - - override def getWailaHead(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - return currenttip - } - - override def getWailaStack(accessor: IWailaDataAccessor, config: IWailaConfigHandler): ItemStack = - { - return null - } - - override def getWailaTail(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - return currenttip - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.scala b/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.scala deleted file mode 100644 index e59db7137..000000000 --- a/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.scala +++ /dev/null @@ -1,49 +0,0 @@ -package resonantinduction.archaic.waila - -import mcp.mobius.waila.api.IWailaConfigHandler -import mcp.mobius.waila.api.IWailaDataAccessor -import mcp.mobius.waila.api.IWailaDataProvider -import net.minecraft.item.ItemStack -import net.minecraft.tileentity.TileEntity -import net.minecraftforge.fluids.IFluidTank -import resonant.lib.utility.LanguageUtility -import resonantinduction.archaic.fluid.tank.TileTank -import java.util.List - -/** - * Waila support for tanks - * - * @author Darkguardsman - */ -class WailaFluidTank extends IWailaDataProvider -{ - override def getWailaBody(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - val tile: TileEntity = accessor.getTileEntity - if (tile.isInstanceOf[TileTank]) - { - val tank: IFluidTank = tile.asInstanceOf[TileTank].fluidNode - if (tank != null && tank.getFluid != null) - { - currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid.getFluid.getLocalizedName) - currenttip.add(LanguageUtility.getLocal("info.waila.tank.vol") + " " + tank.getFluidAmount + " / " + tank.getCapacity) - } - } - return currenttip - } - - override def getWailaHead(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - return currenttip - } - - override def getWailaStack(accessor: IWailaDataAccessor, config: IWailaConfigHandler): ItemStack = - { - return null - } - - override def getWailaTail(itemStack: ItemStack, currenttip: List[String], accessor: IWailaDataAccessor, config: IWailaConfigHandler): List[String] = - { - return currenttip - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.scala b/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.scala deleted file mode 100644 index 663403058..000000000 --- a/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.scala +++ /dev/null @@ -1,14 +0,0 @@ -package resonantinduction.archaic.waila - -import mcp.mobius.waila.api.IWailaRegistrar -import resonantinduction.archaic.crate.TileCrate -import resonantinduction.archaic.fluid.tank.TileTank - -object WailaRegistrar -{ - def wailaCallBack(registrar: IWailaRegistrar) - { - registrar.registerBodyProvider(new WailaCrate, classOf[TileCrate]) - registrar.registerBodyProvider(new WailaFluidTank, classOf[TileTank]) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/blocks/BlockRadioactive.scala b/src/main/scala/resonantinduction/atomic/blocks/BlockRadioactive.scala deleted file mode 100644 index c6047a6fe..000000000 --- a/src/main/scala/resonantinduction/atomic/blocks/BlockRadioactive.scala +++ /dev/null @@ -1,119 +0,0 @@ -package resonantinduction.atomic.blocks - -import java.util.{List, Random} - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.block.Block -import net.minecraft.block.material.Material -import net.minecraft.client.Minecraft -import net.minecraft.client.particle.EntitySmokeFX -import net.minecraft.client.renderer.texture.IIconRegister -import net.minecraft.entity.{Entity, EntityLiving, EntityLivingBase} -import net.minecraft.init.Blocks -import net.minecraft.util.{AxisAlignedBB, IIcon} -import net.minecraft.world.World -import resonant.lib.prefab.poison.PoisonRadiation -import resonant.lib.transform.vector.Vector3 -import scala.collection.JavaConversions._ - -class BlockRadioactive(material: Material) extends Block(material) -{ - var canSpread: Boolean = true - var radius: Float = 5 - var amplifier: Int = 2 - var canWalkPoison: Boolean = true - var isRandomlyRadioactive: Boolean = true - var spawnParticle: Boolean = true - private var iconTop: IIcon = null - private var iconBottom: IIcon = null - - //Constructor - this.setTickRandomly(true) - this.setHardness(0.2F) - - override def getIcon(side: Int, metadata: Int): IIcon = - { - return if (side == 1) this.iconTop else (if (side == 0) this.iconBottom else this.blockIcon) - } - - @SideOnly(Side.CLIENT) override def registerBlockIcons(iconRegister: IIconRegister) - { - super.registerBlockIcons(iconRegister) - this.iconTop = iconRegister.registerIcon(this.getUnlocalizedName.replace("tile.", "") + "_top") - this.iconBottom = iconRegister.registerIcon(this.getUnlocalizedName.replace("tile.", "") + "_bottom") - } - - /** - * Ticks the block if it's been scheduled - */ - override def updateTick(world: World, x: Int, y: Int, z: Int, rand: Random) - { - if (!world.isRemote) - { - if (this.isRandomlyRadioactive) - { - val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(x - this.radius, y - this.radius, z - this.radius, x + this.radius, y + this.radius, z + this.radius) - val entitiesNearby: List[_] = world.getEntitiesWithinAABB(classOf[EntityLivingBase], bounds) - for (entity <- entitiesNearby) - { - PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), entity.asInstanceOf[EntityLiving], amplifier) - } - } - if (this.canSpread) - { - for (i <- 0 to 4) - { - val newX: Int = x + rand.nextInt(3) - 1 - val newY: Int = y + rand.nextInt(5) - 3 - val newZ: Int = z + rand.nextInt(3) - 1 - val block: Block = world.getBlock(newX, newY, newZ) - if (rand.nextFloat > 0.4 && (block == Blocks.farmland || block == Blocks.grass)) - { - world.setBlock(newX, newY, newZ, this) - } - } - if (rand.nextFloat > 0.85) - { - world.setBlock(x, y, z, Blocks.dirt) - } - } - } - } - - /** - * Called whenever an entity is walking on top of this block. Args: world, x, y, z, entity - */ - override def onEntityWalking(par1World: World, x: Int, y: Int, z: Int, par5Entity: Entity) - { - if (par5Entity.isInstanceOf[EntityLiving] && this.canWalkPoison) - { - PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), par5Entity.asInstanceOf[EntityLiving]) - } - } - - override def quantityDropped(par1Random: Random): Int = - { - return 0 - } - - @SideOnly(Side.CLIENT) override def randomDisplayTick(world: World, x: Int, y: Int, z: Int, par5Random: Random) - { - if (this.spawnParticle) - { - if (Minecraft.getMinecraft.gameSettings.particleSetting == 0) - { - val radius: Int = 3 - for(i <- 0 to 2) - { - val pos: Vector3 = new Vector3(x, y, z) - pos.add(Math.random * radius - radius / 2, Math.random * radius - radius / 2, Math.random * radius - radius / 2) - val fx: EntitySmokeFX = new EntitySmokeFX(world, pos.x, pos.y, pos.z, (Math.random - 0.5) / 2, (Math.random - 0.5) / 2, (Math.random - 0.5) / 2) - fx.setRBGColorF(0.2f, 0.8f, 0) - Minecraft.getMinecraft.effectRenderer.addEffect(fx) - - } - } - } - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/blocks/BlockToxicWaste.scala b/src/main/scala/resonantinduction/atomic/blocks/BlockToxicWaste.scala deleted file mode 100644 index 7b353dc0c..000000000 --- a/src/main/scala/resonantinduction/atomic/blocks/BlockToxicWaste.scala +++ /dev/null @@ -1,43 +0,0 @@ -package resonantinduction.atomic.blocks - -import java.util.Random - -import net.minecraft.block.material.Material -import net.minecraft.entity.{Entity, EntityLivingBase} -import net.minecraft.util.DamageSource -import net.minecraft.world.World -import net.minecraftforge.fluids.BlockFluidClassic -import resonant.lib.prefab.poison.PoisonRadiation -import resonantinduction.atomic.AtomicContent -import resonant.lib.transform.vector.Vector3 - -class BlockToxicWaste extends BlockFluidClassic(AtomicContent.getFluidToxicWaste, Material.water) -{ - //Constructor - setTickRate(20) - - override def randomDisplayTick(par1World: World, x: Int, y: Int, z: Int, par5Random: Random) - { - super.randomDisplayTick(par1World, x, y, z, par5Random) - if (par5Random.nextInt(100) == 0) - { - val d5: Double = x + par5Random.nextFloat - val d7: Double = y + this.maxY - val d6: Double = z + par5Random.nextFloat - par1World.spawnParticle("suspended", d5, d7, d6, 0.0D, 0.0D, 0.0D) - } - if (par5Random.nextInt(200) == 0) - { - par1World.playSound(x, y, z, "liquid.lava", 0.2F + par5Random.nextFloat * 0.2F, 0.9F + par5Random.nextFloat * 0.15F, false) - } - } - - override def onEntityCollidedWithBlock(par1World: World, x: Int, y: Int, z: Int, entity: Entity) - { - if (entity.isInstanceOf[EntityLivingBase]) - { - entity.attackEntityFrom(DamageSource.wither, 3) - PoisonRadiation.INSTANCE.poisonEntity(new Vector3(x, y, z), entity.asInstanceOf[EntityLivingBase], 4) - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/blocks/BlockUraniumOre.scala b/src/main/scala/resonantinduction/atomic/blocks/BlockUraniumOre.scala deleted file mode 100644 index 48be14ef1..000000000 --- a/src/main/scala/resonantinduction/atomic/blocks/BlockUraniumOre.scala +++ /dev/null @@ -1,39 +0,0 @@ -package resonantinduction.atomic.blocks - -import java.util.Random - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.block.material.Material -import net.minecraft.world.World -import resonantinduction.core.{Reference, Settings} - -/** - * Uranium ore block - */ -class BlockUraniumOre extends BlockRadioactive(Material.rock) -{ - //Constructor - this.setBlockName(Reference.prefix + "oreUranium") - this.setStepSound(net.minecraft.block.Block.soundTypeStone) - this.setHardness(2f) - this.setBlockTextureName(Reference.prefix + "oreUranium") - this.isRandomlyRadioactive = Settings.allowRadioactiveOres - this.canWalkPoison = Settings.allowRadioactiveOres - this.canSpread = false - this.radius = 1f - this.amplifier = 0 - this.spawnParticle = true - - @SideOnly(Side.CLIENT) override def randomDisplayTick(world: World, x: Int, y: Int, z: Int, par5Random: Random) - { - if (Settings.allowRadioactiveOres) - { - super.randomDisplayTick(world, x, y, z, par5Random) - } - } - - override def quantityDropped(par1Random: Random): Int = - { - return 1 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/blocks/TileElectromagnet.scala b/src/main/scala/resonantinduction/atomic/blocks/TileElectromagnet.scala deleted file mode 100644 index c975cfc3f..000000000 --- a/src/main/scala/resonantinduction/atomic/blocks/TileElectromagnet.scala +++ /dev/null @@ -1,128 +0,0 @@ -package resonantinduction.atomic.blocks - -import java.util.List - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.block.material.Material -import net.minecraft.client.renderer.texture.IIconRegister -import net.minecraft.creativetab.CreativeTabs -import net.minecraft.item.{Item, ItemStack} -import net.minecraft.util.IIcon -import net.minecraft.world.IBlockAccess -import net.minecraftforge.common.util.ForgeDirection -import org.lwjgl.opengl.GL11._ -import resonant.api.tile.IElectromagnet -import resonant.lib.prefab.tile.item.ItemBlockMetadata -import resonant.lib.prefab.tile.spatial.SpatialBlock -import resonant.lib.render.{RenderBlockUtility, RenderUtility} -import resonant.lib.world.WorldUtility -import resonant.lib.wrapper.WrapList._ -import resonant.lib.transform.vector.Vector3 - -/** - * Electromagnet block - */ -class TileElectromagnet extends SpatialBlock(Material.iron) with IElectromagnet -{ - private var iconTop: IIcon = null - private var iconGlass: IIcon = null - private val edgeTexture: String = "stone" - - //Constructor - blockResistance = 20 - forceItemToRenderAsBlock = true - normalRender = false - isOpaqueCube = false - renderStaticBlock = true - this.itemBlock(classOf[ItemBlockMetadata]) - - override def getIcon(side: Int, metadata: Int): IIcon = - { - if (metadata == 1) - { - return iconGlass - } - if (side == 0 || side == 1) - { - return iconTop - } - return super.getIcon(side, metadata) - } - - @SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister) - { - super.registerIcons(iconRegister) - iconTop = iconRegister.registerIcon(domain + textureName + "_top") - iconGlass = iconRegister.registerIcon(domain + "electromagnetGlass") - } - - override def metadataDropped(meta: Int, fortune: Int): Int = - { - return meta - } - - override def canUpdate: Boolean = - { - return false - } - - override def shouldSideBeRendered(access: IBlockAccess, x: Int, y: Int, z: Int, side: Int): Boolean = - { - if(access.getBlockMetadata(x, y, z) != 1) - { - return super.shouldSideBeRendered(access, x, y, z, side) - } - return true - } - - override def getRenderBlockPass: Int = - { - return 0 - } - - override def getSubBlocks(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) - { - super.getSubBlocks(item, par2CreativeTabs, par3List) - par3List.add(new ItemStack(item, 1, 1)) - } - - def isRunning: Boolean = - { - return true - } - - @SideOnly(Side.CLIENT) - override def renderInventory(itemStack: ItemStack) - { - if(itemStack != null) - { - glPushMatrix() - glTranslated(0.5, 0.5, 0.5) - RenderBlockUtility.tessellateBlockWithConnectedTextures(itemStack.getItemDamage(), block, null, RenderUtility.getIcon(edgeTexture)) - glPopMatrix() - }else - { - super.renderInventory(itemStack) - } - } - - @SideOnly(Side.CLIENT) - override def renderDynamic(pos: Vector3, frame: Float, pass: Int) - { - var sideMap = 0 - - for (dir <- ForgeDirection.VALID_DIRECTIONS) - { - val check = toVector3 + dir - val checkTile = check.getTileEntity(world) - - if (checkTile != null && checkTile.getClass == tile.getClass && check.getBlockMetadata(world) == tile.getBlockMetadata) - { - sideMap = WorldUtility.setEnableSide(sideMap, dir, true) - } - } - - RenderBlockUtility.tessellateBlockWithConnectedTextures(sideMap, world, xi, yi, zi, tile.getBlockType, null, RenderUtility.getIcon(edgeTexture)) - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/blocks/TileSiren.scala b/src/main/scala/resonantinduction/atomic/blocks/TileSiren.scala deleted file mode 100644 index d53462d13..000000000 --- a/src/main/scala/resonantinduction/atomic/blocks/TileSiren.scala +++ /dev/null @@ -1,54 +0,0 @@ -package resonantinduction.atomic.blocks - -import net.minecraft.block.material.Material -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.world.World -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.prefab.tile.spatial.SpatialBlock -import resonantinduction.core.Reference -import resonant.lib.transform.vector.Vector3 - -/** - * Siren block - */ -class TileSiren extends SpatialBlock(Material.wood) -{ - - override def update - { - val world: World = worldObj - if (world != null) - { - val metadata: Int = world.getBlockMetadata(xi, yi, zi) - if (world.getBlockPowerInput(xi, yi, zi) > 0) - { - var volume: Float = 0.5f - for (i <- 0 to 6) - { - val check: Vector3 = toVector3.add(ForgeDirection.getOrientation(i)) - if (check.getBlock(world) eq getBlockType) - { - volume *= 1.5f - } - } - world.playSoundEffect(x, y, z, Reference.prefix + "alarm", volume, 1f - 0.18f * (metadata / 15f)) - } - } - } - - override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean = - { - var metadata: Int = world.getBlockMetadata(xi, yi, zi) - if (player.isSneaking) - { - metadata -= 1 - } - else - { - metadata += 1 - } - metadata = Math.max(metadata % 16, 0) - world.setBlockMetadataWithNotify(xi, yi, zi, metadata, 2) - return true - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemAntimatter.scala b/src/main/scala/resonantinduction/atomic/items/ItemAntimatter.scala deleted file mode 100644 index 006a017fd..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemAntimatter.scala +++ /dev/null @@ -1,56 +0,0 @@ -package resonantinduction.atomic.items - -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.item.Item -import net.minecraft.item.ItemStack -import net.minecraft.util.IIcon -import net.minecraft.world.World -import resonantinduction.core.Reference -import resonantinduction.core.RICreativeTab -import java.util.List -import resonant.lib.wrapper.WrapList._ - -class ItemAntimatter extends ItemCell -{ - - private var iconGram: IIcon = null - - //Constructor - this.setMaxDamage(0) - this.setHasSubtypes(true) - this.setUnlocalizedName(Reference.prefix + "antimatter") - this.setTextureName(Reference.prefix + "antimatter") - setCreativeTab(RICreativeTab) - - @SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister) - { - this.itemIcon = iconRegister.registerIcon(Reference.prefix + "antimatter_milligram") - this.iconGram = iconRegister.registerIcon(Reference.prefix + "antimatter_gram") - } - - override def getIconFromDamage(metadata: Int): IIcon = - { - if (metadata >= 1) - { - return this.iconGram - } - else - { - return this.itemIcon - } - } - - override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) - { - par3List.add(new ItemStack(item, 1, 0)) - par3List.add(new ItemStack(item, 1, 1)) - } - - override def getEntityLifespan(itemStack: ItemStack, world: World): Int = - { - return 160 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemBreederFuel.scala b/src/main/scala/resonantinduction/atomic/items/ItemBreederFuel.scala deleted file mode 100644 index 226b524f1..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemBreederFuel.scala +++ /dev/null @@ -1,24 +0,0 @@ -package resonantinduction.atomic.items - -import net.minecraft.item.ItemStack -import resonant.api.tile.{IReactorComponent, IReactor} - -/** - * Breeder rods - */ -class ItemBreederFuel extends ItemRadioactive with IReactorComponent -{ - //Constructor - this.setMaxDamage(ItemFissileFuel.DECAY) - this.setMaxStackSize(1) - this.setNoRepair - - override def onReact(itemStack: ItemStack, reactor: IReactor) - { - reactor.heat(ItemFissileFuel.ENERGY_PER_TICK / 2) - if (reactor.world.getWorldTime % 20 == 0) - { - itemStack.setItemDamage(Math.min(itemStack.getItemDamage + 1, itemStack.getMaxDamage)) - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemCell.scala b/src/main/scala/resonantinduction/atomic/items/ItemCell.scala deleted file mode 100644 index cf3efb6e5..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemCell.scala +++ /dev/null @@ -1,32 +0,0 @@ -package resonantinduction.atomic.items - -import net.minecraft.item.ItemStack -import resonant.lib.prefab.item.ItemTooltip -import resonant.lib.utility.LanguageUtility -import resonantinduction.atomic.AtomicContent -import resonantinduction.core.{Reference, RICreativeTab} - -class ItemCell extends ItemTooltip -{ - //Constructor - setContainerItem(AtomicContent.itemCell) - - def this(name: String) - { - this() - if (!name.equalsIgnoreCase("cellEmpty")) this.setContainerItem(AtomicContent.itemCell) - this.setUnlocalizedName(Reference.prefix + name) - this.setTextureName(Reference.prefix + name) - setCreativeTab(RICreativeTab) - } - - override def getUnlocalizedName(itemstack: ItemStack): String = - { - val localized: String = LanguageUtility.getLocal(getUnlocalizedName() + "." + itemstack.getItemDamage + ".name") - if (localized != null && !localized.isEmpty) - { - return getUnlocalizedName() + "." + itemstack.getItemDamage - } - return getUnlocalizedName() - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemFissileFuel.scala b/src/main/scala/resonantinduction/atomic/items/ItemFissileFuel.scala deleted file mode 100644 index c11b0a2c3..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemFissileFuel.scala +++ /dev/null @@ -1,95 +0,0 @@ -package resonantinduction.atomic.items - -import java.util.List - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.creativetab.CreativeTabs -import net.minecraft.item.{Item, ItemStack} -import net.minecraft.tileentity.TileEntity -import net.minecraft.world.World -import net.minecraftforge.common.util.ForgeDirection -import net.minecraftforge.fluids.FluidStack -import resonant.api.tile.{IReactorComponent, IReactor} -import resonant.lib.wrapper.WrapList._ -import resonantinduction.atomic.AtomicContent -import resonantinduction.atomic.machine.reactor.TileReactorCell -import resonantinduction.core.{Reference, RICreativeTab, Settings} -import resonant.lib.transform.vector.Vector3 - -/** - * Fissile fuel rod - */ -object ItemFissileFuel -{ - final val DECAY: Int = 2500 - /** - * Temperature at which the fuel rod will begin to re-enrich itself. - */ - final val BREEDING_TEMP: Int = 1100 - /** - * The energy in one KG of uranium is: 72PJ, 100TJ in one cell of uranium. - */ - final val ENERGY: Long = 100000000000L - /** - * Approximately 20,000,000J per tick. 400 MW. - */ - final val ENERGY_PER_TICK: Long = ENERGY / 50000 -} - -class ItemFissileFuel extends ItemRadioactive with IReactorComponent -{ - - //Constructor - this.setMaxStackSize(1) - this.setMaxDamage(ItemFissileFuel.DECAY) - this.setNoRepair - this.setUnlocalizedName(Reference.prefix + "rodBreederFuel") - this.setTextureName(Reference.prefix + "breederFuel") - setCreativeTab(RICreativeTab) - - def onReact(itemStack: ItemStack, reactor: IReactor) - { - val tileEntity: TileEntity = reactor.asInstanceOf[TileEntity] - val worldObj: World = tileEntity.getWorldObj - var reactors: Int = 0 - - for (i <- 0 to 6) - { - val checkPos: Vector3 = new Vector3(tileEntity).add(ForgeDirection.getOrientation(i)) - val tile: TileEntity = checkPos.getTileEntity(worldObj) - if (tile.isInstanceOf[TileReactorCell] && (tile.asInstanceOf[TileReactorCell]).getTemperature > ItemFissileFuel.BREEDING_TEMP) - { - reactors += 1 - } - } - - if (reactors >= 2) - { - if (worldObj.rand.nextInt(1000) <= 100 && reactor.getTemperature > (ItemFissileFuel.BREEDING_TEMP / 2)) - { - val healAmt: Int = worldObj.rand.nextInt(5) - itemStack.setItemDamage(Math.max(itemStack.getItemDamage - healAmt, 0)) - } - } - else - { - reactor.heat(ItemFissileFuel.ENERGY_PER_TICK) - if (reactor.world.getWorldTime % 20 == 0) - { - itemStack.setItemDamage(Math.min(itemStack.getItemDamage + 1, itemStack.getMaxDamage)) - } - if (Settings.allowToxicWaste && worldObj.rand.nextFloat > 0.5) - { - val fluid: FluidStack = AtomicContent.getStackToxicWaste.copy - fluid.amount = 1 - reactor.fill(ForgeDirection.UNKNOWN, fluid, true) - } - } - } - - @SideOnly(Side.CLIENT) override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) - { - par3List.add(new ItemStack(item, 1, 0)) - par3List.add(new ItemStack(item, 1, getMaxDamage - 1)) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemHazmat.scala b/src/main/scala/resonantinduction/atomic/items/ItemHazmat.scala deleted file mode 100644 index e303c84a8..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemHazmat.scala +++ /dev/null @@ -1,71 +0,0 @@ -package resonantinduction.atomic.items - -import net.minecraft.entity.Entity -import net.minecraft.entity.EntityLivingBase -import net.minecraft.item.Item -import net.minecraft.item.ItemArmor -import net.minecraft.item.ItemStack -import net.minecraft.util.DamageSource -import net.minecraftforge.common.util.EnumHelper -import resonant.api.armor.IAntiPoisonArmor -import resonantinduction.core.{ResonantInduction, Reference, RICreativeTab} - -/** - * Hazmat - */ -object ItemHazmat -{ - final val hazmatArmorMaterial: ItemArmor.ArmorMaterial = EnumHelper.addArmorMaterial("HAZMAT", 0, Array[Int](0, 0, 0, 0), 0) -} - -class ItemHazmat(slot: Int) extends ItemArmor(ItemHazmat.hazmatArmorMaterial, ResonantInduction.proxy.getArmorIndex("hazmat"), slot) with IAntiPoisonArmor -{ - def this(name: String, slot: Int) - { - this(slot) - this.setUnlocalizedName(Reference.prefix + name) - this.setCreativeTab(RICreativeTab) - this.setMaxDamage(200000) - } - - override def setUnlocalizedName(par1Str: String): Item = - { - super.setUnlocalizedName(par1Str) - this.setTextureName(par1Str) - return this - } - - override def getArmorTexture(stack: ItemStack, entity: Entity, slot: Int, `type`: String): String = - { - return Reference.prefix + Reference.modelPath + "hazmat.png" - } - - def isProtectedFromPoison(itemStack: ItemStack, entityLiving: EntityLivingBase, `type`: String): Boolean = - { - return `type`.equalsIgnoreCase("radiation") || `type`.equalsIgnoreCase("chemical") || `type`.equalsIgnoreCase("contagious") - } - - def onProtectFromPoison(itemStack: ItemStack, entityLiving: EntityLivingBase, `type`: String) - { - itemStack.damageItem(1, entityLiving) - } - - def getArmorType: Int = - { - return this.armorType - } - - def isPartOfSet(armorStack: ItemStack, compareStack: ItemStack): Boolean = - { - if (armorStack != null && compareStack != null) - { - return armorStack.getItem == compareStack.getItem - } - return false - } - - def areAllPartsNeeded(armorStack: ItemStack, entity: EntityLivingBase, source: DamageSource, data: AnyRef*): Boolean = - { - return true - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemRadioactive.scala b/src/main/scala/resonantinduction/atomic/items/ItemRadioactive.scala deleted file mode 100644 index 275c35ed5..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemRadioactive.scala +++ /dev/null @@ -1,23 +0,0 @@ -package resonantinduction.atomic.items - -import net.minecraft.entity.Entity -import net.minecraft.entity.EntityLivingBase -import net.minecraft.item.Item -import net.minecraft.item.ItemStack -import net.minecraft.world.World -import resonant.lib.prefab.poison.PoisonRadiation -import resonant.lib.transform.vector.Vector3 - -/** - * Radioactive Items - */ -class ItemRadioactive extends Item -{ - override def onUpdate(par1ItemStack: ItemStack, par2World: World, entity: Entity, par4: Int, par5: Boolean) - { - if (entity.isInstanceOf[EntityLivingBase]) - { - PoisonRadiation.INSTANCE.poisonEntity(new Vector3(entity), entity.asInstanceOf[EntityLivingBase], 1) - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/items/ItemUranium.scala b/src/main/scala/resonantinduction/atomic/items/ItemUranium.scala deleted file mode 100644 index b8b3a8bb3..000000000 --- a/src/main/scala/resonantinduction/atomic/items/ItemUranium.scala +++ /dev/null @@ -1,48 +0,0 @@ -package resonantinduction.atomic.items - -import net.minecraft.creativetab.CreativeTabs -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.Item -import net.minecraft.item.ItemStack -import org.lwjgl.input.Keyboard -import resonant.lib.render.EnumColor -import resonant.lib.utility.LanguageUtility -import java.util.List -import resonant.lib.wrapper.WrapList._ - -/** - * Uranium - */ -class ItemUranium extends ItemRadioactive -{ - //Constructor - this.setHasSubtypes(true) - this.setMaxDamage(0) - - override def addInformation(itemStack: ItemStack, par2EntityPlayer: EntityPlayer, list: List[_], par4: Boolean) - { - val tooltip: String = LanguageUtility.getLocal(getUnlocalizedName(itemStack) + ".tooltip") - if (tooltip != null && tooltip.length > 0) - { - if (!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) - { - list.add(LanguageUtility.getLocal("tooltip.noShift").replace("#0", EnumColor.AQUA.toString).replace("#1", EnumColor.GREY.toString)) - } - else - { - list.addAll(LanguageUtility.splitStringPerWord(tooltip, 5)) - } - } - } - - override def getUnlocalizedName(itemStack: ItemStack): java.lang.String = - { - return super.getUnlocalizedName() + "." + itemStack.getItemDamage - } - - override def getSubItems(item: Item, par2CreativeTabs: CreativeTabs, list: List[_]) - { - list.add(new ItemStack(item, 1, 0)) - list.add(new ItemStack(item, 1, 1)) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/accelerator/ContainerAccelerator.scala b/src/main/scala/resonantinduction/atomic/machine/accelerator/ContainerAccelerator.scala deleted file mode 100644 index b8b66ee03..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/accelerator/ContainerAccelerator.scala +++ /dev/null @@ -1,66 +0,0 @@ -package resonantinduction.atomic.machine.accelerator - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.inventory.{IInventory, Slot, SlotFurnace} -import net.minecraft.item.ItemStack -import resonant.lib.prefab.gui.ContainerBase -import resonantinduction.atomic.AtomicContent - -/** - * Accelerator container - */ -class ContainerAccelerator(player: EntityPlayer, tileEntity: TileAccelerator) extends ContainerBase(player, tileEntity.asInstanceOf[IInventory]) -{ - //Constructor - addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 0, 132, 26)) - addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 132, 51)) - addSlotToContainer(new SlotFurnace(player, tileEntity.asInstanceOf[IInventory], 2, 132, 75)) - addSlotToContainer(new SlotFurnace(player, tileEntity.asInstanceOf[IInventory], 3, 106, 75)) - addPlayerInventory(player) - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = - { - var var2: ItemStack = null - val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] - if (var3 != null && var3.getHasStack) - { - val itemStack: ItemStack = var3.getStack - var2 = itemStack.copy - if (par1 > 2) - { - if (itemStack.getItem eq AtomicContent.itemCell) - { - if (!this.mergeItemStack(itemStack, 1, 2, false)) - { - return null - } - } - else if (!this.mergeItemStack(itemStack, 0, 1, false)) - { - return null - } - } - else if (!this.mergeItemStack(itemStack, 3, 36 + 3, false)) - { - return null - } - if (itemStack.stackSize == 0) - { - var3.putStack(null.asInstanceOf[ItemStack]) - } - else - { - var3.onSlotChanged - } - if (itemStack.stackSize == var2.stackSize) - { - return null - } - var3.onPickupFromSlot(par1EntityPlayer, itemStack) - } - return var2 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/accelerator/EntityParticle.scala b/src/main/scala/resonantinduction/atomic/machine/accelerator/EntityParticle.scala deleted file mode 100644 index 26dc817d8..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/accelerator/EntityParticle.scala +++ /dev/null @@ -1,299 +0,0 @@ -package resonantinduction.atomic.machine.accelerator - -import java.util.List - -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData -import io.netty.buffer.ByteBuf -import net.minecraft.block.Block -import net.minecraft.entity.{Entity, EntityLiving} -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.AxisAlignedBB -import net.minecraft.world.{ChunkCoordIntPair, World} -import net.minecraftforge.common.ForgeChunkManager -import net.minecraftforge.common.ForgeChunkManager.Type -import net.minecraftforge.common.util.ForgeDirection -import resonant.api.tile.IElectromagnet -import resonant.lib.prefab.poison.PoisonRadiation -import resonantinduction.core.{ResonantInduction, Reference} -import resonant.lib.transform.vector.Vector3 -import scala.collection.JavaConversions._ - -/** - * The particle entity used to determine the particle acceleration. - */ -object EntityParticle -{ - /** Speed by which a particle will turn into anitmatter */ - val ANITMATTER_CREATION_SPEED: Float = 0.9f - val MOVEMENT_DIRECTION_DATAWATCHER_ID: Int = 20 - - /** - * Checks to see if a new particle can be spawned at the location. - * @param world - world to check in - * @param pos - location to check - * @return true if the spawn location is clear and 2 electromagnets are next to the location - */ - def canSpawnParticle(world: World, pos: Vector3): Boolean = - { - val block: Block = pos.getBlock(world) - if (block == null || !block.isAir(world, pos.xi, pos.yi, pos.zi)) - { - var electromagnetCount = 0 - for (i <- 0 until 6) - { - val dir: ForgeDirection = ForgeDirection.getOrientation(i) - if (isElectromagnet(world, pos, dir)) - { - electromagnetCount += 1 - } - } - return electromagnetCount >= 2 - } - return false - } - - /** - * Checks to see if the block is an instance of IElectromagnet and is turned on - * @param world - world to check in - * @param position - position to look for the block/tile - * @param dir - direction to check in - * @return true if the location contains an active electromagnet block - */ - def isElectromagnet(world: World, position: Vector3, dir: ForgeDirection): Boolean = - { - val checkPos: Vector3 = position.clone.add(dir) - val tile: TileEntity = checkPos.getTileEntity(world) - if (tile.isInstanceOf[IElectromagnet]) - { - return (tile.asInstanceOf[IElectromagnet]).isRunning - } - return false - } -} - -class EntityParticle(par1World: World) extends Entity(par1World) with IEntityAdditionalSpawnData -{ - var updateTicket: ForgeChunkManager.Ticket = null - var didParticleCollide: Boolean = false - private var lastTurn: Int = 60 - private var movementVector: Vector3 = new Vector3 - private var movementDirection: ForgeDirection = ForgeDirection.NORTH - - //Constructor - this.setSize(0.3f, 0.3f) - this.renderDistanceWeight = 4f - this.ignoreFrustumCheck = true - - def this(world: World, pos: Vector3, movementVec: Vector3, dir: ForgeDirection) - { - this(world) - this.setPosition(pos.x, pos.y, pos.z) - this.movementVector = movementVec - this.movementDirection = dir - } - - override def writeSpawnData(data: ByteBuf) - { - data.writeInt(this.movementVector.xi) - data.writeInt(this.movementVector.yi) - data.writeInt(this.movementVector.zi) - data.writeInt(this.movementDirection.ordinal) - } - - override def readSpawnData(data: ByteBuf) - { - this.movementVector = new Vector3(data) - this.movementDirection = ForgeDirection.getOrientation(data.readInt) - } - - protected override def entityInit - { - this.dataWatcher.addObject(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID, 3.asInstanceOf[Byte]) - if (this.updateTicket == null) - { - this.updateTicket = ForgeChunkManager.requestTicket(ResonantInduction, this.worldObj, Type.ENTITY) - this.updateTicket.getModData - this.updateTicket.bindEntity(this) - } - } - - override def onUpdate - { - val t: TileEntity = this.worldObj.getTileEntity(this.movementVector.xi, this.movementVector.yi, this.movementVector.zi) - val tileEntity: TileAccelerator = if(t != null && t.isInstanceOf[TileAccelerator]) t.asInstanceOf[TileAccelerator] else null - var acceleration: Double = 0.0006f - - if (this.ticksExisted % 10 == 0) - { - this.worldObj.playSoundAtEntity(this, Reference.prefix + "accelerator", 1f, (0.6f + (0.4 * (this.getParticleVelocity / EntityParticle.ANITMATTER_CREATION_SPEED))).asInstanceOf[Float]) - } - - - - //Sanity check - if (tileEntity == null) - { - setDead - return - } - else if (tileEntity.entityParticle == null) - { - tileEntity.entityParticle = this - } - - //Force load chunks TODO calculate direction so to only load two chunks instead of 5 - for (x <- -1 to 1) - { - for (z <- -1 to 1) - { - ForgeChunkManager.forceChunk(this.updateTicket, new ChunkCoordIntPair((this.posX.asInstanceOf[Int] >> 4) + x, (this.posZ.asInstanceOf[Int] >> 4) + z)) - - } - } - - //Update data watcher - if (!this.worldObj.isRemote) - { - this.dataWatcher.updateObject(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID, this.movementDirection.ordinal.asInstanceOf[Byte]) - } - else - { - this.movementDirection = ForgeDirection.getOrientation(this.dataWatcher.getWatchableObjectByte(EntityParticle.MOVEMENT_DIRECTION_DATAWATCHER_ID)) - } - - - if ((!EntityParticle.isElectromagnet(worldObj, new Vector3(this), movementDirection.getRotation(ForgeDirection.UP)) || !EntityParticle.isElectromagnet(worldObj, new Vector3(this), movementDirection.getRotation(ForgeDirection.DOWN))) && this.lastTurn <= 0) - { - acceleration = turn - this.motionX = 0 - this.motionY = 0 - this.motionZ = 0 - this.lastTurn = 40 - } - this.lastTurn -= 1 - if (!EntityParticle.canSpawnParticle(this.worldObj, new Vector3(this)) || this.isCollided) - { - handleCollisionWithEntity - return - } - val dongLi: Vector3 = new Vector3 - dongLi.add(this.movementDirection) - dongLi.multiply(acceleration) - this.motionX = Math.min(dongLi.x + this.motionX, EntityParticle.ANITMATTER_CREATION_SPEED) - this.motionY = Math.min(dongLi.y + this.motionY, EntityParticle.ANITMATTER_CREATION_SPEED) - this.motionZ = Math.min(dongLi.z + this.motionZ, EntityParticle.ANITMATTER_CREATION_SPEED) - this.isAirBorne = true - this.lastTickPosX = this.posX - this.lastTickPosY = this.posY - this.lastTickPosZ = this.posZ - this.moveEntity(this.motionX, this.motionY, this.motionZ) - this.setPosition(this.posX, this.posY, this.posZ) - if (this.lastTickPosX == this.posX && this.lastTickPosY == this.posY && this.lastTickPosZ == this.posZ && this.getParticleVelocity <= 0 && this.lastTurn <= 0) - { - this.setDead - } - this.worldObj.spawnParticle("portal", this.posX, this.posY, this.posZ, 0, 0, 0) - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY, this.posZ, 0, 0, 0) - val radius: Float = 0.5f - - // Handle collision with entities TODO turn into a ray trace call so we know what we hit - val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) - val entitiesNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[Entity], bounds) - if (entitiesNearby.size > 1) - { - this.handleCollisionWithEntity - return - } - } - - /** - * Try to move the particle left or right depending on which side is empty. - * - * @return The new velocity. - */ - private def turn: Double = - { - //TODO rewrite to allow for up and down turning - val RELATIVE_MATRIX: Array[Array[Int]] = Array(Array(3, 2, 1, 0, 5, 4), Array(4, 5, 0, 1, 2, 3), Array(0, 1, 3, 2, 4, 5), Array(0, 1, 2, 3, 5, 4), Array(0, 1, 5, 4, 3, 2), Array(0, 1, 4, 5, 2, 3)) - val zuoFangXiang: ForgeDirection = ForgeDirection.getOrientation(RELATIVE_MATRIX(this.movementDirection.ordinal)(ForgeDirection.EAST.ordinal)) - val zuoBian: Vector3 = new Vector3(this).floor - zuoBian.add(zuoFangXiang) - val youFangXiang: ForgeDirection = ForgeDirection.getOrientation(RELATIVE_MATRIX(this.movementDirection.ordinal)(ForgeDirection.WEST.ordinal)) - val youBian: Vector3 = new Vector3(this).floor - youBian.add(youFangXiang) - if (zuoBian.getBlock(this.worldObj) == null) - { - this.movementDirection = zuoFangXiang - } - else if (youBian.getBlock(this.worldObj) == null) - { - this.movementDirection = youFangXiang - } - else - { - setDead - return 0 - } - this.setPosition(Math.floor(this.posX) + 0.5, Math.floor(this.posY) + 0.5, Math.floor(this.posZ) + 0.5) - return this.getParticleVelocity - (this.getParticleVelocity / Math.min(Math.max(70 * this.getParticleVelocity, 4), 30)) - } - - def handleCollisionWithEntity - { - this.worldObj.playSoundAtEntity(this, Reference.prefix + "antimatter", 1.5f, 1f - this.worldObj.rand.nextFloat * 0.3f) - if (!this.worldObj.isRemote) - { - if (this.getParticleVelocity > EntityParticle.ANITMATTER_CREATION_SPEED / 2) - { - val radius: Float = 1f - val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) - val entitiesNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[EntityParticle], bounds) - if (entitiesNearby.size > 0) - { - didParticleCollide = true - setDead - return - } - } - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, this.getParticleVelocity.asInstanceOf[Float] * 2.5f, true) - } - val radius: Float = 6 - val bounds: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.posX - radius, this.posY - radius, this.posZ - radius, this.posX + radius, this.posY + radius, this.posZ + radius) - val livingNearby: List[_] = this.worldObj.getEntitiesWithinAABB(classOf[EntityLiving], bounds) - - for (entity <- livingNearby) - { - PoisonRadiation.INSTANCE.poisonEntity(new Vector3(entity.asInstanceOf[Entity]), entity.asInstanceOf[EntityLiving]) - } - setDead - } - - def getParticleVelocity: Double = - { - return Math.abs(this.motionX) + Math.abs(this.motionY) + Math.abs(this.motionZ) - } - - override def applyEntityCollision(par1Entity: Entity) - { - this.handleCollisionWithEntity - } - - override def setDead - { - ForgeChunkManager.releaseTicket(this.updateTicket) - super.setDead - } - - protected def readEntityFromNBT(nbt: NBTTagCompound) - { - this.movementVector = new Vector3(nbt.getCompoundTag("jiqi")) - ForgeDirection.getOrientation(nbt.getByte("fangXiang")) - } - - protected def writeEntityToNBT(nbt: NBTTagCompound) - { - nbt.setTag("jiqi", this.movementVector.writeNBT(new NBTTagCompound)) - nbt.setByte("fangXiang", this.movementDirection.ordinal.asInstanceOf[Byte]) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/accelerator/GuiAccelerator.scala b/src/main/scala/resonantinduction/atomic/machine/accelerator/GuiAccelerator.scala deleted file mode 100644 index 711d070b5..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/accelerator/GuiAccelerator.scala +++ /dev/null @@ -1,55 +0,0 @@ -package resonantinduction.atomic.machine.accelerator - -import net.minecraft.entity.player.EntityPlayer -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.utility.science.UnitDisplay -import resonantinduction.core.Settings -import resonant.lib.transform.vector.Vector3 - -class GuiAccelerator(player: EntityPlayer, tileEntity: TileAccelerator) extends GuiContainerBase(new ContainerAccelerator(player, tileEntity)) -{ - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(x: Int, y: Int) - { - this.fontRendererObj.drawString("Accelerator", 40, 10, 4210752) - var status: String = "" - val position: Vector3 = tileEntity.toVector3 + tileEntity.getDirection.getOpposite - if (!EntityParticle.canSpawnParticle(this.tileEntity.world, position)) - { - status = "\u00a74Fail to emit; try rotating." - } - else if (this.tileEntity.entityParticle != null && this.tileEntity.velocity > 0) - { - status = "\u00a76Accelerating" - } - else - { - status = "\u00a72Idle" - } - this.fontRendererObj.drawString("Velocity: " + Math.round((this.tileEntity.velocity / EntityParticle.ANITMATTER_CREATION_SPEED) * 100) + "%", 8, 27, 4210752) - this.fontRendererObj.drawString("Energy Used:", 8, 38, 4210752) - this.fontRendererObj.drawString(new UnitDisplay(UnitDisplay.Unit.JOULES, this.tileEntity.totalEnergyConsumed).toString, 8, 49, 4210752) - this.fontRendererObj.drawString(new UnitDisplay(UnitDisplay.Unit.WATT, Settings.ACCELERATOR_ENERGY_COST_PER_TICK * 20).toString, 8, 60, 4210752) - this.fontRendererObj.drawString("Voltage: N?A", 8, 70, 4210752) - this.fontRendererObj.drawString("Antimatter: " + this.tileEntity.antimatter + " mg", 8, 80, 4210752) - this.fontRendererObj.drawString("Status:", 8, 90, 4210752) - this.fontRendererObj.drawString(status, 8, 100, 4210752) - // this.fontRendererObj.drawString("Buffer: " + this.tileEntity.energy.getEnergy + "/" + new UnitDisplay(UnitDisplay.Unit.JOULES, this.tileEntity.energy.getEnergyCapacity, true), 8, 110, 4210752) - this.fontRendererObj.drawString("Facing: " + this.tileEntity.getDirection.getOpposite, 100, 123, 4210752) - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) - { - super.drawGuiContainerBackgroundLayer(par1, x, y) - this.drawSlot(131, 25) - this.drawSlot(131, 50) - this.drawSlot(131, 74) - this.drawSlot(105, 74) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/accelerator/RenderParticle.scala b/src/main/scala/resonantinduction/atomic/machine/accelerator/RenderParticle.scala deleted file mode 100644 index 21c14ca15..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/accelerator/RenderParticle.scala +++ /dev/null @@ -1,79 +0,0 @@ -package resonantinduction.atomic.machine.accelerator - -import java.util.Random - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.{RenderHelper, Tessellator} -import net.minecraft.client.renderer.entity.Render -import net.minecraft.entity.Entity -import net.minecraft.util.ResourceLocation -import org.lwjgl.opengl.GL11 - -@SideOnly(Side.CLIENT) class RenderParticle extends Render -{ - def doRender(entity: Entity, x: Double, y: Double, z: Double, var8: Float, var9: Float) - { - val tessellator: Tessellator = Tessellator.instance - var par2: Float = (entity.ticksExisted) - while (par2 > 200) - { - par2 -= 100 - } - RenderHelper.disableStandardItemLighting - val var41: Float = (5 + par2) / 200.0F - var var51: Float = 0.0F - if (var41 > 0.8F) - { - var51 = (var41 - 0.8F) / 0.2F - } - val rand: Random = new Random(432L) - GL11.glPushMatrix - GL11.glTranslatef(x.asInstanceOf[Float], y.asInstanceOf[Float], z.asInstanceOf[Float]) - GL11.glScalef(0.15f, 0.15f, 0.15f) - GL11.glDisable(GL11.GL_TEXTURE_2D) - GL11.glShadeModel(GL11.GL_SMOOTH) - GL11.glEnable(GL11.GL_BLEND) - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE) - GL11.glDisable(GL11.GL_ALPHA_TEST) - GL11.glEnable(GL11.GL_CULL_FACE) - GL11.glDepthMask(false) - GL11.glPushMatrix - GL11.glTranslatef(0.0F, -1.0F, -2.0F) - - for (i1 <- 0 to ((var41 + var41 * var41) / 2.0F * 60.0F).asInstanceOf[Int]) - { - GL11.glRotatef(rand.nextFloat * 360.0F, 1.0F, 0.0F, 0.0F) - GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 1.0F, 0.0F) - GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 0.0F, 1.0F) - GL11.glRotatef(rand.nextFloat * 360.0F, 1.0F, 0.0F, 0.0F) - GL11.glRotatef(rand.nextFloat * 360.0F, 0.0F, 1.0F, 0.0F) - GL11.glRotatef(rand.nextFloat * 360.0F + var41 * 90.0F, 0.0F, 0.0F, 1.0F) - tessellator.startDrawing(6) - val var81: Float = rand.nextFloat * 20.0F + 5.0F + var51 * 10.0F - val var91: Float = rand.nextFloat * 2.0F + 1.0F + var51 * 2.0F - tessellator.setColorRGBA_I(16777215, (255.0F * (1.0F - var51)).asInstanceOf[Int]) - tessellator.addVertex(0.0D, 0.0D, 0.0D) - tessellator.setColorRGBA_I(0, 0) - tessellator.addVertex(-0.866D * var91, var81, -0.5F * var91) - tessellator.addVertex(0.866D * var91, var81, -0.5F * var91) - tessellator.addVertex(0.0D, var81, 1.0F * var91) - tessellator.addVertex(-0.866D * var91, var81, -0.5F * var91) - tessellator.draw - } - GL11.glPopMatrix - GL11.glDepthMask(true) - GL11.glDisable(GL11.GL_CULL_FACE) - GL11.glDisable(GL11.GL_BLEND) - GL11.glShadeModel(GL11.GL_FLAT) - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F) - GL11.glEnable(GL11.GL_TEXTURE_2D) - GL11.glEnable(GL11.GL_ALPHA_TEST) - RenderHelper.enableStandardItemLighting - GL11.glPopMatrix - } - - protected def getEntityTexture(entity: Entity): ResourceLocation = - { - return null - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/boiler/ContainerNuclearBoiler.scala b/src/main/scala/resonantinduction/atomic/machine/boiler/ContainerNuclearBoiler.scala deleted file mode 100644 index c753ebaf2..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/boiler/ContainerNuclearBoiler.scala +++ /dev/null @@ -1,99 +0,0 @@ -package resonantinduction.atomic.machine.boiler - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.inventory.{IInventory, Slot} -import net.minecraft.item.ItemStack -import net.minecraftforge.fluids.FluidContainerRegistry -import resonant.lib.prefab.gui.ContainerBase -import resonant.lib.prefab.gui.slot.{SlotEnergyItem, SlotSpecific} -import resonantinduction.atomic.AtomicContent - -/** - * Nuclear boiler container - */ -object ContainerNuclearBoiler -{ - private final val slotCount: Int = 4 -} - -class ContainerNuclearBoiler(player: EntityPlayer, tileEntity: TileNuclearBoiler) extends ContainerBase(player, tileEntity.asInstanceOf[IInventory]) -{ - //Constructor - this.addSlotToContainer(new SlotEnergyItem(tileEntity.asInstanceOf[IInventory], 0, 56, 26)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 25, 50)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 2, 136, 50)) - this.addSlotToContainer(new SlotSpecific(tileEntity.asInstanceOf[IInventory], 3, 81, 26, new ItemStack(AtomicContent.itemYellowCake), new ItemStack(AtomicContent.blockUraniumOre))) - this.addPlayerInventory(player) - - override def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = - { - return this.tileEntity.isUseableByPlayer(par1EntityPlayer) - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - override def transferStackInSlot(par1EntityPlayer: EntityPlayer, slotID: Int): ItemStack = - { - var var2: ItemStack = null - val slot: Slot = this.inventorySlots.get(slotID).asInstanceOf[Slot] - if (slot != null && slot.getHasStack) - { - val itemStack: ItemStack = slot.getStack - var2 = itemStack.copy - if (slotID >= slotCount) - { - if (this.getSlot(0).isItemValid(itemStack)) - { - if (!this.mergeItemStack(itemStack, 0, 1, false)) - { - return null - } - } - else if (AtomicContent.FLUIDSTACK_WATER.isFluidEqual(FluidContainerRegistry.getFluidForFilledItem(itemStack))) - { - if (!this.mergeItemStack(itemStack, 1, 2, false)) - { - return null - } - } - else if (this.getSlot(3).isItemValid(itemStack)) - { - if (!this.mergeItemStack(itemStack, 3, 4, false)) - { - return null - } - } - else if (slotID < 27 + slotCount) - { - if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) - { - return null - } - } - else if (slotID >= 27 + slotCount && slotID < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) - { - return null - } - } - else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) - { - return null - } - if (itemStack.stackSize == 0) - { - slot.putStack(null.asInstanceOf[ItemStack]) - } - else - { - slot.onSlotChanged - } - if (itemStack.stackSize == var2.stackSize) - { - return null - } - slot.onPickupFromSlot(par1EntityPlayer, itemStack) - } - return var2 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/boiler/GuiNuclearBoiler.scala b/src/main/scala/resonantinduction/atomic/machine/boiler/GuiNuclearBoiler.scala deleted file mode 100644 index b0a79ffc1..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/boiler/GuiNuclearBoiler.scala +++ /dev/null @@ -1,49 +0,0 @@ -package resonantinduction.atomic.machine.boiler - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.util.StatCollector -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.prefab.gui.GuiContainerBase.SlotType -import resonant.lib.utility.science.UnitDisplay - -class GuiNuclearBoiler(player: EntityPlayer, tileEntity: TileNuclearBoiler) extends GuiContainerBase(new ContainerNuclearBoiler(player, tileEntity)) -{ - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) - { - this.fontRendererObj.drawString("Boiler", 52, 6, 4210752) - this.renderUniversalDisplay(8, 112, TileNuclearBoiler.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) - //this.renderUniversalDisplay(110, 112, tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) - this.fontRendererObj.drawString("The nuclear boiler can boil", 8, 75, 4210752) - this.fontRendererObj.drawString("yellow cake into uranium", 8, 85, 4210752) - this.fontRendererObj.drawString("hexafluoride gas to be refined.", 8, 95, 4210752) - this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) - - //if (this.isPointInRegion(8, 18, this.meterWidth, this.meterHeight, mouseX, mouseY) && this.tileEntity.waterTank.getFluid() != null) - //{ - // this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop + 10, this.tileEntity.waterTank.getFluid().getFluid().getLocalizedName(), this.tileEntity.waterTank.getFluid().amount + " L"); - //} - //else if (this.isPointInRegion(155, 18, this.meterWidth, this.meterHeight, mouseX, mouseY) && this.tileEntity.gasTank.getFluid() != null) - //{ - // this.drawTooltip(mouseX - this.guiLeft, mouseY - this.guiTop + 10, this.tileEntity.gasTank.getFluid().getFluid().getLocalizedName(), this.tileEntity.gasTank.getFluid().amount + " L"); - //} - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) - { - super.drawGuiContainerBackgroundLayer(par1, x, y) - this.drawSlot(55, 25, SlotType.BATTERY) - this.drawSlot(80, 25) - this.drawBar(110, 26, this.tileEntity.timer.asInstanceOf[Float] / this.tileEntity.SHI_JIAN.asInstanceOf[Float]) - this.drawMeter(8, 18, this.tileEntity.waterTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.waterTank.getCapacity.asInstanceOf[Float], this.tileEntity.waterTank.getFluid) - this.drawSlot(24, 49, SlotType.LIQUID) - this.drawMeter(155, 18, this.tileEntity.gasTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.gasTank.getCapacity.asInstanceOf[Float], this.tileEntity.gasTank.getFluid) - this.drawSlot(135, 49, SlotType.GAS) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/boiler/RenderNuclearBoiler.scala b/src/main/scala/resonantinduction/atomic/machine/boiler/RenderNuclearBoiler.scala deleted file mode 100644 index 708134a67..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/boiler/RenderNuclearBoiler.scala +++ /dev/null @@ -1,50 +0,0 @@ -package resonantinduction.atomic.machine.boiler - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility -import resonant.lib.render.model.FixedTechneModel -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderNuclearBoiler -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "nuclearBoiler.tcn")) - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "nuclearBoiler.png") -} - -@SideOnly(Side.CLIENT) class RenderNuclearBoiler extends TileEntitySpecialRenderer -{ - def renderAModelAt(tileEntity: TileNuclearBoiler, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - GL11.glRotatef(90, 0, 1, 0) - if (tileEntity.world != null) - { - RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) - } - bindTexture(RenderNuclearBoiler.TEXTURE) - if (RenderNuclearBoiler.MODEL.isInstanceOf[FixedTechneModel]) - { - (RenderNuclearBoiler.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(Math.toDegrees(tileEntity.rotation), 0, 1, 0, "FUEL BAR SUPPORT 1 ROTATES", "FUEL BAR 1 ROTATES") - (RenderNuclearBoiler.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(-Math.toDegrees(tileEntity.rotation), 0, 1, 0, "FUEL BAR SUPPORT 2 ROTATES", "FUEL BAR 2 ROTATES") - RenderNuclearBoiler.MODEL.renderAllExcept("FUEL BAR SUPPORT 1 ROTATES", "FUEL BAR SUPPORT 2 ROTATES", "FUEL BAR 1 ROTATES", "FUEL BAR 2 ROTATES") - } - else - { - RenderNuclearBoiler.MODEL.renderAll - } - GL11.glPopMatrix - } - - def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) - { - this.renderAModelAt(tileEntity.asInstanceOf[TileNuclearBoiler], var2, var4, var6, var8) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/centrifuge/ContainerCentrifuge.scala b/src/main/scala/resonantinduction/atomic/machine/centrifuge/ContainerCentrifuge.scala deleted file mode 100644 index b8d8ce290..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/centrifuge/ContainerCentrifuge.scala +++ /dev/null @@ -1,95 +0,0 @@ -package resonantinduction.atomic.machine.centrifuge - -import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} -import net.minecraft.inventory.{IInventory, Slot, SlotFurnace} -import net.minecraft.item.ItemStack -import resonant.lib.prefab.gui.ContainerBase -import resonant.lib.prefab.gui.slot.SlotEnergyItem -import resonantinduction.atomic.AtomicContent - -class ContainerCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends ContainerBase(tileEntity) -{ - //Constructor - this.addSlotToContainer(new SlotEnergyItem(tileEntity.asInstanceOf[IInventory], 0, 131, 26)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 25, 50)) - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 2, 81, 26)) - this.addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity.asInstanceOf[IInventory], 3, 101, 26)) - this.addPlayerInventory(par1InventoryPlayer.player) - - override def onContainerClosed(entityplayer: EntityPlayer) - { - super.onContainerClosed(entityplayer) - } - - override def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = - { - return this.tileEntity.isUseableByPlayer(par1EntityPlayer) - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = - { - var var2: ItemStack = null - val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] - if (var3 != null && var3.getHasStack) - { - val itemStack: ItemStack = var3.getStack - var2 = itemStack.copy - if (par1 >= slotCount) - { - if (this.getSlot(0).isItemValid(itemStack)) - { - if (!this.mergeItemStack(itemStack, 0, 1, false)) - { - return null - } - } - else if (AtomicContent.isItemStackUraniumOre(itemStack)) - { - if (!this.mergeItemStack(itemStack, 1, 2, false)) - { - return null - } - } - else if (AtomicContent.isItemStackEmptyCell(itemStack)) - { - if (!this.mergeItemStack(itemStack, 3, 4, false)) - { - return null - } - } - else if (par1 < 27 + slotCount) - { - if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) - { - return null - } - } - else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) - { - return null - } - } - else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) - { - return null - } - if (itemStack.stackSize == 0) - { - var3.putStack(null.asInstanceOf[ItemStack]) - } - else - { - var3.onSlotChanged - } - if (itemStack.stackSize == var2.stackSize) - { - return null - } - var3.onPickupFromSlot(par1EntityPlayer, itemStack) - } - return var2 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/centrifuge/GuiCentrifuge.scala b/src/main/scala/resonantinduction/atomic/machine/centrifuge/GuiCentrifuge.scala deleted file mode 100644 index f5fdaed49..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/centrifuge/GuiCentrifuge.scala +++ /dev/null @@ -1,52 +0,0 @@ -package resonantinduction.atomic.machine.centrifuge - -import net.minecraft.entity.player.InventoryPlayer -import net.minecraft.util.StatCollector -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.prefab.gui.GuiContainerBase.SlotType -import resonant.lib.utility.science.UnitDisplay - -class GuiCentrifuge(par1InventoryPlayer: InventoryPlayer, tileEntity: TileCentrifuge) extends GuiContainerBase(new ContainerCentrifuge(par1InventoryPlayer, tileEntity)) -{ - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) - { - this.fontRendererObj.drawString("Centrifuge", 60, 6, 4210752) - var displayText: String = "" - if (this.tileEntity.timer > 0) - { - displayText = "Processing" - } - else if (this.tileEntity.nengYong) - { - displayText = "Ready" - } - else - { - displayText = "Idle" - } - this.fontRendererObj.drawString("Status: " + displayText, 70, 50, 4210752) - this.renderUniversalDisplay(8, 112, TileCentrifuge.DIAN * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) - this.renderUniversalDisplay(100, 112, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) - this.fontRendererObj.drawString("The centrifuge spins", 8, 75, 4210752) - this.fontRendererObj.drawString("uranium hexafluoride gas into", 8, 85, 4210752) - this.fontRendererObj.drawString("enriched uranium for fission.", 8, 95, 4210752) - this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) - { - super.drawGuiContainerBackgroundLayer(par1, x, y) - this.drawSlot(80, 25) - this.drawSlot(100, 25) - this.drawSlot(130, 25, SlotType.BATTERY) - this.drawBar(40, 26, this.tileEntity.timer.asInstanceOf[Float] / TileCentrifuge.SHI_JIAN.asInstanceOf[Float]) - this.drawMeter(8, 18, this.tileEntity.gasTank.getFluidAmount.asInstanceOf[Float] / this.tileEntity.gasTank.getCapacity.asInstanceOf[Float], this.tileEntity.gasTank.getFluid) - this.drawSlot(24, 49, SlotType.GAS) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/centrifuge/RenderCentrifuge.scala b/src/main/scala/resonantinduction/atomic/machine/centrifuge/RenderCentrifuge.scala deleted file mode 100644 index 19d027cba..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/centrifuge/RenderCentrifuge.scala +++ /dev/null @@ -1,42 +0,0 @@ -package resonantinduction.atomic.machine.centrifuge - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderCentrifuge -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.tcn")) - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "centrifuge.png") -} - -@SideOnly(Side.CLIENT) -class RenderCentrifuge extends TileEntitySpecialRenderer -{ - def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) - { - this.render(tileEntity.asInstanceOf[TileCentrifuge], var2, var4, var6, var8) - } - - def render(tileEntity: TileCentrifuge, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - if (tileEntity.getWorldObj != null) - { - RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) - } - bindTexture(RenderCentrifuge.TEXTURE) - GL11.glPushMatrix - GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0) - RenderCentrifuge.MODEL.renderOnly("C", "JROT", "KROT", "LROT", "MROT") - GL11.glPopMatrix - RenderCentrifuge.MODEL.renderAllExcept("C", "JROT", "KROT", "LROT", "MROT") - GL11.glPopMatrix - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/extractor/ContainerChemicalExtractor.scala b/src/main/scala/resonantinduction/atomic/machine/extractor/ContainerChemicalExtractor.scala deleted file mode 100644 index 2a69d6b41..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/extractor/ContainerChemicalExtractor.scala +++ /dev/null @@ -1,29 +0,0 @@ -package resonantinduction.atomic.machine.extractor - -import net.minecraft.entity.player.InventoryPlayer -import net.minecraft.inventory.{Slot, SlotFurnace} -import resonant.lib.prefab.gui.ContainerBase -import resonant.lib.prefab.gui.slot.SlotEnergyItem - -/** - * Chemical extractor container - */ -object ContainerChemicalExtractor -{ - private final val slotCount: Int = 5 -} - -class ContainerChemicalExtractor(par1InventoryPlayer: InventoryPlayer, tileEntity: TileChemicalExtractor) extends ContainerBase(tileEntity) -{ - //Constructor - addSlotToContainer(new SlotEnergyItem(tileEntity, 0, 80, 50)) - addSlotToContainer(new Slot(tileEntity, 1, 53, 25)) - addSlotToContainer(new SlotFurnace(par1InventoryPlayer.player, tileEntity, 2, 107, 25)) - addSlotToContainer(new Slot(tileEntity, 3, 25, 19)) - addSlotToContainer(new Slot(tileEntity, 4, 25, 50)) - addSlotToContainer(new Slot(tileEntity, 5, 135, 19)) - addSlotToContainer(new Slot(tileEntity, 6, 135, 50)) - addPlayerInventory(par1InventoryPlayer.player) - - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/extractor/GuiChemicalExtractor.scala b/src/main/scala/resonantinduction/atomic/machine/extractor/GuiChemicalExtractor.scala deleted file mode 100644 index 70b2ba4ff..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/extractor/GuiChemicalExtractor.scala +++ /dev/null @@ -1,42 +0,0 @@ -package resonantinduction.atomic.machine.extractor - -import net.minecraft.entity.player.InventoryPlayer -import net.minecraft.util.StatCollector -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.prefab.gui.GuiContainerBase.SlotType -import resonant.lib.utility.science.UnitDisplay - -class GuiChemicalExtractor(par1InventoryPlayer: InventoryPlayer, tileEntity: TileChemicalExtractor) extends GuiContainerBase(new ContainerChemicalExtractor(par1InventoryPlayer, tileEntity)) -{ - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) - { - this.fontRendererObj.drawString("Chemical Extractor", 45, 6, 4210752) - this.renderUniversalDisplay(8, 112, TileChemicalExtractor.ENERGY * 20, mouseX, mouseY, UnitDisplay.Unit.WATT) - this.renderUniversalDisplay(100, 112, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) - this.fontRendererObj.drawString("The extractor can extract", 8, 75, 4210752) - this.fontRendererObj.drawString("uranium, deuterium and tritium.", 8, 85, 4210752) - this.fontRendererObj.drawString("Place them in the input slot.", 8, 95, 4210752) - this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752) - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) - { - super.drawGuiContainerBackgroundLayer(par1, x, y) - drawSlot(79, 49, SlotType.BATTERY) - drawSlot(52, 24) - drawSlot(106, 24) - drawBar(75, 24, tileEntity.time.asInstanceOf[Float] / TileChemicalExtractor.TICK_TIME.asInstanceOf[Float]) - drawMeter(8, 18, tileEntity.inputTank.getFluidAmount.asInstanceOf[Float] / tileEntity.inputTank.getCapacity.asInstanceOf[Float], tileEntity.inputTank.getFluid) - drawSlot(24, 18, SlotType.LIQUID) - drawSlot(24, 49, SlotType.LIQUID) - drawMeter(154, 18, tileEntity.outputTank.getFluidAmount.asInstanceOf[Float] / tileEntity.outputTank.getCapacity.asInstanceOf[Float], tileEntity.outputTank.getFluid) - drawSlot(134, 18, SlotType.LIQUID) - drawSlot(134, 49, SlotType.LIQUID) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/extractor/RenderChemicalExtractor.scala b/src/main/scala/resonantinduction/atomic/machine/extractor/RenderChemicalExtractor.scala deleted file mode 100644 index 969e3d713..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/extractor/RenderChemicalExtractor.scala +++ /dev/null @@ -1,50 +0,0 @@ -package resonantinduction.atomic.machine.extractor - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility -import resonant.lib.render.model.FixedTechneModel -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderChemicalExtractor -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "chemicalExtractor.tcn")) - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "chemicalExtractor.png") -} - -@SideOnly(Side.CLIENT) class RenderChemicalExtractor extends TileEntitySpecialRenderer -{ - def render(tileEntity: TileChemicalExtractor, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - if (tileEntity.getWorldObj != null) - { - RenderUtility.rotateBlockBasedOnDirection(tileEntity.getDirection) - } - bindTexture(RenderChemicalExtractor.TEXTURE) - if (RenderChemicalExtractor.MODEL.isInstanceOf[FixedTechneModel]) - { - GL11.glPushMatrix - (RenderChemicalExtractor.MODEL.asInstanceOf[FixedTechneModel]).renderOnlyAroundPivot(Math.toDegrees(tileEntity.rotation), 0, 0, 1, "MAIN CHAMBER-ROTATES", "MAGNET 1-ROTATES", "MAGNET 2-ROTATES") - GL11.glPopMatrix - RenderChemicalExtractor.MODEL.renderAllExcept("MAIN CHAMBER-ROTATES", "MAGNET 1-ROTATES", "MAGNET 2-ROTATES") - } - else - { - RenderChemicalExtractor.MODEL.renderAll - } - GL11.glPopMatrix - } - - def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) - { - this.render(tileEntity.asInstanceOf[TileChemicalExtractor], var2, var4, var6, var8) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/extractor/TileProcess.scala b/src/main/scala/resonantinduction/atomic/machine/extractor/TileProcess.scala deleted file mode 100644 index f830eba84..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/extractor/TileProcess.scala +++ /dev/null @@ -1,96 +0,0 @@ -package resonantinduction.atomic.machine.extractor - -import net.minecraft.block.material.Material -import net.minecraft.item.ItemStack -import net.minecraftforge.fluids.{FluidContainerRegistry, FluidStack, FluidTank} -import resonant.api.recipe.{MachineRecipes, RecipeResource} -import resonant.lib.prefab.tile.TileElectricInventory - -/** - * General class for all machines that do traditional recipe processing - * - * @author Calclavia - */ -abstract class TileProcess(material: Material) extends TileElectricInventory(material) -{ - protected var inputSlot: Int = 0 - protected var outputSlot: Int = 0 - protected var tankInputFillSlot: Int = 0 - protected var tankInputDrainSlot: Int = 0 - protected var tankOutputFillSlot: Int = 0 - protected var tankOutputDrainSlot: Int = 0 - protected var machineName: String = null - - override def update - { - super.update - if (getInputTank != null) - { - fillOrDrainTank(tankInputFillSlot, tankInputDrainSlot, getInputTank) - } - if (getOutputTank != null) - { - fillOrDrainTank(tankOutputFillSlot, tankOutputDrainSlot, getOutputTank) - } - } - - /** - * Takes an fluid container item and try to fill the tank, dropping the remains in the output slot. - */ - def fillOrDrainTank(containerInput: Int, containerOutput: Int, tank: FluidTank) - { - val inputStack: ItemStack = getStackInSlot(containerInput) - val outputStack: ItemStack = getStackInSlot(containerOutput) - if (FluidContainerRegistry.isFilledContainer(inputStack)) - { - val fluidStack: FluidStack = FluidContainerRegistry.getFluidForFilledItem(inputStack) - val result: ItemStack = inputStack.getItem.getContainerItem(inputStack) - if (result != null && tank.fill(fluidStack, false) >= fluidStack.amount && (outputStack == null || result.isItemEqual(outputStack))) - { - tank.fill(fluidStack, true) - decrStackSize(containerInput, 1) - incrStackSize(containerOutput, result) - } - } - else if (FluidContainerRegistry.isEmptyContainer(inputStack)) - { - val avaliable: FluidStack = tank.getFluid - if (avaliable != null) - { - val result: ItemStack = FluidContainerRegistry.fillFluidContainer(avaliable, inputStack) - val filled: FluidStack = FluidContainerRegistry.getFluidForFilledItem(result) - if (result != null && filled != null && (outputStack == null || result.isItemEqual(outputStack))) - { - decrStackSize(containerInput, 1) - incrStackSize(containerOutput, result) - tank.drain(filled.amount, true) - } - } - } - } - - /** - * Gets the current result of the input set up. - * - * @return - */ - def getResults: Array[RecipeResource] = - { - val inputStack: ItemStack = getStackInSlot(inputSlot) - val mixedResult: Array[RecipeResource] = MachineRecipes.instance.getOutput(machineName, inputStack, getInputTank.getFluid) - if (mixedResult.length > 0) - { - return mixedResult - } - return MachineRecipes.instance.getOutput(machineName, inputStack) - } - - def hasResult: Boolean = - { - return getResults.length > 0 - } - - def getInputTank: FluidTank - - def getOutputTank: FluidTank -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/plasma/RenderPlasmaHeater.scala b/src/main/scala/resonantinduction/atomic/machine/plasma/RenderPlasmaHeater.scala deleted file mode 100644 index 7aceacb9c..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/plasma/RenderPlasmaHeater.scala +++ /dev/null @@ -1,38 +0,0 @@ -package resonantinduction.atomic.machine.plasma - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderTaggedTile -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderPlasmaHeater -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "fusionReactor.tcn")) - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "fusionReactor.png") -} - -@SideOnly(Side.CLIENT) class RenderPlasmaHeater extends RenderTaggedTile -{ - override def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) - { - val tileEntity: TilePlasmaHeater = t.asInstanceOf[TilePlasmaHeater] - if (tileEntity.world != null) - { - super.renderTileEntityAt(t, x, y, z, f) - } - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - bindTexture(RenderPlasmaHeater.TEXTURE) - GL11.glPushMatrix - GL11.glRotated(Math.toDegrees(tileEntity.rotation), 0, 1, 0) - RenderPlasmaHeater.MODEL.renderOnly(Array("rrot", "srot") : _*) - GL11.glPopMatrix - RenderPlasmaHeater.MODEL.renderAllExcept(Array("rrot", "srot") : _*) - GL11.glPopMatrix - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/quantum/ContainerQuantumAssembler.scala b/src/main/scala/resonantinduction/atomic/machine/quantum/ContainerQuantumAssembler.scala deleted file mode 100644 index b2c985873..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/quantum/ContainerQuantumAssembler.scala +++ /dev/null @@ -1,97 +0,0 @@ -package resonantinduction.atomic.machine.quantum - -import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} -import net.minecraft.inventory.{Container, IInventory, Slot} -import net.minecraft.item.ItemStack -import resonantinduction.atomic.AtomicContent - -class ContainerQuantumAssembler extends Container -{ - private var tileEntity: TileQuantumAssembler = null - - def this(par1InventoryPlayer: InventoryPlayer, tileEntity: TileQuantumAssembler) - { - this() - this.tileEntity = tileEntity - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 0, 80, 40)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 1, 53, 56)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 2, 107, 56)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 3, 53, 88)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 4, 107, 88)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 5, 80, 103)) - this.addSlotToContainer(new Slot(tileEntity.asInstanceOf[IInventory], 6, 80, 72)) - - for (var3 <- 0 to 3) - { - var var4: Int = 0 - for (var4 <- 0 to 9) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 148 + var3 * 18)) - - } - } - for (var3 <- 0 to 9) - { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 206)) - } - } - - override def onContainerClosed(entityplayer: EntityPlayer) - { - super.onContainerClosed(entityplayer) - } - - def canInteractWith(par1EntityPlayer: EntityPlayer): Boolean = - { - return this.tileEntity.isUseableByPlayer(par1EntityPlayer) - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = - { - var var2: ItemStack = null - val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] - if (var3 != null && var3.getHasStack) - { - val itemStack: ItemStack = var3.getStack - var2 = itemStack.copy - if (par1 > 6) - { - if (itemStack.getItem eq AtomicContent.itemDarkMatter) - { - if (!this.mergeItemStack(itemStack, 0, 6, false)) - { - return null - } - } - else if (!this.getSlot(6).getHasStack) - { - if (!this.mergeItemStack(itemStack, 6, 7, false)) - { - return null - } - } - } - else if (!this.mergeItemStack(itemStack, 7, 36 + 7, false)) - { - return null - } - if (itemStack.stackSize == 0) - { - var3.putStack(null.asInstanceOf[ItemStack]) - } - else - { - var3.onSlotChanged - } - if (itemStack.stackSize == var2.stackSize) - { - return null - } - var3.onPickupFromSlot(par1EntityPlayer, itemStack) - } - return var2 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/quantum/GuiQuantumAssembler.scala b/src/main/scala/resonantinduction/atomic/machine/quantum/GuiQuantumAssembler.scala deleted file mode 100644 index 5919bbf89..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/quantum/GuiQuantumAssembler.scala +++ /dev/null @@ -1,56 +0,0 @@ -package resonantinduction.atomic.machine.quantum - -import net.minecraft.entity.player.InventoryPlayer -import net.minecraft.util.ResourceLocation -import org.lwjgl.opengl.GL11 -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.utility.science.UnitDisplay -import resonantinduction.core.Reference - -object GuiQuantumAssembler -{ - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.guiDirectory + "gui_atomic_assembler.png") -} - -class GuiQuantumAssembler(par1InventoryPlayer: InventoryPlayer, tileEntity: TileQuantumAssembler) extends GuiContainerBase(new ContainerQuantumAssembler(par1InventoryPlayer, tileEntity)) -{ - //Constructor - this.ySize = 230 - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) - { - this.fontRendererObj.drawString("Assembler", 65 - "Assembler".length, 6, 4210752) - var displayText: String = "" - if (this.tileEntity.time > 0) - { - displayText = "Process: " + (100 - (this.tileEntity.time.asInstanceOf[Float] / this.tileEntity.MAX_TIME.asInstanceOf[Float]) * 100).asInstanceOf[Int] + "%" - } - else if (this.tileEntity.canProcess) - { - displayText = "Ready" - } - else - { - displayText = "Idle" - } - this.fontRendererObj.drawString(displayText, 9, this.ySize - 106, 4210752) - this.renderUniversalDisplay(100, this.ySize - 94, this.tileEntity.getVoltage, mouseX, mouseY, UnitDisplay.Unit.VOLTAGE) - this.renderUniversalDisplay(8, this.ySize - 95, tileEntity.MAX_TIME, mouseX, mouseY, UnitDisplay.Unit.WATT) - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, par2: Int, par3: Int) - { - this.mc.renderEngine.bindTexture(GuiQuantumAssembler.TEXTURE) - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F) - this.containerWidth = (this.width - this.xSize) / 2 - this.containerHeight = (this.height - this.ySize) / 2 - this.drawTexturedModalRect(this.containerWidth, this.containerHeight, 0, 0, this.xSize, this.ySize) - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/quantum/RenderQuantumAssembler.scala b/src/main/scala/resonantinduction/atomic/machine/quantum/RenderQuantumAssembler.scala deleted file mode 100644 index 98e7be6e1..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/quantum/RenderQuantumAssembler.scala +++ /dev/null @@ -1,59 +0,0 @@ -package resonantinduction.atomic.machine.quantum - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.entity.{RenderItem, RenderManager} -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.entity.item.EntityItem -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} -import org.lwjgl.opengl.GL11 -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderQuantumAssembler -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "quantumAssembler.tcn")) - final val TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "quantumAssembler.png") - final val hands: Array[java.lang.String] = Array[java.lang.String]("Back Arm Upper", "Back Arm Lower", "Right Arm Upper", "Right Arm Lower", "Front Arm Upper", "Front Arm Lower", "Left Arm Upper", "Left Arm Lower") - final val arms: Array[java.lang.String] = Array[java.lang.String]("Middle Rotor Focus Lazer", "Middle Rotor Uppper Arm", "Middle Rotor Lower Arm", "Middle Rotor Arm Base", "Middle Rotor") - final val largeArms: Array[java.lang.String] = Array[java.lang.String]("Bottom Rotor Upper Arm", "Bottom Rotor Lower Arm", "Bottom Rotor Arm Base", "Bottom Rotor", "Bottom Rotor Resonator Arm") - final val all: Array[java.lang.String] = Array[java.lang.String]("Resonance_Crystal", "Back Arm Upper", "Back Arm Lower", "Right Arm Upper", "Right Arm Lower", "Front Arm Upper", "Front Arm Lower", "Left Arm Upper", "Left Arm Lower", "Middle Rotor Focus Lazer", "Middle Rotor Uppper Arm", "Middle Rotor Lower Arm", "Middle Rotor Arm Base", "Middle Rotor", "Bottom Rotor Upper Arm", "Bottom Rotor Lower Arm", "Bottom Rotor Arm Base", "Bottom Rotor", "Bottom Rotor Resonator Arm") - -} - -@SideOnly(Side.CLIENT) class RenderQuantumAssembler extends TileEntitySpecialRenderer -{ - def render(tileEntity: TileQuantumAssembler, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - bindTexture(RenderQuantumAssembler.TEXTURE) - GL11.glPushMatrix - GL11.glRotatef(-tileEntity.rotation.xf, 0, 1f, 0) - RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.hands: _*) - RenderQuantumAssembler.MODEL.renderOnly("Resonance_Crystal") - GL11.glPopMatrix - GL11.glPushMatrix - GL11.glRotatef(tileEntity.rotation.yf, 0, 1f, 0) - RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.arms: _*) - GL11.glPopMatrix - GL11.glPushMatrix - GL11.glRotatef(-tileEntity.rotation.zf, 0, 1f, 0) - RenderQuantumAssembler.MODEL.renderOnly(RenderQuantumAssembler.largeArms: _*) - GL11.glPopMatrix - RenderQuantumAssembler.MODEL.renderAllExcept(RenderQuantumAssembler.all : _*) - GL11.glPopMatrix - val renderItem: RenderItem = (RenderManager.instance.getEntityClassRenderObject(classOf[EntityItem]).asInstanceOf[RenderItem]) - GL11.glPushMatrix - if (tileEntity.entityItem != null) - { - renderItem.doRender(tileEntity.entityItem, x + 0.5, y + 0.4, z + 0.5, 0, 0) - } - GL11.glPopMatrix - } - - def renderTileEntityAt(tileEntity: TileEntity, var2: Double, var4: Double, var6: Double, var8: Float) - { - this.render(tileEntity.asInstanceOf[TileQuantumAssembler], var2, var4, var6, var8) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/ContainerReactorCell.scala b/src/main/scala/resonantinduction/atomic/machine/reactor/ContainerReactorCell.scala deleted file mode 100644 index 875399957..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/ContainerReactorCell.scala +++ /dev/null @@ -1,68 +0,0 @@ -package resonantinduction.atomic.machine.reactor - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.inventory.Slot -import net.minecraft.item.ItemStack -import resonant.lib.prefab.gui.ContainerBase -import resonant.lib.prefab.gui.slot.SlotSpecific -import resonantinduction.atomic.items.{ItemBreederFuel, ItemFissileFuel} - -class ContainerReactorCell(player: EntityPlayer, tileEntity: TileReactorCell) extends ContainerBase(tileEntity) -{ - //Constructor - this.addSlotToContainer(new SlotSpecific(tileEntity, 0, 79, 17, classOf[ItemFissileFuel], classOf[ItemBreederFuel])) - this.addPlayerInventory(player) - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - override def transferStackInSlot(par1EntityPlayer: EntityPlayer, par1: Int): ItemStack = - { - var var2: ItemStack = null - val var3: Slot = this.inventorySlots.get(par1).asInstanceOf[Slot] - if (var3 != null && var3.getHasStack) - { - val itemStack: ItemStack = var3.getStack - var2 = itemStack.copy - if (par1 >= this.slotCount) - { - if (this.getSlot(0).isItemValid(itemStack)) - { - if (!this.mergeItemStack(itemStack, 0, 1, false)) - { - return null - } - } - else if (par1 < 27 + this.slotCount) - { - if (!this.mergeItemStack(itemStack, 27 + slotCount, 36 + slotCount, false)) - { - return null - } - } - else if (par1 >= 27 + slotCount && par1 < 36 + slotCount && !this.mergeItemStack(itemStack, 4, 30, false)) - { - return null - } - } - else if (!this.mergeItemStack(itemStack, slotCount, 36 + slotCount, false)) - { - return null - } - if (itemStack.stackSize == 0) - { - var3.putStack(null.asInstanceOf[ItemStack]) - } - else - { - var3.onSlotChanged - } - if (itemStack.stackSize == var2.stackSize) - { - return null - } - var3.onPickupFromSlot(par1EntityPlayer, itemStack) - } - return var2 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/GuiReactorCell.scala b/src/main/scala/resonantinduction/atomic/machine/reactor/GuiReactorCell.scala deleted file mode 100644 index 990d2dbaa..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/GuiReactorCell.scala +++ /dev/null @@ -1,50 +0,0 @@ -package resonantinduction.atomic.machine.reactor - -import net.minecraft.entity.player.InventoryPlayer -import org.lwjgl.opengl.GL11 -import resonant.lib.prefab.gui.GuiContainerBase -import resonant.lib.utility.LanguageUtility - -class GuiReactorCell(inventory: InventoryPlayer, tileEntity: TileReactorCell) extends GuiContainerBase(new ContainerReactorCell(inventory.player, tileEntity)) -{ - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - override def drawGuiContainerForegroundLayer(x: Int, y: Int) - { - fontRendererObj.drawString(tileEntity.getInvName, xSize / 2 - fontRendererObj.getStringWidth(tileEntity.getInvName) / 2, 6, 4210752) - if (tileEntity.getStackInSlot(0) != null) - { - fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.temperature"), 9, 45, 4210752) - fontRendererObj.drawString(String.valueOf(tileEntity.getTemperature.asInstanceOf[Int]) + "/" + String.valueOf(TileReactorCell.MELTING_POINT) + " K", 9, 58, 4210752) - val secondsLeft: Int = (tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage) - fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.remainingTime"), 100, 45, 4210752) - fontRendererObj.drawString(secondsLeft + " seconds", 100, 58, 4210752) - } - fontRendererObj.drawString(LanguageUtility.getLocal("tooltip.remainingTime"), 100, 45, 4210752) - } - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - protected override def drawGuiContainerBackgroundLayer(par1: Float, x: Int, y: Int) - { - super.drawGuiContainerBackgroundLayer(par1, x, y) - drawSlot(78, 16) - drawMeter(80, 36, tileEntity.tank.getFluidAmount.asInstanceOf[Float] / tileEntity.tank.getCapacity.asInstanceOf[Float], tileEntity.tank.getFluid) - if (tileEntity.getStackInSlot(0) != null) - { - GL11.glPushMatrix - GL11.glTranslatef(32 * 2, 0, 0) - GL11.glScalef(0.5f, 1, 1) - drawForce(20, 70, (tileEntity.getTemperature) / (TileReactorCell.MELTING_POINT)) - GL11.glPopMatrix - GL11.glPushMatrix - GL11.glTranslatef(68 * 2, 0, 0) - GL11.glScalef(0.5f, 1, 1) - val ticksLeft: Float = (tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage) - drawElectricity(70, 70, ticksLeft / tileEntity.getStackInSlot(0).getMaxDamage) - GL11.glPopMatrix - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/reactor/RenderReactorCell.scala b/src/main/scala/resonantinduction/atomic/machine/reactor/RenderReactorCell.scala deleted file mode 100644 index 7d7f092d2..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/reactor/RenderReactorCell.scala +++ /dev/null @@ -1,83 +0,0 @@ -package resonantinduction.atomic.machine.reactor - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom} -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility -import resonant.lib.render.model.ModelCube -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderReactorCell -{ - final val MODEL_TOP: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellTop.tcn")) - final val MODEL_MIDDLE: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellMiddle.tcn")) - final val MODEL_BOTTOM: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellBottom.tcn")) - final val TEXTURE_TOP: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellTop.png") - final val TEXTURE_MIDDLE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellMiddle.png") - final val TEXTURE_BOTTOM: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "reactorCellBottom.png") - final val TEXTURE_FISSILE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "fissileMaterial.png") -} - -@SideOnly(Side.CLIENT) class RenderReactorCell extends TileEntitySpecialRenderer -{ - def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) - { - val tileEntity: TileReactorCell = t.asInstanceOf[TileReactorCell] - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - var meta: Int = 2 - if (tileEntity.world != null) - { - meta = tileEntity.getBlockMetadata - } - val hasBelow: Boolean = tileEntity.world != null && t.getWorldObj.getTileEntity(t.xCoord, t.yCoord - 1, t.zCoord).isInstanceOf[TileReactorCell] - - if (meta == 0) - { - bindTexture(RenderReactorCell.TEXTURE_BOTTOM) - RenderReactorCell.MODEL_BOTTOM.renderAll - } else if (meta == 1) - { - bindTexture(RenderReactorCell.TEXTURE_MIDDLE) - GL11.glTranslatef(0, 0.075f, 0) - GL11.glScalef(1f, 1.15f, 1f) - RenderReactorCell.MODEL_MIDDLE.renderAll - } else - { - bindTexture(RenderReactorCell.TEXTURE_TOP) - if (hasBelow) - { - GL11.glScalef(1f, 1.32f, 1f) - } - else - { - GL11.glTranslatef(0, 0.1f, 0) - GL11.glScalef(1f, 1.2f, 1f) - } - if (hasBelow) - { - RenderReactorCell.MODEL_TOP.renderAllExcept("BottomPad", "BaseDepth", "BaseWidth", "Base") - } - else - { - RenderReactorCell.MODEL_TOP.renderAll - } - } - GL11.glPopMatrix - if (tileEntity.getStackInSlot(0) != null) - { - val height: Float = tileEntity.getHeight * ((tileEntity.getStackInSlot(0).getMaxDamage - tileEntity.getStackInSlot(0).getItemDamage).asInstanceOf[Float] / tileEntity.getStackInSlot(0).getMaxDamage.asInstanceOf[Float]) - GL11.glPushMatrix - GL11.glTranslatef(x.asInstanceOf[Float] + 0.5F, y.asInstanceOf[Float] + 0.5F * height, z.asInstanceOf[Float] + 0.5F) - GL11.glScalef(0.4f, 0.9f * height, 0.4f) - bindTexture(RenderReactorCell.TEXTURE_FISSILE) - RenderUtility.disableLighting - ModelCube.INSTNACE.render - RenderUtility.enableLighting - GL11.glPopMatrix - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/machine/thermometer/RenderThermometer.scala b/src/main/scala/resonantinduction/atomic/machine/thermometer/RenderThermometer.scala deleted file mode 100644 index 5858565df..000000000 --- a/src/main/scala/resonantinduction/atomic/machine/thermometer/RenderThermometer.scala +++ /dev/null @@ -1,28 +0,0 @@ -package resonantinduction.atomic.machine.thermometer - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility - -@SideOnly(Side.CLIENT) class RenderThermometer extends TileEntitySpecialRenderer -{ - def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, var8: Float) - { - val tile: TileThermometer = tileEntity.asInstanceOf[TileThermometer] - GL11.glPushMatrix - RenderUtility.enableLightmap - - for (side <- 2 to 6) - { - RenderUtility.renderText((if (tile.isOverThreshold) "\u00a74" else "") + Math.round(tile.detectedTemperature) + " K", side, 0.8f, x, y + 0.1, z) - RenderUtility.renderText((if (tile.isOverThreshold) "\u00a74" else "\u00a71") + "Threshold: " + (tile.getThershold) + " K", side, 1, x, y - 0.1, z) - if (tile.trackCoordinate != null) - { - RenderUtility.renderText(tile.trackCoordinate.xi + ", " + tile.trackCoordinate.yi + ", " + tile.trackCoordinate.zi, side, 0.5f, x, y - 0.3, z) - } - } - GL11.glPopMatrix - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/schematic/SchematicAccelerator.scala b/src/main/scala/resonantinduction/atomic/schematic/SchematicAccelerator.scala deleted file mode 100644 index 9f3bd38d8..000000000 --- a/src/main/scala/resonantinduction/atomic/schematic/SchematicAccelerator.scala +++ /dev/null @@ -1,39 +0,0 @@ -package resonantinduction.atomic.schematic - -import java.util.HashMap - -import net.minecraft.block.Block -import net.minecraft.init.Blocks -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.collection.Pair -import resonant.lib.transform.vector.Vector3 -import resonant.lib.world.schematic.Schematic -import resonantinduction.atomic.AtomicContent - -class SchematicAccelerator extends Schematic -{ - override def getName: String = - { - return "schematic.accelerator.name" - } - - def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = - { - val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] - - //Bottom - returnMap.putAll(getBox(new Vector3(0, 0, 0), AtomicContent.blockElectromagnet, 1, size)) - returnMap.putAll(getBox(new Vector3(0, 0, 0), AtomicContent.blockElectromagnet, 0, size - 1)) - returnMap.putAll(getBox(new Vector3(0, 0, 0), AtomicContent.blockElectromagnet, 0, size + 1)) - //Mid - returnMap.putAll(getBox(new Vector3(0, 1, 0), Blocks.air, 0, size)) - returnMap.putAll(getBox(new Vector3(0, 1, 0), AtomicContent.blockElectromagnet, 1, size - 1)) - returnMap.putAll(getBox(new Vector3(0, 1, 0), AtomicContent.blockElectromagnet, 1, size + 1)) - //Top - returnMap.putAll(getBox(new Vector3(0, 2, 0), AtomicContent.blockElectromagnet, 1, size)) - returnMap.putAll(getBox(new Vector3(0, 2, 0), AtomicContent.blockElectromagnet, 0, size - 1)) - returnMap.putAll(getBox(new Vector3(0, 2, 0), AtomicContent.blockElectromagnet, 0, size + 1)) - - return returnMap - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/schematic/SchematicBreedingReactor.scala b/src/main/scala/resonantinduction/atomic/schematic/SchematicBreedingReactor.scala deleted file mode 100644 index eb4b3293c..000000000 --- a/src/main/scala/resonantinduction/atomic/schematic/SchematicBreedingReactor.scala +++ /dev/null @@ -1,63 +0,0 @@ -package resonantinduction.atomic.schematic - -import java.util.HashMap - -import net.minecraft.block.Block -import net.minecraft.init.Blocks -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.collection.Pair -import resonant.lib.transform.vector.Vector3 -import resonant.lib.world.schematic.Schematic -import resonantinduction.atomic.AtomicContent - -class SchematicBreedingReactor extends Schematic -{ - override def getName: String = - { - return "schematic.breedingReactor.name" - } - - override def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = - { - val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] - var r: Int = Math.max(size, 2) - - for (x <- -r to r) - { - for (z <- -r to r) - { - returnMap.put(new Vector3(x, 0, z), new Pair[Block, Integer](Blocks.water, 0)) - } - } - - r -= 1 - - for (x <- -r to r) - { - for (z <- -r to r) - { - val targetPosition: Vector3 = new Vector3(x, 1, z) - if (new Vector3(x, 0, z).magnitude <= 2) - { - if (!((x == -r || x == r) && (z == -r || z == r))) - { - returnMap.put(new Vector3(x, 0, z), new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) - returnMap.put(new Vector3(x, -3, z), new Pair[Block, Integer](AtomicContent.blockSiren, 0)) - returnMap.put(new Vector3(x, -2, z), new Pair[Block, Integer](Blocks.redstone_wire, 0)) - } - else - { - returnMap.put(new Vector3(x, -1, z), new Pair[Block, Integer](AtomicContent.blockControlRod, 0)) - returnMap.put(new Vector3(x, -2, z), new Pair[Block, Integer](Blocks.piston, 1)) - } - } - } - } - - returnMap.put(new Vector3(0, -2, 0), new Pair[Block, Integer](Blocks.stone, 0)) - returnMap.put(new Vector3(0, -3, 0), new Pair[Block, Integer](Blocks.stone, 0)) - returnMap.put(new Vector3, new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) - return returnMap - } - -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/atomic/schematic/SchematicFusionReactor.scala b/src/main/scala/resonantinduction/atomic/schematic/SchematicFusionReactor.scala deleted file mode 100644 index c2d685bef..000000000 --- a/src/main/scala/resonantinduction/atomic/schematic/SchematicFusionReactor.scala +++ /dev/null @@ -1,62 +0,0 @@ -package resonantinduction.atomic.schematic - -import java.util.HashMap - -import net.minecraft.block.Block -import net.minecraft.init.Blocks -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.collection.Pair -import resonant.lib.transform.vector.Vector3 -import resonant.lib.world.schematic.Schematic -import resonantinduction.atomic.AtomicContent - -class SchematicFusionReactor extends Schematic -{ - override def getName: String = - { - return "schematic.fusionReactor.name" - } - - def getStructure(dir: ForgeDirection, size: Int): HashMap[Vector3, Pair[Block, Integer]] = - { - val returnMap: HashMap[Vector3, Pair[Block, Integer]] = new HashMap[Vector3, Pair[Block, Integer]] - val r: Int = size + 2 - for (y <- 0 to size; x <- -r to r; z <- -r to r) - { - val position: Vector3 = new Vector3(x, y, z) - val magnitude: Double = Math.sqrt(x * x + z * z) - if (!returnMap.containsKey(position)) - { - returnMap.put(position, new Pair[Block, Integer](Blocks.air, 0)) - } - if (magnitude <= r) - { - if (y == 0 || y == size) - { - if (magnitude >= 1) - { - val yDeviation: Double = (if (y == 0) size / 3 else -size / 3) + (if (y == 0) -1 else 1) * Math.sin(magnitude / r * Math.PI) * size / 2d - val newPos: Vector3 = position.clone.add(0, yDeviation, 0) - returnMap.put(newPos.round, new Pair[Block, Integer](AtomicContent.blockElectromagnet, 1)) - } - } - else if (magnitude > r - 1) - { - returnMap.put(position, new Pair[Block, Integer](AtomicContent.blockElectromagnet, 0)) - } - } - } - - for (y <- 0 to size) - { - returnMap.put(new Vector3(0, y, 0), new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) - returnMap.put(new Vector3(1, y, 0), new Pair[Block, Integer](AtomicContent.blockElectromagnet, 0)) - returnMap.put(new Vector3(0, y, 1), new Pair[Block, Integer](AtomicContent.blockElectromagnet, 0)) - returnMap.put(new Vector3(0, y, -1), new Pair[Block, Integer](AtomicContent.blockElectromagnet, 0)) - returnMap.put(new Vector3(-1, y, 0), new Pair[Block, Integer](AtomicContent.blockElectromagnet, 0)) - - } - returnMap.put(new Vector3(0, 0, 0), new Pair[Block, Integer](AtomicContent.blockReactorCell, 0)) - return returnMap - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/CommonProxy.scala b/src/main/scala/resonantinduction/core/CommonProxy.scala deleted file mode 100644 index 94bd7a241..000000000 --- a/src/main/scala/resonantinduction/core/CommonProxy.scala +++ /dev/null @@ -1,138 +0,0 @@ -package resonantinduction.core - -import java.awt._ - -import codechicken.multipart.{TMultiPart, TileMultipart} -import net.minecraft.block.Block -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.tileentity.TileEntity -import net.minecraft.world.World -import resonant.lib.mod.AbstractProxy -import resonantinduction.atomic.machine.accelerator.{ContainerAccelerator, TileAccelerator} -import resonantinduction.atomic.machine.boiler.{ContainerNuclearBoiler, TileNuclearBoiler} -import resonantinduction.atomic.machine.centrifuge.{ContainerCentrifuge, TileCentrifuge} -import resonantinduction.atomic.machine.extractor.{ContainerChemicalExtractor, TileChemicalExtractor} -import resonantinduction.atomic.machine.quantum.{ContainerQuantumAssembler, TileQuantumAssembler} -import resonantinduction.atomic.machine.reactor.{ContainerReactorCell, TileReactorCell} -import resonantinduction.electrical.multimeter.{ContainerMultimeter, PartMultimeter} -import resonant.lib.transform.vector.Vector3 - -/** - * @author Calclavia - */ -class CommonProxy extends AbstractProxy -{ - def getArmorIndex(armor: String): Int = - { - return 0 - } - - override def getServerGuiElement(id: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): AnyRef = - { - val tileEntity: TileEntity = world.getTileEntity(x, y, z) - if (tileEntity.isInstanceOf[TileMultipart]) - { - val part: TMultiPart = (tileEntity.asInstanceOf[TileMultipart]).partMap(id) - if (part.isInstanceOf[PartMultimeter]) - { - return new ContainerMultimeter(player.inventory, (part.asInstanceOf[PartMultimeter])) - } - } - else if (tileEntity.isInstanceOf[TileCentrifuge]) - { - return new ContainerCentrifuge(player.inventory, (tileEntity.asInstanceOf[TileCentrifuge])) - } - else if (tileEntity.isInstanceOf[TileChemicalExtractor]) - { - return new ContainerChemicalExtractor(player.inventory, (tileEntity.asInstanceOf[TileChemicalExtractor])) - } - else if (tileEntity.isInstanceOf[TileAccelerator]) - { - return new ContainerAccelerator(player, (tileEntity.asInstanceOf[TileAccelerator])) - } - else if (tileEntity.isInstanceOf[TileQuantumAssembler]) - { - return new ContainerQuantumAssembler(player.inventory, (tileEntity.asInstanceOf[TileQuantumAssembler])) - } - else if (tileEntity.isInstanceOf[TileNuclearBoiler]) - { - return new ContainerNuclearBoiler(player, (tileEntity.asInstanceOf[TileNuclearBoiler])) - } - else if (tileEntity.isInstanceOf[TileReactorCell]) - { - return new ContainerReactorCell(player, (tileEntity.asInstanceOf[TileReactorCell])) - } - return null - } - - def isPaused: Boolean = - { - return false - } - - def isGraphicsFancy: Boolean = - { - return false - } - - def renderBlockParticle(world: World, x: Double, y: Double, z: Double, velocity: Vector3, blockID: Int, scale: Float) - { - } - - def renderBlockParticle(world: World, position: Vector3, velocity: Vector3, blockID: Int, scale: Float) - { - } - - def renderBeam(world: World, position: Vector3, hit: Vector3, color: Color, age: Int) - { - } - - def renderBeam(world: World, position: Vector3, target: Vector3, red: Float, green: Float, blue: Float, age: Int) - { - } - - - def renderElectricShock(world: World, start: Vector3, target: Vector3, r: Float, g: Float, b: Float, split: Boolean) - { - } - - def renderElectricShock(world: World, start: Vector3, target: Vector3, r: Float, g: Float, b: Float) - { - this.renderElectricShock(world, start, target, r, g, b, true) - } - - def renderElectricShock(world: World, start: Vector3, target: Vector3, color: Color) - { - this.renderElectricShock(world, start, target, color.getRed / 255f, color.getGreen / 255f, color.getBlue / 255f) - } - - def renderElectricShock(world: World, start: Vector3, target: Vector3, color: Color, split: Boolean) - { - this.renderElectricShock(world, start, target, color.getRed / 255f, color.getGreen / 255f, color.getBlue / 255f, split) - } - - def renderElectricShock(world: World, start: Vector3, target: Vector3) - { - this.renderElectricShock(world, start, target, true) - } - - def renderElectricShock(world: World, start: Vector3, target: Vector3, b: Boolean) - { - this.renderElectricShock(world, start, target, 0.55f, 0.7f, 1f, b) - } - - def renderBlockParticle(world: World, position: Vector3, block: Block, side: Int) - { - - } - - def renderLaser(world: World, start: Vector3, end: Vector3, color: Vector3, energy: Double) - { - - } - - def renderScorch(world: World, position: Vector3, side: Int) - { - - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/RICreativeTab.scala b/src/main/scala/resonantinduction/core/RICreativeTab.scala deleted file mode 100644 index 3c257fad6..000000000 --- a/src/main/scala/resonantinduction/core/RICreativeTab.scala +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - */ -package resonantinduction.core - -import net.minecraft.creativetab.CreativeTabs -import net.minecraft.init.Items -import net.minecraft.item.{Item, ItemStack} - -/** - * @author Calclavia - * - */ -object RICreativeTab extends CreativeTabs(CreativeTabs.getNextID, "resonantinduction") -{ - var itemStack: ItemStack = null - - override def getTabIconItem: Item =itemStack.getItem -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/Settings.scala b/src/main/scala/resonantinduction/core/Settings.scala deleted file mode 100644 index d1358d339..000000000 --- a/src/main/scala/resonantinduction/core/Settings.scala +++ /dev/null @@ -1,75 +0,0 @@ -package resonantinduction.core - -import cpw.mods.fml.common.eventhandler.SubscribeEvent -import net.minecraft.block.Block -import net.minecraft.item.ItemStack -import net.minecraftforge.common.config.Configuration -import resonant.api.recipe.QuantumAssemblerRecipes -import resonant.lib.mod.config.Config -import resonant.lib.mod.config.ConfigEvent.PostConfigEvent -import resonant.lib.prefab.poison.PotionRadiation - -import scala.collection.convert.wrapAll._ - -/** @author Calclavia */ -object Settings -{ - var config: Configuration = _ - - @Config(key = "Tesla Sound FXs") - var SOUND_FXS = true - @Config(key = "Shiny silver Wires") - var SHINY_SILVER = true - - //Turbine Settings - - @Config var allowTurbineStacking: Boolean = true - - // Power Settings - @Config(category = "Power", key = "SolorPanel") - var solarPower: Int = 50 - @Config(category = "Power") - var fulminationOutputMultiplier: Double = 1 - @Config(category = "Power", key = "AcceleratorCostPerTick") - final val ACCELERATOR_ENERGY_COST_PER_TICK : Int = 4800000 - @Config(category = "Power", key = "WindTubineRatio") - var WIND_POWER_RATIO: Int = 1 - @Config(category = "Power", key = "WaterTubineRatio") - var WATER_POWER_RATIO: Int = 1 - @Config(category = "Power", key = "TubineRatio", comment = "Restricts the output of all turbines") - var turbineOutputMultiplier: Double = 1 - - //Disable/Enable Settings - @Config(category = "Enable") - var allowToxicWaste: Boolean = true - @Config(category = "Enable") - var allowRadioactiveOres: Boolean = true - @Config(category = "Enable", key = "EngineeringTableAutocraft") - var ALLOW_ENGINEERING_AUTOCRAFT = true - - //Fluid Settings - @Config var fissionBoilVolumeMultiplier: Double = 1 - @Config var uraniumHexaflourideRatio: Int = 200 - @Config var waterPerDeutermium: Int = 4 - @Config var deutermiumPerTritium: Int = 4 - @Config var darkMatterSpawnChance: Double = 0.2 - @Config var steamMultiplier: Double = 1 - - //Recipe Settings - @Config var allowOreDictionaryCompatibility: Boolean = true - @Config var allowAlternateRecipes: Boolean = true - @Config(comment = "Put a list of block/item IDs to be used by the Quantum Assembler. Separate by commas, no space.") - var quantumAssemblerRecipes: Array[String] = _ - @Config(comment = "0 = Do not generate, 1 = Generate items only, 2 = Generate all") - var quantumAssemblerGenerateMode: Int = 1 - @Config var allowIC2UraniumCompression: Boolean = true - @Config - var ACCELERATOR_ANITMATTER_DENSITY_MULTIPLIER: Int = 1 - - @SubscribeEvent - def configEvent(evt: PostConfigEvent) - { - QuantumAssemblerRecipes.RECIPES.addAll(quantumAssemblerRecipes.map(x => new ItemStack(Block.blockRegistry.getObject(x).asInstanceOf[Block])).toList) - PotionRadiation.INSTANCE.getId - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/render/InvertX.scala b/src/main/scala/resonantinduction/core/render/InvertX.scala deleted file mode 100644 index 583173466..000000000 --- a/src/main/scala/resonantinduction/core/render/InvertX.scala +++ /dev/null @@ -1,14 +0,0 @@ -package resonantinduction.core.render - -import codechicken.lib.vec.{Vector3, Matrix4, Transformation, VariableTransformation} - -class InvertX extends VariableTransformation(new Matrix4(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1)) -{ - override def inverse: Transformation = { - return this - } - - override def apply(vec: Vector3) { - vec.x = -vec.x - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/resource/content/BlockDecoration.scala b/src/main/scala/resonantinduction/core/resource/content/BlockDecoration.scala deleted file mode 100644 index 52f4d6361..000000000 --- a/src/main/scala/resonantinduction/core/resource/content/BlockDecoration.scala +++ /dev/null @@ -1,48 +0,0 @@ -package resonantinduction.core.resource.content - -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, ItemStack} -import net.minecraft.util.IIcon -import resonant.lib.prefab.tile.item.ItemBlockMetadata -import resonant.lib.prefab.tile.spatial.SpatialBlock -import resonant.lib.wrapper.WrapList._ -import resonantinduction.core.Reference - -/** - * A block used to build machines or decoration. - * - * @author Calclavia - * - */ -class BlockDecoration extends SpatialBlock(Material.rock) -{ - var iconNames = Array("material_stone_brick", "material_stone_brick2", "material_stone_chiseled", "material_stone_cobble", "material_stone_cracked", "material_stone", "material_stone_slab", "material_stone_mossy", "material_steel_dark", "material_steel_tint", "material_steel") - var icons = new Array[IIcon](iconNames.length) - - // Constructor - name = "industrialStone" - blockHardness = 1 - stepSound = Block.soundTypeStone - this.itemBlock = classOf[ItemBlockMetadata] - - override def getIcon(side: Int, metadata: Int): IIcon = - { - return icons(metadata) - } - - override def registerIcons(register: IIconRegister) - { - super.registerIcons(register) - (0 until icons.size) foreach (i => icons(i) = register.registerIcon(Reference.prefix + iconNames(i))) - } - - override def getSubBlocks(item: Item, par2CreativeTabs: CreativeTabs, list: List[_]) - { - (0 until iconNames.length) foreach (i => list.add(new ItemStack(item, 1, i))) - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.scala b/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.scala deleted file mode 100644 index a053a4f13..000000000 --- a/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.scala +++ /dev/null @@ -1,154 +0,0 @@ -package resonantinduction.electrical.battery - -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.world.World -import resonant.api.items.IEnergyItem -import resonant.lib.mod.compat.energy.Compatibility -import resonant.lib.render.EnumColor -import resonant.lib.utility.science.UnitDisplay -import resonant.lib.utility.LanguageUtility -import resonant.lib.wrapper.WrapList._ - -object ItemBlockBattery -{ - def setTier(itemStack: ItemStack, tier: Int): ItemStack = - { - if (itemStack.getTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound) - } - itemStack.getTagCompound.setByte("tier", tier.toByte) - return itemStack - } - - def getTier(itemStack: ItemStack): Int = - { - if (itemStack.getTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound) - } - return itemStack.getTagCompound.getByte("tier") - } -} - -class ItemBlockBattery(block: Block) extends ItemBlock(block) with IEnergyItem -{ - this.setMaxStackSize(1) - this.setMaxDamage(100) - this.setNoRepair - - override def addInformation(itemStack: ItemStack, entityPlayer: EntityPlayer, list: List[_], par4: Boolean) - { - list.add(LanguageUtility.getLocal("tooltip.tier") + ": " + (ItemBlockBattery.getTier(itemStack) + 1)) - var color: String = "" - val joules: Double = this.getEnergy(itemStack) - if (joules <= this.getEnergyCapacity(itemStack) / 3) - { - color = "\u00a74" - } - else if (joules > this.getEnergyCapacity(itemStack) * 2 / 3) - { - color = "\u00a72" - } - else - { - color = "\u00a76" - } - itemStack.getItemDamageForDisplay - list.add(LanguageUtility.getLocal("tooltip.battery.energy").replace("%0", color).replace("%1", EnumColor.GREY.toString).replace("%v0", new UnitDisplay(UnitDisplay.Unit.JOULES, joules).toString).replace("%v1", new UnitDisplay(UnitDisplay.Unit.JOULES, this.getEnergyCapacity(itemStack), true).toString)) - } - - /** - * Makes sure the item is uncharged when it is crafted and not charged. Change this if you do - * not want this to happen! - */ - override def onCreated(itemStack: ItemStack, par2World: World, par3EntityPlayer: EntityPlayer) - { - this.setEnergy(itemStack, 0) - } - - def recharge(itemStack: ItemStack, energy: Double, doReceive: Boolean): Double = - { - val rejectedElectricity: Double = Math.max((this.getEnergy(itemStack) + energy) - this.getEnergyCapacity(itemStack), 0) - val energyToReceive: Double = Math.min(energy - rejectedElectricity, getTransferRate(itemStack)) - if (doReceive) - { - this.setEnergy(itemStack, this.getEnergy(itemStack) + energyToReceive) - } - return energyToReceive - } - - def discharge(itemStack: ItemStack, energy: Double, doTransfer: Boolean): Double = - { - val energyToExtract: Double = Math.min(Math.min(this.getEnergy(itemStack), energy), getTransferRate(itemStack)) - if (doTransfer) - { - this.setEnergy(itemStack, this.getEnergy(itemStack) - energyToExtract) - } - return energyToExtract - } - - def getVoltage(itemStack: ItemStack): Double = - { - return 240 - } - - def setEnergy(itemStack: ItemStack, joules: Double) - { - if (itemStack.getTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound) - } - val electricityStored: Double = Math.max(Math.min(joules, this.getEnergyCapacity(itemStack)), 0) - itemStack.getTagCompound.setDouble("electricity", electricityStored) - } - - def getTransfer(itemStack: ItemStack): Double = - { - return this.getEnergyCapacity(itemStack) - this.getEnergy(itemStack) - } - - /** Gets the energy stored in the item. Energy is stored using item NBT */ - def getEnergy(itemStack: ItemStack): Double = - { - if (itemStack.getTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound) - } - val energyStored: Long = itemStack.getTagCompound.getLong("electricity") - return energyStored - } - - override def getDisplayDamage(stack: ItemStack): Int = - { - return (100 - (this.getEnergy(stack).asInstanceOf[Double] / getEnergyCapacity(stack).asInstanceOf[Double]) * 100).asInstanceOf[Int] - } - - def getEnergyCapacity(theItem: ItemStack): Double = - { - return TileBattery.getEnergyForTier(ItemBlockBattery.getTier(theItem)) - } - - def getTransferRate(itemStack: ItemStack): Double = - { - return this.getEnergyCapacity(itemStack) / 100 - } - - @SuppressWarnings(Array("unchecked")) - override def getSubItems(par1: Item, par2CreativeTabs: CreativeTabs, par3List: List[_]) - { - for (tier <- 0 to TileBattery.maxTier) - { - par3List.add(Compatibility.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(this), tier.asInstanceOf[Byte]), 0)) - par3List.add(Compatibility.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(this), tier.asInstanceOf[Byte]), TileBattery.getEnergyForTier(tier))) - - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/tesla/ITesla.scala b/src/main/scala/resonantinduction/electrical/tesla/ITesla.scala deleted file mode 100644 index b4c99082c..000000000 --- a/src/main/scala/resonantinduction/electrical/tesla/ITesla.scala +++ /dev/null @@ -1,22 +0,0 @@ -/** - * - */ -package resonantinduction.electrical.tesla - -import net.minecraft.tileentity.TileEntity - -/** - * @author Calclavia - * - */ -abstract trait ITesla -{ - /** - * @param transferEnergy - The energy amount in kilojoules. - * @param doTransfer - Actually transfer - * @return Energy actually transfered. - */ - def teslaTransfer(transferEnergy: Double, doTransfer: Boolean): Double - - def canTeslaTransfer(transferTile: TileEntity): Boolean -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/tesla/RenderTesla.scala b/src/main/scala/resonantinduction/electrical/tesla/RenderTesla.scala deleted file mode 100644 index 098ddb7cb..000000000 --- a/src/main/scala/resonantinduction/electrical/tesla/RenderTesla.scala +++ /dev/null @@ -1,53 +0,0 @@ -package resonantinduction.electrical.tesla - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonantinduction.core.Reference -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly - -/** - * @author Calclavia - * - */ -@SideOnly(Side.CLIENT) object RenderTesla -{ - final val TEXTURE_BOTTOM: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_bottom.png") - final val TEXTURE_MIDDLE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_middle.png") - final val TEXTURE_TOP: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "tesla_top.png") - final val MODEL_BOTTOM: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaBottom.tcn")) - final val MODEL_MIDDLE: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaMiddle.tcn")) - final val MODEL_TOP: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "teslaTop.tcn")) -} - -@SideOnly(Side.CLIENT) -class RenderTesla extends TileEntitySpecialRenderer -{ - def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - val meta: Int = if (t.getBlockType != null) t.getBlockMetadata else 0 - - if (meta == 1) - { - bindTexture(RenderTesla.TEXTURE_MIDDLE) - RenderTesla.MODEL_MIDDLE.renderAll - } - else if (meta == 2) - { - bindTexture(RenderTesla.TEXTURE_TOP) - RenderTesla.MODEL_TOP.renderAll - } - else - { - bindTexture(RenderTesla.TEXTURE_BOTTOM) - RenderTesla.MODEL_BOTTOM.renderAll - } - GL11.glPopMatrix - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/transformer/ItemElectricTransformer.scala b/src/main/scala/resonantinduction/electrical/transformer/ItemElectricTransformer.scala deleted file mode 100644 index cbc0c5195..000000000 --- a/src/main/scala/resonantinduction/electrical/transformer/ItemElectricTransformer.scala +++ /dev/null @@ -1,35 +0,0 @@ -package resonantinduction.electrical.transformer - -import codechicken.lib.vec.{BlockCoord, Vector3} -import codechicken.microblock.FacePlacementGrid -import codechicken.multipart.{JItemMultiPart, TMultiPart} -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.util.MathHelper -import net.minecraft.world.World -import resonantinduction.core.ResonantPartFactory -import resonantinduction.core.prefab.part.IHighlight - -/** - * Item for Electric Transformer that handles block/part placement - */ -class ItemElectricTransformer extends JItemMultiPart with IHighlight -{ - override def newPart(itemStack: ItemStack, player: EntityPlayer, world: World, pos: BlockCoord, s: Int, hit: Vector3): TMultiPart = - { - val side: Int = FacePlacementGrid.getHitSlot(hit, s) - val part: PartElectricTransformer = ResonantPartFactory.create(classOf[PartElectricTransformer]) - if (part != null) - { - val l: Int = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3 - val facing: Int = if (l == 0) 2 else (if (l == 1) 5 else (if (l == 2) 3 else (if (l == 3) 4 else 0))) - part.preparePlacement(side, facing) - } - return part - } - - override def getHighlightType: Int = - { - return 0 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/machine/TileDetector.scala b/src/main/scala/resonantinduction/mechanical/machine/TileDetector.scala deleted file mode 100644 index 656de4a22..000000000 --- a/src/main/scala/resonantinduction/mechanical/machine/TileDetector.scala +++ /dev/null @@ -1,160 +0,0 @@ -package resonantinduction.mechanical.machine - -import java.util.ArrayList - -import cpw.mods.fml.relauncher.{Side, SideOnly} -import io.netty.buffer.ByteBuf -import net.minecraft.client.renderer.texture.IIconRegister -import net.minecraft.entity.Entity -import net.minecraft.entity.item.EntityItem -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.network.Packet -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.{AxisAlignedBB, IIcon} -import net.minecraft.world.IBlockAccess -import net.minecraftforge.common.util.ForgeDirection -import resonant.engine.ResonantEngine -import resonant.lib.network.discriminator.{PacketTile, PacketType} -import resonant.lib.network.handle.IPacketIDReceiver -import resonant.lib.prefab.tile.spatial.SpatialBlock -import resonantinduction.archaic.blocks.TileFilterable -import resonantinduction.core.Reference -import resonantinduction.mechanical.MechanicalContent - -class TileDetector extends TileFilterable with IPacketIDReceiver -{ - private var powering: Boolean = false - - //constructor - setTextureName(Reference.prefix + "material_metal_side") - this.canProvidePower(true) - - override def update - { - super.update - if (!this.worldObj.isRemote && this.ticks % 10 == 0) - { - val metadata: Int = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) - val testArea: AxisAlignedBB = AxisAlignedBB.getBoundingBox(this.xCoord, this.yCoord, this.zCoord, this.xCoord + 1, this.yCoord + 1, this.zCoord + 1) - val dir: ForgeDirection = ForgeDirection.getOrientation(metadata) - testArea.offset(dir.offsetX, dir.offsetY, dir.offsetZ) - val entities: ArrayList[Entity] = this.worldObj.getEntitiesWithinAABB(classOf[EntityItem], testArea).asInstanceOf[ArrayList[Entity]] - var powerCheck: Boolean = false - if (entities.size > 0) - { - if (getFilter != null) - { - { - var i: Int = 0 - while (i < entities.size) - { - { - val e: EntityItem = entities.get(i).asInstanceOf[EntityItem] - val itemStack: ItemStack = e.getEntityItem - powerCheck = this.isFiltering(itemStack) - } - ({ - i += 1; - i - 1 - }) - } - } - } - else - { - powerCheck = true - } - } - else - { - powerCheck = false - } - if (powerCheck != this.powering) - { - this.powering = powerCheck - this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, MechanicalContent.blockDetector) - this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, MechanicalContent.blockDetector) - - for (x <- (this.xCoord - 1) to (this.xCoord + 1)) - { - for (z <- (this.zCoord - 1) to (this.zCoord + 1)) - { - this.worldObj.notifyBlocksOfNeighborChange(x, this.yCoord + 1, z, MechanicalContent.blockDetector) - } - } - ResonantEngine.packetHandler.sendToAllAround(new PacketTile(xi, yi, zi, Array[Any](0, this.isInverted)), this) - } - } - } - - override def invalidate - { - this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, MechanicalContent.blockDetector) - this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord + 1, this.zCoord, MechanicalContent.blockDetector) - super.invalidate - } - - override def readFromNBT(tag: NBTTagCompound) - { - super.readFromNBT(tag) - this.powering = tag.getBoolean("powering") - } - - override def writeToNBT(tag: NBTTagCompound) - { - super.writeToNBT(tag) - tag.setBoolean("powering", this.powering) - } - - override def getDescriptionPacket: Packet = - { - return ResonantEngine.packetHandler.toMCPacket(new PacketTile(xi, yi, zi, Array[Any](0, this.isInverted))) - } - - override def read(data: ByteBuf, id: Int, player: EntityPlayer, `type`: PacketType): Boolean = - { - if (id == 0) this.setInverted(data.readBoolean) - return true - } - - @SideOnly(Side.CLIENT) override def registerIcons(iconReg: IIconRegister) - { - SpatialBlock.icon.put("detector_front_green", iconReg.registerIcon(Reference.prefix + "detector_front_green")) - SpatialBlock.icon.put("detector_front_red", iconReg.registerIcon(Reference.prefix + "detector_front_red")) - SpatialBlock.icon.put("detector_side_green", iconReg.registerIcon(Reference.prefix + "detector_side_green")) - SpatialBlock.icon.put("detector_side_red", iconReg.registerIcon(Reference.prefix + "detector_side_red")) - } - - @SideOnly(Side.CLIENT) override def getIcon(side: Int, metadata: Int): IIcon = - { - if (side == ForgeDirection.SOUTH.ordinal) - { - return SpatialBlock.icon.get("detector_front_green") - } - return SpatialBlock.icon.get("detector_side_green") - } - - @SideOnly(Side.CLIENT) override def getIcon(iBlockAccess: IBlockAccess, side: Int): IIcon = - { - var isInverted: Boolean = false - var isFront: Boolean = false - val tileEntity: TileEntity = iBlockAccess.getTileEntity(xi, yi, zi) - if (tileEntity.isInstanceOf[TileDetector]) - { - isFront = side == (tileEntity.asInstanceOf[TileDetector]).getDirection.ordinal - isInverted = (tileEntity.asInstanceOf[TileDetector]).isInverted - } - return if (isInverted) (if (isFront) SpatialBlock.icon.get("detector_front_red") else SpatialBlock.icon.get("detector_side_red")) else (if (isFront) SpatialBlock.icon.get("detector_front_green") else SpatialBlock.icon.get("detector_side_green")) - } - - override def getStrongRedstonePower(access: IBlockAccess, side: Int): Int = - { - if (side != getDirection.getOpposite.ordinal) - { - return if (powering) 15 else 0 - } - return 0 - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/machine/edit/TileBreaker.scala b/src/main/scala/resonantinduction/mechanical/machine/edit/TileBreaker.scala deleted file mode 100644 index b6a45de59..000000000 --- a/src/main/scala/resonantinduction/mechanical/machine/edit/TileBreaker.scala +++ /dev/null @@ -1,172 +0,0 @@ -package resonantinduction.mechanical.machine.edit - -import java.util.ArrayList - -import cpw.mods.fml.common.network.ByteBufUtils -import cpw.mods.fml.relauncher.{Side, SideOnly} -import io.netty.buffer.ByteBuf -import net.minecraft.block.Block -import net.minecraft.block.material.Material -import net.minecraft.client.renderer.texture.IIconRegister -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.util.IIcon -import net.minecraft.world.IBlockAccess -import net.minecraftforge.common.util.ForgeDirection -import resonant.lib.network.discriminator.{PacketTile, PacketType} -import resonant.lib.network.handle.IPacketReceiver -import resonant.lib.prefab.tile.spatial.SpatialTile -import resonant.lib.prefab.tile.traits.TRotatable -import resonant.lib.transform.vector.{Vector3, VectorWorld} -import resonant.lib.utility.inventory.InternalInventoryHandler -import resonantinduction.core.ResonantInduction - -/** - * @author tgame14 - * @since 18/03/14 - */ -object TileBreaker -{ - @SideOnly(Side.CLIENT) private var iconFront: IIcon = null - @SideOnly(Side.CLIENT) private var iconBack: IIcon = null -} - -class TileBreaker extends SpatialTile(Material.iron) with TRotatable with IPacketReceiver -{ - private var _doWork : Boolean = false - private var invHandler: InternalInventoryHandler = null - private var place_delay: Int = 0 - - override def onAdded - { - work - } - - override def onNeighborChanged(block: Block) - { - work - } - - def work - { - if (isIndirectlyPowered) - { - _doWork = true - place_delay = 0 - } - } - - override def update - { - if (_doWork) - { - if (place_delay < java.lang.Byte.MAX_VALUE) - { - place_delay += 1 - } - if (place_delay >= 10) - { - _doWork = false - place_delay = 0 - } - } - } - - def doWork - { - if (isIndirectlyPowered) - { - val dir: ForgeDirection = getDirection - val check: Vector3 = toVector3.add(dir) - val put: VectorWorld = toVector3.add(dir.getOpposite).asInstanceOf[VectorWorld] - val block: Block = check.getBlock(world) - if (block != null) - { - val candidateMeta: Int = world.getBlockMetadata(check.xi, check.yi, check.zi) - val flag: Boolean = true - val drops: ArrayList[ItemStack] = block.getDrops(getWorldObj, check.xi, check.yi, check.zi, candidateMeta, 0) - import scala.collection.JavaConversions._ - for (stack <- drops) - { - var insert: ItemStack = stack.copy - insert = getInvHandler.storeItem(insert, this.getDirection.getOpposite) - if (insert != null) - { - getInvHandler.throwItem(this.getDirection.getOpposite, insert) - } - } - ResonantInduction.proxy.renderBlockParticle(worldObj, check.xi, check.yi, check.zi, new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Block.getIdFromBlock(block), 1) - getWorldObj.setBlockToAir(check.xi, check.yi, check.zi) - getWorldObj.playAuxSFX(1012, check.xi, check.yi, check.zi, 0) - } - } - } - - def getInvHandler: InternalInventoryHandler = - { - if (invHandler == null) - { - invHandler = new InternalInventoryHandler(this) - } - return invHandler - } - - override def getDescPacket: PacketTile = - { - val nbt: NBTTagCompound = new NBTTagCompound - writeToNBT(nbt) - return new PacketTile(this, nbt) - } - - @SideOnly(Side.CLIENT) override def getIcon(access: IBlockAccess, side: Int): IIcon = - { - val meta: Int = access.getBlockMetadata(xi, yi, zi) - if (side == meta) - { - return TileBreaker.iconFront - } - else if (side == (meta ^ 1)) - { - return TileBreaker.iconBack - } - return getIcon - } - - @SideOnly(Side.CLIENT) - override def getIcon(side: Int, meta: Int): IIcon = - { - if (side == (meta ^ 1)) - { - return TileBreaker.iconFront - } - else if (side == meta) - { - return TileBreaker.iconBack - } - return getIcon - } - - @SideOnly(Side.CLIENT) - override def registerIcons(iconRegister: IIconRegister) - { - super.registerIcons(iconRegister) - TileBreaker.iconFront = iconRegister.registerIcon(getTextureName + "_front") - TileBreaker.iconBack = iconRegister.registerIcon(getTextureName + "_back") - } - - def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType) - { - try - { - readFromNBT(ByteBufUtils.readTag(data)) - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/NodeMechanicalPiston.scala b/src/main/scala/resonantinduction/mechanical/mech/process/crusher/NodeMechanicalPiston.scala deleted file mode 100644 index 5bee9a571..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/NodeMechanicalPiston.scala +++ /dev/null @@ -1,20 +0,0 @@ -package resonantinduction.mechanical.mech.process.crusher - -import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.mechanical.mech.grid.NodeMechanical - -/** - * Created by robert on 8/28/2014. - */ -class NodeMechanicalPiston(parent: TileMechanicalPiston) extends NodeMechanical(parent) -{ - override def canConnect(dir: ForgeDirection): Boolean = - { - return dir ne (getParent.asInstanceOf[TileMechanicalPiston]).getDirection - } - - protected def revolve - { - getParent.asInstanceOf[TileMechanicalPiston].markRevolve = true - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/RenderMechanicalPiston.scala b/src/main/scala/resonantinduction/mechanical/mech/process/crusher/RenderMechanicalPiston.scala deleted file mode 100644 index 37036a885..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/RenderMechanicalPiston.scala +++ /dev/null @@ -1,63 +0,0 @@ -package resonantinduction.mechanical.mech.process.crusher - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import net.minecraftforge.common.util.ForgeDirection -import org.apache.commons.lang3.ArrayUtils -import org.lwjgl.opengl.GL11 -import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly - -@SideOnly(Side.CLIENT) object RenderMechanicalPiston -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "piston/mechanicalPiston.tcn")) - var TEXTURE: ResourceLocation = new ResourceLocation(Reference.domain, Reference.modelPath + "piston/mechanicalPiston_iron.png") -} - -@SideOnly(Side.CLIENT) class RenderMechanicalPiston extends TileEntitySpecialRenderer -{ - private[crusher] final val staticParts: Array[String] = Array("baseRing", "leg1", "leg2", "leg3", "leg4", "connector", "basePlate", "basePlateTop", "connectorBar", "centerPiston") - private[crusher] final val shaftParts: Array[String] = Array("topPlate", "outerPiston") - - def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) - { - GL11.glPushMatrix - GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5) - val tile: TileMechanicalPiston = tileEntity.asInstanceOf[TileMechanicalPiston] - GL11.glRotated(-90, 0, 1, 0) - GL11.glRotated(180, 0, 0, 1) - if (tile.getWorldObj != null) - { - if (tile.getDirection == ForgeDirection.NORTH || tile.getDirection == ForgeDirection.SOUTH) RenderUtility.rotateBlockBasedOnDirection(tile.getDirection.getOpposite) - else RenderUtility.rotateBlockBasedOnDirection(tile.getDirection) - } - RenderUtility.bind(RenderMechanicalPiston.TEXTURE) - val angle: Double = tile.mechanicalNode.angle - GL11.glPushMatrix - GL11.glRotated(-Math.toDegrees(angle), 0, 0, 1) - RenderMechanicalPiston.MODEL.renderAllExcept(ArrayUtils.addAll(shaftParts, staticParts: _*): _*) - GL11.glPopMatrix - GL11.glPushMatrix - if (tile.getWorldObj != null) - { - val dir: ForgeDirection = tile.getDirection - if (tile.world.isAirBlock(tile.xi + dir.offsetX, tile.yi + dir.offsetY, tile.zi + dir.offsetZ)) - { - GL11.glTranslated(0, 0, (0.4 * Math.sin(angle)) - 0.5) - } - else - { - GL11.glTranslated(0, 0, (0.06 * Math.sin(angle)) - 0.03) - } - } - RenderMechanicalPiston.MODEL.renderOnly(shaftParts: _*) - GL11.glPopMatrix - RenderMechanicalPiston.MODEL.renderOnly(staticParts: _*) - GL11.glPopMatrix - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/TileMechanicalPiston.scala b/src/main/scala/resonantinduction/mechanical/mech/process/crusher/TileMechanicalPiston.scala deleted file mode 100644 index 3141c034b..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/process/crusher/TileMechanicalPiston.scala +++ /dev/null @@ -1,194 +0,0 @@ -package resonantinduction.mechanical.mech.process.crusher - -import java.lang.reflect.Method - -import net.minecraft.block.Block -import net.minecraft.block.material.Material -import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.tileentity.TileEntity -import net.minecraft.world.World -import resonant.api.recipe.{MachineRecipes, RecipeResource, RecipeType} -import resonant.lib.mod.config.Config -import resonant.lib.transform.vector.Vector3 -import resonant.lib.utility.MovementUtility -import resonant.lib.utility.inventory.InventoryUtility -import resonantinduction.core.ResonantInduction -import resonantinduction.mechanical.mech.TileMechanical - -/** - * Mechanical driven piston that can be used to move basic blocks and crush ores - * @author Calclavia - */ -object TileMechanicalPiston -{ - @Config private var mechanicalPistonMultiplier: Int = 2 -} - -class TileMechanicalPiston extends TileMechanical(Material.piston) -{ - var markRevolve: Boolean = false - - //Constructor - mechanicalNode = new NodeMechanicalPiston(this) - isOpaqueCube=false - normalRender=false - customItemRender=true - rotationMask = 63 - setTextureName("material_steel_dark") - - override def update - { - super.update - if (markRevolve) - { - val movePosition: Vector3 = toVector3.add(getDirection) - if (!hitOreBlock(movePosition)) - { - if (!worldObj.isRemote) - { - val moveNewPosition: Vector3 = movePosition.clone.add(getDirection) - if (canMove(movePosition, moveNewPosition)) - { - move(movePosition, moveNewPosition) - } - } - } - markRevolve = false - } - } - - def hitOreBlock(blockPos: Vector3): Boolean = - { - val block: Block = blockPos.getBlock(world) - if (block != null) - { - val blockStack: ItemStack = new ItemStack(block) - val resources: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.CRUSHER.name, blockStack) - if (resources.length > 0) - { - if (!worldObj.isRemote) - { - for (recipe <- resources) - { - if (Math.random <= recipe.getChance) - { - InventoryUtility.dropItemStack(world, blockPos.clone.add(0.5), recipe.getItemStack, 10, 0) - } - } - blockPos.setBlockToAir(world) - } - ResonantInduction.proxy.renderBlockParticle(worldObj, blockPos.clone.add(0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Block.getIdFromBlock(block), 1) - return true - } - } - if (!worldObj.isRemote) - { - world.destroyBlockInWorldPartially(0, blockPos.xi, blockPos.yi, blockPos.zi, -1) - } - return false - } - - def canMove(from: Vector3, to: Vector3): Boolean = - { - if (this == to.getTileEntity(getWorldObj)) - { - return false - } - val targetBlock: Block = to.getBlock(worldObj) - if (!(worldObj.isAirBlock(to.xi, to.yi, to.zi) || (targetBlock != null && (targetBlock.canBeReplacedByLeaves(worldObj, to.xi, to.yi, to.zi))))) - { - return false - } - return true - } - - def move(from: Vector3, to: Vector3) - { - val blockID: Block = from.getBlock(worldObj) - val blockMetadata: Int = from.getBlockMetadata(worldObj) - val tileEntity: TileEntity = from.getTileEntity(worldObj) - val tileData: NBTTagCompound = new NBTTagCompound - if (tileEntity != null) - { - tileEntity.writeToNBT(tileData) - } - MovementUtility.setBlockSneaky(worldObj, from, null, 0, null) - if (tileEntity != null && tileData != null) - { - val isMultipart: Boolean = tileData.getString("id") == "savedMultipart" - var newTile: TileEntity = null - if (isMultipart) - { - try - { - val multipart: Class[_] = Class.forName("codechicken.multipart.MultipartHelper") - val m: Method = multipart.getMethod("createTileFromNBT", classOf[World], classOf[NBTTagCompound]) - newTile = m.invoke(null, worldObj, tileData).asInstanceOf[TileEntity] - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } - else - { - newTile = TileEntity.createAndLoadEntity(tileData) - } - MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, newTile) - if (newTile != null && isMultipart) - { - try - { - val multipart: Class[_] = Class.forName("codechicken.multipart.MultipartHelper") - multipart.getMethod("sendDescPacket", classOf[World], classOf[TileEntity]).invoke(null, worldObj, newTile) - val tileMultipart: Class[_] = Class.forName("codechicken.multipart.TileMultipart") - tileMultipart.getMethod("onMoved").invoke(newTile) - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } - } - else - { - MovementUtility.setBlockSneaky(worldObj, to, blockID, blockMetadata, null) - } - notifyChanges(from) - notifyChanges(to) - } - - def notifyChanges(pos: Vector3) - { - worldObj.notifyBlocksOfNeighborChange(pos.xi, pos.yi, pos.zi, pos.getBlock(worldObj)) - /* val newTile: TileEntity = pos.getTileEntity(worldObj) - if (newTile != null) - { - if (Loader.isModLoaded("BuildCraft|Factory")) - { - try - { - val clazz: Class[_ <: Any] = Class.forName("buildcraft.factory.TileQuarry") - if (newTile == clazz) - { - ReflectionHelper.setPrivateValue(clazz, newTile, true, "isAlive") - } - } - catch - { - case e: Exception => - { - e.printStackTrace - } - } - } - } */ - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/MixerNode.scala b/src/main/scala/resonantinduction/mechanical/mech/process/mixer/MixerNode.scala deleted file mode 100644 index 00d0bfcc9..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/process/mixer/MixerNode.scala +++ /dev/null @@ -1,23 +0,0 @@ -package resonantinduction.mechanical.mech.process.mixer - -import net.minecraftforge.common.util.ForgeDirection -import resonant.api.tile.INodeProvider -import resonantinduction.mechanical.mech.grid.NodeMechanical - -/** - * Node designed just for the Mixer to use - * @param parent - instance of TileMixer that will host this node, should never be null - */ -class MixerNode(parent: INodeProvider) extends NodeMechanical(parent) -{ - override def canConnect(direction: ForgeDirection): Boolean = - { - return direction == ForgeDirection.DOWN || direction == ForgeDirection.UP - } - - /* - override def inverseRotation(dir: ForgeDirection): Boolean = - { - return dir == ForgeDirection.DOWN - }*/ -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/RenderWaterTurbine.scala b/src/main/scala/resonantinduction/mechanical/mech/turbine/RenderWaterTurbine.scala deleted file mode 100644 index 271260872..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/RenderWaterTurbine.scala +++ /dev/null @@ -1,129 +0,0 @@ -package resonantinduction.mechanical.mech.turbine - -import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer -import net.minecraft.item.ItemStack -import net.minecraft.tileentity.TileEntity -import net.minecraft.util.ResourceLocation -import net.minecraftforge.client.IItemRenderer -import net.minecraftforge.client.model.AdvancedModelLoader -import net.minecraftforge.client.model.IModelCustom -import org.lwjgl.opengl.GL11 -import resonant.api.items.ISimpleItemRenderer -import resonant.lib.render.RenderUtility -import resonantinduction.core.Reference - -@SideOnly(Side.CLIENT) object RenderWaterTurbine -{ - final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "waterTurbines.obj")) -} - -@SideOnly(Side.CLIENT) class RenderWaterTurbine extends TileEntitySpecialRenderer with ISimpleItemRenderer -{ - def renderTileEntityAt(t: TileEntity, x: Double, y: Double, z: Double, f: Float) - { - val tile: TileTurbine = t.asInstanceOf[TileTurbine] - if (tile.getMultiBlock.isPrimary) - { - GL11.glPushMatrix - GL11.glTranslatef(x.asInstanceOf[Float] + 0.5f, y.asInstanceOf[Float] + 0.5f, z.asInstanceOf[Float] + 0.5f) - GL11.glPushMatrix - RenderUtility.rotateBlockBasedOnDirectionUp(tile.getDirection) - val mechanicalNodeRenderAngle: Double = tile.mechanicalNode.angle - var renderAngleInDegrees: Float = 0 - if (!java.lang.Double.isNaN(mechanicalNodeRenderAngle)) - { - renderAngleInDegrees = Math.toDegrees(mechanicalNodeRenderAngle).asInstanceOf[Float] - } - GL11.glRotatef(renderAngleInDegrees, 0, 1, 0) - if (tile.getDirection.offsetY != 0) - { - renderWaterTurbine(tile.tier, tile.multiBlockRadius, tile.getMultiBlock.isConstructed) - } - else - { - renderWaterWheel(tile.tier, tile.multiBlockRadius, tile.getMultiBlock.isConstructed) - } - GL11.glPopMatrix - GL11.glPopMatrix - } - } - - def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*) - { - GL11.glPushMatrix - GL11.glTranslatef(0.5f, 0.5f, 0.5f) - renderWaterTurbine(itemStack.getItemDamage, 1, false) - GL11.glPopMatrix - } - - def renderWaterWheel(tier: Int, size: Int, isLarge: Boolean) - { - if (isLarge) - { - GL11.glScalef(0.3f, 1, 0.3f) - GL11.glScalef(size * 2 + 1, Math.min(size, 2), size * 2 + 1) - GL11.glPushMatrix - GL11.glScalef(1, 1.6f, 1) - RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") - RenderWaterTurbine.MODEL.renderOnly("bigwheel_endknot", "horizontal_centre_shaft") - GL11.glPopMatrix - GL11.glPushMatrix - GL11.glScalef(1, 1.4f, 1) - RenderUtility.bind(Reference.blockTextureDirectory + "planks_spruce.png") - RenderWaterTurbine.MODEL.renderOnly("bigwheel_supporters") - bindTexture(tier) - RenderWaterTurbine.MODEL.renderOnly("bigwheel_scoops", "bigwheel_supportercircle") - GL11.glPopMatrix - } - else - { - GL11.glPushMatrix - GL11.glScalef(0.7f, 1, 0.7f) - RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") - RenderWaterTurbine.MODEL.renderOnly("small_waterwheel_endknot") - bindTexture(tier) - RenderWaterTurbine.MODEL.renderOnly("small_waterwheel", "small_waterwheel_supporters", "horizontal_centre_shaft") - GL11.glPopMatrix - } - } - - def renderWaterTurbine(tier: Int, size: Int, isLarge: Boolean) - { - if (isLarge) - { - GL11.glScalef(0.3f, 1, 0.3f) - GL11.glScalef(size * 2 + 1, Math.min(size, 2), size * 2 + 1) - bindTexture(tier) - RenderWaterTurbine.MODEL.renderOnly("turbine_centre") - RenderWaterTurbine.MODEL.renderOnly("turbine_blades") - } - else - { - GL11.glPushMatrix - GL11.glScalef(0.9f, 1f, 0.9f) - RenderUtility.bind(Reference.blockTextureDirectory + "log_oak.png") - RenderWaterTurbine.MODEL.renderOnly("small_waterwheel_endknot") - bindTexture(tier) - RenderWaterTurbine.MODEL.renderOnly("small_turbine_blades") - GL11.glPopMatrix - } - } - - def bindTexture(tier: Int) - { - if (tier == 0) - { - RenderUtility.bind(Reference.blockTextureDirectory + "planks_oak.png") - } - else if (tier == 1) - { - RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png") - } - else if (tier == 2) - { - RenderUtility.bind(Reference.blockTextureDirectory + "iron_block.png") - } - } -} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/mechanical/mech/turbine/TurbineMBlockHandler.scala b/src/main/scala/resonantinduction/mechanical/mech/turbine/TurbineMBlockHandler.scala deleted file mode 100644 index 95f520edf..000000000 --- a/src/main/scala/resonantinduction/mechanical/mech/turbine/TurbineMBlockHandler.scala +++ /dev/null @@ -1,21 +0,0 @@ -package resonantinduction.mechanical.mech.turbine - -import net.minecraft.tileentity.TileEntity -import resonant.lib.prefab.tile.multiblock.reference.MultiBlockHandler -import resonant.lib.transform.vector.Vector3 - -class TurbineMBlockHandler(wrapper: TileTurbine) extends MultiBlockHandler[TileTurbine](wrapper) -{ - override def getWrapperAt(position: Vector3): TileTurbine = - { - val tile: TileEntity = position.getTileEntity(this.tile.getWorld) - if (tile != null && wrapperClass.isAssignableFrom(tile.getClass)) - { - if (tile.asInstanceOf[TileTurbine].getDirection == this.tile.getDirection && tile.asInstanceOf[TileTurbine].tier == this.tile.tier) - { - return tile.asInstanceOf[TileTurbine] - } - } - return null - } -} \ No newline at end of file