From ecc02fec7171c7a15125240a49ab4e052e5d75b8 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 24 Mar 2020 15:11:43 +0100 Subject: [PATCH 01/10] BeltTileEntity safety checks --- .../contraptions/relays/belt/BeltBlock.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) 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 619706039..5ce182f03 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 @@ -78,7 +78,10 @@ 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); + TileEntity tileEntity = world.getTileEntity(pos); + if (!(tileEntity instanceof BeltTileEntity)) + return false; + BeltTileEntity beltEntity = (BeltTileEntity) tileEntity; return beltEntity != null && beltEntity.hasPulley(); } @@ -149,8 +152,12 @@ public class BeltBlock extends HorizontalKineticBlock @Override public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (!(tileEntity instanceof BeltTileEntity)) + return; + BeltTileEntity belt = null; - belt = (BeltTileEntity) worldIn.getTileEntity(pos); + belt = (BeltTileEntity) tileEntity; if (state.get(SLOPE) == Slope.VERTICAL) return; @@ -180,7 +187,10 @@ public class BeltBlock extends HorizontalKineticBlock return; } - BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController()); + TileEntity controllerTE = worldIn.getTileEntity(belt.getController()); + if (!(controllerTE instanceof BeltTileEntity)) + return; + BeltTileEntity controller = (BeltTileEntity) controllerTE; if (controller == null || controller.passengers == null) return; if (controller.passengers.containsKey(entityIn)) { @@ -367,8 +377,12 @@ 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) + TileEntity tileEntity = worldIn.getTileEntity(pos); + if (!(tileEntity instanceof BeltTileEntity)) + return shape; + + BeltTileEntity belt = (BeltTileEntity) tileEntity; + if (context.getEntity() == null) return shape; BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController()); if (controller == null) From be4f45bf8c9cee85293d3942a04b6412c375accf Mon Sep 17 00:00:00 2001 From: Iskandarov Lev Date: Sat, 28 Mar 2020 00:44:15 +0300 Subject: [PATCH 02/10] added readme from forge --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..b56e05f04 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Create +Welcome to Create, a mod offering a variety of tools and blocks for Building, Decoration and Aesthetic Automation. + +The added elements of tech are designed to leave as many design choices to the player as possible, where item processing doesn't happen inside a single block with funny textures, it requires a set of actors working together in many possible arrangements. + +Check out the wiki and in-game Tool-tips for further info on how to use these features, and stay tuned for an ever-growing selection of possibilities for Creative and Survival Minecraft. + +## Links +[](https://github.com/simibubi/Create/issues "Report Issues") +[](https://www.youtube.com/playlist?list=PLyADkcfPLU8ywCXZPaDbQ_JZJL0CGDN5Z "Watch Videos") +[](https://discord.gg/hmaD7Se "Feedback & Help") +[](https://www.patreon.com/simibubi "Support Us") + +## Current Progress +- Create 0.2.2 is coming soon with more bug-fixes. Thank you for testing Create with us! +- Support for Minecraft 1.12: Not planned +- Support for Minecraft 1.15: Porting work is in Progress! +- Support for Fabric: Not planned + +## The Creators of Create +- evanthebruce - Resident Nitwit +- fuzzyweapon - Contributor +- LeastReality - Artist +- Zelophed - Developer +- simibubi - Developer & Artist +- tterrag - Developer & Port-Meister + +## Localization + +| Code | Version | Language | Author | +|-------|---------|------------|--------------------------| +| en_us | 0.2.2 | English US | | +| de_de | 0.1 | German | Vexatos & Azratosh | +| nl_nl | 0.1 | Dutch | Prusias | +| fr_fr | 0.2.1 | French | Kiro | +| zh_cn | 0.2.1 | Chinese | noptia & spider_stranger | +| ru_ru | 0.1 | Russian | sirabein | +| pt_br | 0.1 | Brazilian | lucassabreu | From f1057bf55894a787bc04d68c2b4eae175e3973cb Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 30 Mar 2020 18:48:07 +0200 Subject: [PATCH 03/10] changed how the wrench rotates blocks - wrench now rotates the target block around the axis of the face that the it was used on --- .../modules/contraptions/IWrenchable.java | 54 ++++++++++++++++++- .../base/DirectionalAxisKineticBlock.java | 13 ----- .../base/DirectionalKineticBlock.java | 21 -------- .../base/HorizontalAxisKineticBlock.java | 15 ------ .../base/HorizontalKineticBlock.java | 15 ------ .../base/RotatedPillarKineticBlock.java | 13 ----- .../contraptions/bearing/BearingBlock.java | 6 --- .../piston/MechanicalPistonBlock.java | 12 +---- .../components/fan/EncasedFanBlock.java | 12 +++-- .../components/fan/EncasedFanTileEntity.java | 5 +- .../sequencer/SequencedGearshiftBlock.java | 15 +++--- .../relays/encased/EncasedBeltBlock.java | 31 +++++------ 12 files changed, 87 insertions(+), 125 deletions(-) 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 986f7c183..719fe908d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/IWrenchable.java @@ -1,13 +1,63 @@ package com.simibubi.create.modules.contraptions; +import com.simibubi.create.foundation.utility.VoxelShaper; +import com.simibubi.create.modules.contraptions.base.*; import net.minecraft.block.BlockState; import net.minecraft.item.ItemUseContext; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.world.World; public interface IWrenchable { - public default ActionResultType onWrenched(BlockState state, ItemUseContext context) { - return ActionResultType.PASS; + default ActionResultType onWrenched(BlockState state, ItemUseContext context) { + World world = context.getWorld(); + BlockState rotated = getRotatedBlockState(state, context.getFace()); + if (!rotated.isValidPosition(world, context.getPos())) + return ActionResultType.PASS; + + KineticTileEntity.switchToBlockState(world, context.getPos(), updateAfterWrenched(rotated, context)); + + TileEntity te = context.getWorld().getTileEntity(context.getPos()); + if (te instanceof GeneratingKineticTileEntity) { + ((GeneratingKineticTileEntity) te).updateGeneratedRotation(); + } + + return ActionResultType.SUCCESS; + } + + default BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { + return newState; + } + + static BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace){ + BlockState newState = originalState; + + if (targetedFace.getAxis() == Direction.Axis.Y) { + if (originalState.has(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)) + return originalState.with(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, VoxelShaper.axisAsFace(originalState.get(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)).rotateAround(targetedFace.getAxis()).getAxis()); + if (originalState.has(HorizontalKineticBlock.HORIZONTAL_FACING)) + return originalState.with(HorizontalKineticBlock.HORIZONTAL_FACING, originalState.get(HorizontalKineticBlock.HORIZONTAL_FACING).rotateAround(targetedFace.getAxis())); + } + + if (originalState.has(RotatedPillarKineticBlock.AXIS)) + return originalState.with(RotatedPillarKineticBlock.AXIS, VoxelShaper.axisAsFace(originalState.get(RotatedPillarKineticBlock.AXIS)).rotateAround(targetedFace.getAxis()).getAxis()); + + if (!originalState.has(DirectionalKineticBlock.FACING)) return originalState; + + Direction stateFacing = originalState.get(DirectionalKineticBlock.FACING); + + if (stateFacing.getAxis().equals(targetedFace.getAxis())) { + if (originalState.has(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) return originalState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); + else return originalState; + } else { + do { + newState = newState.with(DirectionalKineticBlock.FACING, newState.get(DirectionalKineticBlock.FACING).rotateAround(targetedFace.getAxis())); + if (targetedFace.getAxis() == Direction.Axis.Y && newState.has(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) newState = newState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE); + } while (newState.get(DirectionalKineticBlock.FACING).getAxis().equals(targetedFace.getAxis())); + } + return newState; } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalAxisKineticBlock.java index 2b7078e6e..18a6377e0 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalAxisKineticBlock.java @@ -3,10 +3,8 @@ package com.simibubi.create.modules.contraptions.base; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; import net.minecraft.state.BooleanProperty; import net.minecraft.state.StateContainer.Builder; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Rotation; @@ -86,17 +84,6 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc return this.getDefaultState().with(FACING, facing).with(AXIS_ALONG_FIRST_COORDINATE, alongFirst); } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - World world = context.getWorld(); - Direction face = context.getFace(); - if ((turnBackOnWrenched() ? face.getOpposite() : face) == state.get(FACING)) { - KineticTileEntity.switchToBlockState(world, context.getPos(), state.cycle(AXIS_ALONG_FIRST_COORDINATE)); - return ActionResultType.SUCCESS; - } - return super.onWrenched(state, context); - } - @Override public Axis getRotationAxis(BlockState state) { Axis pistonAxis = state.get(FACING).getAxis(); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalKineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalKineticBlock.java index b70f7303d..6f4f0937b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalKineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/DirectionalKineticBlock.java @@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; import net.minecraft.state.DirectionProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; -import net.minecraft.world.World; public abstract class DirectionalKineticBlock extends KineticBlock { @@ -45,24 +42,6 @@ public abstract class DirectionalKineticBlock extends KineticBlock { return prefferedSide; } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Direction facing = turnBackOnWrenched() ? context.getFace().getOpposite() : context.getFace(); - World world = context.getWorld(); - if (facing == state.get(FACING)) - return ActionResultType.PASS; - - BlockState with = state.with(FACING, facing); - if (!with.isValidPosition(world, context.getPos())) - return ActionResultType.PASS; - KineticTileEntity.switchToBlockState(world, context.getPos(), with); - return ActionResultType.SUCCESS; - } - - protected boolean turnBackOnWrenched() { - return false; - } - @Override public BlockState getStateForPlacement(BlockItemUseContext context) { Direction preferred = getPreferredFacing(context); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalAxisKineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalAxisKineticBlock.java index f23f2819f..ed522e416 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalAxisKineticBlock.java @@ -3,11 +3,9 @@ package com.simibubi.create.modules.contraptions.base; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; import net.minecraft.state.IProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; @@ -15,7 +13,6 @@ import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; public abstract class HorizontalAxisKineticBlock extends KineticBlock { @@ -69,18 +66,6 @@ public abstract class HorizontalAxisKineticBlock extends KineticBlock { return face.getAxis() == state.get(HORIZONTAL_AXIS); } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Direction facing = context.getFace(); - if (facing.getAxis().isVertical()) - return ActionResultType.PASS; - World world = context.getWorld(); - if (facing.getAxis() == state.get(HORIZONTAL_AXIS)) - return ActionResultType.PASS; - KineticTileEntity.switchToBlockState(world, context.getPos(), state.cycle(HORIZONTAL_AXIS)); - return ActionResultType.SUCCESS; - } - @Override public BlockState rotate(BlockState state, Rotation rot) { Axis axis = state.get(HORIZONTAL_AXIS); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalKineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalKineticBlock.java index fbe62e2f5..2fbc3a639 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalKineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/HorizontalKineticBlock.java @@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; import net.minecraft.state.IProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; -import net.minecraft.world.World; public abstract class HorizontalKineticBlock extends KineticBlock { @@ -52,18 +49,6 @@ public abstract class HorizontalKineticBlock extends KineticBlock { return prefferedSide; } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Direction facing = context.getFace(); - if (facing.getAxis().isVertical()) - return ActionResultType.PASS; - World world = context.getWorld(); - if (facing == state.get(HORIZONTAL_FACING)) - return ActionResultType.PASS; - KineticTileEntity.switchToBlockState(world, context.getPos(), state.with(HORIZONTAL_FACING, facing)); - return ActionResultType.SUCCESS; - } - @Override public BlockState rotate(BlockState state, Rotation rot) { return state.with(HORIZONTAL_FACING, rot.rotate(state.get(HORIZONTAL_FACING))); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/base/RotatedPillarKineticBlock.java index c1195c94e..186ec70b0 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/base/RotatedPillarKineticBlock.java @@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemUseContext; import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer; import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Rotation; -import net.minecraft.world.World; public abstract class RotatedPillarKineticBlock extends KineticBlock { @@ -72,14 +69,4 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock { : context.getNearestLookingDirection().getAxis()); } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Axis axis = context.getFace().getAxis(); - World world = context.getWorld(); - if (axis == state.get(AXIS)) - return ActionResultType.PASS; - KineticTileEntity.switchToBlockState(world, context.getPos(), state.with(AXIS, axis)); - return ActionResultType.SUCCESS; - } - } 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 6c7961167..709a20426 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,7 +1,6 @@ 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; @@ -25,11 +24,6 @@ public abstract class BearingBlock extends DirectionalKineticBlock { return true; } - @Override - protected boolean turnBackOnWrenched() { - return true; - } - @Override public Axis getRotationAxis(BlockState state) { return state.get(FACING).getAxis(); 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 e22d7d932..4f83e3331 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 @@ -7,7 +7,6 @@ import com.simibubi.create.foundation.block.IWithTileEntity; 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; @@ -18,11 +17,7 @@ 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.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.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -102,11 +97,6 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock return super.onWrenched(state, context); } - @Override - protected boolean turnBackOnWrenched() { - return true; - } - public enum PistonState implements IStringSerializable { RETRACTED, MOVING, EXTENDED; 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 56bf5616c..cd7434731 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 @@ -2,11 +2,11 @@ package com.simibubi.create.modules.contraptions.components.fan; import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemUseContext; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction; @@ -50,15 +50,21 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTil protected void blockUpdate(BlockState state, World worldIn, BlockPos pos) { notifyFanTile(worldIn, pos); - if (worldIn.isRemote || state.get(FACING) != Direction.DOWN) + if (worldIn.isRemote) return; - withTileEntityDo(worldIn, pos, EncasedFanTileEntity::updateGenerator); + withTileEntityDo(worldIn, pos, te -> te.updateGenerator(state.get(FACING))); } protected void notifyFanTile(IWorld world, BlockPos pos) { withTileEntityDo(world, pos, EncasedFanTileEntity::blockInFrontChanged); } + @Override + public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { + blockUpdate(newState, context.getWorld(), context.getPos()); + return newState; + } + @Override public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.CUTOUT; 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 246c49e87..502e8ca97 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,7 +5,6 @@ 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; @@ -59,8 +58,8 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity { return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0; } - public void updateGenerator() { - boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot(); + public void updateGenerator(Direction facing) { + boolean shouldGenerate = world.isBlockPowered(pos) && facing == Direction.DOWN && world.isBlockPresent(pos.down()) && blockBelowIsHot(); if (shouldGenerate == isGenerator) return; 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 2e3503b80..4a6f00f84 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 @@ -5,9 +5,7 @@ import com.simibubi.create.foundation.block.IWithTileEntity; 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.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -109,12 +107,13 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Direction facing = context.getFace(); - if (facing.getAxis().isVertical() && !state.get(VERTICAL)) { - KineticTileEntity.switchToBlockState(context.getWorld(), context.getPos(), state.cycle(VERTICAL)); - return ActionResultType.SUCCESS; - } - return super.onWrenched(state, context); + BlockState newState = state; + + if (context.getFace().getAxis() != Axis.Y) + if (newState.get(HORIZONTAL_AXIS) != context.getFace().getAxis()) + newState = newState.cycle(VERTICAL); + + return super.onWrenched(newState, context); } private BlockState withAxis(Axis axis, BlockItemUseContext context) { 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 385159da0..21e4a9594 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,7 +4,6 @@ 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; @@ -16,7 +15,6 @@ import net.minecraft.state.EnumProperty; import net.minecraft.state.IProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; @@ -120,6 +118,22 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { return stateIn.with(PART, part).with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst); } + @Override + public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) { + Blocks.AIR.getDefaultState().updateNeighbors(context.getWorld(), context.getPos(), 1); + Axis axis = newState.get(AXIS); + newState = getDefaultState().with(AXIS, axis); + for (Direction facing : Direction.values()) { + if (facing.getAxis() == axis) + continue; + BlockPos pos = context.getPos(); + BlockPos offset = pos.offset(facing); + newState = updatePostPlacement(newState, facing, context.getWorld().getBlockState(offset), context.getWorld(), + pos, offset); } + newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2); + return newState; + } + @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { return face.getAxis() == state.get(AXIS); @@ -169,19 +183,6 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock { return new EncasedShaftTileEntity(); } - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - Axis axis = state.get(AXIS); - boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE); - Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X) - : (axis == Axis.Z ? Axis.Y : Axis.Z); - - if (context.getFace().getAxis() == connectionAxis) - return ActionResultType.PASS; - - return super.onWrenched(state, context); - } - @Override protected boolean hasStaticPart() { return true; From a9848c48c4f22f8fe34f45090ffd19997d4ce5c8 Mon Sep 17 00:00:00 2001 From: MORIMORI0317 <43478594+MORIMORI0317@users.noreply.github.com> Date: Sun, 5 Apr 2020 19:53:29 +0900 Subject: [PATCH 04/10] Create ja_jp.lang --- .../resources/assets/create/lang/ja_jp.lang | 1157 +++++++++++++++++ 1 file changed, 1157 insertions(+) create mode 100644 src/main/resources/assets/create/lang/ja_jp.lang diff --git a/src/main/resources/assets/create/lang/ja_jp.lang b/src/main/resources/assets/create/lang/ja_jp.lang new file mode 100644 index 000000000..4b46d256a --- /dev/null +++ b/src/main/resources/assets/create/lang/ja_jp.lang @@ -0,0 +1,1157 @@ +{ + + "_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------", + + "item.create.symmetry_wand": "対称の杖", + "item.create.placement_handgun": "携帯型ブロックザッパー", + "item.create.terrain_zapper": "携帯型ワールドシェイパー", + "item.create.tree_fertilizer": "木の肥料", + "item.create.empty_blueprint": "空の概略図", + "item.create.andesite_alloy": "安山岩合金", + "item.create.chromatic_compound": "色彩の化合物", + "item.create.shadow_steel": "シャドウスチール", + "item.create.blueprint_and_quill": "概略図と羽根ペン", + "item.create.blueprint": "概略図", + "item.create.belt_connector": "メカニカルベルト", + "item.create.goggles": "エンジニアのゴーグル", + "item.create.filter": "フィルター", + "item.create.property_filter": "属性フィルター", + "item.create.rose_quartz": "ローズクォーツ", + "item.create.polished_rose_quartz": "磨かれたローズクォーツ", + "item.create.refined_radiance": "洗練された輝き", + "item.create.iron_sheet": "鉄板", + "item.create.gold_sheet": "金板", + "item.create.lapis_plate": "ラピス鍍金", + "item.create.obsidian_dust": "黒曜石の粉", + "item.create.propeller": "プロペラ", + "item.create.whisk": "泡立て器", + "item.create.brass_hand": "手", + "item.create.slot_cover": "クラフタースロットカバー", + "item.create.zinc_handle": "良質なツールの柄", + "item.create.flour": "小麦粉", + "item.create.dough": "生地", + "item.create.wrench": "レンチ", + "item.create.deforester": "デフォレスター", + "item.create.crushed_iron": "砕いた鉄鉱石", + "item.create.crushed_gold": "砕いた金鉱石", + "item.create.sand_paper": "紙やすり", + "item.create.red_sand_paper": "赤い紙やすり", + + "item.create.brass_ingot": "真鍮インゴット", + "item.create.brass_sheet": "真鍮シート", + "item.create.brass_nugget": "真鍮ナゲット", + "item.create.crushed_brass": "砕いた真鍮", + "item.create.zinc_ingot": "亜鉛棒", + "item.create.zinc_nugget": "亜鉛塊", + "item.create.crushed_zinc": "砕いた亜鉛", + "item.create.copper_sheet": "銅板", + "item.create.copper_ingot": "銅インゴット", + "item.create.copper_nugget": "銅塊", + "item.create.crushed_copper": "砕いた銅", + + "item.create.electron_tube": "電子管", + "item.create.integrated_circuit": "集積回路", + + "item.create.blazing_pickaxe": "ブレイジングなツルハシ", + "item.create.blazing_shovel": "ブレイジングなシャベル", + "item.create.blazing_axe": "ブレイジングな斧", + "item.create.blazing_sword": "ブレイジングなクリーバー", + + "item.create.shadow_steel_pickaxe": "シャドースチールのツルハシ", + "item.create.shadow_steel_mattock": "シャドースチールのガーデンマトック", + "item.create.shadow_steel_sword": "シャドースチールの剣", + + "item.create.rose_quartz_pickaxe": "金メッキクォーツのツルハシ", + "item.create.rose_quartz_shovel": "金メッキクォーツのシャベル", + "item.create.rose_quartz_axe": "金メッキクォーツの斧", + "item.create.rose_quartz_sword": "金メッキクォーツの剣", + + "block.create.copper_ore": "銅鉱石", + "block.create.copper_block": "銅ブロック", + "block.create.copper_shingles": "銅のこけら板", + "block.create.zinc_ore": "亜鉛鉱石", + "block.create.zinc_block": "亜鉛ブロック", + "block.create.brass_block": "真鍮ブロック", + + "block.create.andesite_casing": "安山岩ケーシング", + "block.create.brass_casing": "真鍮ケーシング", + "block.create.copper_casing": "銅ケーシング", + + "block.create.cogwheel": "歯車", + "block.create.large_cogwheel": "大きな歯車", + "block.create.turntable": "ターンテーブル", + "block.create.gearbox": "ギアボックス", + "block.create.gearshift": "ギアシフト", + "block.create.clutch": "クラッチ", + "block.create.shaft": "軸", + "block.create.encased_belt": "ケース入りベルト", + "block.create.encased_shaft": "ケース入りシャフト", + "block.create.encased_fan": "ケース入りファン", + "block.create.adjustable_pulley": "アナログベルトプーリー", + "block.create.nozzle": "ノズル", + "block.create.hand_crank": "ハンドクランク", + "block.create.cuckoo_clock": "鳩時計", + "block.create.creative_motor": "モーター", + "block.create.belt": "メカニカルベルト", + "block.create.millstone": "石臼", + "block.create.crushing_wheel": "破砕ホイール", + "block.create.drill": "メカニカルドリル", + "block.create.portable_storage_interface": "ポータブルストレージインターフェイス", + "block.create.harvester": "メカニカルハーベスター", + "block.create.saw": "メカニカル鋸", + "block.create.water_wheel": "水車", + "block.create.mechanical_press": "メカニカルプレス", + "block.create.mechanical_mixer": "メカニカルミキサー", + "block.create.deployer": "デプロイヤー", + "block.create.basin": "鉢", + "block.create.mechanical_crafter": "メカニカルクラフター", + "block.create.flywheel": "勢車", + "block.create.furnace_engine": "かまどエンジン", + "block.create.speed_gauge": "スピードメーター", + "block.create.stress_gauge": "ストレスメーター", + "block.create.cart_assembler": "カートアセンブラ", + "block.create.analog_lever": "アナログレバー", + "block.create.rotation_speed_controller": "回転速度制御器", + + "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", + "block.create.mechanical_piston": "メカニカルピストン", + "block.create.mechanical_piston_head": "メカニカルピストンヘッド", + "block.create.piston_pole": "ピストン延長ポール", + "block.create.mechanical_bearing": "メカニカルベアリング", + "block.create.clockwork_bearing": "時計仕掛けのベアリング", + "block.create.rope_pulley": "ローププーリー", + "block.create.rope": "ロープ", + "block.create.pulley_magnet": "プーリーマグネット", + "block.create.translation_chassis": "リニアシャーシ", + "block.create.rotation_chassis": "ラジアルシャーシ", + + "block.create.contact": "レッドストーンコンタクト", + "block.create.redstone_bridge": "レッドストーンリンク", + "block.create.stockswitch": "在庫スイッチ", + "block.create.flexcrate": "調整可能なクレート", + "block.create.extractor": "エクストラクター", + "block.create.belt_funnel": "漏斗", + "block.create.linked_extractor": "リンクされたエクストラクター", + "block.create.transposer": "トランスポーザー", + "block.create.linked_transposer": "リンクされたトランスポーザー", + "block.create.pulse_repeater": "パルスリピーター", + "block.create.flexpulsepeater": "調整可能なパルスリピーター", + "block.create.redstone_latch": "パワードラッチ", + "block.create.toggle_latch": "パワードトグルラッチ", + "block.create.flexpeater": "調整可能なリピーター", + "block.create.entity_detector": "ベルトオブザーバー", + "block.create.belt_tunnel": "コンベアトンネル", + "block.create.sequenced_gearshift": "シーケンスギアシフト", + + "block.create.tiled_glass": "タイルガラス", + "block.create.framed_glass": "大きなガラス窓", + "block.create.vertical_framed_glass": "垂直ガラス窓", + "block.create.horizontal_framed_glass": "横型ガラス窓", + "block.create.oak_glass": "オークの窓", + "block.create.spruce_glass": "マツの窓", + "block.create.birch_glass": "シラカバの窓", + "block.create.jungle_glass": "ジャングルの窓", + "block.create.dark_oak_glass": "ダークオークの窓", + "block.create.acacia_glass": "アカシアの窓", + "block.create.iron_glass": "華やかな鉄の窓", + + "block.create.tiled_glass_pane": "タイルガラス板", + "block.create.framed_glass_pane": "大きなガラス窓板", + "block.create.vertical_framed_glass_pane": "垂直ガラス窓板", + "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", + "block.create.oak_glass_pane": "オークの窓板", + "block.create.spruce_glass_pane": "マツの窓板", + "block.create.birch_glass_pane": "シラカバの窓板", + "block.create.jungle_glass_pane": "ジャングルの窓板", + "block.create.dark_oak_glass_pane": "ダークオークの窓板", + "block.create.acacia_glass_pane": "アカシアの窓板", + "block.create.iron_glass_pane": "華やかな鉄の窓板", + + "block.create.window_in_a_block": "ブロックのガラス板", + "block.create.andesite_bricks": "安山岩レンガ", + "block.create.andesite_layers": "層状安山岩", + "block.create.diorite_bricks": "閃緑岩レンガ", + "block.create.diorite_layers": "層状閃緑岩", + "block.create.granite_bricks": "花崗岩レンガ", + "block.create.granite_layers": "層状花崗岩", + + "block.create.gabbro": "斑れい岩", + "block.create.gabbro_stairs": "斑れい岩の階段", + "block.create.gabbro_slab": "斑れい岩のハーフブロック", + "block.create.gabbro_wall": "斑れい岩の塀", + "block.create.polished_gabbro": "磨かれた斑れい岩", + "block.create.gabbro_bricks": "斑れい岩レンガ", + "block.create.gabbro_bricks_stairs": "斑れい岩レンガの階段", + "block.create.gabbro_bricks_wall": "斑れい岩レンガの塀", + "block.create.paved_gabbro_bricks": "舗装された斑れい岩レンガ", + "block.create.paved_gabbro_bricks_slab": "舗装された斑れい岩レンガのハーフブロック", + "block.create.indented_gabbro": "インデントされた斑れい岩タイル", + "block.create.indented_gabbro_slab": "インデントされた斑れい岩のハーフブロック", + "block.create.slightly_mossy_gabbro_bricks": "苔むした斑れい岩レンガ", + "block.create.mossy_gabbro_bricks": "生い茂った斑れい岩レンガ", + "block.create.gabbro_layers": "層状斑れい岩", + + "block.create.weathered_limestone": "風化した石灰岩", + "block.create.weathered_limestone_stairs": "風化した石灰岩の階段", + "block.create.weathered_limestone_wall": "風化した石灰岩の塀", + "block.create.weathered_limestone_slab": "風化した石灰岩のハーフブロック", + "block.create.polished_weathered_limestone": "磨かれた風化石灰岩", + "block.create.polished_weathered_limestone_slab": "磨かれた風化石灰岩のハーフブロック", + "block.create.weathered_limestone_bricks": "風化した石灰岩レンガ", + "block.create.weathered_limestone_bricks_stairs": "風化した石灰岩レンガの階段", + "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの塀", + "block.create.weathered_limestone_bricks_slab": "風化した石灰岩レンガのハーフブロック", + "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", + "block.create.weathered_limestone_layers": "層状風化した石灰岩", + + "block.create.dolomite_pillar": "苦灰石の柱", + "block.create.dolomite": "苦灰石", + "block.create.dolomite_stairs": "苦灰石の階段", + "block.create.dolomite_wall": "苦灰石の塀", + "block.create.dolomite_slab": "苦灰石のハーフブロック", + "block.create.dolomite_bricks": "苦灰石レンガ", + "block.create.dolomite_bricks_wall": "苦灰石レンガの塀", + "block.create.dolomite_bricks_stairs": "苦灰石レンガの階段", + "block.create.dolomite_bricks_slab": "苦灰石レンガのハーフブロック", + "block.create.polished_dolomite": "磨かれた苦灰石", + "block.create.dolomite_layers": "層状苦灰石", + + "block.create.limesand": "石灰砕砂", + "block.create.limestone": "石灰岩", + "block.create.limestone_stairs": "石灰岩の階段", + "block.create.limestone_slab": "石灰岩のハーフブロック", + "block.create.limestone_wall": "石灰岩の塀", + "block.create.limestone_bricks": "石灰岩レンガ", + "block.create.limestone_bricks_stairs": "石灰岩レンガの階段", + "block.create.limestone_bricks_slab": "石灰岩レンガのハーフブロック", + "block.create.limestone_bricks_wall": "石灰岩レンガの塀", + "block.create.polished_limestone": "磨かれた石灰岩", + "block.create.polished_limestone_slab": "磨かれた石灰岩のハーフブロック", + "block.create.limestone_pillar": "石灰岩の柱", + "block.create.limestone_layers": "層状石灰岩", + + "block.create.natural_scoria": "自然スコリア", + "block.create.scoria": "スコリア", + "block.create.scoria_stairs": "スコリアの階段", + "block.create.scoria_slab": "スコリアのハーフブロック", + "block.create.scoria_wall": "スコリアの塀", + "block.create.scoria_bricks": "スコリアレンガ", + "block.create.polished_scoria": "磨かれたスコリア", + "block.create.polished_scoria_slab": "磨かれたスコリアのハーフブロック", + "block.create.scoria_pillar": "スコリアの柱", + "block.create.scoria_layers": "層状スコリア", + + "block.create.dark_scoria": "ダークスコリア", + "block.create.polished_dark_scoria": "磨かれたダークスコリア", + "block.create.dark_scoria_tiles": "ダークスコリアタイル", + "block.create.dark_scoria_tiles_stairs": "ダークスコリアタイルの階段", + "block.create.dark_scoria_tiles_slab": "ダークスコリアタイルのハーフブロック", + "block.create.dark_scoria_bricks": "ダークスコリアレンガ", + "block.create.dark_scoria_bricks_stairs": "ダークスコリアレンガの階段", + "block.create.dark_scoria_bricks_slab": "ダークスコリアレンガのハーフブロック", + "block.create.dark_scoria_bricks_wall": "ダークスコリアレンガの塀", + + "block.create.schematicannon": "概略図砲", + "block.create.schematic_table": "概略図テーブル", + "block.create.creative_crate": "概略図砲クリエティフィアー", + + "block.create.cocoa_log": "カカオ豆付きジャングルの原木", + + "_comment": "-------------------------] UI & MESSAGES [------------------------------------------------", + + "death.attack.create.crush": "%1$s は破砕ホイールによって処理されました", + "death.attack.create.fan_fire": "%1$s は熱風で焼死した", + "death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した", + "death.attack.create.drill": "%1$s はメカニカルドリルに突き刺さった", + "death.attack.create.saw": "%1$s はメカニカル鋸で半分にカットされた", + "create.block.deployer.damage_source_name": "悪いデプロイヤー", + "death.attack.create.curse_polish": "%1$s は呪われたアイテムを磨こうとした", + "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", + + "create.recipe.crushing": "粉砕", + "create.recipe.milling": "製粉", + "create.recipe.splashing": "一括洗浄", + "create.recipe.splashing.fan": "流れる水の後ろにファンを置く", + "create.recipe.smokingViaFan": "一括燻製", + "create.recipe.smokingViaFan.fan": "炎の後ろにファンを置く", + "create.recipe.blastingViaFan": "一括製錬", + "create.recipe.blastingViaFan.fan": "溶岩の後ろにファンを置く", + "create.recipe.pressing": "押しつぶし", + "create.recipe.mixing": "混合", + "create.recipe.packing": "圧縮", + "create.recipe.sawing": "製材", + "create.recipe.mechanical_crafting": "メカニカルクラフト", + "create.recipe.block_cutting": "ブロックカット", + "create.recipe.blockzapperUpgrade": "携帯型ブロックザッパー", + "create.recipe.sandpaper_polishing": "紙やすりでの研磨", + "create.recipe.mystery_conversion": "色彩変態", + "create.recipe.processing.catalyst": "触媒", + "create.recipe.processing.chance": "%1$s%%チャンス", + "create.recipe.processing.chanceToReturn": "%1$s%%チャンスで戻る", + + "create.generic.range": "範囲", + "create.generic.radius": "半径", + "create.generic.width": "幅", + "create.generic.height": "高さ", + "create.generic.length": "長さ", + "create.generic.speed": "速度", + "create.generic.delay": "遅延", + "create.generic.unit.ticks": "ティック", + "create.generic.unit.seconds": "秒", + "create.generic.unit.minutes": "分", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "スクロール", + "create.action.confirm": "確認", + "create.action.abort": "中止", + "create.action.saveToFile": "保存", + "create.action.discard": "捨てる", + + "create.keyinfo.toolmenu": "フォーカスツールメニュー", + "create.keyinfo.scrollup": "マウスホイールアップをシミュレート(この世界で)", + "create.keyinfo.scrolldown": "マウスホイールダウンをシミュレーション(この世界で)", + + "create.gui.scrollInput.defaultTitle": "オプションを選択:", + "create.gui.scrollInput.scrollToModify": "スクロールして変更", + "create.gui.scrollInput.scrollToAdjustAmount": "スクロールして金額を調整", + "create.gui.scrollInput.scrollToSelect": "スクロールして選択", + "create.gui.scrollInput.shiftScrollsFaster": "シフトを押してスクロールを加速", + + "create.gui.toolmenu.focusKey": "[%1$s] 長押しでフォーカス", + "create.gui.toolmenu.cycle": "[SCROLL] でサイクル", + + "create.gui.symmetryWand.mirrorType": "ミラー", + "create.gui.symmetryWand.orientation": "オリエンテーション", + "create.symmetry.mirror.plane": "線対称", + "create.symmetry.mirror.doublePlane": "長方形", + "create.symmetry.mirror.triplePlane": "八角形", + "create.orientation.orthogonal": "直交", + "create.orientation.diagonal": "対角線", + "create.orientation.horizontal": "横型", + "create.orientation.alongZ": "Zに沿る", + "create.orientation.alongX": "Xに沿る", + + "create.gui.blockzapper.title": "携帯型ブロックザッパー", + "create.gui.blockzapper.replaceMode": "置換モード", + "create.gui.blockzapper.searchDiagonal": "対角線にフォロー", + "create.gui.blockzapper.searchFuzzy": "マテリアルの境界を無視", + "create.gui.blockzapper.range": "範囲", + "create.gui.blockzapper.needsUpgradedAmplifier": "増幅アップグレードが必要", + "create.gui.blockzapper.patternSection": "模様", + "create.gui.blockzapper.pattern.solid": "敷き詰め", + "create.gui.blockzapper.pattern.checkered": "チェッカーボード", + "create.gui.blockzapper.pattern.inversecheckered": "逆チェッカーボード", + "create.gui.blockzapper.pattern.chance25": "25% ロール", + "create.gui.blockzapper.pattern.chance50": "50% ロール", + "create.gui.blockzapper.pattern.chance75": "75% ロール", + + "create.gui.terrainzapper.title": "携帯型ワールドシェイパー", + "create.gui.terrainzapper.placement": "配置", + "create.gui.terrainzapper.placement.merged": "合併", + "create.gui.terrainzapper.placement.attached": "添える", + "create.gui.terrainzapper.placement.inserted": "挿入", + "create.gui.terrainzapper.brush": "磨き", + "create.gui.terrainzapper.brush.cuboid": "立方体", + "create.gui.terrainzapper.brush.sphere": "球体", + "create.gui.terrainzapper.brush.cylinder": "円筒", + "create.gui.terrainzapper.tool": "ツール", + "create.gui.terrainzapper.tool.fill": "埋立", + "create.gui.terrainzapper.tool.place": "設置", + "create.gui.terrainzapper.tool.replace": "置換", + "create.gui.terrainzapper.tool.clear": "削除", + "create.gui.terrainzapper.tool.overlay": "重ねる", + "create.gui.terrainzapper.tool.flatten": "平坦化", + "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", + + "create.blockzapper.usingBlock": "使用中: %1$s", + "create.blockzapper.componentUpgrades": "コンポーネントアップグレード:", + "create.blockzapper.component.body": "ボディー", + "create.blockzapper.component.amplifier": "増幅", + "create.blockzapper.component.accelerator": "加速", + "create.blockzapper.component.retriever": "レトリーバー", + "create.blockzapper.component.scope": "範囲", + "create.blockzapper.componentTier.none": "無し", + "create.blockzapper.componentTier.brass": "真鍮", + "create.blockzapper.componentTier.chromatic": "色彩", + "create.blockzapper.leftClickToSet": "ブロックをシフト-左クリックでマテリアルを選択", + "create.blockzapper.empty": "ブロック不足!", + + "create.contraptions.movement_mode": "移動モード", + "create.contraptions.movement_mode.move_place": "停止時に常に配置", + "create.contraptions.movement_mode.move_place_returned": "開始位置のみに配置", + "create.contraptions.movement_mode.move_never_place": "アンカーが破壊されたときにのみ配置", + "create.contraptions.movement_mode.rotate_place": "停止時に常に配置", + "create.contraptions.movement_mode.rotate_place_returned": "初期角度付近のみ配置", + "create.contraptions.movement_mode.rotate_never_place": "アンカーが破壊されたときにのみ配置", + + "create.logistics.filter": "フィルタ", + "create.logistics.firstFrequency": "Freq. #1", + "create.logistics.secondFrequency": "Freq. #2", + + "create.gui.goggles.generator_stats": "ジェネレータの統計:", + "create.gui.goggles.kinetic_stats": "動力の統計:", + "create.gui.goggles.at_current_speed": "現在の速度", + "create.gui.goggles.base_value": "基本値", + + "create.gui.gauge.info_header": "計器の情報:", + "create.gui.speed_gauge.title": "回転速度", + "create.gui.stress_gauge.title": "ネットワークの応力", + "create.gui.stress_gauge.capacity": "残りの容量", + "create.gui.stress_gauge.overstressed": "超過応力", + "create.gui.stress_gauge.no_rotation": "回転なし", + + "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", + "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらにソースを追加するか、コンポーネントに_負荷をかけ_応力の影響を大きくします。", + + "create.gui.flexcrate.title": "調整可能なクレート", + "create.gui.flexcrate.storageSpace": "収納スペース", + + "create.gui.stockswitch.title": "在庫スイッチ", + "create.gui.stockswitch.lowerLimit": "下限しきい値", + "create.gui.stockswitch.upperLimit": "上限しきい値", + "create.gui.stockswitch.startAt": "開始信号", + "create.gui.stockswitch.startAbove": "以上の開始信号", + "create.gui.stockswitch.stopAt": "停止信号", + "create.gui.stockswitch.stopBelow": "以下の停止信号", + + "create.gui.sequenced_gearshift.title": "シーケンスギアシフト", + "create.gui.sequenced_gearshift.instruction": "命令", + "create.gui.sequenced_gearshift.instruction.turn_angle": "回転", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance": "ピストン", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", + "create.gui.sequenced_gearshift.instruction.wait": "待機", + "create.gui.sequenced_gearshift.instruction.wait.duration": "期間", + "create.gui.sequenced_gearshift.instruction.end": "終了", + "create.gui.sequenced_gearshift.speed": "速度, 方向", + "create.gui.sequenced_gearshift.speed.forward": "入力速度, フォワード", + "create.gui.sequenced_gearshift.speed.forward_fast": "倍速, フォワード", + "create.gui.sequenced_gearshift.speed.back": "入力速度, 反転", + "create.gui.sequenced_gearshift.speed.back_fast": "倍速, 反転", + + "create.schematicAndQuill.dimensions": "概略図サイズ: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "最初の位置セット。", + "create.schematicAndQuill.secondPos": "2番目の位置セット。", + "create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します", + "create.schematicAndQuill.abort": "選択を削除しました。", + "create.schematicAndQuill.prompt": "概略図の名前を入力してください:", + "create.schematicAndQuill.fallbackName": "My Schematic", + "create.schematicAndQuill.saved": "%1$s として保存しました", + + "create.schematic.invalid": "[!] 無効なアイテム-代わりに概略図テーブルを使用してください", + "create.schematic.position": "位置", + "create.schematic.rotation": "回転", + "create.schematic.rotation.none": "無し", + "create.schematic.rotation.cw90": "時計回りに90", + "create.schematic.rotation.cw180": "時計回りに180", + "create.schematic.rotation.cw270": "時計回りに270", + "create.schematic.mirror": "ミラー", + "create.schematic.mirror.none": "無し", + "create.schematic.mirror.frontBack": "正面-背面", + "create.schematic.mirror.leftRight": "左-右", + + "create.schematic.tool.deploy": "配置する", + "create.schematic.tool.move": "XZを移動", + "create.schematic.tool.movey": "Yを移動", + "create.schematic.tool.rotate": "回転", + "create.schematic.tool.print": "印刷", + "create.schematic.tool.flip": "フリップ", + + "create.schematic.tool.deploy.description.0": "構造を特定の場所に移動します。", + "create.schematic.tool.deploy.description.1": "地面を右クリックして配置します。", + "create.schematic.tool.deploy.description.2": "[Ctrl] を押したまま、一定の距離で選択します。", + "create.schematic.tool.deploy.description.3": "[Ctrl]-スクロールして距離を変更します。", + "create.schematic.tool.move.description.0": "概略図を水平に動かします。", + "create.schematic.tool.move.description.1": "概略図をポイントし、 [Ctrl]-スクロールして押し出します。", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "概略図を垂直に動かします。", + "create.schematic.tool.movey.description.1": "[Ctrl]-スクロールして上下に移動します。", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "概略図をその中心を中心に回転させます。", + "create.schematic.tool.rotate.description.1": "[Ctrl]-スクロールして90度回転します。", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "構造物を即座にワールドに配置します。", + "create.schematic.tool.print.description.1": "[右クリック] して、現在の場所への配置を確認します。", + "create.schematic.tool.print.description.2": "このツールはクリエイティブモード専用です。", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "選択した面に沿って概略図を反転します。", + "create.schematic.tool.flip.description.1": "概略図をポイントし、 [CTRL]-スクロールして反転します。", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "同期しています...", + "create.schematics.uploadTooLarge": "概略図が大きすぎます。", + "create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:", + + "create.gui.schematicTable.title": "概略図テーブル", + "create.gui.schematicTable.availableSchematics": "利用可能な概略図", + "create.gui.schematicTable.noSchematics": "保存された概略図はありません", + "create.gui.schematicTable.uploading": "アップロードしています...", + "create.gui.schematicTable.finished": "アップロードが完了しました!", + + "create.gui.schematicannon.title": "概略図砲", + "create.gui.schematicannon.settingsTitle": "配置設定", + "create.gui.schematicannon.listPrinter": "材料リストプリンター", + "create.gui.schematicannon.gunpowderLevel": "火薬はあと %1$s%% 残っています", + "create.gui.schematicannon.shotsRemaining": "残りのショット数: %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "バックアップあり: %1$s", + "create.gui.schematicannon.optionEnabled": "現在有効", + "create.gui.schematicannon.optionDisabled": "現在無効", + "create.gui.schematicannon.option.dontReplaceSolid": "固体ブロックを置き換えない", + "create.gui.schematicannon.option.replaceWithSolid": "固体を固体に置き換える", + "create.gui.schematicannon.option.replaceWithAny": "固体を任意のものに置き換える", + "create.gui.schematicannon.option.replaceWithEmpty": "空の固体と交換", + "create.gui.schematicannon.option.skipMissing": "不足しているブロックをスキップ", + "create.gui.schematicannon.option.skipTileEntities": "タイルエンティティを保護する", + + "create.gui.schematicannon.option.skipMissing.description": "大砲が配置に必要なブロックを見つけられない場合、次の場所に進みます。", + "create.gui.schematicannon.option.skipTileEntities.description": "大砲は、チェストなどのデータ保持ブロックの交換を回避します。", + "create.gui.schematicannon.option.dontReplaceSolid.description": "大砲は、その作業領域の固体ブロックを置き換えることはなく、非固体と空気のみを置き換えます。", + "create.gui.schematicannon.option.replaceWithSolid.description": "大砲は、概略図の位置にソリッドブロックが含まれている場合にのみ、その作業領域のソリッドブロックを置き換えます。", + "create.gui.schematicannon.option.replaceWithAny.description": "概略図のロケーションにブロックが含まれている場合、大砲はその作業領域の個体ブロックを置き換えます。", + "create.gui.schematicannon.option.replaceWithEmpty.description": "大砲は、空気に置き換えられたものを含め、その作業エリア内のすべてのブロックを一掃します。", + + "create.schematicannon.status.idle": "停止中", + "create.schematicannon.status.ready": "準備完了", + "create.schematicannon.status.running": "稼働中", + "create.schematicannon.status.finished": "完成", + "create.schematicannon.status.paused": "一時停止中", + "create.schematicannon.status.stopped": "停止", + "create.schematicannon.status.noGunpowder": "火薬不足", + "create.schematicannon.status.targetNotLoaded": "ブロックが読み込まれていません", + "create.schematicannon.status.targetOutsideRange": "ターゲットが遠すぎます", + "create.schematicannon.status.searching": "検索中", + "create.schematicannon.status.skipping": "スキップ", + "create.schematicannon.status.missingBlock": "不明なブロック:", + "create.schematicannon.status.placing": "配置中", + "create.schematicannon.status.clearing": "ブロックをクリア中", + "create.schematicannon.status.schematicInvalid": "概略図が無効です", + "create.schematicannon.status.schematicNotPlaced": "配置されていない概略図です", + "create.schematicannon.status.schematicExpired": "概略図ファイルが期限切れです", + + "create.gui.filter.blacklist": "ブラックリスト", + "create.gui.filter.blacklist.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.whitelist": "ホワイトリスト", + "create.gui.filter.whitelist.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.respect_data": "データを重視", + "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", + "create.gui.filter.ignore_data": "データを無視", + "create.gui.filter.ignore_data.description": "アイテムは属性に関係なく一致します。", + + "create.item_attributes.placeable": "設置可能か", + "create.item_attributes.consumable": "食べられるか", + "create.item_attributes.smeltable": "精錬可能か", + "create.item_attributes.washable": "洗えるか", + "create.item_attributes.smokable": "燻製可能か", + "create.item_attributes.blastable": "高炉で製錬可能か", + "create.item_attributes.enchanted": "エンチャント済みか", + "create.item_attributes.damaged": "破損してるか", + "create.item_attributes.badly_damaged": "ひどく損傷してるか", + "create.item_attributes.not_stackable": "スタック可能か", + "create.item_attributes.equipable": "装備可能か", + "create.item_attributes.furnace_fuel": "かまどの燃料か", + "create.item_attributes.in_tag": "%1$s のタグが付けられてるか", + "create.item_attributes.in_item_group": "%1$s に属してるか", + "create.item_attributes.added_by": "%1$s によって追加されたか", + + "create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません", + "create.gui.attribute_filter.selected_attributes": "選択された属性:", + "create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.blacklist": "ブラックリスト", + "create.gui.attribute_filter.blacklist.description": "選択された属性を持たない場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.add_reference_item": "参照アイテムを追加", + + "create.tooltip.holdKey": "[%1$s] を長押し", + "create.tooltip.holdKeyOrKey": "[%1$s] または [%2$s] を長押し", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + + "create.tooltip.speedRequirement": "スピード要件: %1$s", + "create.tooltip.speedRequirement.none": "無し", + "create.tooltip.speedRequirement.medium": "中速", + "create.tooltip.speedRequirement.high": "高速", + + "create.tooltip.stressImpact": "応力への影響: %1$s", + "create.tooltip.stressImpact.low": "低", + "create.tooltip.stressImpact.medium": "中", + "create.tooltip.stressImpact.high": "高", + "create.tooltip.stressImpact.overstressed": "超過応力", + + "create.tooltip.capacityProvided": "応力許容量: %1$s", + "create.tooltip.capacityProvided.low": "小", + "create.tooltip.capacityProvided.medium": "中", + "create.tooltip.capacityProvided.high": "大", + "create.tooltip.capacityProvided.asGenerator": "(ジェネレータとして)", + "create.tooltip.generationSpeed" : "%1$s %2$sを生成", + + "create.tooltip.analogStrength": "アナログ強度: %1$s/15", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "作業中です!", + + "create.tooltip.randomWipDescription0": "お子様の手の届かないところに保管してください。", + "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使用するたびに死にます。そう、すべての時間。", + "create.tooltip.randomWipDescription2": "自己責任。", + "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。* finger-wiggles *を分散させてください。", + "create.tooltip.randomWipDescription4": "このアイテムは10秒で自己破壊します。 10、9、8 ...", + "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", + "create.tooltip.randomWipDescription6": "このアイテムを使用することにより、お客様はここに免責事項に同意し、その条件に同意するものとします。", + "create.tooltip.randomWipDescription7": "これはあなたのためではないかもしれません。 あれはどう??", + "create.tooltip.randomWipDescription8": "それを使ってすぐに決断したことに後悔してください。", + + "create.mechanical_mixer.min_ingredients": "最小 材料", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]:サーバーティックは現在 %s ms 遅くなっています :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: サーバーティックが %s ms 遅くなりました >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: サーバーティックが通常の速度に戻りました:D", + "create.command.killTPSCommand.status.usage.0": "[Create]: /killtps stopを使用してサーバーのティックを通常の速度に戻します", + "create.command.killTPSCommand.status.usage.1": "[Create]: /killtps start を使用して、サーバーのティックを意図的に遅くします", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "advancement.create:root": "最初に、作成しましょう!", + "advancement.create:root.desc": "すばらしい仕掛けを構築する時が来ました!", + "advancement.create:andesite_alloy": "豊富な知識", + "advancement.create:andesite_alloy.desc": "Createのマテリアルの名前は奇妙ですが、安山岩合金はその1つです。", + "advancement.create:andesite_casing": "安山岩時代", + "advancement.create:andesite_casing.desc": "巨人のペア", + "advancement.create:crushing_wheel": "いくつかの安山岩、金属、木材を使用して、基本的なケーシングを作成する。", + "advancement.create:crushing_wheel.desc": "破砕ホイールをいくつか作成して、材料を粉砕する。", + "advancement.create:rotation": "生きてるぅー!", + "advancement.create:rotation.desc": "最初の運動コンポーネントの回転を観察する。", + "advancement.create:overstressed": "応力がたまっている", + "advancement.create:overstressed.desc": "物理法則を直接体験してください。", + "advancement.create:sand_paper": "パワーポリッシュ", + "advancement.create:sand_paper.desc": "紙やすりを作成して、見栄えを良くする。", + "advancement.create:polished_rose_quartz": "ピンクダイヤモンド", + "advancement.create:polished_rose_quartz.desc": "ローズクォーツを透けて見えるようにする。", + "advancement.create:sand_paper_secret": "9001版紙やすり", + "advancement.create:sand_paper_secret.desc": "紙やすりで、いくつかの紙やすりを紙やすりで磨く。", + "advancement.create:press": "'ボンク!' ", + "advancement.create:press.desc": "メカニカルプレスを作成し、それを使用してプレートを作成する。。", + "advancement.create:mixer": "ミックスイン・イット・アップ", + "advancement.create:mixer.desc": "メカニカルミキサーを作成する。", + "advancement.create:brass": "実際の合金", + "advancement.create:brass.desc": "銅と亜鉛を使用して真鍮を作成する。", + "advancement.create:brass_casing": "真鍮の時代", + "advancement.create:brass_casing.desc": "新しく入手した真鍮といくつかの木材を使用して、より高度なケーシングを作成する。", + "advancement.create:deployer": "突く、配置する、攻撃する", + "advancement.create:deployer.desc": "自分を完全に反映したデプロイヤーを作成する。", + "advancement.create:deployer_secret": "パウンドイットブロ!", + "advancement.create:deployer_secret.desc": "2つのデプロイヤーを拳バンプする。", + "advancement.create:chromatic_compound": "バイポーラ材料", + "advancement.create:chromatic_compound.desc": "色彩の化合物のバーを作成する。", + "advancement.create:shadow_steel": "ボイドリターナー", + "advancement.create:shadow_steel.desc": "何もない金属の棒であるシャドースチールを作成する。", + "advancement.create:refined_radiance": "明るく刺激的な", + "advancement.create:refined_radiance.desc": "強力な彩色物質である洗練された輝きを作成する。", + "advancement.create:refined_radiance_secret": "光のビームによっての偽造", + "advancement.create:refined_radiance_secret.desc": "洗練された輝きを作る別の方法を見つける。", + "advancement.create:speed_secret": "やりますねぇ! ", + "advancement.create:speed_secret.desc": "スピードメーターが確かに69 rpmに達するのを確認した。", + + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.schematicannon_finish": "概略図砲が終了する", + "create.subtitle.slime_added": "スライムスクイーズ", + "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", + "create.subtitle.mechanical_press_item_break": "金属クランク", + "create.subtitle.blockzapper_place": "ブロックザップされる", + "create.subtitle.blockzapper_confirm": "アファーマティブディン", + "create.subtitle.blockzapper_deny": "衰退するブープ", + "create.subtitle.block_funnel_eat": "ファンネルCHOMPS", + + "_comment": "-------------------------] ITEM DESCRIPTIONS [------------------------------------------------", + + "item.create.example_item.tooltip": "アイテムの例(このツールチップが存在する単なるマーカー)", + "item.create.example_item.tooltip.summary": "アイテムの簡単な説明。 _アンダースコア_用語を強調表示します。", + "item.create.example_item.tooltip.condition1": "これは", + "item.create.example_item.tooltip.behaviour1": "次に、このアイテムはこれを行います。 (行動はシフトで示されます)", + "item.create.example_item.tooltip.condition2": "そしてこれは", + "item.create.example_item.tooltip.behaviour2": "あなたは好きなだけ行動を追加することができます", + "item.create.example_item.tooltip.control1": "Ctrlを押したとき", + "item.create.example_item.tooltip.action1": "これらのコントロールが表示されます。", + + "item.create.symmetry_wand.tooltip": "対称性が必要", + "item.create.symmetry_wand.tooltip.summary": "構成されたプレーン全体のブロック配置を完全にミラーリングします。", + "item.create.symmetry_wand.tooltip.condition1": "ホットバーにあるとき", + "item.create.symmetry_wand.tooltip.behaviour1": "アクティブのまま", + "item.create.symmetry_wand.tooltip.control1": "地面を右クリックしたとき", + "item.create.symmetry_wand.tooltip.action1": "ミラーを_作成_または_移動_", + "item.create.symmetry_wand.tooltip.control2": "空中を右クリックしたとき", + "item.create.symmetry_wand.tooltip.action2": "アクティブなミラーを_削除_", + "item.create.symmetry_wand.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.symmetry_wand.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.placement_handgun.tooltip": "ブロックザッパー", + "item.create.placement_handgun.tooltip.summary": "離れた場所にブロックを配置または交換するための新しいガジェット。", + "item.create.placement_handgun.tooltip.control1": "ブロックを左クリックしたとき", + "item.create.placement_handgun.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", + "item.create.placement_handgun.tooltip.control2": "ブロックを右クリックしたとき", + "item.create.placement_handgun.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", + "item.create.placement_handgun.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.placement_handgun.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.terrain_zapper.tooltip": "ハンドヘルドワールドシェーパー", + "item.create.terrain_zapper.tooltip.summary": "_風景_や_地形の特徴_を作成するための便利なツール。", + "item.create.terrain_zapper.tooltip.control1": "ブロックを左クリックしたとき", + "item.create.terrain_zapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", + "item.create.terrain_zapper.tooltip.control2": "ブロックを右クリックしたとき", + "item.create.terrain_zapper.tooltip.action2": "現在選択されている_ブラシ_と_ツール_をターゲットの場所に適用します。", + "item.create.terrain_zapper.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.terrain_zapper.tooltip.action3": "_設定インターフェース_を開きます", + + "item.create.tree_fertilizer.tooltip": "木質肥料", + "item.create.tree_fertilizer.tooltip.summary": "一般的な木の種類の成長を加速するのに適したミネラルの強力な組み合わせ。", + "item.create.tree_fertilizer.tooltip.condition1": "苗木に使用したとき", + "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_ツリーを成長させる", + + "item.create.deforester.tooltip": "デフォレスター", + "item.create.deforester.tooltip.summary": "一瞬で木を切り倒すことができる_輝く斧_。", + + "item.create.filter.tooltip": "フィルタ", + "item.create.filter.tooltip.summary": "ロジスティックデバイスの_出力_と_入力_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_ネストされたフィルター_と照合します。", + "item.create.filter.tooltip.condition1": "フィルタースロットにセットしたとき", + "item.create.filter.tooltip.behaviour1": "_構成_に応じてアイテムの流れを_制御_します。", + "item.create.filter.tooltip.condition2": "右クリックしたとき", + "item.create.filter.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "item.create.property_filter.tooltip": "属性フィルター", + "item.create.property_filter.tooltip.summary": "ロジスティックデバイスの_出力_と_入力_をより_正確_に_制御_し、アイテムの_属性_と_カテゴリのセット_と照合します。", + "item.create.property_filter.tooltip.condition1": "フィルタースロットにセットしたとき", + "item.create.property_filter.tooltip.behaviour1": "_構成_に応じてアイテムの流れを_制御_します。", + "item.create.property_filter.tooltip.condition2": "右クリックしたとき", + "item.create.property_filter.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "block.create.cocoa_log.tooltip": "ココアログ", + "block.create.cocoa_log.tooltip.summary": "_カカオ豆_の自動化を容易するジャングルの原木。", + "block.create.cocoa_log.tooltip.condition1": "成熟したとき", + "block.create.cocoa_log.tooltip.behaviour1": "_カカオの実_を四方八方に育てる。", + + "item.create.empty_blueprint.tooltip": "空のスキーマ", + "item.create.empty_blueprint.tooltip.summary": "レシピの材料として、および_概略図テーブル_での記述に使用されます。", + + "item.create.blueprint.tooltip": "概略図", + "item.create.blueprint.tooltip.summary": "ワールドに配置および配置される構造を保持します。 ホログラムを必要に応じて配置し、_概略図砲_を使用して作成します。", + "item.create.blueprint.tooltip.condition1": "持ったとき", + "item.create.blueprint.tooltip.behaviour1": "画面上のツールを使用して配置できます。", + "item.create.blueprint.tooltip.control1": "スニークしながら右クリックしたとき", + "item.create.blueprint.tooltip.action1": "正確な_座標_を入力するための_インターフェース_を開きます。", + + "item.create.blueprint_and_quill.tooltip": "概略図と羽根ペン", + "item.create.blueprint_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存するために使用されます。", + "item.create.blueprint_and_quill.tooltip.condition1": "ステップ1", + "item.create.blueprint_and_quill.tooltip.behaviour1": "右クリックして2つのコーナーポイントを選択します。", + "item.create.blueprint_and_quill.tooltip.condition2": "ステップ2", + "item.create.blueprint_and_quill.tooltip.behaviour2": "_Ctrlキーを押しながらスクロール_して、サイズを調整します。 もう一度右クリックして保存します。", + "item.create.blueprint_and_quill.tooltip.control1": "右クリックしたとき", + "item.create.blueprint_and_quill.tooltip.action1": "コーナーポイントを選択/保存を確認します。", + "item.create.blueprint_and_quill.tooltip.control2": "Ctrlを長押してるとき", + "item.create.blueprint_and_quill.tooltip.action2": "_空中_でポイントを選択します。 _スクロール_して距離を調整します。", + "item.create.blueprint_and_quill.tooltip.control3": "スニークしながら右クリックしたとき", + "item.create.blueprint_and_quill.tooltip.action3": "選択を_リセット_して削除します。", + + "block.create.creative_crate.tooltip": "クリエイティブクレート", + "block.create.creative_crate.tooltip.summary": "隣接する概略図砲へブロックの無限に供給します。", + + "block.create.schematicannon.tooltip": "スキーマキャノン", + "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。 隣接するインベントリからのアイテムを供給し、_火薬_を燃料として使用します。", + "block.create.schematicannon.tooltip.control1": "右クリックしたとき", + "block.create.schematicannon.tooltip.action1": "_インターフェイス_を開きます", + + "block.create.schematic_table.tooltip": "概略図テーブル", + "block.create.schematic_table.tooltip.summary": "保存された概略図を_空の概略図_に書き込みます。", + "block.create.schematic_table.tooltip.condition1": "空の概略図が与えられたとき", + "block.create.schematic_table.tooltip.behaviour1": "Schematicsフォルダから選択したファイルをアップロードします。", + + "block.create.shaft.tooltip": "軸", + "block.create.shaft.tooltip.summary": "_回転_を直線で_中継_します。", + + "block.create.cogwheel.tooltip": "コグホイール", + "block.create.cogwheel.tooltip.summary": "_回転_を直線で、隣接する_歯車_に_中継_します。", + + "block.create.large_cogwheel.tooltip": "大型コグホイール", + "block.create.large_cogwheel.tooltip.summary": "より大きなバージョンの_歯車_により、小さな対応物に接続したときに_回転速度_を_変更_できます。", + + "block.create.encased_shaft.tooltip": "内蔵シャフト", + "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_中継_します。 壁を通過する回転の伝播に適しています。", + + "block.create.gearbox.tooltip": "ギアボックス", + "block.create.gearbox.tooltip.summary": "_中継_する_4方向_の_回転_直線接続を逆にします。", + + "block.create.gearshift.tooltip": "ギアシフト", + "block.create.gearshift.tooltip.summary": "接続されたシャフトの回転方向を切り替えるコントロール。", + "block.create.gearshift.tooltip.condition1": "パワーが入ってるとき", + "block.create.gearshift.tooltip.behaviour1": "出て行く回転を_逆_にします。", + + "block.create.clutch.tooltip": "クラッチ", + "block.create.clutch.tooltip.summary": "接続されたシャフトの回転をオン/オフするコントロール。", + "block.create.clutch.tooltip.condition1": "パワーが入ってるとき", + "block.create.clutch.tooltip.behaviour1": "反対側への回転の伝達を_停止_します。", + + "block.create.encased_belt.tooltip": "ケース入りベルト", + "block.create.encased_belt.tooltip.summary": "_回転_をそのブロックと接続された_ケース入りベルト_に_中継_します。", + "block.create.encased_belt.tooltip.condition1": "接続したとき", + "block.create.encased_belt.tooltip.behaviour1": "アタッチされたブロックの_回転速度_と方向はまったく_同じ_です。 彼らは同じように向き合う必要はありません。", + + "block.create.adjustable_pulley.tooltip": "アナログベルトプーリー", + "block.create.adjustable_pulley.tooltip.summary": "ブロックを介して_回転を中継_し、取り付けられた_ケース入りベルト_に伝達します。 取り付けられた包み込まれたベルトは、このブロックが受信する_アナログレッドストーン信号_に基づいて_より速く回転_します。", + "block.create.adjustable_pulley.tooltip.condition1": "レッドストーンコントロール", + "block.create.adjustable_pulley.tooltip.behaviour1": "信号がないと、接続されているベルトの_速度が上がりません_。 フルストレングスシグナル接続ベルトにより、_速度は2倍になります_。", + + "item.create.belt_connector.tooltip": "ベルトコネクター", + "item.create.belt_connector.tooltip.summary": "2つ以上の_シャフト_を_メカニカルベルト_で接続します。 接続されたシャフトの回転速度と方向はまったく同じです。 ベルトは、_アイテム_と_エンティティ_の_コンベア_として機能できます。", + "item.create.belt_connector.tooltip.control1": "シャフトを右クリックしたとき", + "item.create.belt_connector.tooltip.action1": "ベルトの1つのプーリーとしてシャフトを選択します。 選択した両方のシャフトは、_ベルトの方向_に向かって_垂直_、_水平_、または_斜め_に整列する必要があります。", + "item.create.belt_connector.tooltip.control2": "スニークしながらシャフトを右クリックしたとき", + "item.create.belt_connector.tooltip.action2": "ベルトの最初に選択された位置を_リセット_します。", + + "item.create.goggles.tooltip": "ゴーグル", + "item.create.goggles.tooltip.summary": "有用な動力情報で視覚を強化するための眼鏡。", + "item.create.goggles.tooltip.condition1": "着用したとき", + "item.create.goggles.tooltip.behaviour1": "配置されたキネティックコンポーネントの_速度レベル_に対応する_色付きのインジケーター_と、個々のコンポーネント_の応力の影響_と_容量_を表示します。", + "item.create.goggles.tooltip.condition2": "計器を見たとき", + "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの速度または応力に関する詳細情報を表示します。", + + "item.create.wrench.tooltip": "レンチ", + "item.create.wrench.tooltip.summary": "動力論的からくりに取り組むための便利なツール。 コンポーネントの_回転_、_解体_、_設定_に使用できます。", + "item.create.wrench.tooltip.control1": "動力ブロックを右クリックしたとき", + "item.create.wrench.tooltip.action1": "_操作した面に向かって、または面から離れるように_コンポーネントを回転させます_。", + "item.create.wrench.tooltip.control2": "スニークしながら右クリックしたとき", + "item.create.wrench.tooltip.action2": "_動力コンポーネントを分解_し、_インベントリ_に戻します。", + + "block.create.creative_motor.tooltip": "クリエイティブモーター", + "block.create.creative_motor.tooltip.summary": "_回転力_を設定可能なソース。", + + "block.create.water_wheel.tooltip": "水車", + "block.create.water_wheel.tooltip.summary": "_隣接する水流_から取得される_回転力_を提供します。", + + "block.create.encased_fan.tooltip": "内蔵ファン", + "block.create.encased_fan.tooltip.summary": "_回転力_を_気流_に変換し、戻します。さまざまな用途があります。", + "block.create.encased_fan.tooltip.condition1": "レッドストーン動力を与えたとき", + "block.create.encased_fan.tooltip.behaviour1": "直下の_熱源_から_回転力_を提供します。 ファンは下向きにする必要があります。", + "block.create.encased_fan.tooltip.condition2": "回転したとき", + "block.create.encased_fan.tooltip.behaviour2": "入力回転速度に応じて、エンティティを_押す_または_引き戻_します。", + "block.create.encased_fan.tooltip.condition3": "特別なブロックを吹き抜けるとき", + "block.create.encased_fan.tooltip.behaviour3": "_液体_と_炎_の粒子が空気の流れに放出されます。 これは、_アイテムの処理_に使用できます。", + + "block.create.nozzle.tooltip": "ノズル", + "block.create.nozzle.tooltip.summary": "_ケース入りファン_の前面に取り付けて、エンティティへの影響を_全方向_に分散します。", + + "block.create.hand_crank.tooltip": "ハンドクランク", + "block.create.hand_crank.tooltip.summary": "プレイヤーの相互作用を必要とする_回転力の単純な情報源_。", + "block.create.hand_crank.tooltip.condition1": "使用してるとき", + "block.create.hand_crank.tooltip.behaviour1": "付属の仕掛けに_回転力_を提供します。 _スニークで回転を逆_にします。", + + "block.create.cuckoo_clock.tooltip": "鳩時計", + "block.create.cuckoo_clock.tooltip.summary": "空間を_飾り_、_時間を追跡する_ための素晴らしい職人技。", + "block.create.cuckoo_clock.tooltip.condition1": "回転したとき", + "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。 _プレイヤーが眠れるようになる_とすぐに、_正午_と夕暮れに1回_アクティブ_になります。", + + "block.create.turntable.tooltip": "ターンテーブル", + "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", + + "block.create.millstone.tooltip": "石臼", + "block.create.millstone.tooltip.summary": "挿入された_材料_の_研削_に適したキネティックコンポーネント。 隣接する歯車によって、または下部のシャフトに接続することによって、動力を供給できます。 結果はコンポーネントから抽出する必要があります。", + "block.create.millstone.tooltip.condition1": "回転したとき", + "block.create.millstone.tooltip.behaviour1": "ブロックの側面または上面から挿入されたアイテムを_粉砕_を開始します。", + "block.create.millstone.tooltip.condition2": "右クリックしたとき", + "block.create.millstone.tooltip.behaviour2": "出力物を手動で収集します。", + + "block.create.crushing_wheel.tooltip": "クラッシングホイール", + "block.create.crushing_wheel.tooltip.summary": "何かを_分解_する大きな回転可能なホイール。", + "block.create.crushing_wheel.tooltip.condition1": "他の破砕ホイールに取り付けたとき", + "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理するための破砕機を形成します。 ホイールの歯は、同じ速度で接続し、反対方向に動く必要があります。", + + "block.create.mechanical_press.tooltip": "メカニカルプレス", + "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮するための強力なピストン。 一定の_回転力_が必要です。", + "block.create.mechanical_press.tooltip.condition1": "レッドストーン動力を受けたとき", + "block.create.mechanical_press.tooltip.behaviour1": "その下にドロップされたアイテムの圧縮を_開始_します。", + "block.create.mechanical_press.tooltip.condition2": "メカニカルベルトの上にあるとき", + "block.create.mechanical_press.tooltip.behaviour2": "ベルト上のバイパスアイテムを_自動的_に圧縮します。", + "block.create.mechanical_mixer.tooltip.condition3": "鉢の上にあるとき", + "block.create.mechanical_mixer.tooltip.behaviour3": "必要なすべての成分が存在するときはいつでも、鉢の_アイテムを圧縮_し始めます。", + + "block.create.basin.tooltip": "鉢", + "block.create.basin.tooltip.summary": "_メカニカルミキサー_と_メカニカルプレス_での処理に使用される便利な_アイテムの入れ物_。_レッドストーンコンパレータ_をサポートします。", + + "block.create.mechanical_mixer.tooltip": "メカニカルミキサー", + "block.create.mechanical_mixer.tooltip.summary": "その下のアイテムに形状のない製作レシピを適用するための動力ミキサー。 一定の_回転力_と下に配置された_鉢_が必要です(間にギャップがあります)。", + "block.create.mechanical_mixer.tooltip.condition1": "鉢の上にあるとき", + "block.create.mechanical_mixer.tooltip.behaviour1": "必要なすべての成分が存在するときはいつでも、鉢のアイテムの混合を開始します。", + "block.create.mechanical_mixer.tooltip.condition2": "レンチと併用したとき", + "block.create.mechanical_mixer.tooltip.behaviour2": "適用されるレシピの_総材料_の最小量を_構成_します。 このオプションを使用して、似ているが成分が少ない_不要なレシピを除外_します。", + + "block.create.mechanical_crafter.tooltip": "メカニカルクラフト", + "block.create.mechanical_crafter.tooltip.summary": "_あらゆる形状の製作レシピ_を自動化するための動的アセンブラー。 _レシピに対応するグリッドに複数を配置_し、_フェアベルトを配置して_、いずれかのクラフターのグリッドから出る_流れ_を作成します。", + "block.create.mechanical_crafter.tooltip.condition1": "回転したとき", + "block.create.mechanical_crafter.tooltip.behaviour1": "グリッド内の_すべてのクラフター_にテンプレートが_与えられる_とすぐに、_生産プロセスを開始_します。", + "block.create.mechanical_crafter.tooltip.control1": "フロントでレンチしたとき", + "block.create.mechanical_crafter.tooltip.action1": "_個々の生産者が_アイテムを移動_する_方向_を循環させます。 作業グリッドを形成するには、すべてのアイテムを最終的なクラフターに向かって_移動させる流れ_に_ベルト_を配置します。 最終的なクラフターはグリッドから_離れる_方向を指さなければなりません。", + "block.create.mechanical_crafter.tooltip.control2": "後ろでレンチしたとき", + "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_入力インベントリ_を_接続_します。 これを使用して、クラフトグリッドの_スロットを結合_し、_入力作業を節約_します。", + + "block.create.furnace_engine.tooltip": "かまどエンジン", + "block.create.furnace_engine.tooltip.summary": "_稼働するかまど_が機能することを必要とする強力な_回転動力源_。", + "block.create.furnace_engine.tooltip.condition1": "燃えてるかまどに取り付けたとき", + "block.create.furnace_engine.tooltip.behaviour1": "その前(1m離れて)に配置された_フライホイールへの動力供給を開始_します。 高速化するには高炉を使用してください。", + + "block.create.flywheel.tooltip": "勢車", + "block.create.flywheel.tooltip.summary": "_取り付けたのエンジン_が発生する_力を利用して安定_させる大型の金属ホイール。 勢車が_1 m離れていて_、_互いに90°の角度にある_場合、エンジンに接続します。", + "block.create.flywheel.tooltip.condition1": "実行中のエンジンに取り付けられてるとき", + "block.create.flywheel.tooltip.behaviour1": "ジェネレータの強度と速度に基づいて、取り付けた仕掛けに_回転力_を提供します。", + + "block.create.portable_storage_interface.tooltip": "ポータブルストレージインターフェイス", + "block.create.portable_storage_interface.tooltip.summary": "ピストン、ベアリング、トロッコ、またはプーリーによって移動される_構造物_との間で_アイテムを移動_するためのポータブル交換ポイント。", + "block.create.portable_storage_interface.tooltip.condition1": "移動してるとき", + "block.create.portable_storage_interface.tooltip.behaviour1": "インターフェースの_反対側_にある_トランスポーザー_が_アイテムを引っ張り_、インターフェースをターゲットとするトランスポーザーが接続されたインベントリから_アイテムを挿入_するように、固定トランスポーザーと相互作用します。 アイテムが交換されると、からくりは一時的に停止します。", + + "block.create.rotation_speed_controller.tooltip": "回転速度コントローラー", + "block.create.rotation_speed_controller.tooltip.summary": "ターゲットコンポーネントを任意の速度に加速または減速できる_構成可能な中継_。", + "block.create.rotation_speed_controller.tooltip.condition1": "大きな歯車に取り付けたとき", + "block.create.rotation_speed_controller.tooltip.behaviour1": "入ってくる回転力をホイールに中継し、目標とするように構成された_速度に一致_させようとします。 _歯車はコントローラーの上に取り付ける_必要があります。", + + "block.create.mechanical_piston.tooltip": "メカニカルピストン", + "block.create.mechanical_piston.tooltip.summary": "_ピストン_より高度なもの。 _回転力_を使用して、取り付けられた構造物を正確に移動します。 背面の_ピストン延長極_は、このデバイスの_範囲_を定義します。 延長がないと、ピストンは動きません。 _シャーシ_または_スライムブロック_を使用して、1行以上のブロックを移動します。", + "block.create.mechanical_piston.tooltip.condition1": "回転したとき", + "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + + "block.create.sticky_mechanical_piston.tooltip": "粘着メカニカルピストン", + "block.create.sticky_mechanical_piston.tooltip.summary": "_粘着ピストン_より高度なもの。 _回転力_を使用して、取り付けられた構造物を正確に移動します。 背面の_ピストン延長極_は、このデバイスの_範囲_を定義します。 延長がないと、ピストンは動きません。 _シャーシ_または_スライムブロック_を使用して、1行以上のブロックを移動します。", + "block.create.sticky_mechanical_piston.tooltip.condition1": "回転したとき", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。 速度と方向は、入力される回転速度と相関します。", + + "block.create.piston_pole.tooltip": "ピストンポール", + "block.create.piston_pole.tooltip.summary": "メカニカルピストンの範囲を拡張します。", + "block.create.piston_pole.tooltip.condition1": "メカニカルピストンに取り付けたとき", + "block.create.piston_pole.tooltip.behaviour1": "ピストンの範囲を1ブロック拡張", + + "block.create.mechanical_bearing.tooltip": "メカニカルベアリング", + "block.create.mechanical_bearing.tooltip.summary": "_大きな構造物_を回転させたり、風からの_回転力_を利用したりするために使用されます。", + "block.create.mechanical_bearing.tooltip.condition1": "回転したとき", + "block.create.mechanical_bearing.tooltip.behaviour1": "アタッチされたブロックの回転を開始します。_シャーシ_または_スライムブロック_を使用して、複数のブロックを移動します。", + "block.create.mechanical_bearing.tooltip.condition2": "レッドストーン動力を与えたとき", + "block.create.mechanical_bearing.tooltip.behaviour2": "取り付けた構造物の回転から生成される_回転力_の提供を開始します。 構造には、適切な_帆ブロック_(現在はすべてのウールブロック)を含める必要があります。", + + "block.create.clockwork_bearing.tooltip": "時計仕掛けベアリング", + "block.create.clockwork_bearing.tooltip.summary": "現在の_ゲーム内時間_に応じて最大2つの_時計の針_を回転させる、_メカニカルベアリング_より高度なもの。", + "block.create.clockwork_bearing.tooltip.condition1": "回転したとき", + "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。 2番目の構造が存在する場合、それは分針として機能します。", + + "block.create.sequenced_gearshift.tooltip": "順次ギアシフト", + "block.create.sequenced_gearshift.tooltip.summary": "最大_5つの連続する命令_に従って_回転スループット_を変更できる_プログラム可能_な_ユーティリティコンポーネント_。 これを使用して、メカニカルベアリング、ピストン、またはプーリーに動力を供給し、タイミングと速度をより細かく制御します。 高速では精度が低下する可能性があります。", + "block.create.sequenced_gearshift.tooltip.condition1": "レッドストーン信号を与えたとき", + "block.create.sequenced_gearshift.tooltip.behaviour1": "入力速度に基づいてプログラムされた命令の実行を開始します。", + "block.create.sequenced_gearshift.tooltip.condition2": "右クリックしたとき", + "block.create.sequenced_gearshift.tooltip.behaviour2": "_設定インターフェース_を開きます", + + "block.create.cart_assembler.tooltip": "カートアッセンブラー", + "block.create.cart_assembler.tooltip.summary": "接続された構造物を_通過するトロッコ_に取り付けます。", + "block.create.cart_assembler.tooltip.condition1": "レッドストーン信号を与えたとき", + "block.create.cart_assembler.tooltip.behaviour1": "_通過するカート_のマウントされた構造物を_分解_し、それらをワールドに戻します。", + + "block.create.rope_pulley.tooltip": "ローププーリー", + "block.create.rope_pulley.tooltip.summary": "取り付けた_ブロックと構造物を垂直_に移動します。 _シャーシブロック_または_スライムブロック_を使用して、1つ以上のブロックを移動します。", + "block.create.rope_pulley.tooltip.condition1": "回転したとき", + "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。 速度と方向は、入力される回転速度に相関します。", + + "block.create.translation_chassis.tooltip": "トランスシャーシ", + "block.create.translation_chassis.tooltip.summary": "移動用の構造を接続する構成可能なベースブロック。", + "block.create.translation_chassis.tooltip.condition1": "移動したとき", + "block.create.translation_chassis.tooltip.behaviour1": "_取り付けられるすべてのシャーシ_を同じ方向に移動し、ブロックの列をその範囲内に移動します。 ブロックは、シャーシの表面が_粘着性_がある場合にのみ引っ張られます([Ctrl]を参照)。", + "block.create.translation_chassis.tooltip.condition2": "レンチしたとき", + "block.create.translation_chassis.tooltip.behaviour2": "このシャーシブロックの_範囲_を構成します。 CTRLキーを押したまま、接続されているすべてのシャーシブロックの範囲も変更します。", + "block.create.translation_chassis.tooltip.control1": "スライムボールで右クリックしたとき", + "block.create.translation_chassis.tooltip.action1": "クリックした面を_粘着性_にします。 移動すると、シャーシは移動方向に関係なく、取り付けられたブロックを_引っ張り_ます。", + + "block.create.rotation_chassis.tooltip": "回転シャーシ", + "block.create.rotation_chassis.tooltip.summary": "移動用の構造を取り付ける構成可能なベースブロック。", + "block.create.rotation_chassis.tooltip.condition1": "動かしたとき", + "block.create.rotation_chassis.tooltip.behaviour1": "列に_取り付けられてるすべてのシャーシ_、およびそれ自体の周りのブロックのシリンダーを_移動_します。 周囲のブロックは、範囲内にあり、粘着面に接続されている場合にのみ移動されます([Ctrl]を参照)。", + "block.create.rotation_chassis.tooltip.condition2": "レンチを使ったとき", + "block.create.rotation_chassis.tooltip.behaviour2": "このシャーシブロックの_範囲_を構成します。 CTRLキーを押したまま、接続されているすべてのシャーシブロックの範囲も変更します。", + "block.create.rotation_chassis.tooltip.control1": "スライムボールで右クリックしたとき", + "block.create.rotation_chassis.tooltip.action1": "クリックした面を_粘着性_にします。 シャーシが移動すると、粘着面に接続されているすべての指定ブロックが一緒に移動します。", + + "block.create.drill.tooltip": "機械ドリル", + "block.create.drill.tooltip.summary": "_ブロックを壊す_のに適した機械装置。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.drill.tooltip.condition1": "回転したとき", + "block.create.drill.tooltip.behaviour1": "_静止_したブロックブレーカーとして機能します。 また、有効領域の_エンティティを傷つけます_。", + "block.create.drill.tooltip.condition2": "動かしたとき", + "block.create.drill.tooltip.behaviour2": "ドリルが衝突するブロックを壊します。", + + "block.create.harvester.tooltip": "メカニカルハーベスター", + "block.create.harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.harvester.tooltip.condition1": "動かしたとき", + "block.create.harvester.tooltip.behaviour1": "ブレードが衝突する_すべての成熟した作物を収穫_し、それらを初期の成長状態にリセットします。", + + "block.create.saw.tooltip": "メカニカル鋸", + "block.create.saw.tooltip.summary": "木を効果的に切断したり、大工したものにブロックを切断したりするのに適しています。 メカニカルピストンまたはベアリングを使用して移動可能です。", + "block.create.saw.tooltip.condition1": "上向きのとき", + "block.create.saw.tooltip.behaviour1": "そこにドロップまたは挿入されたアイテムに_製材_およびストーンカッティングレシピを適用します。 複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", + "block.create.saw.tooltip.condition2": "横向きの場合", + "block.create.saw.tooltip.behaviour2": "その前で_原木を分割_します。 原木がそれ自体でツリーをサポートしていた場合、_木はのこぎりから離れて崩壊_します。", + "block.create.saw.tooltip.condition3": "動かしたとき", + "block.create.saw.tooltip.behaviour3": "のこぎりが衝突する_すべての木を切り倒します_。", + + "block.create.stockswitch.tooltip": "在庫スイッチ", + "block.create.stockswitch.tooltip.summary": "接続されたコンテナの_空き容量_に基づいてレッドストーン信号を切り替えます。", + "block.create.stockswitch.tooltip.condition1": "下限を下回ったとき", + "block.create.stockswitch.tooltip.behaviour1": "レッドストーン信号を停止", + "block.create.stockswitch.tooltip.condition2": "上限を超えたとき。", + "block.create.stockswitch.tooltip.behaviour2": "再び下限に達するまで、レッドストーン信号の提供を開始します。", + "block.create.stockswitch.tooltip.control1": "右クリックしたとき", + "block.create.stockswitch.tooltip.action1": "_設定インターフェース_を開きます", + + "block.create.redstone_bridge.tooltip": "レッドストーンリンク", + "block.create.redstone_bridge.tooltip.summary": "_ワイヤレスレッドストーン_接続のエンドポイント。 任意のアイテムを使用して_周波数_を割り当てることができます。 信号範囲は限られていますが、かなり離れています。", + "block.create.redstone_bridge.tooltip.condition1": "入力があるとき", + "block.create.redstone_bridge.tooltip.behaviour1": "同じ周波数のリンクを受信すると、レッドストーン信号が生成されます。", + "block.create.redstone_bridge.tooltip.control1": "アイテムで右クリックしたとき", + "block.create.redstone_bridge.tooltip.action1": "_周波数_をそのアイテムに設定します。 周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使用できます。", + "block.create.redstone_bridge.tooltip.control2": "スニークしながら右クリックしたとき", + "block.create.redstone_bridge.tooltip.action2": "_受信機_モードと_送信機_モードを切り替えます。", + + "block.create.contact.tooltip": "レッドストーンコンタクト", + "block.create.contact.tooltip.summary": "レッドストーンパワーのみをペアで放出します。 _メカニカルピストン_または_ベアリング_で移動可能です。", + "block.create.contact.tooltip.condition1": "他のコンタクトに直面したとき", + "block.create.contact.tooltip.behaviour1": "レッドストーン信号を提供します。", + "block.create.contact.tooltip.condition2": "動かしたとき", + "block.create.contact.tooltip.behaviour2": "通過するすべての固定接点をトリガーします。", + + "block.create.flexcrate.tooltip": "調整可能なクレート", + "block.create.flexcrate.tooltip.summary": "この_ストレージコンテナ_では、容量を手動で制御できます。 任意のアイテムの最大_16スタック_を保持できます。 _レッドストーンコンパレータ_をサポートします。", + "block.create.flexcrate.tooltip.control1": "右クリックしたとき", + "block.create.flexcrate.tooltip.action1": "_インターフェース_を開きます", + + "block.create.extractor.tooltip": "抽出器", + "block.create.extractor.tooltip.summary": "付属のインベントリから_アイテムを取り_、地面にドロップします。 スペースが空いていない限り、アイテムはドロップされません。 _フィルター_としてアイテムスタックを割り当てることができます。", + "block.create.extractor.tooltip.condition1": "レッドストーン信号があるとき", + "block.create.extractor.tooltip.behaviour1": "エクストラクタを_一時停止_します。", + "block.create.extractor.tooltip.condition2": "アクティブベルト牽引されたとき", + "block.create.extractor.tooltip.behaviour2": "エクストラクタは、_真ちゅう製のケーシング_で補強された_ベルトから_アイテムを引き出すことができます。 エクストラクタが詰まると、_ベルトが停止_します。", + "block.create.extractor.tooltip.control1": "フィルタースペースを右クリック", + "block.create.extractor.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 エクストラクターは、アイテム_タイプ_とフィルタースタックの_数_を排他的に取得します。", + + "block.create.transposer.tooltip": "トランスポーザー", + "block.create.transposer.tooltip.summary": "取り付けされたインベントリから_アイテムを取得_し、すぐにターゲット_インベントリ_に入れます。 _フィルター_としてアイテムスタックを割り当てることができます。", + "block.create.transposer.tooltip.condition1": "レッドストーン信号があるとき", + "block.create.transposer.tooltip.behaviour1": "トランスポーザを_一時停止_します。", + "block.create.transposer.tooltip.condition2": "アクティブベルト牽引されたとき", + "block.create.transposer.tooltip.behaviour2": "トランスポーザーは、_真鍮のケーシングで補強_された_ベルトからアイテム_を引っ張ることができます。 トランスポーザがバックアップされると、_ベルトが停止_します。", + "block.create.transposer.tooltip.control1": "フィルタースペースを右クリック", + "block.create.transposer.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。トランスポーザーは、フィルタースタックのアイテムタイプと_カウント_を排他的にプルします。", + + "block.create.deployer.tooltip": "デプロイヤ", + "block.create.deployer.tooltip.summary": "_パンチ_、_使用_、_有効化_。 このマシンは、_プレイヤー_をできるだけ_真似_しようとします。 隣接するインベントリの_アイテムを受け取り_、_預ける_ことができます。 _フィルター_としてアイテムスタックを割り当てることができます。", + "block.create.deployer.tooltip.condition1": "回転したとき", + "block.create.deployer.tooltip.behaviour1": "腕を伸ばし、_2m先_のブロックスペースで_発動_。", + "block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき", + "block.create.deployer.tooltip.behaviour2": "パンチモードを切り替えます。 _パンチモード_では、デプロイヤはそのアイテムを使用して_ブロックを壊したりエンティティを傷つけ_たりしようとします。", + + "block.create.linked_extractor.tooltip": "リンクエクストラクター", + "block.create.linked_extractor.tooltip.summary": "取り付けてる_インベントリ_から_アイテムを取り_、それらを地面に落とします。 スペースが空いていない限り、アイテムはドロップされません。 _フィルター_としてアイテムスタックを割り当てることができます。 _レッドストーンリンク_を介してリモートで制御できます。", + "block.create.linked_extractor.tooltip.condition1": "レッドストーンリンクがアクティブな場合", + "block.create.linked_extractor.tooltip.behaviour1": "エクストラクタを_一時停止_します。", + "block.create.linked_extractor.tooltip.control1": "フィルタースペースを右クリックしたとき", + "block.create.linked_extractor.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 エクストラクターは、_アイテムタイプ_とフィルタースタックの_数_を排他的に取得します。", + "block.create.linked_extractor.tooltip.control2": "周波数スペースを右クリックしたとき", + "block.create.linked_extractor.tooltip.action2": "リッスンされている周波数の一部として_現在保持_されているアイテムを割り当てます。 同じ周波数の送信_レッドストーンリンク_に動力が供給されると、このエクストラクターは一時停止します。", + + "block.create.linked_transposer.tooltip": "リンクされたトランスポーザー", + "block.create.linked_transposer.tooltip.summary": "取り付けてる_インベントリ_から_アイテムを取得_し、すぐにターゲット_インベントリ_に入れます。 フィルターとしてアイテムスタックを割り当てることができます。 _レッドストーンリンク_を介してリモートで制御できます。", + "block.create.linked_transposer.tooltip.condition1": "レッドストーンリンクがアクティブのとき", + "block.create.linked_transposer.tooltip.behaviour1": "トランスポーザを_一時停止_します。", + "block.create.linked_transposer.tooltip.control1": "フィルタースペースを右クリックしたとき", + "block.create.linked_transposer.tooltip.action1": "現在_保持されているスタック_を_フィルター_として割り当てます。 トランスポーザーは、アイテム_タイプ_とフィルター_スタック_の数に一致するアイテムのみをプルします。", + "block.create.linked_transposer.tooltip.control2": "周波数スペースを右クリックしたとき", + "block.create.linked_transposer.tooltip.action2": "聴いてる周波数の一部として現在_保持されているアイテム_を割り当てます。 同じ周波数の送信レッドストーンリンクに動力が供給されると、このトランスポーザーは一時停止します。", + + "block.create.belt_funnel.tooltip": "漏斗", + "block.create.belt_funnel.tooltip.summary": "_入力アイテムを収集_し、可能な場合はそれらを取り付けた_インベントリ_に挿入します。 _世界_のアイテムや_ベルト_のアイテムを集めることができます。", + "block.create.belt_funnel.tooltip.condition1": "パッシブベルト引っ張り", + "block.create.belt_funnel.tooltip.behaviour1": "漏斗は、_ベルトの上_から横または端に配置すると、ベルトからアイテムを引き出すことができます。 横向きのファンネルをバックアップすると、_ベルト上のアイテムが停止することはありません_。", + + "block.create.belt_tunnel.tooltip": "ベルトトンネル", + "block.create.belt_tunnel.tooltip.summary": "_メカニカルベルト_を壁に通すための美的なオプション。 ベルトは真鍮の_ケーシング_で_補強_する必要があります。 トンネルは_隣接_グループと同期でき、グループ内のすべてのトンネルに1つの待機がある場合にのみアイテムを通過させます。 [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "前面をレンチで右クリック", + "block.create.belt_tunnel.tooltip.action1": "_同期動作_を切り替えます。 同期されたトンネルは、ネイバーがアイテムを取得するまでアイテムを保持します。", + "block.create.belt_tunnel.tooltip.control2": "横面をレンチで右クリック", + "block.create.belt_tunnel.tooltip.action2": "トンネルにその面に窓がある場合、_窓シャッターを調整_します。", + + "block.create.brass_casing.tooltip": "真ちゅうのケーシング", + "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。 装飾用にも安全です。", + "block.create.brass_casing.tooltip.condition1": "メカニカルベルトに使用したとき", + "block.create.brass_casing.tooltip.behaviour1": "真鍮製のファンデーションでベルトを補強します。 強化ベルトは、ベルトトンネル、エクストラクタ、ファンネル、およびトランスポーザをベルトの側面および下から相互作用することをサポートできます。", + + "block.create.entity_detector.tooltip": "ベルトオブザーバー", + "block.create.entity_detector.tooltip.summary": "その前のメカニカルベルト上を通り過ぎるアイテムとエンティティを検出します。 レンチを使用して、その動作を循環させます。 非アイテムは、設定に関係なく常に検出モードで処理されます。", + "block.create.entity_detector.tooltip.condition1": "検出モード", + "block.create.entity_detector.tooltip.behaviour1": "_一致するアイテムが観測_されたベルトセグメントにある間、レッドストーンを出力します。", + "block.create.entity_detector.tooltip.condition2": "パルスモード", + "block.create.entity_detector.tooltip.behaviour2": "一致するアイテムが観測_されたベルトセグメントの中心を通過するときに_パルス_を発します。", + "block.create.entity_detector.tooltip.condition3": "イジェクトモード", + "block.create.entity_detector.tooltip.behaviour3": "_一致するアイテム_を側面から排出します。 対象のベルトやスペースが占有されている場合、アイテムは_所定の位置に保持_されます。", + "block.create.entity_detector.tooltip.condition4": "分割モード", + "block.create.entity_detector.tooltip.behaviour4": "_一致するアイテムスタック_を分割し、その_半分_を側面から_排出_します。", + + "block.create.pulse_repeater.tooltip": "パルスリピーター", + "block.create.pulse_repeater.tooltip.summary": "通過するレッドストーン信号を_1ティック_の長さにカットする簡単な回路。", + + "block.create.flexpeater.tooltip": "フレックスリピーター", + "block.create.flexpeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な高度な_レッドストーンリピーター_。", + + "block.create.flexpulsepeater.tooltip": "フレックスパルスリピーター", + "block.create.flexpulsepeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な_パルスリピーター_。", + + "block.create.analog_lever.tooltip": "アナログレバー", + "block.create.analog_lever.tooltip.summary": "_発信信号強度_をより_正確に制御_するレバー。", + + "block.create.toggle_latch.tooltip": "パワードトグルラッチ", + "block.create.toggle_latch.tooltip.summary": "レッドストーンパルスによってトグルできるレバー。", + + "block.create.redstone_latch.tooltip": "パワードラッチ", + "block.create.redstone_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。 _背面の信号_はそれを可能にし、_側面からの信号_はそれをリセットします。", + + "block.create.speed_gauge.tooltip": "スピードメーター", + "block.create.speed_gauge.tooltip.summary": "接続された動力コンポーネントの_回転速度_を測定して表示します。 _レッドストーンコンパレータ_をサポートします。", + "block.create.speed_gauge.tooltip.condition1": "回転したとき", + "block.create.speed_gauge.tooltip.behaviour1": "速度のレベルに対応する色を示します。 _緑_は低速、_青_は中程度、_紫_は高速回転を示します。 一部の機械コンポーネントは、適切に機能するために十分なレベルの速度を必要とします。", + + "block.create.stress_gauge.tooltip": "ストレスメーター", + "block.create.stress_gauge.tooltip.summary": "接続された動力ネットワークの全体的な応力を測定して表示します。 レッドストーンコンパレータをサポートします。", + "block.create.stress_gauge.tooltip.condition1": "回転したとき", + "block.create.stress_gauge.tooltip.behaviour1": "応力のレベルに対応する色を示します。 _過度に応力がかかったネットワーク_は動きを止めます。 ネットワークに_回転源_を追加することで、応力を軽減できます。", + + "tool.create.sand_paper.tooltip": "サンドペーパー", + "tool.create.sand_paper.tooltip.summary": "_素材を磨いたり_、_道具_を研ぐために使用できる粗い紙。", + "tool.create.sand_paper.tooltip.condition1": "使用したとき", + "tool.create.sand_paper.tooltip.behaviour1": "オフハンドで持っているアイテムや地面に落ちているアイテムを見ると研磨します", + + "item.create.refined_radiance.tooltip": "洗練された放射", + "item.create.refined_radiance.tooltip.summary": "_吸収された光_から鍛造されたクロマチックマテリアル。", + + "item.create.shadow_steel.tooltip": "シャドウスチール", + "item.create.shadow_steel.tooltip.summary": "_虚無_から鍛造されたクロマティックマテリアル。", + + "item.create.slot_cover.tooltip": "スロットカバー", + "item.create.slot_cover.tooltip.summary": "_メカニカルクラフター_でレシピの空のスロットとしてマークするために使用されます。 クラフターは必ずしも完全な正方格子を形成する必要はありません。 これは、_成分が互いに対角線_であるレシピがある場合に役立ちます。", + + "tool.create.shadow_steel.tooltip": "シャドウスチールツール", + "tool.create.shadow_steel.tooltip.summary": "特定のブロックまたはエンティティからの_ドロップを破壊_する高速で強力なツール。 殺されたモブは、このツールの_ドロップ増加_モディファイアーに基づいて_より多くの経験値_を落とします。", + + "tool.create.blazing.tooltip": "ブレージングツール", + "tool.create.blazing.tooltip.summary": "このツールは_破壊したブロックを溶かし_、_攻撃されたモブを炎上_させます。 _ネザー_で使用すると耐久地は減りません。", + + "tool.create.rose_quartz.tooltip": "ローズクォーツツール", + "tool.create.rose_quartz.tooltip.summary": "このツールは、_ブロックを壊したり_、オフハンドから_ブロックを設置_したりするとより_大きなリーチ_になります。", + + "itemGroup.create": "Create" +} 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 05/10] 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); } From d1ff9f4e30f4055393ed49724625a30645e9c718 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 8 Apr 2020 20:31:06 +0200 Subject: [PATCH 06/10] Broken UVs - Fixed UV shifts not working consistently with high-res resource packs - Fixed window panes not connecting their textures with windowlogged blocks - Fixed buttons and pressure plates not resetting after being moved - Fixed missing tooltips on custom swords - Redstone links now move when the block they are attached to is moved --- .../foundation/block/connected/CTModel.java | 12 ++---- .../block/connected/CTSpriteShiftEntry.java | 14 +++--- .../create/foundation/item/TooltipHelper.java | 12 +++--- .../foundation/utility/SuperByteBuffer.java | 43 +++++++++++++------ .../contraptions/BlockMovementTraits.java | 5 +++ .../components/contraptions/Contraption.java | 10 +++++ .../MechanicalCrafterTileEntityRenderer.java | 5 +-- .../relays/belt/BeltTileEntityRenderer.java | 5 +-- .../partialWindows/WindowInABlockModel.java | 14 ++++-- .../inventories/FlexcrateTileEntity.java | 7 ++- .../modules/palettes/CTGlassPaneBlock.java | 13 +++++- 11 files changed, 96 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 426212ac4..075303e0a 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour. import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.PaneBlock; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.vertex.VertexFormat; @@ -55,7 +56,7 @@ public class CTModel extends BakedModelWrapper { CTData data = new CTData(); for (Direction face : Direction.values()) { - if (!Block.shouldSideBeRendered(state, world, pos, face)) + if (!Block.shouldSideBeRendered(state, world, pos, face) && !(state.getBlock() instanceof PaneBlock)) continue; CTSpriteShiftEntry spriteShift = behaviour.get(state, face); if (spriteShift == null) @@ -85,9 +86,6 @@ public class CTModel extends BakedModelWrapper { if (index == -1) continue; - float uShift = spriteShift.getUShift(index); - float vShift = spriteShift.getVShift(index); - BakedQuad newQuad = new BakedQuad(Arrays.copyOf(quad.getVertexData(), quad.getVertexData().length), quad.getTintIndex(), quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting(), quad.getFormat()); @@ -100,10 +98,8 @@ public class CTModel extends BakedModelWrapper { int vIndex = vertex + uvOffset + 1; float u = Float.intBitsToFloat(vertexData[uIndex]); float v = Float.intBitsToFloat(vertexData[vIndex]); - u += uShift; - v += vShift; - vertexData[uIndex] = Float.floatToIntBits(u); - vertexData[vIndex] = Float.floatToIntBits(v); + vertexData[uIndex] = Float.floatToRawIntBits(spriteShift.getTargetU(u, index)); + vertexData[vIndex] = Float.floatToRawIntBits(spriteShift.getTargetV(v, index)); } quads.set(i, newQuad); } diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java index b9a564137..7401bb472 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java @@ -11,14 +11,16 @@ public abstract class CTSpriteShiftEntry extends SpriteShiftEntry { this.textureSheetSize = sheetSize; } - public float getUShift(int index) { - return getTarget().getInterpolatedU((index % textureSheetSize) * (16 / textureSheetSize)) - - getOriginal().getMinU(); + public float getTargetU(float localU, int index) { + float uOffset = (index % textureSheetSize); + return getTarget().getInterpolatedU( + (getOriginal().getUnInterpolatedU(localU) + (uOffset * 16)) / ((float) textureSheetSize)); } - public float getVShift(int index) { - return getTarget().getInterpolatedV((index / textureSheetSize) * (16 / textureSheetSize)) - - getOriginal().getMinV(); + public float getTargetV(float localV, int index) { + float vOffset = (index / textureSheetSize); + return getTarget().getInterpolatedV( + (getOriginal().getUnInterpolatedV(localV) + (vOffset * 16)) / ((float) textureSheetSize)); } public abstract int getTextureIndex(CTContext context); 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 e4347f52a..d7afff84c 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -22,7 +22,9 @@ import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.resources.I18n; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.TieredItem; import net.minecraft.util.text.TextFormatting; public class TooltipHelper { @@ -169,11 +171,11 @@ public class TooltipHelper { } public static String getTooltipTranslationKey(ItemStack stack) { - - if (stack.getItem() instanceof AbstractToolItem) { - AbstractToolItem abstractToolItem = (AbstractToolItem) stack.getItem(); - if (abstractToolItem.getTier() instanceof AllToolTiers) { - AllToolTiers allToolTiers = (AllToolTiers) abstractToolItem.getTier(); + Item item = stack.getItem(); + if (item instanceof TieredItem) { + TieredItem tieredItem = (TieredItem) stack.getItem(); + if (tieredItem.getTier() instanceof AllToolTiers) { + AllToolTiers allToolTiers = (AllToolTiers) tieredItem.getTier(); return "tool.create." + Lang.asId(allToolTiers.name()) + ".tooltip"; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java index e74dc2c64..f5d3a9dd4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java @@ -4,9 +4,10 @@ import java.nio.ByteBuffer; import javax.vecmath.Matrix4f; +import com.simibubi.create.foundation.block.render.SpriteShiftEntry; + import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.Direction.Axis; @@ -26,7 +27,9 @@ public class SuperByteBuffer { // Vertex Texture Coords private boolean shouldShiftUV; - private float uShift, vShift; + private boolean resetUV; + private SpriteShiftEntry spriteShift; + private float uTarget, vTarget; // Vertex Lighting private boolean shouldLight; @@ -37,6 +40,7 @@ public class SuperByteBuffer { // Vertex Coloring private boolean shouldColor; private int r, g, b, a; + private float sheetSize; public SuperByteBuffer(ByteBuffer original) { original.rewind(); @@ -80,8 +84,18 @@ public class SuperByteBuffer { putColor(mutable, vertex, (byte) r2, (byte) g2, (byte) b2, (byte) a); } - if (shouldShiftUV) - putUV(mutable, vertex, getU(original, vertex) + uShift, getV(original, vertex) + vShift); + if (shouldShiftUV) { + float u = getU(original, vertex); + float v = getV(original, vertex); + float targetU = spriteShift.getTarget() + .getInterpolatedU((spriteShift.getOriginal().getUnInterpolatedU(u) / sheetSize) + uTarget * 16); + float targetV = spriteShift.getTarget() + .getInterpolatedV((spriteShift.getOriginal().getUnInterpolatedV(v) / sheetSize) + vTarget * 16); + putUV(mutable, vertex, targetU, targetV); + } + + if (resetUV) + putUV(mutable, vertex, getU(original, vertex), getV(original, vertex)); if (shouldLight) { if (vertexLighter != null) @@ -134,24 +148,29 @@ public class SuperByteBuffer { return translate(-.5f, -.5f, -.5f).rotate(axis, angle).translate(.5f, .5f, .5f); } - public SuperByteBuffer shiftUV(TextureAtlasSprite from, TextureAtlasSprite to) { + public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { shouldShiftUV = true; - uShift = to.getMinU() - from.getMinU(); - vShift = to.getMinV() - from.getMinV(); + resetUV = false; + spriteShift = entry; + uTarget = 0; + vTarget = 0; + sheetSize = 1; return this; } - public SuperByteBuffer shiftUVtoSheet(TextureAtlasSprite from, TextureAtlasSprite to, int sheetX, int sheetY) { + public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { shouldShiftUV = true; - uShift = to.getInterpolatedU(sheetX * 16f / to.getWidth()) - from.getMinU(); - vShift = to.getInterpolatedV(sheetY * 16f / to.getHeight()) - from.getMinV(); + resetUV = false; + spriteShift = entry; + this.uTarget = uTarget; + this.vTarget = vTarget; + this.sheetSize = sheetSize; return this; } public SuperByteBuffer dontShiftUV() { shouldShiftUV = false; - uShift = 0; - vShift = 0; + resetUV = true; return this; } 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 66812cd98..39e8a6b0e 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 @@ -5,6 +5,7 @@ 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.AttachedLogisticalBlock; +import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock; 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; @@ -94,6 +95,8 @@ public class BlockMovementTraits { return true; if (block instanceof RedstoneWireBlock) return true; + if (block instanceof RedstoneLinkBlock) + return true; return false; } @@ -112,6 +115,8 @@ public class BlockMovementTraits { return direction == Direction.DOWN; if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock)) return direction == AttachedLogisticalBlock.getBlockFacing(state); + if (block instanceof RedstoneLinkBlock) + return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING); if (block instanceof FlowerPotBlock) return direction == Direction.DOWN; if (block instanceof RedstoneDiodeBlock) diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java index 84dd90e5f..d02b8aab7 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java @@ -31,11 +31,13 @@ import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.logistics.block.inventories.FlexcrateBlock; +import net.minecraft.block.AbstractButtonBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.ChestBlock; import net.minecraft.block.DoorBlock; +import net.minecraft.block.PressurePlateBlock; import net.minecraft.block.SlimeBlock; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; @@ -216,6 +218,14 @@ public abstract class Contraption { blockstate = blockstate.with(FlexcrateBlock.DOUBLE, false); if (AllBlocks.CONTACT.typeOf(blockstate)) blockstate = blockstate.with(ContactBlock.POWERED, true); + if (blockstate.getBlock() instanceof AbstractButtonBlock) { + blockstate = blockstate.with(AbstractButtonBlock.POWERED, false); + world.getPendingBlockTicks().scheduleTick(pos, blockstate.getBlock(), -1); + } + if (blockstate.getBlock() instanceof PressurePlateBlock) { + blockstate = blockstate.with(PressurePlateBlock.POWERED, false); + world.getPendingBlockTicks().scheduleTick(pos, blockstate.getBlock(), -1); + } CompoundNBT compoundnbt = getTileEntityNBT(world, pos); TileEntity tileentity = world.getTileEntity(pos); return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java index 079d571cb..833413322 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java @@ -162,10 +162,9 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer< if (te.phase == Phase.EXPORTING) { int textureIndex = (int) ((te.getCountDownSpeed() / 128f * AnimationTickHolder.ticks)); - beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(), - (textureIndex % 4) * 4, 0); + beltBuffer.shiftUVtoSheet(animatedTexture, (textureIndex % 4) / 4f, 0, 1); } else { - beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(), 0, 0); + beltBuffer.dontShiftUV(); } beltBuffer.translate(x, y, z).renderInto(buffer); 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 822d55cca..9f7a7d5ea 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 @@ -74,10 +74,9 @@ public class BeltTileEntityRenderer extends SafeTileEntityRenderer { Direction face = q.getFace(); - if (face != null && windowState.isSideInvisible(world.getBlockState(position), face)) + if (face != null + && world.getBlockState(position.offset(face)).isSideInvisible(windowState, face)) return false; if (face != null && Block.hasSolidSide(partialState, world, position, face)) return false; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java index 7b5fd303a..2b9dea2cf 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java @@ -193,8 +193,11 @@ public class FlexcrateTileEntity extends SyncedTileEntity implements INamedConta @Override public LazyOptional getCapability(Capability capability, Direction facing) { - if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) - return getMainCrate().invHandler.cast(); + if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + FlexcrateTileEntity mainCrate = getMainCrate(); + if (mainCrate != null && mainCrate.invHandler.isPresent()) + return mainCrate.invHandler.cast(); + } return super.getCapability(capability, facing); } diff --git a/src/main/java/com/simibubi/create/modules/palettes/CTGlassPaneBlock.java b/src/main/java/com/simibubi/create/modules/palettes/CTGlassPaneBlock.java index 91e01c4b2..79be37c75 100644 --- a/src/main/java/com/simibubi/create/modules/palettes/CTGlassPaneBlock.java +++ b/src/main/java/com/simibubi/create/modules/palettes/CTGlassPaneBlock.java @@ -4,10 +4,12 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.IHaveConnectedTextures; import com.simibubi.create.foundation.block.connected.StandardCTBehaviour; +import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; @@ -34,8 +36,6 @@ public class CTGlassPaneBlock extends GlassPaneBlock implements IHaveConnectedTe return adjacentBlockState == state; return super.isSideInvisible(state, adjacentBlockState, side); } - - protected ConnectedTextureBehaviour createBehaviour() { for (CTSpriteShiftEntry ctSpriteShiftEntry : ctGlass.getBehaviour().getAllCTShifts()) { @@ -43,6 +43,15 @@ public class CTGlassPaneBlock extends GlassPaneBlock implements IHaveConnectedTe @Override public boolean connectsTo(BlockState state, BlockState other, IEnviromentBlockReader reader, BlockPos pos, BlockPos otherPos, Direction face) { + + TileEntity te = reader.getTileEntity(pos); + if (te instanceof WindowInABlockTileEntity) + state = ((WindowInABlockTileEntity) te).getWindowBlock(); + + TileEntity otherTE = reader.getTileEntity(otherPos); + if (otherTE instanceof WindowInABlockTileEntity) + other = ((WindowInABlockTileEntity) otherTE).getWindowBlock(); + return state.getBlock() == other.getBlock(); } From e2742f6fb20577bc1a4cc8536704c1d6ae50abec Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 8 Apr 2020 20:33:49 +0200 Subject: [PATCH 07/10] Not enough Zinc - Reverted the misplaced nerf on worldgen, applied due to a previous bug in feature placement - Critical worldgen changes now override everyones' configs --- .../com/simibubi/create/config/CWorldGen.java | 2 +- .../foundation/world/AllWorldFeatures.java | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/config/CWorldGen.java b/src/main/java/com/simibubi/create/config/CWorldGen.java index b945ba94c..b0abf610f 100644 --- a/src/main/java/com/simibubi/create/config/CWorldGen.java +++ b/src/main/java/com/simibubi/create/config/CWorldGen.java @@ -28,7 +28,7 @@ public class CWorldGen extends ConfigBase { @Override public String getName() { - return "world"; + return "worldgen.v" + AllWorldFeatures.forcedUpdateVersion; } private static class Comments { diff --git a/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java b/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java index 2f835e129..3a5ed2a5f 100644 --- a/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java +++ b/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java @@ -1,5 +1,8 @@ package com.simibubi.create.foundation.world; +import static net.minecraft.world.biome.Biome.Category.DESERT; +import static net.minecraft.world.biome.Biome.Category.OCEAN; + import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -15,13 +18,11 @@ import net.minecraftforge.registries.ForgeRegistries; public enum AllWorldFeatures { - COPPER_ORE(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 21, 1).between(40, 96)), - COPPER_ORE_OCEAN( - new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 15, 4).between(20, 55).inBiomes(Biome.Category.OCEAN)), + COPPER_ORE(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 18, 2).between(40, 86)), + COPPER_ORE_OCEAN(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 15, 4).between(20, 55).inBiomes(OCEAN)), - ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 8, 1).between(55, 80)), - ZINC_ORE_DESERT( - new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 10, 5).between(50, 85).inBiomes(Biome.Category.DESERT)), + ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 14, 4).between(15, 70)), + ZINC_ORE_DESERT(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 17, 5).between(10, 85).inBiomes(DESERT)), LIMESTONE(new ChanceOreFeature(AllBlocks.LIMESTONE.get(), 128, 1 / 32f).between(30, 70)), WEATHERED_LIMESTONE(new ChanceOreFeature(AllBlocks.WEATHERED_LIMESTONE.get(), 128, 1 / 32f).between(10, 30)), @@ -31,6 +32,12 @@ public enum AllWorldFeatures { ; + /** + * Increment this number if all worldgen entries should be overwritten in this update. + * Worlds from the previous version will overwrite potentially changed values with the new defaults. + */ + public static final int forcedUpdateVersion = 1; + public IFeature feature; private Map> featureInstances; From 72ddc1251ac9d04f8e3a3d1888526fddc1f00536 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:29:51 +0200 Subject: [PATCH 08/10] Pushing the Pusher - Ore features no longer spawn in the "void" or "hell" biome - Fixed Minecart contraptions killing their own mount using saws/drills - Pistons, Bearings and Pulleys can now be moved unless they are moving something themselves - Fixed cart assemblers blocking in the powered rail kickstart logic - Piston poles can now be moved - Crushing wheels no longer spawn missing texture particles when sprinting on the central block - Deployers' hand items can now be directly inserted/extracted using hoppers, extractors, funnels, etc - Fixed Deployers not dropping held items when destroyed - Millstones now empty their input inventory when clicked on while their output buffer is empty - Millstones no longer accept items they cannot process - Fixed hoppers not being able to pull items from belts in certain cases - Fixed adjustable crates corrupting chunks --- .../foundation/block/SyncedTileEntity.java | 2 +- .../foundation/world/AllWorldFeatures.java | 16 ++- .../BlockBreakingMovementBehaviour.java | 11 ++ .../contraptions/BlockMovementTraits.java | 41 +++++-- .../components/contraptions/Contraption.java | 53 ++++++++- .../bearing/ClockworkBearingTileEntity.java | 4 + .../bearing/MechanicalBearingTileEntity.java | 4 + .../mounted/CartAssemblerBlock.java | 5 + .../piston/MechanicalPistonHeadBlock.java | 6 + .../contraptions/piston/PistonPoleBlock.java | 6 + .../contraptions/pulley/PulleyTileEntity.java | 7 +- .../crusher/CrushingWheelControllerBlock.java | 5 + .../deployer/DeployerItemHandler.java | 104 ++++++++++++++++++ .../deployer/DeployerTileEntity.java | 27 ++++- .../components/millstone/MillstoneBlock.java | 15 ++- .../millstone/MillstoneTileEntity.java | 14 ++- .../relays/belt/transport/BeltInventory.java | 2 +- .../block/RedstoneLinkTileEntity.java | 13 ++- .../inventories/FlexcrateTileEntity.java | 8 +- 19 files changed, 312 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerItemHandler.java diff --git a/src/main/java/com/simibubi/create/foundation/block/SyncedTileEntity.java b/src/main/java/com/simibubi/create/foundation/block/SyncedTileEntity.java index 9f9eb3b8e..91b75489d 100644 --- a/src/main/java/com/simibubi/create/foundation/block/SyncedTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/block/SyncedTileEntity.java @@ -34,7 +34,7 @@ public abstract class SyncedTileEntity extends TileEntity { public void causeBlockUpdate() { world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 1); } - + @Override public SUpdateTileEntityPacket getUpdatePacket() { return new SUpdateTileEntityPacket(getPos(), 1, writeToClient(new CompoundNBT())); diff --git a/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java b/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java index 3a5ed2a5f..3505b3272 100644 --- a/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java +++ b/src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java @@ -12,6 +12,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.Biomes; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.registries.ForgeRegistries; @@ -33,11 +34,12 @@ public enum AllWorldFeatures { ; /** - * Increment this number if all worldgen entries should be overwritten in this update. - * Worlds from the previous version will overwrite potentially changed values with the new defaults. + * Increment this number if all worldgen entries should be overwritten in this + * update. Worlds from the previous version will overwrite potentially changed + * values with the new defaults. */ public static final int forcedUpdateVersion = 1; - + public IFeature feature; private Map> featureInstances; @@ -51,9 +53,13 @@ public enum AllWorldFeatures { for (AllWorldFeatures entry : AllWorldFeatures.values()) { for (Biome biome : ForgeRegistries.BIOMES) { + if (biome == Biomes.THE_VOID) + continue; + if (biome == Biomes.NETHER) + continue; + if (entry.featureInstances.containsKey(biome)) biome.getFeatures(entry.feature.getGenerationStage()).remove(entry.featureInstances.remove(biome)); - Optional> createFeature = entry.feature.createFeature(biome); if (!createFeature.isPresent()) continue; @@ -62,7 +68,7 @@ public enum AllWorldFeatures { biome.addFeature(entry.feature.getGenerationStage(), createFeature.get()); } } - + // // Debug contained ore features // for (Biome biome : ForgeRegistries.BIOMES) { // Debug.markTemporary(); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/BlockBreakingMovementBehaviour.java b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/BlockBreakingMovementBehaviour.java index 55702ab9e..c7c2ef8af 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/BlockBreakingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/BlockBreakingMovementBehaviour.java @@ -1,12 +1,14 @@ package com.simibubi.create.modules.contraptions.components.actors; import com.simibubi.create.foundation.utility.BlockHelper; +import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.components.contraptions.MovementContext; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.DamageSource; @@ -37,8 +39,17 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { if (damageSource == null) return; for (Entity entity : world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos))) { + if (entity instanceof ItemEntity) return; + if (entity instanceof ContraptionEntity) + return; + if (entity instanceof AbstractMinecartEntity) + for (Entity passenger : entity.getRecursivePassengers()) + if (passenger instanceof ContraptionEntity + && ((ContraptionEntity) passenger).getContraption() == context.contraption) + return; + float damage = (float) MathHelper.clamp(Math.abs(context.relativeMotion.length() * 10) + 1, 5, 20); entity.attackEntityFrom(damageSource, damage); entity.setMotion(entity.getMotion().add(context.relativeMotion.scale(3))); 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 39e8a6b0e..844833d8c 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 @@ -3,7 +3,15 @@ package com.simibubi.create.modules.contraptions.components.contraptions; 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.bearing.ClockworkBearingBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.bearing.ClockworkBearingTileEntity; +import com.simibubi.create.modules.contraptions.components.contraptions.bearing.MechanicalBearingBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.bearing.MechanicalBearingTileEntity; import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock.PistonState; +import com.simibubi.create.modules.contraptions.components.contraptions.pulley.PulleyBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.pulley.PulleyTileEntity; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; @@ -28,6 +36,7 @@ import net.minecraft.block.WallTorchBlock; import net.minecraft.block.material.PushReaction; import net.minecraft.state.properties.AttachFace; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -56,6 +65,26 @@ public class BlockMovementTraits { return false; if (block == Blocks.OBSIDIAN) return false; + + // Move controllers only when they aren't moving + if (block instanceof MechanicalPistonBlock && blockState.get(MechanicalPistonBlock.STATE) != PistonState.MOVING) + return true; + if (block instanceof MechanicalBearingBlock) { + TileEntity te = world.getTileEntity(pos); + if (te instanceof MechanicalBearingTileEntity) + return !((MechanicalBearingTileEntity) te).isRunning(); + } + if (block instanceof ClockworkBearingBlock) { + TileEntity te = world.getTileEntity(pos); + if (te instanceof ClockworkBearingTileEntity) + return !((ClockworkBearingTileEntity) te).isRunning(); + } + if (block instanceof PulleyBlock) { + TileEntity te = world.getTileEntity(pos); + if (te instanceof PulleyTileEntity) + return !((PulleyTileEntity) te).running && ((PulleyTileEntity) te).offset == 0; + } + if (AllBlocks.BELT.typeOf(blockState)) return true; if (block instanceof ExtractorBlock) @@ -113,7 +142,7 @@ public class BlockMovementTraits { return direction == Direction.DOWN; if (block instanceof DoorBlock) return direction == Direction.DOWN; - if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock)) + if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock)) return direction == AttachedLogisticalBlock.getBlockFacing(state); if (block instanceof RedstoneLinkBlock) return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING); @@ -161,14 +190,4 @@ public class BlockMovementTraits { return isBrittle(state); } - public static boolean movementIgnored(BlockState state) { - if (AllBlocks.MECHANICAL_PISTON.typeOf(state)) - return true; - if (AllBlocks.STICKY_MECHANICAL_PISTON.typeOf(state)) - return true; - if (AllBlocks.MECHANICAL_PISTON_HEAD.typeOf(state)) - return true; - return false; - } - } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java index d02b8aab7..c4c0a9033 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/Contraption.java @@ -25,6 +25,10 @@ import com.simibubi.create.foundation.utility.WrappedWorld; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock; import com.simibubi.create.modules.contraptions.components.contraptions.chassis.ChassisTileEntity; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.PistonPoleBlock; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock.PistonState; +import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonHeadBlock; import com.simibubi.create.modules.contraptions.components.saw.SawBlock; import com.simibubi.create.modules.contraptions.redstone.ContactBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; @@ -160,6 +164,49 @@ public abstract class Contraption { if (prevPos != null && !visited.contains(prevPos)) frontier.add(prevPos); } + + if (state.getBlock() instanceof MechanicalPistonBlock) { + int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get(); + Direction direction = state.get(MechanicalPistonBlock.FACING); + if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) { + BlockPos searchPos = pos; + while (limit-- >= 0) { + searchPos = searchPos.offset(direction); + BlockState blockState = world.getBlockState(searchPos); + if (AllBlocks.PISTON_POLE.typeOf(blockState)) { + if (blockState.get(PistonPoleBlock.FACING).getAxis() != direction.getAxis()) + break; + if (!visited.contains(searchPos)) + frontier.add(searchPos); + continue; + } + if (blockState.getBlock() instanceof MechanicalPistonHeadBlock) + if (!visited.contains(searchPos)) + frontier.add(searchPos); + break; + } + if (limit <= -1) + return false; + } + + BlockPos searchPos = pos; + while (limit-- >= 0) { + searchPos = searchPos.offset(direction.getOpposite()); + BlockState blockState = world.getBlockState(searchPos); + if (AllBlocks.PISTON_POLE.typeOf(blockState)) { + if (blockState.get(PistonPoleBlock.FACING).getAxis() != direction.getAxis()) + break; + if (!visited.contains(searchPos)) + frontier.add(searchPos); + continue; + } + break; + } + + if (limit <= -1) + return false; + } + if (state.getBlock() instanceof DoorBlock) { BlockPos otherPartPos = pos.up(state.get(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? 1 : -1); if (!visited.contains(otherPartPos)) @@ -170,7 +217,7 @@ public abstract class Contraption { for (Direction offset : Direction.values()) { BlockPos offsetPos = pos.offset(offset); BlockState blockState = world.getBlockState(offsetPos); - if (BlockMovementTraits.movementIgnored(blockState)) + if (isAnchoringBlockAt(offsetPos)) continue; if (!BlockMovementTraits.movementAllowed(world, offsetPos)) { if (offset == forcedDirection && isSlimeBlock) @@ -188,6 +235,10 @@ public abstract class Contraption { return true; } + protected boolean isAnchoringBlockAt(BlockPos pos) { + return pos.equals(anchor); + } + protected static boolean isChassis(BlockState state) { return state.getBlock() instanceof AbstractChassisBlock; } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingTileEntity.java index a6c53e481..b8d4fd577 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/ClockworkBearingTileEntity.java @@ -299,4 +299,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe return this.minuteHand == contraption; } + public boolean isRunning() { + return running; + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java index 06491ad09..9e2b96ef6 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java @@ -298,5 +298,9 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp public boolean isAttachedTo(ContraptionEntity contraption) { return movedContraption == contraption; } + + public boolean isRunning() { + return running; + } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/mounted/CartAssemblerBlock.java index f16be373f..d33f49619 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/mounted/CartAssemblerBlock.java @@ -129,6 +129,11 @@ public class CartAssemblerBlock extends AbstractRailBlock { public PushReaction getPushReaction(BlockState state) { return PushReaction.BLOCK; } + + @Override + public boolean isNormalCube(BlockState state, IBlockReader worldIn, BlockPos pos) { + return false; + } public static class MinecartAnchorBlock extends RenderUtilityBlock { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonHeadBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonHeadBlock.java index 7a7367232..fdeb87f99 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonHeadBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonHeadBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.modules.contraptions.components.contraptions.piston.M 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.ItemStack; import net.minecraft.state.EnumProperty; @@ -37,6 +38,11 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements super.fillStateContainer(builder); } + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } + @Override public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/PistonPoleBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/PistonPoleBlock.java index e0fe41c39..efa1100db 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/PistonPoleBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/PistonPoleBlock.java @@ -7,6 +7,7 @@ import com.simibubi.create.modules.contraptions.components.contraptions.piston.M 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.state.properties.BlockStateProperties; @@ -25,6 +26,11 @@ public class PistonPoleBlock extends ProperDirectionalBlock { super(Properties.from(Blocks.PISTON_HEAD)); setDefaultState(getDefaultState().with(FACING, Direction.UP)); } + + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } @Override public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyTileEntity.java index 327ad7c76..d65f0a5f3 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/pulley/PulleyTileEntity.java @@ -30,6 +30,11 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { return super.getRenderBoundingBox().expand(0, -offset, 0); } + @Override + public double getMaxRenderDistanceSquared() { + return super.getMaxRenderDistanceSquared() + offset * offset; + } + @Override protected void assemble() { if (speed == 0) @@ -151,7 +156,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { @Override protected int getExtensionRange() { - return Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1); + return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1)); } @Override 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 d53d0d35c..9fec22fd9 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 @@ -53,6 +53,11 @@ public class CrushingWheelControllerBlock extends Block return false; } + @Override + public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) { + return true; + } + @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new CrushingWheelControllerTileEntity(); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerItemHandler.java b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerItemHandler.java new file mode 100644 index 000000000..b598ff183 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerItemHandler.java @@ -0,0 +1,104 @@ +package com.simibubi.create.modules.contraptions.components.deployer; + +import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; +import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +public class DeployerItemHandler implements IItemHandlerModifiable { + + private DeployerTileEntity te; + private DeployerFakePlayer player; + + public DeployerItemHandler(DeployerTileEntity te) { + this.te = te; + this.player = te.player; + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return getHeld(); + } + + public ItemStack getHeld() { + if (player == null) + return ItemStack.EMPTY; + return player.getHeldItemMainhand(); + } + + public void set(ItemStack stack) { + if (player == null) + return; + if (te.getWorld().isRemote) + return; + player.setHeldItem(Hand.MAIN_HAND, stack); + te.markDirty(); + te.sendData(); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + ItemStack held = getHeld(); + if (!isItemValid(slot, stack)) + return stack; + if (held.isEmpty()) { + if (!simulate) + set(stack); + return ItemStack.EMPTY; + } + if (!ItemHandlerHelper.canItemStacksStack(held, stack)) + return stack; + + int space = held.getMaxStackSize() - held.getCount(); + ItemStack split = stack.copy().split(space); + + if (space == 0) + return stack; + if (!simulate) { + held = held.copy(); + held.setCount(held.getCount() + split.getCount()); + set(held); + } + + return split; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack held = getHeld(); + if (amount == 0 || held.isEmpty()) + return ItemStack.EMPTY; + if (simulate) + return held.copy().split(amount); + + ItemStack toReturn = held.split(amount); + te.markDirty(); + te.sendData(); + return toReturn; + } + + @Override + public int getSlotLimit(int slot) { + return Math.min(getHeld().getMaxStackSize(), 64); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE); + return filteringBehaviour == null || filteringBehaviour.test(stack); + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + set(stack); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerTileEntity.java index 66170283d..0087f8eda 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/deployer/DeployerTileEntity.java @@ -41,8 +41,12 @@ import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; public class DeployerTileEntity extends KineticTileEntity { @@ -61,6 +65,7 @@ public class DeployerTileEntity extends KineticTileEntity { protected boolean boop = false; protected List overflowItems = new ArrayList<>(); private ListNBT deferredInventoryList; + private LazyOptional invHandler; enum State { WAITING, EXPANDING, RETRACTING, DUMPING; @@ -98,7 +103,10 @@ public class DeployerTileEntity extends KineticTileEntity { heldItem = player.getHeldItemMainhand(); sendData(); } + Vec3d initialPos = VecHelper.getCenterOf(pos.offset(getBlockState().get(FACING))); + player.setPosition(initialPos.x, initialPos.y, initialPos.z); } + invHandler = LazyOptional.of(this::createHandler); } protected void onExtract(ItemStack stack) { @@ -372,6 +380,10 @@ public class DeployerTileEntity extends KineticTileEntity { super.readClientUpdate(tag); } + private IItemHandlerModifiable createHandler() { + return new DeployerItemHandler(this); + } + @Override public boolean hasFastRenderer() { return false; @@ -387,15 +399,24 @@ public class DeployerTileEntity extends KineticTileEntity { return super.getRenderBoundingBox().grow(3); } + @Override + public void remove() { + super.remove(); + invHandler.invalidate(); + } + public void changeMode() { - eject(); mode = mode == Mode.PUNCH ? Mode.USE : Mode.PUNCH; markDirty(); sendData(); } - protected void eject() { - + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && invHandler != null) { + return invHandler.cast(); + } + return super.getCapability(cap, side); } } 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 570cd9f9c..c23a3c1fe 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 @@ -64,11 +64,24 @@ public class MillstoneBlock extends KineticBlock implements ITE { + boolean emptyOutput = true; IItemHandlerModifiable inv = millstone.outputInv; for (int slot = 0; slot < inv.getSlots(); slot++) { - player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); + ItemStack stackInSlot = inv.getStackInSlot(slot); + if (!stackInSlot.isEmpty()) + emptyOutput = false; + player.inventory.placeItemBackInInventory(worldIn, stackInSlot); inv.setStackInSlot(slot, ItemStack.EMPTY); } + + if (emptyOutput) { + inv = millstone.inputInv; + for (int slot = 0; slot < inv.getSlots(); slot++) { + player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); + inv.setStackInSlot(slot, ItemStack.EMPTY); + } + } + millstone.markDirty(); millstone.sendData(); }); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneTileEntity.java index 247272b33..ac11ac58d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneTileEntity.java @@ -142,6 +142,16 @@ public class MillstoneTileEntity extends KineticTileEntity { return super.getCapability(cap, side); } + private boolean canProcess(ItemStack stack) { + ItemStackHandler tester = new ItemStackHandler(1); + tester.setStackInSlot(0, stack); + RecipeWrapper inventoryIn = new RecipeWrapper(tester); + + if (lastRecipe != null && lastRecipe.matches(inventoryIn, world)) + return true; + return world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world).isPresent(); + } + private class MillstoneInventoryHandler extends CombinedInvWrapper { public MillstoneInventoryHandler() { @@ -152,13 +162,15 @@ public class MillstoneTileEntity extends KineticTileEntity { public boolean isItemValid(int slot, ItemStack stack) { if (outputInv == getHandlerFromIndex(getIndexForSlot(slot))) return false; - return super.isItemValid(slot, stack); + return canProcess(stack) && super.isItemValid(slot, stack); } @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { if (outputInv == getHandlerFromIndex(getIndexForSlot(slot))) return stack; + if (!isItemValid(slot, stack)) + return stack; return super.insertItem(slot, stack, simulate); } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java index 2bc42fc9f..a130346cf 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java @@ -379,7 +379,7 @@ public class BeltInventory { float max = offset + .5f + (SEGMENT_WINDOW / 2); for (TransportedItemStack stack : getItems()) { if (stack.beltPosition > max) - break; + continue; if (stack.beltPosition > min) return stack; } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkTileEntity.java index a55bc7fcb..5a8ae8120 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkTileEntity.java @@ -6,14 +6,15 @@ import java.util.List; import org.apache.commons.lang3.tuple.Pair; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.linked.LinkBehaviour; +import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -97,9 +98,13 @@ public class RedstoneLinkTileEntity extends SmartTileEntity { return; if (world.isRemote) return; - if (receivedSignal != getBlockState().get(POWERED)) { - world.setBlockState(pos, getBlockState().cycle(POWERED)); - Direction attachedFace = getBlockState().get(BlockStateProperties.FACING).getOpposite(); + BlockState blockState = getBlockState(); + if (!AllBlocks.REDSTONE_BRIDGE.typeOf(blockState)) + return; + + if (receivedSignal != blockState.get(POWERED)) { + world.setBlockState(pos, blockState.cycle(POWERED)); + Direction attachedFace = blockState.get(RedstoneLinkBlock.FACING).getOpposite(); BlockPos attachedPos = pos.offset(attachedFace); world.notifyNeighbors(attachedPos, world.getBlockState(attachedPos).getBlock()); return; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java index 2b9dea2cf..7a80adbd0 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java @@ -86,11 +86,15 @@ public class FlexcrateTileEntity extends SyncedTileEntity implements INamedConta } public FlexcrateTileEntity getMainCrate() { - if (isDoubleCrate() && getFacing().getAxisDirection() == AxisDirection.NEGATIVE) + if (isSecondaryCrate()) return getOtherCrate(); return this; } + public boolean isSecondaryCrate() { + return isDoubleCrate() && getFacing().getAxisDirection() == AxisDirection.NEGATIVE; + } + public FlexcrateTileEntity getOtherCrate() { if (!AllBlocks.FLEXCRATE.typeOf(getBlockState())) return null; @@ -158,7 +162,7 @@ public class FlexcrateTileEntity extends SyncedTileEntity implements INamedConta @Override public CompoundNBT write(CompoundNBT compound) { - if (getMainCrate() == this) { + if (!isSecondaryCrate()) { compound.putBoolean("Main", true); compound.putInt("AllowedAmount", allowedAmount); compound.put("Inventory", inventory.serializeNBT()); From 3c0b55ac1d74c00c7424718f72414197745f6c33 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 10 Apr 2020 21:43:28 +0200 Subject: [PATCH 09/10] A cure to darkness - Kinetic blocks no longer cause chunks to lose all block light information - Stockpile switch and sequencer no longer open the GUI to the wrong players - Belt items no longer skip blocking attachments while loaded in - Nozzle explosions no longer cause block damage - PSIs no longer transfer an excess of items, deleting them in the process --- build.gradle | 2 +- .../modules/contraptions/KineticNetwork.java | 8 ++--- .../base/GeneratingKineticTileEntity.java | 8 ++--- .../contraptions/base/KineticTileEntity.java | 35 +++++++++---------- .../actors/StorageInterfaceMovement.java | 4 +-- .../bearing/MechanicalBearingTileEntity.java | 8 ++--- .../CrushingWheelControllerTileEntity.java | 2 +- .../components/fan/EncasedFanTileEntity.java | 8 ++--- .../components/fan/NozzleTileEntity.java | 17 +++++++-- .../flywheel/FlywheelTileEntity.java | 2 +- .../sequencer/SequencedGearshiftBlock.java | 4 ++- .../relays/belt/BeltTileEntity.java | 6 ++-- .../relays/belt/transport/BeltInventory.java | 6 +++- .../logistics/block/StockswitchBlock.java | 4 ++- .../inventories/FlexcrateTileEntity.java | 14 +++----- src/main/resources/META-INF/mods.toml | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- 17 files changed, 74 insertions(+), 58 deletions(-) diff --git a/build.gradle b/build.gradle index f30dc6846..5f1c00098 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = 'mc1.14.4_v0.2.2a' +version = 'mc1.14.4_v0.2.2b' group = 'com.simibubi.create' archivesBaseName = 'create' diff --git a/src/main/java/com/simibubi/create/modules/contraptions/KineticNetwork.java b/src/main/java/com/simibubi/create/modules/contraptions/KineticNetwork.java index ef4d62a29..01b32ab0e 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/KineticNetwork.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/KineticNetwork.java @@ -38,12 +38,12 @@ public class KineticNetwork { return; if (te.isSource()) { unloadedCapacity -= lastCapacity * getStressMultiplierForSpeed(te.getGeneratedSpeed()); - float addedStressCapacity = te.getAddedStressCapacity(); + float addedStressCapacity = te.calculateAddedStressCapacity(); sources.put(te, addedStressCapacity); } unloadedStress -= lastStress * getStressMultiplierForSpeed(te.getTheoreticalSpeed()); - float stressApplied = te.getStressApplied(); + float stressApplied = te.calculateStressApplied(); members.put(te, stressApplied); unloadedMembers--; @@ -59,8 +59,8 @@ public class KineticNetwork { if (members.containsKey(te)) return; if (te.isSource()) - sources.put(te, te.getAddedStressCapacity()); - members.put(te, te.getStressApplied()); + sources.put(te, te.calculateAddedStressCapacity()); + members.put(te, te.calculateStressApplied()); te.updateFromNetwork(currentCapacity, currentStress, getSize()); te.networkDirty = true; } 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 52f45be3a..e83403818 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 @@ -55,7 +55,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { boolean added = super.addToGoggleTooltip(tooltip, isPlayerSneaking); - float stressBase = getAddedStressCapacity(); + float stressBase = calculateAddedStressCapacity(); if (stressBase != 0 && IRotate.StressImpact.isEnabled()) { tooltip.add(spacing + Lang.translate("gui.goggles.generator_stats")); tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.capacityProvided")); @@ -97,8 +97,8 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { if (hasNetwork() && speed != 0) { KineticNetwork network = getOrCreateNetwork(); - notifyStressCapacityChange(getAddedStressCapacity()); - getOrCreateNetwork().updateStressFor(this, getStressApplied()); + notifyStressCapacityChange(calculateAddedStressCapacity()); + getOrCreateNetwork().updateStressFor(this, calculateStressApplied()); network.updateStress(); } @@ -112,7 +112,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { if (speed == 0) { if (hasSource()) { notifyStressCapacityChange(0); - getOrCreateNetwork().updateStressFor(this, getStressApplied()); + getOrCreateNetwork().updateStressFor(this, calculateStressApplied()); return; } detachKinetics(); 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 583088575..de3df92b2 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 @@ -139,20 +139,22 @@ public abstract class KineticTileEntity extends SmartTileEntity } } - public float getAddedStressCapacity() { + public float calculateAddedStressCapacity() { Map> capacityMap = AllConfigs.SERVER.kinetics.stressValues.capacities; ResourceLocation path = getBlockState().getBlock().getRegistryName(); - if (!capacityMap.containsKey(path)) - return 0; - return capacityMap.get(path).get().floatValue(); + + float capacity = capacityMap.containsKey(path) ? capacityMap.get(path).get().floatValue() : 0; + this.lastCapacityProvided = capacity; + return capacity; } - public float getStressApplied() { + public float calculateStressApplied() { Map> stressEntries = AllConfigs.SERVER.kinetics.stressValues.impacts; ResourceLocation path = getBlockState().getBlock().getRegistryName(); - if (!stressEntries.containsKey(path)) - return 1; - return stressEntries.get(path).get().floatValue(); + + float impact = stressEntries.containsKey(path) ? stressEntries.get(path).get().floatValue() : 1; + this.lastStressApplied = impact; + return impact; } public void onSpeedChanged(float previousSpeed) { @@ -186,13 +188,11 @@ public abstract class KineticTileEntity extends SmartTileEntity networkTag.putFloat("Stress", stress); networkTag.putFloat("Capacity", capacity); networkTag.putInt("Size", networkSize); - - float stressApplied = getStressApplied(); - float addedStressCapacity = getAddedStressCapacity(); - if (stressApplied != 0) - networkTag.putFloat("AddedStress", stressApplied); - if (addedStressCapacity != 0) - networkTag.putFloat("AddedCapacity", addedStressCapacity); + + if (lastStressApplied != 0) + networkTag.putFloat("AddedStress", lastStressApplied); + if (lastCapacityProvided != 0) + networkTag.putFloat("AddedCapacity", lastCapacityProvided); compound.put("Network", networkTag); } @@ -203,7 +203,6 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void read(CompoundNBT compound) { speed = compound.getFloat("Speed"); - source = null; network = null; overStressed = false; @@ -392,9 +391,9 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { boolean added = false; - float stressAtBase = getStressApplied(); + float stressAtBase = calculateStressApplied(); - if (getStressApplied() != 0 && StressImpact.isEnabled()) { + if (calculateStressApplied() != 0 && StressImpact.isEnabled()) { tooltip.add(spacing + Lang.translate("gui.goggles.kinetic_stats")); tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.stressImpact")); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/StorageInterfaceMovement.java b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/StorageInterfaceMovement.java index 45815f0a2..d647423c1 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/actors/StorageInterfaceMovement.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/actors/StorageInterfaceMovement.java @@ -102,8 +102,8 @@ public class StorageInterfaceMovement extends MovementBehaviour { extracting.withAmountThreshold(stack -> { ItemStack tester = stack.copy(); - tester.setCount(64); - return 64 - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); + tester.setCount(tester.getMaxStackSize()); + return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount(); }); extracting.setCallback(stack -> { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java index 9e2b96ef6..d962824b6 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/bearing/MechanicalBearingTileEntity.java @@ -52,13 +52,13 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp } @Override - public float getAddedStressCapacity() { - return isWindmill ? super.getAddedStressCapacity() : 0; + public float calculateAddedStressCapacity() { + return isWindmill ? super.calculateAddedStressCapacity() : 0; } @Override - public float getStressApplied() { - return isWindmill ? 0 : super.getStressApplied(); + public float calculateStressApplied() { + return isWindmill ? 0 : super.calculateStressApplied(); } public void neighbourChanged() { diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 9f2feb3af..0d3270d72 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -204,7 +204,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen @Override public CompoundNBT write(CompoundNBT compound) { - if (hasEntity() && !isFrozen()) + if (hasEntity()) compound.put("Entity", NBTUtil.writeUniqueId(entityUUID)); compound.put("Inventory", inventory.serializeNBT()); compound.putFloat("Speed", crushingspeed); 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 3ec6a244d..699d23817 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 @@ -45,13 +45,13 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity { } @Override - public float getAddedStressCapacity() { - return isGenerator ? super.getAddedStressCapacity() : 0; + public float calculateAddedStressCapacity() { + return isGenerator ? super.calculateAddedStressCapacity() : 0; } @Override - public float getStressApplied() { - return isGenerator ? 0 : super.getStressApplied(); + public float calculateStressApplied() { + return isGenerator ? 0 : super.calculateStressApplied(); } @Override diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/NozzleTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/NozzleTileEntity.java index 318159cfa..23d67634d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/fan/NozzleTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/fan/NozzleTileEntity.java @@ -158,8 +158,21 @@ public class NozzleTileEntity extends SmartTileEntity { pushingEntities.add(entity); } - if (!pushing && pushingEntities.size() > 512 && !world.isRemote) - world.createExplosion(null, center.x, center.y, center.z, 6, Mode.BREAK); + for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { + Entity entity = iterator.next(); + if (entity.isAlive()) + continue; + iterator.remove(); + } + + if (!pushing && pushingEntities.size() > 256 && !world.isRemote) { + world.createExplosion(null, center.x, center.y, center.z, 2, Mode.NONE); + for (Iterator iterator = pushingEntities.iterator(); iterator.hasNext();) { + Entity entity = iterator.next(); + entity.remove(); + iterator.remove(); + } + } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/FlywheelTileEntity.java index 8ee1418b0..d7f320305 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/flywheel/FlywheelTileEntity.java @@ -43,7 +43,7 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { } @Override - public float getAddedStressCapacity() { + public float calculateAddedStressCapacity() { return generatedCapacity; } 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 f4a4e47ce..1ea746fde 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 @@ -10,6 +10,7 @@ import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; @@ -86,7 +87,8 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen return false; } - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen)); + if (player instanceof ClientPlayerEntity) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen)); return true; } 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 ca05863a0..1842a17d2 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 @@ -56,7 +56,7 @@ public class BeltTileEntity extends KineticTileEntity { protected BeltInventory inventory; protected LazyOptional itemHandler; - private CompoundNBT trackerUpdateTag; + public CompoundNBT trackerUpdateTag; public BeltTileEntity() { super(AllTileEntities.BELT.type); @@ -115,10 +115,10 @@ public class BeltTileEntity extends KineticTileEntity { } @Override - public float getStressApplied() { + public float calculateStressApplied() { if (!isController()) return 0; - return super.getStressApplied(); + return super.calculateStressApplied(); } @Override diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java index a130346cf..ff56a36f9 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java @@ -125,7 +125,11 @@ public class BeltInventory { if (segmentBefore != -1 && current.locked) { BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore); if (beltSegment != null) { - + + // wait in case belt isnt initialized yet + if (current.locked && beltSegment.trackerUpdateTag != null) + continue; + current.locked = false; List attachments = beltSegment.attachmentTracker.attachments; for (BeltAttachmentState attachmentState : attachments) { 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 ec193205e..fd021a1e5 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 @@ -8,6 +8,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.HorizontalBlock; import net.minecraft.block.material.PushReaction; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.state.IntegerProperty; @@ -87,7 +88,8 @@ public class StockswitchBlock extends HorizontalBlock implements ITE () -> withTileEntityDo(worldIn, pos, this::displayScreen)); + if (player instanceof ClientPlayerEntity) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen)); return true; } diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java index 7a80adbd0..7de4030b2 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/inventories/FlexcrateTileEntity.java @@ -162,20 +162,16 @@ public class FlexcrateTileEntity extends SyncedTileEntity implements INamedConta @Override public CompoundNBT write(CompoundNBT compound) { - if (!isSecondaryCrate()) { - compound.putBoolean("Main", true); - compound.putInt("AllowedAmount", allowedAmount); - compound.put("Inventory", inventory.serializeNBT()); - } + compound.putBoolean("Main", true); + compound.putInt("AllowedAmount", allowedAmount); + compound.put("Inventory", inventory.serializeNBT()); return super.write(compound); } @Override public void read(CompoundNBT compound) { - if (compound.contains("Main")) { - allowedAmount = compound.getInt("AllowedAmount"); - inventory.deserializeNBT(compound.getCompound("Inventory")); - } + allowedAmount = compound.getInt("AllowedAmount"); + inventory.deserializeNBT(compound.getCompound("Inventory")); super.read(compound); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index d3f742686..9815734b1 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -4,7 +4,7 @@ loaderVersion="[28,)" [[mods]] modId="create" -version="mc1.14-0.2.2a" +version="mc1.14-0.2.2b" displayName="Create" #updateJSONURL="" authors="simibubi" diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index d48040e46..290ce4c0b 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -635,7 +635,7 @@ "advancement.create:polished_rose_quartz.desc": "Polish Rose Quartz until you can see through it.", "advancement.create:sand_paper_secret": "9001 Grit Sand Paper", "advancement.create:sand_paper_secret.desc": "Use your Sand Paper to sand some Sand Paper.", - "advancement.create:press": "'Bonk!' ", + "advancement.create:press": "'Bonk!'", "advancement.create:press.desc": "Make a Mechanical Press and use it to create some Plates.", "advancement.create:mixer": "Mixin' it Up", "advancement.create:mixer.desc": "Create a Mechanical Mixer.", From 4d169616365e9066d2c3171eaae1f40927f01982 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 11 Apr 2020 00:55:51 +0200 Subject: [PATCH 10/10] Bug Fixes - Sandpaper can no longer repair tools - Fixed players getting kicked for "flying" when moved by contraptions or fans - Saw no longer duplicates itself when broken in an overstressed state - Belts can no longer pass items on to a vertical belt --- build.gradle | 1 + .../simibubi/create/config/CCuriosities.java | 2 - .../contraptions/ContraptionCollider.java | 4 ++ .../components/fan/AirCurrent.java | 4 ++ .../contraptions/components/saw/SawBlock.java | 2 +- .../components/saw/SawTileEntity.java | 6 ++- .../relays/belt/transport/BeltInventory.java | 2 +- .../curiosities/tools/SandPaperItem.java | 3 +- .../tools/SandPaperPolishingRecipe.java | 42 +------------------ .../resources/META-INF/accesstransformer.cfg | 1 + .../resources/assets/create/lang/en_us.json | 4 +- 11 files changed, 20 insertions(+), 51 deletions(-) create mode 100644 src/main/resources/META-INF/accesstransformer.cfg diff --git a/build.gradle b/build.gradle index 5f1c00098..3b85fffed 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,7 @@ sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = co minecraft { mappings channel: 'snapshot', version: '20200119-1.14.3' + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { client { diff --git a/src/main/java/com/simibubi/create/config/CCuriosities.java b/src/main/java/com/simibubi/create/config/CCuriosities.java index a4d4ebea5..4b23a4f05 100644 --- a/src/main/java/com/simibubi/create/config/CCuriosities.java +++ b/src/main/java/com/simibubi/create/config/CCuriosities.java @@ -11,7 +11,6 @@ public class CCuriosities extends ConfigBase { public ConfigBool enableRefinedRadianceRecipe = b(true, "enableRefinedRadianceRecipe", Comments.refinedRadianceRecipe); public ConfigBool enableShadowSteelRecipe = b(true, "enableShadowSteelRecipe", Comments.shadowSteelRecipe); - public ConfigBool enableSandPaperToolPolishing = b(true, "enableSandPaperToolPolishing", Comments.sandPaperOnTools); public ConfigFloat cocoaLogGrowthSpeed = f(20, 0, 100, "cocoaLogGrowthSpeed", Comments.cocoa); @Override @@ -24,7 +23,6 @@ public class CCuriosities extends ConfigBase { static String refinedRadiance = "The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance."; static String refinedRadianceRecipe = "Allow the standard Refined Radiance recipes."; static String shadowSteelRecipe = "Allow the standard Shadow Steel recipe."; - static String sandPaperOnTools = "Enable the tool repairing mechanic involving sand paper."; static String windowsInBlocks = "Allow Glass Panes to be put inside Blocks like Stairs, Slabs, Fences etc."; static String cocoa = "% of random Ticks causing a Cocoa log to grow."; static String zapperUndoLogLength = "The maximum amount of operations, a blockzapper can remember for undoing. (0 to disable undo)"; diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/ContraptionCollider.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/ContraptionCollider.java index 9e1efeaeb..42d73959d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/ContraptionCollider.java @@ -14,6 +14,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.IProjectile; import net.minecraft.entity.MoverType; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; @@ -73,6 +74,7 @@ public class ContraptionCollider { if (allowedMovement.equals(relativeMotion)) continue; + if (allowedMovement.y != relativeMotion.y) { entity.fall(entity.fallDistance, 1); entity.fallDistance = 0; @@ -80,6 +82,8 @@ public class ContraptionCollider { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> checkForClientPlayerCollision(entity)); } + if (entity instanceof ServerPlayerEntity) + ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; if (entity instanceof PlayerEntity && !world.isRemote) return; 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 1522ad3e9..7d472a462 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 @@ -18,6 +18,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; @@ -95,6 +96,9 @@ public class AirCurrent { entity.setMotion(previousMotion.add(new Vec3d(xIn, yIn, zIn).scale(1 / 8f))); entity.fallDistance = 0; + if (entity instanceof ServerPlayerEntity) + ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; + if (InWorldProcessing.isFrozen()) return; 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 1cb3b50e6..1de31a45c 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 @@ -135,7 +135,7 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE ItemHelper.dropContents(worldIn, pos, te.inventory)); TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); - worldIn.removeTileEntity(pos); + worldIn.removeTileEntity(pos); } @Override 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 2f16da19c..fb695c9f8 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 @@ -55,6 +55,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { private int recipeIndex; private LazyOptional invProvider = LazyOptional.empty(); private FilteringBehaviour filtering; + private boolean destroyed; public SawTileEntity() { super(AllTileEntities.SAW.type); @@ -81,7 +82,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { super.onSpeedChanged(prevSpeed); boolean shouldRun = Math.abs(getSpeed()) > 1 / 64f; boolean running = getBlockState().get(RUNNING); - if (shouldRun != running) + if (shouldRun != running && !destroyed) world.setBlockState(pos, getBlockState().with(RUNNING, shouldRun), 2 | 16); } @@ -212,8 +213,9 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override public void remove() { - super.remove(); invProvider.invalidate(); + destroyed = true; + super.remove(); } @Override diff --git a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java index ff56a36f9..abf85f488 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/relays/belt/transport/BeltInventory.java @@ -245,7 +245,7 @@ public class BeltInventory { } // next block is not a belt - if (!AllBlocks.BELT.typeOf(state)) { + if (!AllBlocks.BELT.typeOf(state) || state.get(BeltBlock.SLOPE) == Slope.VERTICAL) { if (!Block.hasSolidSide(state, world, nextPosition, movementFacing.getOpposite())) { eject(current); iterator.remove(); diff --git a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperItem.java b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperItem.java index d50bd5948..b80f3c34b 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperItem.java @@ -9,7 +9,6 @@ import com.simibubi.create.modules.curiosities.tools.SandPaperItemRenderer.SandP import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -111,7 +110,7 @@ public class SandPaperItem extends Item implements IHaveCustomItemModel { @Override public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { - return enchantment == Enchantments.FORTUNE || super.canApplyAtEnchantingTable(stack, enchantment); + return super.canApplyAtEnchantingTable(stack, enchantment); } @Override diff --git a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java index d4cf72eb3..af430fff7 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/tools/SandPaperPolishingRecipe.java @@ -1,25 +1,18 @@ package com.simibubi.create.modules.curiosities.tools; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import com.simibubi.create.AllRecipes; -import com.simibubi.create.config.AllConfigs; import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient; import com.simibubi.create.modules.contraptions.processing.ProcessingOutput; import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe; import com.simibubi.create.modules.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.DamageSource; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.Explosion.Mode; import net.minecraft.world.World; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; @@ -34,46 +27,13 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe { } public static boolean canPolish(World world, ItemStack stack) { - return (stack.isDamageable() && isPolishingEnabled()) || !getMatchingRecipes(world, stack).isEmpty(); - } - - public static Boolean isPolishingEnabled() { - return AllConfigs.SERVER.curiosities.enableSandPaperToolPolishing.get(); + return !getMatchingRecipes(world, stack).isEmpty(); } public static ItemStack applyPolish(World world, Vec3d position, ItemStack stack, ItemStack sandPaperStack) { List> matchingRecipes = getMatchingRecipes(world, stack); if (!matchingRecipes.isEmpty()) return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy(); - if (stack.isDamageable() && isPolishingEnabled()) { - - stack.setDamage(stack.getDamage() / 2); - - int fortuneLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, sandPaperStack); - float chanceToPunish = (float) (1 / Math.pow(2, fortuneLevel + 1)); - - if (world.rand.nextFloat() > chanceToPunish) - return stack; - - if (stack.isEnchanted()) { - Map enchantments = EnchantmentHelper.getEnchantments(stack); - ArrayList list = new ArrayList<>(enchantments.keySet()); - Enchantment randomKey = list.get(world.rand.nextInt(list.size())); - int level = enchantments.get(randomKey); - if (level <= 1) - enchantments.remove(randomKey); - else - enchantments.put(randomKey, level - 1); - EnchantmentHelper.setEnchantments(enchantments, stack); - if (randomKey.isCurse()) - if (!world.isRemote) - world.createExplosion(null, CURSED_POLISHING, position.x, position.y, position.z, 2, true, - Mode.DESTROY); - } else { - stack = ItemStack.EMPTY; - } - } - return stack; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 000000000..02bc0b9d4 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ +public net.minecraft.network.play.ServerPlayNetHandler field_147365_f # floatingTickCount \ No newline at end of file diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index 290ce4c0b..06d09ad10 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -943,7 +943,7 @@ "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", "block.create.clockwork_bearing.tooltip.summary": "An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", "block.create.clockwork_bearing.tooltip.condition1": "When Rotated", - "block.create.clockwork_bearing.tooltip.behaviour1": "Starts rotating the attached Structure towards the _current_ _hour_. If a second structure is present, it will serve as the _minute_ _hand_.", + "block.create.clockwork_bearing.tooltip.behaviour1": "Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", "block.create.sequenced_gearshift.tooltip.summary": "A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", @@ -1131,7 +1131,7 @@ "block.create.stress_gauge.tooltip.behaviour1": "Indicates a color corresponding to the level of stress. _Over-stressed_ _networks_ will cease to move. Stress can be relieved by adding more _rotational_ _sources_ to the network.", "tool.create.sand_paper.tooltip": "SAND PAPER", - "tool.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish_ _materials_ or sharpen your _tools_.", + "tool.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", "tool.create.sand_paper.tooltip.condition1": "When Used", "tool.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking_ _at_ _them_",