From 810191aa897bf6c37d960fed309dd93c2bb29c0b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 5 Apr 2020 18:02:46 +0200 Subject: [PATCH] Cast with Caution - Revisited every unchecked TileEntity cast - Redstone Links can now be toggled with a wrench - Redstong Links are now portable on contraptions - Schematicannon no longer inserts held schematics automatically - Saws no longer accept items when their speed is zero --- .../java/com/simibubi/create/AllBlocks.java | 12 +- .../com/simibubi/create/AllContainers.java | 2 - .../java/com/simibubi/create/AllItems.java | 4 +- .../com/simibubi/create/AllTileEntities.java | 10 +- .../com/simibubi/create/ClientEvents.java | 4 +- src/main/java/com/simibubi/create/Events.java | 73 ----------- .../com/simibubi/create/config/CCommon.java | 2 + .../simibubi/create/foundation/block/ITE.java | 100 ++++++++++++++ .../block/IWithContainerTileEntity.java | 10 +- .../foundation/block/IWithTileEntity.java | 27 ---- .../create/foundation/item/ItemHelper.java | 12 +- .../create/foundation/item/TooltipHelper.java | 2 +- .../create/foundation/utility/Iterate.java | 9 ++ .../utility/data/AllBlocksTagProvider.java | 9 +- .../modules/contraptions/IWrenchable.java | 9 +- .../modules/contraptions/KineticDebugger.java | 2 +- .../contraptions/RotationPropagator.java | 5 +- .../base/GeneratingKineticTileEntity.java | 6 +- .../contraptions/base/KineticBlock.java | 32 ++--- .../contraptions/base/KineticTileEntity.java | 11 +- .../components/actors/DrillBlock.java | 9 +- .../contraptions/BlockMovementTraits.java | 4 +- .../contraptions/bearing/BearingBlock.java | 1 + .../bearing/ClockworkBearingBlock.java | 9 +- .../bearing/MechanicalBearingBlock.java | 9 +- .../piston/MechanicalPistonBlock.java | 16 ++- .../contraptions/pulley/PulleyBlock.java | 9 +- .../crafter/MechanicalCrafterBlock.java | 9 +- .../crafter/MechanicalCrafterTileEntity.java | 2 +- .../components/crank/HandCrankBlock.java | 9 +- .../crusher/CrushingWheelBlock.java | 65 ++++++---- .../crusher/CrushingWheelControllerBlock.java | 122 +++++++++--------- .../components/deployer/DeployerBlock.java | 9 +- .../components/fan/AirCurrent.java | 6 +- .../components/fan/EncasedFanBlock.java | 10 +- .../components/fan/EncasedFanTileEntity.java | 1 + .../flywheel/engine/FurnaceEngineBlock.java | 9 +- .../components/millstone/MillstoneBlock.java | 69 +++++----- .../mixer/MechanicalMixerBlock.java | 9 +- .../press/MechanicalPressBlock.java | 107 ++++++++------- .../contraptions/components/saw/SawBlock.java | 33 +++-- .../components/saw/SawTileEntity.java | 2 - .../components/turntable/TurntableBlock.java | 71 +++++----- .../turntable/TurntableHandler.java | 10 +- .../waterwheel/WaterWheelBlock.java | 62 ++++----- .../contraptions/processing/BasinBlock.java | 69 +++++----- .../processing/BasinOperatingTileEntity.java | 18 ++- .../processing/BasinTileEntity.java | 17 ++- .../redstone/AnalogLeverBlock.java | 54 ++++---- .../sequencer/SequencedGearshiftBlock.java | 15 ++- .../relays/belt/AllBeltAttachments.java | 25 ++-- .../contraptions/relays/belt/BeltBlock.java | 95 +++++++------- .../contraptions/relays/belt/BeltHelper.java | 70 ++++++++++ .../relays/belt/BeltTileEntity.java | 9 +- .../relays/belt/BeltTileEntityRenderer.java | 5 +- .../BeltConnectorHandler.java} | 4 +- .../belt/{ => item}/BeltConnectorItem.java | 16 ++- .../belt/{ => transport}/BeltInventory.java | 100 ++++++-------- .../{ => transport}/BeltMovementHandler.java | 8 +- .../ItemHandlerBeltSegment.java | 2 +- .../{ => transport}/TransportedItemStack.java | 2 +- .../relays/encased/AdjustablePulleyBlock.java | 18 ++- .../relays/encased/EncasedBeltBlock.java | 1 + .../relays/encased/GearshiftBlock.java | 11 +- .../partialWindows/WindowInABlockBlock.java | 113 ++++++++-------- .../partialWindows/WindowLoggingHandler.java | 84 ++++++++++++ .../modules/logistics/InWorldProcessing.java | 2 +- .../{belts => }/AttachedLogisticalBlock.java | 2 +- .../logistics/block/RedstoneLinkBlock.java | 61 +++++---- .../logistics/block/StockswitchBlock.java | 27 ++-- .../belts/BeltAttachableLogisticalBlock.java | 3 +- .../{ => observer}/BeltObserverBlock.java | 13 +- .../BeltObserverFilterSlot.java | 2 +- .../BeltObserverTileEntity.java | 19 +-- .../BeltObserverTileEntityRenderer.java | 2 +- .../block/belts/tunnel}/BeltTunnelBlock.java | 12 +- .../block/belts/tunnel}/BeltTunnelShapes.java | 2 +- .../belts/tunnel}/BeltTunnelTileEntity.java | 4 +- .../tunnel}/BeltTunnelTileEntityRenderer.java | 2 +- .../block/extractor/ExtractorBlock.java | 2 +- .../extractor/ExtractorMovementBehaviour.java | 2 +- .../block/extractor/ExtractorSlots.java | 2 +- .../block/extractor/ExtractorTileEntity.java | 2 +- .../block/extractor/LinkedExtractorBlock.java | 2 +- .../block/{belts => funnel}/FunnelBlock.java | 29 +++-- .../{belts => funnel}/FunnelFilterSlot.java | 3 +- .../FunnelMovementBehaviour.java | 2 +- .../{belts => funnel}/FunnelTileEntity.java | 10 +- .../block/inventories/FlexcrateBlock.java | 7 +- .../block/inventories/FlexcrateContainer.java | 10 +- .../transposer/TransposerTileEntity.java | 2 +- .../schematics/ServerSchematicLoader.java | 46 ++++--- .../schematics/block/SchematicTableBlock.java | 40 +++--- .../block/SchematicTableContainer.java | 10 +- .../schematics/block/SchematicannonBlock.java | 47 +++---- .../block/SchematicannonContainer.java | 11 +- .../packet/ConfigureSchematicannonPacket.java | 69 +++++----- 97 files changed, 1254 insertions(+), 932 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/block/ITE.java delete mode 100644 src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltHelper.java rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{BeltConnectorItemHandler.java => item/BeltConnectorHandler.java} (97%) rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{ => item}/BeltConnectorItem.java (92%) rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{ => transport}/BeltInventory.java (83%) rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{ => transport}/BeltMovementHandler.java (95%) rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{ => transport}/ItemHandlerBeltSegment.java (96%) rename src/main/java/com/simibubi/create/modules/contraptions/relays/belt/{ => transport}/TransportedItemStack.java (97%) create mode 100644 src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowLoggingHandler.java rename src/main/java/com/simibubi/create/modules/logistics/block/{belts => }/AttachedLogisticalBlock.java (98%) rename src/main/java/com/simibubi/create/modules/logistics/block/belts/{ => observer}/BeltObserverBlock.java (96%) rename src/main/java/com/simibubi/create/modules/logistics/block/belts/{ => observer}/BeltObserverFilterSlot.java (91%) rename src/main/java/com/simibubi/create/modules/logistics/block/belts/{ => observer}/BeltObserverTileEntity.java (76%) rename src/main/java/com/simibubi/create/modules/logistics/block/belts/{ => observer}/BeltObserverTileEntityRenderer.java (92%) rename src/main/java/com/simibubi/create/modules/{contraptions/relays/belt => logistics/block/belts/tunnel}/BeltTunnelBlock.java (95%) rename src/main/java/com/simibubi/create/modules/{contraptions/relays/belt => logistics/block/belts/tunnel}/BeltTunnelShapes.java (96%) rename src/main/java/com/simibubi/create/modules/{contraptions/relays/belt => logistics/block/belts/tunnel}/BeltTunnelTileEntity.java (97%) rename src/main/java/com/simibubi/create/modules/{contraptions/relays/belt => logistics/block/belts/tunnel}/BeltTunnelTileEntityRenderer.java (97%) rename src/main/java/com/simibubi/create/modules/logistics/block/{belts => funnel}/FunnelBlock.java (90%) rename src/main/java/com/simibubi/create/modules/logistics/block/{belts => funnel}/FunnelFilterSlot.java (92%) rename src/main/java/com/simibubi/create/modules/logistics/block/{belts => funnel}/FunnelMovementBehaviour.java (96%) rename src/main/java/com/simibubi/create/modules/logistics/block/{belts => funnel}/FunnelTileEntity.java (93%) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 78829d452..9cb2e32ff 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1,5 +1,8 @@ package com.simibubi.create; +import java.util.HashSet; +import java.util.Set; + import com.simibubi.create.foundation.block.IHaveColorHandler; import com.simibubi.create.foundation.block.IHaveCustomBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem; @@ -45,7 +48,6 @@ import com.simibubi.create.modules.contraptions.redstone.ContactBlock; import com.simibubi.create.modules.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelBlock; import com.simibubi.create.modules.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.modules.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyBlock; @@ -62,14 +64,15 @@ import com.simibubi.create.modules.curiosities.symmetry.block.TriplePlaneSymmetr import com.simibubi.create.modules.gardens.CocoaLogBlock; import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock; import com.simibubi.create.modules.logistics.block.StockswitchBlock; -import com.simibubi.create.modules.logistics.block.belts.BeltObserverBlock; -import com.simibubi.create.modules.logistics.block.belts.FunnelBlock; +import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverBlock; +import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterBlock; import com.simibubi.create.modules.logistics.block.diodes.LatchBlock; import com.simibubi.create.modules.logistics.block.diodes.PulseRepeaterBlock; import com.simibubi.create.modules.logistics.block.diodes.ToggleLatchBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorBlock; +import com.simibubi.create.modules.logistics.block.funnel.FunnelBlock; import com.simibubi.create.modules.logistics.block.inventories.FlexcrateBlock; import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; @@ -107,9 +110,6 @@ import net.minecraftforge.common.ToolType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.IForgeRegistry; -import java.util.HashSet; -import java.util.Set; - public enum AllBlocks { __SCHEMATICS__(), diff --git a/src/main/java/com/simibubi/create/AllContainers.java b/src/main/java/com/simibubi/create/AllContainers.java index 03abb72ff..b2f971810 100644 --- a/src/main/java/com/simibubi/create/AllContainers.java +++ b/src/main/java/com/simibubi/create/AllContainers.java @@ -55,8 +55,6 @@ public enum AllContainers { bind(SCHEMATIC_TABLE, SchematicTableScreen::new); bind(SCHEMATICANNON, SchematicannonScreen::new); bind(FLEXCRATE, FlexcrateScreen::new); -// bind(LOGISTICAL_INDEX, LogisticalIndexScreen::new); -// bind(LOGISTICAL_CONTROLLER, LogisticalInventoryControllerScreen::new); bind(FILTER, FilterScreen::new); bind(ATTRIBUTE_FILTER, AttributeFilterScreen::new); } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 2df371fbb..fd8034a12 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -16,7 +16,7 @@ import com.simibubi.create.foundation.utility.data.ITaggable; import com.simibubi.create.modules.IModule; import com.simibubi.create.modules.contraptions.GogglesItem; import com.simibubi.create.modules.contraptions.WrenchItem; -import com.simibubi.create.modules.contraptions.relays.belt.BeltConnectorItem; +import com.simibubi.create.modules.contraptions.relays.belt.item.BeltConnectorItem; import com.simibubi.create.modules.contraptions.relays.gearbox.VerticalGearboxItem; import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem; import com.simibubi.create.modules.curiosities.RefinedRadianceItem; @@ -42,8 +42,8 @@ import net.minecraft.item.Item; import net.minecraft.item.Item.Properties; import net.minecraft.item.ItemStack; import net.minecraft.item.Rarity; -import net.minecraft.util.ResourceLocation; import net.minecraft.item.SwordItem; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.event.RegistryEvent; diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 5825be755..2ffc992a1 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -55,8 +55,6 @@ import com.simibubi.create.modules.contraptions.relays.advanced.SpeedControllerT import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntityRenderer; -import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelTileEntityRenderer; import com.simibubi.create.modules.contraptions.relays.elementary.ShaftTileEntity; import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyTileEntity; import com.simibubi.create.modules.contraptions.relays.encased.ClutchTileEntity; @@ -73,14 +71,16 @@ import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEnti import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; import com.simibubi.create.modules.logistics.block.RedstoneLinkTileEntity; import com.simibubi.create.modules.logistics.block.StockswitchTileEntity; -import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntity; -import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntityRenderer; -import com.simibubi.create.modules.logistics.block.belts.FunnelTileEntity; +import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntity; +import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntityRenderer; +import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelTileEntityRenderer; import com.simibubi.create.modules.logistics.block.diodes.FlexPulsepeaterTileEntity; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntity; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntityRenderer; import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity; import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorTileEntity; +import com.simibubi.create.modules.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.modules.logistics.block.inventories.FlexcrateTileEntity; import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerTileEntity; import com.simibubi.create.modules.logistics.block.transposer.TransposerTileEntity; diff --git a/src/main/java/com/simibubi/create/ClientEvents.java b/src/main/java/com/simibubi/create/ClientEvents.java index d6c7cdd55..8f2db88e6 100644 --- a/src/main/java/com/simibubi/create/ClientEvents.java +++ b/src/main/java/com/simibubi/create/ClientEvents.java @@ -13,7 +13,7 @@ import com.simibubi.create.modules.contraptions.KineticDebugger; import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.modules.contraptions.components.contraptions.ChassisRangeDisplay; import com.simibubi.create.modules.contraptions.components.turntable.TurntableHandler; -import com.simibubi.create.modules.contraptions.relays.belt.BeltConnectorItemHandler; +import com.simibubi.create.modules.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.modules.curiosities.zapper.terrainzapper.TerrainZapperRenderHandler; import net.minecraft.client.Minecraft; @@ -60,7 +60,7 @@ public class ClientEvents { public static void onGameTick() { CreateClient.gameTick(); - BeltConnectorItemHandler.gameTick(); + BeltConnectorHandler.gameTick(); TerrainZapperRenderHandler.tick(); } diff --git a/src/main/java/com/simibubi/create/Events.java b/src/main/java/com/simibubi/create/Events.java index 8ba99e87e..6b1b83884 100644 --- a/src/main/java/com/simibubi/create/Events.java +++ b/src/main/java/com/simibubi/create/Events.java @@ -1,27 +1,10 @@ package com.simibubi.create; -import java.util.Arrays; - -import com.simibubi.create.config.AllConfigs; -import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; - -import net.minecraft.block.BlockState; -import net.minecraft.block.FourWayBlock; -import net.minecraft.block.WallBlock; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.state.BooleanProperty; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; -import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.Tags; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock; import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.eventbus.api.Event.Result; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -59,60 +42,4 @@ public class Events { Create.torquePropagator.onUnloadWorld(world); } - @SubscribeEvent - public static void onRightClickBlock(RightClickBlock event) { - if (event.getUseItem() == Result.DENY) - return; - if (event.getEntityLiving().isSneaking()) - return; - if (!event.getPlayer().isAllowEdit()) - return; - if (!AllConfigs.SERVER.curiosities.allowGlassPanesInPartialBlocks.get()) - return; - - ItemStack stack = event.getItemStack(); - if (stack.isEmpty()) - return; - if (!(stack.getItem() instanceof BlockItem)) - return; - BlockItem item = (BlockItem) stack.getItem(); - if (!item.isIn(Tags.Items.GLASS_PANES) - && (item.getBlock() == null || !item.getBlock().isIn(Tags.Blocks.GLASS_PANES))) - return; - - BlockPos pos = event.getPos(); - World world = event.getWorld(); - BlockState blockState = world.getBlockState(pos); - if (!AllBlockTags.WINDOWABLE.matches(blockState)) - return; - if (AllBlocks.WINDOW_IN_A_BLOCK.typeOf(blockState)) - return; - - BlockState defaultState = AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState(); - world.setBlockState(pos, defaultState); - TileEntity te = world.getTileEntity(pos); - if (te != null && te instanceof WindowInABlockTileEntity) { - WindowInABlockTileEntity wte = (WindowInABlockTileEntity) te; - wte.setWindowBlock(item.getBlock().getDefaultState()); - wte.updateWindowConnections(); - - if (blockState.getBlock() instanceof FourWayBlock) { - for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, - FourWayBlock.WEST)) - blockState = blockState.with(side, false); - } - if (blockState.getBlock() instanceof WallBlock) - blockState = blockState.with(WallBlock.UP, true); - - wte.setPartialBlock(blockState); - wte.requestModelDataUpdate(); - - if (!event.getPlayer().isCreative()) - stack.shrink(1); - event.getPlayer().swingArm(event.getHand()); - } - - event.setCanceled(true); - } - } diff --git a/src/main/java/com/simibubi/create/config/CCommon.java b/src/main/java/com/simibubi/create/config/CCommon.java index 34d02f115..670a4ae5e 100644 --- a/src/main/java/com/simibubi/create/config/CCommon.java +++ b/src/main/java/com/simibubi/create/config/CCommon.java @@ -3,6 +3,7 @@ package com.simibubi.create.config; public class CCommon extends ConfigBase { public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); + public ConfigBool logTeErrors = b(false, "logTeErrors", Comments.logTeErrors); @Override public String getName() { @@ -11,6 +12,7 @@ public class CCommon extends ConfigBase { private static class Comments { static String worldGen = "Modify Create's impact on your terrain"; + static String logTeErrors = "Forward caught TileEntityExceptions to the log at debug level."; } } diff --git a/src/main/java/com/simibubi/create/foundation/block/ITE.java b/src/main/java/com/simibubi/create/foundation/block/ITE.java new file mode 100644 index 000000000..ac09fc6d5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/block/ITE.java @@ -0,0 +1,100 @@ +package com.simibubi.create.foundation.block; + +import java.util.function.Consumer; + +import com.simibubi.create.Create; +import com.simibubi.create.config.AllConfigs; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.dimension.Dimension; +import net.minecraft.world.dimension.DimensionType; + +public interface ITE { + + Class getTileEntityClass(); + + default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer action) { + try { + action.accept(getTileEntity(world, pos)); + } catch (TileEntityException e) {} + } + + @SuppressWarnings("unchecked") + default T getTileEntity(IBlockReader worldIn, BlockPos pos) throws TileEntityException { + TileEntity tileEntity = worldIn.getTileEntity(pos); + Class expectedClass = getTileEntityClass(); + + IWorld world = null; + if (worldIn instanceof IWorld) + world = (IWorld) worldIn; + + if (tileEntity == null) + throw new MissingTileEntityException(world, pos, expectedClass); + if (!expectedClass.isInstance(tileEntity)) + throw new InvalidTileEntityException(world, pos, expectedClass, tileEntity.getClass()); + + return (T) tileEntity; + } + + static class TileEntityException extends Throwable { + private static final long serialVersionUID = 1L; + + public TileEntityException(IWorld world, BlockPos pos, Class teClass) { + super(makeBaseMessage(world, pos, teClass)); + } + + public TileEntityException(String message) { + super(message); + report(this); + } + + static String makeBaseMessage(IWorld world, BlockPos pos, Class expectedTeClass) { + return String.format("[%s] @(%d, %d, %d), expecting a %s", getDimensionName(world), pos.getX(), pos.getY(), + pos.getZ(), expectedTeClass.getSimpleName()); + } + + static String getDimensionName(IWorld world) { + String notAvailable = "Dim N/A"; + if (world == null) + return notAvailable; + Dimension dimension = world.getDimension(); + if (dimension == null) + return notAvailable; + DimensionType type = dimension.getType(); + if (type == null) + return notAvailable; + ResourceLocation registryName = type.getRegistryName(); + if (registryName == null) + return notAvailable; + return registryName.toString(); + } + } + + static class MissingTileEntityException extends TileEntityException { + private static final long serialVersionUID = 1L; + + public MissingTileEntityException(IWorld world, BlockPos pos, Class teClass) { + super("Missing TileEntity: " + makeBaseMessage(world, pos, teClass)); + } + + } + + static class InvalidTileEntityException extends TileEntityException { + private static final long serialVersionUID = 1L; + + public InvalidTileEntityException(IWorld world, BlockPos pos, Class expectedTeClass, Class foundTeClass) { + super("Wrong TileEntity: " + makeBaseMessage(world, pos, expectedTeClass) + ", found " + + foundTeClass.getSimpleName()); + } + } + + static void report(TileEntityException e) { + if (AllConfigs.COMMON.logTeErrors.get()) + Create.logger.debug("TileEntityException thrown!", e); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/block/IWithContainerTileEntity.java b/src/main/java/com/simibubi/create/foundation/block/IWithContainerTileEntity.java index 94ea67e9f..934576b16 100644 --- a/src/main/java/com/simibubi/create/foundation/block/IWithContainerTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/block/IWithContainerTileEntity.java @@ -7,13 +7,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; import net.minecraftforge.fml.network.NetworkHooks; -public interface IWithContainerTileEntity> extends IWithTileEntity { +public interface IWithContainerTileEntity> extends ITE { default void open(IWorld world, BlockPos pos, PlayerEntity player) { - T te = getTileEntity(world, pos); - if (te == null || world.isRemote()) + if (world.isRemote()) return; - NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer); + try { + T te = getTileEntity(world, pos); + NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer); + } catch (TileEntityException e) {} } } diff --git a/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java b/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java deleted file mode 100644 index 3c6cda04c..000000000 --- a/src/main/java/com/simibubi/create/foundation/block/IWithTileEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.simibubi.create.foundation.block; - -import java.util.function.Consumer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockReader; - -public interface IWithTileEntity { - - default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer action) { - @SuppressWarnings("unchecked") - T te = (T) world.getTileEntity(pos); - if (te == null) - return; - action.accept(te); - } - - default T getTileEntity(IBlockReader world, BlockPos pos) { - @SuppressWarnings("unchecked") - T te = (T) world.getTileEntity(pos); - if (te == null) - return null; - return te; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index b75dcffc7..cec27ea45 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -12,15 +12,23 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.config.AllConfigs; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; public class ItemHelper { + public static void dropContents(World world, BlockPos pos, IItemHandler inv) { + for (int slot = 0; slot < inv.getSlots(); slot++) + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot)); + } + public static List multipliedOutput(ItemStack in, ItemStack out) { List stacks = new ArrayList<>(); ItemStack result = out.copy(); @@ -64,7 +72,7 @@ public class ItemHelper { int i = 0; float f = 0.0F; int totalSlots = inv.getSlots(); - + for (int j = 0; j < inv.getSlots(); ++j) { int slotLimit = inv.getSlotLimit(j); if (slotLimit == 0) { @@ -80,7 +88,7 @@ public class ItemHelper { if (totalSlots == 0) return 0; - + f = f / totalSlots; return MathHelper.floor(f * 14.0F) + (i > 0 ? 1 : 0); } diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index 84c13ec57..e4347f52a 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -15,8 +15,8 @@ import com.simibubi.create.modules.IModule; import com.simibubi.create.modules.contraptions.base.IRotate; import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineBlock; import com.simibubi.create.modules.curiosities.tools.AllToolTiers; - import com.simibubi.create.modules.curiosities.tools.SandPaperItem; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.resources.I18n; diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java index f8d1ee966..da562aa42 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java @@ -1,7 +1,11 @@ package com.simibubi.create.foundation.utility; +import java.util.Arrays; +import java.util.List; + import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; public class Iterate { @@ -18,4 +22,9 @@ public class Iterate { return directions; } + public static List hereAndBelow(BlockPos pos) { + return Arrays.asList(pos, pos.down()); + } + + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/data/AllBlocksTagProvider.java b/src/main/java/com/simibubi/create/foundation/utility/data/AllBlocksTagProvider.java index 6d2a3550e..c9e38d726 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/data/AllBlocksTagProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/data/AllBlocksTagProvider.java @@ -1,6 +1,11 @@ package com.simibubi.create.foundation.utility.data; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + import com.simibubi.create.AllBlocks; + import net.minecraft.block.Block; import net.minecraft.data.BlockTagsProvider; import net.minecraft.data.DataGenerator; @@ -8,10 +13,6 @@ import net.minecraft.tags.BlockTags; import net.minecraft.tags.Tag; import net.minecraft.util.ResourceLocation; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - public class AllBlocksTagProvider extends BlockTagsProvider { static Map createdTags; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java b/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java index 719fe908d..667c32468 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java @@ -1,7 +1,14 @@ package com.simibubi.create.modules.contraptions; import com.simibubi.create.foundation.utility.VoxelShaper; -import com.simibubi.create.modules.contraptions.base.*; +import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; +import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity; +import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock; +import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; +import com.simibubi.create.modules.contraptions.base.KineticTileEntity; +import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; + import net.minecraft.block.BlockState; import net.minecraft.item.ItemUseContext; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/KineticDebugger.java b/src/main/java/com/simibubi/create/modules/contraptions/KineticDebugger.java index 683895639..d042bf038 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/KineticDebugger.java @@ -60,7 +60,7 @@ public class KineticDebugger { BlockRayTraceResult ray = (BlockRayTraceResult) obj; TileEntity te = world.getTileEntity(ray.getPos()); - if (te == null || !(te instanceof KineticTileEntity)) + if (!(te instanceof KineticTileEntity)) return null; return (KineticTileEntity) te; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/RotationPropagator.java b/src/main/java/com/simibubi/create/modules/contraptions/RotationPropagator.java index 96955de75..55f24ce90 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/RotationPropagator.java @@ -327,7 +327,10 @@ public class RotationPropagator { while (!frontier.isEmpty()) { final BlockPos pos = frontier.remove(0); - final KineticTileEntity currentTE = (KineticTileEntity) world.getTileEntity(pos); + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof KineticTileEntity)) + continue; + final KineticTileEntity currentTE = (KineticTileEntity) tileEntity; currentTE.removeSource(); currentTE.sendData(); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java index a2e776018..52f45be3a 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/GeneratingKineticTileEntity.java @@ -7,6 +7,7 @@ import com.simibubi.create.modules.contraptions.KineticNetwork; import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; @@ -33,7 +34,10 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { @Override public void setSource(BlockPos source) { super.setSource(source); - KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); + TileEntity tileEntity = world.getTileEntity(source); + if (!(tileEntity instanceof KineticTileEntity)) + return; + KineticTileEntity sourceTe = (KineticTileEntity) tileEntity; if (reActivateSource && sourceTe != null && Math.abs(sourceTe.getSpeed()) >= Math.abs(getGeneratedSpeed())) reActivateSource = false; } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticBlock.java index f74aab4f4..45eaa4939 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticBlock.java @@ -79,30 +79,19 @@ public abstract class KineticBlock extends Block implements IRotate { @Override public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - if (isMoving) { - KineticTileEntity tileEntity = (KineticTileEntity) worldIn.getTileEntity(pos); - if (tileEntity == null) - return; - if (worldIn.isRemote()) - return; - tileEntity.network = null; - tileEntity.source = null; - tileEntity.speed = 0; - } - } - @SuppressWarnings("deprecation") @Override public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) { super.updateNeighbors(stateIn, worldIn, pos, flags); - KineticTileEntity tileEntity = (KineticTileEntity) worldIn.getTileEntity(pos); - if (tileEntity == null) - return; if (worldIn.isRemote()) return; - RotationPropagator.handleAdded(worldIn.getWorld(), pos, tileEntity); + + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (!(tileEntity instanceof KineticTileEntity)) + return; + + KineticTileEntity kte = (KineticTileEntity) tileEntity; + RotationPropagator.handleAdded(worldIn.getWorld(), pos, kte); } @Override @@ -119,12 +108,13 @@ public abstract class KineticBlock extends Block implements IRotate { @Override public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { - TileEntity tileEntity = worldIn.getTileEntity(pos); - if (tileEntity == null || !(tileEntity instanceof KineticTileEntity)) - return; if (worldIn.isRemote) return; + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (!(tileEntity instanceof KineticTileEntity)) + return; + KineticTileEntity kte = (KineticTileEntity) tileEntity; kte.effects.queueRotationIndicators(); } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java index 3f4f88cef..583088575 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/KineticTileEntity.java @@ -104,7 +104,9 @@ public abstract class KineticTileEntity extends SmartTileEntity if (!world.isBlockPresent(source)) return; - KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); + TileEntity tileEntity = world.getTileEntity(source); + KineticTileEntity sourceTe = + tileEntity instanceof KineticTileEntity ? (KineticTileEntity) tileEntity : null; if (sourceTe == null || sourceTe.speed == 0) { removeSource(); detachKinetics(); @@ -266,12 +268,13 @@ public abstract class KineticTileEntity extends SmartTileEntity if (world == null || world.isRemote) return; - KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); - if (sourceTe == null) { + TileEntity tileEntity = world.getTileEntity(source); + if (!(tileEntity instanceof KineticTileEntity)) { removeSource(); return; } + KineticTileEntity sourceTe = (KineticTileEntity) tileEntity; setNetwork(sourceTe.network); } @@ -336,9 +339,11 @@ public abstract class KineticTileEntity extends SmartTileEntity public static void switchToBlockState(World world, BlockPos pos, BlockState state) { if (world.isRemote) return; + TileEntity tileEntityIn = world.getTileEntity(pos); if (!(tileEntityIn instanceof KineticTileEntity)) return; + KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn; if (tileEntity.hasNetwork()) tileEntity.getOrCreateNetwork().remove(tileEntity); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/DrillBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/DrillBlock.java index b63e98d2e..8f9c7b421 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/DrillBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/DrillBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.modules.contraptions.components.actors; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; @@ -25,7 +25,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class DrillBlock extends DirectionalKineticBlock implements IPortableBlock, IWithTileEntity { +public class DrillBlock extends DirectionalKineticBlock implements IPortableBlock, ITE { public static MovementBehaviour MOVEMENT = new DrillMovementBehaviour(); public static DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor(); @@ -93,4 +93,9 @@ public class DrillBlock extends DirectionalKineticBlock implements IPortableBloc return MOVEMENT; } + @Override + public Class getTileEntityClass() { + return DrillTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/BlockMovementTraits.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/BlockMovementTraits.java index 573e4b63d..66812cd98 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/BlockMovementTraits.java @@ -4,9 +4,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.modules.contraptions.components.actors.HarvesterBlock; import com.simibubi.create.modules.contraptions.components.actors.PortableStorageInterfaceBlock; import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; -import com.simibubi.create.modules.logistics.block.belts.FunnelBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; +import com.simibubi.create.modules.logistics.block.funnel.FunnelBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; import net.minecraft.block.AbstractPressurePlateBlock; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/BearingBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/BearingBlock.java index 709a20426..d0b630bd4 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/BearingBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/BearingBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.bearing; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingBlock.java index d94397794..41550f176 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.modules.contraptions.components.contraptions.bearing; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -11,7 +11,7 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class ClockworkBearingBlock extends BearingBlock implements IWithTileEntity { +public class ClockworkBearingBlock extends BearingBlock implements ITE { @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { @@ -40,4 +40,9 @@ public class ClockworkBearingBlock extends BearingBlock implements IWithTileEnti return false; } + @Override + public Class getTileEntityClass() { + return ClockworkBearingTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingBlock.java index 5652a3562..7fe9b061c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.modules.contraptions.components.contraptions.bearing; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -12,7 +12,7 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class MechanicalBearingBlock extends BearingBlock implements IWithTileEntity { +public class MechanicalBearingBlock extends BearingBlock implements ITE { @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { @@ -55,4 +55,9 @@ public class MechanicalBearingBlock extends BearingBlock implements IWithTileEnt withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged); } + @Override + public Class getTileEntityClass() { + return MechanicalBearingTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java index 4f83e3331..712e69d92 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java @@ -3,10 +3,11 @@ package com.simibubi.create.modules.contraptions.components.contraptions.piston; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.config.AllConfigs; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -17,7 +18,11 @@ import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -29,7 +34,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.Tags; public class MechanicalPistonBlock extends DirectionalAxisKineticBlock - implements IWithTileEntity { + implements ITE { public static final EnumProperty STATE = EnumProperty.create("state", PistonState.class); protected boolean isSticky; @@ -166,4 +171,9 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock return VoxelShapes.fullCube(); } + @Override + public Class getTileEntityClass() { + return MechanicalPistonTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyBlock.java index 2f4e36170..cfae85eea 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.pulley; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IHaveNoBlockItem; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock; @@ -23,7 +23,7 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -public class PulleyBlock extends HorizontalAxisKineticBlock implements IWithTileEntity { +public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE { public static EnumProperty HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; @@ -130,4 +130,9 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements IWithTile } + @Override + public Class getTileEntityClass() { + return PulleyTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java index 78c0f96d4..824ee7661 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.crafter; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.IHaveConnectedTextures; import com.simibubi.create.foundation.utility.AngleHelper; @@ -42,7 +42,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; public class MechanicalCrafterBlock extends HorizontalKineticBlock - implements IWithTileEntity, IHaveConnectedTextures { + implements ITE, IHaveConnectedTextures { public static final EnumProperty POINTING = EnumProperty.create("pointing", Pointing.class); @@ -291,4 +291,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock return new InputCTBehaviour(); } + @Override + public Class getTileEntityClass() { + return MechanicalCrafterTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 94af97494..0a538eb5b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -309,7 +309,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos))) return false; TileEntity te = world.getTileEntity(targetPos); - if (te == null || !(te instanceof BeltTileEntity)) + if (!(te instanceof BeltTileEntity)) return false; return ((KineticTileEntity) te).getSpeed() != 0; } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crank/HandCrankBlock.java index 1d455aa0a..a9d24ddb7 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crank/HandCrankBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.modules.contraptions.components.crank; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; @@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class HandCrankBlock extends DirectionalKineticBlock implements IWithTileEntity { +public class HandCrankBlock extends DirectionalKineticBlock implements ITE { public HandCrankBlock() { super(Properties.from(AllBlocks.COGWHEEL.get())); @@ -95,4 +95,9 @@ public class HandCrankBlock extends DirectionalKineticBlock implements IWithTile return state.get(FACING).getAxis(); } + @Override + public Class getTileEntityClass() { + return HandCrankTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelBlock.java index f4e64a5eb..37f9e6487 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelBlock.java @@ -3,8 +3,8 @@ package com.simibubi.create.modules.contraptions.components.crusher; import static com.simibubi.create.modules.contraptions.components.crusher.CrushingWheelControllerBlock.VALID; import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; -import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import net.minecraft.block.BlockState; @@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class CrushingWheelBlock extends RotatedPillarKineticBlock { +public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE { public CrushingWheelBlock() { super(Properties.from(Blocks.DIORITE)); @@ -75,15 +75,22 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock { BlockState otherState = world.getBlockState(otherWheelPos); if (AllBlocks.CRUSHING_WHEEL.typeOf(otherState)) { controllerShouldExist = true; - KineticTileEntity te = (KineticTileEntity) world.getTileEntity(pos); - KineticTileEntity otherTe = (KineticTileEntity) world.getTileEntity(otherWheelPos); - if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) - && te.getSpeed() != 0) { - float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1); - controllerShouldBeValid = facing.getAxisDirection().getOffset() != signum; - } - if (otherState.get(AXIS) != state.get(AXIS)) + + try { + CrushingWheelTileEntity te = getTileEntity(world, pos); + CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos); + + if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) + && te.getSpeed() != 0) { + float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1); + controllerShouldBeValid = facing.getAxisDirection().getOffset() != signum; + } + if (otherState.get(AXIS) != state.get(AXIS)) + controllerShouldExist = false; + + } catch (TileEntityException e) { controllerShouldExist = false; + } } if (!controllerShouldExist) { @@ -108,24 +115,25 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock { @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - KineticTileEntity te = (KineticTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return; - if (entityIn.posY < pos.getY() + 1.25f || !entityIn.onGround) - return; + try { + CrushingWheelTileEntity te = getTileEntity(worldIn, pos); + if (entityIn.posY < pos.getY() + 1.25f || !entityIn.onGround) + return; - double x = 0; - double z = 0; + double x = 0; + double z = 0; - if (state.get(AXIS) == Axis.X) { - z = te.getSpeed() / 20f; - x += (pos.getX() + .5f - entityIn.posX) * .1f; - } - if (state.get(AXIS) == Axis.Z) { - x = te.getSpeed() / -20f; - z += (pos.getZ() + .5f - entityIn.posZ) * .1f; - } - entityIn.setMotion(entityIn.getMotion().add(x, 0, z)); + if (state.get(AXIS) == Axis.X) { + z = te.getSpeed() / 20f; + x += (pos.getX() + .5f - entityIn.posX) * .1f; + } + if (state.get(AXIS) == Axis.Z) { + x = te.getSpeed() / -20f; + z += (pos.getZ() + .5f - entityIn.posZ) * .1f; + } + entityIn.setMotion(entityIn.getMotion().add(x, 0, z)); + + } catch (TileEntityException e) {} } @Override @@ -170,4 +178,9 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock { return 1f; } + @Override + public Class getTileEntityClass() { + return CrushingWheelTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerBlock.java index e5543980d..d53d0d35c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -4,6 +4,8 @@ import java.util.Random; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IHaveNoBlockItem; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import net.minecraft.block.Block; @@ -12,7 +14,6 @@ import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.BlockItemUseContext; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; @@ -33,7 +34,8 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockItem { +public class CrushingWheelControllerBlock extends Block + implements IHaveNoBlockItem, ITE { public static final BooleanProperty VALID = BooleanProperty.create("valid"); @@ -65,11 +67,10 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) return; - CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return; - if (te.processingEntity == entityIn) - entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D)); + withTileEntityDo(worldIn, pos, te -> { + if (te.processingEntity == entityIn) + entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D)); + }); } @Override @@ -77,25 +78,23 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI super.onLanded(worldIn, entityIn); if (CrushingWheelControllerTileEntity.isFrozen()) return; - TileEntity tileEntity = worldIn.getTileEntity(entityIn.getPosition().down()); - if (tileEntity == null) - return; - if (!(tileEntity instanceof CrushingWheelControllerTileEntity)) - return; - CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity; - if (te.crushingspeed == 0) - return; - if (entityIn instanceof ItemEntity) - ((ItemEntity) entityIn).setPickupDelay(10); - if (te.isOccupied()) - return; - boolean isPlayer = entityIn instanceof PlayerEntity; - if (isPlayer && ((PlayerEntity) entityIn).isCreative()) - return; - if (isPlayer && entityIn.world.getDifficulty() == Difficulty.PEACEFUL) - return; - te.startCrushing(entityIn); + try { + CrushingWheelControllerTileEntity te = getTileEntity(worldIn, entityIn.getPosition().down()); + if (te.crushingspeed == 0) + return; + if (entityIn instanceof ItemEntity) + ((ItemEntity) entityIn).setPickupDelay(10); + if (te.isOccupied()) + return; + boolean isPlayer = entityIn instanceof PlayerEntity; + if (isPlayer && ((PlayerEntity) entityIn).isCreative()) + return; + if (isPlayer && entityIn.world.getDifficulty() == Difficulty.PEACEFUL) + return; + + te.startCrushing(entityIn); + } catch (TileEntityException e) {} } @Override @@ -118,32 +117,29 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI } public void updateSpeed(BlockState state, World world, BlockPos pos) { - TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity == null || !(tileEntity instanceof CrushingWheelControllerTileEntity)) - return; - - CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity; - if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) { - if (te.crushingspeed != 0) { - te.crushingspeed = 0; - te.sendData(); + withTileEntityDo(world, pos, te -> { + if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) { + if (te.crushingspeed != 0) { + te.crushingspeed = 0; + te.sendData(); + } + return; } - return; - } - for (Direction d : Direction.values()) { - if (d.getAxis().isVertical()) - continue; - BlockState neighbour = world.getBlockState(pos.offset(d)); - if (!AllBlocks.CRUSHING_WHEEL.typeOf(neighbour)) - continue; - if (neighbour.get(BlockStateProperties.AXIS) == d.getAxis()) - continue; - KineticTileEntity wheelTe = (KineticTileEntity) world.getTileEntity(pos.offset(d)); - te.crushingspeed = Math.abs(wheelTe.getSpeed() / 50f); - te.sendData(); - break; - } + for (Direction d : Direction.values()) { + if (d.getAxis().isVertical()) + continue; + BlockState neighbour = world.getBlockState(pos.offset(d)); + if (!AllBlocks.CRUSHING_WHEEL.typeOf(neighbour)) + continue; + if (neighbour.get(BlockStateProperties.AXIS) == d.getAxis()) + continue; + KineticTileEntity wheelTe = (KineticTileEntity) world.getTileEntity(pos.offset(d)); + te.crushingspeed = Math.abs(wheelTe.getSpeed() / 50f); + te.sendData(); + break; + } + }); } @Override @@ -165,29 +161,27 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI if (new AxisAlignedBB(pos).contains(entity.getPositionVec())) return VoxelShapes.empty(); - CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return VoxelShapes.fullCube(); - if (te.processingEntity == entity) - return VoxelShapes.empty(); + try { + CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos); + if (te.processingEntity == entity) + return VoxelShapes.empty(); + } catch (TileEntityException e) {} } return VoxelShapes.fullCube(); } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - if (worldIn.getTileEntity(pos) == null) - return; - CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos); - for (int slot = 0; slot < te.inventory.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.inventory.getStackInSlot(slot)); - } + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) + return; - worldIn.removeTileEntity(pos); - } + withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory)); + worldIn.removeTileEntity(pos); + } + @Override + public Class getTileEntityClass() { + return CrushingWheelControllerTileEntity.class; } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerBlock.java index 79c815217..5e1fbdba7 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.modules.contraptions.components.deployer; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; @@ -26,7 +26,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; public class DeployerBlock extends DirectionalAxisKineticBlock - implements IWithTileEntity, IPortableBlock { + implements ITE, IPortableBlock { public static MovementBehaviour MOVEMENT = new DeployerMovementBehaviour(); @@ -111,4 +111,9 @@ public class DeployerBlock extends DirectionalAxisKineticBlock return MOVEMENT; } + @Override + public Class getTileEntityClass() { + return DeployerTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/AirCurrent.java index 89fb3a6ab..1522ad3e9 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/AirCurrent.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.config.AllConfigs; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.particle.AirFlowParticleData; +import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.logistics.InWorldProcessing; import com.simibubi.create.modules.logistics.InWorldProcessing.Type; @@ -267,15 +268,16 @@ public class AirCurrent { public void tickBelts() { for (Pair pair : affectedBelts) { BeltTileEntity belt = pair.getKey(); + World world = belt.getWorld(); InWorldProcessing.Type processingType = pair.getRight(); + BeltTileEntity controller = belt.getControllerTE(); if (controller == null) continue; - World world = belt.getWorld(); controller.getInventory().forEachWithin(belt.index + .5f, .51f, (transported) -> { InWorldProcessing.spawnParticlesForProcessing(world, - controller.getInventory().getVectorForOffset(transported.beltPosition), processingType); + BeltHelper.getVectorForOffset(controller, transported.beltPosition), processingType); if (world.isRemote) return null; return InWorldProcessing.applyProcessing(transported, belt, processingType); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanBlock.java index cd7434731..0ae14d53c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanBlock.java @@ -1,7 +1,8 @@ package com.simibubi.create.modules.contraptions.components.fan; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -17,7 +18,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTileEntity { +public class EncasedFanBlock extends DirectionalKineticBlock implements ITE { public EncasedFanBlock() { super(Properties.from(Blocks.ANDESITE)); @@ -90,4 +91,9 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTil return true; } + @Override + public Class getTileEntityClass() { + return EncasedFanTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanTileEntity.java index 502e8ca97..3ec6a244d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanTileEntity.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.CKinetics; import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity; + import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/engine/FurnaceEngineBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/engine/FurnaceEngineBlock.java index 6d77f6eed..f05ca701a 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/engine/FurnaceEngineBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/engine/FurnaceEngineBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.flywheel.engine; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import net.minecraft.block.AbstractFurnaceBlock; @@ -23,7 +23,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber -public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity { +public class FurnaceEngineBlock extends EngineBlock implements ITE { public FurnaceEngineBlock() { super(Properties.from(Blocks.GOLD_BLOCK)); @@ -76,4 +76,9 @@ public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity getTileEntityClass() { + return FurnaceEngineTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneBlock.java index 71d707646..570cd9f9c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneBlock.java @@ -1,6 +1,9 @@ package com.simibubi.create.modules.contraptions.components.millstone; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.modules.contraptions.base.KineticBlock; import net.minecraft.block.BlockState; @@ -8,7 +11,6 @@ import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; @@ -27,7 +29,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; -public class MillstoneBlock extends KineticBlock { +public class MillstoneBlock extends KineticBlock implements ITE { public MillstoneBlock() { super(Properties.from(Blocks.ANDESITE)); @@ -52,29 +54,25 @@ public class MillstoneBlock extends KineticBlock { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { return face == Direction.DOWN; } - + @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { if (!player.getHeldItem(handIn).isEmpty()) return false; - if (worldIn.getTileEntity(pos) == null) - return false; if (worldIn.isRemote) return true; - TileEntity tileEntity = worldIn.getTileEntity(pos); - if (!(tileEntity instanceof MillstoneTileEntity)) - return false; - MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity; - - IItemHandlerModifiable inv = millstone.outputInv; - for (int slot = 0; slot < inv.getSlots(); slot++) { - player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); - inv.setStackInSlot(slot, ItemStack.EMPTY); - } - millstone.markDirty(); - millstone.sendData(); + withTileEntityDo(worldIn, pos, millstone -> { + IItemHandlerModifiable inv = millstone.outputInv; + for (int slot = 0; slot < inv.getSlots(); slot++) { + player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); + inv.setStackInSlot(slot, ItemStack.EMPTY); + } + millstone.markDirty(); + millstone.sendData(); + }); + return true; } @@ -87,15 +85,17 @@ public class MillstoneBlock extends KineticBlock { if (!(entityIn instanceof ItemEntity)) return; - BlockPos pos = entityIn.getPosition(); - TileEntity tileEntity = worldIn.getTileEntity(pos); - if (!(tileEntity instanceof MillstoneTileEntity)) { - tileEntity = worldIn.getTileEntity(pos.down()); - if (!(tileEntity instanceof MillstoneTileEntity)) - return; + MillstoneTileEntity millstone = null; + for (BlockPos pos : Iterate.hereAndBelow(entityIn.getPosition())) { + try { + millstone = getTileEntity(worldIn, pos); + } catch (TileEntityException e) { + continue; + } } + if (millstone == null) + return; - MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity; ItemEntity itemEntity = (ItemEntity) entityIn; LazyOptional capability = millstone.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); if (!capability.isPresent()) @@ -111,18 +111,10 @@ public class MillstoneBlock extends KineticBlock { @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - TileEntity tileEntity = worldIn.getTileEntity(pos); - if (!(tileEntity instanceof MillstoneTileEntity)) - return; - MillstoneTileEntity te = (MillstoneTileEntity) tileEntity; - for (int slot = 0; slot < te.inputInv.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.inputInv.getStackInSlot(slot)); - } - for (int slot = 0; slot < te.outputInv.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.outputInv.getStackInSlot(slot)); - } + withTileEntityDo(worldIn, pos, te -> { + ItemHelper.dropContents(worldIn, pos, te.inputInv); + ItemHelper.dropContents(worldIn, pos, te.outputInv); + }); worldIn.removeTileEntity(pos); } @@ -138,4 +130,9 @@ public class MillstoneBlock extends KineticBlock { return Axis.Y; } + @Override + public Class getTileEntityClass() { + return MillstoneTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/mixer/MechanicalMixerBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/mixer/MechanicalMixerBlock.java index f4558e1e4..00474240d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/mixer/MechanicalMixerBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/mixer/MechanicalMixerBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.mixer; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IHaveCustomBlockItem; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.KineticBlock; @@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; public class MechanicalMixerBlock extends KineticBlock - implements IWithTileEntity, IHaveCustomBlockItem { + implements ITE, IHaveCustomBlockItem { public MechanicalMixerBlock() { super(Properties.from(Blocks.ANDESITE)); @@ -90,4 +90,9 @@ public class MechanicalMixerBlock extends KineticBlock return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_MIXER, properties); } + @Override + public Class getTileEntityClass() { + return MechanicalMixerTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressBlock.java index 8106e87b2..961c6535e 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressBlock.java @@ -6,8 +6,7 @@ import java.util.Optional; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IHaveCustomBlockItem; -import com.simibubi.create.foundation.block.IWithTileEntity; -import com.simibubi.create.foundation.block.SyncedTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; @@ -18,7 +17,7 @@ import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.I import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -39,7 +38,7 @@ import net.minecraft.world.IWorldReader; import net.minecraft.world.World; public class MechanicalPressBlock extends HorizontalKineticBlock - implements IWithTileEntity, IBeltAttachment, IHaveCustomBlockItem { + implements ITE, IBeltAttachment, IHaveCustomBlockItem { public MechanicalPressBlock() { super(Properties.from(Blocks.PISTON)); @@ -63,17 +62,15 @@ public class MechanicalPressBlock extends HorizontalKineticBlock boolean isMoving) { if (worldIn.isRemote) return; - MechanicalPressTileEntity te = (MechanicalPressTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return; - if (worldIn.isBlockPowered(pos)) { + withTileEntityDo(worldIn, pos, te -> { + if (!worldIn.isBlockPowered(pos)) { + te.finished = false; + return; + } if (!te.finished && !te.running && te.getSpeed() != 0) te.start(Mode.WORLD); - } else { - te.finished = false; - } - + }); } @Override @@ -134,54 +131,61 @@ public class MechanicalPressBlock extends HorizontalKineticBlock } @Override - public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { - MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld() - .getTileEntity(state.attachmentPos); + public boolean startProcessingItem(BeltTileEntity belt, TransportedItemStack transported, + BeltAttachmentState state) { + try { + MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos); + if (pressTe.getSpeed() == 0) + return false; + if (pressTe.running) + return false; + if (!pressTe.getRecipe(transported.stack).isPresent()) + return false; - if (pressTe == null || pressTe.getSpeed() == 0) - return false; - if (pressTe.running) - return false; - if (!pressTe.getRecipe(transported.stack).isPresent()) - return false; + state.processingDuration = 1; + pressTe.start(Mode.BELT); + return true; - state.processingDuration = 1; - pressTe.start(Mode.BELT); - return true; + } catch (TileEntityException e) {} + return false; } @Override - public boolean processItem(BeltTileEntity te, TransportedItemStack transportedStack, BeltAttachmentState state) { - MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld() - .getTileEntity(state.attachmentPos); + public boolean processItem(BeltTileEntity belt, TransportedItemStack transportedStack, BeltAttachmentState state) { + try { + MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos); - // Not powered - if (pressTe == null || pressTe.getSpeed() == 0) - return false; + // Not powered + if (pressTe.getSpeed() == 0) + return false; - // Running - if (pressTe.running) { - if (pressTe.runningTicks == 30) { - Optional recipe = pressTe.getRecipe(transportedStack.stack); + // Running + if (!pressTe.running) + return false; + if (pressTe.runningTicks != 30) + return true; - pressTe.pressedItems.clear(); - pressTe.pressedItems.add(transportedStack.stack); + Optional recipe = pressTe.getRecipe(transportedStack.stack); - if (!recipe.isPresent()) - return false; - ItemStack out = recipe.get().getRecipeOutput().copy(); - List multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out); - if (multipliedOutput.isEmpty()) - transportedStack.stack = ItemStack.EMPTY; - transportedStack.stack = multipliedOutput.get(0); + pressTe.pressedItems.clear(); + pressTe.pressedItems.add(transportedStack.stack); - TileEntity controllerTE = te.getWorld().getTileEntity(te.getController()); - if (controllerTE != null && controllerTE instanceof BeltTileEntity) - ((SyncedTileEntity) controllerTE).sendData(); - pressTe.sendData(); - } + if (!recipe.isPresent()) + return false; + + ItemStack out = recipe.get().getRecipeOutput().copy(); + List multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out); + if (multipliedOutput.isEmpty()) + transportedStack.stack = ItemStack.EMPTY; + transportedStack.stack = multipliedOutput.get(0); + + BeltTileEntity controllerTE = belt.getControllerTE(); + if (controllerTE != null) + controllerTE.sendData(); + pressTe.sendData(); return true; - } + + } catch (TileEntityException e) {} return false; } @@ -191,4 +195,9 @@ public class MechanicalPressBlock extends HorizontalKineticBlock return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_PRESS, properties); } + @Override + public Class getTileEntityClass() { + return MechanicalPressTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawBlock.java index 562b65710..1cb3b50e6 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawBlock.java @@ -2,7 +2,8 @@ package com.simibubi.create.modules.contraptions.components.saw; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.components.actors.SawMovementBehaviour; @@ -15,7 +16,6 @@ import net.minecraft.block.Blocks; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.BlockItemUseContext; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; @@ -33,7 +33,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEntity, IPortableBlock { +public class SawBlock extends DirectionalAxisKineticBlock implements ITE, IPortableBlock { public static final BooleanProperty RUNNING = BooleanProperty.create("running"); public static DamageSource damageSourceSaw = new DamageSource("create.saw").setDamageBypassesArmor(); @@ -97,12 +97,13 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn super.onLanded(worldIn, entityIn); if (!(entityIn instanceof ItemEntity)) return; - BlockPos pos = entityIn.getPosition(); - if (!(worldIn.getTileEntity(pos) instanceof SawTileEntity)) - return; if (entityIn.world.isRemote) return; + + BlockPos pos = entityIn.getPosition(); withTileEntityDo(entityIn.world, pos, te -> { + if (te.getSpeed() == 0) + return; te.insertItem((ItemEntity) entityIn); }); } @@ -129,19 +130,12 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (worldIn.getTileEntity(pos) == null) + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - withTileEntityDo(worldIn, pos, te -> { - for (int slot = 0; slot < te.inventory.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.inventory.getStackInSlot(slot)); - } - }); - TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); - } + withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory)); + TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); + worldIn.removeTileEntity(pos); } @Override @@ -149,4 +143,9 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn return MOVEMENT; } + @Override + public Class getTileEntityClass() { + return SawTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawTileEntity.java index 0c0de4a35..2f16da19c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/saw/SawTileEntity.java @@ -148,8 +148,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { if (stack.isEmpty()) continue; -// if (itemMovementFacing.getAxis() == Axis.Z) -// itemMovementFacing = itemMovementFacing.getOpposite(); if (((BeltTileEntity) te).tryInsertingFromSide(itemMovementFacing, stack, false)) inventory.setStackInSlot(slot, ItemStack.EMPTY); else { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableBlock.java index f61cc151b..308cffc24 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableBlock.java @@ -1,5 +1,6 @@ package com.simibubi.create.modules.contraptions.components.turntable; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.base.KineticBlock; @@ -22,7 +23,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class TurntableBlock extends KineticBlock { +public class TurntableBlock extends KineticBlock implements ITE { public TurntableBlock() { super(Properties.from(Blocks.STRIPPED_SPRUCE_LOG)); @@ -40,51 +41,48 @@ public class TurntableBlock extends KineticBlock { @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity e) { - TileEntity te = worldIn.getTileEntity(pos); - if (!(te instanceof KineticTileEntity)) - return; if (!e.onGround) return; if (e.getMotion().y > 0) return; - - float speed = ((KineticTileEntity) te).getSpeed() * 3/10; - World world = e.getEntityWorld(); - - if (speed == 0) - return; if (e.posY < pos.getY() + .5f) return; - if (world.isRemote && (e instanceof PlayerEntity)) { - if (worldIn.getBlockState(e.getPosition()) != state) { - Vec3d origin = VecHelper.getCenterOf(pos); - Vec3d offset = e.getPositionVec().subtract(origin); - offset = VecHelper.rotate(offset, MathHelper.clamp(speed, -16, 16) / 1f, Axis.Y); - Vec3d movement = origin.add(offset).subtract(e.getPositionVec()); - e.setMotion(e.getMotion().add(movement)); + withTileEntityDo(worldIn, pos, te -> { + float speed = ((KineticTileEntity) te).getSpeed() * 3 / 10; + if (speed == 0) + return; + + World world = e.getEntityWorld(); + if (world.isRemote && (e instanceof PlayerEntity)) { + if (worldIn.getBlockState(e.getPosition()) != state) { + Vec3d origin = VecHelper.getCenterOf(pos); + Vec3d offset = e.getPositionVec().subtract(origin); + offset = VecHelper.rotate(offset, MathHelper.clamp(speed, -16, 16) / 1f, Axis.Y); + Vec3d movement = origin.add(offset).subtract(e.getPositionVec()); + e.setMotion(e.getMotion().add(movement)); + e.velocityChanged = true; + } + } + + if ((e instanceof PlayerEntity)) + return; + if (world.isRemote) + return; + + if ((e instanceof LivingEntity)) { + float diff = e.getRotationYawHead() - speed; + ((LivingEntity) e).setIdleTime(20); + e.setRenderYawOffset(diff); + e.setRotationYawHead(diff); + e.onGround = false; e.velocityChanged = true; } - } - - if ((e instanceof PlayerEntity)) - return; - if (world.isRemote) - return; - if ((e instanceof LivingEntity)) { - float diff = e.getRotationYawHead() - speed; - ((LivingEntity) e).setIdleTime(20); - e.setRenderYawOffset(diff); - e.setRotationYawHead(diff); - e.onGround = false; - e.velocityChanged = true; - } - e.rotationYaw -= speed; + e.rotationYaw -= speed; + }); } - // IRotate: - @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { return face == Direction.DOWN; @@ -100,4 +98,9 @@ public class TurntableBlock extends KineticBlock { return false; } + @Override + public Class getTileEntityClass() { + return TurntableTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableHandler.java b/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableHandler.java index 9c6bd75bc..e5769910d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableHandler.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableHandler.java @@ -2,9 +2,9 @@ package com.simibubi.create.modules.contraptions.components.turntable; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import net.minecraft.client.Minecraft; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -22,8 +22,12 @@ public class TurntableHandler { if (mc.isGamePaused()) return; - KineticTileEntity te = (KineticTileEntity) mc.world.getTileEntity(pos); - float speed = te.getSpeed() * 3/10; + TileEntity tileEntity = mc.world.getTileEntity(pos); + if (!(tileEntity instanceof TurntableTileEntity)) + return; + + TurntableTileEntity turnTable = (TurntableTileEntity) tileEntity; + float speed = turnTable.getSpeed() * 3/10; if (speed == 0) return; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/waterwheel/WaterWheelBlock.java index 31dc0c453..dbb8723ae 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/waterwheel/WaterWheelBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.components.waterwheel; import com.simibubi.create.AllBlocks; import com.simibubi.create.config.AllConfigs; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; import net.minecraft.block.BlockState; @@ -20,7 +21,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class WaterWheelBlock extends HorizontalKineticBlock { +public class WaterWheelBlock extends HorizontalKineticBlock implements ITE { public WaterWheelBlock() { super(Properties.from(Blocks.STRIPPED_SPRUCE_WOOD)); @@ -79,46 +80,42 @@ public class WaterWheelBlock extends HorizontalKineticBlock { } private void updateFlowAt(BlockState state, World world, BlockPos pos, Direction f) { - WaterWheelTileEntity te = (WaterWheelTileEntity) world.getTileEntity(pos); - if (te == null) - return; if (f.getAxis() == state.get(HORIZONTAL_FACING).getAxis()) return; - IFluidState fluid = world.getFluidState(pos.offset(f)); - Vec3d flowVec = fluid.getFlow(world, pos.offset(f)); - Direction wf = state.get(HORIZONTAL_FACING); - double flow = 0; - flowVec = flowVec.scale(f.getAxisDirection().getOffset()); + IFluidState fluid = world.getFluidState(pos.offset(f)); + Direction wf = state.get(HORIZONTAL_FACING); boolean clockwise = wf.getAxisDirection() == AxisDirection.POSITIVE; int clockwiseMultiplier = 2; - flowVec = new Vec3d(Math.signum(flowVec.x), Math.signum(flowVec.y), Math.signum(flowVec.z)); - if (wf.getAxis() == Axis.Z) { - if (f.getAxis() == Axis.Y) - flow = flowVec.x > 0 ^ !clockwise ? -flowVec.x * clockwiseMultiplier : -flowVec.x; - if (f.getAxis() == Axis.X) - flow = flowVec.y < 0 ^ !clockwise ? flowVec.y * clockwiseMultiplier : flowVec.y; - } + Vec3d vec = fluid.getFlow(world, pos.offset(f)); + vec = vec.scale(f.getAxisDirection().getOffset()); + vec = new Vec3d(Math.signum(vec.x), Math.signum(vec.y), Math.signum(vec.z)); + Vec3d flow = vec; - if (wf.getAxis() == Axis.X) { - if (f.getAxis() == Axis.Y) - flow = flowVec.z < 0 ^ !clockwise ? flowVec.z * clockwiseMultiplier : flowVec.z; - if (f.getAxis() == Axis.Z) - flow = flowVec.y > 0 ^ !clockwise ? -flowVec.y * clockwiseMultiplier : -flowVec.y; - } + withTileEntityDo(world, pos, te -> { + double flowStrength = 0; - te.setFlow(f, (float) (flow * AllConfigs.SERVER.kinetics.waterWheelSpeed.get() / 2f)); + if (wf.getAxis() == Axis.Z) { + if (f.getAxis() == Axis.Y) + flowStrength = flow.x > 0 ^ !clockwise ? -flow.x * clockwiseMultiplier : -flow.x; + if (f.getAxis() == Axis.X) + flowStrength = flow.y < 0 ^ !clockwise ? flow.y * clockwiseMultiplier : flow.y; + } + + if (wf.getAxis() == Axis.X) { + if (f.getAxis() == Axis.Y) + flowStrength = flow.z < 0 ^ !clockwise ? flow.z * clockwiseMultiplier : flow.z; + if (f.getAxis() == Axis.Z) + flowStrength = flow.y > 0 ^ !clockwise ? -flow.y * clockwiseMultiplier : -flow.y; + } + + te.setFlow(f, (float) (flowStrength * AllConfigs.SERVER.kinetics.waterWheelSpeed.get() / 2f)); + }); } private void updateWheelSpeed(IWorld world, BlockPos pos) { - if (world.isRemote()) - return; - TileEntity tileEntity = world.getTileEntity(pos); - if (!(tileEntity instanceof WaterWheelTileEntity)) - return; - WaterWheelTileEntity te = (WaterWheelTileEntity) tileEntity; - te.updateGeneratedRotation(); + withTileEntityDo(world, pos, WaterWheelTileEntity::updateGeneratedRotation); } @Override @@ -159,4 +156,9 @@ public class WaterWheelBlock extends HorizontalKineticBlock { return true; } + @Override + public Class getTileEntityClass() { + return WaterWheelTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinBlock.java index 27f26b8d7..ba747e778 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.modules.contraptions.processing; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; @@ -12,7 +12,6 @@ import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Hand; @@ -26,7 +25,7 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -public class BasinBlock extends Block implements IWithTileEntity { +public class BasinBlock extends Block implements ITE { public BasinBlock() { super(Properties.from(Blocks.ANDESITE)); @@ -52,16 +51,16 @@ public class BasinBlock extends Block implements IWithTileEntity { + ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false); - if (insertItem.isEmpty()) { - itemEntity.remove(); - return; - } - - itemEntity.setItem(insertItem); + if (insertItem.isEmpty()) { + itemEntity.remove(); + return; + } + itemEntity.setItem(insertItem); + }); } @Override @@ -96,19 +94,15 @@ public class BasinBlock extends Block implements IWithTileEntity { + ItemHelper.dropContents(worldIn, pos, te.inputInventory); + ItemHelper.dropContents(worldIn, pos, te.outputInventory); + }); + worldIn.removeTileEntity(pos); } @Override @@ -123,12 +117,15 @@ public class BasinBlock extends Block implements IWithTileEntity getTileEntityClass() { + return BasinTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinOperatingTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinOperatingTileEntity.java index ec78f988f..e2d21cbe1 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinOperatingTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinOperatingTileEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.processing; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; @@ -84,11 +85,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { if (isRunning()) return false; - TileEntity basinTE = world.getTileEntity(pos.down(2)); - if (basinTE == null || !(basinTE instanceof BasinTileEntity)) + Optional basinTe = getBasin(); + if (!basinTe.isPresent()) return true; if (!basinInv.isPresent()) - basinInv = basinTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + basinInv = basinTe.get().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); if (!basinInv.isPresent()) return true; @@ -160,9 +161,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { sendData(); } - TileEntity basinTE = world.getTileEntity(pos.down(2)); - if (basinTE instanceof BasinTileEntity) - ((BasinTileEntity) basinTE).contentsChanged = false; + getBasin().ifPresent(te -> te.contentsChanged = true); } protected List> getMatchingRecipes() { @@ -176,6 +175,13 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity { } + protected Optional getBasin() { + TileEntity basinTE = world.getTileEntity(pos.down(2)); + if (!(basinTE instanceof BasinTileEntity)) + return Optional.empty(); + return Optional.of((BasinTileEntity) basinTE); + } + protected abstract boolean matchStaticFilters(IRecipe recipe); protected abstract boolean matchBasinRecipe(IRecipe recipe); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinTileEntity.java index 217caedea..377e70692 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/processing/BasinTileEntity.java @@ -1,5 +1,7 @@ package com.simibubi.create.modules.contraptions.processing; +import java.util.Optional; + import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.SyncedTileEntity; @@ -111,11 +113,7 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn } public void onEmptied() { - TileEntity te = world.getTileEntity(pos.up(2)); - if (te == null) - return; - if (te instanceof BasinOperatingTileEntity) - ((BasinOperatingTileEntity) te).basinRemoved = true; + getOperator().ifPresent(te -> te.basinRemoved = true); } @Override @@ -137,13 +135,14 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn if (!contentsChanged) return; contentsChanged = false; + getOperator().ifPresent(te -> te.basinChecker.scheduleUpdate()); + } + private Optional getOperator() { TileEntity te = world.getTileEntity(pos.up(2)); - if (te == null) - return; if (te instanceof BasinOperatingTileEntity) - ((BasinOperatingTileEntity) te).basinChecker.scheduleUpdate(); - + return Optional.of((BasinOperatingTileEntity) te); + return Optional.empty(); } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java index e589d6238..10dc82b2f 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.redstone; import java.util.Random; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -26,7 +26,7 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEntity { +public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE { public AnalogLeverBlock() { super(Properties.from(Blocks.LEVER)); @@ -50,23 +50,24 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn return true; } - boolean sneak = player.isSneaking(); - AnalogLeverTileEntity te = getTileEntity(worldIn, pos); - if (te == null) - return true; + try { + boolean sneak = player.isSneaking(); + AnalogLeverTileEntity te = getTileEntity(worldIn, pos); + te.changeState(sneak); + float f = .25f + ((te.state + 5) / 15f) * .5f; + worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); + } catch (TileEntityException e) {} - te.changeState(sneak); - float f = .25f + ((te.state + 5) / 15f) * .5f; - worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); return true; } @Override public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - AnalogLeverTileEntity tileEntity = getTileEntity(blockAccess, pos); - if (tileEntity == null) + try { + return getTileEntity(blockAccess, pos).state; + } catch (TileEntityException e) { return 0; - return tileEntity.state; + } } @Override @@ -82,21 +83,23 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn @Override @OnlyIn(Dist.CLIENT) public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { - AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); - if (tileEntity == null) - return; - if (tileEntity.state != 0 && rand.nextFloat() < 0.25F) - addParticles(stateIn, worldIn, pos, 0.5F); + try { + AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); + if (tileEntity.state != 0 && rand.nextFloat() < 0.25F) + addParticles(stateIn, worldIn, pos, 0.5F); + } catch (TileEntityException e) {} } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); - if (tileEntity != null && !isMoving && state.getBlock() != newState.getBlock()) { - if (tileEntity.state != 0) - updateNeighbors(state, worldIn, pos); - worldIn.removeTileEntity(pos); - } + try { + AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); + if (!isMoving && state.getBlock() != newState.getBlock()) { + if (tileEntity.state != 0) + updateNeighbors(state, worldIn, pos); + worldIn.removeTileEntity(pos); + } + } catch (TileEntityException e) {} } private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) { @@ -127,4 +130,9 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn super.fillStateContainer(builder.add(HORIZONTAL_FACING, FACE)); } + @Override + public Class getTileEntityClass() { + return AnalogLeverTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index 4a6f00f84..f4a4e47ce 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -1,11 +1,12 @@ package com.simibubi.create.modules.contraptions.relays.advanced.sequencer; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.KineticBlock; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -31,8 +32,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock - implements IWithTileEntity { +public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implements ITE { public static final BooleanProperty VERTICAL = BooleanProperty.create("vertical"); public static final IntegerProperty STATE = IntegerProperty.create("state", 0, 5); @@ -86,9 +86,7 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock return false; } - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - displayScreen((SequencedGearshiftTileEntity) worldIn.getTileEntity(pos)); - }); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen)); return true; } @@ -135,4 +133,9 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock return true; } + @Override + public Class getTileEntityClass() { + return SequencedGearshiftTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/AllBeltAttachments.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/AllBeltAttachments.java index b426d8fc1..1a40ead5c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/AllBeltAttachments.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/AllBeltAttachments.java @@ -6,6 +6,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -13,7 +14,6 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; import net.minecraft.world.World; @@ -59,12 +59,13 @@ public enum AllBeltAttachments { default void onAttachmentPlaced(IWorld world, BlockPos pos, BlockState state) { BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); - TileEntity te = world.getTileEntity(beltPos); - if (te == null || !(te instanceof BeltTileEntity)) + BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos); + + if (belt == null) return; - BeltTileEntity belt = (BeltTileEntity) te; - if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState())) + if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos))) return; + belt.attachmentTracker.addAttachment(world, pos); belt.markDirty(); belt.sendData(); @@ -72,16 +73,18 @@ public enum AllBeltAttachments { default void onAttachmentRemoved(IWorld world, BlockPos pos, BlockState state) { BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); - TileEntity te = world.getTileEntity(beltPos); - if (te == null || !(te instanceof BeltTileEntity)) + BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos); + + if (belt == null) return; - BeltTileEntity belt = (BeltTileEntity) te; - if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState())) + if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos))) return; + belt.attachmentTracker.removeAttachment(pos); belt.markDirty(); belt.sendData(); } + } public static class BeltAttachmentState { @@ -112,8 +115,8 @@ public enum AllBeltAttachments { World world = belt.getWorld(); BlockPos beltPos = belt.getPos(); BlockState beltState = belt.getBlockState(); - List attachmentPositions = ba.attachment.getPotentialAttachmentPositions(world, beltPos, - beltState); + List attachmentPositions = + ba.attachment.getPotentialAttachmentPositions(world, beltPos, beltState); for (BlockPos potentialPos : attachmentPositions) { if (!world.isBlockPresent(potentialPos)) diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java index 70c33b0f6..a8a7209ef 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java @@ -10,11 +10,12 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.block.IHaveColorHandler; import com.simibubi.create.foundation.block.IHaveNoBlockItem; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; -import com.simibubi.create.modules.contraptions.relays.belt.BeltMovementHandler.TransportedEntityInfo; +import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; +import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; @@ -62,7 +63,7 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; public class BeltBlock extends HorizontalKineticBlock - implements IHaveNoBlockItem, IWithTileEntity, IHaveColorHandler { + implements IHaveNoBlockItem, ITE, IHaveColorHandler { public static final IProperty SLOPE = EnumProperty.create("slope", Slope.class); public static final IProperty PART = EnumProperty.create("part", Part.class); @@ -77,8 +78,11 @@ public class BeltBlock extends HorizontalKineticBlock public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { if (face.getAxis() != getRotationAxis(state)) return false; - BeltTileEntity beltEntity = (BeltTileEntity) world.getTileEntity(pos); - return beltEntity != null && beltEntity.hasPulley(); + + try { + return getTileEntity(world, pos).hasPulley(); + } catch (TileEntityException e) {} + return false; } @Override @@ -111,15 +115,9 @@ public class BeltBlock extends HorizontalKineticBlock @Override public void spawnAdditionalDrops(BlockState state, World worldIn, BlockPos pos, ItemStack stack) { - withTileEntityDo(worldIn, pos, te -> { - if (worldIn.isRemote) - return; - if (te.isController()) { - BeltInventory inv = te.getInventory(); - for (TransportedItemStack s : inv.items) - inv.eject(s); - } - }); + BeltTileEntity controllerTE = BeltHelper.getControllerTE(worldIn, pos); + if (controllerTE != null) + controllerTE.getInventory().ejectAll(); } @Override @@ -147,9 +145,6 @@ public class BeltBlock extends HorizontalKineticBlock @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { - BeltTileEntity belt = null; - belt = (BeltTileEntity) worldIn.getTileEntity(pos); - if (state.get(SLOPE) == Slope.VERTICAL) return; if (entityIn instanceof PlayerEntity) { @@ -159,6 +154,8 @@ public class BeltBlock extends HorizontalKineticBlock if (player.abilities.isFlying) return; } + + BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos); if (belt == null || belt.getSpeed() == 0) return; if (entityIn instanceof ItemEntity && entityIn.isAlive()) { @@ -178,12 +175,12 @@ public class BeltBlock extends HorizontalKineticBlock return; } - BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController()); + BeltTileEntity controller = BeltHelper.getControllerTE(worldIn, pos); if (controller == null || controller.passengers == null) return; if (controller.passengers.containsKey(entityIn)) { TransportedEntityInfo info = controller.passengers.get(entityIn); - if (info.ticksSinceLastCollision != 0 || pos.equals(entityIn.getPosition())) + if (info.getTicksSinceLastCollision() != 0 || pos.equals(entityIn.getPosition())) info.refresh(pos, state); } else { controller.passengers.put(entityIn, new TransportedEntityInfo(pos, state)); @@ -224,10 +221,9 @@ public class BeltBlock extends HorizontalKineticBlock return true; } - TileEntity te = worldIn.getTileEntity(pos); - if (te == null || !(te instanceof BeltTileEntity)) + BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos); + if (belt == null) return false; - BeltTileEntity belt = (BeltTileEntity) te; if (isHand) { BeltTileEntity controllerBelt = belt.getControllerTE(); @@ -270,10 +266,6 @@ public class BeltBlock extends HorizontalKineticBlock @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { World world = context.getWorld(); - TileEntity te = world.getTileEntity(context.getPos()); - if (te == null || !(te instanceof BeltTileEntity)) - return ActionResultType.PASS; - BeltTileEntity belt = (BeltTileEntity) te; PlayerEntity player = context.getPlayer(); if (state.get(CASING)) { @@ -289,8 +281,11 @@ public class BeltBlock extends HorizontalKineticBlock if (world.isRemote) return ActionResultType.SUCCESS; world.setBlockState(context.getPos(), state.with(PART, Part.MIDDLE), 2); - belt.detachKinetics(); - belt.attachKinetics(); + BeltTileEntity belt = BeltHelper.getSegmentTE(world, context.getPos()); + if (belt != null) { + belt.detachKinetics(); + belt.attachKinetics(); + } if (!player.isCreative()) player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.get())); return ActionResultType.SUCCESS; @@ -365,15 +360,21 @@ public class BeltBlock extends HorizontalKineticBlock public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { VoxelShape shape = getShape(state, worldIn, pos, context); - BeltTileEntity belt = (BeltTileEntity) worldIn.getTileEntity(pos); - if (belt == null || context.getEntity() == null) - return shape; - BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController()); - if (controller == null) - return shape; - if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) { - return BeltShapes.getCollisionShape(state); - } + + try { + if (context.getEntity() == null) + return shape; + + BeltTileEntity belt = getTileEntity(worldIn, pos); + BeltTileEntity controller = belt.getControllerTE(); + + if (controller == null) + return shape; + if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) { + return BeltShapes.getCollisionShape(state); + } + + } catch (TileEntityException e) {} return shape; } @@ -445,12 +446,8 @@ public class BeltBlock extends HorizontalKineticBlock world.setBlockState(beltPos, currentState.with(CASING, false), 2); } - if (te.isController() && isVertical) { - BeltInventory inventory = te.getInventory(); - for (TransportedItemStack s : inventory.items) - inventory.eject(s); - inventory.items.clear(); - } + if (te.isController() && isVertical) + te.getInventory().ejectAll(); } else { world.destroyBlock(pos, true); return; @@ -490,11 +487,8 @@ public class BeltBlock extends HorizontalKineticBlock TileEntity tileEntity = world.getTileEntity(currentPos); if (tileEntity instanceof BeltTileEntity) { BeltTileEntity te = (BeltTileEntity) tileEntity; - if (te.isController()) { - BeltInventory inv = te.getInventory(); - for (TransportedItemStack stack : inv.items) - inv.eject(stack); - } + if (te.isController()) + te.getInventory().ejectAll(); te.remove(); hasPulley = te.hasPulley(); @@ -608,4 +602,9 @@ public class BeltBlock extends HorizontalKineticBlock return new BeltColor(); } + @Override + public Class getTileEntityClass() { + return BeltTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltHelper.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltHelper.java new file mode 100644 index 000000000..9adbcb5be --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltHelper.java @@ -0,0 +1,70 @@ +package com.simibubi.create.modules.contraptions.relays.belt; + +import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; +import net.minecraft.world.IWorld; + +public class BeltHelper { + + public static BeltTileEntity getSegmentTE(IWorld world, BlockPos pos) { + if (!world.isAreaLoaded(pos, 0)) + return null; + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof BeltTileEntity)) + return null; + return (BeltTileEntity) tileEntity; + } + + public static BeltTileEntity getControllerTE(IWorld world, BlockPos pos) { + BeltTileEntity segment = getSegmentTE(world, pos); + if (segment == null) + return null; + BlockPos controllerPos = segment.controller; + if (controllerPos == null) + return null; + return getSegmentTE(world, controllerPos); + } + + public static BeltTileEntity getBeltAtSegment(BeltTileEntity controller, int segment) { + BlockPos pos = getPositionForOffset(controller, segment); + TileEntity te = controller.getWorld().getTileEntity(pos); + if (te == null || !(te instanceof BeltTileEntity)) + return null; + return (BeltTileEntity) te; + } + + public static BlockPos getPositionForOffset(BeltTileEntity controller, int offset) { + BlockPos pos = controller.getPos(); + Vec3i vec = controller.getBeltFacing().getDirectionVec(); + Slope slope = controller.getBlockState().get(BeltBlock.SLOPE); + int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; + + return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, controller.beltLength - 1) * verticality, + offset * vec.getZ()); + } + + public static Vec3d getVectorForOffset(BeltTileEntity controller, float offset) { + Slope slope = controller.getBlockState().get(BeltBlock.SLOPE); + int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; + float verticalMovement = verticality; + if (offset < .5) + verticalMovement = 0; + verticalMovement = verticalMovement * (Math.min(offset, controller.beltLength - .5f) - .5f); + + Vec3d vec = VecHelper.getCenterOf(controller.getPos()); + Vec3d horizontalMovement = new Vec3d(controller.getBeltFacing().getDirectionVec()).scale(offset - .5f); + + if (slope == Slope.VERTICAL) + horizontalMovement = Vec3d.ZERO; + + vec = vec.add(horizontalMovement).add(0, verticalMovement, 0); + return vec; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java index 45afa22a5..ca05863a0 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntity.java @@ -20,7 +20,10 @@ import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.Tracker; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; -import com.simibubi.create.modules.contraptions.relays.belt.BeltMovementHandler.TransportedEntityInfo; +import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltInventory; +import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler; +import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -99,7 +102,7 @@ public class BeltTileEntity extends KineticTileEntity { passengers.forEach((entity, info) -> { boolean canBeTransported = BeltMovementHandler.canBeTransported(entity); boolean leftTheBelt = - info.ticksSinceLastCollision > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1); + info.getTicksSinceLastCollision() > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1); if (!canBeTransported || leftTheBelt) { toRemove.add(entity); return; @@ -193,7 +196,7 @@ public class BeltTileEntity extends KineticTileEntity { public void applyColor(DyeColor colorIn) { int colorValue = colorIn.getMapColor().colorValue; for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) { - BeltTileEntity belt = (BeltTileEntity) world.getTileEntity(blockPos); + BeltTileEntity belt = BeltHelper.getSegmentTE(world, blockPos); if (belt == null) continue; belt.color = belt.color == -1 ? colorValue : ColorHelper.mixColors(belt.color, colorValue, .5f); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java index e9e2d545b..822d55cca 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java @@ -18,6 +18,7 @@ import com.simibubi.create.foundation.utility.TessellatorHelper; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -97,7 +98,7 @@ public class BeltTileEntityRenderer extends SafeTileEntityRenderer items; + private final List items; final List toInsert; boolean beltMovementPositive; final float SEGMENT_WINDOW = .75f; @@ -52,11 +54,11 @@ public class BeltInventory { // Reverse item collection if belt just reversed if (beltMovementPositive != movingPositive()) { beltMovementPositive = movingPositive(); - Collections.reverse(items); + Collections.reverse(getItems()); belt.markDirty(); belt.sendData(); } - + // Add items from previous cycle if (!toInsert.isEmpty()) { toInsert.forEach(this::insert); @@ -68,7 +70,7 @@ public class BeltInventory { // Assuming the first entry is furthest on the belt TransportedItemStack stackInFront = null; TransportedItemStack current = null; - Iterator iterator = items.iterator(); + Iterator iterator = getItems().iterator(); float beltSpeed = belt.getDirectionAwareBeltMovementSpeed(); Direction movementFacing = belt.getMovementFacing(); @@ -121,7 +123,7 @@ public class BeltInventory { if (!onClient) { // Don't move if belt attachments want to continue processing if (segmentBefore != -1 && current.locked) { - BeltTileEntity beltSegment = getBeltSegment(segmentBefore); + BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore); if (beltSegment != null) { current.locked = false; @@ -143,7 +145,7 @@ public class BeltInventory { int upcomingSegment = (int) (current.beltPosition + (beltMovementPositive ? .5f : -.5f)); for (int segment = upcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset : segment + .5f >= nextOffset; segment += beltMovementPositive ? 1 : -1) { - BeltTileEntity beltSegment = getBeltSegment(segmentBefore); + BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore); if (beltSegment == null) break; for (BeltAttachmentState attachmentState : beltSegment.attachmentTracker.attachments) { @@ -196,7 +198,7 @@ public class BeltInventory { if (segment == -1) continue; if (!world.isRemote) - world.updateComparatorOutputLevel(getPositionForOffset(segment), + world.updateComparatorOutputLevel(BeltHelper.getPositionForOffset(belt, segment), belt.getBlockState().getBlock()); } } @@ -207,7 +209,8 @@ public class BeltInventory { continue; int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; - BlockPos nextPosition = getPositionForOffset(beltMovementPositive ? belt.beltLength : -1); + BlockPos nextPosition = + BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); BlockState state = world.getBlockState(nextPosition); // next block is a basin or a saw @@ -275,7 +278,7 @@ public class BeltInventory { } private boolean stuckAtTunnel(int offset, ItemStack stack, Direction movementDirection) { - BlockPos pos = getPositionForOffset(offset).up(); + BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up(); if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos))) return false; TileEntity te = belt.getWorld().getTileEntity(pos); @@ -313,7 +316,7 @@ public class BeltInventory { private void flapTunnel(int offset, Direction side, boolean inward) { if (belt.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL) return; - BlockPos pos = getPositionForOffset(offset).up(); + BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up(); if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos))) return; TileEntity te = belt.getWorld().getTileEntity(pos); @@ -335,13 +338,13 @@ public class BeltInventory { else if (!beltMovementPositive) segmentPos += 1f; - for (TransportedItemStack stack : items) + for (TransportedItemStack stack : getItems()) if (isBlocking(segment, side, segmentPos, stack)) return false; - for (TransportedItemStack stack : toInsert) + for (TransportedItemStack stack : toInsert) if (isBlocking(segment, side, segmentPos, stack)) return false; - + return true; } @@ -356,25 +359,25 @@ public class BeltInventory { public void addItem(TransportedItemStack newStack) { toInsert.add(newStack); } - + private void insert(TransportedItemStack newStack) { - if (items.isEmpty()) - items.add(newStack); + if (getItems().isEmpty()) + getItems().add(newStack); else { int index = 0; - for (TransportedItemStack stack : items) { + for (TransportedItemStack stack : getItems()) { if (stack.compareTo(newStack) > 0 == beltMovementPositive) break; index++; } - items.add(index, newStack); + getItems().add(index, newStack); } } public TransportedItemStack getStackAtOffset(int offset) { float min = offset + .5f - (SEGMENT_WINDOW / 2); float max = offset + .5f + (SEGMENT_WINDOW / 2); - for (TransportedItemStack stack : items) { + for (TransportedItemStack stack : getItems()) { if (stack.beltPosition > max) break; if (stack.beltPosition > min) @@ -384,16 +387,16 @@ public class BeltInventory { } public void read(CompoundNBT nbt) { - items.clear(); + getItems().clear(); nbt.getList("Items", NBT.TAG_COMPOUND) - .forEach(inbt -> items.add(TransportedItemStack.read((CompoundNBT) inbt))); + .forEach(inbt -> getItems().add(TransportedItemStack.read((CompoundNBT) inbt))); beltMovementPositive = nbt.getBoolean("PositiveOrder"); } public CompoundNBT write() { CompoundNBT nbt = new CompoundNBT(); ListNBT itemsNBT = new ListNBT(); - items.forEach(stack -> itemsNBT.add(stack.serializeNBT())); + getItems().forEach(stack -> itemsNBT.add(stack.serializeNBT())); nbt.put("Items", itemsNBT); nbt.putBoolean("PositiveOrder", beltMovementPositive); return nbt; @@ -401,7 +404,7 @@ public class BeltInventory { public void eject(TransportedItemStack stack) { ItemStack ejected = stack.stack; - Vec3d outPos = getVectorForOffset(stack.beltPosition); + Vec3d outPos = BeltHelper.getVectorForOffset(belt, stack.beltPosition); float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f); Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed).add(0, 1 / 8f, 0); outPos.add(outMotion.normalize()); @@ -412,40 +415,9 @@ public class BeltInventory { belt.getWorld().addEntity(entity); } - public Vec3d getVectorForOffset(float offset) { - Slope slope = belt.getBlockState().get(BeltBlock.SLOPE); - int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; - float verticalMovement = verticality; - if (offset < .5) - verticalMovement = 0; - verticalMovement = verticalMovement * (Math.min(offset, belt.beltLength - .5f) - .5f); - - Vec3d vec = VecHelper.getCenterOf(belt.getPos()); - Vec3d horizontalMovement = new Vec3d(belt.getBeltFacing().getDirectionVec()).scale(offset - .5f); - - if (slope == Slope.VERTICAL) - horizontalMovement = Vec3d.ZERO; - - vec = vec.add(horizontalMovement).add(0, verticalMovement, 0); - return vec; - } - - private BeltTileEntity getBeltSegment(int segment) { - BlockPos pos = getPositionForOffset(segment); - TileEntity te = belt.getWorld().getTileEntity(pos); - if (te == null || !(te instanceof BeltTileEntity)) - return null; - return (BeltTileEntity) te; - } - - private BlockPos getPositionForOffset(int offset) { - BlockPos pos = belt.getPos(); - Vec3i vec = belt.getBeltFacing().getDirectionVec(); - Slope slope = belt.getBlockState().get(BeltBlock.SLOPE); - int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; - - return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, belt.beltLength - 1) * verticality, - offset * vec.getZ()); + public void ejectAll() { + getItems().forEach(this::eject); + getItems().clear(); } private boolean movingPositive() { @@ -460,7 +432,7 @@ public class BeltInventory { Function> callback) { List toBeAdded = new ArrayList<>(); boolean dirty = false; - for (Iterator iterator = items.iterator(); iterator.hasNext();) { + for (Iterator iterator = getItems().iterator(); iterator.hasNext();) { TransportedItemStack transportedItemStack = iterator.next(); if (Math.abs(position - transportedItemStack.beltPosition) < distance) { List apply = callback.apply(transportedItemStack); @@ -478,4 +450,8 @@ public class BeltInventory { } } + public List getItems() { + return items; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltMovementHandler.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltMovementHandler.java similarity index 95% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltMovementHandler.java rename to src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltMovementHandler.java index 3189c5e70..0f32f074b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltMovementHandler.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltMovementHandler.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.contraptions.relays.belt.transport; import static net.minecraft.entity.MoverType.SELF; import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; @@ -9,8 +9,10 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; +import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; +import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -50,6 +52,10 @@ public class BeltMovementHandler { ticksSinceLastCollision++; return this; } + + public int getTicksSinceLastCollision() { + return ticksSinceLastCollision; + } } public static boolean canBeTransported(Entity entity) { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/ItemHandlerBeltSegment.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java similarity index 96% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/ItemHandlerBeltSegment.java rename to src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java index 6ba9f7c1a..960ae27ed 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/ItemHandlerBeltSegment.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/ItemHandlerBeltSegment.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.contraptions.relays.belt.transport; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/TransportedItemStack.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/TransportedItemStack.java similarity index 97% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/TransportedItemStack.java rename to src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/TransportedItemStack.java index 491c859ad..cc273e80e 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/TransportedItemStack.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.contraptions.relays.belt.transport; import java.util.Random; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/AdjustablePulleyBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/AdjustablePulleyBlock.java index c77d13c4e..3e450b1bf 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/AdjustablePulleyBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/AdjustablePulleyBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.modules.contraptions.relays.encased; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -14,7 +14,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTileEntity { +public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE { public static BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -34,10 +34,11 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile @Override public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - if (oldState.getBlock() != state.getBlock()) - withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged); + if (oldState.getBlock() == state.getBlock()) + return; + withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged); } - + @Override public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) { super.updateNeighbors(stateIn, worldIn, pos, flags); @@ -55,10 +56,15 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile return; withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged); - + boolean previouslyPowered = state.get(POWERED); if (previouslyPowered != worldIn.isBlockPowered(pos)) worldIn.setBlockState(pos, state.cycle(POWERED), 18); } + @Override + public Class getTileEntityClass() { + return AdjustablePulleyTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/EncasedBeltBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/EncasedBeltBlock.java index 21e4a9594..964fd977c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/EncasedBeltBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/EncasedBeltBlock.java @@ -4,6 +4,7 @@ import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/GearshiftBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/GearshiftBlock.java index 6d7708c4e..f9e6eb079 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/GearshiftBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/encased/GearshiftBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.modules.contraptions.relays.encased; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.modules.contraptions.RotationPropagator; -import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEntity; import net.minecraft.block.Block; @@ -17,7 +17,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class GearshiftBlock extends EncasedShaftBlock { +public class GearshiftBlock extends EncasedShaftBlock implements ITE { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -51,7 +51,7 @@ public class GearshiftBlock extends EncasedShaftBlock { boolean previouslyPowered = state.get(POWERED); if (previouslyPowered != worldIn.isBlockPowered(pos)) { - RotationPropagator.handleRemoved(worldIn, pos, (KineticTileEntity) worldIn.getTileEntity(pos)); + withTileEntityDo(worldIn, pos, te -> RotationPropagator.handleRemoved(worldIn, pos, te)); worldIn.setBlockState(pos, state.cycle(POWERED), 2); } } @@ -60,4 +60,9 @@ public class GearshiftBlock extends EncasedShaftBlock { return super.hasShaftTowards(world, pos, state, face); } + @Override + public Class getTileEntityClass() { + return GearshiftTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java index da13e810e..f913a6bb1 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockBlock.java @@ -6,10 +6,11 @@ import java.util.List; import com.simibubi.create.foundation.block.IHaveCustomBlockModel; import com.simibubi.create.foundation.block.IHaveNoBlockItem; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.FourWayBlock; import net.minecraft.block.PaneBlock; import net.minecraft.block.material.Material; @@ -46,7 +47,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public class WindowInABlockBlock extends PaneBlock - implements IWithTileEntity, IHaveNoBlockItem, IHaveCustomBlockModel { + implements ITE, IHaveNoBlockItem, IHaveCustomBlockModel { public WindowInABlockBlock() { super(Properties.create(Material.ROCK)); @@ -70,32 +71,32 @@ public class WindowInABlockBlock extends PaneBlock Vec3d start = player.getEyePosition(1); Vec3d end = start.add(player.getLookVec().scale(player.getAttribute(PlayerEntity.REACH_DISTANCE).getValue())); - BlockRayTraceResult target = world - .rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player)); + BlockRayTraceResult target = + world.rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player)); if (target == null || target.getHitVec() == null) return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); - WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); - if (tileEntity == null) - return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); - BlockState windowBlock = tileEntity.getWindowBlock(); - for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) { - if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) { - windowBlock.getBlock().onBlockHarvested(world, pos, windowBlock, player); - Block.spawnDrops(windowBlock, world, pos, null, player, player.getHeldItemMainhand()); - BlockState partialBlock = tileEntity.getPartialBlock(); - world.setBlockState(pos, partialBlock); - for (Direction d : Direction.values()) { - BlockPos offset = pos.offset(d); - BlockState otherState = world.getBlockState(offset); - partialBlock = partialBlock.updatePostPlacement(d, otherState, world, pos, offset); - world.notifyBlockUpdate(offset, otherState, otherState, 2); - } - if (partialBlock != world.getBlockState(pos)) + try { + WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); + BlockState windowBlock = tileEntity.getWindowBlock(); + for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) { + if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) { + windowBlock.getBlock().onBlockHarvested(world, pos, windowBlock, player); + Block.spawnDrops(windowBlock, world, pos, null, player, player.getHeldItemMainhand()); + BlockState partialBlock = tileEntity.getPartialBlock(); world.setBlockState(pos, partialBlock); - return false; + for (Direction d : Direction.values()) { + BlockPos offset = pos.offset(d); + BlockState otherState = world.getBlockState(offset); + partialBlock = partialBlock.updatePostPlacement(d, otherState, world, pos, offset); + world.notifyBlockUpdate(offset, otherState, otherState, 2); + } + if (partialBlock != world.getBlockState(pos)) + world.setBlockState(pos, partialBlock); + return false; + } } - } + } catch (TileEntityException e) {} return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); } @@ -112,49 +113,36 @@ public class WindowInABlockBlock extends PaneBlock @Override public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { - WindowInABlockTileEntity tileEntity = getTileEntity(reader, pos); - if (tileEntity == null) - return super.propagatesSkylightDown(state, reader, pos); - return tileEntity.getPartialBlock().propagatesSkylightDown(reader, pos); + return getSurroundingBlockState(reader, pos).propagatesSkylightDown(reader, pos); } @Override public boolean collisionExtendsVertically(BlockState state, IBlockReader world, BlockPos pos, Entity collidingEntity) { - WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); - if (tileEntity == null) - return false; - return tileEntity.getPartialBlock().collisionExtendsVertically(world, pos, collidingEntity); + return getSurroundingBlockState(world, pos).collisionExtendsVertically(world, pos, collidingEntity); } @Override public float getBlockHardness(BlockState blockState, IBlockReader worldIn, BlockPos pos) { - WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); - if (tileEntity == null) - return 0; - return tileEntity.getPartialBlock().getBlockHardness(worldIn, pos); + return getSurroundingBlockState(worldIn, pos).getBlockHardness(worldIn, pos); } @Override public float getExplosionResistance(BlockState state, IWorldReader world, BlockPos pos, Entity exploder, Explosion explosion) { - WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); - if (tileEntity == null) - return 0; - return tileEntity.getPartialBlock().getExplosionResistance(world, pos, exploder, explosion); + return getSurroundingBlockState(world, pos).getExplosionResistance(world, pos, exploder, explosion); } @Override public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { - WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); - if (tileEntity == null) - return ItemStack.EMPTY; - for (AxisAlignedBB bb : tileEntity.getWindowBlock().getShape(world, pos).toBoundingBoxList()) { + BlockState window = getWindowBlockState(world, pos); + for (AxisAlignedBB bb : window.getShape(world, pos).toBoundingBoxList()) { if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) - return tileEntity.getWindowBlock().getPickBlock(target, world, pos, player); + return window.getPickBlock(target, world, pos, player); } - return tileEntity.getPartialBlock().getPickBlock(target, world, pos, player); + BlockState surrounding = getSurroundingBlockState(world, pos); + return surrounding.getPickBlock(target, world, pos, player); } @Override @@ -171,11 +159,8 @@ public class WindowInABlockBlock extends PaneBlock @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); - if (tileEntity == null) - return makeCuboidShape(7, 0, 7, 9, 16, 9); - VoxelShape shape1 = tileEntity.getPartialBlock().getShape(worldIn, pos, context); - VoxelShape shape2 = tileEntity.getWindowBlock().getShape(worldIn, pos, context); + VoxelShape shape1 = getSurroundingBlockState(worldIn, pos).getShape(worldIn, pos, context); + VoxelShape shape2 = getWindowBlockState(worldIn, pos).getShape(worldIn, pos, context); return VoxelShapes.or(shape1, shape2); } @@ -188,10 +173,7 @@ public class WindowInABlockBlock extends PaneBlock @SuppressWarnings("deprecation") @Override public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) { - WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); - if (tileEntity == null) - return MaterialColor.AIR; - return tileEntity.getPartialBlock().getMaterialColor(worldIn, pos); + return getSurroundingBlockState(worldIn, pos).getMaterialColor(worldIn, pos); } @Override @@ -200,8 +182,8 @@ public class WindowInABlockBlock extends PaneBlock withTileEntityDo(worldIn, currentPos, te -> { te.setWindowBlock( te.getWindowBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos)); - BlockState blockState = te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, - facingPos); + BlockState blockState = + te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos); if (blockState.getBlock() instanceof FourWayBlock) { for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, FourWayBlock.WEST)) @@ -214,6 +196,20 @@ public class WindowInABlockBlock extends PaneBlock return stateIn; } + private BlockState getSurroundingBlockState(IBlockReader reader, BlockPos pos) { + try { + return getTileEntity(reader, pos).getPartialBlock(); + } catch (TileEntityException e) {} + return Blocks.AIR.getDefaultState(); + } + + private BlockState getWindowBlockState(IBlockReader reader, BlockPos pos) { + try { + return getTileEntity(reader, pos).getWindowBlock(); + } catch (TileEntityException e) {} + return Blocks.AIR.getDefaultState(); + } + @OnlyIn(Dist.CLIENT) public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { return false; @@ -225,4 +221,9 @@ public class WindowInABlockBlock extends PaneBlock return new WindowInABlockModel(original); } + @Override + public Class getTileEntityClass() { + return WindowInABlockTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowLoggingHandler.java b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowLoggingHandler.java new file mode 100644 index 000000000..1ccda0a3e --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowLoggingHandler.java @@ -0,0 +1,84 @@ +package com.simibubi.create.modules.curiosities.partialWindows; + +import java.util.Arrays; + +import com.simibubi.create.AllBlockTags; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.config.AllConfigs; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FourWayBlock; +import net.minecraft.block.WallBlock; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.state.BooleanProperty; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.Tags; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock; +import net.minecraftforge.eventbus.api.Event.Result; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; + +@EventBusSubscriber(bus = Bus.FORGE) +public class WindowLoggingHandler { + + @SubscribeEvent + public static void rightClickPartialBlockWithPaneMakesItWindowLogged(RightClickBlock event) { + if (event.getUseItem() == Result.DENY) + return; + if (event.getEntityLiving().isSneaking()) + return; + if (!event.getPlayer().isAllowEdit()) + return; + if (!AllConfigs.SERVER.curiosities.allowGlassPanesInPartialBlocks.get()) + return; + + ItemStack stack = event.getItemStack(); + if (stack.isEmpty()) + return; + if (!(stack.getItem() instanceof BlockItem)) + return; + BlockItem item = (BlockItem) stack.getItem(); + if (!item.isIn(Tags.Items.GLASS_PANES) + && (item.getBlock() == null || !item.getBlock().isIn(Tags.Blocks.GLASS_PANES))) + return; + + BlockPos pos = event.getPos(); + World world = event.getWorld(); + BlockState blockState = world.getBlockState(pos); + if (!AllBlockTags.WINDOWABLE.matches(blockState)) + return; + if (AllBlocks.WINDOW_IN_A_BLOCK.typeOf(blockState)) + return; + + BlockState defaultState = AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState(); + world.setBlockState(pos, defaultState); + TileEntity te = world.getTileEntity(pos); + if (te != null && te instanceof WindowInABlockTileEntity) { + WindowInABlockTileEntity wte = (WindowInABlockTileEntity) te; + wte.setWindowBlock(item.getBlock().getDefaultState()); + wte.updateWindowConnections(); + + if (blockState.getBlock() instanceof FourWayBlock) { + for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, + FourWayBlock.WEST)) + blockState = blockState.with(side, false); + } + if (blockState.getBlock() instanceof WallBlock) + blockState = blockState.with(WallBlock.UP, true); + + wte.setPartialBlock(blockState); + wte.requestModelDataUpdate(); + + if (!event.getPlayer().isCreative()) + stack.shrink(1); + event.getPlayer().swingArm(event.getHand()); + } + + event.setCanceled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/logistics/InWorldProcessing.java b/src/main/java/com/simibubi/create/modules/logistics/InWorldProcessing.java index 7153180af..6dd533f39 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/modules/logistics/InWorldProcessing.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.modules.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/AttachedLogisticalBlock.java similarity index 98% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java rename to src/main/java/com/simibubi/create/modules/logistics/block/AttachedLogisticalBlock.java index 74b3ec7c5..a15cacd5d 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/AttachedLogisticalBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/AttachedLogisticalBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IHaveNoBlockItem; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkBlock.java index 09fc35705..9033edd12 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkBlock.java @@ -1,19 +1,22 @@ package com.simibubi.create.modules.logistics.block; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.modules.contraptions.IWrenchable; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemUseContext; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -25,7 +28,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class RedstoneLinkBlock extends ProperDirectionalBlock { +public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty RECEIVER = BooleanProperty.create("receiver"); @@ -72,11 +75,7 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock { if (previouslyPowered != shouldPower) { worldIn.setBlockState(pos, state.cycle(POWERED), 2); - - RedstoneLinkTileEntity te = (RedstoneLinkTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return; - te.transmit(!previouslyPowered); + withTileEntityDo(worldIn, pos, te -> te.transmit(!previouslyPowered)); } } @@ -118,27 +117,35 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock { @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - - if (player.isSneaking()) { - RedstoneLinkTileEntity te = (RedstoneLinkTileEntity) worldIn.getTileEntity(pos); - if (te == null) - return false; - - if (!worldIn.isRemote) { - Boolean wasReceiver = state.get(RECEIVER); - boolean blockPowered = worldIn.isBlockPowered(pos); - worldIn.setBlockState(pos, state.cycle(RECEIVER).with(POWERED, blockPowered), 3); - if (wasReceiver) { - te.transmit(worldIn.isBlockPowered(pos)); - } else - te.transmit(false); - } - return true; - } - + if (player.isSneaking()) + return toggleMode(state, worldIn, pos); return false; } + public boolean toggleMode(BlockState state, World worldIn, BlockPos pos) { + if (worldIn.isRemote) + return true; + try { + RedstoneLinkTileEntity te = getTileEntity(worldIn, pos); + Boolean wasReceiver = state.get(RECEIVER); + boolean blockPowered = worldIn.isBlockPowered(pos); + worldIn.setBlockState(pos, state.cycle(RECEIVER).with(POWERED, blockPowered), 3); + if (wasReceiver) { + te.transmit(worldIn.isBlockPowered(pos)); + } else + te.transmit(false); + return true; + } catch (TileEntityException e) {} + return false; + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (toggleMode(state, context.getWorld(), context.getPos())) + return ActionResultType.SUCCESS; + return IWrenchable.super.onWrenched(state, context); + } + @Override public boolean canConnectRedstone(BlockState state, IBlockReader world, BlockPos pos, Direction side) { return side != null; @@ -169,8 +176,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock { } @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.BLOCK; + public Class getTileEntityClass() { + return RedstoneLinkTileEntity.class; } } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/StockswitchBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/StockswitchBlock.java index 74cc0feeb..ec193205e 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/StockswitchBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/StockswitchBlock.java @@ -1,5 +1,6 @@ package com.simibubi.create.modules.logistics.block; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.gui.ScreenOpener; import net.minecraft.block.Block; @@ -24,7 +25,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; -public class StockswitchBlock extends HorizontalBlock { +public class StockswitchBlock extends HorizontalBlock implements ITE { public static final IntegerProperty INDICATOR = IntegerProperty.create("indicator", 0, 6); @@ -41,7 +42,7 @@ public class StockswitchBlock extends HorizontalBlock { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { updateObservedInventory(state, worldIn, pos); } - + @Override public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) { if (world.isRemote()) @@ -52,10 +53,7 @@ public class StockswitchBlock extends HorizontalBlock { } private void updateObservedInventory(BlockState state, IWorldReader world, BlockPos pos) { - StockswitchTileEntity te = (StockswitchTileEntity) world.getTileEntity(pos); - if (te == null) - return; - te.updateCurrentLevel(); + withTileEntityDo(world, pos, StockswitchTileEntity::updateCurrentLevel); } private boolean isObserving(BlockState state, BlockPos pos, BlockPos observing) { @@ -74,8 +72,10 @@ public class StockswitchBlock extends HorizontalBlock { @Override public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { - StockswitchTileEntity te = (StockswitchTileEntity) blockAccess.getTileEntity(pos); - return te == null || !te.powered ? 0 : 15; + try { + return getTileEntity(blockAccess, pos).powered ? 15 : 0; + } catch (TileEntityException e) {} + return 0; } @Override @@ -87,9 +87,7 @@ public class StockswitchBlock extends HorizontalBlock { @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - displayScreen((StockswitchTileEntity) worldIn.getTileEntity(pos)); - }); + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen)); return true; } @@ -137,10 +135,15 @@ public class StockswitchBlock extends HorizontalBlock { public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new StockswitchTileEntity(); } - + @Override public PushReaction getPushReaction(BlockState state) { return PushReaction.BLOCK; } + @Override + public Class getTileEntityClass() { + return StockswitchTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltAttachableLogisticalBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltAttachableLogisticalBlock.java index f53da057a..4ed8d622b 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltAttachableLogisticalBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltAttachableLogisticalBlock.java @@ -10,7 +10,8 @@ import com.simibubi.create.foundation.behaviour.inventory.SingleTargetAutoExtrac import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverBlock.java similarity index 96% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverBlock.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverBlock.java index e2c8df2e7..8984812e6 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.belts.observer; import java.util.Arrays; import java.util.List; @@ -7,7 +7,7 @@ import java.util.Random; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.IWrenchable; @@ -17,7 +17,7 @@ import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -47,7 +47,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.World; public class BeltObserverBlock extends HorizontalBlock - implements IWithTileEntity, IBeltAttachment, IWrenchable { + implements ITE, IBeltAttachment, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty BELT = BooleanProperty.create("belt"); @@ -302,4 +302,9 @@ public class BeltObserverBlock extends HorizontalBlock } } + @Override + public Class getTileEntityClass() { + return BeltObserverTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverFilterSlot.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverFilterSlot.java similarity index 91% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverFilterSlot.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverFilterSlot.java index cb8a12023..c96762cf7 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverFilterSlot.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverFilterSlot.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.belts.observer; import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntity.java similarity index 76% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntity.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntity.java index aecb0662a..9afed749e 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.belts.observer; import java.util.List; @@ -6,11 +6,12 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.logistics.block.belts.BeltObserverBlock.Mode; +import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverBlock.Mode; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; public class BeltObserverTileEntity extends SmartTileEntity { @@ -43,16 +44,16 @@ public class BeltObserverTileEntity extends SmartTileEntity { if (getBlockState().get(BeltObserverBlock.MODE) != Mode.DETECT) return; - TileEntity tileEntity = - world.getTileEntity(pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING))); - if (!(tileEntity instanceof BeltTileEntity)) + BlockPos targetPos = pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING)); + + BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, targetPos); + if (beltTE == null) return; - BeltTileEntity belt = (BeltTileEntity) tileEntity; - BeltTileEntity controllerTE = belt.getControllerTE(); + BeltTileEntity controllerTE = beltTE.getControllerTE(); if (controllerTE == null) return; - controllerTE.getInventory().forEachWithin(belt.index + .5f, .45f, stack -> { + controllerTE.getInventory().forEachWithin(beltTE.index + .5f, .45f, stack -> { if (filtering.test(stack.stack) && turnOffTicks != 6) { world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true)); world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock()); diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntityRenderer.java similarity index 92% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntityRenderer.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntityRenderer.java index dbefcdb41..fc41678d8 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/BeltObserverTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/observer/BeltObserverTileEntityRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.belts.observer; import com.mojang.blaze3d.platform.GLX; import com.simibubi.create.foundation.behaviour.filtering.FilteringRenderer; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelBlock.java similarity index 95% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelBlock.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelBlock.java index db4d4b334..c4e88f877 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelBlock.java @@ -1,13 +1,14 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.logistics.block.belts.tunnel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.IWrenchable; +import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import net.minecraft.block.Block; @@ -34,7 +35,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class BeltTunnelBlock extends Block implements IWithTileEntity, IWrenchable { +public class BeltTunnelBlock extends Block implements ITE, IWrenchable { public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); public static final IProperty HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; @@ -245,4 +246,9 @@ public class BeltTunnelBlock extends Block implements IWithTileEntity getTileEntityClass() { + return BeltTunnelTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelShapes.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelShapes.java similarity index 96% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelShapes.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelShapes.java index e74c06610..1e6f51f76 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelShapes.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelShapes.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.logistics.block.belts.tunnel; import static net.minecraft.block.Block.makeCuboidShape; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntity.java similarity index 97% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntity.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 4cc980ca4..6fa975b40 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.logistics.block.belts.tunnel; import java.util.HashMap; import java.util.LinkedList; @@ -10,7 +10,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.SyncedTileEntity; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; -import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelBlock.Shape; +import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntityRenderer.java similarity index 97% rename from src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntityRenderer.java rename to src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntityRenderer.java index de73d0b78..ad54d93a3 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTunnelTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/tunnel/BeltTunnelTileEntityRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.contraptions.relays.belt; +package com.simibubi.create.modules.logistics.block.belts.tunnel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.block.SafeTileEntityRendererFast; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java index c389bd418..e7124b30e 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorBlock.java @@ -6,7 +6,7 @@ import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.belts.BeltAttachableLogisticalBlock; import net.minecraft.block.Block; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorMovementBehaviour.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorMovementBehaviour.java index 3662aab8c..bcb4b888d 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorMovementBehaviour.java @@ -4,7 +4,7 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.components.contraptions.MovementContext; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.item.filter.FilterItem; import net.minecraft.entity.Entity; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorSlots.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorSlots.java index bc80c142c..072efd9d9 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorSlots.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorSlots.java @@ -5,7 +5,7 @@ import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorTileEntity.java index 7ae8a0532..e3c25a760 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/ExtractorTileEntity.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.behaviour.inventory.SingleTargetAutoExtrac import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java index b265e2b22..1d4876c4d 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/extractor/LinkedExtractorBlock.java @@ -5,7 +5,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelBlock.java similarity index 90% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java rename to src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelBlock.java index 53c0ce5c8..9d1d01adf 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.funnel; import java.util.Arrays; import java.util.Collections; @@ -7,14 +7,16 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.block.IWithTileEntity; +import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; +import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; +import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -36,7 +38,8 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachment, IWithTileEntity, IPortableBlock { +public class FunnelBlock extends AttachedLogisticalBlock + implements IBeltAttachment, ITE, IPortableBlock { public static final BooleanProperty BELT = BooleanProperty.create("belt"); public static final MovementBehaviour MOVEMENT = new FunnelMovementBehaviour(); @@ -123,17 +126,18 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm @Override public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { onAttachmentPlaced(worldIn, pos, state); + if (worldIn.isRemote) + return; if (isOnBelt(worldIn, pos)) { - TileEntity te = worldIn.getTileEntity(pos.down()); - if (!(te instanceof BeltTileEntity)) + BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos.down()); + if (belt == null) return; - BeltTileEntity belt = (BeltTileEntity) te; + BeltTileEntity controllerBelt = belt.getControllerTE(); if (controllerBelt == null) return; - if (worldIn.isRemote) - return; + controllerBelt.getInventory().forEachWithin(belt.index + .5f, .55f, (transportedItemStack) -> { controllerBelt.getInventory().eject(transportedItemStack); return Collections.emptyList(); @@ -199,7 +203,7 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) { TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos); - if (te == null || !(te instanceof FunnelTileEntity)) + if (!(te instanceof FunnelTileEntity)) return false; FunnelTileEntity funnel = (FunnelTileEntity) te; ItemStack stack = funnel.tryToInsert(transported.stack); @@ -219,4 +223,9 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm return MOVEMENT; } + @Override + public Class getTileEntityClass() { + return FunnelTileEntity.class; + } + } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelFilterSlot.java b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelFilterSlot.java similarity index 92% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelFilterSlot.java rename to src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelFilterSlot.java index b3d4d3867..798dd94b0 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelFilterSlot.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelFilterSlot.java @@ -1,8 +1,9 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.funnel; import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelMovementBehaviour.java similarity index 96% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelMovementBehaviour.java rename to src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelMovementBehaviour.java index 0831d5b57..fbc52571d 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelMovementBehaviour.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.funnel; import java.util.List; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelTileEntity.java similarity index 93% rename from src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java rename to src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelTileEntity.java index 6f8122117..730899144 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/funnel/FunnelTileEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.modules.logistics.block.belts; +package com.simibubi.create.modules.logistics.block.funnel; import java.util.List; @@ -11,14 +11,15 @@ import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.inventory.InsertingBehaviour; import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; @@ -103,10 +104,7 @@ public class FunnelTileEntity extends SmartTileEntity { BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState())); if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos))) return null; - TileEntity te = world.getTileEntity(targetPos); - if (te == null || !(te instanceof BeltTileEntity)) - return null; - return (BeltTileEntity) te; + return BeltHelper.getSegmentTE(world, targetPos); } public void spawnParticles(ItemStack stack) { diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateBlock.java b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateBlock.java index 690dbabef..bf70659a3 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateBlock.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateBlock.java @@ -75,10 +75,15 @@ public class FlexcrateBlock extends ProperDirectionalBlock { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { if (oldState.getBlock() != state.getBlock() && state.hasTileEntity() && state.get(DOUBLE) && state.get(FACING).getAxisDirection() == AxisDirection.POSITIVE) { - FlexcrateTileEntity te = (FlexcrateTileEntity) worldIn.getTileEntity(pos); + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (!(tileEntity instanceof FlexcrateTileEntity)) + return; + + FlexcrateTileEntity te = (FlexcrateTileEntity) tileEntity; FlexcrateTileEntity other = te.getOtherCrate(); if (other == null) return; + for (int slot = 0; slot < other.inventory.getSlots(); slot++) { te.inventory.setStackInSlot(slot, other.inventory.getStackInSlot(slot)); other.inventory.setStackInSlot(slot, ItemStack.EMPTY); diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateContainer.java b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateContainer.java index 5d3425a29..43378fa62 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateContainer.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateContainer.java @@ -10,6 +10,7 @@ import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.SlotItemHandler; public class FlexcrateContainer extends Container { @@ -21,10 +22,13 @@ public class FlexcrateContainer extends Container { public FlexcrateContainer(int id, PlayerInventory inv, PacketBuffer extraData) { super(AllContainers.FLEXCRATE.type, id); ClientWorld world = Minecraft.getInstance().world; - this.te = (FlexcrateTileEntity) world.getTileEntity(extraData.readBlockPos()); - this.te.handleUpdateTag(extraData.readCompoundTag()); + TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos()); this.playerInventory = inv; - init(); + if (tileEntity instanceof FlexcrateTileEntity) { + this.te = (FlexcrateTileEntity) tileEntity; + this.te.handleUpdateTag(extraData.readCompoundTag()); + init(); + } } public FlexcrateContainer(int id, PlayerInventory inv, FlexcrateTileEntity te) { diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerTileEntity.java index 59644b9ff..e291f0b9c 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/transposer/TransposerTileEntity.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.behaviour.inventory.InsertingBehaviour; import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/modules/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/modules/schematics/ServerSchematicLoader.java index af7c9afc7..2470cf8a3 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/modules/schematics/ServerSchematicLoader.java @@ -26,6 +26,7 @@ import com.simibubi.create.modules.schematics.item.SchematicItem; import net.minecraft.block.BlockState; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; @@ -105,8 +106,8 @@ public class ServerSchematicLoader { try { // Validate Referenced Block - BlockState blockState = dimPos.world.getBlockState(dimPos.pos); - if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) + SchematicTableTileEntity table = getTable(dimPos); + if (table == null) return; // Delete schematic with same name @@ -131,8 +132,7 @@ public class ServerSchematicLoader { activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, dimPos)); // Notify Tile Entity - SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimPos.world.getTileEntity(dimPos.pos); - tileEntity.startUpload(schematic); + table.startUpload(schematic); } catch (IOException e) { Create.logger.error("Exception Thrown when starting Upload: " + playerSchematicId); @@ -167,14 +167,12 @@ public class ServerSchematicLoader { try { entry.stream.write(data); entry.idleTime = 0; - BlockState blockState = entry.tablePos.world.getBlockState(entry.tablePos.pos); - if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) - return; - SchematicTableTileEntity tileEntity = - (SchematicTableTileEntity) entry.tablePos.world.getTileEntity(entry.tablePos.pos); - tileEntity.uploadingProgress = (float) ((double) entry.bytesUploaded / entry.totalBytes); - tileEntity.sendUpdate = true; + SchematicTableTileEntity table = getTable(entry.tablePos); + if (table == null) + return; + table.uploadingProgress = (float) ((double) entry.bytesUploaded / entry.totalBytes); + table.sendUpdate = true; } catch (IOException e) { Create.logger.error("Exception Thrown when uploading Schematic: " + playerSchematicId); @@ -203,12 +201,17 @@ public class ServerSchematicLoader { if (dimpos == null) return; - BlockState blockState = dimpos.world.getBlockState(dimpos.pos); - if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) - return; + SchematicTableTileEntity table = getTable(dimpos); + if (table != null) + table.finishUpload(); + } - SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimpos.world.getTileEntity(dimpos.pos); - tileEntity.finishUpload(); + public SchematicTableTileEntity getTable(DimensionPos dimpos) { + TileEntity te = dimpos.world.getTileEntity(dimpos.pos); + if (!(te instanceof SchematicTableTileEntity)) + return null; + SchematicTableTileEntity table = (SchematicTableTileEntity) te; + return table; } public void handleFinishedUpload(ServerPlayerEntity player, String schematic) { @@ -227,11 +230,12 @@ public class ServerSchematicLoader { if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) return; - SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimpos.world.getTileEntity(dimpos.pos); - tileEntity.finishUpload(); - tileEntity.inventory.setStackInSlot(0, ItemStack.EMPTY); - tileEntity.inventory.setStackInSlot(1, - SchematicItem.create(schematic, player.getName().getFormattedText())); + SchematicTableTileEntity table = getTable(dimpos); + if (table == null) + return; + table.finishUpload(); + table.inventory.setStackInSlot(0, ItemStack.EMPTY); + table.inventory.setStackInSlot(1, SchematicItem.create(schematic, player.getName().getFormattedText())); } catch (IOException e) { Create.logger.error("Exception Thrown when finishing Upload: " + playerSchematicId); diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableBlock.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableBlock.java index 3b93a76e6..0637a0d20 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableBlock.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.modules.schematics.block; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; import net.minecraft.block.Block; @@ -9,7 +11,6 @@ import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.BlockItemUseContext; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; @@ -22,7 +23,7 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; -public class SchematicTableBlock extends HorizontalBlock { +public class SchematicTableBlock extends HorizontalBlock implements ITE { public SchematicTableBlock() { super(Properties.from(Blocks.OAK_PLANKS)); @@ -38,7 +39,7 @@ public class SchematicTableBlock extends HorizontalBlock { public boolean isSolid(BlockState state) { return false; } - + @Override public PushReaction getPushReaction(BlockState state) { return PushReaction.BLOCK; @@ -50,7 +51,8 @@ public class SchematicTableBlock extends HorizontalBlock { } @Override - public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, + ISelectionContext context) { return AllShapes.TABLE_POLE_SHAPE; } @@ -67,15 +69,12 @@ public class SchematicTableBlock extends HorizontalBlock { @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { + if (worldIn.isRemote) + return true; - if (worldIn.isRemote) { - return true; - } else { - SchematicTableTileEntity te = (SchematicTableTileEntity) worldIn.getTileEntity(pos); - if (te != null) - NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer); - return true; - } + withTileEntityDo(worldIn, pos, + te -> NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer)); + return true; } @Override @@ -85,19 +84,16 @@ public class SchematicTableBlock extends HorizontalBlock { @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (worldIn.getTileEntity(pos) == null) + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; - SchematicTableTileEntity te = (SchematicTableTileEntity) worldIn.getTileEntity(pos); - for (int slot = 0; slot < te.inventory.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.inventory.getStackInSlot(slot)); - } - - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - worldIn.removeTileEntity(pos); - } + withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory)); + worldIn.removeTileEntity(pos); + } + @Override + public Class getTileEntityClass() { + return SchematicTableTileEntity.class; } } diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableContainer.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableContainer.java index f9e9edde4..1157ab797 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableContainer.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableContainer.java @@ -11,6 +11,7 @@ import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.SlotItemHandler; public class SchematicTableContainer extends Container { @@ -24,9 +25,12 @@ public class SchematicTableContainer extends Container { super(AllContainers.SCHEMATIC_TABLE.type, id); player = inv.player; ClientWorld world = Minecraft.getInstance().world; - this.te = (SchematicTableTileEntity) world.getTileEntity(extraData.readBlockPos()); - this.te.handleUpdateTag(extraData.readCompoundTag()); - init(); + TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos()); + if (tileEntity instanceof SchematicTableTileEntity) { + this.te = (SchematicTableTileEntity) tileEntity; + this.te.handleUpdateTag(extraData.readCompoundTag()); + init(); + } } public SchematicTableContainer(int id, PlayerInventory inv, SchematicTableTileEntity te) { diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonBlock.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonBlock.java index 7fe3bef3c..55b6f9dc1 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonBlock.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.modules.schematics.block; -import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.AllShapes; import net.minecraft.block.Block; @@ -9,8 +10,6 @@ import net.minecraft.block.Blocks; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; @@ -22,7 +21,7 @@ import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkHooks; -public class SchematicannonBlock extends Block { +public class SchematicannonBlock extends Block implements ITE { public SchematicannonBlock() { super(Properties.from(Blocks.DISPENSER)); @@ -42,7 +41,7 @@ public class SchematicannonBlock extends Block { public boolean isSolid(BlockState state) { return false; } - + @Override public PushReaction getPushReaction(BlockState state) { return PushReaction.BLOCK; @@ -55,44 +54,32 @@ public class SchematicannonBlock extends Block { @Override public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) { - ((SchematicannonTileEntity) world.getTileEntity(pos)).findInventories(); - super.onNeighborChange(state, world, pos, neighbor); + withTileEntityDo(world, pos, SchematicannonTileEntity::findInventories); } @Override public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { + if (worldIn.isRemote) + return true; - if (worldIn.isRemote) { - return true; - } else { - SchematicannonTileEntity te = (SchematicannonTileEntity) worldIn.getTileEntity(pos); - if (te != null) - if (AllItems.BLUEPRINT.typeOf(player.getHeldItemMainhand()) - && te.inventory.getStackInSlot(0).isEmpty()) { - te.inventory.setStackInSlot(0, player.getHeldItemMainhand()); - player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY); - } - NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer); - return true; - } + withTileEntityDo(worldIn, pos, + te -> NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer)); + return true; } @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (worldIn.getTileEntity(pos) == null) + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; - SchematicannonTileEntity te = (SchematicannonTileEntity) worldIn.getTileEntity(pos); - for (int slot = 0; slot < te.inventory.getSlots(); slot++) { - InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), - te.inventory.getStackInSlot(slot)); - } - - if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { - worldIn.removeTileEntity(pos); - } + withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory)); + worldIn.removeTileEntity(pos); + } + @Override + public Class getTileEntityClass() { + return SchematicannonTileEntity.class; } } diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonContainer.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonContainer.java index 3f0edc182..d38c33ce7 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonContainer.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonContainer.java @@ -10,6 +10,7 @@ import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.SlotItemHandler; public class SchematicannonContainer extends Container { @@ -21,9 +22,12 @@ public class SchematicannonContainer extends Container { super(AllContainers.SCHEMATICANNON.type, id); player = inv.player; ClientWorld world = Minecraft.getInstance().world; - this.te = (SchematicannonTileEntity) world.getTileEntity(buffer.readBlockPos()); - this.te.handleUpdateTag(buffer.readCompoundTag()); - init(); + TileEntity tileEntity = world.getTileEntity(buffer.readBlockPos()); + if (tileEntity instanceof SchematicannonTileEntity) { + this.te = (SchematicannonTileEntity) tileEntity; + this.te.handleUpdateTag(buffer.readCompoundTag()); + init(); + } } public SchematicannonContainer(int id, PlayerInventory inv, SchematicannonTileEntity te) { @@ -34,7 +38,6 @@ public class SchematicannonContainer extends Container { } protected void init() { - int x = 20; int y = 0; diff --git a/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java b/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java index 70937df2d..52d8f1e89 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java +++ b/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java @@ -50,48 +50,45 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase { context.get().enqueueWork(() -> { ServerPlayerEntity player = context.get().getSender(); World world = player.world; - - if (world == null || world.getTileEntity(pos) == null) + if (world == null) return; + TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity instanceof SchematicannonTileEntity) { + if (!(tileEntity instanceof SchematicannonTileEntity)) + return; - SchematicannonTileEntity te = (SchematicannonTileEntity) tileEntity; - switch (option) { - case DONT_REPLACE: - case REPLACE_ANY: - case REPLACE_EMPTY: - case REPLACE_SOLID: - te.replaceMode = option.ordinal(); - break; - case SKIP_MISSING: - te.skipMissing = set; - break; - case SKIP_TILES: - te.replaceTileEntities = set; - break; - - case PLAY: - te.state = State.RUNNING; - te.statusMsg = "running"; - break; - case PAUSE: - te.state = State.PAUSED; - te.statusMsg = "paused"; - break; - case STOP: - te.state = State.STOPPED; - te.statusMsg = "stopped"; - break; - default: - break; - } - - te.sendUpdate = true; + SchematicannonTileEntity te = (SchematicannonTileEntity) tileEntity; + switch (option) { + case DONT_REPLACE: + case REPLACE_ANY: + case REPLACE_EMPTY: + case REPLACE_SOLID: + te.replaceMode = option.ordinal(); + break; + case SKIP_MISSING: + te.skipMissing = set; + break; + case SKIP_TILES: + te.replaceTileEntities = set; + break; + case PLAY: + te.state = State.RUNNING; + te.statusMsg = "running"; + break; + case PAUSE: + te.state = State.PAUSED; + te.statusMsg = "paused"; + break; + case STOP: + te.state = State.STOPPED; + te.statusMsg = "stopped"; + break; + default: + break; } - return; + te.sendUpdate = true; }); context.get().setPacketHandled(true); }