Slime pustules now conduct redstone

This commit is contained in:
Sollace 2023-11-25 03:53:24 +00:00
parent aa595d4284
commit 3f7a9a0a78
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB

View file

@ -1,7 +1,10 @@
package com.minelittlepony.unicopia.block; package com.minelittlepony.unicopia.block;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import org.joml.Vector3f;
import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.USounds;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -14,11 +17,14 @@ import net.minecraft.entity.mob.SlimeEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemPlacementContext;
import net.minecraft.particle.BlockStateParticleEffect; import net.minecraft.particle.BlockStateParticleEffect;
import net.minecraft.particle.DustParticleEffect;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.EnumProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.StringIdentifiable; import net.minecraft.util.StringIdentifiable;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
@ -34,24 +40,29 @@ import net.minecraft.world.WorldAccess;
import net.minecraft.world.WorldView; import net.minecraft.world.WorldView;
public class SlimePustuleBlock extends Block { public class SlimePustuleBlock extends Block {
static final EnumProperty<Shape> SHAPE = EnumProperty.of("shape", Shape.class); private static final EnumProperty<Shape> SHAPE = EnumProperty.of("shape", Shape.class);
static final VoxelShape SHAFT_SHAPE = Block.createCuboidShape(7.5, 0, 7.5, 8.5, 16, 8.5); private static final BooleanProperty POWERED = Properties.POWERED;
static final VoxelShape DRIP_SHAPE = VoxelShapes.union( private static final Direction[] DIRECTIONS = Arrays.stream(Direction.values())
.filter(direction -> direction != Direction.UP)
.toArray(Direction[]::new);
private static final VoxelShape SHAFT_SHAPE = Block.createCuboidShape(7.5, 0, 7.5, 8.5, 16, 8.5);
private static final VoxelShape DRIP_SHAPE = VoxelShapes.union(
Block.createCuboidShape(7, 10, 7, 9, 16, 9), Block.createCuboidShape(7, 10, 7, 9, 16, 9),
Block.createCuboidShape(3, 15, 4, 9, 16, 10), Block.createCuboidShape(3, 15, 4, 9, 16, 10),
Block.createCuboidShape(7, 15, 7, 12, 16, 12) Block.createCuboidShape(7, 15, 7, 12, 16, 12)
); );
static final VoxelShape BULB_SHAPE = VoxelShapes.union( private static final VoxelShape BULB_SHAPE = VoxelShapes.union(
Block.createCuboidShape(4, 1, 4, 12, 10, 12), Block.createCuboidShape(4, 1, 4, 12, 10, 12),
Block.createCuboidShape(5, 10, 5, 11, 13, 11), Block.createCuboidShape(5, 10, 5, 11, 13, 11),
Block.createCuboidShape(6, 13, 6, 10, 15, 10), Block.createCuboidShape(6, 13, 6, 10, 15, 10),
Block.createCuboidShape(7, 13, 7, 9, 20, 9) Block.createCuboidShape(7, 13, 7, 9, 20, 9)
); );
static final VoxelShape CAP_SHAPE = VoxelShapes.union(SHAFT_SHAPE, DRIP_SHAPE); private static final VoxelShape CAP_SHAPE = VoxelShapes.union(SHAFT_SHAPE, DRIP_SHAPE);
private static final Vector3f DUST_COLOR = new Vector3f(1, 0.2F, 0.1F);
public SlimePustuleBlock(Settings settings) { public SlimePustuleBlock(Settings settings) {
super(settings.ticksRandomly()); super(settings.ticksRandomly());
setDefaultState(getDefaultState().with(SHAPE, Shape.DRIP)); setDefaultState(getDefaultState().with(SHAPE, Shape.DRIP).with(POWERED, false));
} }
@Override @Override
@ -68,6 +79,17 @@ public class SlimePustuleBlock extends Block {
public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) {
super.randomDisplayTick(state, world, pos, random); super.randomDisplayTick(state, world, pos, random);
if (state.get(POWERED)) {
VoxelShape shape = state.getCullingShape(world, pos);
float x = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.X), shape.getMax(Axis.X));
float z = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.Z), shape.getMax(Axis.Z));
world.addParticle(new DustParticleEffect(DUST_COLOR, 1),
pos.getX() + x,
pos.getY() + random.nextDouble(),
pos.getZ() + z, 0, 0, 0);
}
if (random.nextInt(15) == 0) { if (random.nextInt(15) == 0) {
VoxelShape shape = state.getCullingShape(world, pos); VoxelShape shape = state.getCullingShape(world, pos);
float x = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.X), shape.getMax(Axis.X)); float x = (float)MathHelper.lerp(random.nextFloat(), shape.getMin(Axis.X), shape.getMax(Axis.X));
@ -132,7 +154,7 @@ public class SlimePustuleBlock extends Block {
@Override @Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) { protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(SHAPE); builder.add(SHAPE, POWERED);
} }
@Deprecated @Deprecated
@ -154,20 +176,66 @@ public class SlimePustuleBlock extends Block {
Shape currentShape = state.get(SHAPE); Shape currentShape = state.get(SHAPE);
if (direction == Direction.DOWN && (currentShape == Shape.CAP || currentShape == Shape.STRING)) { if (direction == Direction.DOWN && (currentShape == Shape.CAP || currentShape == Shape.STRING)) {
return state; return state.with(POWERED, getReceivedRedstonePower(world, pos) > 0);
} }
Shape shape = determineShape(world, pos); Shape shape = determineShape(world, pos);
return state.with(SHAPE, shape); return state.with(SHAPE, shape).with(POWERED, getReceivedRedstonePower(world, pos) > 0);
} }
return state; return state.with(POWERED, getReceivedRedstonePower(world, pos) > 0);
} }
@Override @Override
public BlockState getPlacementState(ItemPlacementContext ctx) { public BlockState getPlacementState(ItemPlacementContext ctx) {
Shape shape = determineShape(ctx.getWorld(), ctx.getBlockPos()); Shape shape = determineShape(ctx.getWorld(), ctx.getBlockPos());
return super.getPlacementState(ctx).with(SHAPE, shape == Shape.STRING ? Shape.POD : shape); return super.getPlacementState(ctx)
.with(SHAPE, shape == Shape.STRING ? Shape.POD : shape)
.with(POWERED, getReceivedRedstonePower(ctx.getWorld(), ctx.getBlockPos()) > 0);
}
@Override
@Deprecated
public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) {
super.onStateReplaced(state, world, pos, newState, moved);
if (state.isOf(this) && newState.isOf(this) && state.get(POWERED) != newState.get(POWERED)) {
world.updateNeighbor(pos.up(), this, pos);
}
}
@Override
@Deprecated
public boolean emitsRedstonePower(BlockState state) {
return state.get(POWERED);
}
@Override
@Deprecated
public int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) {
if (direction == Direction.DOWN && emitsRedstonePower(state)) {
return 15;
}
return 0;
}
@Override
@Deprecated
public int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) {
if (direction == Direction.DOWN && emitsRedstonePower(state)) {
return 15;
}
return 0;
}
private int getReceivedRedstonePower(BlockView world, BlockPos pos) {
int power = 0;
for (Direction direction : DIRECTIONS) {
power = Math.max(power, world.getBlockState(pos.offset(direction)).getStrongRedstonePower(world, pos, direction));
if (power >= 15) {
return Math.min(15, power);
}
}
return Math.min(15, power);
} }
private Shape determineShape(WorldAccess world, BlockPos pos) { private Shape determineShape(WorldAccess world, BlockPos pos) {