Defer. Everything.

- Millstone now accepts items from belts/ejectors directly
- Fixed Redstone-triggered components losing tile data after moved by a Contraption
- Super glue between non-solids can now be removed while the glue item is equipped
- Fixed Deployers not able to interact with glued blocks
- Fixed incorrect lang mapping of UI button descriptions
- Placement assist block preview now lights properly, doesn't z-fight and fades in gradually
- Pickaxe and Axe are now effective on piston extension poles
- Fixed block breaking animations inside the ponder UI
- Fixed Ponder Scenes rendering on top of the progress bar
- Fixed Mechanical Press not retracting when items were removed early
- Fixed Windmill Bearings allowing to be moved while assembled
- Mechanical Pistons now silence the "missing poles" error after poles were added
This commit is contained in:
simibubi 2021-04-15 05:19:15 +02:00
parent 13f0823ccb
commit 2fc26f1112
18 changed files with 222 additions and 52 deletions

View file

@ -1,9 +1,12 @@
package com.simibubi.create.content.contraptions.components.millstone; package com.simibubi.create.content.contraptions.components.millstone;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -38,6 +41,12 @@ public class MillstoneTileEntity extends KineticTileEntity {
outputInv = new ItemStackHandler(9); outputInv = new ItemStackHandler(9);
capability = LazyOptional.of(MillstoneInventoryHandler::new); capability = LazyOptional.of(MillstoneInventoryHandler::new);
} }
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(this));
super.addBehaviours(behaviours);
}
@Override @Override
public void tick() { public void tick() {

View file

@ -24,7 +24,6 @@ import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
@ -188,6 +187,9 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos);
else else
AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos); AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos);
if (!world.isRemote)
sendData();
} }
if (!world.isRemote && runningTicks > CYCLE) { if (!world.isRemote && runningTicks > CYCLE) {

View file

@ -13,6 +13,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock;
@ -88,6 +90,11 @@ public class BlockMovementTraits {
if (te instanceof MechanicalBearingTileEntity) if (te instanceof MechanicalBearingTileEntity)
return !((MechanicalBearingTileEntity) te).isRunning(); return !((MechanicalBearingTileEntity) te).isRunning();
} }
if (block instanceof WindmillBearingBlock) {
TileEntity te = world.getTileEntity(pos);
if (te instanceof WindmillBearingTileEntity)
return !((WindmillBearingTileEntity) te).isRunning();
}
if (block instanceof ClockworkBearingBlock) { if (block instanceof ClockworkBearingBlock) {
TileEntity te = world.getTileEntity(pos); TileEntity te = world.getTileEntity(pos);
if (te instanceof ClockworkBearingTileEntity) if (te instanceof ClockworkBearingTileEntity)

View file

@ -58,6 +58,7 @@ import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
@ -170,7 +171,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
return false; return false;
if (world instanceof WrappedWorld) if (world instanceof WrappedWorld)
return true; return true;
BlockPos pos = hangingPosition; BlockPos pos = hangingPosition;
BlockPos pos2 = pos.offset(getFacingDirection().getOpposite()); BlockPos pos2 = pos.offset(getFacingDirection().getOpposite());
return isValidFace(world, pos2, getFacingDirection()) != isValidFace(world, pos, return isValidFace(world, pos2, getFacingDirection()) != isValidFace(world, pos,
@ -185,7 +186,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
if (!isValidFace(world, pos2, getFacingDirection()) if (!isValidFace(world, pos2, getFacingDirection())
&& !isValidFace(world, pos, getFacingDirection().getOpposite())) && !isValidFace(world, pos, getFacingDirection().getOpposite()))
return false; return false;
if (isSideSticky(world, pos2, getFacingDirection()) || isSideSticky(world, pos, getFacingDirection().getOpposite())) if (isSideSticky(world, pos2, getFacingDirection())
|| isSideSticky(world, pos, getFacingDirection().getOpposite()))
return false; return false;
return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity)
.isEmpty(); .isEmpty();
@ -209,12 +211,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
if (AllBlocks.STICKER.has(state)) if (AllBlocks.STICKER.has(state))
return state.get(DirectionalBlock.FACING) == direction; return state.get(DirectionalBlock.FACING) == direction;
if (state.getBlock() == Blocks.SLIME_BLOCK) if (state.getBlock() == Blocks.SLIME_BLOCK)
return true; return true;
if (state.getBlock() == Blocks.HONEY_BLOCK) if (state.getBlock() == Blocks.HONEY_BLOCK)
return true; return true;
if (AllBlocks.CART_ASSEMBLER.has(state)) if (AllBlocks.CART_ASSEMBLER.has(state))
return Direction.UP == direction; return Direction.UP == direction;
@ -227,7 +229,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
if (state.getBlock() instanceof AbstractChassisBlock) { if (state.getBlock() instanceof AbstractChassisBlock) {
BooleanProperty glueableSide = ((AbstractChassisBlock) state.getBlock()).getGlueableSide(state, direction); BooleanProperty glueableSide = ((AbstractChassisBlock) state.getBlock()).getGlueableSide(state, direction);
if (glueableSide == null) return false; if (glueableSide == null)
return false;
return state.get(glueableSide); return state.get(glueableSide);
} }
@ -255,7 +258,13 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
public boolean attackEntityFrom(DamageSource source, float amount) { public boolean attackEntityFrom(DamageSource source, float amount) {
if (this.isInvulnerableTo(source)) if (this.isInvulnerableTo(source))
return false; return false;
if (isAlive() && !world.isRemote && isVisible()) { Entity immediateSource = source.getImmediateSource();
if (!isVisible() && immediateSource instanceof PlayerEntity) {
if (!AllItems.SUPER_GLUE.isIn(((PlayerEntity) immediateSource).getHeldItemMainhand()))
return true;
}
if (isAlive() && !world.isRemote) {
remove(); remove();
markVelocityChanged(); markVelocityChanged();
onBroken(source.getTrueSource()); onBroken(source.getTrueSource());
@ -297,6 +306,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat
@Override @Override
public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) { public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) {
if (player instanceof FakePlayer)
return ActionResultType.PASS;
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
triggerPlaceBlock(player, hand); triggerPlaceBlock(player, hand);
}); });

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.components.structureMovement.piston; package com.simibubi.create.content.contraptions.components.structureMovement.piston;
import java.util.Random;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
@ -30,6 +32,7 @@ import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implements ITE<MechanicalPistonTileEntity> { public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implements ITE<MechanicalPistonTileEntity> {
@ -97,6 +100,35 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
} }
@Override
public void neighborChanged(BlockState state, World world, BlockPos pos, Block p_220069_4_, BlockPos fromPos,
boolean p_220069_6_) {
Direction direction = state.get(FACING);
if (!fromPos.equals(pos.offset(direction.getOpposite())))
return;
if (!world.isRemote && !world.getPendingBlockTicks()
.isTickPending(pos, this))
world.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
Direction direction = state.get(FACING);
BlockState pole = worldIn.getBlockState(pos.offset(direction.getOpposite()));
if (!AllBlocks.PISTON_EXTENSION_POLE.has(pole))
return;
if (pole.get(PistonExtensionPoleBlock.FACING)
.getAxis() != direction.getAxis())
return;
withTileEntityDo(worldIn, pos, te -> {
if (te.lastException == null)
return;
te.lastException = null;
te.sendData();
});
}
@Override @Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) { public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.MECHANICAL_PISTON.create(); return AllTileEntities.MECHANICAL_PISTON.create();

View file

@ -41,6 +41,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ToolType;
public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable { public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable {
@ -51,6 +52,26 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements
setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false)); setDefaultState(getDefaultState().with(FACING, Direction.UP).with(BlockStateProperties.WATERLOGGED, false));
} }
@Override
public ToolType getHarvestTool(BlockState state) {
return null;
}
@Override
public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) {
for (ToolType toolType : player.getHeldItemMainhand()
.getToolTypes()) {
if (isToolEffective(state, toolType))
return true;
}
return super.canHarvestBlock(state, world, pos, player);
}
@Override
public boolean isToolEffective(BlockState state, ToolType tool) {
return tool == ToolType.AXE || tool == ToolType.PICKAXE;
}
@Override @Override
public PushReaction getPushReaction(BlockState state) { public PushReaction getPushReaction(BlockState state) {
return PushReaction.NORMAL; return PushReaction.NORMAL;

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.relays.advanced.sequencer; package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
import java.util.Random;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock;
@ -29,6 +31,7 @@ import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
@ -62,7 +65,14 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen
boolean isMoving) { boolean isMoving) {
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
if (!worldIn.getPendingBlockTicks()
.isTickPending(pos, this))
worldIn.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
boolean previouslyPowered = state.get(STATE) != 0; boolean previouslyPowered = state.get(STATE) != 0;
boolean isPowered = worldIn.isBlockPowered(pos); boolean isPowered = worldIn.isBlockPowered(pos);
withTileEntityDo(worldIn, pos, sgte -> sgte.onRedstoneUpdate(isPowered, previouslyPowered)); withTileEntityDo(worldIn, pos, sgte -> sgte.onRedstoneUpdate(isPowered, previouslyPowered));

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.chute; package com.simibubi.create.content.logistics.block.chute;
import java.util.Random;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -13,6 +15,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
public class SmartChuteBlock extends AbstractChuteBlock { public class SmartChuteBlock extends AbstractChuteBlock {
@ -29,6 +32,14 @@ public class SmartChuteBlock extends AbstractChuteBlock {
super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving);
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
if (!worldIn.getPendingBlockTicks()
.isTickPending(pos, this))
worldIn.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
boolean previouslyPowered = state.get(POWERED); boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2); worldIn.setBlockState(pos, state.cycle(POWERED), 2);

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.funnel; package com.simibubi.create.content.logistics.block.funnel;
import java.util.Random;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
@ -25,6 +27,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@ -42,7 +45,7 @@ public abstract class AbstractFunnelBlock extends Block implements ITE<FunnelTil
return getDefaultState().with(POWERED, context.getWorld() return getDefaultState().with(POWERED, context.getWorld()
.isBlockPowered(context.getPos())); .isBlockPowered(context.getPos()));
} }
@Override @Override
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false; return false;
@ -68,6 +71,14 @@ public abstract class AbstractFunnelBlock extends Block implements ITE<FunnelTil
InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE);
if (behaviour != null) if (behaviour != null)
behaviour.onNeighborChanged(fromPos); behaviour.onNeighborChanged(fromPos);
if (!worldIn.getPendingBlockTicks()
.isTickPending(pos, this))
worldIn.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
boolean previouslyPowered = state.get(POWERED); boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2); worldIn.setBlockState(pos, state.cycle(POWERED), 2);

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.redstone; package com.simibubi.create.content.logistics.block.redstone;
import java.util.Random;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
@ -26,6 +28,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTileEntity> { public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTileEntity> {
@ -116,13 +119,25 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTile
} }
@Override @Override
public void neighborChanged(BlockState p_220069_1_, World p_220069_2_, BlockPos p_220069_3_, Block p_220069_4_, public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_,
BlockPos p_220069_5_, boolean p_220069_6_) { boolean p_220069_6_) {
updateDisplayedRedstoneValue(p_220069_1_, p_220069_2_, p_220069_3_); if (worldIn.isRemote)
return;
if (!worldIn.getPendingBlockTicks()
.isTickPending(pos, this))
worldIn.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
updateDisplayedRedstoneValue(state, worldIn, pos);
} }
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
if (state.getBlock() == oldState.getBlock() || isMoving)
return;
updateDisplayedRedstoneValue(state, worldIn, pos); updateDisplayedRedstoneValue(state, worldIn, pos);
} }
@ -159,7 +174,7 @@ public class NixieTubeBlock extends HorizontalBlock implements ITE<NixieTubeTile
power = Math.max(worldIn.getRedstonePower(pos.offset(direction), Direction.UP), power); power = Math.max(worldIn.getRedstonePower(pos.offset(direction), Direction.UP), power);
return power; return power;
} }
@Override @Override
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false; return false;

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.logistics.block.redstone; package com.simibubi.create.content.logistics.block.redstone;
import java.util.Random;
import com.simibubi.create.AllShapes; import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
@ -26,6 +28,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<RedstoneLinkTileEntity> { public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<RedstoneLinkTileEntity> {
@ -41,8 +44,10 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
@Override @Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) { boolean isMoving) {
Direction blockFacing = state.get(FACING); if (worldIn.isRemote)
return;
Direction blockFacing = state.get(FACING);
if (fromPos.equals(pos.offset(blockFacing.getOpposite()))) { if (fromPos.equals(pos.offset(blockFacing.getOpposite()))) {
if (!isValidPosition(state, worldIn, pos)) { if (!isValidPosition(state, worldIn, pos)) {
worldIn.destroyBlock(pos, true); worldIn.destroyBlock(pos, true);
@ -50,17 +55,25 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
} }
} }
updateTransmittedSignal(state, worldIn, pos, blockFacing); if (!worldIn.getPendingBlockTicks()
.isTickPending(pos, this))
worldIn.getPendingBlockTicks()
.scheduleTick(pos, this, 0);
}
@Override
public void scheduledTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random r) {
updateTransmittedSignal(state, worldIn, pos);
} }
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
if (state.getBlock() == oldState.getBlock() || isMoving) if (state.getBlock() == oldState.getBlock() || isMoving)
return; return;
updateTransmittedSignal(state, worldIn, pos, state.get(FACING)); updateTransmittedSignal(state, worldIn, pos);
} }
public void updateTransmittedSignal(BlockState state, World worldIn, BlockPos pos, Direction blockFacing) { public void updateTransmittedSignal(BlockState state, World worldIn, BlockPos pos) {
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
if (state.get(RECEIVER)) if (state.get(RECEIVER))
@ -171,7 +184,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
BlockPos neighbourPos = pos.offset(state.get(FACING) BlockPos neighbourPos = pos.offset(state.get(FACING)
.getOpposite()); .getOpposite());
BlockState neighbour = worldIn.getBlockState(neighbourPos); BlockState neighbour = worldIn.getBlockState(neighbourPos);
return !neighbour.getMaterial().isReplaceable(); return !neighbour.getMaterial()
.isReplaceable();
} }
@Override @Override
@ -190,7 +204,7 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<Red
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false; return false;
} }
@Override @Override
public Class<RedstoneLinkTileEntity> getTileEntityClass() { public Class<RedstoneLinkTileEntity> getTileEntityClass() {
return RedstoneLinkTileEntity.class; return RedstoneLinkTileEntity.class;

View file

@ -47,9 +47,8 @@ public class TooltipHelper {
private static final Map<Item, Supplier<String>> tooltipReferrals = new HashMap<>(); private static final Map<Item, Supplier<String>> tooltipReferrals = new HashMap<>();
public static IFormattableTextComponent holdShift(Palette color, boolean highlighted) { public static IFormattableTextComponent holdShift(Palette color, boolean highlighted) {
TextFormatting colorFormat = highlighted ? color.hColor : color.color; return Lang.translate("tooltip.holdForDescription", Lang.translate("tooltip.keyShift")
return Lang.translate("tooltip.holdKey", Lang.translate("tooltip.keyShift") .formatted(TextFormatting.GRAY))
.formatted(colorFormat))
.formatted(TextFormatting.DARK_GRAY); .formatted(TextFormatting.DARK_GRAY);
} }

View file

@ -108,7 +108,7 @@ public class PonderProgressBar extends AbstractSimiWidget {
hovered = clicked(mouseX, mouseY); hovered = clicked(mouseX, mouseY);
ms.push(); ms.push();
ms.translate(0, 0, 150); ms.translate(0, 0, 250);
/* /*
* ponderButtons are at z+400 * ponderButtons are at z+400
* renderBox is at z+100 * renderBox is at z+100
@ -182,9 +182,9 @@ public class PonderProgressBar extends AbstractSimiWidget {
if (selected) { if (selected) {
FontRenderer font = Minecraft.getInstance().fontRenderer; FontRenderer font = Minecraft.getInstance().fontRenderer;
GuiUtils.drawGradientRect(ms.peek() GuiUtils.drawGradientRect(ms.peek()
.getModel(), 500, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); .getModel(), 100, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor);
ms.push(); ms.push();
ms.translate(0, 0, 400); ms.translate(0, 0, 100);
String text; String text;
int offset; int offset;
if (activeScene.currentTime < keyframeTime) { if (activeScene.currentTime < keyframeTime) {

View file

@ -449,6 +449,7 @@ public class PonderScene {
} else { } else {
// For block breaking overlay; Don't ask // For block breaking overlay; Don't ask
ms.scale(f, f, f); ms.scale(f, f, f);
ms.translate(0.525, .2975, .9);
ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset, ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset,
(basePlateSize + basePlateOffsetZ) / -2f); (basePlateSize + basePlateOffsetZ) / -2f);
float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30; float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30;

View file

@ -537,7 +537,7 @@ public class PonderUI extends NavigatableSimiScreen {
{ {
// Chapter title // Chapter title
ms.push(); ms.push();
ms.translate(0, 0, 100); ms.translate(0, 0, 300);
int x = 31 + 20 + 8; int x = 31 + 20 + 8;
int y = 31; int y = 31;

View file

@ -110,7 +110,7 @@ public class PonderButton extends AbstractSimiWidget {
borderColorStart = ColorHelper.applyAlpha(borderColorStart, fade); borderColorStart = ColorHelper.applyAlpha(borderColorStart, fade);
borderColorEnd = ColorHelper.applyAlpha(borderColorEnd, fade); borderColorEnd = ColorHelper.applyAlpha(borderColorEnd, fade);
ms.translate(0, 0, 300); ms.translate(0, 0, 400);
PonderUI.renderBox(ms, x, y, width, height, backgroundColor, borderColorStart, borderColorEnd); PonderUI.renderBox(ms, x, y, width, height, backgroundColor, borderColorStart, borderColorEnd);
ms.translate(0, 0, 100); ms.translate(0, 0, 100);

View file

@ -14,12 +14,14 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder; import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import com.simibubi.create.foundation.utility.VirtualEmptyModelData;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockRendererDispatcher; import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -35,16 +37,17 @@ import net.minecraft.util.math.vector.Vector4f;
public abstract class GhostBlockRenderer { public abstract class GhostBlockRenderer {
private static final GhostBlockRenderer transparent = new TransparentGhostBlockRenderer(); private static final GhostBlockRenderer transparent = new TransparentGhostBlockRenderer();
public static GhostBlockRenderer transparent() { public static GhostBlockRenderer transparent() {
return transparent; return transparent;
} }
private static final GhostBlockRenderer standard = new DefaultGhostBlockRenderer(); private static final GhostBlockRenderer standard = new DefaultGhostBlockRenderer();
public static GhostBlockRenderer standard() { public static GhostBlockRenderer standard() {
return standard; return standard;
} }
public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params);
private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { private static class DefaultGhostBlockRenderer extends GhostBlockRenderer {
@ -52,7 +55,8 @@ public abstract class GhostBlockRenderer {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) {
ms.push(); ms.push();
BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); BlockRendererDispatcher dispatcher = Minecraft.getInstance()
.getBlockRendererDispatcher();
IBakedModel model = dispatcher.getModelForState(params.state); IBakedModel model = dispatcher.getModelForState(params.state);
@ -62,7 +66,9 @@ public abstract class GhostBlockRenderer {
BlockPos pos = params.pos; BlockPos pos = params.pos;
ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(pos.getX(), pos.getY(), pos.getZ());
dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); dispatcher.getBlockModelRenderer()
.renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV,
VirtualEmptyModelData.INSTANCE);
ms.pop(); ms.pop();
} }
@ -73,48 +79,61 @@ public abstract class GhostBlockRenderer {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) {
//prepare // prepare
ms.push(); ms.push();
//RenderSystem.pushMatrix(); // RenderSystem.pushMatrix();
BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); Minecraft mc = Minecraft.getInstance();
BlockRendererDispatcher dispatcher = mc.getBlockRendererDispatcher();
IBakedModel model = dispatcher.getModelForState(params.state); IBakedModel model = dispatcher.getModelForState(params.state);
//RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state); // RenderType layer = RenderTypeLookup.getEntityBlockLayer(params.state);
RenderType layer = RenderType.getTranslucent(); RenderType layer = RenderType.getTranslucent();
IVertexBuilder vb = buffer.getEarlyBuffer(layer); IVertexBuilder vb = buffer.getEarlyBuffer(layer);
BlockPos pos = params.pos; BlockPos pos = params.pos;
ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(pos.getX(), pos.getY(), pos.getZ());
//dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); ms.translate(.5, .5, .5);
renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); ms.scale(.85f, .85f, .85f);
ms.translate(-.5, -.5, -.5);
//buffer.draw(); // dispatcher.getBlockModelRenderer().renderModel(ms.peek(), vb, params.state, model, 1f, 1f, 1f, 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE);
//clean renderModel(params, ms.peek(), vb, params.state, model, 1f, 1f, 1f,
//RenderSystem.popMatrix(); WorldRenderer.getLightmapCoordinates(mc.world, pos), OverlayTexture.DEFAULT_UV,
VirtualEmptyModelData.INSTANCE);
// buffer.draw();
// clean
// RenderSystem.popMatrix();
ms.pop(); ms.pop();
} }
//BlockModelRenderer // BlockModelRenderer
public void renderModel(GhostBlockParams params, MatrixStack.Entry entry, IVertexBuilder vb, @Nullable BlockState state, IBakedModel model, float p_228804_5_, float p_228804_6_, float p_228804_7_, int p_228804_8_, int p_228804_9_, net.minecraftforge.client.model.data.IModelData modelData) { public void renderModel(GhostBlockParams params, MatrixStack.Entry entry, IVertexBuilder vb,
@Nullable BlockState state, IBakedModel model, float p_228804_5_, float p_228804_6_, float p_228804_7_,
int p_228804_8_, int p_228804_9_, net.minecraftforge.client.model.data.IModelData modelData) {
Random random = new Random(); Random random = new Random();
for (Direction direction : Direction.values()) { for (Direction direction : Direction.values()) {
random.setSeed(42L); random.setSeed(42L);
renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, direction, random, modelData), p_228804_8_, p_228804_9_); renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_,
model.getQuads(state, direction, random, modelData), p_228804_8_, p_228804_9_);
} }
random.setSeed(42L); random.setSeed(42L);
renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_, model.getQuads(state, (Direction) null, random, modelData), p_228804_8_, p_228804_9_); renderQuad(params, entry, vb, p_228804_5_, p_228804_6_, p_228804_7_,
model.getQuads(state, (Direction) null, random, modelData), p_228804_8_, p_228804_9_);
} }
//BlockModelRenderer // BlockModelRenderer
private static void renderQuad(GhostBlockParams params, MatrixStack.Entry p_228803_0_, IVertexBuilder p_228803_1_, float p_228803_2_, float p_228803_3_, float p_228803_4_, List<BakedQuad> p_228803_5_, int p_228803_6_, int p_228803_7_) { private static void renderQuad(GhostBlockParams params, MatrixStack.Entry p_228803_0_,
Float alpha = params.alphaSupplier.get(); IVertexBuilder p_228803_1_, float p_228803_2_, float p_228803_3_, float p_228803_4_,
List<BakedQuad> p_228803_5_, int p_228803_6_, int p_228803_7_) {
Float alpha = params.alphaSupplier.get() * .75f * PlacementHelpers.getCurrentAlpha();
for (BakedQuad bakedquad : p_228803_5_) { for (BakedQuad bakedquad : p_228803_5_) {
float f; float f;
@ -130,15 +149,19 @@ public abstract class GhostBlockRenderer {
f2 = 1.0F; f2 = 1.0F;
} }
quad(alpha, p_228803_1_, p_228803_0_, bakedquad, new float[]{1f, 1f, 1f, 1f}, f, f1, f2, new int[]{p_228803_6_, p_228803_6_, p_228803_6_, p_228803_6_}, p_228803_7_); quad(alpha, p_228803_1_, p_228803_0_, bakedquad, new float[] { 1f, 1f, 1f, 1f }, f, f1, f2,
new int[] { p_228803_6_, p_228803_6_, p_228803_6_, p_228803_6_ }, p_228803_7_);
} }
} }
//IVertexBuilder // IVertexBuilder
static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_, float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_, int p_227890_8_) { static void quad(float alpha, IVertexBuilder vb, MatrixStack.Entry p_227890_1_, BakedQuad p_227890_2_,
float[] p_227890_3_, float p_227890_4_, float p_227890_5_, float p_227890_6_, int[] p_227890_7_,
int p_227890_8_) {
int[] aint = p_227890_2_.getVertexData(); int[] aint = p_227890_2_.getVertexData();
Vector3i Vector3i = p_227890_2_.getFace().getDirectionVec(); Vector3i Vector3i = p_227890_2_.getFace()
.getDirectionVec();
Vector3f vector3f = new Vector3f((float) Vector3i.getX(), (float) Vector3i.getY(), (float) Vector3i.getZ()); Vector3f vector3f = new Vector3f((float) Vector3i.getX(), (float) Vector3i.getY(), (float) Vector3i.getZ());
Matrix4f matrix4f = p_227890_1_.getModel(); Matrix4f matrix4f = p_227890_1_.getModel();
vector3f.transform(p_227890_1_.getNormal()); vector3f.transform(p_227890_1_.getNormal());
@ -163,14 +186,14 @@ public abstract class GhostBlockRenderer {
g = p_227890_3_[k] * p_227890_5_; g = p_227890_3_[k] * p_227890_5_;
b = p_227890_3_[k] * p_227890_6_; b = p_227890_3_[k] * p_227890_6_;
int l = vb.applyBakedLighting(p_227890_7_[k], bytebuffer); int l = vb.applyBakedLighting(p_227890_7_[k], bytebuffer);
float f9 = bytebuffer.getFloat(16); float f9 = bytebuffer.getFloat(16);
float f10 = bytebuffer.getFloat(20); float f10 = bytebuffer.getFloat(20);
Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F); Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F);
vector4f.transform(matrix4f); vector4f.transform(matrix4f);
vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.getNormal()); vb.applyBakedNormals(vector3f, bytebuffer, p_227890_1_.getNormal());
vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_, l, vector3f.getX(), vector3f.getY(), vector3f.getZ()); vb.vertex(vector4f.getX(), vector4f.getY(), vector4f.getZ(), r, g, b, alpha, f9, f10, p_227890_8_,
l, vector3f.getX(), vector3f.getY(), vector3f.getZ());
} }
} }
} }

View file

@ -157,12 +157,16 @@ public class PlacementHelpers {
float screenY = res.getScaledHeight() / 2f; float screenY = res.getScaledHeight() / 2f;
float screenX = res.getScaledWidth() / 2f; float screenX = res.getScaledWidth() / 2f;
float progress = Math.min(animationTick / 10f/* + event.getPartialTicks()*/, 1f); float progress = getCurrentAlpha();
drawDirectionIndicator(event.getMatrixStack(), event.getPartialTicks(), screenX, screenY, progress); drawDirectionIndicator(event.getMatrixStack(), event.getPartialTicks(), screenX, screenY, progress);
} }
} }
public static float getCurrentAlpha() {
return Math.min(animationTick / 10f/* + event.getPartialTicks()*/, 1f);
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
private static void drawDirectionIndicator(MatrixStack ms, float partialTicks, float centerX, float centerY, float progress) { private static void drawDirectionIndicator(MatrixStack ms, float partialTicks, float centerX, float centerY, float progress) {
float r = .8f; float r = .8f;