From 6f8395c45e5a50d886dcf8213744cd9a9ce1f7ff Mon Sep 17 00:00:00 2001 From: GoryMoon Date: Wed, 8 Jul 2015 00:55:56 +0200 Subject: [PATCH] Updated to Minecraft 1.8.9 Camouflages works correctly, almost as before Can't get the texture for a specific side of a block when transforming Reimplemented Waila support Fixed bug from 1.7.10 with extensions of GuiManager and entering negative numbers Changed to a not Deprecated method of using Fluids Renamed liquid to fluid fo consistency --- .gitignore | 29 +- README.md | 25 +- README.txt | 59 +++ build.gradle | 72 ++- gradle/wrapper/gradle-wrapper.jar | Bin 51106 -> 52271 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- logs/latest.log | 0 .../vswe/stevesfactory/GeneratedInfo.java | 2 +- .../java/vswe/stevesfactory/GuiHandler.java | 7 +- .../java/vswe/stevesfactory/Localization.java | 33 +- .../stevesfactory/StevesFactoryManager.java | 32 +- .../animation/AnimationController.java | 1 - .../vswe/stevesfactory/blocks/BlockCable.java | 47 +- .../stevesfactory/blocks/BlockCableBUD.java | 16 +- .../blocks/BlockCableBreaker.java | 94 ++-- .../blocks/BlockCableCamouflages.java | 64 ++- .../blocks/BlockCableCluster.java | 164 ++++--- .../blocks/BlockCableCreative.java | 11 +- .../blocks/BlockCableDirectionAdvanced.java | 68 +-- .../stevesfactory/blocks/BlockCableInput.java | 31 +- .../blocks/BlockCableIntake.java | 11 - .../blocks/BlockCableOutput.java | 84 ++-- .../stevesfactory/blocks/BlockCableRelay.java | 28 +- .../stevesfactory/blocks/BlockCableSign.java | 46 +- .../blocks/BlockCamouflageBase.java | 78 ++- .../stevesfactory/blocks/BlockManager.java | 99 ++-- .../stevesfactory/blocks/ClusterRecipe.java | 18 + .../stevesfactory/blocks/ConnectionBlock.java | 8 +- .../blocks/ITileEntityInterface.java | 4 +- .../stevesfactory/blocks/ItemCluster.java | 6 +- .../vswe/stevesfactory/blocks/ModBlocks.java | 5 +- .../blocks/PropertyCamouflageType.java | 46 ++ .../blocks/RenderCamouflage.java | 10 +- .../stevesfactory/blocks/TileEntityBUD.java | 20 +- .../blocks/TileEntityBreaker.java | 166 ++++--- .../blocks/TileEntityCamouflage.java | 112 ++--- .../blocks/TileEntityCluster.java | 56 ++- .../blocks/TileEntityClusterElement.java | 19 +- .../blocks/TileEntityCreative.java | 55 ++- .../stevesfactory/blocks/TileEntityInput.java | 16 +- .../blocks/TileEntityIntake.java | 75 ++- .../blocks/TileEntityManager.java | 29 +- .../blocks/TileEntityOutput.java | 98 ++-- .../stevesfactory/blocks/TileEntityRelay.java | 199 +++++--- .../blocks/TileEntitySignUpdater.java | 17 +- .../blocks/UnlistedBlockPosProperty.java | 33 ++ .../stevesfactory/blocks/UserPermission.java | 14 +- .../client/BakedCamouflageBlockModel.java | 424 ++++++++++++++++ .../blocks/client/BakedEmitterBlockModel.java | 208 ++++++++ .../blocks/client/CamouflageBlockModel.java | 55 +++ .../blocks/client/EmitterBlockModel.java | 47 ++ .../blocks/client/ModelLoader.java | 35 ++ .../components/CheckBoxList.java | 4 +- .../components/CommandExecutor.java | 136 +++--- .../components/ComponentMenu.java | 4 +- .../ComponentMenuCamouflageAdvanced.java | 4 +- .../ComponentMenuCamouflageInside.java | 4 +- .../ComponentMenuCamouflageItems.java | 4 +- .../ComponentMenuCamouflageShape.java | 4 +- .../components/ComponentMenuContainer.java | 88 ++-- .../ComponentMenuContainerScrap.java | 4 +- .../ComponentMenuContainerTypes.java | 4 +- .../components/ComponentMenuCrafting.java | 5 +- .../ComponentMenuCraftingPriority.java | 4 +- ...enuLiquid.java => ComponentMenuFluid.java} | 35 +- ....java => ComponentMenuFluidCondition.java} | 4 +- .../components/ComponentMenuFluidOutput.java | 10 + .../components/ComponentMenuGroup.java | 2 +- .../components/ComponentMenuInterval.java | 4 +- .../components/ComponentMenuItem.java | 5 +- .../components/ComponentMenuLiquidOutput.java | 10 - .../components/ComponentMenuListOrder.java | 4 +- .../components/ComponentMenuPulse.java | 4 +- .../ComponentMenuRedstoneOutput.java | 4 +- .../ComponentMenuRedstoneSides.java | 10 +- .../ComponentMenuRedstoneStrength.java | 4 +- .../components/ComponentMenuResult.java | 4 +- .../components/ComponentMenuSignText.java | 4 +- .../components/ComponentMenuSplit.java | 4 +- .../components/ComponentMenuStuff.java | 6 +- .../components/ComponentMenuTarget.java | 20 +- .../ComponentMenuTargetInventory.java | 11 +- .../components/ComponentMenuTargetTank.java | 4 +- .../components/ComponentMenuUpdateBlock.java | 4 +- .../components/ComponentMenuVariable.java | 6 +- .../components/ComponentMenuVariableLoop.java | 4 +- .../components/ComponentType.java | 12 +- .../stevesfactory/components/Connection.java | 4 +- .../components/ContainerFilter.java | 6 +- .../components/CraftingBufferElement.java | 10 +- .../components/CraftingDummy.java | 6 +- .../components/FlowComponent.java | 36 +- ...erElement.java => FluidBufferElement.java} | 12 +- .../{LiquidSetting.java => FluidSetting.java} | 32 +- .../components/IContainerSelection.java | 4 +- .../stevesfactory/components/ItemSetting.java | 4 +- .../components/ModItemHelper.java | 10 +- ...idCounter.java => OutputFluidCounter.java} | 14 +- .../components/RadioButtonList.java | 4 +- .../components/ScrollController.java | 4 +- .../stevesfactory/components/Setting.java | 4 +- .../components/SlotInventoryHolder.java | 2 +- .../components/StackTankHolder.java | 8 +- .../components/TextBoxLogic.java | 4 +- .../components/TextBoxNumberList.java | 5 +- .../components/TriggerHelper.java | 4 +- .../components/TriggerHelperRedstone.java | 6 +- .../stevesfactory/components/Variable.java | 4 +- .../components/VariableColor.java | 8 +- .../components/VariableDisplay.java | 4 +- .../interfaces/ContainerManager.java | 12 +- .../interfaces/ContainerRelay.java | 6 +- .../stevesfactory/interfaces/GuiAntiNEI.java | 462 ++++++++++-------- .../stevesfactory/interfaces/GuiBase.java | 177 +++---- .../stevesfactory/interfaces/GuiManager.java | 29 +- .../stevesfactory/interfaces/GuiRelay.java | 32 +- .../interfaces/IAdvancedTooltip.java | 4 +- .../interfaces/IInterfaceRenderer.java | 4 +- .../java/vswe/stevesfactory/nbt/NBTNode.java | 6 +- .../vswe/stevesfactory/nbt/NBTRenderer.java | 4 +- .../stevesfactory/network/DataBitHelper.java | 6 +- .../stevesfactory/network/DataReader.java | 4 +- .../stevesfactory/network/DataWriter.java | 12 +- .../network/PacketEventHandler.java | 40 +- .../stevesfactory/network/PacketHandler.java | 14 +- .../vswe/stevesfactory/proxy/ClientProxy.java | 74 ++- .../vswe/stevesfactory/proxy/CommonProxy.java | 3 +- .../vswe/stevesfactory/settings/Settings.java | 15 +- .../settings/SettingsScreen.java | 4 +- .../java/vswe/stevesfactory/util/Utils.java | 43 ++ .../vswe/stevesfactory/waila/Provider.java | 63 ++- .../wrappers/InventoryWrapper.java | 46 +- .../wrappers/InventoryWrapperHorse.java | 4 +- .../stevesfactory/textures/blocks/Thumbs.db | Bin 46080 -> 0 bytes .../stevesfactory/textures/gui/Thumbs.db | Bin 15872 -> 0 bytes .../stevesfactory/textures/items/Thumbs.db | Bin 26624 -> 0 bytes .../blockstates/BlockCableBUDName.json | 5 + .../blockstates/BlockCableBreakerName.json | 45 ++ .../blockstates/BlockCableCamouflageName.json | 7 + .../blockstates/BlockCableClusterName.json | 16 + .../blockstates/BlockCableCreativeName.json | 5 + .../blockstates/BlockCableInputName.json | 5 + .../blockstates/BlockCableIntakeName.json | 16 + .../blockstates/BlockCableName.json | 5 + .../blockstates/BlockCableOutputName.json | 5 + .../blockstates/BlockCableRelayName.json | 16 + .../blockstates/BlockCableSignName.json | 10 + .../blockstates/BlockMachineManagerName.json | 10 + .../lang/en_US.lang | 18 +- .../models/block/cable.json | 6 + .../models/block/cable_breaker.json | 12 + .../models/block/cable_breaker_both.json | 7 + .../models/block/cable_breaker_op.json | 8 + .../models/block/cable_breaker_side.json | 8 + .../models/block/cable_breaker_up.json | 8 + .../models/block/cable_breaker_vertical.json | 12 + .../models/block/cable_bud.json | 6 + .../models/block/cable_camouflage.json | 6 + .../models/block/cable_camouflage_inside.json | 6 + .../block/cable_camouflage_transform.json | 6 + .../models/block/cable_cluster.json | 7 + .../models/block/cable_cluster_advanced.json | 7 + .../models/block/cable_creative.json | 6 + .../models/block/cable_emitter.json | 6 + .../models/block/cable_receiver.json | 6 + .../models/block/cable_relay.json | 7 + .../models/block/cable_relay_advanced.json | 7 + .../models/block/cable_sign.json | 7 + .../models/block/cable_valve.json | 7 + .../models/block/cable_valve_instant.json | 7 + .../models/block/machine_manager.json | 8 + .../models/block/orientable_front.json | 12 + .../models/block/orientable_front_op.json | 12 + .../models/item/BlockCableBUDName.json | 10 + .../models/item/BlockCableBreakerName.json | 10 + .../models/item/BlockCableCreativeName.json | 10 + .../models/item/BlockCableInputName.json | 10 + .../models/item/BlockCableName.json | 10 + .../models/item/BlockCableOutputName.json | 10 + .../models/item/BlockCableSignName.json | 10 + .../models/item/BlockMachineManagerName.json | 10 + .../models/item/cable_camouflage.json | 10 + .../models/item/cable_camouflage_inside.json | 10 + .../item/cable_camouflage_transform.json | 10 + .../models/item/cable_cluster.json | 10 + .../models/item/cable_cluster_advanced.json | 10 + .../models/item/cable_relay.json | 10 + .../models/item/cable_relay_advanced.json | 10 + .../models/item/cable_valve.json | 10 + .../models/item/cable_valve_instant.json | 10 + .../textures/blocks/cable.png | Bin .../textures/blocks/cable_breaker.png | Bin .../blocks/cable_breaker_advanced.png | Bin .../blocks/cable_breaker_direction.png | Bin .../textures/blocks/cable_breaker_front.png | Bin .../textures/blocks/cable_bud.png | Bin .../textures/blocks/cable_camo.png | Bin .../textures/blocks/cable_camo_inside.png | Bin .../textures/blocks/cable_camo_shape.png | Bin .../textures/blocks/cable_cluster.png | Bin .../textures/blocks/cable_cluster_adv.png | Bin .../blocks/cable_cluster_adv_front.png | Bin .../textures/blocks/cable_cluster_front.png | Bin .../textures/blocks/cable_creative.png | Bin .../textures/blocks/cable_idle.png | Bin .../textures/blocks/cable_input.png | Bin .../textures/blocks/cable_intake.png | Bin .../textures/blocks/cable_intake_instant.png | Bin .../textures/blocks/cable_intake_out.png | Bin .../blocks/cable_intake_out_instant.png | Bin .../textures/blocks/cable_output_strong.png | Bin .../textures/blocks/cable_output_weak.png | Bin .../textures/blocks/cable_relay.png | Bin .../textures/blocks/cable_relay_advanced.png | Bin .../textures/blocks/cable_sign.png | Bin .../textures/blocks/manager_bot.png | Bin .../textures/blocks/manager_side.png | Bin .../textures/blocks/manager_top.png | Bin .../textures/gui/Background1.png | Bin .../textures/gui/Background2.png | Bin .../textures/gui/FlowComponents.png | Bin .../textures/gui/Relay.png | Bin src/main/resources/mcmod.info | 2 +- 223 files changed, 3485 insertions(+), 1613 deletions(-) create mode 100644 README.txt delete mode 100644 logs/latest.log create mode 100644 src/main/java/vswe/stevesfactory/blocks/PropertyCamouflageType.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/UnlistedBlockPosProperty.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/client/BakedCamouflageBlockModel.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/client/BakedEmitterBlockModel.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/client/CamouflageBlockModel.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/client/EmitterBlockModel.java create mode 100644 src/main/java/vswe/stevesfactory/blocks/client/ModelLoader.java rename src/main/java/vswe/stevesfactory/components/{ComponentMenuLiquid.java => ComponentMenuFluid.java} (79%) rename src/main/java/vswe/stevesfactory/components/{ComponentMenuLiquidCondition.java => ComponentMenuFluidCondition.java} (82%) create mode 100644 src/main/java/vswe/stevesfactory/components/ComponentMenuFluidOutput.java delete mode 100644 src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidOutput.java rename src/main/java/vswe/stevesfactory/components/{LiquidBufferElement.java => FluidBufferElement.java} (86%) rename src/main/java/vswe/stevesfactory/components/{LiquidSetting.java => FluidSetting.java} (69%) rename src/main/java/vswe/stevesfactory/components/{OutputLiquidCounter.java => OutputFluidCounter.java} (76%) delete mode 100644 src/main/resources/assets/stevesfactory/textures/blocks/Thumbs.db delete mode 100644 src/main/resources/assets/stevesfactory/textures/gui/Thumbs.db delete mode 100644 src/main/resources/assets/stevesfactory/textures/items/Thumbs.db create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableBUDName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableBreakerName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableCamouflageName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableClusterName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableCreativeName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableInputName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableIntakeName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableOutputName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableRelayName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockCableSignName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/blockstates/BlockMachineManagerName.json rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/lang/en_US.lang (97%) create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker_both.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker_op.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker_side.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker_up.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_breaker_vertical.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_bud.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_camouflage.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_camouflage_inside.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_camouflage_transform.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_cluster.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_cluster_advanced.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_creative.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_emitter.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_receiver.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_relay.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_relay_advanced.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_sign.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_valve.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/cable_valve_instant.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/machine_manager.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/orientable_front.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/block/orientable_front_op.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableBUDName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableBreakerName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableCreativeName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableInputName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableOutputName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockCableSignName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/BlockMachineManagerName.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_camouflage.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_camouflage_inside.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_camouflage_transform.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_cluster.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_cluster_advanced.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_relay.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_relay_advanced.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_valve.json create mode 100644 src/main/resources/assets/stevesfactorymanager/models/item/cable_valve_instant.json rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_breaker.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_breaker_advanced.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_breaker_direction.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_breaker_front.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_bud.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_camo.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_camo_inside.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_camo_shape.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_cluster.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_cluster_adv.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_cluster_adv_front.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_cluster_front.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_creative.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_idle.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_input.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_intake.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_intake_instant.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_intake_out.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_intake_out_instant.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_output_strong.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_output_weak.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_relay.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_relay_advanced.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/cable_sign.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/manager_bot.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/manager_side.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/blocks/manager_top.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/gui/Background1.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/gui/Background2.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/gui/FlowComponents.png (100%) rename src/main/resources/assets/{stevesfactory => stevesfactorymanager}/textures/gui/Relay.png (100%) diff --git a/.gitignore b/.gitignore index a6d84602f..7b742a5dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,23 @@ -eclipse/ -build/ -*.iml -*.iws +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out *.ipr -.gradle/ -libs/ -out/ \ No newline at end of file +*.iws +*.iml +.idea + +# gradle +build + +# other +eclipse +run +libs +classes diff --git a/README.md b/README.md index e381a3a2b..c49784837 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,14 @@ Setup Workspace git clone [git-repo-url] ``` -Download [CodeChickenCore-1.7.2-1.0.0-dev][1], [NotEnoughItems-1.7.2-1.0.1-dev][1] & [Waila-1.5.2a_1.7.2][2] +If you don't have [Gradle][1] installed on your computer you can use `gradlew` or `gradlew.bat` instead -Add a folder called `libs`, in the folder put the three downloaded `.jar` files. +For help setting up a ForgeGradle workspace, go to this [forum page][2]. -If you don't have [Gradle][3] installed on your computer you can use `gradlew` or `gradlew.bat` instead +How to install it is a bit different depending on what IDE you are using. -For help setting up a ForgeGradle workspace, go to this [forum page][4]. +Instructions on how to install is in [README.txt][3] -##### Installing for Intellij IDEA -```sh -gradle setupDecompWorkspace idea -``` - -##### Installing for Eclipse -```sh -gradle setupDecompWorkspace eclipse -``` - -[1]:http://www.chickenbones.craftsaddle.org/Files/New_Versions/links.php -[2]:http://www.minecraftforum.net/topic/1846244-172- -[3]:http://www.gradle.org/ -[4]:http://www.minecraftforge.net/forum/index.php/topic,14048.0.html +[1]:http://www.gradle.org/ +[2]:http://www.minecraftforge.net/forum/index.php/topic,14048.0.html +[3]:README.txt diff --git a/README.txt b/README.txt new file mode 100644 index 000000000..b45931f43 --- /dev/null +++ b/README.txt @@ -0,0 +1,59 @@ +------------------------------------------- +Source installation information for modders +------------------------------------------- +This code follows the Minecraft Forge installation methodology. It will apply +some small patches to the vanilla MCP source code, giving you and it access +to some of the data and functions you need to build a successful mod. + +Note also that the patches are built against "unrenamed" MCP source code (aka +srgnames) - this means that you will not be able to read them directly against +normal code. + +Source pack installation information: + +Standalone source installation +============================== + +Step 1: Open your command-line and browse to the folder where you extracted the zip file. + +Step 2: Once you have a command window up in the folder that the downloaded material was placed, type: + +Windows: "gradlew setupDecompWorkspace" +Linux/Mac OS: "./gradlew setupDecompWorkspace" + +Step 3: After all that finished, you're left with a choice. +For eclipse, run "gradlew eclipse" (./gradlew eclipse if you are on Mac/Linux) + +If you preffer to use IntelliJ, steps are a little different. +1. Open IDEA, and import project. +2. Select your build.gradle file and have it import. +3. Once it's finished you must close IntelliJ and run the following command: + +"gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux) + +Step 4: The final step is to open Eclipse and switch your workspace to /eclipse/ (if you use IDEA, it should automatically start on your project) + +If at any point you are missing libraries in your IDE, or you've run into problems you can run "gradlew --refresh-dependencies" to refresh the local cache. "gradlew clean" to reset everything {this does not effect your code} and then start the processs again. + +Should it still not work, +Refer to #ForgeGradle on EsperNet for more information about the gradle environment. + +Tip: +If you do not care about seeing Minecraft's source code you can replace "setupDecompWorkspace" with one of the following: +"setupDevWorkspace": Will patch, deobfusicated, and gather required assets to run minecraft, but will not generated human readable source code. +"setupCIWorkspace": Same as Dev but will not download any assets. This is useful in build servers as it is the fastest because it does the least work. + +Tip: +When using Decomp workspace, the Minecraft source code is NOT added to your workspace in a editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes and usually can be accessed under the 'referenced libraries' section of your IDE. + +Forge source installation +========================= +MinecraftForge ships with this code and installs it as part of the forge +installation process, no further action is required on your part. + +LexManos' Install Video +======================= +https://www.youtube.com/watch?v=8VEdtQLuLO0&feature=youtu.be + +For more details update more often refer to the Forge Forums: +http://www.minecraftforge.net/forum/index.php/topic,14048.0.html diff --git a/build.gradle b/build.gradle index 8c82d7b44..b1473b903 100644 --- a/build.gradle +++ b/build.gradle @@ -1,29 +1,75 @@ + +// For those who want the bleeding edge buildscript { repositories { - mavenCentral() + jcenter() maven { name = "forge" url = "http://files.minecraftforge.net/maven" } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' } } +apply plugin: 'net.minecraftforge.gradle.forge' -apply plugin: 'forge' +/* +// for people who want stable - not yet functional for MC 1.8.9 - we require the forgegradle 2.1 snapshot +plugins { + id "net.minecraftforge.gradle.forge" version "2.0.1" +} +*/ -version = "A92" +repositories { + maven { // WAILA + name 'Prof. Mobius' + url 'http://mobiusstrip.eu/maven' + } + maven { // NEI and friends + name 'Chickenbones' + url 'http://chickenbones.net/maven/' + } +} + +version = "A94" group= "vswe.stevesfactory" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "StevesFactoryManager" minecraft { - version = "1.7.10-10.13.0.1188" - assetDir = "eclipse/assets" + version = "1.8.9-11.15.1.1722" + runDir = "run" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not always work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "stable_20" +} + +dependencies { + // you may put jars on which you depend on in ./libs + // or you may define them like so.. + //compile "some.group:artifact:version:classifier" + //compile "some.group:artifact:version" + + // real examples + //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided, + // except that these dependencies get remapped to your current MCP mappings + //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev' + //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // for more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + compile 'mcp.mobius.waila:Waila:1.6.0-B3_1.8.8:dev' } processResources @@ -35,13 +81,13 @@ processResources // replace stuff in mcmod.info, nothing else from(sourceSets.main.resources.srcDirs) { include 'mcmod.info' - + // replace version and mcversion expand 'version':project.version, 'mcversion':project.minecraft.version } - + // copy everything else, thats not the mcmod.info from(sourceSets.main.resources.srcDirs) { exclude 'mcmod.info' } -} +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 3c7abdf12790879c06b07176de29647f77aa4129..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 100644 GIT binary patch delta 36039 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f2d31dc27..9397848f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jun 11 01:18:37 CEST 2014 +#Mon Sep 14 12:28:28 PDT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip diff --git a/logs/latest.log b/logs/latest.log deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/vswe/stevesfactory/GeneratedInfo.java b/src/main/java/vswe/stevesfactory/GeneratedInfo.java index 9ebba69a4..25c3ffd2a 100644 --- a/src/main/java/vswe/stevesfactory/GeneratedInfo.java +++ b/src/main/java/vswe/stevesfactory/GeneratedInfo.java @@ -2,6 +2,6 @@ public class GeneratedInfo { - public static final String version = /*@v*/"A92"; + public static final String version = /*@v*/"A94"; public static final boolean inDev = /*@d*/false; } diff --git a/src/main/java/vswe/stevesfactory/GuiHandler.java b/src/main/java/vswe/stevesfactory/GuiHandler.java index 96b0ef0d2..140d0f187 100644 --- a/src/main/java/vswe/stevesfactory/GuiHandler.java +++ b/src/main/java/vswe/stevesfactory/GuiHandler.java @@ -1,9 +1,10 @@ package vswe.stevesfactory; -import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; import vswe.stevesfactory.blocks.ITileEntityInterface; @@ -14,7 +15,7 @@ public GuiHandler() { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); + TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); if (te != null && te instanceof ITileEntityInterface) { return ((ITileEntityInterface)te).getContainer(te, player.inventory); @@ -25,7 +26,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); + TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); if (te != null && te instanceof ITileEntityInterface) { return ((ITileEntityInterface)te).getGui(te, player.inventory); diff --git a/src/main/java/vswe/stevesfactory/Localization.java b/src/main/java/vswe/stevesfactory/Localization.java index e18011808..81f500266 100644 --- a/src/main/java/vswe/stevesfactory/Localization.java +++ b/src/main/java/vswe/stevesfactory/Localization.java @@ -1,6 +1,7 @@ package vswe.stevesfactory; +import net.minecraft.util.EnumFacing; import net.minecraft.util.StatCollector; public enum Localization { @@ -14,12 +15,12 @@ public enum Localization { CONDITION_LONG, FLOW_CONTROL_SHORT, FLOW_CONTROL_LONG, - LIQUID_INPUT_SHORT, - LIQUID_INPUT_LONG, - LIQUID_OUTPUT_SHORT, - LIQUID_OUTPUT_LONG, - LIQUID_CONDITION_SHORT, - LIQUID_CONDITION_LONG, + FLUID_INPUT_SHORT, + FLUID_INPUT_LONG, + FLUID_OUTPUT_SHORT, + FLUID_OUTPUT_LONG, + FLUID_CONDITION_SHORT, + FLUID_CONDITION_LONG, REDSTONE_EMITTER_SHORT, REDSTONE_EMITTER_LONG, REDSTONE_CONDITION_SHORT, @@ -105,7 +106,7 @@ public enum Localization { NO_CONDITION_ERROR, BUCKETS, MILLI_BUCKETS, - LIQUIDS_MENU, + FLUIDS_MENU, USE_ALL, REVERSED, LOOP_ORDER_MENU, @@ -191,8 +192,8 @@ public enum Localization { VARIABLE_GREEN, VARIABLE_RED, VARIABLE_BLACK, - NO_LIQUID_SELECTED, - CHANGE_LIQUID, + NO_FLUID_SELECTED, + CHANGE_FLUID, EDIT_SETTING, NO_ITEM_SELECTED, CHANGE_ITEM, @@ -378,17 +379,17 @@ public String toString() { return StatCollector.translateToLocal("gui." + StevesFactoryManager.UNLOCALIZED_START + name); } - public static Localization getForgeDirectionLocalization(int id) { - switch (id) { - case 0: + public static Localization getDirectionLocalization(EnumFacing facing) { + switch (facing) { + case DOWN: return DOWN; - case 1: + case UP: return UP; - case 2: + case NORTH: return NORTH; - case 3: + case SOUTH: return SOUTH; - case 4: + case WEST: return WEST; default: return EAST; diff --git a/src/main/java/vswe/stevesfactory/StevesFactoryManager.java b/src/main/java/vswe/stevesfactory/StevesFactoryManager.java index dd6f3fb03..8712ba206 100644 --- a/src/main/java/vswe/stevesfactory/StevesFactoryManager.java +++ b/src/main/java/vswe/stevesfactory/StevesFactoryManager.java @@ -1,24 +1,25 @@ package vswe.stevesfactory; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.network.FMLEventChannel; -import cpw.mods.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLInterModComms; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.network.FMLEventChannel; +import net.minecraftforge.fml.common.network.NetworkRegistry; import vswe.stevesfactory.blocks.ModBlocks; import vswe.stevesfactory.components.ModItemHelper; import vswe.stevesfactory.network.FileHelper; import vswe.stevesfactory.network.PacketEventHandler; import vswe.stevesfactory.proxy.CommonProxy; -@Mod(modid = "StevesFactoryManager", name = "Steve's Factory Manager", version = GeneratedInfo.version) +@Mod(modid = StevesFactoryManager.MODID, name = "Steve's Factory Manager", version = GeneratedInfo.version) public class StevesFactoryManager { - public static final String RESOURCE_LOCATION = "stevesfactory"; + public static final String MODID = "StevesFactoryManager"; + public static final String RESOURCE_LOCATION = "stevesfactorymanager"; public static final String CHANNEL = "FactoryManager"; public static final String UNLOCALIZED_START = "sfm."; @@ -27,7 +28,7 @@ public class StevesFactoryManager { @SidedProxy(clientSide = "vswe.stevesfactory.proxy.ClientProxy", serverSide = "vswe.stevesfactory.proxy.CommonProxy") public static CommonProxy proxy; - @Mod.Instance("StevesFactoryManager") + @Mod.Instance(MODID) public static StevesFactoryManager instance; @@ -35,22 +36,21 @@ public class StevesFactoryManager { public void preInit(FMLPreInitializationEvent event) { packetHandler = NetworkRegistry.INSTANCE.newEventDrivenChannel(CHANNEL); - FileHelper.setConfigDir(event.getModConfigurationDirectory()); - ModBlocks.init(); + + proxy.preInit(); + + FileHelper.setConfigDir(event.getModConfigurationDirectory()); } @Mod.EventHandler public void init(FMLInitializationEvent event) { - proxy.init(); - packetHandler.register(new PacketEventHandler()); ModBlocks.addRecipes(); //new ChatListener(); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); - FMLInterModComms.sendMessage("Waila", "register", "vswe.stevesfactory.waila.Provider.callbackRegister"); } diff --git a/src/main/java/vswe/stevesfactory/animation/AnimationController.java b/src/main/java/vswe/stevesfactory/animation/AnimationController.java index 8d9291e17..e2aa4a685 100644 --- a/src/main/java/vswe/stevesfactory/animation/AnimationController.java +++ b/src/main/java/vswe/stevesfactory/animation/AnimationController.java @@ -1,7 +1,6 @@ package vswe.stevesfactory.animation; -import com.sun.swing.internal.plaf.metal.resources.metal_it; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.components.*; diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCable.java b/src/main/java/vswe/stevesfactory/blocks/BlockCable.java index eb7482803..c612432be 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCable.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCable.java @@ -1,12 +1,11 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; import net.minecraft.world.World; import vswe.stevesfactory.StevesFactoryManager; @@ -20,42 +19,36 @@ public BlockCable() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_UNLOCALIZED_NAME); setHardness(0.4F); } - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable"); - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); + public void onBlockAdded(World world, BlockPos pos, IBlockState state) { + super.onBlockAdded(world, pos, state); - updateInventories(world, x, y, z); + updateInventories(world, pos, state); } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - super.onNeighborBlockChange(world, x, y, z, block); + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block block) { + super.onNeighborBlockChange(world, pos, state, block); - updateInventories(world, x, y, z); + updateInventories(world, pos, state); } @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - super.breakBlock(world, x, y, z, block, meta); + public void breakBlock(World world, BlockPos pos,IBlockState state) { + super.breakBlock(world, pos, state); - updateInventories(world, x, y, z); + updateInventories(world, pos, state); } - public void updateInventories(World world, int blockX, int blockY, int blockZ) { + public void updateInventories(World world, BlockPos pos, IBlockState state) { List visited = new ArrayList(); Queue queue = new PriorityQueue(); - WorldCoordinate start = new WorldCoordinate(blockX, blockY, blockZ, 0); + WorldCoordinate start = new WorldCoordinate(pos.getX(), pos.getY(), pos.getZ(), 0); queue.add(start); visited.add(start); @@ -71,14 +64,14 @@ public void updateInventories(World world, int blockX, int blockY, int blockZ) { if (!visited.contains(target)) { visited.add(target); //if (element.getDepth() < TileEntityManager.MAX_CABLE_LENGTH){ - Block block = world.getBlock(target.getX(), target.getY(), target.getZ()); - int meta = world.getBlockMetadata(target.getX(), target.getY(), target.getZ()); - if (block == ModBlocks.blockManager){ - TileEntity tileEntity = world.getTileEntity(target.getX(), target.getY(), target.getZ()); + IBlockState block = world.getBlockState(new BlockPos(x, y, z)); + int meta = block.getBlock().getMetaFromState(block); + if (block.getBlock() == ModBlocks.blockManager){ + TileEntity tileEntity = world.getTileEntity(new BlockPos(target.getX(), target.getY(), target.getZ())); if (tileEntity != null && tileEntity instanceof TileEntityManager) { ((TileEntityManager)tileEntity).updateInventories(); } - }else if (isCable(block, meta) /*&& target.getDepth() < TileEntityManager.MAX_CABLE_LENGTH*/) { + }else if (isCable(block.getBlock(), meta) /*&& target.getDepth() < TileEntityManager.MAX_CABLE_LENGTH*/) { queue.add(target); } //} @@ -87,11 +80,11 @@ public void updateInventories(World world, int blockX, int blockY, int blockZ) { } } } - } + } public boolean isCable(Block block, int meta) { diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableBUD.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableBUD.java index 4f896c3ce..a08ed7f0f 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableBUD.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableBUD.java @@ -1,13 +1,12 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; import net.minecraft.world.World; import vswe.stevesfactory.StevesFactoryManager; @@ -16,7 +15,7 @@ public BlockCableBUD() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_BUD_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_BUD_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -25,15 +24,14 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBUD(); } - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_bud"); + public int getRenderType() { + return 3; } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - TileEntityBUD bud = TileEntityCluster.getTileEntity(TileEntityBUD.class, world, x, y, z); + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block block) { + TileEntityBUD bud = TileEntityCluster.getTileEntity(TileEntityBUD.class, world, pos); if (bud != null) { bud.onTrigger(); } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableBreaker.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableBreaker.java index d4a0ea883..0544fcaa8 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableBreaker.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableBreaker.java @@ -1,20 +1,21 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import vswe.stevesfactory.StevesFactoryManager; //This is indeed not a subclass to the cable, you can't relay signals through this block @@ -23,7 +24,7 @@ public BlockCableBreaker() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_BREAKER_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_BREAKER_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -32,77 +33,68 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBreaker(); } - @SideOnly(Side.CLIENT) - private IIcon doubleIIcon; - @SideOnly(Side.CLIENT) - private IIcon frontIIcon; - @SideOnly(Side.CLIENT) - private IIcon sideIIcon; + public static final IProperty FRONT = PropertyDirection.create("front"); + public static final IProperty DIRECTION = PropertyDirection.create("direction"); - - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_idle"); - doubleIIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_breaker"); - frontIIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_breaker_front"); - sideIIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_breaker_direction"); + public BlockState createBlockState() { + return new BlockState(this, DIRECTION, FRONT); } - @SideOnly(Side.CLIENT) - @Override - public IIcon getIcon(int side, int meta) { - return side == 3 ? doubleIIcon : blockIcon; + public static EnumFacing getSide(int meta) { + return EnumFacing.getFront(meta % EnumFacing.values().length); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - - TileEntityBreaker breaker = TileEntityCluster.getTileEntity(TileEntityBreaker.class, world, x, y, z); + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(FRONT, getSide(meta)).withProperty(DIRECTION, getSide(meta)); + } - if (breaker != null) { - int meta = breaker.getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length; - int direction = breaker.getPlaceDirection(); + @Override + public int getMetaFromState(IBlockState state) { + return ((EnumFacing)state.getValue(FRONT)).getIndex(); + } - if (side == meta && side == direction) { - return doubleIIcon; - }else if(side == meta) { - return frontIIcon; - }else if(side == direction) { - return sideIIcon; - } + @Override + public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { + TileEntityBreaker entityBreaker = (TileEntityBreaker) worldIn.getTileEntity(pos); + if (entityBreaker != null && entityBreaker.getPlaceDirection() != null) { + return state.withProperty(DIRECTION, entityBreaker.getPlaceDirection()).withProperty(FRONT, getSide(getMetaFromState(state))); } - - return blockIcon; + return state.withProperty(DIRECTION, getSide(getMetaFromState(state))).withProperty(FRONT, getSide(getMetaFromState(state))); } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - int meta = BlockPistonBase.determineOrientation(world, x, y, z, entity); + public int getRenderType() { + return 3; + } - TileEntityBreaker breaker = TileEntityCluster.getTileEntity(TileEntityBreaker.class, world, x, y, z); - if (breaker != null) { - breaker.setMetaData(meta); - breaker.setPlaceDirection(meta); + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack item) { + if (!world.isRemote) { + EnumFacing facing = BlockPistonBase.getFacingFromEntity(world, pos, entity); + + TileEntityBreaker breaker = TileEntityCluster.getTileEntity(TileEntityBreaker.class, world, pos); + if (breaker != null) { + breaker.setPlaceDirection(facing); + breaker.setMetaData(facing.getIndex()); + } } } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { + if (player.isSneaking()) { - side = ForgeDirection.VALID_DIRECTIONS[side].getOpposite().ordinal(); + side = side.getOpposite(); } - TileEntityBreaker breaker = TileEntityCluster.getTileEntity(TileEntityBreaker.class, world, x, y, z); + TileEntityBreaker breaker = TileEntityCluster.getTileEntity(TileEntityBreaker.class, world, pos); if (breaker != null && !breaker.isBlocked()) { breaker.setPlaceDirection(side); return true; } - return false; } } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableCamouflages.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableCamouflages.java index c587f40f0..c47701e16 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableCamouflages.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableCamouflages.java @@ -1,17 +1,20 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; +import net.minecraft.util.BlockPos; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import vswe.stevesfactory.StevesFactoryManager; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; import java.util.List; @@ -31,27 +34,42 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCamouflage(); } - @SideOnly(Side.CLIENT) - private IIcon[] icons; + public static final UnlistedBlockPosProperty BLOCK_POS = new UnlistedBlockPosProperty("block_pos"); + public static final IProperty CAMO_TYPE = PropertyCamouflageType.create("camo_type"); - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - icons = new IIcon[TileEntityCamouflage.CamouflageType.values().length]; - for (int i = 0; i < icons.length; i++) { - icons[i] = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":" + TileEntityCamouflage.CamouflageType.values()[i].getIcon()); - } + protected BlockState createBlockState() { + + IProperty [] listedProperties = new IProperty[]{CAMO_TYPE}; + IUnlistedProperty[] unlistedProperties = new IUnlistedProperty[]{BLOCK_POS}; + return new ExtendedBlockState(this, listedProperties, unlistedProperties); } - @SideOnly(Side.CLIENT) + @Override - public IIcon getIcon(int side, int meta) { - return getDefaultIcon(side, meta, meta); + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(CAMO_TYPE, TileEntityCamouflage.CamouflageType.getCamouflageType(meta)); } - @SideOnly(Side.CLIENT) @Override - protected IIcon getDefaultIcon(int side, int blockMeta, int camoMeta) { - return icons[camoMeta % icons.length]; + public int getMetaFromState(IBlockState state) { + + if (state.getValue(CAMO_TYPE) != null) { + return ((TileEntityCamouflage.CamouflageType)state.getValue(CAMO_TYPE)).ordinal(); + } + + return 0; + } + + @Override + public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { + + TileEntityCamouflage tileEntity = (TileEntityCamouflage) world.getTileEntity(pos); + if (state instanceof IExtendedBlockState && tileEntity != null) { + + return ((IExtendedBlockState)state).withProperty(BLOCK_POS, pos); + } + + return state; } @Override @@ -66,13 +84,13 @@ public int getId(int meta) { } @Override - public int damageDropped(int meta) { - return meta; + public int damageDropped(IBlockState state) { + return state.getBlock().getMetaFromState(state); } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack item) { + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, pos); if (camouflage != null) { camouflage.setMetaData(item.getItemDamage()); } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableCluster.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableCluster.java index 02c0ab755..50f01dabf 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableCluster.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableCluster.java @@ -1,11 +1,13 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -13,12 +15,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import vswe.stevesfactory.StevesFactoryManager; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; import java.util.ArrayList; import java.util.List; @@ -32,70 +36,70 @@ protected BlockCableCluster() { setHardness(2F); } + public static final IProperty FACING = PropertyDirection.create("facing"); + public static final IProperty ADVANCED = PropertyBool.create("advanced"); + @Override + protected BlockState createBlockState() { - @SideOnly(Side.CLIENT) - private IIcon sideIcon; - @SideOnly(Side.CLIENT) - private IIcon frontIcon; - @SideOnly(Side.CLIENT) - private IIcon sideIconAdv; - @SideOnly(Side.CLIENT) - private IIcon frontIconAdv; + IProperty [] listedProperties = new IProperty[]{ADVANCED, FACING}; + IUnlistedProperty[] unlistedProperties = new IUnlistedProperty[]{BlockCableCamouflages.BLOCK_POS}; + return new ExtendedBlockState(this, listedProperties, unlistedProperties); + } - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - sideIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_cluster"); - frontIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_cluster_front"); - sideIconAdv = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_cluster_adv"); - frontIconAdv = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_cluster_adv_front"); + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(ADVANCED, isAdvanced(meta)).withProperty(FACING, getSide(meta)); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) { - //pretend the meta is 3 - return getIconFromSideAndMeta(side, addAdvancedMeta(3, meta)); + public int getMetaFromState(IBlockState state) { + return addAdvancedMeta(((EnumFacing) state.getValue(FACING)).getIndex(), ((Boolean) state.getValue(ADVANCED)) ? 8 : 0); } - @SideOnly(Side.CLIENT) @Override - public IIcon getDefaultIcon(int side, int blockMeta, int camoMeta) { - return getIconFromSideAndMeta(side, blockMeta); + public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { + + TileEntityCluster tileEntity = (TileEntityCluster) world.getTileEntity(pos); + if (state instanceof IExtendedBlockState && tileEntity != null) { + + return ((IExtendedBlockState)state).withProperty(BlockCableCamouflages.BLOCK_POS, pos); + } + + return state; } @Override - public void breakBlock(World world, int x, int y, int z, Block oldBlock, int oldMeta) { - ItemStack itemStack = getItemStack(world, x, y, z, oldMeta); + public void breakBlock(World world, BlockPos pos, IBlockState state) { + /*ItemStack itemStack = getItemStack(world, pos, state); if (itemStack != null) { - dropBlockAsItem(world, x, y, z, itemStack); - } + dropBlockAsItem(world, pos, itemStack, 0); + }*/ - super.breakBlock(world, x, y, z, oldBlock, oldMeta); + super.breakBlock(world, pos, state); - if (isAdvanced(world.getBlockMetadata(x, y, z))) { - ModBlocks.blockCable.updateInventories(world, x, y, z); + if (isAdvanced(state.getBlock().getMetaFromState(state))) { + ModBlocks.blockCable.updateInventories(world, pos, state); } } @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { - ItemStack itemStack = getItemStack(world, x, y, z, world.getBlockMetadata(x, y, z)); + public ItemStack getPickBlock(MovingObjectPosition target, World world, BlockPos pos, EntityPlayer player) { + ItemStack itemStack = getItemStack(world, pos, world.getBlockState(pos)); if (itemStack != null) { return itemStack; } - return super.getPickBlock(target, world, x, y, z) ; + return super.getPickBlock(target, world, pos, player) ; } - private ItemStack getItemStack(World world, int x, int y, int z, int meta) { - TileEntity te = world.getTileEntity(x, y, z); + private ItemStack getItemStack(IBlockAccess world, BlockPos pos, IBlockState state) { + TileEntity te = world.getTileEntity(pos); if (te != null && te instanceof TileEntityCluster) { TileEntityCluster cluster = (TileEntityCluster)te; - ItemStack itemStack = new ItemStack(ModBlocks.blockCableCluster, 1, damageDropped(meta)); + ItemStack itemStack = new ItemStack(ModBlocks.blockCableCluster, 1, damageDropped(state)); NBTTagCompound compound = new NBTTagCompound(); itemStack.setTagCompound(compound); NBTTagCompound cable = new NBTTagCompound(); @@ -109,13 +113,11 @@ private ItemStack getItemStack(World world, int x, int y, int z, int meta) { @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { - return new ArrayList(); //TODO Drop items here, not sure how to though since the TE is gone. please help - } - - @SideOnly(Side.CLIENT) - private IIcon getIconFromSideAndMeta(int side, int meta) { - return side == getSideMeta(meta) % ForgeDirection.VALID_DIRECTIONS.length ? isAdvanced(meta) ? frontIconAdv : frontIcon : isAdvanced(meta) ? sideIconAdv : sideIcon; + public ArrayList getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { + ArrayList drop = new ArrayList(); + drop.add(getItemStack(world, pos, state)); + return drop; + //return new ArrayList(); //TODO Drop items here, not sure how to though since the TE is gone. please help } @Override @@ -123,8 +125,8 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCluster(); } - private TileEntityCluster getTe(IBlockAccess world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); + private TileEntityCluster getTe(IBlockAccess world, BlockPos pos) { + TileEntity te = world.getTileEntity(pos); if (te != null && te instanceof TileEntityCluster) { return (TileEntityCluster)te; } @@ -132,35 +134,35 @@ private TileEntityCluster getTe(IBlockAccess world, int x, int y, int z) { } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) { - int meta = addAdvancedMeta(BlockPistonBase.determineOrientation(world, x, y, z, entity), itemStack.getItemDamage()); - world.setBlockMetadataWithNotify(x, y, z, meta, 2); + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack itemStack) { + int meta = addAdvancedMeta(BlockPistonBase.getFacingFromEntity(world, pos, entity).getIndex(), itemStack.getItemDamage()); + world.setBlockState(pos, state.getBlock().getStateFromMeta(meta), 2); - TileEntityCluster cluster = getTe(world, x, y, z); + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { cluster.loadElements(itemStack); - cluster.onBlockPlacedBy(entity, itemStack); + cluster.onBlockPlacedBy(state, entity, itemStack); } } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - TileEntityCluster cluster = getTe(world, x, y, z); + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block block) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { - cluster.onNeighborBlockChange(block); + cluster.onNeighborBlockChange(block, state); } - if (isAdvanced(world.getBlockMetadata(x, y, z))) { - ModBlocks.blockCable.updateInventories(world, x, y, z); + if (isAdvanced(state.getBlock().getMetaFromState(state))) { + ModBlocks.blockCable.updateInventories(world, pos, state); } } @Override - public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side) { - TileEntityCluster cluster = getTe(world, x, y, z); + public boolean canConnectRedstone(IBlockAccess world, BlockPos pos, EnumFacing side) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { return cluster.canConnectRedstone(side); @@ -170,21 +172,21 @@ public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int s } @Override - public void onBlockAdded(World world, int x, int y, int z) { - TileEntityCluster cluster = getTe(world, x, y, z); + public void onBlockAdded(World world, BlockPos pos, IBlockState state) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { - cluster.onBlockAdded(); + cluster.onBlockAdded(state); } - if (isAdvanced(world.getBlockMetadata(x, y, z))) { - ModBlocks.blockCable.updateInventories(world, x, y, z); + if (isAdvanced(state.getBlock().getMetaFromState(state))) { + ModBlocks.blockCable.updateInventories(world, pos, state); } } @Override - public boolean shouldCheckWeakPower(IBlockAccess world, int x, int y, int z, int side) { - TileEntityCluster cluster = getTe(world, x, y, z); + public boolean shouldCheckWeakPower(IBlockAccess world, BlockPos pos, EnumFacing side) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { return cluster.shouldCheckWeakPower(side); @@ -194,33 +196,33 @@ public boolean shouldCheckWeakPower(IBlockAccess world, int x, int y, int z, int } @Override - public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { - TileEntityCluster cluster = getTe(world, x, y, z); + public int getWeakPower(IBlockAccess world, BlockPos pos, IBlockState state, EnumFacing side) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { - return cluster.isProvidingWeakPower(side); + return cluster.isProvidingWeakPower(state, side); } return 0; } @Override - public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int side) { - TileEntityCluster cluster = getTe(world, x, y, z); + public int getStrongPower(IBlockAccess world, BlockPos pos, IBlockState state, EnumFacing side) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { - return cluster.isProvidingStrongPower(side); + return cluster.isProvidingStrongPower(state, side); } return 0; } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - TileEntityCluster cluster = getTe(world, x, y, z); + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { + TileEntityCluster cluster = getTe(world, pos); if (cluster != null) { - return cluster.onBlockActivated(player, side, hitX, hitY, hitZ); + return cluster.onBlockActivated(player, state, side, hitX, hitY, hitZ); } return false; @@ -242,6 +244,10 @@ public int getSideMeta(int meta) { return meta & 7; } + public EnumFacing getSide(int meta) { + return EnumFacing.getFront(getSideMeta(meta)); + } + private int addAdvancedMeta(int meta, int advancedMeta) { return meta | (advancedMeta & 8); } @@ -251,8 +257,8 @@ private int getAdvancedMeta(int meta) { } @Override - public int damageDropped(int meta) { - return getAdvancedMeta(meta); + public int damageDropped(IBlockState state) { + return getAdvancedMeta(state.getBlock().getMetaFromState(state)); } } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableCreative.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableCreative.java index eb9656141..1692a30aa 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableCreative.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableCreative.java @@ -1,10 +1,7 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import vswe.stevesfactory.StevesFactoryManager; @@ -15,7 +12,7 @@ public BlockCableCreative() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_CREATIVE_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_CREATIVE_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -24,9 +21,9 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityCreative(); } - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_creative"); + public int getRenderType() { + return 3; } + } \ No newline at end of file diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableDirectionAdvanced.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableDirectionAdvanced.java index 0b30807d4..e2634dbd8 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableDirectionAdvanced.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableDirectionAdvanced.java @@ -1,20 +1,20 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import vswe.stevesfactory.StevesFactoryManager; import java.util.List; @@ -27,52 +27,34 @@ public BlockCableDirectionAdvanced() { setHardness(1.2F); } - @SideOnly(Side.CLIENT) - private IIcon activeIcon; - @SideOnly(Side.CLIENT) - private IIcon advancedActiveIcon; - @SideOnly(Side.CLIENT) - private IIcon inactiveIcon; - @SideOnly(Side.CLIENT) - private IIcon advancedInactiveIcon; + public static final IProperty FACING = PropertyDirection.create("facing"); + public static final IProperty ADVANCED = PropertyBool.create("advanced"); - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - activeIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":" + getFrontTextureName(false)); - advancedActiveIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":" + getFrontTextureName(true)); - inactiveIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":" + getSideTextureName(false)); - advancedInactiveIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":" + getSideTextureName(true)); + protected BlockState createBlockState() { + return new BlockState(this, ADVANCED, FACING); } - protected abstract String getFrontTextureName(boolean isAdvanced); - protected abstract String getSideTextureName(boolean isAdvanced); - - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) { - //pretend the meta is 3 - return getIconFromSideAndMeta(side, addAdvancedMeta(3, meta)); + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(ADVANCED, isAdvanced(meta)).withProperty(FACING, getSide(meta)); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - int meta = world.getBlockMetadata(x, y, z); - - return getIconFromSideAndMeta(side, meta); + public int getMetaFromState(IBlockState state) { + return addAdvancedMeta(((EnumFacing) state.getValue(FACING)).getIndex(), ((Boolean) state.getValue(ADVANCED)) ? 8 : 0); } - @SideOnly(Side.CLIENT) - private IIcon getIconFromSideAndMeta(int side, int meta) { - return side == (getSideMeta(meta) % ForgeDirection.VALID_DIRECTIONS.length) ? isAdvanced(meta) ? advancedActiveIcon : activeIcon : isAdvanced(meta) ? advancedInactiveIcon : inactiveIcon; + @Override + public int getRenderType() { + return 3; } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - int meta = addAdvancedMeta(BlockPistonBase.determineOrientation(world, x, y, z, entity), item.getItemDamage()); + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack item) { + int meta = addAdvancedMeta(BlockPistonBase.getFacingFromEntity(world, pos, entity).getIndex(), item.getItemDamage()); - TileEntityClusterElement element = TileEntityCluster.getTileEntity(getTeClass(), world, x, y, z); + TileEntityClusterElement element = TileEntityCluster.getTileEntity(getTeClass(), world, pos); if (element != null) { element.setMetaData(meta); } @@ -94,6 +76,10 @@ public int getSideMeta(int meta) { return meta & 7; } + public EnumFacing getSide(int meta) { + return EnumFacing.getFront(getSideMeta(meta)); + } + private int addAdvancedMeta(int meta, int advancedMeta) { return meta | (advancedMeta & 8); } @@ -103,8 +89,8 @@ private int getAdvancedMeta(int meta) { } @Override - public int damageDropped(int meta) { - return getAdvancedMeta(meta); + public int damageDropped(IBlockState state) { + return getAdvancedMeta(state.getBlock().getMetaFromState(state)); } } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableInput.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableInput.java index c850cbef5..9d6169ca2 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableInput.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableInput.java @@ -1,12 +1,12 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import vswe.stevesfactory.StevesFactoryManager; @@ -17,7 +17,7 @@ public BlockCableInput() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_INPUT_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_INPUT_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -26,33 +26,32 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityInput(); } - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_input"); + public int getRenderType() { + return 3; } @Override - public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side) { + public boolean canConnectRedstone(IBlockAccess world, BlockPos pos, EnumFacing side) { return true; } @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); + public void onBlockAdded(World world, BlockPos pos, IBlockState state) { + super.onBlockAdded(world, pos, state); - updateRedstone(world, x, y, z); + updateRedstone(world, pos); } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - super.onNeighborBlockChange(world, x, y, z, block); + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block block) { + super.onNeighborBlockChange(world, pos, state, block); - updateRedstone(world, x, y, z); + updateRedstone(world, pos); } - private void updateRedstone(World world, int x, int y, int z) { - TileEntityInput input = TileEntityCluster.getTileEntity(TileEntityInput.class, world, x, y, z); + private void updateRedstone(World world, BlockPos pos) { + TileEntityInput input = TileEntityCluster.getTileEntity(TileEntityInput.class, world, pos); if (input != null) { input.triggerRedstone(); } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableIntake.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableIntake.java index 72449253a..d3c660d09 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableIntake.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableIntake.java @@ -12,17 +12,6 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityIntake(); } - - @Override - protected String getFrontTextureName(boolean isAdvanced) { - return isAdvanced ? "cable_intake_out_instant" : "cable_intake_out"; - } - - @Override - protected String getSideTextureName(boolean isAdvanced) { - return isAdvanced ? "cable_intake_instant" : "cable_intake"; - } - @Override protected Class getTeClass() { return TileEntityIntake.class; diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableOutput.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableOutput.java index 02ad60f4c..c09bd931a 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableOutput.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableOutput.java @@ -1,24 +1,30 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.property.ExtendedBlockState; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.common.property.IUnlistedProperty; +import net.minecraftforge.common.property.Properties; import vswe.stevesfactory.StevesFactoryManager; //This is indeed not a subclass to the cable, you can't relay signals through this block -public class BlockCableOutput extends BlockContainer { +public class BlockCableOutput extends BlockContainer { public BlockCableOutput() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_OUTPUT_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_OUTPUT_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -27,39 +33,49 @@ public TileEntity createNewTileEntity(World world, int var2) { return new TileEntityOutput(); } - @SideOnly(Side.CLIENT) - private IIcon inactiveIcon; - @SideOnly(Side.CLIENT) - private IIcon weakIcon; - @SideOnly(Side.CLIENT) - private IIcon strongIcon; + public static final IUnlistedProperty STRONG_SIDES = new Properties.PropertyAdapter(PropertyInteger.create("strong_sides", 0, 63)); // 000000 -> 111111 + public static final IUnlistedProperty WEAK_SIDES = new Properties.PropertyAdapter(PropertyInteger.create("strong_sides", 0, 63)); // 000000 -> 111111 - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - strongIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_output_strong"); - weakIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_output_weak"); - inactiveIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_idle"); - } - + protected BlockState createBlockState() { - @Override - public IIcon getIcon(int side, int meta) { - return weakIcon; + IProperty [] listedProperties = new IProperty[0]; + IUnlistedProperty[] unlistedProperties = new IUnlistedProperty[]{STRONG_SIDES, WEAK_SIDES}; + return new ExtendedBlockState(this, listedProperties, unlistedProperties); } @Override - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntityOutput te = getTileEntity(world, x, y, z); - if (te != null && te.getStrengthFromSide(side) > 0) { - return te.hasStrongSignalAtSide(side) ? strongIcon : weakIcon; + public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { + + TileEntityOutput tileEntity = (TileEntityOutput) world.getTileEntity(pos); + if (state instanceof IExtendedBlockState && tileEntity != null) { + + int strongVals = 0; + int weakVals = 0; + for (EnumFacing facing: EnumFacing.values()) { + if (tileEntity.getStrengthFromSide(facing) > 0) { + if (tileEntity.hasStrongSignalAtSide(facing)) { + strongVals |= 1 << facing.getIndex(); + } else { + weakVals |= 1 << facing.getIndex(); + } + } + } + + return ((IExtendedBlockState)state).withProperty(STRONG_SIDES, strongVals).withProperty(WEAK_SIDES, weakVals); } - return inactiveIcon; } + return state; + } + + @Override + public int getRenderType() { + return 3; + } @Override - public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { - TileEntityOutput te = getTileEntity(world, x, y, z); + public int getWeakPower(IBlockAccess world, BlockPos pos, IBlockState state, EnumFacing side) { + TileEntityOutput te = getTileEntity(world, pos); if (te != null) { return te.getStrengthFromOppositeSide(side); } @@ -67,8 +83,8 @@ public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int sid } @Override - public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int side) { - TileEntityOutput te = getTileEntity(world, x, y, z); + public int getStrongPower(IBlockAccess world, BlockPos pos, IBlockState state, EnumFacing side) { + TileEntityOutput te = getTileEntity(world, pos); if (te != null && te.hasStrongSignalAtOppositeSide(side)) { return te.getStrengthFromOppositeSide(side); } @@ -76,12 +92,12 @@ public int isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int s return 0; } - private TileEntityOutput getTileEntity(IBlockAccess world, int x, int y, int z) { - return TileEntityCluster.getTileEntity(TileEntityOutput.class, world, x, y, z); + private TileEntityOutput getTileEntity(IBlockAccess world, BlockPos pos) { + return TileEntityCluster.getTileEntity(TileEntityOutput.class, world, pos); } @Override - public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side) { + public boolean canConnectRedstone(IBlockAccess world, BlockPos pos, EnumFacing side) { return true; } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableRelay.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableRelay.java index a89986873..0e55704bb 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableRelay.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableRelay.java @@ -1,11 +1,14 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.internal.FMLNetworkHandler; import vswe.stevesfactory.StevesFactoryManager; //This is indeed not a subclass to the cable, you can't relay signals through this block @@ -17,21 +20,10 @@ public TileEntity createNewTileEntity(World world, int var2) { } @Override - protected String getFrontTextureName(boolean isAdvanced) { - return isAdvanced ? "cable_relay_advanced" : "cable_relay"; - } - - @Override - protected String getSideTextureName(boolean isAdvanced) { - return "cable_idle"; - } - - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - super.onBlockPlacedBy(world, x, y, z, entity, item); + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack item) { + super.onBlockPlacedBy(world, pos, state, entity, item); - TileEntityRelay relay = TileEntityCluster.getTileEntity(TileEntityRelay.class, world, x, y, z); + TileEntityRelay relay = TileEntityCluster.getTileEntity(TileEntityRelay.class, world, pos); if (relay != null && isAdvanced(relay.getBlockMetadata()) && !world.isRemote) { relay.setOwner(entity); } @@ -44,11 +36,11 @@ protected Class getTeClass() { @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xSide, float ySide, float zSide) { - TileEntityRelay relay = TileEntityCluster.getTileEntity(TileEntityRelay.class, world, x, y, z); + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float xSide, float ySide, float zSide) { + TileEntityRelay relay = TileEntityCluster.getTileEntity(TileEntityRelay.class, world, pos); if (relay != null && isAdvanced(relay.getBlockMetadata())) { if (!world.isRemote) { - FMLNetworkHandler.openGui(player, StevesFactoryManager.instance, 0, world, x, y, z); + FMLNetworkHandler.openGui(player, StevesFactoryManager.instance, 0, world, pos.getX(), pos.getY(), pos.getZ()); } return true; diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCableSign.java b/src/main/java/vswe/stevesfactory/blocks/BlockCableSign.java index 449286840..a8ebc1b30 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCableSign.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCableSign.java @@ -1,17 +1,18 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockPistonBase; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import vswe.stevesfactory.StevesFactoryManager; @@ -21,7 +22,7 @@ public BlockCableSign() { super(Material.iron); setCreativeTab(ModBlocks.creativeTab); setStepSound(soundTypeMetal); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_SIGN_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.CABLE_SIGN_UNLOCALIZED_NAME); setHardness(1.2F); } @@ -30,39 +31,34 @@ public TileEntity createNewTileEntity(World world, int meta) { return new TileEntitySignUpdater(); } - @SideOnly(Side.CLIENT) - private IIcon frontIcon; + public static final IProperty FACING = PropertyDirection.create("facing"); - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - blockIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_idle"); - frontIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":cable_sign"); + protected BlockState createBlockState() { + return new BlockState(this, FACING); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) { - return getIconFromSideAndMeta(side, 3); + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(FACING, EnumFacing.getFront(meta)); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - return getIconFromSideAndMeta(side, world.getBlockMetadata(x, y, z)); - } - @SideOnly(Side.CLIENT) - private IIcon getIconFromSideAndMeta(int side, int meta) { - return side == meta ? frontIcon : blockIcon; + public int getMetaFromState(IBlockState state) { + return ((EnumFacing) state.getValue(FACING)).getIndex(); } + @Override + public int getRenderType() { + return 3; + } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) { - int meta = BlockPistonBase.determineOrientation(world, x, y, z, entity); + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack item) { + int meta = BlockPistonBase.getFacingFromEntity(world, pos, entity).getIndex(); - TileEntitySignUpdater sign = TileEntityCluster.getTileEntity(TileEntitySignUpdater.class, world, x, y, z); + TileEntitySignUpdater sign = TileEntityCluster.getTileEntity(TileEntitySignUpdater.class, world, pos); if (sign != null) { sign.setMetaData(meta); } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockCamouflageBase.java b/src/main/java/vswe/stevesfactory/blocks/BlockCamouflageBase.java index 6410d6137..324a3abd1 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockCamouflageBase.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockCamouflageBase.java @@ -1,17 +1,15 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; public abstract class BlockCamouflageBase extends BlockContainer { @@ -22,28 +20,27 @@ protected BlockCamouflageBase(Material material) { @Override @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - if (!setBlockCollisionBoundsBasedOnState(world, x, y, z)) { + public AxisAlignedBB getSelectedBoundingBox(World world, BlockPos pos) { + if (!setBlockCollisionBoundsBasedOnState(world, pos)) { setBlockBounds(0, 0, 0, 0, 0, 0); } - return super.getSelectedBoundingBoxFromPool(world, x, y, z); + return super.getSelectedBoundingBox(world, pos); } @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - if (!setBlockCollisionBoundsBasedOnState(world, x, y, z)) { + public AxisAlignedBB getCollisionBoundingBox(World world, BlockPos pos, IBlockState state) { + if (!setBlockCollisionBoundsBasedOnState(world, pos)) { return null; } - - return super.getCollisionBoundingBoxFromPool(world, x, y, z); + return super.getCollisionBoundingBox(world, pos, state); } - private boolean setBlockCollisionBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - setBlockBoundsBasedOnState(world, x, y, z); + private boolean setBlockCollisionBoundsBasedOnState(IBlockAccess world, BlockPos pos) { + setBlockBoundsBasedOnState(world, pos); - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, pos); if (camouflage != null && camouflage.getCamouflageType().useSpecialShape()) { if (!camouflage.isUseCollision()) { return false; @@ -56,26 +53,26 @@ private boolean setBlockCollisionBoundsBasedOnState(IBlockAccess world, int x, i } @Override - public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); + public boolean isPassable(IBlockAccess world, BlockPos pos) { + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, pos); return camouflage == null || camouflage.isNormalBlock(); } @Override - public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end) { - if (!setBlockCollisionBoundsBasedOnState(world, x, y, z)) { + public MovingObjectPosition collisionRayTrace(World world, BlockPos pos, Vec3 start, Vec3 end) { + if (!setBlockCollisionBoundsBasedOnState(world, pos)) { setBlockBounds(0, 0, 0, 0, 0, 0); } - return super.collisionRayTrace(world, x, y, z, start, end); + return super.collisionRayTrace(world, pos, start, end); } @SideOnly(Side.CLIENT) @Override public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer){ - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, worldObj, target.blockX, target.blockY, target.blockZ); + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, worldObj, new BlockPos(target.getBlockPos().getX(), target.getBlockPos().getY(), target.getBlockPos().getZ())); if (camouflage != null) { if (camouflage.addBlockEffect(this, target.sideHit, effectRenderer)) { return true; @@ -85,8 +82,8 @@ public boolean addHitEffects(World worldObj, MovingObjectPosition target, Effect } @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); + public void setBlockBoundsBasedOnState(IBlockAccess world, BlockPos pos) { + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, pos); if (camouflage != null && camouflage.getCamouflageType().useSpecialShape()) { camouflage.setBlockBounds(this); }else{ @@ -95,12 +92,12 @@ public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) } @Override - public float getBlockHardness(World world, int x, int y, int z) { - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); + public float getBlockHardness(World world, BlockPos pos) { + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, pos); if (camouflage != null && camouflage.getCamouflageType().useSpecialShape() && !camouflage.isUseCollision()) { return 600000; } - return super.getBlockHardness(world, x, y, z); + return super.getBlockHardness(world, pos); } @Override @@ -110,7 +107,7 @@ public void setBlockBoundsForItemRender() { @Override public int getRenderType() { - return ModBlocks.CAMOUFLAGE_RENDER_ID; + return 3; } @Override @@ -118,28 +115,15 @@ public boolean isOpaqueCube() { return false; } - @SideOnly(Side.CLIENT) @Override - public final IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntityCamouflage te = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, world, x, y, z); - - if (te != null) { - IIcon icon = te.getIconWithDefault(world, x, y, z, this, side, false); - - if (icon != null) { - return icon; - } - } - - return getDefaultIcon(side, world.getBlockMetadata(x, y, z), 0); - } - - - @Override - public boolean renderAsNormalBlock() { + public boolean isFullCube() { return false; } @SideOnly(Side.CLIENT) - protected abstract IIcon getDefaultIcon(int side, int blockMeta, int camoMeta); + public EnumWorldBlockLayer getBlockLayer() + { + return EnumWorldBlockLayer.TRANSLUCENT; + } + } diff --git a/src/main/java/vswe/stevesfactory/blocks/BlockManager.java b/src/main/java/vswe/stevesfactory/blocks/BlockManager.java index fe88ccbb7..7cac631ed 100644 --- a/src/main/java/vswe/stevesfactory/blocks/BlockManager.java +++ b/src/main/java/vswe/stevesfactory/blocks/BlockManager.java @@ -1,21 +1,23 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.internal.FMLNetworkHandler; import vswe.stevesfactory.GeneratedInfo; import vswe.stevesfactory.StevesFactoryManager; @@ -23,79 +25,72 @@ public class BlockManager extends BlockContainer { public BlockManager() { super(Material.iron); - setBlockName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.MANAGER_UNLOCALIZED_NAME); + setUnlocalizedName(StevesFactoryManager.UNLOCALIZED_START + ModBlocks.MANAGER_UNLOCALIZED_NAME); setStepSound(soundTypeMetal); setCreativeTab(ModBlocks.creativeTab); setHardness(2F); } + public static final IProperty LIMITLESS = PropertyBool.create("limitless"); @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileEntityManager(); + protected BlockState createBlockState() { + return new BlockState(this, LIMITLESS); } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xSide, float ySide, float zSide) { - if (!world.isRemote) { - FMLNetworkHandler.openGui(player, StevesFactoryManager.instance, 0, world, x, y, z); - } + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(LIMITLESS, meta == 1); + } - return true; + @Override + public int getMetaFromState(IBlockState state) { + return (Boolean) state.getValue(LIMITLESS) ? 1 : 0; } - @SideOnly(Side.CLIENT) - private IIcon sideIcon; - @SideOnly(Side.CLIENT) - private IIcon topIcon; - @SideOnly(Side.CLIENT) - private IIcon botIcon; - @SideOnly(Side.CLIENT) @Override - public void registerBlockIcons(IIconRegister register) { - sideIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":manager_side"); - topIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":manager_top"); - botIcon = register.registerIcon(StevesFactoryManager.RESOURCE_LOCATION + ":manager_bot"); + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityManager(); } - @SideOnly(Side.CLIENT) @Override - public IIcon getIcon(int side, int meta) { - if (side == 0) { - return botIcon; - }else if(side == 1) { - return topIcon; - }else{ - return sideIcon; + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float xSide, float ySide, float zSide) { + if (!world.isRemote) { + FMLNetworkHandler.openGui(player, StevesFactoryManager.instance, 0, world, pos.getX(), pos.getY(), pos.getZ()); } + + return true; } @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); + public void onBlockAdded(World world, BlockPos pos, IBlockState state) { + super.onBlockAdded(world, pos, state); - updateInventories(world, x, y, z); + updateInventories(world, pos); } @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - super.onNeighborBlockChange(world, x, y, z, block); + public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block block) { + super.onNeighborBlockChange(world, pos, state, block); - updateInventories(world, x, y, z); + updateInventories(world, pos); } - + @Override + public int getRenderType() { + return 3; + } @Override - public void breakBlock(World world, int x, int y, int z, Block block, int meta) { - super.breakBlock(world, x, y, z, block, meta); + public void breakBlock(World world, BlockPos pos, IBlockState state) { + super.breakBlock(world, pos, state); - updateInventories(world, x, y, z); + updateInventories(world, pos); } - private void updateInventories(World world, int x, int y, int z) { - TileEntity tileEntity = world.getTileEntity(x, y, z); + private void updateInventories(World world, BlockPos pos) { + TileEntity tileEntity = world.getTileEntity(pos); if (tileEntity != null && tileEntity instanceof TileEntityManager) { ((TileEntityManager)tileEntity).updateInventories(); } @@ -103,18 +98,18 @@ private void updateInventories(World world, int x, int y, int z) { @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { + public ItemStack getPickBlock(MovingObjectPosition target, World world, BlockPos pos, EntityPlayer player) { if (GeneratedInfo.inDev) { System.out.println("Picked" + world.isRemote); - TileEntity te = world.getTileEntity(x, y, z); + TileEntity te = world.getTileEntity(pos); if (te != null && te instanceof TileEntityManager) { TileEntityManager manager = (TileEntityManager)te; - if (manager.xCoord != x || manager.yCoord != y || manager.zCoord != z) { + if (manager.getPos().getX() != pos.getX() || manager.getPos().getY() != pos.getY() || manager.getPos().getZ() != pos.getZ()) { return null; } - ItemStack itemStack = super.getPickBlock(target, world, x, y, z); + ItemStack itemStack = super.getPickBlock(target, world, pos, player); if (itemStack != null) { NBTTagCompound tagCompound = itemStack.getTagCompound(); if (tagCompound == null) { @@ -134,16 +129,16 @@ public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, i System.out.println("failed to write"); return null; }else{ - return super.getPickBlock(target, world, x, y, z); + return super.getPickBlock(target, world, pos, player); } } @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) { + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack itemStack) { if (GeneratedInfo.inDev) { System.out.println("Placed" + world.isRemote); - TileEntity te = world.getTileEntity(x, y, z); + TileEntity te = world.getTileEntity(pos); if (te != null && te instanceof TileEntityManager) { TileEntityManager manager = (TileEntityManager)te; if (itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey("Manager")) { @@ -154,7 +149,7 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase e } } }else{ - super.onBlockPlacedBy(world, x, y, z, entity, itemStack); + super.onBlockPlacedBy(world, pos, state, entity, itemStack); } } diff --git a/src/main/java/vswe/stevesfactory/blocks/ClusterRecipe.java b/src/main/java/vswe/stevesfactory/blocks/ClusterRecipe.java index ddb9906b3..cb0dd3f6e 100644 --- a/src/main/java/vswe/stevesfactory/blocks/ClusterRecipe.java +++ b/src/main/java/vswe/stevesfactory/blocks/ClusterRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import net.minecraftforge.oredict.RecipeSorter; import java.util.ArrayList; import java.util.List; @@ -15,6 +16,10 @@ public class ClusterRecipe implements IRecipe { private ItemStack output; + public ClusterRecipe() { + RecipeSorter.register("sfm:clustercombining", ClusterRecipe.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); + } + @Override public boolean matches(InventoryCrafting inventorycrafting, World world) { output = null; @@ -102,4 +107,17 @@ public int getRecipeSize() { public ItemStack getRecipeOutput() { return output; } + + @Override + public ItemStack[] getRemainingItems(InventoryCrafting p_179532_1_) { + ItemStack[] aitemstack = new ItemStack[p_179532_1_.getSizeInventory()]; + + for (int i = 0; i < aitemstack.length; ++i) + { + ItemStack itemstack = p_179532_1_.getStackInSlot(i); + aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack); + } + + return aitemstack; + } } diff --git a/src/main/java/vswe/stevesfactory/blocks/ConnectionBlock.java b/src/main/java/vswe/stevesfactory/blocks/ConnectionBlock.java index 4e071f80b..34fcec913 100644 --- a/src/main/java/vswe/stevesfactory/blocks/ConnectionBlock.java +++ b/src/main/java/vswe/stevesfactory/blocks/ConnectionBlock.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.components.ComponentMenuContainer; import vswe.stevesfactory.components.IContainerSelection; @@ -71,7 +71,7 @@ public String getDescription(GuiManager gui) { str += getVariableTag(gui); - str += "\n" + Localization.X + ": " + tileEntity.xCoord + " " + Localization.Y + ": " + tileEntity.yCoord + " " + Localization.Z + ": " + tileEntity.zCoord; + str += "\n" + Localization.X + ": " + tileEntity.getPos().getX() + " " + Localization.Y + ": " + tileEntity.getPos().getY() + " " + Localization.Z + ": " + tileEntity.getPos().getZ(); int distance = getDistance(gui.getManager()); str += "\n" + distance + " " + (distance > 1 ? Localization.BLOCKS_AWAY : Localization.BLOCK_AWAY); str += "\n" + cableDistance + " " + (cableDistance > 1 ? Localization.CABLES_AWAY : Localization.CABLE_AWAY); @@ -81,7 +81,7 @@ public String getDescription(GuiManager gui) { public int getDistance(TileEntityManager manager) { - return (int)Math.round(Math.sqrt(manager.getDistanceFrom(tileEntity.xCoord + 0.5, tileEntity.yCoord + 0.5, tileEntity.zCoord + 0.5))); + return (int)Math.round(Math.sqrt(manager.getDistanceSq(tileEntity.getPos().getX() + 0.5, tileEntity.getPos().getY() + 0.5, tileEntity.getPos().getZ() + 0.5))); } public int getCableDistance() { diff --git a/src/main/java/vswe/stevesfactory/blocks/ITileEntityInterface.java b/src/main/java/vswe/stevesfactory/blocks/ITileEntityInterface.java index 0081f8b71..455f411a3 100644 --- a/src/main/java/vswe/stevesfactory/blocks/ITileEntityInterface.java +++ b/src/main/java/vswe/stevesfactory/blocks/ITileEntityInterface.java @@ -1,12 +1,12 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.network.DataReader; import vswe.stevesfactory.network.DataWriter; diff --git a/src/main/java/vswe/stevesfactory/blocks/ItemCluster.java b/src/main/java/vswe/stevesfactory/blocks/ItemCluster.java index 6f3c48781..cd74e1f9a 100644 --- a/src/main/java/vswe/stevesfactory/blocks/ItemCluster.java +++ b/src/main/java/vswe/stevesfactory/blocks/ItemCluster.java @@ -6,6 +6,8 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import vswe.stevesfactory.Localization; import vswe.stevesfactory.StevesFactoryManager; @@ -25,12 +27,12 @@ public ItemCluster(Block block) { public static final String NBT_TYPES = "Types"; @Override - public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + public boolean onItemUse(ItemStack item, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ) { NBTTagCompound compound = item.getTagCompound(); if (compound != null && compound.hasKey(NBT_CABLE)) { NBTTagCompound cable = compound.getCompoundTag(NBT_CABLE); if (cable.hasKey(NBT_TYPES)) { - return super.onItemUse(item, player, world, x, y, z, side, hitX, hitY, hitZ); + return super.onItemUse(item, player, world, pos, side, hitX, hitY, hitZ); } } diff --git a/src/main/java/vswe/stevesfactory/blocks/ModBlocks.java b/src/main/java/vswe/stevesfactory/blocks/ModBlocks.java index 6f86d390b..4a799b764 100644 --- a/src/main/java/vswe/stevesfactory/blocks/ModBlocks.java +++ b/src/main/java/vswe/stevesfactory/blocks/ModBlocks.java @@ -1,16 +1,16 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.registry.GameRegistry; public final class ModBlocks { - public static final byte NBT_CURRENT_PROTOCOL_VERSION = 12; + public static final byte NBT_CURRENT_PROTOCOL_VERSION = 13; public static final String NBT_PROTOCOL_VERSION = "ProtocolVersion"; private static final String MANAGER_TILE_ENTITY_TAG = "TileEntityMachineManagerName"; @@ -58,7 +58,6 @@ public final class ModBlocks { private static final String CABLE_CAMOUFLAGE_TILE_ENTITY_TAG = "TileEntityCableCamouflageName"; public static final String CABLE_CAMOUFLAGE_NAME_TAG = "BlockCableCamouflageName"; - public static int CAMOUFLAGE_RENDER_ID; private static final String CABLE_SIGN_TILE_ENTITY_TAG = "TileEntityCableSignName"; public static final String CABLE_SIGN_NAME_TAG = "BlockCableSignName"; diff --git a/src/main/java/vswe/stevesfactory/blocks/PropertyCamouflageType.java b/src/main/java/vswe/stevesfactory/blocks/PropertyCamouflageType.java new file mode 100644 index 000000000..ccf02e26e --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/PropertyCamouflageType.java @@ -0,0 +1,46 @@ +package vswe.stevesfactory.blocks; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; +import net.minecraft.block.properties.PropertyEnum; + +import java.util.Collection; + +public class PropertyCamouflageType extends PropertyEnum { + + protected PropertyCamouflageType(String name, Collection allowedValues) { + super(name, TileEntityCamouflage.CamouflageType.class, allowedValues); + } + + /** + * Create a new PropertyDirection with the given name + */ + public static PropertyCamouflageType create(String name) + { + /** + * Create a new PropertyDirection with all directions that match the given Predicate + */ + return create(name, Predicates.alwaysTrue()); + } + + /** + * Create a new PropertyDirection with all directions that match the given Predicate + */ + public static PropertyCamouflageType create(String name, Predicate filter) + { + /** + * Create a new PropertyDirection for the given direction values + */ + return create(name, Collections2.filter(Lists.newArrayList(TileEntityCamouflage.CamouflageType.values()), filter)); + } + + /** + * Create a new PropertyDirection for the given direction values + */ + public static PropertyCamouflageType create(String name, Collection values) + { + return new PropertyCamouflageType(name, values); + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/RenderCamouflage.java b/src/main/java/vswe/stevesfactory/blocks/RenderCamouflage.java index 4e12cf056..6da324a07 100644 --- a/src/main/java/vswe/stevesfactory/blocks/RenderCamouflage.java +++ b/src/main/java/vswe/stevesfactory/blocks/RenderCamouflage.java @@ -1,9 +1,10 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +/* +import net.minecraftforge.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; @@ -126,3 +127,4 @@ public int getRenderId() { } +*/ \ No newline at end of file diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityBUD.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityBUD.java index 86dfe0a97..d8614ca59 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityBUD.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityBUD.java @@ -1,9 +1,11 @@ package vswe.stevesfactory.blocks; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import java.util.ArrayList; import java.util.EnumSet; @@ -12,8 +14,8 @@ public class TileEntityBUD extends TileEntityClusterElement implements ISystemListener, ITriggerNode{ private List managerList = new ArrayList(); - private int[] oldData = new int[ForgeDirection.VALID_DIRECTIONS.length]; - private int[] data = new int[ForgeDirection.VALID_DIRECTIONS.length]; + private int[] oldData = new int[EnumFacing.values().length]; + private int[] data = new int[EnumFacing.values().length]; @Override public void added(TileEntityManager owner) { @@ -54,12 +56,14 @@ public void updateData() { if (worldObj != null) { data = new int[data.length]; for (int i = 0; i < data.length; i++) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[i]; - int x = direction.offsetX + this.xCoord; - int y = direction.offsetY + this.yCoord; - int z = direction.offsetZ + this.zCoord; + EnumFacing direction = EnumFacing.getFront(i); + int x = direction.getFrontOffsetX() + this.getPos().getX(); + int y = direction.getFrontOffsetY() + this.getPos().getY(); + int z = direction.getFrontOffsetZ() + this.getPos().getZ(); - data[i] = (Block.getIdFromBlock(worldObj.getBlock(x, y, z)) << 4) | (worldObj.getBlockMetadata(x, y, z) & 15); + IBlockState state = worldObj.getBlockState(new BlockPos(x, y, z)); + + data[i] = (Block.getIdFromBlock(state.getBlock()) << 4) | (state.getBlock().getMetaFromState(state) & 15); } } } diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityBreaker.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityBreaker.java index ac5ebf61d..e7ee66f7f 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityBreaker.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityBreaker.java @@ -2,9 +2,8 @@ import com.mojang.authlib.GameProfile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -14,9 +13,14 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.FakePlayerFactory; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.network.*; import java.util.ArrayList; @@ -31,20 +35,21 @@ public class TileEntityBreaker extends TileEntityClusterElement implements IInve private List inventory; private List inventoryCache; private boolean broken; - private int placeDirection; + private EnumFacing placeDirection; private boolean blocked; private List getInventory() { if (inventory == null) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length]; - - int x = xCoord + direction.offsetX; - int y = yCoord + direction.offsetY; - int z = zCoord + direction.offsetZ; - Block block = worldObj.getBlock(x, y, z); - if (canBreakBlock(block, x, y, z)) { - inventory = block.getDrops(worldObj, x, y, z, worldObj.getBlockMetadata(x, y, z), 0); + EnumFacing direction = EnumFacing.getFront(getBlockMetadata() % EnumFacing.values().length); + + int x = getPos().getX() + direction.getFrontOffsetX(); + int y = getPos().getY() + direction.getFrontOffsetY(); + int z = getPos().getZ() + direction.getFrontOffsetZ(); + BlockPos pos = new BlockPos(x, y, z); + IBlockState state = worldObj.getBlockState(pos); + if (canBreakBlock(state.getBlock(), pos)) { + inventory = state.getBlock().getDrops(worldObj, pos, state, 0); } if (inventory == null) { inventory = new ArrayList(); @@ -62,39 +67,36 @@ private List placeItem(ItemStack itemstack) { List items = new ArrayList(); if (itemstack != null && itemstack.getItem() != null && itemstack.stackSize > 0) { - ForgeDirection side = ForgeDirection.VALID_DIRECTIONS[getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length]; - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[placeDirection].getOpposite(); + EnumFacing side = EnumFacing.getFront(getBlockMetadata() % EnumFacing.values().length); + EnumFacing direction = placeDirection.getOpposite(); - - - float hitX = 0.5F + direction.offsetX * 0.5F; - float hitY = 0.5F + direction.offsetY * 0.5F; - float hitZ = 0.5F + direction.offsetZ * 0.5F; + float hitX = 0.5F + direction.getFrontOffsetX() * 0.5F; + float hitY = 0.5F + direction.getFrontOffsetY() * 0.5F; + float hitZ = 0.5F + direction.getFrontOffsetZ() * 0.5F; EntityPlayerMP player = FakePlayerFactory.get((WorldServer) worldObj, new GameProfile(FAKE_PLAYER_ID, FAKE_PLAYER_NAME)); int rotationSide = ROTATION_SIDE_MAPPING[direction.ordinal()]; player.prevRotationPitch = player.rotationYaw = rotationSide * 90; - player.prevRotationYaw = player.rotationPitch = direction == ForgeDirection.UP ? 90 : direction == ForgeDirection.DOWN ? -90 : 0; - player.prevPosX = player.posX = xCoord + side.offsetX + 0.5 + direction.offsetX * 0.4; - player.prevPosY = player.posY = yCoord + side.offsetY + 0.5 + direction.offsetY * 0.4; - player.prevPosZ = player.posZ = zCoord + side.offsetZ + 0.5 + direction.offsetZ * 0.4; + player.prevRotationYaw = player.rotationPitch = direction == EnumFacing.UP ? 90 : direction == EnumFacing.DOWN ? -90 : 0; + player.prevPosX = player.posX = getPos().getX() + side.getFrontOffsetX() + 0.5 + direction.getFrontOffsetX() * 0.4; + player.prevPosY = player.posY = getPos().getY() + side.getFrontOffsetY() + 0.5 + direction.getFrontOffsetY() * 0.4; + player.prevPosZ = player.posZ = getPos().getZ() + side.getFrontOffsetZ() + 0.5 + direction.getFrontOffsetZ() * 0.4; player.eyeHeight = 0; - player.yOffset = 1.82F; player.theItemInWorldManager.setBlockReachDistance(1); blocked = true; try { - player.inventory.clearInventory(null, -1); + player.inventory.clear(); player.inventory.currentItem = 0; player.inventory.setInventorySlotContents(0, itemstack); ItemStack result = itemstack.useItemRightClick(worldObj, player); if (ItemStack.areItemStacksEqual(result, itemstack)) { - int x = xCoord + side.offsetX - direction.offsetX; - int y = yCoord + side.offsetY - direction.offsetY; - int z = zCoord + side.offsetZ - direction.offsetZ; + int x = getPos().getX() + side.getFrontOffsetX() - direction.getFrontOffsetX(); + int y = getPos().getY() + side.getFrontOffsetY() - direction.getFrontOffsetY(); + int z = getPos().getZ() + side.getFrontOffsetZ() - direction.getFrontOffsetZ(); - player.theItemInWorldManager.activateBlockOrUseItem(player, worldObj, itemstack, x, y, z, direction.ordinal(), hitX, hitY, hitZ); + player.theItemInWorldManager.activateBlockOrUseItem(player, worldObj, itemstack, new BlockPos(x, y, z), direction, hitX, hitY, hitZ); }else{ player.inventory.setInventorySlotContents(0, result); @@ -116,9 +118,9 @@ private List placeItem(ItemStack itemstack) { } @Override - public void updateEntity() { + public void update() { if (missingPlaceDirection) { - setPlaceDirection(getBlockMetadata()); + setPlaceDirection(EnumFacing.getFront(getBlockMetadata())); missingPlaceDirection = false; } if (worldObj.isRemote) { @@ -126,29 +128,28 @@ public void updateEntity() { } if (inventory != null) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length]; - + EnumFacing direction = EnumFacing.getFront(getBlockMetadata() % EnumFacing.values().length); for (ItemStack itemStack : getInventoryForDrop()) { List items = placeItem(itemStack); if (items != null && !items.isEmpty()) { for (ItemStack item : items) { - double x = xCoord + 0.5 + direction.offsetX * 0.75; - double y = yCoord + 0.5 + direction.offsetY * 0.75; - double z = zCoord + 0.5 + direction.offsetZ * 0.75; + double x = getPos().getX() + 0.5 + direction.getFrontOffsetX() * 0.75; + double y = getPos().getY() + 0.5 + direction.getFrontOffsetY() * 0.75; + double z = getPos().getZ() + 0.5 + direction.getFrontOffsetZ() * 0.75; - if (direction.offsetY == 0) { + if (direction.getFrontOffsetY() == 0) { y -= 0.1; } EntityItem entityitem = new EntityItem(worldObj, x, y, z, item); - entityitem.motionX = direction.offsetX * 0.1; - entityitem.motionY = direction.offsetY * 0.1; - entityitem.motionZ = direction.offsetZ * 0.1; + entityitem.motionX = direction.getFrontOffsetX() * 0.1; + entityitem.motionY = direction.getFrontOffsetY() * 0.1; + entityitem.motionZ = direction.getFrontOffsetZ() * 0.1; - entityitem.delayBeforeCanPickup = 40; + entityitem.setPickupDelay(40); worldObj.spawnEntityInWorld(entityitem); } } @@ -247,21 +248,26 @@ public void setInventorySlotContents(int id, ItemStack itemstack) { } @Override - public ItemStack getStackInSlotOnClosing(int i) { + public ItemStack removeStackFromSlot(int i) { return null; } @Override - public String getInventoryName() { + public String getName() { return ModBlocks.blockCableBreaker.getLocalizedName(); } @Override - public boolean hasCustomInventoryName() { + public boolean hasCustomName() { return true; } + @Override + public IChatComponent getDisplayName() { + return new ChatComponentText(ModBlocks.blockCableBreaker.getLocalizedName()); + } + @Override public int getInventoryStackLimit() { return 64; @@ -273,12 +279,12 @@ public boolean isUseableByPlayer(EntityPlayer entityplayer) { } @Override - public void openInventory() { + public void openInventory(EntityPlayer player) { } @Override - public void closeInventory() { + public void closeInventory(EntityPlayer player) { } @@ -287,6 +293,26 @@ public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } + @Override + public int getField(int id) { + return 0; + } + + @Override + public void setField(int id, int value) { + + } + + @Override + public int getFieldCount() { + return 0; + } + + @Override + public void clear() { + + } + @Override public void markDirty() { super.markDirty(); @@ -304,29 +330,31 @@ public void markDirty() { } if (!match) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length]; + EnumFacing direction = EnumFacing.getFront(getBlockMetadata() % EnumFacing.values().length); - int x = xCoord + direction.offsetX; - int y = yCoord + direction.offsetY; - int z = zCoord + direction.offsetZ; + int x = getPos().getX() + direction.getFrontOffsetX(); + int y = getPos().getY() + direction.getFrontOffsetY(); + int z = getPos().getZ() + direction.getFrontOffsetZ(); - Block block = worldObj.getBlock(x, y, z); + BlockPos pos = new BlockPos(x, y, z); + IBlockState state = worldObj.getBlockState(pos); + Block block = state.getBlock(); - if (canBreakBlock(block, x, y, z)) { + if (canBreakBlock(block, pos)) { broken = true; - int meta = worldObj.getBlockMetadata(x, y, z); - block.breakBlock(worldObj, x, y, z, block, meta); - worldObj.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (meta << 12)); - worldObj.setBlockToAir(x, y, z); + int meta = state.getBlock().getMetaFromState(state); + block.breakBlock(worldObj, pos, state); + worldObj.playAuxSFX(2001, pos, Block.getIdFromBlock(block) + (meta << 12)); + worldObj.setBlockToAir(pos); } } } } - private boolean canBreakBlock(Block block, int x, int y, int z) { - return block != null && Block.getIdFromBlock(block) != Block.getIdFromBlock(Blocks.bedrock) && block.getBlockHardness(worldObj, x, y, z) >= 0; + private boolean canBreakBlock(Block block, BlockPos pos) { + return block != null && Block.getIdFromBlock(block) != Block.getIdFromBlock(Blocks.bedrock) && block.getBlockHardness(worldObj, pos) >= 0; } @Override @@ -340,10 +368,10 @@ protected EnumSet getRegistrations() { @Override protected void readContentFromNBT(NBTTagCompound tagCompound) { if (tagCompound.hasKey(NBT_DIRECTION)) { - setPlaceDirection(tagCompound.getByte(NBT_DIRECTION)); + setPlaceDirection(EnumFacing.getFront(tagCompound.getByte(NBT_DIRECTION))); }else{ if (worldObj != null) { - setPlaceDirection(getBlockMetadata()); + setPlaceDirection(EnumFacing.getFront(getBlockMetadata())); }else{ missingPlaceDirection = true; } @@ -352,7 +380,7 @@ protected void readContentFromNBT(NBTTagCompound tagCompound) { @Override protected void writeContentToNBT(NBTTagCompound tagCompound) { - tagCompound.setByte(NBT_DIRECTION, (byte)placeDirection); + tagCompound.setByte(NBT_DIRECTION, (byte) (placeDirection != null ? placeDirection.getIndex() : 0)); } private static final int UPDATE_BUFFER_DISTANCE = 5; @@ -364,7 +392,7 @@ private void keepClientDataUpdated() { return; } - double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); + double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(getPos().getX() + 0.5, getPos().getY() + 0.5, getPos().getZ() + 0.5); if (distance > Math.pow(PacketHandler.BLOCK_UPDATE_RANGE, 2)) { hasUpdatedData = false; @@ -377,7 +405,8 @@ private void keepClientDataUpdated() { @Override public void writeData(DataWriter dw, EntityPlayer player, boolean onServer, int id) { if (onServer) { - dw.writeData(placeDirection, DataBitHelper.PLACE_DIRECTION); + if (placeDirection == null) placeDirection = BlockCableBreaker.getSide(getBlockMetadata()); //might be a cheap fix, but seams to some kind of sync bug between threads or something + dw.writeData(placeDirection.getIndex(), DataBitHelper.PLACE_DIRECTION); }else{ //nothing to write, empty packet } @@ -389,8 +418,10 @@ public void readData(DataReader dr, EntityPlayer player, boolean onServer, int i //respond by sending the data to the client that required it PacketHandler.sendBlockPacket(this, player, 0); }else{ - placeDirection = dr.readData(DataBitHelper.PLACE_DIRECTION); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + int val = dr.readData(DataBitHelper.PLACE_DIRECTION); + setPlaceDirection(EnumFacing.getFront(val)); + worldObj.markBlockForUpdate(getPos()); + markDirty(); } } @@ -399,13 +430,14 @@ public int infoBitLength(boolean onServer) { return 0; } - public int getPlaceDirection() { + public EnumFacing getPlaceDirection() { return placeDirection; } - public void setPlaceDirection(int placeDirection) { + public void setPlaceDirection(EnumFacing placeDirection) { if (this.placeDirection != placeDirection) { this.placeDirection = placeDirection; + this.markDirty(); if (!isPartOfCluster() && worldObj != null && !worldObj.isRemote) { PacketHandler.sendBlockPacket(this, null, 0); diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityCamouflage.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityCamouflage.java index 21d762cf2..5b2b3744a 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityCamouflage.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityCamouflage.java @@ -1,7 +1,5 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.EffectRenderer; @@ -11,9 +9,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IStringSerializable; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.components.ComponentMenuCamouflageInside; import vswe.stevesfactory.components.ComponentMenuCamouflageShape; import vswe.stevesfactory.network.*; @@ -42,40 +42,40 @@ public boolean isNormalBlock() { private static final Random rand = new Random(); @SideOnly(Side.CLIENT) - public boolean addBlockEffect(Block camoBlock, int sideHit, EffectRenderer effectRenderer) { + public boolean addBlockEffect(Block camoBlock, EnumFacing sideHit, EffectRenderer effectRenderer) { try { - if (ids[sideHit] != 0) { - Block block = Block.getBlockById(ids[sideHit]); + if (ids[sideHit.ordinal()] != 0) { + Block block = Block.getBlockById(ids[sideHit.ordinal()]); if (block != null) { float f = 0.1F; - double x = (double)xCoord + rand.nextDouble() * (camoBlock.getBlockBoundsMaxX() - camoBlock.getBlockBoundsMinX() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinX(); - double y = (double)yCoord + rand.nextDouble() * (camoBlock.getBlockBoundsMaxY() - camoBlock.getBlockBoundsMinY() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinY(); - double z = (double)zCoord + rand.nextDouble() * (camoBlock.getBlockBoundsMaxZ() - camoBlock.getBlockBoundsMinZ() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinZ(); + double x = (double)getPos().getX() + rand.nextDouble() * (camoBlock.getBlockBoundsMaxX() - camoBlock.getBlockBoundsMinX() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinX(); + double y = (double)getPos().getY() + rand.nextDouble() * (camoBlock.getBlockBoundsMaxY() - camoBlock.getBlockBoundsMinY() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinY(); + double z = (double)getPos().getZ() + rand.nextDouble() * (camoBlock.getBlockBoundsMaxZ() - camoBlock.getBlockBoundsMinZ() - (double)(f * 2.0F)) + (double)f + camoBlock.getBlockBoundsMinZ(); switch (sideHit) { - case 0: - y = (double)yCoord + camoBlock.getBlockBoundsMinY() - (double)f; + case DOWN: + y = (double)getPos().getY() + camoBlock.getBlockBoundsMinY() - (double)f; break; - case 1: - y = (double)yCoord + camoBlock.getBlockBoundsMaxY() + (double)f; + case UP: + y = (double)getPos().getY() + camoBlock.getBlockBoundsMaxY() + (double)f; break; - case 2: - z = (double)zCoord + camoBlock.getBlockBoundsMinZ() - (double)f; + case NORTH: + z = (double)getPos().getZ() + camoBlock.getBlockBoundsMinZ() - (double)f; break; - case 3: - z = (double)zCoord + camoBlock.getBlockBoundsMaxZ() + (double)f; + case SOUTH: + z = (double)getPos().getZ() + camoBlock.getBlockBoundsMaxZ() + (double)f; break; - case 4: - x = (double)xCoord + camoBlock.getBlockBoundsMinX() - (double)f; + case WEST: + x = (double)getPos().getX() + camoBlock.getBlockBoundsMinX() - (double)f; break; - case 5: - x = (double)xCoord + camoBlock.getBlockBoundsMaxX() + (double)f; + case EAST: + x = (double)getPos().getX() + camoBlock.getBlockBoundsMaxX() + (double)f; break; } - effectRenderer.addEffect((new EntityDiggingFX(this.worldObj, x, y, z, 0.0D, 0.0D, 0.0D, block, metas[sideHit])).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F)); + effectRenderer.addEffect((new EntityDiggingFX.Factory().getEntityFX(0, this.worldObj, x, y, z, 0.0D, 0.0D, 0.0D, Block.getIdFromBlock(camoBlock))).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F)); return true; } } @@ -85,7 +85,7 @@ public boolean addBlockEffect(Block camoBlock, int sideHit, EffectRenderer effec } - public enum CamouflageType { + public enum CamouflageType implements IStringSerializable { NORMAL("BlockCableCamouflage", "cable_camo", false, false), INSIDE("BlockCableInsideCamouflage", "cable_camo_inside", true, false), SHAPE("BlockCableShapeCamouflage", "cable_camo_shape", true, true); @@ -107,7 +107,7 @@ public String getUnlocalized() { } public String getIcon() { - return icon; + return "stevesfactorymanager:blocks/" + icon; } public boolean useDoubleRendering() { @@ -117,6 +117,21 @@ public boolean useDoubleRendering() { public boolean useSpecialShape() { return useShape; } + + public static CamouflageType getCamouflageType(int id) { + CamouflageType type = values()[id % values().length]; + return type; + } + + @Override + public String getName() { + return icon; + } + + @Override + public String toString() { + return super.toString().toLowerCase(); + } } public CamouflageType getCamouflageType() { @@ -138,8 +153,8 @@ public boolean isFullCollision() { private boolean useCollision = true; private boolean fullCollision = false; private int[] bounds = {0, 32, 0, 32, 0, 32}; - private int[] ids = new int[ForgeDirection.VALID_DIRECTIONS.length * 2]; - private int[] metas = new int[ForgeDirection.VALID_DIRECTIONS.length * 2]; + private int[] ids = new int[EnumFacing.values().length * 2]; + private int[] metas = new int[EnumFacing.values().length * 2]; public void setBounds(ComponentMenuCamouflageShape menu) { if (getCamouflageType().useSpecialShape() && menu.shouldUpdate()) { @@ -176,17 +191,17 @@ public void setItem(ItemStack item, int side, ComponentMenuCamouflageInside.Insi setItem(item, side); break; case ONLY_INSIDE: - setItemForInside(item, side + ForgeDirection.VALID_DIRECTIONS.length); + setItemForInside(item, side + EnumFacing.values().length); break; case SAME: setItem(item, side); - setItemForInside(item, side + ForgeDirection.VALID_DIRECTIONS.length); + setItemForInside(item, side + EnumFacing.values().length); break; case OPPOSITE: setItem(item, side); int sidePairInternalId = side % 2; int insideSide = side + (sidePairInternalId == 0 ? 1 : -1); - setItemForInside(item, insideSide + ForgeDirection.VALID_DIRECTIONS.length); + setItemForInside(item, insideSide + EnumFacing.values().length); break; default: } @@ -206,7 +221,7 @@ private void setItem(ItemStack item, int side) { ids[side] = 0; metas[side] = 0; }else if(item.getItem() != null && item.getItem() instanceof ItemBlock) { - Block block = ((ItemBlock)item.getItem()).field_150939_a; + Block block = ((ItemBlock)item.getItem()).block; if (block != null) { ids[side] = Block.getIdFromBlock(block); metas[side] = item.getItem().getMetadata(item.getItemDamage()); @@ -315,7 +330,7 @@ public void readData(DataReader dr, EntityPlayer player, boolean onServer, int i } } } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + worldObj.markBlockForUpdate(new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ())); } } @@ -335,7 +350,7 @@ public int infoBitLength(boolean onServer) { private boolean isServerDirty; @Override - public void updateEntity() { + public void update() { if (worldObj.isRemote) { keepClientDataUpdated(); }else{ @@ -348,7 +363,7 @@ public void updateEntity() { @SideOnly(Side.CLIENT) private void keepClientDataUpdated() { - double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); + double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(getPos().getX() + 0.5, getPos().getY() + 0.5, getPos().getZ() + 0.5); if (distance > Math.pow(PacketHandler.BLOCK_UPDATE_RANGE, 2)) { hasClientUpdatedData = false; @@ -422,31 +437,4 @@ protected void readContentFromNBT(NBTTagCompound tagCompound) { } } - @SideOnly(Side.CLIENT) - private IIcon getIcon(int side, boolean inside) { - if (inside) { - side += ForgeDirection.VALID_DIRECTIONS.length; - } - - Block block = Block.getBlockById(ids[side]); - if (block != null) { - try { - IIcon icon = block.getIcon(side, metas[side]); - if (icon != null) { - return icon; - } - }catch (Exception ignored) {} - } - return null; - } - - @SideOnly(Side.CLIENT) - public IIcon getIconWithDefault(IBlockAccess world, int x, int y, int z, BlockCamouflageBase block, int side, boolean inside) { - IIcon icon = getIcon(side, inside); - if (icon == null) { - icon = block.getDefaultIcon(side, world.getBlockMetadata(x, y, z), getBlockMetadata()); //here we actually want to fetch the meta data of the block, rather then getting the tile entity version - } - - return icon; - } } diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityCluster.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityCluster.java index 0660df9a6..62723661b 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityCluster.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityCluster.java @@ -1,9 +1,8 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.EntityLivingBase; @@ -14,7 +13,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ITickable; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.network.*; import java.util.ArrayList; @@ -22,7 +26,7 @@ import java.util.List; import java.util.Map; -public class TileEntityCluster extends TileEntity implements ITileEntityInterface, IPacketBlock { +public class TileEntityCluster extends TileEntity implements ITileEntityInterface, IPacketBlock, ITickable { private boolean requestedInfo; private List elements; @@ -57,7 +61,7 @@ private void loadElements(byte[] types) { for (byte type : types) { ClusterRegistry block = ClusterRegistry.getRegistryList().get(type); registryList.add(block); - TileEntityClusterElement element = (TileEntityClusterElement)block.getBlock().createNewTileEntity(getWorldObj(), 0); + TileEntityClusterElement element = (TileEntityClusterElement)block.getBlock().createNewTileEntity(getWorld(), 0); elements.add(element); if (element instanceof ITileEntityInterface) { interfaceObject = (ITileEntityInterface)element; @@ -67,9 +71,7 @@ private void loadElements(byte[] types) { for (ClusterMethodRegistration clusterMethodRegistration : element.getRegistrations()) { methodRegistration.get(clusterMethodRegistration).add(new Pair(block, element)); } - element.xCoord = xCoord; - element.yCoord = yCoord; - element.zCoord = zCoord; + element.setPos(new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ())); element.setWorldObj(worldObj); element.setPartOfCluster(true); } @@ -91,10 +93,10 @@ public List getElements() { @Override - public void updateEntity() { + public void update() { for (TileEntityClusterElement element : elements) { setWorldObject(element); - element.updateEntity(); + element.update(); } if (!requestedInfo && worldObj.isRemote) { @@ -118,24 +120,24 @@ private List getRegistrations(ClusterMethodRegistration method) { return methodRegistration.get(method); } - public void onBlockPlacedBy(EntityLivingBase entity, ItemStack itemStack) { + public void onBlockPlacedBy(IBlockState state, EntityLivingBase entity, ItemStack itemStack) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.ON_BLOCK_PLACED_BY)) { setWorldObject(blockContainer.te); - blockContainer.registry.getBlock().onBlockPlacedBy(worldObj, xCoord, yCoord, zCoord, entity, blockContainer.registry.getItemStack()); + blockContainer.registry.getBlock().onBlockPlacedBy(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state, entity, blockContainer.registry.getItemStack()); } } - public void onNeighborBlockChange(Block block) { + public void onNeighborBlockChange(Block block, IBlockState state) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.ON_NEIGHBOR_BLOCK_CHANGED)) { setWorldObject(blockContainer.te); - blockContainer.registry.getBlock().onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, block); + blockContainer.registry.getBlock().onNeighborBlockChange(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state, block); } } - public boolean canConnectRedstone(int side) { + public boolean canConnectRedstone(EnumFacing side) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.CAN_CONNECT_REDSTONE)) { setWorldObject(blockContainer.te); - if (blockContainer.registry.getBlock().canConnectRedstone(worldObj, xCoord, yCoord, zCoord, side)) { + if (blockContainer.registry.getBlock().canConnectRedstone(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), side)) { return true; } } @@ -143,17 +145,17 @@ public boolean canConnectRedstone(int side) { return false; } - public void onBlockAdded() { + public void onBlockAdded(IBlockState state) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.ON_BLOCK_ADDED)) { setWorldObject(blockContainer.te); - blockContainer.registry.getBlock().onBlockAdded(worldObj, xCoord, yCoord, zCoord); + blockContainer.registry.getBlock().onBlockAdded(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state); } } - public boolean shouldCheckWeakPower(int side) { + public boolean shouldCheckWeakPower(EnumFacing side) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.SHOULD_CHECK_WEAK_POWER)) { setWorldObject(blockContainer.te); - if (blockContainer.registry.getBlock().shouldCheckWeakPower(worldObj, xCoord, yCoord, zCoord, side)) { + if (blockContainer.registry.getBlock().shouldCheckWeakPower(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), side)) { return true; } } @@ -162,32 +164,32 @@ public boolean shouldCheckWeakPower(int side) { } - public int isProvidingWeakPower(int side) { + public int isProvidingWeakPower(IBlockState state, EnumFacing side) { int max = 0; for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.IS_PROVIDING_WEAK_POWER)) { setWorldObject(blockContainer.te); - max = Math.max(max, blockContainer.registry.getBlock().isProvidingWeakPower(worldObj, xCoord, yCoord, zCoord, side)); + max = Math.max(max, blockContainer.registry.getBlock().getStrongPower(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state, side)); } return max; } - public int isProvidingStrongPower(int side) { + public int isProvidingStrongPower(IBlockState state, EnumFacing side) { int max = 0; for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.IS_PROVIDING_STRONG_POWER)) { setWorldObject(blockContainer.te); - max = Math.max(max, blockContainer.registry.getBlock().isProvidingStrongPower(worldObj, xCoord, yCoord, zCoord, side)); + max = Math.max(max, blockContainer.registry.getBlock().getWeakPower(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state, side)); } return max; } - public boolean onBlockActivated(EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivated(EntityPlayer player, IBlockState state, EnumFacing side, float hitX, float hitY, float hitZ) { for (Pair blockContainer : getRegistrations(ClusterMethodRegistration.ON_BLOCK_ACTIVATED)) { setWorldObject(blockContainer.te); - if (blockContainer.registry.getBlock().onBlockActivated(worldObj, xCoord, yCoord, zCoord, player, side, hitX, hitY, hitZ)) { + if (blockContainer.registry.getBlock().onBlockActivated(worldObj, new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ()), state, player, side, hitX, hitY, hitZ)) { return true; } } @@ -196,8 +198,8 @@ public boolean onBlockActivated(EntityPlayer player, int side, float hitX, float } - public static T getTileEntity(Class clazz, IBlockAccess world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); + public static T getTileEntity(Class clazz, IBlockAccess world, BlockPos pos) { + TileEntity te = world.getTileEntity(pos); if (te != null) { if (clazz.isInstance(te)) { diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityClusterElement.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityClusterElement.java index cab1cd855..6d6699ead 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityClusterElement.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityClusterElement.java @@ -1,13 +1,15 @@ package vswe.stevesfactory.blocks; +import net.minecraft.block.state.IBlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ITickable; import java.util.EnumSet; -public abstract class TileEntityClusterElement extends TileEntity { +public abstract class TileEntityClusterElement extends TileEntity implements ITickable { private ClusterRegistry registryElement; private boolean isPartOfCluster; @@ -37,11 +39,19 @@ public int getBlockMetadata() { } } + public void setState(IBlockState state) { + if (isPartOfCluster) { + this.meta = state.getBlock().getMetaFromState(state); + }else{ + worldObj.setBlockState(pos, state, 2); + } + } + public void setMetaData(int meta) { if (isPartOfCluster) { this.meta = meta; }else{ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta, 2); + worldObj.setBlockState(pos, worldObj.getBlockState(pos).getBlock().getStateFromMeta(meta), 2); } } @@ -57,6 +67,11 @@ public final void readFromNBT(NBTTagCompound tagCompound) { readContentFromNBT(tagCompound); } + @Override + public void update() { + + } + protected void readContentFromNBT(NBTTagCompound tagCompound) {} protected void writeContentToNBT(NBTTagCompound tagCompound) {} protected abstract EnumSet getRegistrations(); diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityCreative.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityCreative.java index dc8b9eb7e..8435eefcb 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityCreative.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityCreative.java @@ -3,7 +3,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; @@ -16,32 +17,32 @@ public class TileEntityCreative extends TileEntityClusterElement implements IInv @Override - public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + public int fill(EnumFacing from, FluidStack resource, boolean doFill) { return resource == null ? 0 : resource.amount; } @Override - public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { return resource == null ? null : resource.copy(); } @Override - public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { return null; } @Override - public boolean canFill(ForgeDirection from, Fluid fluid) { + public boolean canFill(EnumFacing from, Fluid fluid) { return true; } @Override - public boolean canDrain(ForgeDirection from, Fluid fluid) { + public boolean canDrain(EnumFacing from, Fluid fluid) { return true; } @Override - public FluidTankInfo[] getTankInfo(ForgeDirection from) { + public FluidTankInfo[] getTankInfo(EnumFacing from) { return new FluidTankInfo[0]; } @@ -61,7 +62,7 @@ public ItemStack decrStackSize(int i, int j) { } @Override - public ItemStack getStackInSlotOnClosing(int i) { + public ItemStack removeStackFromSlot(int i) { return null; } @@ -71,15 +72,20 @@ public void setInventorySlotContents(int i, ItemStack itemstack) { } @Override - public String getInventoryName() { + public String getName() { return ModBlocks.CABLE_CREATIVE_NAME_TAG; } @Override - public boolean hasCustomInventoryName() { + public boolean hasCustomName() { return false; } + @Override + public IChatComponent getDisplayName() { + return null; + } + @Override public int getInventoryStackLimit() { return 64; @@ -91,12 +97,12 @@ public boolean isUseableByPlayer(EntityPlayer entityplayer) { } @Override - public void openInventory() { + public void openInventory(EntityPlayer player) { } @Override - public void closeInventory() { + public void closeInventory(EntityPlayer player) { } @@ -105,8 +111,33 @@ public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } + @Override + public int getField(int id) { + return 0; + } + + @Override + public void setField(int id, int value) { + + } + + @Override + public int getFieldCount() { + return 0; + } + + @Override + public void clear() { + + } + @Override protected EnumSet getRegistrations() { return EnumSet.noneOf(ClusterMethodRegistration.class); } + + @Override + public void update() { + + } } diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityInput.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityInput.java index 6e4f886d5..0661031c6 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityInput.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityInput.java @@ -2,7 +2,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; import java.util.ArrayList; import java.util.EnumSet; @@ -11,8 +12,8 @@ public class TileEntityInput extends TileEntityClusterElement implements IRedstoneNode, ISystemListener, ITriggerNode { private List managerList = new ArrayList(); - private int[] oldPowered = new int[ForgeDirection.VALID_DIRECTIONS.length]; - private int[] isPowered = new int[ForgeDirection.VALID_DIRECTIONS.length]; + private int[] oldPowered = new int[EnumFacing.values().length]; + private int[] isPowered = new int[EnumFacing.values().length]; @Override @@ -30,8 +31,9 @@ public void removed(TileEntityManager owner) { public void triggerRedstone() { isPowered = new int[isPowered.length]; for (int i = 0; i < isPowered.length; i++) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[i]; - isPowered[i] = worldObj.getIndirectPowerLevelTo(direction.offsetX + this.xCoord, direction.offsetY + this.yCoord, direction.offsetZ + this.zCoord, direction.ordinal()); + EnumFacing direction = EnumFacing.getFront(i); + BlockPos pos = new BlockPos(direction.getFrontOffsetX() + this.getPos().getX(), direction.getFrontOffsetY() + this.getPos().getY(), direction.getFrontOffsetZ() + this.getPos().getZ()); + isPowered[i] = worldObj.getRedstonePower(pos, direction); } for (int i = managerList.size() - 1; i >= 0; i--) { @@ -72,10 +74,10 @@ public void writeContentToNBT(NBTTagCompound nbtTagCompound) { nbtTagCompound.setByte(ModBlocks.NBT_PROTOCOL_VERSION, ModBlocks.NBT_CURRENT_PROTOCOL_VERSION); NBTTagList sidesTag = new NBTTagList(); - for (int i = 0; i < isPowered.length; i++) { + for (int power : isPowered) { NBTTagCompound sideTag = new NBTTagCompound(); - sideTag.setByte(NBT_POWER, (byte)isPowered[i]); + sideTag.setByte(NBT_POWER, (byte) power); sidesTag.appendTag(sideTag); } diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityIntake.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityIntake.java index 87f1027fb..11b3b85ec 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityIntake.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityIntake.java @@ -5,7 +5,9 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import java.util.ArrayList; import java.util.EnumSet; @@ -61,24 +63,24 @@ public void setInventorySlotContents(int id, ItemStack itemstack) { id--; if (id < 0 || !canPickUp(items.get(id))) { if (itemstack != null) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[ModBlocks.blockCableIntake.getSideMeta(getBlockMetadata()) % ForgeDirection.VALID_DIRECTIONS.length]; + EnumFacing direction = EnumFacing.getFront(ModBlocks.blockCableIntake.getSideMeta(getBlockMetadata()) % EnumFacing.values().length); - double posX = xCoord + 0.5 + direction.offsetX * 0.75; - double posY = yCoord + 0.5 + direction.offsetY * 0.75; - double posZ = zCoord + 0.5 + direction.offsetZ * 0.75; + double posX = getPos().getX() + 0.5 + direction.getFrontOffsetX() * 0.75; + double posY = getPos().getY() + 0.5 + direction.getFrontOffsetY() * 0.75; + double posZ = getPos().getZ() + 0.5 + direction.getFrontOffsetZ() * 0.75; - if (direction.offsetY == 0) { + if (direction.getFrontOffsetY() == 0) { posY -= 0.1; } EntityItem item = new EntityItem(worldObj, posX, posY, posZ, itemstack); - item.motionX = direction.offsetX * 0.2; - item.motionY = direction.offsetY * 0.2; - item.motionZ = direction.offsetZ * 0.2; + item.motionX = direction.getFrontOffsetX() * 0.2; + item.motionY = direction.getFrontOffsetY() * 0.2; + item.motionZ = direction.getFrontOffsetZ() * 0.2; - item.delayBeforeCanPickup = 40; + item.setPickupDelay(40); worldObj.spawnEntityInWorld(item); @@ -99,30 +101,35 @@ public void setInventorySlotContents(int id, ItemStack itemstack) { } @Override - public String getInventoryName() { + public String getName() { return ModBlocks.blockCableIntake.getLocalizedName(); } @Override - public boolean hasCustomInventoryName() { + public boolean hasCustomName() { return true; } + @Override + public IChatComponent getDisplayName() { + return new ChatComponentText(ModBlocks.blockCableIntake.getLocalizedName()); + } + private static final int DISTANCE = 3; private void updateInventory() { if (items == null) { items = new ArrayList(); - int lowX = xCoord - DISTANCE; - int lowY = yCoord - DISTANCE; - int lowZ = zCoord - DISTANCE; + int lowX = getPos().getX() - DISTANCE; + int lowY = getPos().getY() - DISTANCE; + int lowZ = getPos().getZ() - DISTANCE; - int highX = xCoord + 1 + DISTANCE; - int highY = yCoord + 1 + DISTANCE; - int highZ = zCoord + 1 + DISTANCE; + int highX = getPos().getX() + 1 + DISTANCE; + int highY = getPos().getY() + 1 + DISTANCE; + int highZ = getPos().getZ() + 1 + DISTANCE; - items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(lowX, lowY, lowZ, highX, highY, highZ)); + items = worldObj.getEntitiesWithinAABB(EntityItem.class, new AxisAlignedBB(lowX, lowY, lowZ, highX, highY, highZ)); //remove items we can't use right away, this check is done when we interact with items too, to make sure it hasn't changed for (Iterator iterator = items.iterator(); iterator.hasNext(); ) { @@ -135,7 +142,7 @@ private void updateInventory() { } @Override - public ItemStack getStackInSlotOnClosing(int i) { + public ItemStack removeStackFromSlot(int i) { return null; } @@ -150,12 +157,12 @@ public boolean isUseableByPlayer(EntityPlayer entityplayer) { } @Override - public void openInventory() { + public void openInventory(EntityPlayer player) { } @Override - public void closeInventory() { + public void closeInventory(EntityPlayer player) { } @@ -165,12 +172,32 @@ public boolean isItemValidForSlot(int i, ItemStack itemstack) { } @Override - public void updateEntity() { + public int getField(int id) { + return 0; + } + + @Override + public void setField(int id, int value) { + + } + + @Override + public int getFieldCount() { + return 0; + } + + @Override + public void clear() { + items.clear(); + } + + @Override + public void update() { items = null; } private boolean canPickUp(EntityItem item) { - return !item.isDead && (item.delayBeforeCanPickup == 0 || ModBlocks.blockCableIntake.isAdvanced(getBlockMetadata())); + return !item.isDead && (!item.cannotPickup() || ModBlocks.blockCableIntake.isAdvanced(getBlockMetadata())); } @Override diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityManager.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityManager.java index edd40674b..0c8120f0f 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityManager.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityManager.java @@ -1,7 +1,5 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -9,6 +7,10 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ITickable; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.components.*; import vswe.stevesfactory.interfaces.ContainerManager; @@ -20,7 +22,7 @@ import java.util.*; -public class TileEntityManager extends TileEntity implements ITileEntityInterface { +public class TileEntityManager extends TileEntity implements ITileEntityInterface, ITickable { public static final TriggerHelperRedstone redstoneTrigger = new TriggerHelperRedstone(3, 4); public static final TriggerHelperRedstone redstoneCondition = new TriggerHelperRedstone(1, 2); public static final TriggerHelperBUD budTrigger = new TriggerHelperBUD(); @@ -215,14 +217,14 @@ public void updateInventories() { WorldCoordinate[] oldCoordinates = new WorldCoordinate[inventories.size()]; for (int i = 0; i < oldCoordinates.length; i++) { TileEntity inventory = inventories.get(i).getTileEntity(); - oldCoordinates[i] = new WorldCoordinate(inventory.xCoord, inventory.yCoord, inventory.zCoord); + oldCoordinates[i] = new WorldCoordinate(inventory.getPos().getX(), inventory.getPos().getY(), inventory.getPos().getZ()); oldCoordinates[i].setTileEntity(inventory); } List visited = new ArrayList(); inventories.clear(); Queue queue = new PriorityQueue(); - WorldCoordinate start = new WorldCoordinate(xCoord, yCoord, zCoord, 0); + WorldCoordinate start = new WorldCoordinate(getPos().getX(), getPos().getY(), getPos().getZ(), 0); queue.add(start); visited.add(start); @@ -237,7 +239,7 @@ public void updateInventories() { if (!visited.contains(target) && (Settings.isLimitless(this) || inventories.size() < MAX_CONNECTED_INVENTORIES)) { visited.add(target); - TileEntity te = worldObj.getTileEntity(target.getX(), target.getY(), target.getZ()); + TileEntity te = worldObj.getTileEntity(new BlockPos(target.getX(), target.getY(), target.getZ())); if (te instanceof TileEntityCluster) { @@ -249,8 +251,8 @@ public void updateInventories() { addInventory(te, target); } - - if ((Settings.isLimitless(this) || element.getDepth() < MAX_CABLE_LENGTH) && ModBlocks.blockCable.isCable(worldObj.getBlock(target.getX(), target.getY(), target.getZ()), worldObj.getBlockMetadata(target.getX(), target.getY(), target.getZ()))){ + BlockPos pos = new BlockPos(target.getX(), target.getY(), target.getZ()); + if ((Settings.isLimitless(this) || element.getDepth() < MAX_CABLE_LENGTH) && ModBlocks.blockCable.isCable(worldObj.getBlockState(pos).getBlock(), worldObj.getBlockState(pos).getBlock().getMetaFromState(worldObj.getBlockState(pos)))){ queue.add(target); } } @@ -267,7 +269,7 @@ public void updateInventories() { if (oldCoordinate.getTileEntity() instanceof ISystemListener) { boolean found = false; for (ConnectionBlock inventory : inventories) { - if (oldCoordinate.getX() == inventory.getTileEntity().xCoord && oldCoordinate.getY() == inventory.getTileEntity().yCoord && oldCoordinate.getZ() == inventory.getTileEntity().zCoord) { + if (oldCoordinate.getX() == inventory.getTileEntity().getPos().getX() && oldCoordinate.getY() == inventory.getTileEntity().getPos().getY() && oldCoordinate.getZ() == inventory.getTileEntity().getPos().getZ()) { found = true; break; } @@ -352,7 +354,7 @@ private List getNewSelection(WorldCoordinate[] oldCoordinates, List(); } } - public boolean hasStrongSignalAtSide(int side) { - return strong[side]; + public boolean hasStrongSignalAtSide(EnumFacing side) { + return strong[side.ordinal()]; } - - public boolean hasStrongSignalAtOppositeSide(int side) { - return strong[getOpposite(side)]; - } - - public int getStrengthFromSide(int side) { - return strengths[side]; + public boolean hasStrongSignalAtOppositeSide(EnumFacing side) { + return strong[side.getOpposite().ordinal()]; } - public int getStrengthFromOppositeSide(int side) { - return getStrengthFromSide(getOpposite(side)); + public int getStrengthFromSide(EnumFacing side) { + return strengths[side.ordinal()]; } - private int getOpposite(int side) { - return ForgeDirection.getOrientation(side).getOpposite().ordinal(); + public int getStrengthFromOppositeSide(EnumFacing side) { + return getStrengthFromSide(side.getOpposite()); } - public void updateState(ComponentMenuRedstoneSidesEmitter sides, ComponentMenuRedstoneOutput output, ComponentMenuPulse pulse) { boolean updateClient = false; - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { if (sides.isSideRequired(i)) { int oldStrength = updatedStrength[i]; boolean oldStrong = updatedStrong[i]; @@ -85,7 +80,7 @@ public void updateState(ComponentMenuRedstoneSidesEmitter sides, ComponentMenuRe if (updateBlocks) { - addBlockScheduledForUpdate(i); + addBlockScheduledForUpdate(EnumFacing.getFront(i)); } if (pulse.shouldEmitPulse()) { @@ -123,8 +118,6 @@ public void updateState(ComponentMenuRedstoneSidesEmitter sides, ComponentMenuRe } } - - } } @@ -133,14 +126,13 @@ public void updateState(ComponentMenuRedstoneSidesEmitter sides, ComponentMenuRe } } - private void addBlockScheduledForUpdate(int side) { + private void addBlockScheduledForUpdate(EnumFacing side) { hasUpdatedThisTick = true; - ForgeDirection direction = ForgeDirection.getOrientation(side); - int x = xCoord + direction.offsetX; - int y = yCoord + direction.offsetY; - int z = zCoord + direction.offsetZ; + int x = getPos().getX() + side.getFrontOffsetX(); + int y = getPos().getY() + side.getFrontOffsetY(); + int z = getPos().getZ() + side.getFrontOffsetZ(); - WorldCoordinate coordinate = new WorldCoordinate(x, y, z); + BlockPos coordinate = new BlockPos(x, y, z); if (!scheduledToUpdate.contains(coordinate)) { scheduledToUpdate.add(coordinate); } @@ -184,17 +176,17 @@ private void updateSideState(int side, ComponentMenuRedstoneOutput output) { } - private void notifyUpdate(int x, int y, int z, boolean spread) { - if (worldObj.getBlock(x, y, z) != ModBlocks.blockCable && (x != xCoord || y != yCoord || z != zCoord)) { - worldObj.notifyBlockOfNeighborChange(x, y, z, ModBlocks.blockCableOutput); + private void notifyUpdate(BlockPos pos, boolean spread) { + if (worldObj.getBlockState(pos).getBlock() != ModBlocks.blockCable && (pos.getX() != getPos().getX() || pos.getY() != getPos().getY() || pos.getZ() != getPos().getZ())) { + worldObj.notifyBlockOfStateChange(pos, ModBlocks.blockCableOutput); if (spread) { - notifyUpdate(x - 1, y, z, false); - notifyUpdate(x + 1, y, z, false); - notifyUpdate(x, y - 1, z, false); - notifyUpdate(x, y + 1, z, false); - notifyUpdate(x, y, z - 1, false); - notifyUpdate(x, y, z + 1, false); + notifyUpdate(pos.add(-1, 0, 0),false); + notifyUpdate(pos.add(1, 0, 0), false); + notifyUpdate(pos.add(0, -1, 0),false); + notifyUpdate(pos.add(0, 1, 0), false); + notifyUpdate(pos.add(0, 0, -1),false); + notifyUpdate(pos.add(0, 0, 1), false); } } } @@ -267,7 +259,7 @@ public void writeContentToNBT(NBTTagCompound nbtTagCompound) { @Override public void writeData(DataWriter dw, EntityPlayer player, boolean onServer, int id) { if (onServer) { - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { boolean isOn = updatedStrength[i] > 0; dw.writeBoolean(isOn); if (isOn) { @@ -286,7 +278,7 @@ public void readData(DataReader dr, EntityPlayer player, boolean onServer, int i //respond by sending the data to the client that required it PacketHandler.sendBlockPacket(this, player, 0); }else{ - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { boolean isOn = dr.readBoolean(); if (isOn) { strengths[i] = dr.readData(DataBitHelper.MENU_REDSTONE_ANALOG); @@ -295,7 +287,7 @@ public void readData(DataReader dr, EntityPlayer player, boolean onServer, int i strengths[i] = 0; } } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + worldObj.markBlockForUpdate(new BlockPos(getPos().getX(), getPos().getY(), getPos().getZ())); } } @@ -307,10 +299,10 @@ public int infoBitLength(boolean onServer) { private List[] pulseTimers; private boolean hasUpdatedThisTick; - private List scheduledToUpdate = new ArrayList(); + private List scheduledToUpdate = new ArrayList(); @Override - public void updateEntity() { + public void update() { if (worldObj.isRemote) { keepClientDataUpdated(); }else{ @@ -318,14 +310,14 @@ public void updateEntity() { if (hasUpdatedThisTick) { hasUpdatedThisTick = false; - List coordinates = new ArrayList(scheduledToUpdate); + List coordinates = new ArrayList(scheduledToUpdate); scheduledToUpdate.clear(); for (int i = 0; i < strengths.length; i++) { strengths[i] = updatedStrength[i]; strong[i] = updatedStrong[i]; } - for (WorldCoordinate coordinate : coordinates) { - notifyUpdate(coordinate.getX(), coordinate.getY(), coordinate.getZ(), true); + for (BlockPos coordinate : coordinates) { + notifyUpdate(coordinate, true); } } } @@ -334,7 +326,7 @@ public void updateEntity() { private void updatePulses() { boolean updateClient = false; - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { Iterator iterator = pulseTimers[i].iterator(); while (iterator.hasNext()) { @@ -344,7 +336,7 @@ private void updatePulses() { if (updatedStrength[i] != timer.strength || updatedStrong[i] == timer.strong) { updatedStrength[i] = timer.strength; updatedStrong[i] = timer.strong; - addBlockScheduledForUpdate(i); + addBlockScheduledForUpdate(EnumFacing.getFront(i)); updateClient = true; } iterator.remove(); @@ -366,7 +358,7 @@ private void keepClientDataUpdated() { return; } - double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); + double distance = Minecraft.getMinecraft().thePlayer.getDistanceSq(getPos().getX() + 0.5, getPos().getY() + 0.5, getPos().getZ() + 0.5); if (distance > Math.pow(PacketHandler.BLOCK_UPDATE_RANGE, 2)) { hasUpdatedData = false; @@ -386,6 +378,8 @@ protected EnumSet getRegistrations() { return EnumSet.of(ClusterMethodRegistration.CAN_CONNECT_REDSTONE, ClusterMethodRegistration.SHOULD_CHECK_WEAK_POWER, ClusterMethodRegistration.IS_PROVIDING_WEAK_POWER, ClusterMethodRegistration.IS_PROVIDING_STRONG_POWER); } + + private class PulseTimer { private int strength; private boolean strong; diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntityRelay.java b/src/main/java/vswe/stevesfactory/blocks/TileEntityRelay.java index bed46b638..ef8669e00 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntityRelay.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntityRelay.java @@ -1,7 +1,5 @@ package vswe.stevesfactory.blocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -16,20 +14,22 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.StringUtils; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.interfaces.ContainerRelay; import vswe.stevesfactory.interfaces.GuiRelay; import vswe.stevesfactory.network.DataBitHelper; import vswe.stevesfactory.network.DataReader; import vswe.stevesfactory.network.DataWriter; import vswe.stevesfactory.network.PacketHandler; -import vswe.stevesfactory.util.Utils; import vswe.stevesfactory.wrappers.InventoryWrapper; import vswe.stevesfactory.wrappers.InventoryWrapperHorse; import vswe.stevesfactory.wrappers.InventoryWrapperPlayer; @@ -37,7 +37,7 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; - +import java.util.UUID; public class TileEntityRelay extends TileEntityClusterElement implements IInventory, ISidedInventory, IFluidHandler, ITileEntityInterface { @@ -51,17 +51,17 @@ public class TileEntityRelay extends TileEntityClusterElement implements IInvent //used by the advanced version private List permissions = new ArrayList(); private boolean doesListRequireOp = false; - private String owner = "Unknown"; + private UUID owner = null; private boolean creativeMode; public static int PERMISSION_MAX_LENGTH = 255; - public String getOwner() { + public UUID getOwner() { return owner; } public void setOwner(EntityLivingBase entity) { if (entity != null && entity instanceof EntityPlayer) { - owner = Utils.stripControlCodes(((EntityPlayer) entity).getDisplayName()); + owner = entity.getUniqueID(); } } @@ -90,13 +90,13 @@ private boolean isAdvanced() { } @Override - public int[] getAccessibleSlotsFromSide(int var1) { + public int[] getSlotsForFace(EnumFacing side) { try { IInventory inventory = getInventory(); if (inventory != null) { if (inventory instanceof ISidedInventory) { - return ((ISidedInventory)inventory).getAccessibleSlotsFromSide(var1); + return ((ISidedInventory)inventory).getSlotsForFace(side); }else{ int size = inventory.getSizeInventory(); if (cachedAllSlots == null || cachedAllSlots.length != size) { @@ -116,13 +116,13 @@ public int[] getAccessibleSlotsFromSide(int var1) { } @Override - public boolean canInsertItem(int i, ItemStack itemstack, int j) { + public boolean canInsertItem(int i, ItemStack itemstack, EnumFacing side) { try { IInventory inventory = getInventory(); if (inventory != null) { if (inventory instanceof ISidedInventory) { - return ((ISidedInventory)inventory).canInsertItem(i, itemstack, j); + return ((ISidedInventory)inventory).canInsertItem(i, itemstack, side); }else{ return inventory.isItemValidForSlot(i, itemstack); } @@ -135,13 +135,13 @@ public boolean canInsertItem(int i, ItemStack itemstack, int j) { } @Override - public boolean canExtractItem(int i, ItemStack itemstack, int j) { + public boolean canExtractItem(int i, ItemStack itemstack, EnumFacing side) { try { IInventory inventory = getInventory(); if (inventory != null) { if (inventory instanceof ISidedInventory) { - return ((ISidedInventory)inventory).canExtractItem(i, itemstack, j); + return ((ISidedInventory)inventory).canExtractItem(i, itemstack, side); }else{ return inventory.isItemValidForSlot(i, itemstack); } @@ -199,7 +199,7 @@ public ItemStack decrStackSize(int i, int j) { } @Override - public ItemStack getStackInSlotOnClosing(int i) { + public ItemStack removeStackFromSlot(int i) { //don't drop the things twice return null; } @@ -218,12 +218,12 @@ public void setInventorySlotContents(int i, ItemStack itemstack) { } @Override - public String getInventoryName() { + public String getName() { try { IInventory inventory = getInventory(); if (inventory != null) { - return inventory.getInventoryName(); + return inventory.getName(); } return "Unknown"; @@ -233,12 +233,12 @@ public String getInventoryName() { } @Override - public boolean hasCustomInventoryName() { + public boolean hasCustomName() { try { IInventory inventory = getInventory(); if (inventory != null) { - return inventory.hasCustomInventoryName(); + return inventory.hasCustomName(); } return false; @@ -247,6 +247,21 @@ public boolean hasCustomInventoryName() { } } + @Override + public IChatComponent getDisplayName() { + try { + IInventory inventory = getInventory(); + + if (inventory != null) { + return inventory.getDisplayName(); + } + + return null; + }finally { + unBlockUsage(); + } + } + @Override public int getInventoryStackLimit() { try { @@ -294,25 +309,55 @@ public boolean isItemValidForSlot(int i, ItemStack itemstack) { } @Override - public void openInventory() { + public int getField(int id) { + try { + IInventory inventory = getInventory(); + + if (inventory != null) { + return inventory.getFieldCount(); + } + + return 0; + }finally { + unBlockUsage(); + } + } + + @Override + public void setField(int id, int value) { + try { + IInventory inventory = getInventory(); + + if (inventory != null) { + inventory.setField(id, value); + } + }finally { + unBlockUsage(); + } + } + + @Override + public int getFieldCount() { try { IInventory inventory = getInventory(); if (inventory != null) { - inventory.openInventory(); + return inventory.getFieldCount(); } + + return 0; }finally { unBlockUsage(); } } @Override - public void closeInventory() { + public void clear() { try { IInventory inventory = getInventory(); if (inventory != null) { - inventory.closeInventory(); + inventory.clear(); } }finally { unBlockUsage(); @@ -320,7 +365,33 @@ public void closeInventory() { } @Override - public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + public void openInventory(EntityPlayer player) { + try { + IInventory inventory = getInventory(); + + if (inventory != null) { + inventory.openInventory(player); + } + }finally { + unBlockUsage(); + } + } + + @Override + public void closeInventory(EntityPlayer player) { + try { + IInventory inventory = getInventory(); + + if (inventory != null) { + inventory.closeInventory(player); + } + }finally { + unBlockUsage(); + } + } + + @Override + public int fill(EnumFacing from, FluidStack resource, boolean doFill) { try { IFluidHandler tank = getTank(); @@ -335,7 +406,7 @@ public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { } @Override - public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { try { IFluidHandler tank = getTank(); @@ -350,7 +421,7 @@ public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrai } @Override - public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { try { IFluidHandler tank = getTank(); @@ -365,7 +436,7 @@ public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { } @Override - public boolean canFill(ForgeDirection from, Fluid fluid) { + public boolean canFill(EnumFacing from, Fluid fluid) { try { IFluidHandler tank = getTank(); @@ -380,7 +451,7 @@ public boolean canFill(ForgeDirection from, Fluid fluid) { } @Override - public boolean canDrain(ForgeDirection from, Fluid fluid) { + public boolean canDrain(EnumFacing from, Fluid fluid) { try { IFluidHandler tank = getTank(); @@ -395,7 +466,7 @@ public boolean canDrain(ForgeDirection from, Fluid fluid) { } @Override - public FluidTankInfo[] getTankInfo(ForgeDirection from) { + public FluidTankInfo[] getTankInfo(EnumFacing from) { try { IFluidHandler tank = getTank(); @@ -463,15 +534,15 @@ private T getContainer(Class type, int id) { } } - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[ModBlocks.blockCableRelay.getSideMeta(getBlockMetadata()) % ForgeDirection.VALID_DIRECTIONS.length]; + EnumFacing direction = ((EnumFacing)getWorld().getBlockState(getPos()).getValue(BlockCableRelay.FACING)); - int x = xCoord + direction.offsetX; - int y = yCoord + direction.offsetY; - int z = zCoord + direction.offsetZ; + int x = getPos().getX() + direction.getFrontOffsetX(); + int y = getPos().getY() + direction.getFrontOffsetY(); + int z = getPos().getZ() + direction.getFrontOffsetZ(); - World world = getWorldObj(); + World world = getWorld(); if (world != null) { - TileEntity te = world.getTileEntity(x, y, z); + TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); if (te != null && type.isInstance(te)) { if (te instanceof TileEntityRelay) { @@ -482,11 +553,11 @@ private T getContainer(Class type, int id) { } - List entities = world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1)); + List entities = world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1)); if (entities != null) { double closest = -1; for (Entity entity : entities) { - double distance = entity.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); + double distance = entity.getDistanceSq(getPos().getX() + 0.5, getPos().getY() + 0.5, getPos().getZ() + 0.5); if (isEntityValid(entity, type, id) && (closest == -1 || distance < closest)) { closest = distance; cachedEntities[id] = entity; @@ -528,7 +599,7 @@ private T getEntityContainer(int id) { } @Override - public void updateEntity() { + public void update() { cachedEntities[0] = null; cachedEntities[1] = null; cachedInventoryWrapper = null; @@ -541,7 +612,7 @@ public boolean allowPlayerInteraction(EntityPlayer player) { private boolean isPlayerActive(EntityPlayer player) { if (player != null) { for (UserPermission permission : permissions) { - if (permission.getName().equals(Utils.stripControlCodes(player.getDisplayName()))) { + if (permission.getUserId().equals(player.getUniqueID())) { return permission.isActive(); } } @@ -563,12 +634,13 @@ public GuiScreen getGui(TileEntity te, InventoryPlayer inv) { @Override public void writeAllData(DataWriter dw) { - dw.writeString(owner, DataBitHelper.NAME_LENGTH); + dw.writeString(owner.toString(), DataBitHelper.UUID_LENGTH); dw.writeBoolean(creativeMode); dw.writeBoolean(doesListRequireOp); dw.writeData(permissions.size(), DataBitHelper.PERMISSION_ID); for (UserPermission permission : permissions) { - dw.writeString(permission.getName(), DataBitHelper.NAME_LENGTH); + dw.writeString(permission.getUserId().toString(), DataBitHelper.UUID_LENGTH); + dw.writeString(permission.getUserName(), DataBitHelper.NAME_LENGTH); dw.writeBoolean(permission.isActive()); dw.writeBoolean(permission.isOp()); } @@ -577,17 +649,15 @@ public void writeAllData(DataWriter dw) { @Override public void readAllData(DataReader dr, EntityPlayer player) { - owner = dr.readString(DataBitHelper.NAME_LENGTH); - if (owner == null) { - owner = "Unknown"; - } + owner = UUID.fromString(dr.readString(DataBitHelper.UUID_LENGTH)); + creativeMode = dr.readBoolean(); doesListRequireOp = dr.readBoolean(); int length = dr.readData(DataBitHelper.PERMISSION_ID); permissions.clear(); for (int i = 0; i < length; i++) { - UserPermission permission = new UserPermission(dr.readString(DataBitHelper.NAME_LENGTH)); + UserPermission permission = new UserPermission(UUID.fromString(dr.readString(DataBitHelper.UUID_LENGTH)), dr.readString(DataBitHelper.NAME_LENGTH)); permission.setActive(dr.readBoolean()); permission.setOp(dr.readBoolean()); permissions.add(permission); @@ -606,13 +676,14 @@ public void readUpdatedData(DataReader dr, EntityPlayer player) { } } - String username = Utils.stripControlCodes(player.getDisplayName()); + UUID userId = player.getUniqueID(); + boolean isOp = false; - if (worldObj.isRemote || username.equals(owner)) { + if (worldObj.isRemote || userId.equals(owner)) { isOp = true; }else{ for (UserPermission permission : permissions) { - if (username.equals(permission.getName())) { + if (userId.equals(permission.getUserId())) { isOp = permission.isOp(); break; } @@ -623,10 +694,11 @@ public void readUpdatedData(DataReader dr, EntityPlayer player) { if (userData) { boolean added = dr.readBoolean(); if (added) { - UserPermission permission = new UserPermission(dr.readString(DataBitHelper.NAME_LENGTH)); + String UUIDS = dr.readString(DataBitHelper.UUID_LENGTH); + UserPermission permission = new UserPermission(UUID.fromString(UUIDS), dr.readString(DataBitHelper.NAME_LENGTH)); for (UserPermission userPermission : permissions) { - if (userPermission.getName().equals(permission.getName())) { + if (userPermission.getUserId().equals(permission.getUserId())) { return; } } @@ -636,7 +708,7 @@ public void readUpdatedData(DataReader dr, EntityPlayer player) { permission.setOp(dr.readBoolean()); } - if (permissions.size() < TileEntityRelay.PERMISSION_MAX_LENGTH && (worldObj.isRemote || permission.getName().equals(username))) { + if (permissions.size() < TileEntityRelay.PERMISSION_MAX_LENGTH && (worldObj.isRemote || permission.getUserId().equals(userId))) { permissions.add(permission); } }else{ @@ -646,7 +718,7 @@ public void readUpdatedData(DataReader dr, EntityPlayer player) { boolean deleted = dr.readBoolean(); if (deleted) { UserPermission permission = permissions.get(id); - if (isOp || permission.getName().equals(username)) { + if (isOp || permission.getUserId().equals(userId)) { permissions.remove(id); } }else if(isOp){ @@ -687,7 +759,8 @@ public void updateData(ContainerRelay container) { DataWriter dw = PacketHandler.getWriterForUpdate(container); dw.writeBoolean(true); //user data dw.writeBoolean(true); //added - dw.writeString(permission.getName(), DataBitHelper.NAME_LENGTH); + dw.writeString(permission.getUserId().toString(), DataBitHelper.UUID_LENGTH); + dw.writeString(permission.getUserName(), DataBitHelper.NAME_LENGTH); dw.writeBoolean(permission.isActive()); dw.writeBoolean(permission.isOp()); PacketHandler.sendDataToListeningClients(container, dw); @@ -696,7 +769,7 @@ public void updateData(ContainerRelay container) { //removed }else if (permissions.size() < container.oldPermissions.size()){ for (int i = 0; i < container.oldPermissions.size(); i++) { - if (i >= permissions.size() || !permissions.get(i).getName().equals(container.oldPermissions.get(i).getName())) { + if (i >= permissions.size() || !permissions.get(i).getUserId().equals(container.oldPermissions.get(i).getUserId())) { DataWriter dw = PacketHandler.getWriterForUpdate(container); dw.writeBoolean(true); //user data dw.writeBoolean(false); //existing @@ -734,6 +807,7 @@ public void updateData(ContainerRelay container) { private static final String NBT_CREATIVE = "Creative"; private static final String NBT_LIST = "ShowList"; private static final String NBT_PERMISSIONS = "Permissions"; + private static final String NBT_UUID = "UUID"; private static final String NBT_NAME = "Name"; private static final String NBT_ACTIVE = "Active"; private static final String NBT_EDITOR = "Editor"; @@ -743,14 +817,15 @@ public void writeContentToNBT(NBTTagCompound nbtTagCompound) { nbtTagCompound.setByte(ModBlocks.NBT_PROTOCOL_VERSION, ModBlocks.NBT_CURRENT_PROTOCOL_VERSION); if (isAdvanced()) { - nbtTagCompound.setString(NBT_OWNER, owner); + nbtTagCompound.setString(NBT_OWNER, owner != null ? owner.toString(): UUID.randomUUID().toString()); nbtTagCompound.setBoolean(NBT_CREATIVE, creativeMode); nbtTagCompound.setBoolean(NBT_LIST, doesListRequireOp); NBTTagList permissionTags = new NBTTagList(); for (UserPermission permission : permissions) { NBTTagCompound permissionTag = new NBTTagCompound(); - permissionTag.setString(NBT_NAME, permission.getName()); + permissionTag.setString(NBT_UUID, permission.getUserId().toString()); + permissionTag.setString(NBT_NAME, permission.getUserName()); permissionTag.setBoolean(NBT_ACTIVE, permission.isActive()); permissionTag.setBoolean(NBT_EDITOR, permission.isOp()); permissionTags.appendTag(permissionTag); @@ -764,7 +839,11 @@ public void readContentFromNBT(NBTTagCompound nbtTagCompound) { int version = nbtTagCompound.getByte(ModBlocks.NBT_PROTOCOL_VERSION); if (nbtTagCompound.hasKey(NBT_OWNER)) { - owner = nbtTagCompound.getString(NBT_OWNER); + if (version > 12) { + owner = UUID.fromString(nbtTagCompound.getString(NBT_OWNER)); + } else { + owner = null; + } creativeMode = nbtTagCompound.getBoolean(NBT_CREATIVE); doesListRequireOp = nbtTagCompound.getBoolean(NBT_LIST); permissions.clear(); @@ -772,7 +851,7 @@ public void readContentFromNBT(NBTTagCompound nbtTagCompound) { NBTTagList permissionTags = nbtTagCompound.getTagList(NBT_PERMISSIONS, 10); for (int i = 0; i < permissionTags.tagCount(); i++) { NBTTagCompound permissionTag = permissionTags.getCompoundTagAt(i); - UserPermission permission = new UserPermission(permissionTag.getString(NBT_NAME)); + UserPermission permission = new UserPermission(UUID.fromString(permissionTag.getString(NBT_UUID)), permissionTag.getString(NBT_NAME)); permission.setActive(permissionTag.getBoolean(NBT_ACTIVE)); permission.setOp(permissionTag.getBoolean(NBT_EDITOR)); permissions.add(permission); diff --git a/src/main/java/vswe/stevesfactory/blocks/TileEntitySignUpdater.java b/src/main/java/vswe/stevesfactory/blocks/TileEntitySignUpdater.java index 6667fe707..b9350b895 100644 --- a/src/main/java/vswe/stevesfactory/blocks/TileEntitySignUpdater.java +++ b/src/main/java/vswe/stevesfactory/blocks/TileEntitySignUpdater.java @@ -2,7 +2,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.BlockPos; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import vswe.stevesfactory.components.ComponentMenuSignText; import java.util.EnumSet; @@ -15,17 +18,17 @@ protected EnumSet getRegistrations() { } public void updateSign(ComponentMenuSignText menu) { - ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[getBlockMetadata() % ForgeDirection.VALID_DIRECTIONS.length]; - TileEntity te = worldObj.getTileEntity(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ); + EnumFacing direction = EnumFacing.getFront(getBlockMetadata() % EnumFacing.values().length); + TileEntity te = worldObj.getTileEntity(new BlockPos(getPos().getX() + direction.getFrontOffsetX(), getPos().getY() + direction.getFrontOffsetY(), getPos().getZ() + direction.getFrontOffsetZ())); if (te != null && te instanceof TileEntitySign) { TileEntitySign sign = (TileEntitySign)te; //if (sign.func_142009_b() == null) { - sign.func_145912_a(null); + sign.setPlayer(null); boolean updated = false; for (int i = 0; i < 4; i++) { if (menu.shouldUpdate(i)) { - String oldText = sign.signText[i]; - String newText = menu.getText(i); + IChatComponent oldText = sign.signText[i]; + ChatComponentText newText = new ChatComponentText(menu.getText(i)); if (!newText.equals(oldText)) { sign.signText[i] = newText; updated = true; @@ -34,7 +37,7 @@ public void updateSign(ComponentMenuSignText menu) { } if (updated) { sign.markDirty(); - worldObj.markBlockForUpdate(sign.xCoord, sign.yCoord, sign.zCoord); + worldObj.markBlockForUpdate(new BlockPos(sign.getPos().getX(), sign.getPos().getY(), sign.getPos().getZ())); } //} diff --git a/src/main/java/vswe/stevesfactory/blocks/UnlistedBlockPosProperty.java b/src/main/java/vswe/stevesfactory/blocks/UnlistedBlockPosProperty.java new file mode 100644 index 000000000..8ac565d01 --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/UnlistedBlockPosProperty.java @@ -0,0 +1,33 @@ +package vswe.stevesfactory.blocks; + +import net.minecraft.util.BlockPos; +import net.minecraftforge.common.property.IUnlistedProperty; + +public class UnlistedBlockPosProperty implements IUnlistedProperty { + + String name; + + public UnlistedBlockPosProperty(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isValid(BlockPos value) { + return value != null; + } + + @Override + public Class getType() { + return BlockPos.class; + } + + @Override + public String valueToString(BlockPos value) { + return value.toString(); + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/UserPermission.java b/src/main/java/vswe/stevesfactory/blocks/UserPermission.java index 0ca439a86..92db90d23 100644 --- a/src/main/java/vswe/stevesfactory/blocks/UserPermission.java +++ b/src/main/java/vswe/stevesfactory/blocks/UserPermission.java @@ -1,12 +1,16 @@ package vswe.stevesfactory.blocks; +import java.util.UUID; + public class UserPermission { + private UUID userId; private String name; private boolean op; private boolean active; - public UserPermission(String name) { + public UserPermission(UUID userId, String name) { + this.userId = userId; if (name == null) { this.name = "Unknown"; } else{ @@ -14,7 +18,11 @@ public UserPermission(String name) { } } - public String getName() { + public UUID getUserId() { + return userId; + } + + public String getUserName() { return name; } @@ -35,7 +43,7 @@ public void setActive(boolean active) { } public UserPermission copy() { - UserPermission temp = new UserPermission(getName()); + UserPermission temp = new UserPermission(getUserId(), getUserName()); temp.setOp(isOp()); temp.setActive(isActive()); return temp; diff --git a/src/main/java/vswe/stevesfactory/blocks/client/BakedCamouflageBlockModel.java b/src/main/java/vswe/stevesfactory/blocks/client/BakedCamouflageBlockModel.java new file mode 100644 index 000000000..4e226a079 --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/client/BakedCamouflageBlockModel.java @@ -0,0 +1,424 @@ +package vswe.stevesfactory.blocks.client; + +import com.google.common.base.Function; +import net.minecraft.block.Block; +import net.minecraft.block.BlockAir; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.BlockModelShapes; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.model.IBakedModel; +import net.minecraft.client.resources.model.ModelRotation; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.*; +import net.minecraftforge.common.property.IExtendedBlockState; +import net.minecraftforge.fml.client.FMLClientHandler; +import org.lwjgl.util.vector.Vector3f; +import vswe.stevesfactory.blocks.BlockCableCamouflages; +import vswe.stevesfactory.blocks.BlockCableCluster; +import vswe.stevesfactory.blocks.TileEntityCamouflage; +import vswe.stevesfactory.blocks.TileEntityCluster; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import static vswe.stevesfactory.blocks.TileEntityCamouflage.CamouflageType; + +public class BakedCamouflageBlockModel implements IFlexibleBakedModel, ISmartBlockModel { + + private VertexFormat format; + private TextureAtlasSprite normalSprite; + private TextureAtlasSprite insideSprite; + private TextureAtlasSprite transformSprite; + private TextureAtlasSprite clusterFront; + private TextureAtlasSprite clusterSide; + private TextureAtlasSprite clusterFrontAdv; + private TextureAtlasSprite clusterSideAdv; + + private FaceBakery bakery; + private Function bakedTextureGetter; + private IModelState modelState; + + public BakedCamouflageBlockModel(IModelState modelState, VertexFormat format, Function bakedTextureGetter, boolean isCamouflage) { + this.format = format; + + this.bakedTextureGetter = bakedTextureGetter; + this.modelState = modelState; + normalSprite = bakedTextureGetter.apply(CamouflageBlockModel.NORMAL); + insideSprite = bakedTextureGetter.apply(CamouflageBlockModel.INSIDE); + transformSprite = bakedTextureGetter.apply(CamouflageBlockModel.TRANSFORM); + + if (!isCamouflage) { + clusterFront = bakedTextureGetter.apply(CamouflageBlockModel.CL_FRONT); + clusterSide = bakedTextureGetter.apply(CamouflageBlockModel.CL_SIDE); + clusterFrontAdv = bakedTextureGetter.apply(CamouflageBlockModel.CL_ADV_FRONT); + clusterSideAdv = bakedTextureGetter.apply(CamouflageBlockModel.CL_ADV_SIDE); + } + + bakery = new FaceBakery(); + } + + @Override + public List getFaceQuads(EnumFacing side) { + //This should never be called! The handleBlockState returns an AssembledBakedModel + throw new UnsupportedOperationException(); + } + + @Override + public List getGeneralQuads() { + //This should never be called! The handleBlockState returns an AssembledBakedModel + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAmbientOcclusion() { + return false; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean isBuiltInRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleTexture() { + return normalSprite; + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() { + return ItemCameraTransforms.DEFAULT; + } + + @Override + public VertexFormat getFormat() { + return format; + } + + @Override + public IBakedModel handleBlockState(IBlockState state) { + if (state instanceof IExtendedBlockState) { + IExtendedBlockState blockState = (IExtendedBlockState) state; + Object obj = blockState.getValue(BlockCableCamouflages.BLOCK_POS); + + if (obj != null) { + + BlockPos pos = (BlockPos) obj; + BlockRendererDispatcher dispatcher = FMLClientHandler.instance().getClient().getBlockRendererDispatcher(); + BlockModelShapes modelShapes = dispatcher.getBlockModelShapes(); + + TileEntity tileEntity = FMLClientHandler.instance().getWorldClient().getTileEntity(pos); + TileEntityCamouflage camouflage = null; + TileEntityCluster cluster = null; + + if (tileEntity instanceof TileEntityCluster) { + cluster = (TileEntityCluster) tileEntity; + camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, FMLClientHandler.instance().getWorldClient(), pos); + + BlockCableCluster blockCluster = (BlockCableCluster) cluster.getBlockType(); + + if (camouflage == null) { + IModel clusterModel = null; + try { + clusterModel = ModelLoaderRegistry.getModel(blockCluster.isAdvanced(cluster.getBlockMetadata()) ? CamouflageBlockModel.MODEL_CLUSTER_ADV : CamouflageBlockModel.MODEL_CLUSTER); + } catch (IOException ignored) {} + + if (clusterModel != null) { + return clusterModel.bake(modelState, format, bakedTextureGetter); + } + } + } else if (tileEntity instanceof TileEntityCamouflage) { + camouflage = (TileEntityCamouflage) tileEntity; + } + return new AssembledBakedModel(camouflage, pos, blockState, modelShapes, cluster); + } + } + + return new AssembledBakedModel(); + } + + //Apparently it needs to be separate because it could be overridden my another thread as rendering is multithreaded + //https://github.com/TheGreyGhost/MinecraftByExample/blob/master/src/main/java/minecraftbyexample/mbe05_block_smartblockmodel2/CompositeModel.java + public class AssembledBakedModel implements IBakedModel + { + + private List quads = new LinkedList(); + + public AssembledBakedModel(TileEntityCamouflage camouflage, BlockPos pos, IExtendedBlockState blockState, BlockModelShapes modelShapes, TileEntityCluster cluster) { + if (camouflage != null && quads.isEmpty()) { + + for (EnumFacing facing: EnumFacing.values()) { + Block block = Block.getBlockById(camouflage.getId(facing.getIndex())); + Block insideBlock = Block.getBlockById(camouflage.getId(facing.getIndex() + EnumFacing.values().length)); + + generateQuads(block, pos, blockState, modelShapes, camouflage, facing, false, cluster); + if (camouflage.getCamouflageType().useDoubleRendering()) { + generateQuads(insideBlock, pos, blockState, modelShapes, camouflage, facing, true, cluster); + } + } + } + } + + public AssembledBakedModel() { + + } + + public void generateQuads(Block block, BlockPos pos, IExtendedBlockState blockState, BlockModelShapes modelShapes, TileEntityCamouflage camouflage, EnumFacing facing, boolean inside, TileEntityCluster cluster) { + if (block instanceof BlockAir || block instanceof BlockCableCamouflages || block instanceof BlockCableCluster) { + if (cluster == null) { + CamouflageType camoType = (CamouflageType) blockState.getValue(BlockCableCamouflages.CAMO_TYPE); + quads.add(getTransformedQuad(pos, blockState.getBlock(), facing, camoType.getIcon(), camoType == CamouflageType.NORMAL && !inside ? normalSprite : camoType == CamouflageType.INSIDE ? insideSprite: transformSprite, inside)); + } else { + BlockCableCluster blockCluster = (BlockCableCluster) cluster.getBlockType(); + int clusterMeta = cluster.getBlockMetadata(); + EnumFacing clusterFacing = blockCluster.getSide(clusterMeta); + boolean isFacingFront = ((camouflage != null && camouflage.getCamouflageType().useSpecialShape() && inside) || (camouflage == null && inside)) ? (facing == clusterFacing.getOpposite()): (facing == clusterFacing); + boolean isAdvanced = blockCluster.isAdvanced(clusterMeta); + + String resource = (isAdvanced ? (isFacingFront ? CamouflageBlockModel.CL_ADV_FRONT: CamouflageBlockModel.CL_ADV_SIDE): isFacingFront ? CamouflageBlockModel.CL_FRONT: CamouflageBlockModel.CL_SIDE).toString(); + TextureAtlasSprite texture = isAdvanced ? (isFacingFront ? clusterFrontAdv: clusterSideAdv): isFacingFront ? clusterFront: clusterSide; + + quads.add(getTransformedQuad(pos, blockState.getBlock(), facing, resource, texture, inside)); + } + } else { + + IBlockState camoState = block.getStateFromMeta(camouflage.getMeta(facing.getIndex() + (inside ? EnumFacing.values().length: 0))); + IBakedModel model = modelShapes.getModelForState(camoState); + + List bakedQuads = model.getFaceQuads(facing); + List reBakedQuads = new LinkedList(); + TextureAtlasSprite sprite = modelShapes.getTexture(camoState); + + + if (bakedQuads.isEmpty()) { + bakedQuads = model.getGeneralQuads(); + } + + for (BakedQuad quad :bakedQuads) { + if (quad.getFace() == facing) { + if (camouflage.getCamouflageType().useDoubleRendering()) { + quad = reBakeQuadForBlock(quad, pos, blockState.getBlock(), facing, sprite, inside); + } + reBakedQuads.add(quad); + } + } + + quads.addAll(reBakedQuads); + } + } + + private BakedQuad getTransformedQuad(BlockPos pos, Block block, EnumFacing facing, String resource, TextureAtlasSprite sprite, boolean inside) { + + block.setBlockBoundsBasedOnState(FMLClientHandler.instance().getWorldClient(), pos); + + float maxX = (((float)block.getBlockBoundsMaxX()) * 16f); + float maxY = (((float)block.getBlockBoundsMaxY()) * 16f); + float maxZ = (((float)block.getBlockBoundsMaxZ()) * 16f); + float minX = (((float)block.getBlockBoundsMinX()) * 16f); + float minY = (((float)block.getBlockBoundsMinY()) * 16f); + float minZ = (((float)block.getBlockBoundsMinZ()) * 16f); + + BlockFaceUV faceUV = null; + float f = 0.002F; + + if (inside) { + float temp = maxY; + maxY = 16 - minY; + minY = 16 - temp; + + temp = maxZ; + maxZ = 16 - minZ; + minZ = 16 - temp; + } + + switch (facing) { + + case DOWN: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{16 - minX, 16 - maxZ, 16 - maxX, 16 - minZ}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{16 - minX, 16 - minZ, 16 - maxX, 16 - maxZ}, 0); + maxY = minY + f; + } + break; + case UP: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{minX, minZ, maxX, maxZ}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{minX, maxZ, maxX, minZ}, 0); + minY = maxY - f; + } + break; + case NORTH: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{16 - maxX, 16 - maxY, 16 - minX, 16 - minY}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{16 - minX, maxY, 16 - maxX, minY}, 0); + maxZ = minZ + f; + } + break; + case SOUTH: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{minX, 16 - maxY, maxX, 16 - minY}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{maxX, maxY, minX, minY}, 0); + minZ = maxZ - f; + } + break; + case WEST: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{minZ, 16 - maxY, maxZ, 16 - minY}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{maxZ, maxY, minZ, minY}, 0); + maxX = minX + f; + } + break; + case EAST: + if (!inside) { + faceUV = new BlockFaceUV(new float[]{16 - maxZ, 16 - maxY, 16 - minZ, 16 - minY}, 0); + } else { + faceUV = new BlockFaceUV(new float[]{16 - minZ, maxY, 16 - maxZ, minY}, 0); + minX = maxX - f; + } + break; + } + + return bakery.makeBakedQuad(new Vector3f(minX, minY, minZ), new Vector3f(maxX, maxY, maxZ), new BlockPartFace(facing, -1, resource == null ? "": resource, faceUV), sprite, inside ? facing.getOpposite(): facing, inside ? ModelRotation.X180_Y0: ModelRotation.X0_Y0, null, false, true); + } + + private BakedQuad reBakeQuadForBlock(BakedQuad original, BlockPos pos, Block block, EnumFacing facing, TextureAtlasSprite sprite, boolean inside) { + BakedQuad transformedQuad = getTransformedQuad(pos, block, facing, null, sprite, inside); + int[] transformedFaceData = transformedQuad.getVertexData(); + + int tintIndex = original.getTintIndex(); + EnumFacing face = original.getFace(); + int[] faceData = original.getVertexData().clone(); + + for (int i = 0; i < 4; i++) { + int storeIndex = i * 7; + + float[] d = new float[3]; + + for (int j = 0; j < 3; j++) { + d[j] = (Float.intBitsToFloat(faceData[storeIndex + j]) * 16) - (Float.intBitsToFloat(transformedFaceData[storeIndex + j]) * 16); + } + + faceData[storeIndex] = transformedFaceData[storeIndex]; + faceData[storeIndex + 1] = transformedFaceData[storeIndex + 1]; + faceData[storeIndex + 2] = transformedFaceData[storeIndex + 2]; + faceData[storeIndex + 4] = transformedFaceData[storeIndex + 4]; + faceData[storeIndex + 5] = transformedFaceData[storeIndex + 5]; + /* + faceData[storeIndex + 4] = getDeltaU(faceData[storeIndex + 4], d, facing, storeIndex / 7); + faceData[storeIndex + 5] = getDeltaV(faceData[storeIndex + 5], d, facing, storeIndex / 7);*/ + } + + return new BakedQuad(faceData, tintIndex, face); + } + + //Attempt to get the correct side the block, left for future reference + /*private int getSign(float i) { + return i < 0 ? -1: 1; + } + + private int getDeltaU(int origU, float[] delta, EnumFacing facing, int corner) { + int d = 0; + float d1 = delta[0]; + float d2 = delta[2]; + switch (facing) { + + case DOWN: + case UP: + d = Math.abs(d1) > 0 ? getSign(d1) * 261817 + 261816 * ((int)d1 - 1): 0; + break; + case NORTH: + case SOUTH: + d = Math.abs(d1) > 0 ? getSign(d1) * 261817 + 261816 * ((int)d1 - 1): 0; + break; + case WEST: + case EAST: + d = Math.abs(d2) > 0 ? getSign(d2) * 261817 + 261816 * ((int)d2 - 1): 0; + break; + } + + return origU - d; + } + + private int getDeltaV(int origV, float[] delta, EnumFacing facing, int corner) { + int d = 0; + float d1 = delta[1]; + float d2 = delta[2]; + int sign = getSign(d1); + int sign2 = getSign(d2); + switch (facing) { + case DOWN: + case UP: + d = Math.abs(d2) > 1 ? ((sign2 == -1 && corner != 0 && corner != 1) ? sign2: 0) * 261817 + 261816 * ((int)d2 - 1): 0; + break; + case NORTH: + case SOUTH: + case WEST: + case EAST: + d = Math.abs(d1) >= 0 ? ((sign != -1 && (corner == 0 || corner == 3)) ? 261816 * 2: (sign == -1 && (corner == 1 || corner == 2)) ? 261816 / ((int)Math.abs(d1)): 0): 0; + break; + } + if (facing == EnumFacing.EAST) System.out.println("D:" + d + "; " + d1 + "; s:" + sign + "; c:" + corner + "; m:" + ((int)d1 - sign)); + + return origV - d; + }*/ + + @Override + public List getFaceQuads(EnumFacing side) { + List allFaceQuads = new LinkedList(); + + for (BakedQuad quad: quads) { + if (FaceBakery.getFacingFromVertexData(quad.getVertexData()) == side) { + allFaceQuads.add(quad); + } + } + + return allFaceQuads; + } + + @Override + public List getGeneralQuads() { + return new LinkedList(quads); + } + + @Override + public boolean isAmbientOcclusion() { + return false; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean isBuiltInRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleTexture() { + return normalSprite; + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() { + return ItemCameraTransforms.DEFAULT; + } + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/client/BakedEmitterBlockModel.java b/src/main/java/vswe/stevesfactory/blocks/client/BakedEmitterBlockModel.java new file mode 100644 index 000000000..b5936a530 --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/client/BakedEmitterBlockModel.java @@ -0,0 +1,208 @@ +package vswe.stevesfactory.blocks.client; + +import com.google.common.base.Function; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.model.IBakedModel; +import net.minecraft.client.resources.model.ModelRotation; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IFlexibleBakedModel; +import net.minecraftforge.client.model.ISmartBlockModel; +import net.minecraftforge.common.property.IExtendedBlockState; +import org.lwjgl.util.vector.Vector3f; +import vswe.stevesfactory.blocks.BlockCableOutput; + +import java.util.LinkedList; +import java.util.List; + +enum SideQuad { + STRONG, + WEAK, + IDLE +} + + +//Needed to render all the sides individually, if they where made with JSON it would be a huge amount of files, the new format is not good for dynamic and advanced blocks +public class BakedEmitterBlockModel implements IFlexibleBakedModel, ISmartBlockModel { + + private VertexFormat format; + private TextureAtlasSprite strongSprite; + private TextureAtlasSprite weakSprite; + private TextureAtlasSprite idleSprite; + + private BakedQuad[] strongQuads = new BakedQuad[EnumFacing.values().length]; + private BakedQuad[] weakQuads = new BakedQuad[EnumFacing.values().length]; + private BakedQuad[] idleQuads = new BakedQuad[EnumFacing.values().length]; + + public BakedEmitterBlockModel(VertexFormat format, Function bakedTextureGetter) { + + this.format = format; + + FaceBakery faceBakery = new FaceBakery(); + BlockFaceUV bfUV = new BlockFaceUV(new float[]{0, 0, 16, 16}, 0); + strongSprite = bakedTextureGetter.apply(EmitterBlockModel.STRONG); + weakSprite = bakedTextureGetter.apply(EmitterBlockModel.WEAK); + idleSprite = bakedTextureGetter.apply(EmitterBlockModel.IDLE); + + Vector3f v1 = new Vector3f(0, 0, 0); + Vector3f v2 = new Vector3f(16, 16, 16); + + for (EnumFacing facing: EnumFacing.values()) { + strongQuads[facing.getIndex()] = faceBakery.makeBakedQuad(v1, v2, new BlockPartFace(facing, -1, "stevesfactorymanager:blocks/cable_output_strong", bfUV), strongSprite, facing, ModelRotation.X0_Y0, null, false, true); + weakQuads[facing.getIndex()] = faceBakery.makeBakedQuad(v1, v2, new BlockPartFace(facing, -1, "stevesfactorymanager:blocks/cable_weak_strong", bfUV), weakSprite, facing, ModelRotation.X0_Y0, null, false, true); + idleQuads[facing.getIndex()] = faceBakery.makeBakedQuad(v1, v2, new BlockPartFace(facing, -1, "stevesfactorymanager:blocks/cable_idle", bfUV), idleSprite, facing, ModelRotation.X0_Y0, null, false, true); + } + } + + @Override + public List getFaceQuads(EnumFacing side) { + //This should never be called! The handleBlockState returns an AssembledBakedModel + throw new UnsupportedOperationException(); + } + + @Override + public List getGeneralQuads() { + //This should never be called! The handleBlockState returns an AssembledBakedModel + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean isBuiltInRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleTexture() { + return idleSprite; + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() { + return ItemCameraTransforms.DEFAULT; + } + + @Override + public VertexFormat getFormat() { + return format; + } + + @Override + public IBakedModel handleBlockState(IBlockState state) { + + if (state instanceof IExtendedBlockState) { + IExtendedBlockState blockState = (IExtendedBlockState) state; + return new AssembledBakedModel(blockState); + } + + return new AssembledBakedModel(); + } + + //Apparently it needs to be separate because it could be overridden my another thread as rendering is multithreaded + //https://github.com/TheGreyGhost/MinecraftByExample/blob/master/src/main/java/minecraftbyexample/mbe05_block_smartblockmodel2/CompositeModel.java + public class AssembledBakedModel implements IBakedModel + { + + private SideQuad[] sideQuads = new SideQuad[EnumFacing.values().length]; + + public AssembledBakedModel(IExtendedBlockState blockState) { + Object obj = blockState.getValue(BlockCableOutput.STRONG_SIDES); + + if (obj != null) { + + int strongVals = blockState.getValue(BlockCableOutput.STRONG_SIDES); + int weakVals = blockState.getValue(BlockCableOutput.WEAK_SIDES); + + for (EnumFacing facing: EnumFacing.values()) { + if ((strongVals & (1 << facing.getIndex())) >> facing.getIndex() == 1) { + sideQuads[facing.getIndex()] = SideQuad.STRONG; + } else if ((weakVals & (1 << facing.getIndex())) >> facing.getIndex() == 1) { + sideQuads[facing.getIndex()] = SideQuad.WEAK; + } else { + sideQuads[facing.getIndex()] = SideQuad.IDLE; + } + } + } else { + for (int i = 0; i < 6; i++) { + sideQuads[i] = SideQuad.IDLE; + } + } + } + + public AssembledBakedModel() { + for (int i = 0; i < 6; i++) { + sideQuads[i] = SideQuad.IDLE; + } + } + + private BakedQuad getQuadFromSide(SideQuad sideQuad, EnumFacing facing) { + switch (sideQuad) { + case STRONG: + return strongQuads[facing.getIndex()]; + case WEAK: + return weakQuads[facing.getIndex()]; + case IDLE: + default: + return idleQuads[facing.getIndex()]; + } + } + + @Override + public List getFaceQuads(EnumFacing side) { + List allFaceQuads = new LinkedList(); + + allFaceQuads.add(getQuadFromSide(sideQuads[side.getIndex()], side)); + + return allFaceQuads; + } + + @Override + public List getGeneralQuads() { + List allQuads = new LinkedList(); + + for (EnumFacing facing: EnumFacing.values()) { + allQuads.add(getQuadFromSide(sideQuads[facing.getIndex()], facing)); + } + + return allQuads; + } + + @Override + public boolean isAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean isBuiltInRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleTexture() { + return idleSprite; + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() { + return ItemCameraTransforms.DEFAULT; + } + + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/client/CamouflageBlockModel.java b/src/main/java/vswe/stevesfactory/blocks/client/CamouflageBlockModel.java new file mode 100644 index 000000000..53d5f957d --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/client/CamouflageBlockModel.java @@ -0,0 +1,55 @@ +package vswe.stevesfactory.blocks.client; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IFlexibleBakedModel; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.IModelState; + +import java.util.Collection; + +public class CamouflageBlockModel implements IModel { + + public static final ResourceLocation MODEL = new ResourceLocation("stevesfactorymanager:block/cable_camouflage"); + public static final ResourceLocation MODEL_CLUSTER = new ResourceLocation("stevesfactorymanager:block/cable_cluster"); + public static final ResourceLocation MODEL_CLUSTER_ADV = new ResourceLocation("stevesfactorymanager:block/cable_cluster_advanced"); + + public static final ResourceLocation NORMAL = new ResourceLocation("stevesfactorymanager:blocks/cable_camo"); + public static final ResourceLocation INSIDE = new ResourceLocation("stevesfactorymanager:blocks/cable_camo_inside"); + public static final ResourceLocation TRANSFORM = new ResourceLocation("stevesfactorymanager:blocks/cable_camo_shape"); + + public static final ResourceLocation CL_SIDE = new ResourceLocation("stevesfactorymanager:blocks/cable_cluster_front"); + public static final ResourceLocation CL_ADV_SIDE = new ResourceLocation("stevesfactorymanager:blocks/cable_cluster_adv"); + public static final ResourceLocation CL_FRONT = new ResourceLocation("stevesfactorymanager:blocks/cable_cluster_front"); + public static final ResourceLocation CL_ADV_FRONT = new ResourceLocation("stevesfactorymanager:blocks/cable_cluster_adv_front"); + + private boolean isCamouflage; + + public CamouflageBlockModel(IResourceManager resourceManager, boolean isCamouflage) { + this.isCamouflage = isCamouflage; + } + + @Override + public Collection getDependencies() { + return isCamouflage ? ImmutableList.copyOf(new ResourceLocation[]{MODEL}): ImmutableList.copyOf(new ResourceLocation[]{MODEL, MODEL_CLUSTER, MODEL_CLUSTER_ADV}); + } + + @Override + public Collection getTextures() { + return isCamouflage ? ImmutableList.copyOf(new ResourceLocation[]{NORMAL, INSIDE, TRANSFORM}): ImmutableList.copyOf(new ResourceLocation[]{NORMAL, INSIDE, TRANSFORM, CL_SIDE, CL_FRONT, CL_ADV_SIDE, CL_ADV_FRONT}); + } + + @Override + public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function bakedTextureGetter) { + return new BakedCamouflageBlockModel(state, format, bakedTextureGetter, isCamouflage); + } + + @Override + public IModelState getDefaultState() { + return null; + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/client/EmitterBlockModel.java b/src/main/java/vswe/stevesfactory/blocks/client/EmitterBlockModel.java new file mode 100644 index 000000000..5f4e701dd --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/client/EmitterBlockModel.java @@ -0,0 +1,47 @@ +package vswe.stevesfactory.blocks.client; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IFlexibleBakedModel; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.IModelState; + +import java.util.Collection; + +public class EmitterBlockModel implements IModel{ + + public EmitterBlockModel(IResourceManager resourceManager) { + + } + + public static final ResourceLocation EMITTER_MODEL = new ResourceLocation("stevesfactorymanager:block/cable_emitter"); + + public static final ResourceLocation STRONG = new ResourceLocation("stevesfactorymanager:blocks/cable_output_strong"); + public static final ResourceLocation WEAK = new ResourceLocation("stevesfactorymanager:blocks/cable_output_weak"); + public static final ResourceLocation IDLE = new ResourceLocation("stevesfactorymanager:blocks/cable_idle"); + + @Override + public Collection getDependencies() { + return ImmutableList.copyOf(new ResourceLocation[]{EMITTER_MODEL}); + } + + @Override + public Collection getTextures() { + return ImmutableList.copyOf(new ResourceLocation[]{STRONG, WEAK, IDLE}); + } + + @Override + public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function bakedTextureGetter) { + + return new BakedEmitterBlockModel(format, bakedTextureGetter); + } + + @Override + public IModelState getDefaultState() { + return null; + } +} diff --git a/src/main/java/vswe/stevesfactory/blocks/client/ModelLoader.java b/src/main/java/vswe/stevesfactory/blocks/client/ModelLoader.java new file mode 100644 index 000000000..058d31a11 --- /dev/null +++ b/src/main/java/vswe/stevesfactory/blocks/client/ModelLoader.java @@ -0,0 +1,35 @@ +package vswe.stevesfactory.blocks.client; + +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.ICustomModelLoader; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import vswe.stevesfactory.StevesFactoryManager; + +public class ModelLoader implements ICustomModelLoader { + + private IResourceManager resourceManager; + + @Override + public boolean accepts(ResourceLocation modelLocation) { + return modelLocation.getResourceDomain().equals(StevesFactoryManager.MODID.toLowerCase()) && modelLocation.getResourcePath().startsWith("models/block/builtin/"); + } + + @Override + public IModel loadModel(ResourceLocation modelLocation) { + String model = modelLocation.getResourcePath().substring("models/block/builtin/".length()); + if (model.equals("cable_emitter")) { + return new EmitterBlockModel(resourceManager); + } else if(model.equals("cable_camouflage") || model.equals("cable_cluster")) { + return new CamouflageBlockModel(resourceManager, model.equals("cable_camouflage")); + } else { + return ModelLoaderRegistry.getMissingModel(); + } + } + + @Override + public void onResourceManagerReload(IResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/src/main/java/vswe/stevesfactory/components/CheckBoxList.java b/src/main/java/vswe/stevesfactory/components/CheckBoxList.java index f6d85b6aa..223173592 100644 --- a/src/main/java/vswe/stevesfactory/components/CheckBoxList.java +++ b/src/main/java/vswe/stevesfactory/components/CheckBoxList.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/CommandExecutor.java b/src/main/java/vswe/stevesfactory/components/CommandExecutor.java index 01ba59e2a..95a635820 100644 --- a/src/main/java/vswe/stevesfactory/components/CommandExecutor.java +++ b/src/main/java/vswe/stevesfactory/components/CommandExecutor.java @@ -5,7 +5,7 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumFacing; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; @@ -23,7 +23,7 @@ public class CommandExecutor { List itemBuffer; List craftingBufferHigh; List craftingBufferLow; - List liquidBuffer; + List fluidBuffer; private List usedCommands; public static final int MAX_FLUID_TRANSFER = 10000000; @@ -34,17 +34,17 @@ public CommandExecutor(TileEntityManager manager) { itemBuffer = new ArrayList(); craftingBufferHigh = new ArrayList(); craftingBufferLow = new ArrayList(); - liquidBuffer = new ArrayList(); + fluidBuffer = new ArrayList(); usedCommands = new ArrayList(); } - private CommandExecutor(TileEntityManager manager, List itemBufferSplit, List craftingBufferHighSplit, List craftingBufferLowSplit, List liquidBufferSplit, List usedCommandCopy) { + private CommandExecutor(TileEntityManager manager, List itemBufferSplit, List craftingBufferHighSplit, List craftingBufferLowSplit, List fluidBufferSplit, List usedCommandCopy) { this.manager = manager; this.itemBuffer = itemBufferSplit; this.craftingBufferHigh = craftingBufferHighSplit; this.craftingBufferLow = craftingBufferLowSplit; this.usedCommands = usedCommandCopy; - this.liquidBuffer = liquidBufferSplit; + this.fluidBuffer = fluidBufferSplit; } public void executeTriggerCommand(FlowComponent command, EnumSet validTriggerOutputs) { @@ -105,21 +105,21 @@ private void executeCommand(FlowComponent command, int connectionId) { } } return; - case LIQUID_INPUT: + case FLUID_INPUT: List inputTank = getTanks(command.getMenus().get(0)); if (inputTank != null) { getValidTanks(command.getMenus().get(1), inputTank); - getLiquids(command.getMenus().get(2), inputTank); + getFluids(command.getMenus().get(2), inputTank); } break; - case LIQUID_OUTPUT: + case FLUID_OUTPUT: List outputTank = getTanks(command.getMenus().get(0)); if (outputTank != null) { getValidTanks(command.getMenus().get(1), outputTank); - insertLiquids(command.getMenus().get(2), outputTank); + insertFluids(command.getMenus().get(2), outputTank); } break; - case LIQUID_CONDITION: + case FLUID_CONDITION: List conditionTank = getTanks(command.getMenus().get(0)); if (conditionTank != null) { getValidTanks(command.getMenus().get(1), conditionTank); @@ -205,7 +205,7 @@ private void executeCommand(FlowComponent command, int connectionId) { ItemStack itemStack = items.isFirstRadioButtonSelected() ? null : ((ItemSetting)items.getSettings().get(0)).getItem(); for (SlotInventoryHolder slotInventoryHolder : camouflage) { slotInventoryHolder.getCamouflage().setBounds(shape); - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { if (sides.isSideRequired(i)) { slotInventoryHolder.getCamouflage().setItem(itemStack, i, inside.getCurrentType()); } @@ -314,7 +314,7 @@ private static void addContainer(List inventories, List lst, TileEntity te) { for (SlotInventoryHolder slotInventoryHolder : lst) { - if (slotInventoryHolder.getTile().xCoord == te.xCoord && slotInventoryHolder.getTile().yCoord == te.yCoord && slotInventoryHolder.getTile().zCoord == te.zCoord && slotInventoryHolder.getTile().getClass().equals(te.getClass())) { + if (slotInventoryHolder.getTile().getPos().getX() == te.getPos().getX() && slotInventoryHolder.getTile().getPos().getY() == te.getPos().getY() && slotInventoryHolder.getTile().getPos().getZ() == te.getPos().getZ() && slotInventoryHolder.getTile().getClass().equals(te.getClass())) { return true; } } @@ -332,7 +332,7 @@ private void getValidSlots(ComponentMenu componentMenu, List tanks) { + private void getFluids(ComponentMenu componentMenu, List tanks) { for (SlotInventoryHolder tank : tanks) { ComponentMenuStuff menuItem = (ComponentMenuStuff)componentMenu; if (tank.getTank() instanceof TileEntityCreative) { if (menuItem.useWhiteList()) { for (SlotSideTarget slot : tank.getValidSlots().values()) { for (Setting setting : menuItem.getSettings()) { - Fluid fluid = ((LiquidSetting)setting).getFluid(); + Fluid fluid = ((FluidSetting)setting).getFluid(); if (fluid != null) { - FluidStack liquid = new FluidStack(fluid, setting.isLimitedByAmount() ? setting.getAmount() : setting.getDefaultAmount()); + FluidStack fluidStack = new FluidStack(fluid, setting.isLimitedByAmount() ? setting.getAmount() : setting.getDefaultAmount()); - if (liquid != null) { - addLiquidToBuffer(menuItem, tank, setting, liquid, 0); + if (fluidStack != null) { + addFluidToBuffer(menuItem, tank, setting, fluidStack, 0); } } } @@ -510,7 +510,7 @@ private void getLiquids(ComponentMenu componentMenu, List t for (SlotSideTarget slot : tank.getValidSlots().values()) { List tankInfos = new ArrayList(); for (int side : slot.getSides()) { - FluidTankInfo[] currentTankInfos = tank.getTank().getTankInfo(ForgeDirection.VALID_DIRECTIONS[side]); + FluidTankInfo[] currentTankInfos = tank.getTank().getTankInfo(EnumFacing.getFront(side)); if (currentTankInfos == null) { continue; } @@ -538,11 +538,11 @@ private void getLiquids(ComponentMenu componentMenu, List t fluidStack = fluidStack.copy(); - Setting setting = isLiquidValid(componentMenu, fluidStack); - addLiquidToBuffer(menuItem, tank, setting, fluidStack, side); + Setting setting = isFluidValid(componentMenu, fluidStack); + addFluidToBuffer(menuItem, tank, setting, fluidStack, side); } - for (FluidTankInfo fluidTankInfo : tank.getTank().getTankInfo(ForgeDirection.VALID_DIRECTIONS[side])) { + for (FluidTankInfo fluidTankInfo : tank.getTank().getTankInfo(EnumFacing.getFront(side))) { if (fluidTankInfo != null) { tankInfos.add(fluidTankInfo); } @@ -554,22 +554,22 @@ private void getLiquids(ComponentMenu componentMenu, List t } - private void addLiquidToBuffer(ComponentMenuStuff menuItem, SlotInventoryHolder tank, Setting setting, FluidStack fluidStack, int side) { + private void addFluidToBuffer(ComponentMenuStuff menuItem, SlotInventoryHolder tank, Setting setting, FluidStack fluidStack, int side) { if ((menuItem.useWhiteList() == (setting != null)) || (setting != null && setting.isLimitedByAmount())) { FlowComponent owner = menuItem.getParent(); - StackTankHolder target = new StackTankHolder(fluidStack, tank.getTank(), ForgeDirection.VALID_DIRECTIONS[side]); + StackTankHolder target = new StackTankHolder(fluidStack, tank.getTank(), EnumFacing.getFront(side)); boolean added = false; - for (LiquidBufferElement liquidBufferElement : liquidBuffer) { - if (liquidBufferElement.addTarget(owner, setting, tank, target)) { + for (FluidBufferElement fluidBufferElement : fluidBuffer) { + if (fluidBufferElement.addTarget(owner, setting, tank, target)) { added = true; break; } } if (!added) { - LiquidBufferElement itemBufferElement = new LiquidBufferElement(owner, setting, tank, menuItem.useWhiteList(), target); - liquidBuffer.add(itemBufferElement); + FluidBufferElement itemBufferElement = new FluidBufferElement(owner, setting, tank, menuItem.useWhiteList(), target); + fluidBuffer.add(itemBufferElement); } } @@ -587,13 +587,13 @@ private Setting isItemValid(ComponentMenu componentMenu, ItemStack itemStack) { return null; } - private Setting isLiquidValid(ComponentMenu componentMenu, FluidStack fluidStack) { + private Setting isFluidValid(ComponentMenu componentMenu, FluidStack fluidStack) { ComponentMenuStuff menuItem = (ComponentMenuStuff)componentMenu; if (fluidStack != null) { - int fluidId = fluidStack.fluidID; + String fluidName = fluidStack.getFluid().getName(); for (Setting setting : menuItem.getSettings()) { - if (setting.isValid() && ((LiquidSetting)setting).getLiquidId() == fluidId) { + if (setting.isValid() && ((FluidSetting)setting).getFluidName().equals(fluidName)) { return setting; } } @@ -703,43 +703,43 @@ private void insertItemsFromInputBufferElement(ComponentMenuStuff menuItem, List } - private void insertLiquids(ComponentMenu componentMenu, List tanks) { + private void insertFluids(ComponentMenu componentMenu, List tanks) { ComponentMenuStuff menuItem = (ComponentMenuStuff)componentMenu; - List outputCounters = new ArrayList(); + List outputCounters = new ArrayList(); for (SlotInventoryHolder tankHolder : tanks) { if (!tankHolder.isShared()) { outputCounters.clear(); } IFluidHandler tank = tankHolder.getTank(); - Iterator bufferIterator = liquidBuffer.iterator(); + Iterator bufferIterator = fluidBuffer.iterator(); while(bufferIterator.hasNext()) { - LiquidBufferElement liquidBufferElement = bufferIterator.next(); + FluidBufferElement fluidBufferElement = bufferIterator.next(); - Iterator liquidIterator = liquidBufferElement.getHolders().iterator(); - while (liquidIterator.hasNext()) { - StackTankHolder holder = liquidIterator.next(); + Iterator fluidIterator = fluidBufferElement.getHolders().iterator(); + while (fluidIterator.hasNext()) { + StackTankHolder holder = fluidIterator.next(); FluidStack fluidStack = holder.getFluidStack(); - Setting setting = isLiquidValid(componentMenu, fluidStack); + Setting setting = isFluidValid(componentMenu, fluidStack); if ((menuItem.useWhiteList() == (setting == null)) && (setting == null || !setting.isLimitedByAmount())) { continue; } - OutputLiquidCounter outputLiquidCounter = null; - for (OutputLiquidCounter e : outputCounters) { + OutputFluidCounter outputFluidCounter = null; + for (OutputFluidCounter e : outputCounters) { if (e.areSettingsSame(setting)) { - outputLiquidCounter = e; + outputFluidCounter = e; break; } } - if (outputLiquidCounter == null) { - outputLiquidCounter = new OutputLiquidCounter(liquidBuffer, tanks, tankHolder, setting, menuItem.useWhiteList()); - outputCounters.add(outputLiquidCounter); + if (outputFluidCounter == null) { + outputFluidCounter = new OutputFluidCounter(fluidBuffer, tanks, tankHolder, setting, menuItem.useWhiteList()); + outputCounters.add(outputFluidCounter); } for (SlotSideTarget slot : tankHolder.getValidSlots().values()) { @@ -747,9 +747,9 @@ private void insertLiquids(ComponentMenu componentMenu, List 0) { FluidStack resource = fluidStack.copy(); @@ -757,12 +757,12 @@ private void insertLiquids(ComponentMenu componentMenu, List 0) { - tank.fill(ForgeDirection.VALID_DIRECTIONS[side], resource, true); - liquidBufferElement.decreaseStackSize(resource.amount); - outputLiquidCounter.modifyStackSize(resource.amount); + tank.fill(EnumFacing.getFront(side), resource, true); + fluidBufferElement.decreaseStackSize(resource.amount); + outputFluidCounter.modifyStackSize(resource.amount); holder.reduceAmount(resource.amount); if (holder.getSizeLeft() == 0) { - liquidIterator.remove(); + fluidIterator.remove(); break; } } @@ -779,18 +779,18 @@ private void insertLiquids(ComponentMenu componentMenu, List inventories, boolean useLiquids) { + private boolean searchForStuff(ComponentMenu componentMenu, List inventories, boolean useFluids) { if (inventories.get(0).isShared()) { Map conditionSettingCheckerMap = new HashMap(); for (int i = 0; i < inventories.size(); i++) { - calculateConditionData(componentMenu, inventories.get(i), conditionSettingCheckerMap, useLiquids); + calculateConditionData(componentMenu, inventories.get(i), conditionSettingCheckerMap, useFluids); } return checkConditionResult(componentMenu, conditionSettingCheckerMap); }else{ boolean useAnd = inventories.get(0).getSharedOption() == 1; for (int i = 0; i < inventories.size(); i++) { Map conditionSettingCheckerMap = new HashMap(); - calculateConditionData(componentMenu, inventories.get(i), conditionSettingCheckerMap, useLiquids); + calculateConditionData(componentMenu, inventories.get(i), conditionSettingCheckerMap, useFluids); if (checkConditionResult(componentMenu, conditionSettingCheckerMap)) { if (!useAnd) { @@ -804,9 +804,9 @@ private boolean searchForStuff(ComponentMenu componentMenu, List conditionSettingCheckerMap, boolean useLiquid) { - if (useLiquid) { - calculateConditionDataLiquid(componentMenu, inventoryHolder, conditionSettingCheckerMap); + private void calculateConditionData(ComponentMenu componentMenu, SlotInventoryHolder inventoryHolder, Map conditionSettingCheckerMap, boolean useFluids) { + if (useFluids) { + calculateConditionDataFluid(componentMenu, inventoryHolder, conditionSettingCheckerMap); }else{ calculateConditionDataItem(componentMenu, inventoryHolder, conditionSettingCheckerMap); } @@ -831,11 +831,11 @@ private void calculateConditionDataItem(ComponentMenu componentMenu, SlotInvento } } - private void calculateConditionDataLiquid(ComponentMenu componentMenu, SlotInventoryHolder tank, Map conditionSettingCheckerMap) { + private void calculateConditionDataFluid(ComponentMenu componentMenu, SlotInventoryHolder tank, Map conditionSettingCheckerMap) { for (SlotSideTarget slot : tank.getValidSlots().values()) { List tankInfos = new ArrayList(); for (int side : slot.getSides()) { - FluidTankInfo[] currentTankInfos = tank.getTank().getTankInfo(ForgeDirection.VALID_DIRECTIONS[side]); + FluidTankInfo[] currentTankInfos = tank.getTank().getTankInfo(EnumFacing.getFront(side)); if (currentTankInfos == null) { continue; } @@ -855,7 +855,7 @@ private void calculateConditionDataLiquid(ComponentMenu componentMenu, SlotInven } FluidStack fluidStack = fluidTankInfo.fluid; - Setting setting = isLiquidValid(componentMenu, fluidStack); + Setting setting = isFluidValid(componentMenu, fluidStack); if (setting != null) { ConditionSettingChecker conditionSettingChecker = conditionSettingCheckerMap.get(setting.getId()); if (conditionSettingChecker == null) { @@ -864,7 +864,7 @@ private void calculateConditionDataLiquid(ComponentMenu componentMenu, SlotInven conditionSettingChecker.addCount(fluidStack.amount); } } - for (FluidTankInfo fluidTankInfo : tank.getTank().getTankInfo(ForgeDirection.VALID_DIRECTIONS[side])) { + for (FluidTankInfo fluidTankInfo : tank.getTank().getTankInfo(EnumFacing.getFront(side))) { if (fluidTankInfo != null) { tankInfos.add(fluidTankInfo); } @@ -918,14 +918,14 @@ private boolean splitFlow(ComponentMenu componentMenu) { Connection connection = componentMenu.getParent().getConnection(i); if (!connectionOption.isInput() && connection != null) { List itemBufferSplit = new ArrayList(); - List liquidBufferSplit = new ArrayList(); + List fluidBufferSplit = new ArrayList(); for (ItemBufferElement element : itemBuffer) { itemBufferSplit.add(element.getSplitElement(amount, usedId, split.useFair())); } - for (LiquidBufferElement element : liquidBuffer) { - liquidBufferSplit.add(element.getSplitElement(amount, usedId, split.useFair())); + for (FluidBufferElement element : fluidBuffer) { + fluidBufferSplit.add(element.getSplitElement(amount, usedId, split.useFair())); } List usedCommandCopy = new ArrayList(); @@ -933,7 +933,7 @@ private boolean splitFlow(ComponentMenu componentMenu) { usedCommandCopy.add(usedCommand); } - CommandExecutor newExecutor = new CommandExecutor(manager, itemBufferSplit, new ArrayList(craftingBufferHigh), new ArrayList(craftingBufferLow), liquidBufferSplit, usedCommandCopy); + CommandExecutor newExecutor = new CommandExecutor(manager, itemBufferSplit, new ArrayList(craftingBufferHigh), new ArrayList(craftingBufferLow), fluidBufferSplit, usedCommandCopy); newExecutor.executeCommand(manager.getFlowItems().get(connection.getComponentId()), connection.getConnectionId()); usedId++; } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenu.java b/src/main/java/vswe/stevesfactory/components/ComponentMenu.java index 84540dfb1..7d4521ed5 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenu.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenu.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; import vswe.stevesfactory.network.DataReader; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageAdvanced.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageAdvanced.java index b317f917a..d77ed392c 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageAdvanced.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageAdvanced.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageInside.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageInside.java index d0d025b03..0e2ca273f 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageInside.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageInside.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageItems.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageItems.java index d40d761cf..a2e8969cc 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageItems.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageItems.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageShape.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageShape.java index 17e25e4f5..755765c34 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageShape.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCamouflageShape.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainer.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainer.java index cd76f502a..4e42d6a04 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainer.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainer.java @@ -1,33 +1,25 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IChatComponent; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.ConnectionBlock; import vswe.stevesfactory.blocks.ConnectionBlockType; import vswe.stevesfactory.blocks.TileEntityManager; -import vswe.stevesfactory.interfaces.Color; -import vswe.stevesfactory.interfaces.ContainerManager; -import vswe.stevesfactory.interfaces.GuiBase; -import vswe.stevesfactory.interfaces.GuiManager; -import vswe.stevesfactory.interfaces.IAdvancedTooltip; +import vswe.stevesfactory.interfaces.*; import vswe.stevesfactory.network.DataBitHelper; import vswe.stevesfactory.network.DataReader; import vswe.stevesfactory.network.DataWriter; @@ -190,18 +182,18 @@ class ToolTip implements IAdvancedTooltip { @SideOnly(Side.CLIENT) public ToolTip(GuiManager gui, ConnectionBlock block) { - items = new ItemStack[ForgeDirection.VALID_DIRECTIONS.length]; - itemTexts = new List[ForgeDirection.VALID_DIRECTIONS.length]; + items = new ItemStack[EnumFacing.values().length]; + itemTexts = new List[EnumFacing.values().length]; - World world = block.getTileEntity().getWorldObj(); - int x = block.getTileEntity().xCoord; - int y = block.getTileEntity().yCoord; - int z = block.getTileEntity().zCoord; + World world = block.getTileEntity().getWorld(); + int x = block.getTileEntity().getPos().getX(); + int y = block.getTileEntity().getPos().getY(); + int z = block.getTileEntity().getPos().getZ(); - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - int targetX = x + direction.offsetX; - int targetY = y + direction.offsetY; - int targetZ = z + direction.offsetZ; + for (EnumFacing direction : EnumFacing.values()) { + int targetX = x + direction.getFrontOffsetX(); + int targetY = y + direction.getFrontOffsetY(); + int targetZ = z + direction.getFrontOffsetZ(); ItemStack item = gui.getItemStackFromBlock(world, targetX, targetY, targetZ); items[direction.ordinal()] = item; @@ -210,15 +202,15 @@ public ToolTip(GuiManager gui, ConnectionBlock block) { if (item != null && item.getItem() != null) { text.add(gui.getItemName(item)); } - String side = Localization.getForgeDirectionLocalization(direction.ordinal()).toString(); + String side = Localization.getDirectionLocalization(direction).toString(); text.add(Color.YELLOW + side); - TileEntity te = world.getTileEntity(targetX, targetY, targetZ); + TileEntity te = world.getTileEntity(new BlockPos(targetX, targetY, targetZ)); if (te instanceof TileEntitySign) { TileEntitySign sign = (TileEntitySign)te; - for (String txt : sign.signText) { - if (!txt.isEmpty()) { - text.add(Color.GRAY + txt); + for (IChatComponent txt : sign.signText) { + if (!txt.getFormattedText().isEmpty()) { + text.add(Color.GRAY + txt.getFormattedText()); } } } @@ -256,8 +248,8 @@ public int getExtraHeight(GuiBase gui) { private static final int SRC_Y = 20; @SideOnly(Side.CLIENT) - private void drawBlock(GuiBase gui, int x, int y, int mX, int mY, ForgeDirection direction) { - GL11.glColor4f(1, 1, 1, 1); + private void drawBlock(GuiBase gui, int x, int y, int mX, int mY, EnumFacing direction) { + GlStateManager.color(1, 1, 1, 1); GuiBase.bindTexture(gui.getComponentResource()); gui.drawTexture(x, y, SRC_X, SRC_Y + (CollisionHelper.inBounds(x, y, 16, 16, mX, mY) ? 16 : 0), 16, 16); @@ -269,7 +261,7 @@ private void drawBlock(GuiBase gui, int x, int y, int mX, int mY, ForgeDirection } @SideOnly(Side.CLIENT) - private boolean drawBlockMouseOver(GuiBase gui, int x, int y, int mX, int mY, ForgeDirection direction) { + private boolean drawBlockMouseOver(GuiBase gui, int x, int y, int mX, int mY, EnumFacing direction) { if (CollisionHelper.inBounds(x, y, 16, 16, mX, mY)) { List itemText = itemTexts[direction.ordinal()]; if (itemText != null) { @@ -285,25 +277,25 @@ private boolean drawBlockMouseOver(GuiBase gui, int x, int y, int mX, int mY, Fo @SideOnly(Side.CLIENT) @Override public void drawContent(GuiBase gui, int x, int y, int mX, int mY) { - drawBlock(gui, x + 25, y + 5, mX, mY, ForgeDirection.NORTH); - drawBlock(gui, x + 5, y + 25, mX, mY, ForgeDirection.WEST); - drawBlock(gui, x + 25, y + 45, mX, mY, ForgeDirection.SOUTH); - drawBlock(gui, x + 45, y + 25, mX, mY, ForgeDirection.EAST); + drawBlock(gui, x + 25, y + 5, mX, mY, EnumFacing.NORTH); + drawBlock(gui, x + 5, y + 25, mX, mY, EnumFacing.WEST); + drawBlock(gui, x + 25, y + 45, mX, mY, EnumFacing.SOUTH); + drawBlock(gui, x + 45, y + 25, mX, mY, EnumFacing.EAST); - drawBlock(gui, x + 80, y + 15, mX, mY, ForgeDirection.UP); - drawBlock(gui, x + 80, y + 35, mX, mY, ForgeDirection.DOWN); + drawBlock(gui, x + 80, y + 15, mX, mY, EnumFacing.UP); + drawBlock(gui, x + 80, y + 35, mX, mY, EnumFacing.DOWN); } @SideOnly(Side.CLIENT) private void drawMouseOverMouseOver(GuiBase gui, int x, int y, int mX, int mY) { boolean ignored = - drawBlockMouseOver(gui, x + 25, y + 5, mX, mY, ForgeDirection.NORTH) || - drawBlockMouseOver(gui, x + 5, y + 25, mX, mY, ForgeDirection.WEST) || - drawBlockMouseOver(gui, x + 25, y + 45, mX, mY, ForgeDirection.SOUTH) || - drawBlockMouseOver(gui, x + 45, y + 25, mX, mY, ForgeDirection.EAST) || + drawBlockMouseOver(gui, x + 25, y + 5, mX, mY, EnumFacing.NORTH) || + drawBlockMouseOver(gui, x + 5, y + 25, mX, mY, EnumFacing.WEST) || + drawBlockMouseOver(gui, x + 25, y + 45, mX, mY, EnumFacing.SOUTH) || + drawBlockMouseOver(gui, x + 45, y + 25, mX, mY, EnumFacing.EAST) || - drawBlockMouseOver(gui, x + 80, y + 15, mX, mY, ForgeDirection.UP) || - drawBlockMouseOver(gui, x + 80, y + 35, mX, mY, ForgeDirection.DOWN); + drawBlockMouseOver(gui, x + 80, y + 15, mX, mY, EnumFacing.UP) || + drawBlockMouseOver(gui, x + 80, y + 35, mX, mY, EnumFacing.DOWN); } @SideOnly(Side.CLIENT) @@ -573,9 +565,9 @@ public void drawMouseOver(GuiManager gui, int mX, int mY) { if (CollisionHelper.inBounds(5, 60, MENU_WIDTH - 20, 5, mX, mY)) { String str = Localization.ABSOLUTE_RANGES.toString() + ":"; - str += "\n" + Localization.X.toString() + " (" + (filter.lowerRange[0].getNumber() + getParent().getManager().xCoord) + ", " + (filter.higherRange[0].getNumber() + getParent().getManager().xCoord) + ")"; - str += "\n" + Localization.Y.toString() + " (" + (filter.lowerRange[1].getNumber() + getParent().getManager().yCoord) + ", " + (filter.higherRange[1].getNumber() + getParent().getManager().yCoord) + ")"; - str += "\n" + Localization.Z.toString() + " (" + (filter.lowerRange[2].getNumber() + getParent().getManager().zCoord) + ", " + (filter.higherRange[2].getNumber() + getParent().getManager().zCoord) + ")"; + str += "\n" + Localization.X.toString() + " (" + (filter.lowerRange[0].getNumber() + getParent().getManager().getPos().getX()) + ", " + (filter.higherRange[0].getNumber() + getParent().getManager().getPos().getX()) + ")"; + str += "\n" + Localization.Y.toString() + " (" + (filter.lowerRange[1].getNumber() + getParent().getManager().getPos().getY()) + ", " + (filter.higherRange[1].getNumber() + getParent().getManager().getPos().getY()) + ")"; + str += "\n" + Localization.Z.toString() + " (" + (filter.lowerRange[2].getNumber() + getParent().getManager().getPos().getZ()) + ", " + (filter.higherRange[2].getNumber() + getParent().getManager().getPos().getZ()) + ")"; gui.drawMouseOver(str, mX, mY); } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerScrap.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerScrap.java index a392c011a..e8c0d2890 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerScrap.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerScrap.java @@ -1,7 +1,7 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.ConnectionBlockType; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerTypes.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerTypes.java index ddcede58c..a1eac4df3 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerTypes.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuContainerTypes.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.ConnectionBlockType; import vswe.stevesfactory.interfaces.ContainerManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCrafting.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCrafting.java index f10a709a6..f51aa9157 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCrafting.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCrafting.java @@ -1,9 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuCraftingPriority.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuCraftingPriority.java index 844e5906d..8117d6f3e 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuCraftingPriority.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuCraftingPriority.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquid.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluid.java similarity index 79% rename from src/main/java/vswe/stevesfactory/components/ComponentMenuLiquid.java rename to src/main/java/vswe/stevesfactory/components/ComponentMenuFluid.java index 366b7f7d1..b4680c60e 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquid.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluid.java @@ -1,10 +1,11 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.GuiManager; import vswe.stevesfactory.network.DataBitHelper; @@ -15,9 +16,9 @@ import java.util.Iterator; import java.util.List; -public class ComponentMenuLiquid extends ComponentMenuStuff { - public ComponentMenuLiquid(FlowComponent parent) { - super(parent, LiquidSetting.class); +public class ComponentMenuFluid extends ComponentMenuStuff { + public ComponentMenuFluid(FlowComponent parent) { + super(parent, FluidSetting.class); numberTextBoxes.addTextBox(amountTextBoxBuckets = new TextBoxNumber(10 ,50, 3, true) { @Override @@ -71,7 +72,7 @@ protected void drawResultObject(GuiManager gui, Object obj, int x, int y) { @SideOnly(Side.CLIENT) @Override protected void drawSettingObject(GuiManager gui, Setting setting, int x, int y) { - drawResultObject(gui,((LiquidSetting)setting).getFluid(), x, y); + drawResultObject(gui,((FluidSetting)setting).getFluid(), x, y); } @Override @@ -83,7 +84,7 @@ protected List getResultObjectMouseOver(Object obj) { @Override protected List getSettingObjectMouseOver(Setting setting) { - return getResultObjectMouseOver(((LiquidSetting)setting).getFluid()); + return getResultObjectMouseOver(((FluidSetting)setting).getFluid()); } @Override @@ -95,16 +96,16 @@ protected void updateTextBoxes() { @Override protected DataBitHelper getAmountBitLength() { - return DataBitHelper.MENU_LIQUID_AMOUNT; + return DataBitHelper.MENU_FLUID_AMOUNT; } @Override protected void readSpecificHeaderData(DataReader dr, DataTypeHeader header, Setting setting) { - LiquidSetting liquidSetting = (LiquidSetting)setting; + FluidSetting fluidSetting = (FluidSetting)setting; switch (header) { case SET_ITEM: - liquidSetting.setLiquidFromId(dr.readData(DataBitHelper.MENU_FLUID_ID)); + fluidSetting.setFluidFromName(dr.readString(DataBitHelper.MENU_FLUID_ID_LENGTH)); if (isEditing()) { updateTextBoxes(); @@ -116,10 +117,10 @@ protected void readSpecificHeaderData(DataReader dr, DataTypeHeader header, Sett @Override protected void writeSpecificHeaderData(DataWriter dw, DataTypeHeader header, Setting setting) { - LiquidSetting liquidSetting = (LiquidSetting)setting; + FluidSetting fluidSetting = (FluidSetting)setting; switch (header) { case SET_ITEM: - dw.writeData(liquidSetting.getLiquidId(), DataBitHelper.MENU_FLUID_ID); + dw.writeString(fluidSetting.getFluidName(), DataBitHelper.MENU_FLUID_ID_LENGTH); } } @@ -127,11 +128,11 @@ protected void writeSpecificHeaderData(DataWriter dw, DataTypeHeader header, Set @Override public String getName() { - return Localization.LIQUIDS_MENU.toString(); + return Localization.FLUIDS_MENU.toString(); } - protected LiquidSetting getSelectedSetting() { - return (LiquidSetting)selectedSetting; + protected FluidSetting getSelectedSetting() { + return (FluidSetting)selectedSetting; } @SideOnly(Side.CLIENT) @@ -157,9 +158,9 @@ protected List updateSearch(String search, boolean showAll) { public static String getDisplayName(Fluid fluid) { //different mods store the name in different ways apparently - String name = fluid.getLocalizedName(); + String name = fluid.getLocalizedName(new FluidStack(fluid, 1)); if (name.indexOf(".") != -1) { - name = FluidRegistry.getFluidName(fluid.getID()); + name = FluidRegistry.getFluidName(fluid); } return name; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidCondition.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluidCondition.java similarity index 82% rename from src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidCondition.java rename to src/main/java/vswe/stevesfactory/components/ComponentMenuFluidCondition.java index d2cbf010c..0853e1372 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidCondition.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluidCondition.java @@ -5,8 +5,8 @@ import java.util.List; -public class ComponentMenuLiquidCondition extends ComponentMenuLiquid implements IConditionStuffMenu { - public ComponentMenuLiquidCondition(FlowComponent parent) { +public class ComponentMenuFluidCondition extends ComponentMenuFluid implements IConditionStuffMenu { + public ComponentMenuFluidCondition(FlowComponent parent) { super(parent); } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuFluidOutput.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluidOutput.java new file mode 100644 index 000000000..4da063625 --- /dev/null +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuFluidOutput.java @@ -0,0 +1,10 @@ +package vswe.stevesfactory.components; + + +public class ComponentMenuFluidOutput extends ComponentMenuFluid { + public ComponentMenuFluidOutput(FlowComponent parent) { + super(parent); + + setFirstRadioButtonSelected(false); + } +} diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuGroup.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuGroup.java index 1727949e5..907a98f60 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuGroup.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuGroup.java @@ -102,7 +102,7 @@ public void writeToNBT(NBTTagCompound nbtTagCompound, boolean pickup) { @Override public void readNetworkComponent(DataReader dr) { - if (!getParent().getManager().getWorldObj().isRemote) { + if (!getParent().getManager().getWorld().isRemote) { int id = dr.readComponentId(); FlowComponent component = getParent().getManager().getFlowItems().get(id); boolean moveCluster = dr.readBoolean(); diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuInterval.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuInterval.java index 0ec3a495a..7f26e9aa1 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuInterval.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuInterval.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuItem.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuItem.java index a15942690..3fab5569c 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuItem.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuItem.java @@ -1,12 +1,11 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.RegistryNamespaced; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidOutput.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidOutput.java deleted file mode 100644 index 4b9f1475d..000000000 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuLiquidOutput.java +++ /dev/null @@ -1,10 +0,0 @@ -package vswe.stevesfactory.components; - - -public class ComponentMenuLiquidOutput extends ComponentMenuLiquid { - public ComponentMenuLiquidOutput(FlowComponent parent) { - super(parent); - - setFirstRadioButtonSelected(false); - } -} diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuListOrder.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuListOrder.java index 852a4cf1b..b8dc7e5e1 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuListOrder.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuListOrder.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuPulse.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuPulse.java index caefa3107..892fc1642 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuPulse.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuPulse.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneOutput.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneOutput.java index d54567d71..5c8c73ed1 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneOutput.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneOutput.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneSides.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneSides.java index a1f56db0b..9ee2a69e1 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneSides.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneSides.java @@ -1,10 +1,10 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; @@ -24,7 +24,7 @@ public ComponentMenuRedstoneSides(FlowComponent parent) { checkBoxList = new CheckBoxList(); - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + for (int i = 0; i < EnumFacing.values().length; i++) { checkBoxList.addCheckBox(new CheckBoxSide(i)); } @@ -59,7 +59,7 @@ public void updateSelectedOption(int selectedOption) { private class CheckBoxSide extends CheckBox { private int id; public CheckBoxSide(int id) { - super(Localization.getForgeDirectionLocalization(id), CHECKBOX_X + CHECKBOX_SPACING_X * (id % 2), CHECKBOX_Y + CHECKBOX_SPACING_Y * (id / 2)); + super(Localization.getDirectionLocalization(EnumFacing.getFront(id)), CHECKBOX_X + CHECKBOX_SPACING_X * (id % 2), CHECKBOX_Y + CHECKBOX_SPACING_Y * (id / 2)); this.id = id; } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneStrength.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneStrength.java index 7a3ccda3c..6fed2b6dc 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneStrength.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuRedstoneStrength.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuResult.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuResult.java index 5f54810ba..dbdf55f4c 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuResult.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuResult.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuSignText.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuSignText.java index 54e88c57c..7ef5170a2 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuSignText.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuSignText.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuSplit.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuSplit.java index 7d8bc550b..8ddf99868 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuSplit.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuSplit.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuStuff.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuStuff.java index 8a25aa1d2..06bd3cff6 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuStuff.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuStuff.java @@ -1,10 +1,10 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; @@ -568,7 +568,7 @@ private void writeData(DataWriter dw, DataTypeHeader header, Setting setting) { } //if the client send data to the server, do the update right away on that client - if (getParent().getManager().getWorldObj().isRemote) { + if (getParent().getManager().getWorld().isRemote) { onSettingContentChange(); } } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuTarget.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuTarget.java index ecd404b55..c400ecc69 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuTarget.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuTarget.java @@ -1,12 +1,12 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.ForgeDirection; -import org.lwjgl.opengl.GL11; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; @@ -77,7 +77,7 @@ public String getName() { } - public static ForgeDirection[] directions = ForgeDirection.VALID_DIRECTIONS; + public static EnumFacing[] directions = EnumFacing.values(); protected int selectedDirectionId; private boolean[] activatedDirections = new boolean[directions.length]; @@ -89,7 +89,7 @@ public String getName() { @Override public void draw(GuiManager gui, int mX, int mY) { for (int i = 0; i < directions.length; i++) { - ForgeDirection direction = directions[i]; + EnumFacing direction = directions[i]; int x = getDirectionX(i); int y = getDirectionY(i); @@ -100,11 +100,11 @@ public void draw(GuiManager gui, int mX, int mY) { gui.drawTexture(x, y, DIRECTION_SRC_X + srcDirectionX * DIRECTION_SIZE_W, DIRECTION_SRC_Y + srcDirectionY * DIRECTION_SIZE_H, DIRECTION_SIZE_W, DIRECTION_SIZE_H); - GL11.glPushMatrix(); - GL11.glEnable(GL11.GL_BLEND); + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); int color = selectedDirectionId != -1 && selectedDirectionId != i ? 0x70404040 : 0x404040; - gui.drawString(Localization.getForgeDirectionLocalization(i).toString(), x + DIRECTION_TEXT_X, y + DIRECTION_TEXT_Y, color); - GL11.glPopMatrix(); + gui.drawString(Localization.getDirectionLocalization(EnumFacing.getFront(i)).toString(), x + DIRECTION_TEXT_X, y + DIRECTION_TEXT_Y, color); + GlStateManager.popMatrix(); } if (selectedDirectionId != -1) { diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetInventory.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetInventory.java index d9365017d..322c92795 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetInventory.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetInventory.java @@ -1,9 +1,10 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; @@ -21,7 +22,7 @@ public ComponentMenuTargetInventory(FlowComponent parent) { textBoxes.addTextBox(startTextBox = new TextBoxNumber(39 ,49, 2, false) { @Override public void onNumberChanged() { - if (selectedDirectionId != -1 && getParent().getManager().getWorldObj().isRemote) { + if (selectedDirectionId != -1 && getParent().getManager().getWorld().isRemote) { writeData(DataTypeHeader.START_OR_TANK_DATA, getNumber()); } } @@ -29,7 +30,7 @@ public void onNumberChanged() { textBoxes.addTextBox(endTextBox = new TextBoxNumber(60 ,49, 2, false) { @Override public void onNumberChanged() { - if (selectedDirectionId != -1 && getParent().getManager().getWorldObj().isRemote) { + if (selectedDirectionId != -1 && getParent().getManager().getWorld().isRemote) { writeData(DataTypeHeader.END, getNumber()); } } @@ -165,7 +166,7 @@ public int getEnd(int i) { public void addErrors(List errors) { for (int i = 0; i < directions.length; i++) { if (isActive(i) && getStart(i) > getEnd(i)) { - errors.add(Localization.getForgeDirectionLocalization(i).toString() + " " + Localization.INVALID_RANGE.toString()); + errors.add(Localization.getDirectionLocalization(EnumFacing.getFront(i)).toString() + " " + Localization.INVALID_RANGE.toString()); } } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetTank.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetTank.java index d63f05b9a..b37ddccb7 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetTank.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuTargetTank.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuUpdateBlock.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuUpdateBlock.java index 6d0d9ca28..cb95106ce 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuUpdateBlock.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuUpdateBlock.java @@ -1,12 +1,12 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuVariable.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuVariable.java index ac162ae59..9ef457750 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuVariable.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuVariable.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; @@ -266,7 +266,7 @@ public void readNetworkComponent(DataReader dr) { } }else{ executed = dr.readBoolean(); - if (!getParent().getManager().getWorldObj().isRemote) { + if (!getParent().getManager().getWorld().isRemote) { getVariable().setExecuted(executed); } } diff --git a/src/main/java/vswe/stevesfactory/components/ComponentMenuVariableLoop.java b/src/main/java/vswe/stevesfactory/components/ComponentMenuVariableLoop.java index 1aeb5be13..05a832fb7 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentMenuVariableLoop.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentMenuVariableLoop.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.ContainerManager; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/components/ComponentType.java b/src/main/java/vswe/stevesfactory/components/ComponentType.java index ade06c445..cb433ab27 100644 --- a/src/main/java/vswe/stevesfactory/components/ComponentType.java +++ b/src/main/java/vswe/stevesfactory/components/ComponentType.java @@ -19,15 +19,15 @@ public enum ComponentType { FLOW_CONTROL(4, Localization.FLOW_CONTROL_SHORT, Localization.FLOW_CONTROL_LONG, new ConnectionSet[]{ConnectionSet.MULTIPLE_INPUT_2, ConnectionSet.MULTIPLE_INPUT_5, ConnectionSet.MULTIPLE_OUTPUT_2, ConnectionSet.MULTIPLE_OUTPUT_5}, ComponentMenuSplit.class, ComponentMenuResult.class), - LIQUID_INPUT(5, Localization.LIQUID_INPUT_SHORT, Localization.LIQUID_INPUT_LONG, + FLUID_INPUT(5, Localization.FLUID_INPUT_SHORT, Localization.FLUID_INPUT_LONG, new ConnectionSet[]{ConnectionSet.STANDARD}, - ComponentMenuTank.class, ComponentMenuTargetTank.class, ComponentMenuLiquid.class, ComponentMenuResult.class), - LIQUID_OUTPUT(6, Localization.LIQUID_OUTPUT_SHORT, Localization.LIQUID_OUTPUT_LONG, + ComponentMenuTank.class, ComponentMenuTargetTank.class, ComponentMenuFluid.class, ComponentMenuResult.class), + FLUID_OUTPUT(6, Localization.FLUID_OUTPUT_SHORT, Localization.FLUID_OUTPUT_LONG, new ConnectionSet[]{ConnectionSet.STANDARD}, - ComponentMenuTank.class, ComponentMenuTargetTank.class, ComponentMenuLiquidOutput.class, ComponentMenuResult.class), - LIQUID_CONDITION(7, Localization.LIQUID_CONDITION_SHORT, Localization.LIQUID_CONDITION_LONG, + ComponentMenuTank.class, ComponentMenuTargetTank.class, ComponentMenuFluidOutput.class, ComponentMenuResult.class), + FLUID_CONDITION(7, Localization.FLUID_CONDITION_SHORT, Localization.FLUID_CONDITION_LONG, new ConnectionSet[]{ConnectionSet.STANDARD_CONDITION}, - ComponentMenuTankCondition.class, ComponentMenuTargetTank.class, ComponentMenuLiquidCondition.class, ComponentMenuResult.class), + ComponentMenuTankCondition.class, ComponentMenuTargetTank.class, ComponentMenuFluidCondition.class, ComponentMenuResult.class), REDSTONE_EMITTER(8, Localization.REDSTONE_EMITTER_SHORT, Localization.REDSTONE_EMITTER_LONG, new ConnectionSet[]{ConnectionSet.STANDARD}, ComponentMenuEmitters.class, ComponentMenuRedstoneSidesEmitter.class, ComponentMenuRedstoneOutput.class, ComponentMenuPulse.class, ComponentMenuResult.class), diff --git a/src/main/java/vswe/stevesfactory/components/Connection.java b/src/main/java/vswe/stevesfactory/components/Connection.java index 7bd7a657c..142a8318d 100644 --- a/src/main/java/vswe/stevesfactory/components/Connection.java +++ b/src/main/java/vswe/stevesfactory/components/Connection.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/vswe/stevesfactory/components/ContainerFilter.java b/src/main/java/vswe/stevesfactory/components/ContainerFilter.java index 5e59a6580..d033573ec 100644 --- a/src/main/java/vswe/stevesfactory/components/ContainerFilter.java +++ b/src/main/java/vswe/stevesfactory/components/ContainerFilter.java @@ -188,13 +188,13 @@ public boolean matches(TileEntityManager manager, List selectedInventor int value = 0; switch (j) { case 0: - value = block.getTileEntity().xCoord - manager.xCoord; + value = block.getTileEntity().getPos().getX() - manager.getPos().getX(); break; case 1: - value = block.getTileEntity().yCoord - manager.yCoord; + value = block.getTileEntity().getPos().getY() - manager.getPos().getY(); break; case 2: - value = block.getTileEntity().zCoord - manager.zCoord; + value = block.getTileEntity().getPos().getZ() - manager.getPos().getZ(); break; case 3: value = block.getCableDistance(); diff --git a/src/main/java/vswe/stevesfactory/components/CraftingBufferElement.java b/src/main/java/vswe/stevesfactory/components/CraftingBufferElement.java index ebe0c53a1..cbd00c868 100644 --- a/src/main/java/vswe/stevesfactory/components/CraftingBufferElement.java +++ b/src/main/java/vswe/stevesfactory/components/CraftingBufferElement.java @@ -110,17 +110,17 @@ private void disposeOfExtraItem(ItemStack itemStack) { - double spawnX = manager.xCoord + rand.nextDouble() * 0.8 + 0.1; - double spawnY = manager.yCoord + rand.nextDouble() * 0.3 + 1.1; - double spawnZ = manager.zCoord + rand.nextDouble() * 0.8 + 0.1; + double spawnX = manager.getPos().getX() + rand.nextDouble() * 0.8 + 0.1; + double spawnY = manager.getPos().getY() + rand.nextDouble() * 0.3 + 1.1; + double spawnZ = manager.getPos().getZ() + rand.nextDouble() * 0.8 + 0.1; - EntityItem entityitem = new EntityItem(manager.getWorldObj(), spawnX, spawnY, spawnZ, itemStack); + EntityItem entityitem = new EntityItem(manager.getWorld(), spawnX, spawnY, spawnZ, itemStack); entityitem.motionX = rand.nextGaussian() * SPEED_MULTIPLIER; entityitem.motionY = rand.nextGaussian() * SPEED_MULTIPLIER + 0.2F; entityitem.motionZ = rand.nextGaussian() * SPEED_MULTIPLIER; - manager.getWorldObj().spawnEntityInWorld(entityitem); + manager.getWorld().spawnEntityInWorld(entityitem); } @Override diff --git a/src/main/java/vswe/stevesfactory/components/CraftingDummy.java b/src/main/java/vswe/stevesfactory/components/CraftingDummy.java index 0a01c9d83..7ba3c0127 100644 --- a/src/main/java/vswe/stevesfactory/components/CraftingDummy.java +++ b/src/main/java/vswe/stevesfactory/components/CraftingDummy.java @@ -49,7 +49,7 @@ public ItemStack getStackInRowAndColumn(int par1, int par2) { @Override - public ItemStack getStackInSlotOnClosing(int par1) { + public ItemStack removeStackFromSlot(int par1) { return null; } @@ -83,7 +83,7 @@ public IRecipe getRecipe() { for (int i = 0; i < CraftingManager.getInstance().getRecipeList().size(); ++i) { IRecipe recipe = (IRecipe) CraftingManager.getInstance().getRecipeList().get(i); - if (recipe.matches(this, crafting.getParent().getManager().getWorldObj())) { + if (recipe.matches(this, crafting.getParent().getManager().getWorld())) { return recipe; } } @@ -94,7 +94,7 @@ public IRecipe getRecipe() { private Map overrideMap; public boolean isItemValidForRecipe(IRecipe recipe, ItemSetting result, Map overrideMap, boolean advanced) { this.overrideMap = overrideMap; - if ((advanced && getRecipe() == null) || (!advanced && !recipe.matches(this, crafting.getParent().getManager().getWorldObj()))) { + if ((advanced && getRecipe() == null) || (!advanced && !recipe.matches(this, crafting.getParent().getManager().getWorld()))) { return false; } ItemStack itemStack = recipe.getCraftingResult(this); diff --git a/src/main/java/vswe/stevesfactory/components/FlowComponent.java b/src/main/java/vswe/stevesfactory/components/FlowComponent.java index dea0e64eb..5215b96a4 100644 --- a/src/main/java/vswe/stevesfactory/components/FlowComponent.java +++ b/src/main/java/vswe/stevesfactory/components/FlowComponent.java @@ -1,12 +1,12 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import org.lwjgl.opengl.GL11; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.interfaces.ContainerManager; @@ -214,8 +214,8 @@ public void update(float partial) { @SideOnly(Side.CLIENT) public void draw(GuiManager gui, int mX, int mY, int zLevel) { - GL11.glPushMatrix(); - GL11.glTranslatef(0, 0, zLevel); + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, zLevel); gui.drawTexture(x, y, isLarge ? COMPONENT_SRC_LARGE_X : COMPONENT_SRC_X, COMPONENT_SRC_Y, getComponentWidth(), getComponentHeight()); @@ -252,10 +252,10 @@ public void draw(GuiManager gui, int mX, int mY, int zLevel) { gui.drawString(menu.getName(), x + MENU_X + MENU_ITEM_TEXT_X, y + getMenuItemY(i) + MENU_ITEM_TEXT_Y, 0x404040); if (i == openMenuId) { - GL11.glPushMatrix(); - GL11.glTranslatef(itemX, getMenuAreaY(i), 0); + GlStateManager.pushMatrix(); + GlStateManager.translate(itemX, getMenuAreaY(i), 0); menu.draw(gui, mX - itemX, mY - getMenuAreaY(i)); - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } } } @@ -304,8 +304,8 @@ public void draw(GuiManager gui, int mX, int mY, int zLevel) { int endX = otherLocation[0] + connectionWidth / 2; int endY = otherLocation[1] + connectionHeight / 2; - GL11.glPushMatrix(); - GL11.glTranslatef(0, 0, -zLevel); + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, -zLevel); List nodes = connectedConnection.getNodes(); for (int j = 0; j <= nodes.size(); j++) { int x1, y1, x2, y2; @@ -335,7 +335,7 @@ public void draw(GuiManager gui, int mX, int mY, int zLevel) { gui.drawTexture(x, y, NODE_SRC_X + srcXNode * NODE_SIZE, NODE_SRC_Y, NODE_SIZE, NODE_SIZE); } - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } } @@ -394,7 +394,7 @@ public void draw(GuiManager gui, int mX, int mY, int zLevel) { } } - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } private String cachedName; @@ -453,10 +453,10 @@ public void drawMouseOver(GuiManager gui, int mX, int mY) { ComponentMenu menu = menus.get(i); if (menu.isVisible() && i == openMenuId) { - GL11.glPushMatrix(); - GL11.glTranslatef(getMenuAreaX(), getMenuAreaY(i), 0); + GlStateManager.pushMatrix(); + GlStateManager.translate(getMenuAreaX(), getMenuAreaY(i), 0); menu.drawMouseOver(gui, mX - getMenuAreaX(), mY - getMenuAreaY(i)); - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } } } @@ -701,7 +701,7 @@ private boolean checkForLoops(List usedComponents, FlowComponent curren } private void addConnection(int id, Connection connection) { - if (getManager().getWorldObj() != null && getManager().getWorldObj().isRemote) { + if (getManager().getWorld() != null && getManager().getWorld().isRemote) { DataWriter dw = PacketHandler.getWriterForServerComponentPacket(this, null); if (connection != null) { writeConnectionData(dw, id, true, connection.getComponentId(), connection.getConnectionId()); @@ -1064,7 +1064,7 @@ public void readNetworkComponent(DataReader dr) { int id = dr.readData(DataBitHelper.NODE_ID); int length = -1; - if (manager.getWorldObj().isRemote) { + if (manager.getWorld().isRemote) { length = dr.readData(DataBitHelper.NODE_ID); } boolean deleted = dr.readBoolean(); @@ -1079,7 +1079,7 @@ public void readNetworkComponent(DataReader dr) { Point node; if (created) { node = new Point(); - if (connection.getNodes().size() < MAX_NODES && (!manager.getWorldObj().isRemote || length > connection.getNodes().size())) { + if (connection.getNodes().size() < MAX_NODES && (!manager.getWorld().isRemote || length > connection.getNodes().size())) { connection.getNodes().add(id, node); } }else{ diff --git a/src/main/java/vswe/stevesfactory/components/LiquidBufferElement.java b/src/main/java/vswe/stevesfactory/components/FluidBufferElement.java similarity index 86% rename from src/main/java/vswe/stevesfactory/components/LiquidBufferElement.java rename to src/main/java/vswe/stevesfactory/components/FluidBufferElement.java index 71c06cdb1..4cfac4c96 100644 --- a/src/main/java/vswe/stevesfactory/components/LiquidBufferElement.java +++ b/src/main/java/vswe/stevesfactory/components/FluidBufferElement.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; -public class LiquidBufferElement { +public class FluidBufferElement { private Setting setting; private FlowComponent component; private boolean useWhiteList; @@ -20,13 +20,13 @@ public class LiquidBufferElement { private boolean fairShare; private int shareId; - public LiquidBufferElement(FlowComponent owner, Setting setting, SlotInventoryHolder inventoryHolder, boolean useWhiteList, StackTankHolder target) { + public FluidBufferElement(FlowComponent owner, Setting setting, SlotInventoryHolder inventoryHolder, boolean useWhiteList, StackTankHolder target) { this(owner, setting, inventoryHolder, useWhiteList); addTarget(target); sharedBy = 1; } - public LiquidBufferElement(FlowComponent owner, Setting setting, SlotInventoryHolder inventoryHolder, boolean useWhiteList) { + public FluidBufferElement(FlowComponent owner, Setting setting, SlotInventoryHolder inventoryHolder, boolean useWhiteList) { this.component = owner; this.setting = setting; this.inventoryHolder = inventoryHolder; @@ -97,7 +97,7 @@ public int getBufferSize(Setting outputSetting) { for (StackTankHolder holder : getHolders()) { FluidStack fluidStack = holder.getFluidStack(); - if (fluidStack != null && fluidStack.fluidID == ((LiquidSetting)outputSetting).getLiquidId()) { + if (fluidStack != null && fluidStack.getFluid().getName().equals(((FluidSetting)outputSetting).getFluidName())) { bufferSize += fluidStack.amount; } } @@ -113,9 +113,9 @@ public int getBufferSize(Setting outputSetting) { return bufferSize; } - public LiquidBufferElement getSplitElement(int elementAmount, int id, boolean fair) { + public FluidBufferElement getSplitElement(int elementAmount, int id, boolean fair) { - LiquidBufferElement element = new LiquidBufferElement(this.component, this.setting, this.inventoryHolder, this.useWhiteList); + FluidBufferElement element = new FluidBufferElement(this.component, this.setting, this.inventoryHolder, this.useWhiteList); element.holders = new ArrayList(); for (StackTankHolder holder : holders) { element.addTarget(holder.getSplitElement(elementAmount, id, fair)); diff --git a/src/main/java/vswe/stevesfactory/components/LiquidSetting.java b/src/main/java/vswe/stevesfactory/components/FluidSetting.java similarity index 69% rename from src/main/java/vswe/stevesfactory/components/LiquidSetting.java rename to src/main/java/vswe/stevesfactory/components/FluidSetting.java index 221f53c22..30d538a60 100644 --- a/src/main/java/vswe/stevesfactory/components/LiquidSetting.java +++ b/src/main/java/vswe/stevesfactory/components/FluidSetting.java @@ -12,11 +12,11 @@ import java.util.ArrayList; import java.util.List; -public class LiquidSetting extends Setting { +public class FluidSetting extends Setting { private Fluid fluid; private int amount; - public LiquidSetting(int id) { + public FluidSetting(int id) { super(id); } @@ -33,13 +33,13 @@ public List getMouseOver() { List ret = new ArrayList(); if (fluid == null) { - ret.add(Localization.NO_LIQUID_SELECTED.toString()); + ret.add(Localization.NO_FLUID_SELECTED.toString()); }else{ - ret.add(ComponentMenuLiquid.getDisplayName(fluid)); + ret.add(ComponentMenuFluid.getDisplayName(fluid)); } ret.add(""); - ret.add(Localization.CHANGE_LIQUID.toString()); + ret.add(Localization.CHANGE_FLUID.toString()); if (fluid != null) { ret.add(Localization.EDIT_SETTING.toString()); } @@ -65,17 +65,17 @@ public boolean isValid() { @Override public void writeData(DataWriter dw) { - dw.writeData(fluid.getID(), DataBitHelper.MENU_FLUID_ID); + dw.writeString(fluid.getName(), DataBitHelper.MENU_FLUID_ID_LENGTH); } @Override public void readData(DataReader dr) { - fluid = FluidRegistry.getFluid(dr.readData(DataBitHelper.MENU_FLUID_ID)); + fluid = FluidRegistry.getFluid(dr.readString(DataBitHelper.MENU_FLUID_ID_LENGTH)); } @Override public void copyFrom(Setting setting) { - fluid = ((LiquidSetting)setting).fluid; + fluid = ((FluidSetting)setting).fluid; } @Override @@ -83,25 +83,25 @@ public int getDefaultAmount() { return 1000; } - private static final String NBT_FLUID_ID = "FluidId"; + private static final String NBT_FLUID_NAME = "FluidName"; private static final String NBT_FLUID_AMOUNT = "Amount"; @Override public void load(NBTTagCompound settingTag) { //TODO load properly - fluid = FluidRegistry.getFluid(settingTag.getShort(NBT_FLUID_ID)); + fluid = FluidRegistry.getFluid(settingTag.getString(NBT_FLUID_NAME)); amount = settingTag.getInteger(NBT_FLUID_AMOUNT); } @Override public void save(NBTTagCompound settingTag) { //TODO save properly - settingTag.setShort(NBT_FLUID_ID, (short)fluid.getID()); + settingTag.setString(NBT_FLUID_NAME, fluid.getName()); settingTag.setInteger(NBT_FLUID_AMOUNT, amount); } @Override public boolean isContentEqual(Setting otherSetting) { - return fluid.getID() == ((LiquidSetting)otherSetting).fluid.getID(); + return fluid.getName().equals(((FluidSetting)otherSetting).fluid.getName()); } @Override @@ -110,12 +110,12 @@ public void setContent(Object obj) { setDefaultAmount(); } - public int getLiquidId() { - return fluid.getID(); + public String getFluidName() { + return fluid.getName(); } - public void setLiquidFromId(int id) { - fluid = FluidRegistry.getFluid(id); + public void setFluidFromName(String name) { + fluid = FluidRegistry.getFluid(name); } public Fluid getFluid() { diff --git a/src/main/java/vswe/stevesfactory/components/IContainerSelection.java b/src/main/java/vswe/stevesfactory/components/IContainerSelection.java index 65cd99cb0..3133ae5c8 100644 --- a/src/main/java/vswe/stevesfactory/components/IContainerSelection.java +++ b/src/main/java/vswe/stevesfactory/components/IContainerSelection.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.interfaces.GuiManager; public interface IContainerSelection { diff --git a/src/main/java/vswe/stevesfactory/components/ItemSetting.java b/src/main/java/vswe/stevesfactory/components/ItemSetting.java index 828e815a3..fb39313bb 100644 --- a/src/main/java/vswe/stevesfactory/components/ItemSetting.java +++ b/src/main/java/vswe/stevesfactory/components/ItemSetting.java @@ -166,9 +166,9 @@ public boolean isEqualForCommandExecutor(ItemStack other) { }else { switch (fuzzyMode) { case ORE_DICTIONARY: - int id = OreDictionary.getOreID(this.getItem()); + int id = OreDictionary.getOreIDs(this.getItem())[0]; if (id != -1) { - return id == OreDictionary.getOreID(other); + return id == OreDictionary.getOreIDs(other)[0]; } //note that this falls through into the precise one, this is on purpose case PRECISE: diff --git a/src/main/java/vswe/stevesfactory/components/ModItemHelper.java b/src/main/java/vswe/stevesfactory/components/ModItemHelper.java index 2c23bdf77..861fd9a9c 100644 --- a/src/main/java/vswe/stevesfactory/components/ModItemHelper.java +++ b/src/main/java/vswe/stevesfactory/components/ModItemHelper.java @@ -1,11 +1,11 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.common.registry.FMLControlledNamespacedRegistry; -import cpw.mods.fml.common.registry.GameData; -import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.item.Item; - +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry; +import net.minecraftforge.fml.common.registry.GameData; +import net.minecraftforge.fml.common.registry.GameRegistry; import java.util.HashMap; import java.util.Map; @@ -23,7 +23,7 @@ public static void init() { for (int i = 0; i < keys.length; i++) { - Item item = (Item) itemRegistry.getObject(keys[i]); + Item item = (Item) itemRegistry.getObject((ResourceLocation) keys[i]); GameRegistry.UniqueIdentifier uniqueIdentity = GameRegistry.findUniqueIdentifierFor(item); String modId = uniqueIdentity == null ? null : uniqueIdentity.modId; diff --git a/src/main/java/vswe/stevesfactory/components/OutputLiquidCounter.java b/src/main/java/vswe/stevesfactory/components/OutputFluidCounter.java similarity index 76% rename from src/main/java/vswe/stevesfactory/components/OutputLiquidCounter.java rename to src/main/java/vswe/stevesfactory/components/OutputFluidCounter.java index ee7e4964c..f4b055ee2 100644 --- a/src/main/java/vswe/stevesfactory/components/OutputLiquidCounter.java +++ b/src/main/java/vswe/stevesfactory/components/OutputFluidCounter.java @@ -1,18 +1,18 @@ package vswe.stevesfactory.components; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumFacing; import net.minecraftforge.fluids.FluidStack; import java.util.List; -public class OutputLiquidCounter { +public class OutputFluidCounter { private Setting setting; private boolean useWhiteList; private int currentTankTransferSize; private int currentBufferTransferSize; - public OutputLiquidCounter(List liquidBuffer, List tanks, SlotInventoryHolder tank, Setting setting, boolean useWhiteList) { + public OutputFluidCounter(List fluidBuffer, List tanks, SlotInventoryHolder tank, Setting setting, boolean useWhiteList) { this.setting = setting; this.useWhiteList = useWhiteList; @@ -26,8 +26,8 @@ public OutputLiquidCounter(List liquidBuffer, List receivers, FlowComponent component, boolean high) { ComponentMenuContainer menuContainer = (ComponentMenuContainer)component.getMenus().get(containerId); if (canUseMergedDetection && menuContainer.getOption() == 0) { - int[] currentPower = new int[ForgeDirection.VALID_DIRECTIONS.length]; + int[] currentPower = new int[EnumFacing.values().length]; for (SlotInventoryHolder receiver : receivers) { IRedstoneNode node = receiver.getNode(); for (int i = 0; i < currentPower.length; i++) { diff --git a/src/main/java/vswe/stevesfactory/components/TriggerHelperRedstone.java b/src/main/java/vswe/stevesfactory/components/TriggerHelperRedstone.java index 9483a91f1..172855572 100644 --- a/src/main/java/vswe/stevesfactory/components/TriggerHelperRedstone.java +++ b/src/main/java/vswe/stevesfactory/components/TriggerHelperRedstone.java @@ -1,7 +1,7 @@ package vswe.stevesfactory.components; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.EnumFacing; import vswe.stevesfactory.blocks.ConnectionBlockType; import vswe.stevesfactory.blocks.TileEntityInput; @@ -40,8 +40,8 @@ public void onRedstoneTrigger(FlowComponent item, TileEntityInput inputTrigger) if (receivers != null) { ComponentMenuContainer componentMenuContainer = (ComponentMenuContainer)item.getMenus().get(containerId); - int[] newPower = new int[ForgeDirection.VALID_DIRECTIONS.length]; - int[] oldPower = new int[ForgeDirection.VALID_DIRECTIONS.length]; + int[] newPower = new int[EnumFacing.values().length]; + int[] oldPower = new int[EnumFacing.values().length]; if (canUseMergedDetection && componentMenuContainer.getOption() == 0) { for (SlotInventoryHolder receiver : receivers) { TileEntityInput input = receiver.getReceiver(); diff --git a/src/main/java/vswe/stevesfactory/components/Variable.java b/src/main/java/vswe/stevesfactory/components/Variable.java index 65457796f..6ad408a52 100644 --- a/src/main/java/vswe/stevesfactory/components/Variable.java +++ b/src/main/java/vswe/stevesfactory/components/Variable.java @@ -2,9 +2,9 @@ +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import org.lwjgl.opengl.GL11; import vswe.stevesfactory.interfaces.GuiManager; import java.util.ArrayList; @@ -38,7 +38,7 @@ public int getId() { public void draw(GuiManager gui, int x, int y) { VariableColor.values()[id].applyColor(); gui.drawTexture(x + 1, y + 1, VARIABLE_SRC_X, VARIABLE_SRC_Y, VARIABLE_SIZE, VARIABLE_SIZE); - GL11.glColor4f(1F, 1F, 1F, 1F); + GlStateManager.color(1F, 1F, 1F, 1F); } @Override diff --git a/src/main/java/vswe/stevesfactory/components/VariableColor.java b/src/main/java/vswe/stevesfactory/components/VariableColor.java index dd1823ffd..c3eee1019 100644 --- a/src/main/java/vswe/stevesfactory/components/VariableColor.java +++ b/src/main/java/vswe/stevesfactory/components/VariableColor.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import org.lwjgl.opengl.GL11; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.Color; @@ -41,7 +41,7 @@ private VariableColor(Localization name, Color textColor, float red, float green @SideOnly(Side.CLIENT) public void applyColor() { - GL11.glColor4f(red, green, blue, 1F); + GlStateManager.color(red, green, blue, 1F); } diff --git a/src/main/java/vswe/stevesfactory/components/VariableDisplay.java b/src/main/java/vswe/stevesfactory/components/VariableDisplay.java index 907cbfeba..0ed11aa7e 100644 --- a/src/main/java/vswe/stevesfactory/components/VariableDisplay.java +++ b/src/main/java/vswe/stevesfactory/components/VariableDisplay.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.components; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.interfaces.GuiManager; diff --git a/src/main/java/vswe/stevesfactory/interfaces/ContainerManager.java b/src/main/java/vswe/stevesfactory/interfaces/ContainerManager.java index eecbdaff0..3db72d2c3 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/ContainerManager.java +++ b/src/main/java/vswe/stevesfactory/interfaces/ContainerManager.java @@ -25,7 +25,7 @@ public ContainerManager(TileEntityManager manager, InventoryPlayer player) { @Override public boolean canInteractWith(EntityPlayer entityplayer) { - return entityplayer.getDistanceSq(manager.xCoord, manager.yCoord, manager.zCoord) <= 64; + return entityplayer.getDistanceSq(manager.getPos().getX(), manager.getPos().getY(), manager.getPos().getZ()) <= 64; } @Override @@ -55,7 +55,7 @@ public void detectAndSendChanges() { if (!hasInventoriesChanged) { for (int i = 0; i < oldInventories.size(); i++) { TileEntity tileEntity = manager.getConnectedInventories().get(i).getTileEntity(); - if (oldInventories.get(i).equals(new WorldCoordinate(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord))) { + if (oldInventories.get(i).equals(new WorldCoordinate(tileEntity.getPos().getX(), tileEntity.getPos().getY(), tileEntity.getPos().getZ()))) { hasInventoriesChanged = true; break; } @@ -67,7 +67,7 @@ public void detectAndSendChanges() { if (hasInventoriesChanged) { oldInventories.clear(); for (ConnectionBlock connection : manager.getConnectedInventories()) { - oldInventories.add(new WorldCoordinate(connection.getTileEntity().xCoord, connection.getTileEntity().yCoord, connection.getTileEntity().zCoord)); + oldInventories.add(new WorldCoordinate(connection.getTileEntity().getPos().getX(), connection.getTileEntity().getPos().getY(), connection.getTileEntity().getPos().getZ())); } PacketHandler.sendUpdateInventoryPacket(this); } @@ -75,8 +75,8 @@ public void detectAndSendChanges() { } @Override - public void addCraftingToCrafters(ICrafting player) { - super.addCraftingToCrafters(player); + public void onCraftGuiOpened(ICrafting player) { + super.onCraftGuiOpened(player); PacketHandler.sendAllData(this, player, manager); oldComponents = new ArrayList(); @@ -86,7 +86,7 @@ public void addCraftingToCrafters(ICrafting player) { manager.updateInventories(); oldInventories = new ArrayList(); for (ConnectionBlock connection : manager.getConnectedInventories()) { - oldInventories.add(new WorldCoordinate(connection.getTileEntity().xCoord, connection.getTileEntity().yCoord, connection.getTileEntity().zCoord)); + oldInventories.add(new WorldCoordinate(connection.getTileEntity().getPos().getX(), connection.getTileEntity().getPos().getY(), connection.getTileEntity().getPos().getZ())); } oldIdIndexToRemove = manager.getRemovedIds().size(); } diff --git a/src/main/java/vswe/stevesfactory/interfaces/ContainerRelay.java b/src/main/java/vswe/stevesfactory/interfaces/ContainerRelay.java index da9118b42..e6e9f8c98 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/ContainerRelay.java +++ b/src/main/java/vswe/stevesfactory/interfaces/ContainerRelay.java @@ -22,7 +22,7 @@ public ContainerRelay(TileEntityRelay relay, InventoryPlayer player) { @Override public boolean canInteractWith(EntityPlayer entityplayer) { - return entityplayer.getDistanceSq(relay.xCoord, relay.yCoord, relay.zCoord) <= 64; + return entityplayer.getDistanceSq(relay.getPos().getX(), relay.getPos().getY(), relay.getPos().getZ()) <= 64; } @Override @@ -35,8 +35,8 @@ public void detectAndSendChanges() { } @Override - public void addCraftingToCrafters(ICrafting player) { - super.addCraftingToCrafters(player); + public void onCraftGuiOpened(ICrafting player) { + super.onCraftGuiOpened(player); PacketHandler.sendAllData(this, player, relay); oldPermissions = new ArrayList(); for (UserPermission permission : relay.getPermissions()) { diff --git a/src/main/java/vswe/stevesfactory/interfaces/GuiAntiNEI.java b/src/main/java/vswe/stevesfactory/interfaces/GuiAntiNEI.java index 4cd16195f..8e2bc1b23 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/GuiAntiNEI.java +++ b/src/main/java/vswe/stevesfactory/interfaces/GuiAntiNEI.java @@ -1,62 +1,79 @@ package vswe.stevesfactory.interfaces; +import com.google.common.collect.Sets; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import java.util.HashSet; +import java.io.IOException; import java.util.Iterator; import java.util.Set; public abstract class GuiAntiNEI extends GuiScreen { + /** The location of the inventory background texture */ + protected static final ResourceLocation inventoryBackground = new ResourceLocation("textures/gui/container/inventory.png"); + /** The X size of the inventory window in pixels. */ protected int xSize = 176; + /** The Y size of the inventory window in pixels. */ protected int ySize = 166; + /** A list of the players inventory slots */ public Container inventorySlots; + /** Starting X position for the Gui. Inconsistent use for Gui backgrounds. */ protected int guiLeft; + /** Starting Y position for the Gui. Inconsistent use for Gui backgrounds. */ protected int guiTop; + /** holds the slot currently hovered */ private Slot theSlot; + /** Used when touchscreen is enabled. */ private Slot clickedSlot; + /** Used when touchscreen is enabled. */ private boolean isRightMouseClick; + /** Used when touchscreen is enabled */ private ItemStack draggedStack; - private int field_147011_y; - private int field_147010_z; + private int touchUpX; + private int touchUpY; private Slot returningStackDestSlot; private long returningStackTime; + /** Used when touchscreen is enabled */ private ItemStack returningStack; - private Slot field_146985_D; - private long field_146986_E; - protected final Set field_147008_s = new HashSet(); - protected boolean field_147007_t; - private int field_146987_F; - private int field_146988_G; - private boolean field_146995_H; - private int field_146996_I; - private long field_146997_J; - private Slot field_146998_K; - private int field_146992_L; - private boolean field_146993_M; - private ItemStack field_146994_N; - - public GuiAntiNEI(Container par1Container) + private Slot currentDragTargetSlot; + private long dragItemDropDelay; + protected final Set dragSplittingSlots = Sets.newHashSet(); + protected boolean dragSplitting; + private int dragSplittingLimit; + private int dragSplittingButton; + private boolean ignoreMouseUp; + private int dragSplittingRemnant; + private long lastClickTime; + private Slot lastClickSlot; + private int lastClickButton; + private boolean doubleClick; + private ItemStack shiftClickedSlot; + private static final String __OBFID = "CL_00000737"; + + public GuiAntiNEI(Container inventorySlotsIn) { - this.inventorySlots = par1Container; - this.field_146995_H = true; + this.inventorySlots = inventorySlotsIn; + this.ignoreMouseUp = true; } + /** + * Adds the buttons (and other controls) to the screen in question. Called when the GUI is displayed and when the + * window resizes, the buttonList is cleared beforehand. + */ public void initGui() { super.initGui(); @@ -65,52 +82,55 @@ public void initGui() this.guiTop = (this.height - this.ySize) / 2; } - public void drawScreen(int par1, int par2, float par3) + /** + * Draws the screen and all the components in it. Args : mouseX, mouseY, renderPartialTicks + */ + public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawDefaultBackground(); int k = this.guiLeft; int l = this.guiTop; - this.drawGuiContainerBackgroundLayer(par3, par1, par2); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); + this.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY); + GlStateManager.disableRescaleNormal(); RenderHelper.disableStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); - super.drawScreen(par1, par2, par3); + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); + super.drawScreen(mouseX, mouseY, partialTicks); RenderHelper.enableGUIStandardItemLighting(); - GL11.glPushMatrix(); - GL11.glTranslatef((float)k, (float)l, 0.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GlStateManager.pushMatrix(); + GlStateManager.translate((float)k, (float)l, 0.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.enableRescaleNormal(); this.theSlot = null; short short1 = 240; short short2 = 240; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) short1 / 1.0F, (float) short2 / 1.0F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)short1 / 1.0F, (float)short2 / 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); int k1; for (int i1 = 0; i1 < this.inventorySlots.inventorySlots.size(); ++i1) { Slot slot = (Slot)this.inventorySlots.inventorySlots.get(i1); - this.func_146977_a(slot); + this.drawSlot(slot); - if (this.isMouseOverSlot(slot, par1, par2) && slot.func_111238_b()) + if (this.isMouseOverSlot(slot, mouseX, mouseY) && slot.canBeHovered()) { this.theSlot = slot; - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); int j1 = slot.xDisplayPosition; k1 = slot.yDisplayPosition; - GL11.glColorMask(true, true, true, false); + GlStateManager.colorMask(true, true, true, false); this.drawGradientRect(j1, k1, j1 + 16, k1 + 16, -2130706433, -2130706433); - GL11.glColorMask(true, true, true, true); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); + GlStateManager.colorMask(true, true, true, true); + GlStateManager.enableLighting(); + GlStateManager.enableDepth(); } } - GL11.glDisable(GL11.GL_LIGHTING); - this.drawGuiContainerForegroundLayer(par1, par2); - GL11.glEnable(GL11.GL_LIGHTING); + RenderHelper.disableStandardItemLighting(); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + RenderHelper.enableGUIStandardItemLighting(); InventoryPlayer inventoryplayer = this.mc.thePlayer.inventory; ItemStack itemstack = this.draggedStack == null ? inventoryplayer.getItemStack() : this.draggedStack; @@ -123,12 +143,12 @@ public void drawScreen(int par1, int par2, float par3) if (this.draggedStack != null && this.isRightMouseClick) { itemstack = itemstack.copy(); - itemstack.stackSize = MathHelper.ceiling_float_int((float) itemstack.stackSize / 2.0F); + itemstack.stackSize = MathHelper.ceiling_float_int((float)itemstack.stackSize / 2.0F); } - else if (this.field_147007_t && this.field_147008_s.size() > 1) + else if (this.dragSplitting && this.dragSplittingSlots.size() > 1) { itemstack = itemstack.copy(); - itemstack.stackSize = this.field_146996_I; + itemstack.stackSize = this.dragSplittingRemnant; if (itemstack.stackSize == 0) { @@ -136,7 +156,7 @@ else if (this.field_147007_t && this.field_147008_s.size() > 1) } } - this.drawItemStack(itemstack, par1 - k - b0, par2 - l - k1, s); + this.drawItemStack(itemstack, mouseX - k - b0, mouseY - l - k1, s); } if (this.returningStack != null) @@ -149,71 +169,80 @@ else if (this.field_147007_t && this.field_147008_s.size() > 1) this.returningStack = null; } - k1 = this.returningStackDestSlot.xDisplayPosition - this.field_147011_y; - int j2 = this.returningStackDestSlot.yDisplayPosition - this.field_147010_z; - int l1 = this.field_147011_y + (int)((float)k1 * f1); - int i2 = this.field_147010_z + (int)((float)j2 * f1); - this.drawItemStack(this.returningStack, l1, i2, null); + k1 = this.returningStackDestSlot.xDisplayPosition - this.touchUpX; + int j2 = this.returningStackDestSlot.yDisplayPosition - this.touchUpY; + int l1 = this.touchUpX + (int)((float)k1 * f1); + int i2 = this.touchUpY + (int)((float)j2 * f1); + this.drawItemStack(this.returningStack, l1, i2, (String)null); } - GL11.glPopMatrix(); + GlStateManager.popMatrix(); if (inventoryplayer.getItemStack() == null && this.theSlot != null && this.theSlot.getHasStack()) { ItemStack itemstack1 = this.theSlot.getStack(); - this.renderToolTip(itemstack1, par1, par2); + this.renderToolTip(itemstack1, mouseX, mouseY); } - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); + GlStateManager.enableLighting(); + GlStateManager.enableDepth(); RenderHelper.enableStandardItemLighting(); } - private void drawItemStack(ItemStack p_146982_1_, int p_146982_2_, int p_146982_3_, String p_146982_4_) + /** + * Render an ItemStack. Args : stack, x, y, format + */ + private void drawItemStack(ItemStack stack, int x, int y, String altText) { - GL11.glTranslatef(0.0F, 0.0F, 32.0F); + GlStateManager.translate(0.0F, 0.0F, 32.0F); this.zLevel = 200.0F; - itemRender.zLevel = 200.0F; + this.itemRender.zLevel = 200.0F; FontRenderer font = null; - if (p_146982_1_ != null) font = p_146982_1_.getItem().getFontRenderer(p_146982_1_); + if (stack != null) font = stack.getItem().getFontRenderer(stack); if (font == null) font = fontRendererObj; - itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), p_146982_1_, p_146982_2_, p_146982_3_); - itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), p_146982_1_, p_146982_2_, p_146982_3_ - (this.draggedStack == null ? 0 : 8), p_146982_4_); + this.itemRender.renderItemAndEffectIntoGUI(stack, x, y); + this.itemRender.renderItemOverlayIntoGUI(font, stack, x, y - (this.draggedStack == null ? 0 : 8), altText); this.zLevel = 0.0F; - itemRender.zLevel = 0.0F; + this.itemRender.zLevel = 0.0F; } - protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) {} + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items). Args : mouseX, mouseY + */ + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {} - protected abstract void drawGuiContainerBackgroundLayer(float var1, int var2, int var3); + /** + * Args : renderPartialTicks, mouseX, mouseY + */ + protected abstract void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY); - private void func_146977_a(Slot p_146977_1_) + private void drawSlot(Slot slotIn) { - int i = p_146977_1_.xDisplayPosition; - int j = p_146977_1_.yDisplayPosition; - ItemStack itemstack = p_146977_1_.getStack(); + int i = slotIn.xDisplayPosition; + int j = slotIn.yDisplayPosition; + ItemStack itemstack = slotIn.getStack(); boolean flag = false; - boolean flag1 = p_146977_1_ == this.clickedSlot && this.draggedStack != null && !this.isRightMouseClick; + boolean flag1 = slotIn == this.clickedSlot && this.draggedStack != null && !this.isRightMouseClick; ItemStack itemstack1 = this.mc.thePlayer.inventory.getItemStack(); String s = null; - if (p_146977_1_ == this.clickedSlot && this.draggedStack != null && this.isRightMouseClick && itemstack != null) + if (slotIn == this.clickedSlot && this.draggedStack != null && this.isRightMouseClick && itemstack != null) { itemstack = itemstack.copy(); itemstack.stackSize /= 2; } - else if (this.field_147007_t && this.field_147008_s.contains(p_146977_1_) && itemstack1 != null) + else if (this.dragSplitting && this.dragSplittingSlots.contains(slotIn) && itemstack1 != null) { - if (this.field_147008_s.size() == 1) + if (this.dragSplittingSlots.size() == 1) { return; } - if (Container.func_94527_a(p_146977_1_, itemstack1, true) && this.inventorySlots.canDragIntoSlot(p_146977_1_)) + if (Container.canAddItemToSlot(slotIn, itemstack1, true) && this.inventorySlots.canDragIntoSlot(slotIn)) { itemstack = itemstack1.copy(); flag = true; - Container.func_94525_a(this.field_147008_s, this.field_146987_F, itemstack, p_146977_1_.getStack() == null ? 0 : p_146977_1_.getStack().stackSize); + Container.computeStackSize(this.dragSplittingSlots, this.dragSplittingLimit, itemstack, slotIn.getStack() == null ? 0 : slotIn.getStack().stackSize); if (itemstack.stackSize > itemstack.getMaxStackSize()) { @@ -221,32 +250,32 @@ else if (this.field_147007_t && this.field_147008_s.contains(p_146977_1_) && ite itemstack.stackSize = itemstack.getMaxStackSize(); } - if (itemstack.stackSize > p_146977_1_.getSlotStackLimit()) + if (itemstack.stackSize > slotIn.getItemStackLimit(itemstack)) { - s = EnumChatFormatting.YELLOW + "" + p_146977_1_.getSlotStackLimit(); - itemstack.stackSize = p_146977_1_.getSlotStackLimit(); + s = EnumChatFormatting.YELLOW + "" + slotIn.getItemStackLimit(itemstack); + itemstack.stackSize = slotIn.getItemStackLimit(itemstack); } } else { - this.field_147008_s.remove(p_146977_1_); - this.func_146980_g(); + this.dragSplittingSlots.remove(slotIn); + this.updateDragSplitting(); } } this.zLevel = 100.0F; - itemRender.zLevel = 100.0F; + this.itemRender.zLevel = 100.0F; if (itemstack == null) { - IIcon iicon = p_146977_1_.getBackgroundIconIndex(); + TextureAtlasSprite textureatlassprite = slotIn.getBackgroundSprite(); - if (iicon != null) + if (textureatlassprite != null) { - GL11.glDisable(GL11.GL_LIGHTING); - this.mc.getTextureManager().bindTexture(TextureMap.locationItemsTexture); - this.drawTexturedModelRectFromIcon(i, j, iicon, 16, 16); - GL11.glEnable(GL11.GL_LIGHTING); + GlStateManager.disableLighting(); + this.mc.getTextureManager().bindTexture(slotIn.getBackgroundLocation()); + this.drawTexturedModalRect(i, j, textureatlassprite, 16, 16); + GlStateManager.enableLighting(); flag1 = true; } } @@ -258,52 +287,55 @@ else if (this.field_147007_t && this.field_147008_s.contains(p_146977_1_) && ite drawRect(i, j, i + 16, j + 16, -2130706433); } - GL11.glEnable(GL11.GL_DEPTH_TEST); - itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, i, j); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.getTextureManager(), itemstack, i, j, s); + GlStateManager.enableDepth(); + this.itemRender.renderItemAndEffectIntoGUI(itemstack, i, j); + this.itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, itemstack, i, j, s); } - itemRender.zLevel = 0.0F; + this.itemRender.zLevel = 0.0F; this.zLevel = 0.0F; } - private void func_146980_g() + private void updateDragSplitting() { ItemStack itemstack = this.mc.thePlayer.inventory.getItemStack(); - if (itemstack != null && this.field_147007_t) + if (itemstack != null && this.dragSplitting) { - this.field_146996_I = itemstack.stackSize; + this.dragSplittingRemnant = itemstack.stackSize; ItemStack itemstack1; int i; - for (Iterator iterator = this.field_147008_s.iterator(); iterator.hasNext(); this.field_146996_I -= itemstack1.stackSize - i) + for (Iterator iterator = this.dragSplittingSlots.iterator(); iterator.hasNext(); this.dragSplittingRemnant -= itemstack1.stackSize - i) { Slot slot = (Slot)iterator.next(); itemstack1 = itemstack.copy(); i = slot.getStack() == null ? 0 : slot.getStack().stackSize; - Container.func_94525_a(this.field_147008_s, this.field_146987_F, itemstack1, i); + Container.computeStackSize(this.dragSplittingSlots, this.dragSplittingLimit, itemstack1, i); if (itemstack1.stackSize > itemstack1.getMaxStackSize()) { itemstack1.stackSize = itemstack1.getMaxStackSize(); } - if (itemstack1.stackSize > slot.getSlotStackLimit()) + if (itemstack1.stackSize > slot.getItemStackLimit(itemstack1)) { - itemstack1.stackSize = slot.getSlotStackLimit(); + itemstack1.stackSize = slot.getItemStackLimit(itemstack1); } } } } - private Slot getSlotAtPosition(int p_146975_1_, int p_146975_2_) + /** + * Returns the slot at the given coordinates or null if there is none. + */ + private Slot getSlotAtPosition(int x, int y) { for (int k = 0; k < this.inventorySlots.inventorySlots.size(); ++k) { Slot slot = (Slot)this.inventorySlots.inventorySlots.get(k); - if (this.isMouseOverSlot(slot, p_146975_1_, p_146975_2_)) + if (this.isMouseOverSlot(slot, x, y)) { return slot; } @@ -312,20 +344,23 @@ private Slot getSlotAtPosition(int p_146975_1_, int p_146975_2_) return null; } - protected void mouseClicked(int par1, int par2, int par3) + /** + * Called when the mouse is clicked. Args : mouseX, mouseY, clickedButton + */ + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { - super.mouseClicked(par1, par2, par3); - boolean flag = par3 == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100; - Slot slot = this.getSlotAtPosition(par1, par2); + super.mouseClicked(mouseX, mouseY, mouseButton); + boolean flag = mouseButton == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100; + Slot slot = this.getSlotAtPosition(mouseX, mouseY); long l = Minecraft.getSystemTime(); - this.field_146993_M = this.field_146998_K == slot && l - this.field_146997_J < 250L && this.field_146992_L == par3; - this.field_146995_H = false; + this.doubleClick = this.lastClickSlot == slot && l - this.lastClickTime < 250L && this.lastClickButton == mouseButton; + this.ignoreMouseUp = false; - if (par3 == 0 || par3 == 1 || flag) + if (mouseButton == 0 || mouseButton == 1 || flag) { int i1 = this.guiLeft; int j1 = this.guiTop; - boolean flag1 = par1 < i1 || par2 < j1 || par1 >= i1 + this.xSize || par2 >= j1 + this.ySize; + boolean flag1 = mouseX < i1 || mouseY < j1 || mouseX >= i1 + this.xSize || mouseY >= j1 + this.ySize; int k1 = -1; if (slot != null) @@ -340,7 +375,7 @@ protected void mouseClicked(int par1, int par2, int par3) if (this.mc.gameSettings.touchscreen && flag1 && this.mc.thePlayer.inventory.getItemStack() == null) { - this.mc.displayGuiScreen(null); + this.mc.displayGuiScreen((GuiScreen)null); return; } @@ -352,20 +387,20 @@ protected void mouseClicked(int par1, int par2, int par3) { this.clickedSlot = slot; this.draggedStack = null; - this.isRightMouseClick = par3 == 1; + this.isRightMouseClick = mouseButton == 1; } else { this.clickedSlot = null; } } - else if (!this.field_147007_t) + else if (!this.dragSplitting) { if (this.mc.thePlayer.inventory.getItemStack() == null) { - if (par3 == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100) + if (mouseButton == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100) { - this.handleMouseClick(slot, k1, par3, 3); + this.handleMouseClick(slot, k1, mouseButton, 3); } else { @@ -374,7 +409,7 @@ else if (!this.field_147007_t) if (flag2) { - this.field_146994_N = slot.getHasStack() ? slot.getStack() : null; + this.shiftClickedSlot = slot != null && slot.getHasStack() ? slot.getStack() : null; b0 = 1; } else if (k1 == -999) @@ -382,43 +417,51 @@ else if (k1 == -999) b0 = 4; } - this.handleMouseClick(slot, k1, par3, b0); + this.handleMouseClick(slot, k1, mouseButton, b0); } - this.field_146995_H = true; + this.ignoreMouseUp = true; } else { - this.field_147007_t = true; - this.field_146988_G = par3; - this.field_147008_s.clear(); + this.dragSplitting = true; + this.dragSplittingButton = mouseButton; + this.dragSplittingSlots.clear(); - if (par3 == 0) + if (mouseButton == 0) + { + this.dragSplittingLimit = 0; + } + else if (mouseButton == 1) { - this.field_146987_F = 0; + this.dragSplittingLimit = 1; } - else if (par3 == 1) + else if (mouseButton == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100) { - this.field_146987_F = 1; + this.dragSplittingLimit = 2; } } } } } - this.field_146998_K = slot; - this.field_146997_J = l; - this.field_146992_L = par3; + this.lastClickSlot = slot; + this.lastClickTime = l; + this.lastClickButton = mouseButton; } - protected void mouseClickMove(int p_146273_1_, int p_146273_2_, int p_146273_3_, long p_146273_4_) + /** + * Called when a mouse button is pressed and the mouse is moved around. Parameters are : mouseX, mouseY, + * lastButtonClicked & timeSinceMouseClick. + */ + protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { - Slot slot = this.getSlotAtPosition(p_146273_1_, p_146273_2_); + Slot slot = this.getSlotAtPosition(mouseX, mouseY); ItemStack itemstack = this.mc.thePlayer.inventory.getItemStack(); if (this.clickedSlot != null && this.mc.gameSettings.touchscreen) { - if (p_146273_3_ == 0 || p_146273_3_ == 1) + if (clickedMouseButton == 0 || clickedMouseButton == 1) { if (this.draggedStack == null) { @@ -427,42 +470,46 @@ protected void mouseClickMove(int p_146273_1_, int p_146273_2_, int p_146273_3_, this.draggedStack = this.clickedSlot.getStack().copy(); } } - else if (this.draggedStack.stackSize > 1 && slot != null && Container.func_94527_a(slot, this.draggedStack, false)) + else if (this.draggedStack.stackSize > 1 && slot != null && Container.canAddItemToSlot(slot, this.draggedStack, false)) { long i1 = Minecraft.getSystemTime(); - if (this.field_146985_D == slot) + if (this.currentDragTargetSlot == slot) { - if (i1 - this.field_146986_E > 500L) + if (i1 - this.dragItemDropDelay > 500L) { this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0); this.handleMouseClick(slot, slot.slotNumber, 1, 0); this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0); - this.field_146986_E = i1 + 750L; + this.dragItemDropDelay = i1 + 750L; --this.draggedStack.stackSize; } } else { - this.field_146985_D = slot; - this.field_146986_E = i1; + this.currentDragTargetSlot = slot; + this.dragItemDropDelay = i1; } } } } - else if (this.field_147007_t && slot != null && itemstack != null && itemstack.stackSize > this.field_147008_s.size() && Container.func_94527_a(slot, itemstack, true) && slot.isItemValid(itemstack) && this.inventorySlots.canDragIntoSlot(slot)) + else if (this.dragSplitting && slot != null && itemstack != null && itemstack.stackSize > this.dragSplittingSlots.size() && Container.canAddItemToSlot(slot, itemstack, true) && slot.isItemValid(itemstack) && this.inventorySlots.canDragIntoSlot(slot)) { - this.field_147008_s.add(slot); - this.func_146980_g(); + this.dragSplittingSlots.add(slot); + this.updateDragSplitting(); } } - protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_) + /** + * Called when a mouse button is released. Args : mouseX, mouseY, releaseButton + */ + protected void mouseReleased(int mouseX, int mouseY, int state) { - Slot slot = this.getSlotAtPosition(p_146286_1_, p_146286_2_); + super.mouseReleased(mouseX, mouseY, state); //Forge, Call parent to release buttons + Slot slot = this.getSlotAtPosition(mouseX, mouseY); int l = this.guiLeft; int i1 = this.guiTop; - boolean flag = p_146286_1_ < l || p_146286_2_ < i1 || p_146286_1_ >= l + this.xSize || p_146286_2_ >= i1 + this.ySize; + boolean flag = mouseX < l || mouseY < i1 || mouseX >= l + this.xSize || mouseY >= i1 + this.ySize; int j1 = -1; if (slot != null) @@ -478,11 +525,11 @@ protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_) Slot slot1; Iterator iterator; - if (this.field_146993_M && slot != null && p_146286_3_ == 0 && this.inventorySlots.func_94530_a(null, slot)) + if (this.doubleClick && slot != null && state == 0 && this.inventorySlots.canMergeSlot((ItemStack)null, slot)) { if (isShiftKeyDown()) { - if (slot != null && slot.inventory != null && this.field_146994_N != null) + if (slot != null && slot.inventory != null && this.shiftClickedSlot != null) { iterator = this.inventorySlots.inventorySlots.iterator(); @@ -490,34 +537,34 @@ protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_) { slot1 = (Slot)iterator.next(); - if (slot1 != null && slot1.canTakeStack(this.mc.thePlayer) && slot1.getHasStack() && slot1.inventory == slot.inventory && Container.func_94527_a(slot1, this.field_146994_N, true)) + if (slot1 != null && slot1.canTakeStack(this.mc.thePlayer) && slot1.getHasStack() && slot1.inventory == slot.inventory && Container.canAddItemToSlot(slot1, this.shiftClickedSlot, true)) { - this.handleMouseClick(slot1, slot1.slotNumber, p_146286_3_, 1); + this.handleMouseClick(slot1, slot1.slotNumber, state, 1); } } } } else { - this.handleMouseClick(slot, j1, p_146286_3_, 6); + this.handleMouseClick(slot, j1, state, 6); } - this.field_146993_M = false; - this.field_146997_J = 0L; + this.doubleClick = false; + this.lastClickTime = 0L; } else { - if (this.field_147007_t && this.field_146988_G != p_146286_3_) + if (this.dragSplitting && this.dragSplittingButton != state) { - this.field_147007_t = false; - this.field_147008_s.clear(); - this.field_146995_H = true; + this.dragSplitting = false; + this.dragSplittingSlots.clear(); + this.ignoreMouseUp = true; return; } - if (this.field_146995_H) + if (this.ignoreMouseUp) { - this.field_146995_H = false; + this.ignoreMouseUp = false; return; } @@ -525,25 +572,25 @@ protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_) if (this.clickedSlot != null && this.mc.gameSettings.touchscreen) { - if (p_146286_3_ == 0 || p_146286_3_ == 1) + if (state == 0 || state == 1) { if (this.draggedStack == null && slot != this.clickedSlot) { this.draggedStack = this.clickedSlot.getStack(); } - flag1 = Container.func_94527_a(slot, this.draggedStack, false); + flag1 = Container.canAddItemToSlot(slot, this.draggedStack, false); if (j1 != -1 && this.draggedStack != null && flag1) { - this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, p_146286_3_, 0); + this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, state, 0); this.handleMouseClick(slot, j1, 0, 0); if (this.mc.thePlayer.inventory.getItemStack() != null) { - this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, p_146286_3_, 0); - this.field_147011_y = p_146286_1_ - l; - this.field_147010_z = p_146286_2_ - i1; + this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, state, 0); + this.touchUpX = mouseX - l; + this.touchUpY = mouseY - i1; this.returningStackDestSlot = this.clickedSlot; this.returningStack = this.draggedStack; this.returningStackTime = Minecraft.getSystemTime(); @@ -555,8 +602,8 @@ protected void mouseMovedOrUp(int p_146286_1_, int p_146286_2_, int p_146286_3_) } else if (this.draggedStack != null) { - this.field_147011_y = p_146286_1_ - l; - this.field_147010_z = p_146286_2_ - i1; + this.touchUpX = mouseX - l; + this.touchUpY = mouseY - i1; this.returningStackDestSlot = this.clickedSlot; this.returningStack = this.draggedStack; this.returningStackTime = Minecraft.getSystemTime(); @@ -566,24 +613,24 @@ else if (this.draggedStack != null) this.clickedSlot = null; } } - else if (this.field_147007_t && !this.field_147008_s.isEmpty()) + else if (this.dragSplitting && !this.dragSplittingSlots.isEmpty()) { - this.handleMouseClick(null, -999, Container.func_94534_d(0, this.field_146987_F), 5); - iterator = this.field_147008_s.iterator(); + this.handleMouseClick((Slot)null, -999, Container.func_94534_d(0, this.dragSplittingLimit), 5); + iterator = this.dragSplittingSlots.iterator(); while (iterator.hasNext()) { slot1 = (Slot)iterator.next(); - this.handleMouseClick(slot1, slot1.slotNumber, Container.func_94534_d(1, this.field_146987_F), 5); + this.handleMouseClick(slot1, slot1.slotNumber, Container.func_94534_d(1, this.dragSplittingLimit), 5); } - this.handleMouseClick(null, -999, Container.func_94534_d(2, this.field_146987_F), 5); + this.handleMouseClick((Slot)null, -999, Container.func_94534_d(2, this.dragSplittingLimit), 5); } else if (this.mc.thePlayer.inventory.getItemStack() != null) { - if (p_146286_3_ == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100) + if (state == this.mc.gameSettings.keyBindPickBlock.getKeyCode() + 100) { - this.handleMouseClick(slot, j1, p_146286_3_, 3); + this.handleMouseClick(slot, j1, state, 3); } else { @@ -591,75 +638,93 @@ else if (this.mc.thePlayer.inventory.getItemStack() != null) if (flag1) { - this.field_146994_N = slot != null && slot.getHasStack() ? slot.getStack() : null; + this.shiftClickedSlot = slot != null && slot.getHasStack() ? slot.getStack() : null; } - this.handleMouseClick(slot, j1, p_146286_3_, flag1 ? 1 : 0); + this.handleMouseClick(slot, j1, state, flag1 ? 1 : 0); } } } if (this.mc.thePlayer.inventory.getItemStack() == null) { - this.field_146997_J = 0L; + this.lastClickTime = 0L; } - this.field_147007_t = false; + this.dragSplitting = false; } - private boolean isMouseOverSlot(Slot p_146981_1_, int p_146981_2_, int p_146981_3_) + /** + * Returns if the passed mouse position is over the specified slot. Args : slot, mouseX, mouseY + */ + private boolean isMouseOverSlot(Slot slotIn, int mouseX, int mouseY) { - return this.func_146978_c(p_146981_1_.xDisplayPosition, p_146981_1_.yDisplayPosition, 16, 16, p_146981_2_, p_146981_3_); + return this.isPointInRegion(slotIn.xDisplayPosition, slotIn.yDisplayPosition, 16, 16, mouseX, mouseY); } - protected boolean func_146978_c(int p_146978_1_, int p_146978_2_, int p_146978_3_, int p_146978_4_, int p_146978_5_, int p_146978_6_) + /** + * Test if the 2D point is in a rectangle (relative to the GUI). Args : rectX, rectY, rectWidth, rectHeight, pointX, + * pointY + */ + protected boolean isPointInRegion(int left, int top, int right, int bottom, int pointX, int pointY) { int k1 = this.guiLeft; int l1 = this.guiTop; - p_146978_5_ -= k1; - p_146978_6_ -= l1; - return p_146978_5_ >= p_146978_1_ - 1 && p_146978_5_ < p_146978_1_ + p_146978_3_ + 1 && p_146978_6_ >= p_146978_2_ - 1 && p_146978_6_ < p_146978_2_ + p_146978_4_ + 1; + pointX -= k1; + pointY -= l1; + return pointX >= left - 1 && pointX < left + right + 1 && pointY >= top - 1 && pointY < top + bottom + 1; } - protected void handleMouseClick(Slot p_146984_1_, int p_146984_2_, int p_146984_3_, int p_146984_4_) + /** + * Called when the mouse is clicked over a slot or outside the gui. + */ + protected void handleMouseClick(Slot slotIn, int slotId, int clickedButton, int clickType) { - if (p_146984_1_ != null) + if (slotIn != null) { - p_146984_2_ = p_146984_1_.slotNumber; + slotId = slotIn.slotNumber; } - this.mc.playerController.windowClick(this.inventorySlots.windowId, p_146984_2_, p_146984_3_, p_146984_4_, this.mc.thePlayer); + this.mc.playerController.windowClick(this.inventorySlots.windowId, slotId, clickedButton, clickType, this.mc.thePlayer); } - protected void keyTyped(char par1, int par2) + /** + * Fired when a key is typed (except F11 which toggles full screen). This is the equivalent of + * KeyListener.keyTyped(KeyEvent e). Args : character (character on the key), keyCode (lwjgl Keyboard key code) + */ + protected void keyTyped(char typedChar, int keyCode) throws IOException { - if (par2 == 1 || par2 == this.mc.gameSettings.keyBindInventory.getKeyCode()) + if (keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { this.mc.thePlayer.closeScreen(); } - this.checkHotbarKeys(par2); + this.checkHotbarKeys(keyCode); if (this.theSlot != null && this.theSlot.getHasStack()) { - if (par2 == this.mc.gameSettings.keyBindPickBlock.getKeyCode()) + if (keyCode == this.mc.gameSettings.keyBindPickBlock.getKeyCode()) { this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, 0, 3); } - else if (par2 == this.mc.gameSettings.keyBindDrop.getKeyCode()) + else if (keyCode == this.mc.gameSettings.keyBindDrop.getKeyCode()) { this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, isCtrlKeyDown() ? 1 : 0, 4); } } } - protected boolean checkHotbarKeys(int p_146983_1_) + /** + * This function is what controls the hotbar shortcut check when you press a number key when hovering a stack. Args + * : keyCode, Returns true if a Hotbar key is pressed, else false + */ + protected boolean checkHotbarKeys(int keyCode) { if (this.mc.thePlayer.inventory.getItemStack() == null && this.theSlot != null) { for (int j = 0; j < 9; ++j) { - if (p_146983_1_ == this.mc.gameSettings.keyBindsHotbar[j].getKeyCode()) + if (keyCode == this.mc.gameSettings.keyBindsHotbar[j].getKeyCode()) { this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, j, 2); return true; @@ -670,6 +735,9 @@ protected boolean checkHotbarKeys(int p_146983_1_) return false; } + /** + * Called when the screen is unloaded. Used to disable keyboard repeat events + */ public void onGuiClosed() { if (this.mc.thePlayer != null) @@ -678,11 +746,17 @@ public void onGuiClosed() } } + /** + * Returns true if this GUI should pause the game when it is displayed in single-player + */ public boolean doesGuiPauseGame() { return false; } + /** + * Called from the main game loop to update the screen. + */ public void updateScreen() { super.updateScreen(); diff --git a/src/main/java/vswe/stevesfactory/interfaces/GuiBase.java b/src/main/java/vswe/stevesfactory/interfaces/GuiBase.java index 3ae6df94a..696765cbb 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/GuiBase.java +++ b/src/main/java/vswe/stevesfactory/interfaces/GuiBase.java @@ -1,33 +1,33 @@ package vswe.stevesfactory.interfaces; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.init.Blocks; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Vec3; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; import vswe.stevesfactory.StevesFactoryManager; import vswe.stevesfactory.blocks.TileEntityClusterElement; import vswe.stevesfactory.settings.Settings; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; @SideOnly(Side.CLIENT) @@ -66,12 +66,13 @@ private double fixScaledCoordinate(int val, float scale, int size) { public void drawScaleFriendlyTexture(double x, double y, double srcX, double srcY, double w, double h) { float f = 0.00390625F; float f1 = 0.00390625F; - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV(x + 0, y + h, (double)this.zLevel, (srcX + 0) * f, (srcY + h) * f1); - tessellator.addVertexWithUV(x + w, y + h, (double)this.zLevel, (srcX + w) * f, (srcY + h) * f1); - tessellator.addVertexWithUV(x + w, y + 0, (double)this.zLevel, (srcX + w) * f, (srcY + 0) * f1); - tessellator.addVertexWithUV(x + 0, y + 0, (double)this.zLevel, (srcX + 0) * f, (srcY + 0) * f1); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRenderer = tessellator.getWorldRenderer(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION_TEX); + worldRenderer.pos(x + 0, y + h, (double) this.zLevel).tex((srcX + 0) * f, (srcY + h) * f1).endVertex(); + worldRenderer.pos(x + w, y + h, (double) this.zLevel).tex((srcX + w) * f, (srcY + h) * f1).endVertex(); + worldRenderer.pos(x + w, y + 0, (double) this.zLevel).tex((srcX + w) * f, (srcY + 0) * f1).endVertex(); + worldRenderer.pos(x + 0, y + 0, (double) this.zLevel).tex((srcX + 0) * f, (srcY + 0) * f1).endVertex(); tessellator.draw(); } @@ -84,23 +85,23 @@ public static ResourceLocation registerTexture(String name) { } public void drawString(String str, int x, int y, float mult, int color) { - GL11.glPushMatrix(); - GL11.glScalef(mult, mult, 1F); + GlStateManager.pushMatrix(); + GlStateManager.scale(mult, mult, 1F); fontRendererObj.drawString(str, (int) ((x + guiLeft) / mult), (int) ((y + guiTop) / mult), color); bindTexture(getComponentResource()); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } public void drawSplitString(String str, int x, int y, int w, float mult, int color) { - GL11.glPushMatrix(); - GL11.glScalef(mult, mult, 1F); - fontRendererObj.drawSplitString(str, (int)((x + guiLeft) / mult), (int)((y + guiTop) / mult), (int)(w / mult), color); + GlStateManager.pushMatrix(); + GlStateManager.scale(mult, mult, 1F); + fontRendererObj.drawSplitString(str, (int) ((x + guiLeft) / mult), (int) ((y + guiTop) / mult), (int) (w / mult), color); bindTexture(getComponentResource()); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } public void drawString(String str, int x, int y, int color) { @@ -179,10 +180,10 @@ public void drawMouseOver(IAdvancedTooltip tooltip, int mX, int mY) { } public void drawMouseOver(IAdvancedTooltip tooltip, int x, int y, int mX, int mY) { if (tooltip != null) { - GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GlStateManager.disableRescaleNormal(); RenderHelper.disableStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); List prefix = tooltip.getPrefix(this); @@ -227,10 +228,10 @@ public void drawMouseOver(IAdvancedTooltip tooltip, int x, int y, int mX, int mY this.zLevel = 0.0F; itemRender.zLevel = 0.0F; - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); + GlStateManager.enableLighting(); + GlStateManager.enableDepth(); RenderHelper.enableStandardItemLighting(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GlStateManager.enableRescaleNormal(); } } public int getAdvancedToolTipContentStartX(IAdvancedTooltip tooltip) { @@ -292,14 +293,12 @@ private ItemStack getItemStackFromBlock(TileEntity te) { return ((TileEntityClusterElement)te).getItemStackFromBlock(); } - World world = te.getWorldObj(); + World world = te.getWorld(); Block block = te.getBlockType(); if (world != null && block != null) { - int x = te.xCoord; - int y = te.yCoord; - int z = te.zCoord; + BlockPos pos = te.getPos(); - return getItemStackFromBlock(world, x, y, z, block, world.getBlockMetadata(x, y, z)); + return getItemStackFromBlock(world, pos, block, world.getBlockState(pos)); } } @@ -308,19 +307,21 @@ private ItemStack getItemStackFromBlock(TileEntity te) { public ItemStack getItemStackFromBlock(World world, int x, int y, int z) { if (world != null) { - Block block = world.getBlock(x, y, z); + BlockPos pos = new BlockPos(x, y, z); + Block block = world.getBlockState(pos).getBlock(); if (block != null) { - return getItemStackFromBlock(world, x, y, z, block, world.getBlockMetadata(x, y, z)); + return getItemStackFromBlock(world, pos, block, world.getBlockState(pos)); } } return null; } - private ItemStack getItemStackFromBlock(World world, int x, int y, int z, Block block, int meta) { + private ItemStack getItemStackFromBlock(World world, BlockPos pos, Block block, IBlockState state) { + try { //try to get it by picking the block - ItemStack item = block.getPickBlock(new MovingObjectPosition(x, y, z, 1, Vec3.createVectorHelper(x, y, z)), world, x, y, z); + ItemStack item = block.getPickBlock(new MovingObjectPosition(MovingObjectPosition.MovingObjectType.BLOCK, new Vec3(pos.getX(), pos.getY(), pos.getZ()), EnumFacing.UP, pos), world, pos, FMLClientHandler.instance().getClientPlayerEntity()); if (item != null) { return item; } @@ -329,7 +330,7 @@ private ItemStack getItemStackFromBlock(World world, int x, int y, int z, Block try{ //try to get it from dropped items - List items = block.getDrops(world, x, y, z, meta, 0); + List items = block.getDrops(world, pos, state, 0); if (items != null && items.size() > 0 && items.get(0) != null) { return items.get(0); } @@ -338,30 +339,30 @@ private ItemStack getItemStackFromBlock(World world, int x, int y, int z, Block //get it from its id and meta - return new ItemStack(block, 1, meta); + return new ItemStack(block, 1, block.getMetaFromState(state)); } public void drawItemAmount(ItemStack itemstack, int x, int y) { - itemRender.renderItemOverlayIntoGUI(fontRendererObj, this.mc.getTextureManager(), itemstack, x + guiLeft, y + guiTop); + itemRender.renderItemOverlayIntoGUI(fontRendererObj, itemstack, x + guiLeft, y + guiTop, null); bindTexture(getComponentResource()); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.disableLighting(); } public void drawItemStack(ItemStack itemstack, int x, int y) { - GL11.glPushMatrix(); + GlStateManager.pushMatrix(); RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - GL11.glEnable(GL11.GL_LIGHTING); + GlStateManager.disableLighting(); + GlStateManager.enableRescaleNormal(); + GlStateManager.enableColorMaterial(); + GlStateManager.enableLighting(); itemRender.zLevel = 1F; try { - itemRender.renderItemIntoGUI(fontRendererObj, this.mc.getTextureManager(), itemstack, x + guiLeft, y + guiTop); + itemRender.renderItemIntoGUI(itemstack, x + guiLeft, y + guiTop); }catch (Exception ex) { if (itemstack.getItemDamage() != 0) { ItemStack newStack = itemstack.copy(); @@ -372,11 +373,11 @@ public void drawItemStack(ItemStack itemstack, int x, int y) { itemRender.zLevel = 0F; bindTexture(getComponentResource()); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glPopMatrix(); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.disableLighting(); + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GlStateManager.enableAlpha(); + GlStateManager.popMatrix(); } } @@ -394,25 +395,25 @@ public void drawCursor(int x, int y, int z, int color) { drawCursor(x, y, z, 1F, color); } public void drawCursor(int x, int y, int z, float size, int color) { - GL11.glPushMatrix(); - GL11.glTranslatef(0, 0, z); + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, z); x += guiLeft; y += guiTop; - GL11.glTranslatef(x, y, 0); - GL11.glScalef(size, size, 0); - GL11.glTranslatef(-x, -y, 0); + GlStateManager.translate(x, y, 0); + GlStateManager.scale(size, size, 0); + GlStateManager.translate(-x, -y, 0); Gui.drawRect(x, y + 1, x + 1, y + 10, color); - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } public void drawLine(int x1, int y1, int x2, int y2) { - GL11.glPushMatrix(); + GlStateManager.pushMatrix(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glColor4f(0.4F, 0.4F, 0.4F, 1F); + GlStateManager.disableTexture2D(); + GlStateManager.color(0.4F, 0.4F, 0.4F, 1F); - //GL11.glEnable(GL11.GL_BLEND); + //GlStateManager.enableBlend(); //GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_DST_COLOR); //GL11.glShadeModel(GL11.GL_SMOOTH); //GL11.glEnable(GL11.GL_LINE_SMOOTH); @@ -425,10 +426,10 @@ public void drawLine(int x1, int y1, int x2, int y2) { GL11.glVertex3f(guiLeft + x2, guiTop + y2, 0); GL11.glEnd(); - GL11.glDisable(GL11.GL_BLEND); - GL11.glColor4f(1F, 1F, 1F, 1F); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glPopMatrix(); + GlStateManager.disableBlend(); + GlStateManager.color(1F, 1F, 1F, 1F); + GlStateManager.enableTexture2D(); + GlStateManager.popMatrix(); } @@ -454,23 +455,23 @@ public void drawScreen(int x, int y, float f) { private void startScaling() { //start scale - GL11.glPushMatrix(); + GlStateManager.pushMatrix(); float scale = getScale(); - GL11.glScalef(scale, scale, 1); - GL11.glTranslatef(-guiLeft, -guiTop, 0.0F); - GL11.glTranslatef((this.width - this.xSize * scale) / (2 * scale), (this.height - this.ySize * scale) / (2 * scale), 0.0F); + GlStateManager.scale(scale, scale, 1); + GlStateManager.translate(-guiLeft, -guiTop, 0.0F); + GlStateManager.translate((this.width - this.xSize * scale) / (2 * scale), (this.height - this.ySize * scale) / (2 * scale), 0.0F); } private void stopScaling() { //stop scale - GL11.glPopMatrix(); + GlStateManager.popMatrix(); } protected float getScale() { - net.minecraft.client.gui.ScaledResolution scaledresolution = new net.minecraft.client.gui.ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + net.minecraft.client.gui.ScaledResolution scaledresolution = new net.minecraft.client.gui.ScaledResolution(this.mc); float w = scaledresolution.getScaledWidth() * 0.9F; float h = scaledresolution.getScaledHeight() * 0.9F; float multX = w / xSize; @@ -500,21 +501,25 @@ protected int scaleY(float y) { return (int)y; } - public void drawIcon(IIcon icon, int x, int y) { - drawTexturedModelRectFromIcon(guiLeft + x, guiTop + y, icon, 16, 16); + public void drawIcon(TextureAtlasSprite texture, int x, int y) { + drawTexturedModalRect(guiLeft + x, guiTop + y, texture, 16, 16); } public void drawFluid(Fluid fluid, int x, int y) { + if (fluid == null) { + return; + } + + TextureMap textureMapBlocks = mc.getTextureMapBlocks(); + ResourceLocation fluidStill = fluid.getStill(); + TextureAtlasSprite icon = null; - IIcon icon = fluid.getIcon(); + if (fluidStill != null) + icon = textureMapBlocks.getAtlasSprite(fluidStill.toString()); if (icon == null) { - if (FluidRegistry.WATER.equals(fluid)) { - icon = Blocks.water.getIcon(0, 0); - }else if(FluidRegistry.LAVA.equals(fluid)) { - icon = Blocks.lava.getIcon(0, 0); - } + icon = textureMapBlocks.getMissingSprite(); } if (icon != null) { @@ -523,7 +528,7 @@ public void drawFluid(Fluid fluid, int x, int y) { drawIcon(icon, x, y); - GL11.glColor4f(1F, 1F, 1F, 1F); + GlStateManager.color(1F, 1F, 1F, 1F); bindTexture(getComponentResource()); } } @@ -533,7 +538,7 @@ private void setColor(int color) { for (int i = 0; i < colorComponents.length; i++) { colorComponents[i] = ((color & (255 << (i * 8))) >> (i * 8)) / 255F; } - GL11.glColor4f(colorComponents[2], colorComponents[1], colorComponents[0], 1F); + GlStateManager.color(colorComponents[2], colorComponents[1], colorComponents[0], 1F); } diff --git a/src/main/java/vswe/stevesfactory/interfaces/GuiManager.java b/src/main/java/vswe/stevesfactory/interfaces/GuiManager.java index 4389fba33..5bdd6af91 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/GuiManager.java +++ b/src/main/java/vswe/stevesfactory/interfaces/GuiManager.java @@ -1,16 +1,15 @@ package vswe.stevesfactory.interfaces; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; -import vswe.stevesfactory.StevesFactoryManager; import vswe.stevesfactory.animation.AnimationController; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.components.FlowComponent; @@ -18,6 +17,7 @@ import vswe.stevesfactory.network.DataWriter; import vswe.stevesfactory.network.PacketHandler; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -53,13 +53,13 @@ public ResourceLocation getComponentResource() { public void drawWorldBackground(int val) { if (usePinkScreen) { drawRect(0, 0, width, height, 0xFFEC008C); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); }else if (useBlueScreen) { drawRect(0, 0, width, height, 0xFF000A91); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); }else if (useGreenScreen) { drawRect(0, 0, width, height, 0xFF00FF00); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); }else{ super.drawWorldBackground(val); } @@ -73,7 +73,7 @@ protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { if (!useGreenScreen && !useBlueScreen && !usePinkScreen) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); bindTexture(BACKGROUND_1); drawTexture(0, 0, 0, 0, 256, 256); @@ -172,11 +172,10 @@ protected void drawGuiContainerBackgroundLayer(float f, int x, int y) { } } - public void handleMouseInput() { + @Override + public void handleMouseInput() throws IOException { super.handleMouseInput(); - - int scroll = Mouse.getEventDWheel(); if (scroll != 0) { if (hasSpecialRenderer()) { @@ -217,7 +216,7 @@ private String getInfo() { } @Override - protected void mouseClicked(int x, int y, int button) { + protected void mouseClicked(int x, int y, int button) throws IOException { x = scaleX(x); y = scaleY(y); @@ -283,11 +282,11 @@ protected void mouseClickMove(int x, int y, int button, long ticks) { } @Override - protected void mouseMovedOrUp(int x, int y, int button) { + protected void mouseReleased(int x, int y, int button) { x = scaleX(x); y = scaleY(y); - super.mouseMovedOrUp(x, y, button); + super.mouseReleased(x, y, button); x -= guiLeft; y -= guiTop; @@ -432,7 +431,7 @@ public boolean keyTyped(char c) { } @Override - protected void keyTyped(char c, int k) { + protected void keyTyped(char c, int k) throws IOException{ if (hasSpecialRenderer()) { getSpecialRenderer().onKeyTyped(this, c, k); }else{ diff --git a/src/main/java/vswe/stevesfactory/interfaces/GuiRelay.java b/src/main/java/vswe/stevesfactory/interfaces/GuiRelay.java index 60485ebff..95ab0d98f 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/GuiRelay.java +++ b/src/main/java/vswe/stevesfactory/interfaces/GuiRelay.java @@ -1,12 +1,11 @@ package vswe.stevesfactory.interfaces; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StringUtils; -import org.lwjgl.opengl.GL11; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.TileEntityRelay; @@ -16,8 +15,10 @@ import vswe.stevesfactory.network.PacketHandler; import vswe.stevesfactory.util.Utils; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.UUID; @SideOnly(Side.CLIENT) public class GuiRelay extends GuiBase { @@ -43,7 +44,7 @@ public boolean isEnabled() { @Override public void onClick() { if (relay.getPermissions().size() < TileEntityRelay.PERMISSION_MAX_LENGTH) { - relay.getPermissions().add(new UserPermission(getUserName())); + relay.getPermissions().add(new UserPermission(getUserId(), getUserName())); addUser(); } } @@ -310,7 +311,7 @@ private int getSelectedPermission() { @Override protected void drawGuiContainerBackgroundLayer(float f, int mX, int mY) { hasCachedPermission = false; - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); bindTexture(TEXTURE); drawTexture(0, 0, 0, 0, xSize, ySize); @@ -339,7 +340,7 @@ protected void drawGuiContainerBackgroundLayer(float f, int mX, int mY) { renderInfoBox(j, permission, x + LIST_MENU_WIDTH - (1 + j) * (INFO_SIZE + INFO_MARGIN_X), y + INFO_MARGIN_Y); } - drawString(permission.getName(), x + LIST_TEXT_POS_X, y + LIST_TEXT_POS_Y, 0.7F, 0xEEEEEE); + drawString(permission.getUserName(), x + LIST_TEXT_POS_X, y + LIST_TEXT_POS_Y, 0.7F, 0xEEEEEE); } if (getPageCount() > 1) { @@ -360,7 +361,7 @@ protected void drawGuiContainerBackgroundLayer(float f, int mX, int mY) { UserPermission info = relay.doesListRequireOp() && !isOp(player, true) ? player : selected; if (info != null) { - drawString(info.getName(), INFO_BOX_POS_X + INFO_BOX_NAME_X, INFO_BOX_POS_Y + INFO_BOX_NAME_Y, 0.7F, 0x404040); + drawString(info.getUserName(), INFO_BOX_POS_X + INFO_BOX_NAME_X, INFO_BOX_POS_Y + INFO_BOX_NAME_Y, 0.7F, 0x404040); for (int i = 0; i < 2; i++) { int x = INFO_BOX_POS_X + INFO_BOX_INFO_X; int y = INFO_BOX_POS_Y + INFO_BOX_INFO_Y + i * (INFO_SIZE + INFO_MARGIN_INFO_Y); @@ -431,7 +432,7 @@ private void drawInfoBoxString(int id, UserPermission permission, int x, int y) } private boolean isOwner(UserPermission permission, boolean viewer) { - return (permission != null && permission.getName().equals(relay.getOwner())) || (viewer && getUserName().equals(relay.getOwner())); + return (permission != null && permission.getUserId().equals(relay.getOwner())) || (viewer && getUserId().equals(relay.getOwner())); } private boolean isOp(UserPermission permission, boolean viewer) { @@ -440,7 +441,7 @@ private boolean isOp(UserPermission permission, boolean viewer) { @Override - protected void mouseClicked(int mX, int mY, int b) { + protected void mouseClicked(int mX, int mY, int b) throws IOException { mX = scaleX(mX); mY = scaleY(mY); @@ -499,8 +500,12 @@ protected void mouseClicked(int mX, int mY, int b) { private UserPermission cachedPermission; private boolean hasCachedPermission; + private UUID getUserId() { + return Minecraft.getMinecraft().thePlayer.getUniqueID(); + } + private String getUserName() { - return Utils.stripControlCodes(Minecraft.getMinecraft().thePlayer.getDisplayName()); + return Utils.stripControlCodes(Minecraft.getMinecraft().thePlayer.getDisplayNameString()); } private UserPermission getUserPermission() { @@ -512,7 +517,7 @@ private UserPermission getUserPermission() { } for (UserPermission permission : relay.getPermissions()) { - if (permission.getName().equals(getUserName())) { + if (permission.getUserId().equals(getUserId())) { cachedPermission = permission; break; } @@ -547,7 +552,7 @@ private void removeUser(int id) { private void removeUser() { for (int i = 0; i < relay.getPermissions().size(); i++) { - if (relay.getPermissions().get(i).getName().equals(getUserName())) { + if (relay.getPermissions().get(i).getUserId().equals(getUserId())) { removeUser(i); break; } @@ -566,6 +571,7 @@ private void addUser() { DataWriter dw = PacketHandler.getWriterForServerPacket(); dw.writeBoolean(true); //user data dw.writeBoolean(true); //added + dw.writeString(getUserId().toString(), DataBitHelper.UUID_LENGTH); dw.writeString(getUserName(), DataBitHelper.NAME_LENGTH); PacketHandler.sendDataToServer(dw); } diff --git a/src/main/java/vswe/stevesfactory/interfaces/IAdvancedTooltip.java b/src/main/java/vswe/stevesfactory/interfaces/IAdvancedTooltip.java index f5713d0eb..a0f551376 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/IAdvancedTooltip.java +++ b/src/main/java/vswe/stevesfactory/interfaces/IAdvancedTooltip.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.interfaces; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; diff --git a/src/main/java/vswe/stevesfactory/interfaces/IInterfaceRenderer.java b/src/main/java/vswe/stevesfactory/interfaces/IInterfaceRenderer.java index 046fba7ab..70ceb03d4 100644 --- a/src/main/java/vswe/stevesfactory/interfaces/IInterfaceRenderer.java +++ b/src/main/java/vswe/stevesfactory/interfaces/IInterfaceRenderer.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.interfaces; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public interface IInterfaceRenderer { diff --git a/src/main/java/vswe/stevesfactory/nbt/NBTNode.java b/src/main/java/vswe/stevesfactory/nbt/NBTNode.java index e0a4c5528..0dc044955 100644 --- a/src/main/java/vswe/stevesfactory/nbt/NBTNode.java +++ b/src/main/java/vswe/stevesfactory/nbt/NBTNode.java @@ -105,7 +105,7 @@ public static NBTNode generateNodes(NBTTagCompound compound) { private static NBTNode generateNodesFromTag(NBTTagCompound compound) { NBTNode node = new NBTNode(compound); node.nodes = new ArrayList(); - for (Object obj : compound.func_150296_c()) { + for (Object obj : compound.getKeySet()) { NBTBase tag = (NBTBase)obj; if (tag.getId() == END_TAG) break; @@ -127,7 +127,7 @@ private static NBTNode generateNodesFromList(NBTTagList compound) { private static NBTNode generateNodesFromArray(NBTTagByteArray compound) { NBTNode node = new NBTNode(compound); node.nodes = new ArrayList(); - for (byte b : compound.func_150292_c()) { + for (byte b : compound.getByteArray()) { NBTNode child = new NBTNode(null); child.value = String.valueOf(b); node.nodes.add(child); @@ -138,7 +138,7 @@ private static NBTNode generateNodesFromArray(NBTTagByteArray compound) { private static NBTNode generateNodesFromArray(NBTTagIntArray compound) { NBTNode node = new NBTNode(compound); node.nodes = new ArrayList(); - for (int n : compound.func_150302_c()) { + for (int n : compound.getIntArray()) { NBTNode child = new NBTNode(null); child.value = String.valueOf(n); node.nodes.add(child); diff --git a/src/main/java/vswe/stevesfactory/nbt/NBTRenderer.java b/src/main/java/vswe/stevesfactory/nbt/NBTRenderer.java index c5eb61091..22a5a1aec 100644 --- a/src/main/java/vswe/stevesfactory/nbt/NBTRenderer.java +++ b/src/main/java/vswe/stevesfactory/nbt/NBTRenderer.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.nbt; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.interfaces.GuiManager; import vswe.stevesfactory.interfaces.IInterfaceRenderer; diff --git a/src/main/java/vswe/stevesfactory/network/DataBitHelper.java b/src/main/java/vswe/stevesfactory/network/DataBitHelper.java index 2ebcf887d..563b1d7fc 100644 --- a/src/main/java/vswe/stevesfactory/network/DataBitHelper.java +++ b/src/main/java/vswe/stevesfactory/network/DataBitHelper.java @@ -32,9 +32,8 @@ public enum DataBitHelper { WORLD_COORDINATE(32), GUI_BUTTON_ID(5), - MENU_FLUID_ID(10) //Actually an int, but I think 10 bits is too much anyways. If someone has over 1024 fluids I have a problem - , - MENU_LIQUID_AMOUNT(20), + MENU_FLUID_ID_LENGTH(5), + MENU_FLUID_AMOUNT(20), MENU_SPLIT_DATA_ID(2), @@ -46,6 +45,7 @@ public enum DataBitHelper { PULSE_TICKS(5), NAME_LENGTH(5), + UUID_LENGTH(6), PERMISSION_ID(8), COMMAND_NAME(5), diff --git a/src/main/java/vswe/stevesfactory/network/DataReader.java b/src/main/java/vswe/stevesfactory/network/DataReader.java index 77ada052f..117e2f733 100644 --- a/src/main/java/vswe/stevesfactory/network/DataReader.java +++ b/src/main/java/vswe/stevesfactory/network/DataReader.java @@ -1,9 +1,9 @@ package vswe.stevesfactory.network; -import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTSizeTracker; import net.minecraft.nbt.NBTTagCompound; +import vswe.stevesfactory.util.Utils; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -94,7 +94,7 @@ public NBTTagCompound readNBT(){ } try { - return CompressedStreamTools.func_152457_a(bytes, new NBTSizeTracker(2097152L)); + return Utils.readCompressed(bytes, new NBTSizeTracker(2097152L)); }catch (IOException ex) { return null; } diff --git a/src/main/java/vswe/stevesfactory/network/DataWriter.java b/src/main/java/vswe/stevesfactory/network/DataWriter.java index 18e0a119a..31e59545e 100644 --- a/src/main/java/vswe/stevesfactory/network/DataWriter.java +++ b/src/main/java/vswe/stevesfactory/network/DataWriter.java @@ -1,18 +1,18 @@ package vswe.stevesfactory.network; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.ICrafting; -import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.interfaces.ContainerBase; import vswe.stevesfactory.settings.Settings; +import vswe.stevesfactory.util.Utils; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -78,7 +78,7 @@ public void writeData(int data, int bitCount) { private FMLProxyPacket createPacket() { writeFinalBits(); - ByteBuf buf = Unpooled.copiedBuffer(((ByteArrayOutputStream)stream).toByteArray()); + PacketBuffer buf = new PacketBuffer(Unpooled.copiedBuffer(((ByteArrayOutputStream)stream).toByteArray())); return new FMLProxyPacket(buf, CHANNEL); } @@ -122,7 +122,7 @@ public void writeNBT(NBTTagCompound nbtTagCompound){ if (nbtTagCompound != null) { try { - bytes = CompressedStreamTools.compress(nbtTagCompound); + bytes = Utils.compress(nbtTagCompound); }catch (IOException ex) { bytes = null; } diff --git a/src/main/java/vswe/stevesfactory/network/PacketEventHandler.java b/src/main/java/vswe/stevesfactory/network/PacketEventHandler.java index 177d671fb..858519322 100644 --- a/src/main/java/vswe/stevesfactory/network/PacketEventHandler.java +++ b/src/main/java/vswe/stevesfactory/network/PacketEventHandler.java @@ -1,21 +1,33 @@ package vswe.stevesfactory.network; -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.network.FMLNetworkEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.network.FMLNetworkEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.interfaces.ContainerBase; public class PacketEventHandler { @SideOnly(Side.CLIENT) @SubscribeEvent - public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { + public void onClientPacket(final FMLNetworkEvent.ClientCustomPacketEvent event) { + FMLClientHandler.instance().getClient().addScheduledTask(new Runnable() { + @Override + public void run() { + processClientPacket(event); + } + }); + } + + @SideOnly(Side.CLIENT) + private void processClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { DataReader dr = new DataReader(event.packet.payload().array()); EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer; @@ -38,7 +50,7 @@ public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { int y = dr.readData(DataBitHelper.WORLD_COORDINATE); int z = dr.readData(DataBitHelper.WORLD_COORDINATE); - TileEntity te = player.worldObj.getTileEntity(x, y, z); + TileEntity te = player.worldObj.getTileEntity(new BlockPos(x, y, z)); if (te != null && te instanceof IPacketBlock) { int id = dr.readData(((IPacketBlock) te).infoBitLength(false)); ((IPacketBlock)te).readData(dr, player, false, id); @@ -49,7 +61,17 @@ public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { } @SubscribeEvent - public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { + public void onServerPacket(final FMLNetworkEvent.ServerCustomPacketEvent event) { + EntityPlayerMP player = ((NetHandlerPlayServer)event.handler).playerEntity; + player.getServerForPlayer().addScheduledTask(new Runnable() { + @Override + public void run() { + processServerPacket(event); + } + }); + } + + private void processServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { DataReader dr = new DataReader(event.packet.payload().array()); EntityPlayer player = ((NetHandlerPlayServer)event.handler).playerEntity; @@ -68,7 +90,7 @@ public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { int y = dr.readData(DataBitHelper.WORLD_COORDINATE); int z = dr.readData(DataBitHelper.WORLD_COORDINATE); - TileEntity te = player.worldObj.getTileEntity(x, y, z); + TileEntity te = player.worldObj.getTileEntity(new BlockPos(x, y, z)); if (te != null && te instanceof IPacketBlock) { int id = dr.readData(((IPacketBlock) te).infoBitLength(true)); ((IPacketBlock)te).readData(dr, player, true, id); diff --git a/src/main/java/vswe/stevesfactory/network/PacketHandler.java b/src/main/java/vswe/stevesfactory/network/PacketHandler.java index 0735fdffc..31cb2829d 100644 --- a/src/main/java/vswe/stevesfactory/network/PacketHandler.java +++ b/src/main/java/vswe/stevesfactory/network/PacketHandler.java @@ -1,13 +1,14 @@ package vswe.stevesfactory.network; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.blocks.ITileEntityInterface; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.components.ComponentMenu; @@ -226,13 +227,14 @@ public static void sendRemovalPacket(ContainerManager container, int idToRemove) public static void sendBlockPacket(IPacketBlock block, EntityPlayer player, int id) { if (block instanceof TileEntity) { TileEntity te = (TileEntity)block; + BlockPos pos = te.getPos(); boolean onServer = player == null || !player.worldObj.isRemote; DataWriter dw = new DataWriter(); dw.writeBoolean(false); //no container - dw.writeData(te.xCoord, DataBitHelper.WORLD_COORDINATE); - dw.writeData(te.yCoord, DataBitHelper.WORLD_COORDINATE); - dw.writeData(te.zCoord, DataBitHelper.WORLD_COORDINATE); + dw.writeData(pos.getX(), DataBitHelper.WORLD_COORDINATE); + dw.writeData(pos.getY(), DataBitHelper.WORLD_COORDINATE); + dw.writeData(pos.getZ(), DataBitHelper.WORLD_COORDINATE); int length = block.infoBitLength(onServer); if (length != 0) { dw.writeData(id, length); @@ -244,7 +246,7 @@ public static void sendBlockPacket(IPacketBlock block, EntityPlayer player, int }else if(player != null) { dw.sendPlayerPacket((EntityPlayerMP)player); }else{ - dw.sendPlayerPackets(te.xCoord + 0.5, te.yCoord, te.zCoord, BLOCK_UPDATE_RANGE, te.getWorldObj().provider.dimensionId); + dw.sendPlayerPackets(pos.getX() + 0.5, pos.getY(), pos.getZ(), BLOCK_UPDATE_RANGE, te.getWorld().provider.getDimensionId()); } dw.close(); diff --git a/src/main/java/vswe/stevesfactory/proxy/ClientProxy.java b/src/main/java/vswe/stevesfactory/proxy/ClientProxy.java index 75b986799..4485ff1e5 100644 --- a/src/main/java/vswe/stevesfactory/proxy/ClientProxy.java +++ b/src/main/java/vswe/stevesfactory/proxy/ClientProxy.java @@ -1,17 +1,79 @@ package vswe.stevesfactory.proxy; -import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.block.Block; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import vswe.stevesfactory.StevesFactoryManager; import vswe.stevesfactory.blocks.ModBlocks; -import vswe.stevesfactory.blocks.RenderCamouflage; +import vswe.stevesfactory.blocks.client.ModelLoader; import vswe.stevesfactory.settings.Settings; public class ClientProxy extends CommonProxy { + @Override - public void init() { - RenderCamouflage camouflage = new RenderCamouflage(); - ModBlocks.CAMOUFLAGE_RENDER_ID = camouflage.getRenderId(); - RenderingRegistry.registerBlockHandler(camouflage); + public void preInit() { Settings.load(); + ModelLoaderRegistry.registerLoader(new ModelLoader()); + + addVariantNames(ModBlocks.blockCableRelay, "cable_relay", "cable_relay_advanced"); + addVariantNames(ModBlocks.blockCableIntake, "cable_valve", "cable_valve_instant"); + addVariantNames(ModBlocks.blockCableCluster, "cable_cluster", "cable_cluster_advanced"); + addVariantNames(ModBlocks.blockCableCamouflage, "cable_camouflage", "cable_camouflage_inside", "cable_camouflage_transform"); + + registerBlockModel(ModBlocks.blockManager); + registerBlockModel(ModBlocks.blockCable); + registerBlockModel(ModBlocks.blockCableOutput); + registerBlockModel(ModBlocks.blockCableInput); + registerBlockModel(ModBlocks.blockCableCreative); + registerBlockModel(ModBlocks.blockCableBUD); + registerBlockModel(ModBlocks.blockCableBreaker); + registerBlockModel(ModBlocks.blockCableSign); + registerBlockModelForVariant(ModBlocks.blockCableRelay, 0, "cable_relay"); + registerBlockModelForVariant(ModBlocks.blockCableRelay, 8, "cable_relay_advanced"); + registerBlockModelForVariant(ModBlocks.blockCableIntake, 0, "cable_valve"); + registerBlockModelForVariant(ModBlocks.blockCableIntake, 8, "cable_valve_instant"); + registerBlockModelForVariant(ModBlocks.blockCableCluster, 0, "cable_cluster"); + registerBlockModelForVariant(ModBlocks.blockCableCluster, 8, "cable_cluster_advanced"); + registerBlockModelForVariant(ModBlocks.blockCableCamouflage, 0, "cable_camouflage"); + registerBlockModelForVariant(ModBlocks.blockCableCamouflage, 1, "cable_camouflage_inside"); + registerBlockModelForVariant(ModBlocks.blockCableCamouflage, 2, "cable_camouflage_transform"); + } + + private static void addVariantNames(Block block, String... names) { + ResourceLocation[] locations = new ResourceLocation[names.length]; + for (int i = 0; i < names.length; i++) + { + locations[i] = new ResourceLocation(getResource(names[i])); + } + + if(block != null) + ModelBakery.registerItemVariants(Item.getItemFromBlock(block), locations); + } + + private static void registerBlockModelForVariant(Block base, int meta, String variant) { + registerBlockModel(base, meta, getResource(variant)); + } + + private static void registerBlockModel(Block block) { + ResourceLocation resourceLocation = Block.blockRegistry.getNameForObject(block); + + registerBlockModel(block, 0, resourceLocation.toString()); + } + + private static void registerBlockModel(Block block, int meta, String modelName) { + registerItemModel(Item.getItemFromBlock(block), meta, modelName); + } + + private static void registerItemModel(Item item, int meta, String resourcePath) { + ModelResourceLocation modelResourceLocation = new ModelResourceLocation(resourcePath, "inventory"); + net.minecraftforge.client.model.ModelLoader.setCustomModelResourceLocation(item, meta, modelResourceLocation); + } + + public static String getResource(String resource) { + return (StevesFactoryManager.MODID.toLowerCase() + ":") + resource; } } diff --git a/src/main/java/vswe/stevesfactory/proxy/CommonProxy.java b/src/main/java/vswe/stevesfactory/proxy/CommonProxy.java index 01e40620b..c47986bdb 100644 --- a/src/main/java/vswe/stevesfactory/proxy/CommonProxy.java +++ b/src/main/java/vswe/stevesfactory/proxy/CommonProxy.java @@ -2,7 +2,8 @@ public class CommonProxy { - public void init() { + + public void preInit() { } } diff --git a/src/main/java/vswe/stevesfactory/settings/Settings.java b/src/main/java/vswe/stevesfactory/settings/Settings.java index 866496bea..bedf0d34f 100644 --- a/src/main/java/vswe/stevesfactory/settings/Settings.java +++ b/src/main/java/vswe/stevesfactory/settings/Settings.java @@ -1,8 +1,9 @@ package vswe.stevesfactory.settings; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.state.IBlockState; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.blocks.TileEntityManager; import vswe.stevesfactory.network.DataReader; import vswe.stevesfactory.network.DataWriter; @@ -152,22 +153,24 @@ public static void setAutoBlacklist(boolean autoBlacklist) { } public static boolean isLimitless(TileEntityManager manager) { - return ( manager.getWorldObj().getBlockMetadata(manager.xCoord, manager.yCoord, manager.zCoord) & 1) != 0; + IBlockState state = manager.getWorld().getBlockState(manager.getPos()); + return (state.getBlock().getMetaFromState(state) & 1) != 0; } public static void setLimitless(TileEntityManager manager, boolean limitless) { - if (manager.getWorldObj().isRemote) { + if (manager.getWorld().isRemote) { DataWriter dw = PacketHandler.getWriterForServerActionPacket(); dw.writeBoolean(limitless); PacketHandler.sendDataToServer(dw); }else{ - int meta = manager.getWorldObj().getBlockMetadata(manager.xCoord, manager.yCoord, manager.zCoord); + IBlockState state = manager.getWorld().getBlockState(manager.getPos()); + int meta = state.getBlock().getMetaFromState(state); if (limitless) { meta |= 1; }else{ meta &= ~1; } - manager.getWorldObj().setBlockMetadataWithNotify(manager.xCoord, manager.yCoord, manager.zCoord, meta, 3); + manager.getWorld().setBlockState(manager.getPos(), state.getBlock().getStateFromMeta(meta), 3); } } diff --git a/src/main/java/vswe/stevesfactory/settings/SettingsScreen.java b/src/main/java/vswe/stevesfactory/settings/SettingsScreen.java index 7fb21614c..d9e1c4a33 100644 --- a/src/main/java/vswe/stevesfactory/settings/SettingsScreen.java +++ b/src/main/java/vswe/stevesfactory/settings/SettingsScreen.java @@ -1,8 +1,8 @@ package vswe.stevesfactory.settings; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.CollisionHelper; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.TileEntityManager; diff --git a/src/main/java/vswe/stevesfactory/util/Utils.java b/src/main/java/vswe/stevesfactory/util/Utils.java index 38008377b..73a5ae88e 100644 --- a/src/main/java/vswe/stevesfactory/util/Utils.java +++ b/src/main/java/vswe/stevesfactory/util/Utils.java @@ -1,6 +1,13 @@ package vswe.stevesfactory.util; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.nbt.NBTTagCompound; + +import java.io.*; import java.util.regex.Pattern; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; public class Utils { @@ -11,4 +18,40 @@ public static String stripControlCodes(String s) return patternControlCode.matcher(s).replaceAll(""); } + + public static NBTTagCompound readCompressed(byte[] bytes, NBTSizeTracker sizeTracker) throws IOException + { + DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(bytes)))); + NBTTagCompound nbttagcompound; + + try + { + nbttagcompound = CompressedStreamTools.read(datainputstream, sizeTracker); + } + finally + { + datainputstream.close(); + } + + return nbttagcompound; + } + + public static byte[] compress(NBTTagCompound tagCompound) throws IOException + { + ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); + DataOutputStream dataoutputstream = new DataOutputStream(new GZIPOutputStream(bytearrayoutputstream)); + + try + { + CompressedStreamTools.write(tagCompound, dataoutputstream); + } + finally + { + dataoutputstream.close(); + } + + return bytearrayoutputstream.toByteArray(); + } + + } diff --git a/src/main/java/vswe/stevesfactory/waila/Provider.java b/src/main/java/vswe/stevesfactory/waila/Provider.java index 98277e9cb..41d14b7cc 100644 --- a/src/main/java/vswe/stevesfactory/waila/Provider.java +++ b/src/main/java/vswe/stevesfactory/waila/Provider.java @@ -1,71 +1,85 @@ package vswe.stevesfactory.waila; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import mcp.mobius.waila.api.*; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vswe.stevesfactory.Localization; import vswe.stevesfactory.blocks.*; import java.util.List; public class Provider implements IWailaDataProvider { + @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { TileEntity te = accessor.getTileEntity(); if (te != null && !isShiftDown()) { - TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord); + TileEntityCamouflage camouflage = TileEntityCluster.getTileEntity(TileEntityCamouflage.class, te.getWorld(), te.getPos()); if (camouflage != null ) { - int id = camouflage.getId(accessor.getPosition().sideHit); - int meta = camouflage.getMeta(accessor.getPosition().sideHit); + int id = camouflage.getId(accessor.getSide().getIndex()); + int meta = camouflage.getMeta(accessor.getSide().getIndex()); if (id != 0) { Block block = Block.getBlockById(id); if (block != null) { - return new ItemStack(block, 1, block.damageDropped(meta)); + return new ItemStack(block, 1, block.damageDropped(block.getStateFromMeta(meta))); } } } } - return new ItemStack(accessor.getBlock(), 1, accessor.getBlock().damageDropped(accessor.getMetadata())); + return new ItemStack(accessor.getBlock(), 1, accessor.getBlock().damageDropped(accessor.getBlock().getStateFromMeta(accessor.getMetadata()))); } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return currenttip; + public List getWailaHead(ItemStack itemStack, List list, IWailaDataAccessor iWailaDataAccessor, IWailaConfigHandler iWailaConfigHandler) { + return list; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (itemStack != null && itemStack.getItem() == accessor.getStack().getItem()) { - TileEntity te = accessor.getTileEntity(); + public List getWailaBody(ItemStack itemStack, List list, IWailaDataAccessor iWailaDataAccessor, IWailaConfigHandler iWailaConfigHandler) { + if (itemStack != null && itemStack.getItem() == iWailaDataAccessor.getStack().getItem()) { + TileEntity te = iWailaDataAccessor.getTileEntity(); if (te != null ) { if (te instanceof TileEntityCluster) { TileEntityCluster cluster = (TileEntityCluster)te; for (byte type : cluster.getTypes()) { - currenttip.add(ClusterRegistry.getRegistryList().get(type).getItemStack().getDisplayName()); + list.add(ClusterRegistry.getRegistryList().get(type).getItemStack().getDisplayName()); } }else if(te instanceof TileEntityOutput) { TileEntityOutput emitter = (TileEntityOutput)te; if (isShiftDown()) { - for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { - currenttip.add(getEmitterSide(emitter, i, true)); + for (EnumFacing side: EnumFacing.values()) { + list.add(getEmitterSide(emitter, side, true)); } }else{ - currenttip.add(getEmitterSide(emitter, accessor.getPosition().sideHit, false)); + list.add(getEmitterSide(emitter, iWailaDataAccessor.getSide(), false)); } } } } - return currenttip; + return list; + } + + @Override + public List getWailaTail(ItemStack itemStack, List list, IWailaDataAccessor iWailaDataAccessor, IWailaConfigHandler iWailaConfigHandler) { + return list; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { + return tag; } @SideOnly(Side.CLIENT) @@ -73,21 +87,16 @@ private boolean isShiftDown() { return GuiScreen.isShiftKeyDown(); } - private String getEmitterSide(TileEntityOutput emitter, int side, boolean full) { + private String getEmitterSide(TileEntityOutput emitter, EnumFacing side, boolean full) { String str = (emitter.hasStrongSignalAtSide(side) ? Localization.STRONG_POWER.toString() : Localization.WEAK_POWER.toString()) + ": " + emitter.getStrengthFromSide(side) + " "; if (full) { - str = Localization.getForgeDirectionLocalization(side) + " " + str; + str = Localization.getDirectionLocalization(side) + " " + str; } return str; } - @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - return currenttip; - } - public static void callbackRegister(IWailaRegistrar registrar){ Provider instance = new Provider(); registrar.registerBodyProvider(instance, BlockCableCluster.class); @@ -100,4 +109,4 @@ public static void callbackRegister(IWailaRegistrar registrar){ -} +} \ No newline at end of file diff --git a/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapper.java b/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapper.java index 87fae79f8..0d6da9674 100644 --- a/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapper.java +++ b/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapper.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.util.IChatComponent; public abstract class InventoryWrapper implements IInventory { @@ -29,8 +30,8 @@ public ItemStack decrStackSize(int i, int j) { } @Override - public ItemStack getStackInSlotOnClosing(int i) { - return inventory.getStackInSlotOnClosing(i); + public ItemStack removeStackFromSlot(int i) { + return inventory.removeStackFromSlot(i); } @Override @@ -39,13 +40,18 @@ public void setInventorySlotContents(int i, ItemStack itemstack) { } @Override - public String getInventoryName() { - return inventory.getInventoryName(); + public String getName() { + return inventory.getName(); } @Override - public boolean hasCustomInventoryName() { - return inventory.hasCustomInventoryName(); + public boolean hasCustomName() { + return inventory.hasCustomName(); + } + + @Override + public IChatComponent getDisplayName() { + return inventory.getDisplayName(); } @Override @@ -64,17 +70,37 @@ public boolean isUseableByPlayer(EntityPlayer entityplayer) { } @Override - public void openInventory() { - inventory.openInventory(); + public void openInventory(EntityPlayer player) { + inventory.openInventory(player); } @Override - public void closeInventory() { - inventory.closeInventory(); + public void closeInventory(EntityPlayer player) { + inventory.closeInventory(player); } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return inventory.isItemValidForSlot(i, itemstack); } + + @Override + public int getField(int id) { + return inventory.getField(id); + } + + @Override + public void setField(int id, int value) { + inventory.setField(id, value); + } + + @Override + public int getFieldCount() { + return inventory.getFieldCount(); + } + + @Override + public void clear() { + inventory.clear(); + } } diff --git a/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapperHorse.java b/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapperHorse.java index 5d9b7d244..b723ce464 100644 --- a/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapperHorse.java +++ b/src/main/java/vswe/stevesfactory/wrappers/InventoryWrapperHorse.java @@ -1,10 +1,10 @@ package vswe.stevesfactory.wrappers; -import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.ReflectionHelper; public class InventoryWrapperHorse extends InventoryWrapper { @@ -26,7 +26,7 @@ public boolean isItemValidForSlot(int i, ItemStack itemstack) { //armor }else if(i == 1 && horse.getHorseType() == 0) { - return horse.func_110259_cr() && EntityHorse.func_146085_a(itemstack.getItem()); + return horse.canWearArmor() && EntityHorse.isArmorItem(itemstack.getItem()); //chest }else { diff --git a/src/main/resources/assets/stevesfactory/textures/blocks/Thumbs.db b/src/main/resources/assets/stevesfactory/textures/blocks/Thumbs.db deleted file mode 100644 index 2963d72fd0cf4c41cfd7131c8127598ea1e92f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46080 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