diff --git a/src/client/java/dev/spiritstudios/hollow/particle/FireflyJarParticle.java b/src/client/java/dev/spiritstudios/hollow/particle/FireflyJarParticle.java index f63b65e..ce76c00 100644 --- a/src/client/java/dev/spiritstudios/hollow/particle/FireflyJarParticle.java +++ b/src/client/java/dev/spiritstudios/hollow/particle/FireflyJarParticle.java @@ -13,9 +13,9 @@ public class FireflyJarParticle extends SpriteBillboardParticle { protected FireflyJarParticle(ClientWorld clientWorld, double x, double y, double z) { super(clientWorld, x, y, z); this.maxAge = 400; - this.red = 0.101960786f; - this.green = 0.11764706f; - this.blue = 0.105882354f; + this.red = 26 / 255F; + this.green = 30 / 255F; + this.blue = 27 / 255F; xMover = clientWorld.random.nextBoolean(); counterClockwise = clientWorld.random.nextBoolean(); diff --git a/src/main/java/dev/spiritstudios/hollow/block/GiantLilyPadBlock.java b/src/main/java/dev/spiritstudios/hollow/block/GiantLilyPadBlock.java index eb4c410..8d709d0 100644 --- a/src/main/java/dev/spiritstudios/hollow/block/GiantLilyPadBlock.java +++ b/src/main/java/dev/spiritstudios/hollow/block/GiantLilyPadBlock.java @@ -1,7 +1,14 @@ package dev.spiritstudios.hollow.block; -import net.minecraft.block.*; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.HorizontalFacingBlock; +import net.minecraft.block.LilyPadBlock; +import net.minecraft.block.ShapeContext; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.tag.BlockTags; import net.minecraft.state.StateManager; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.EnumProperty; @@ -11,6 +18,7 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -28,15 +36,42 @@ public GiantLilyPadBlock(Settings settings) { } @Override - public BlockState onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { + public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) { + World world = ctx.getWorld(); + BlockPos pos = ctx.getBlockPos(); + + if (posInvalid(world, pos) || posInvalid(world, pos.east()) || posInvalid(world, pos.south()) || posInvalid(world, pos.east().south()) + ) return null; + + return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing()); + } + + private boolean posInvalid(World world, BlockPos pos) { + return (!world.isWater(pos.down()) && !world.getBlockState(pos.down()).isIn(BlockTags.ICE)) || !world.isAir(pos); + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { + if (world.isClient() || state.get(PIECE) != Piece.NORTH_WEST) return; + + world.setBlockState(pos.south(), state.with(PIECE, Piece.SOUTH_WEST)); + world.setBlockState(pos.east(), state.with(PIECE, Piece.NORTH_EAST)); + world.setBlockState(pos.south().east(), state.with(PIECE, Piece.SOUTH_EAST)); + } + + @Override + protected void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + super.onStateReplaced(state, world, pos, newState, moved); + if (newState.isOf(this)) return; + for (BlockPos blockPos : getBlocks(pos, state)) { + if (blockPos.equals(pos)) continue; BlockState blockState = world.getBlockState(blockPos); - if (blockState.getBlock() == this) world.breakBlock(blockPos, blockPos.equals(pos)); + if (blockState.isOf(this)) world.breakBlock(blockPos, false); } - - return super.onBreak(world, pos, state, player); } + public List getBlocks(BlockPos pos, BlockState state) { List blocks = new ArrayList<>(); if (state.getBlock() != this) return blocks; @@ -68,7 +103,6 @@ public enum Piece implements StringIdentifiable { SOUTH_WEST, SOUTH_EAST; - @Override public String asString() { return this.name().toLowerCase(Locale.ROOT); } } diff --git a/src/main/java/dev/spiritstudios/hollow/item/GiantLilyPadItem.java b/src/main/java/dev/spiritstudios/hollow/item/GiantLilyPadItem.java deleted file mode 100644 index f39ef59..0000000 --- a/src/main/java/dev/spiritstudios/hollow/item/GiantLilyPadItem.java +++ /dev/null @@ -1,73 +0,0 @@ -package dev.spiritstudios.hollow.item; - -import dev.spiritstudios.hollow.block.GiantLilyPadBlock; -import net.minecraft.advancement.criterion.Criteria; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.item.PlaceableOnWaterItem; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.stat.Stats; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; - -public class GiantLilyPadItem extends PlaceableOnWaterItem { - public GiantLilyPadItem(Block block, Settings settings) { super(block, settings); } - - @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { - ItemStack stack = user.getStackInHand(hand); - BlockHitResult rayHit = raycast(world, user, RaycastContext.FluidHandling.SOURCE_ONLY); - if (rayHit.getType() == BlockHitResult.Type.MISS) return TypedActionResult.pass(stack); - if (rayHit.getType() != BlockHitResult.Type.BLOCK) return TypedActionResult.fail(stack); - - BlockPos pos = rayHit.getBlockPos(); - Direction side = rayHit.getSide(); - if ( - !world.canPlayerModifyAt(user, pos) || !user.canPlaceOn(pos, side, stack) - || !world.canPlayerModifyAt(user, pos.east()) || !user.canPlaceOn(pos.east(), side, stack) - || !world.canPlayerModifyAt(user, pos.south()) || !user.canPlaceOn(pos.south(), side, stack) - || !world.canPlayerModifyAt(user, pos.east().south()) || !user.canPlaceOn(pos.east().south(), side, stack) - ) return TypedActionResult.fail(stack); - - BlockPos above = pos.up(); - BlockState state = world.getBlockState(pos); - FluidState fluidState = world.getFluidState(pos); - - if ((!fluidState.isOf(Fluids.WATER) && !state.isIn(BlockTags.ICE)) || !world.isAir(above) - || (!world.getFluidState(pos.east()).isOf(Fluids.WATER) && !world.getBlockState(pos.east()).isIn(BlockTags.ICE)) || !world.isAir(above.east()) - || (!world.getFluidState(pos.south()).isOf(Fluids.WATER) && !world.getBlockState(pos.south()).isIn(BlockTags.ICE)) || !world.isAir(above.south()) - || (!world.getFluidState(pos.east().south()).isOf(Fluids.WATER) && !world.getBlockState(pos.east().south()).isIn(BlockTags.ICE)) || !world.isAir(above.east().south()) - ) return TypedActionResult.fail(stack); - - BlockState lilypadState = this.getBlock().getDefaultState().with(GiantLilyPadBlock.FACING, user.getHorizontalFacing()); - world.setBlockState(above, lilypadState.with(GiantLilyPadBlock.PIECE, GiantLilyPadBlock.Piece.NORTH_WEST), 11); - world.setBlockState(above.east(), lilypadState.with(GiantLilyPadBlock.PIECE, GiantLilyPadBlock.Piece.NORTH_EAST), 11); - world.setBlockState(above.south(), lilypadState.with(GiantLilyPadBlock.PIECE, GiantLilyPadBlock.Piece.SOUTH_WEST), 11); - world.setBlockState(above.east().south(), lilypadState.with(GiantLilyPadBlock.PIECE, GiantLilyPadBlock.Piece.SOUTH_EAST), 11); - - if (user instanceof ServerPlayerEntity serverPlayer) { - Criteria.PLACED_BLOCK.trigger(serverPlayer, above, stack); - Criteria.PLACED_BLOCK.trigger(serverPlayer, above.east(), stack); - Criteria.PLACED_BLOCK.trigger(serverPlayer, above.east().south(), stack); - Criteria.PLACED_BLOCK.trigger(serverPlayer, above.south(), stack); - } - - if (!user.getAbilities().creativeMode) stack.decrement(1); - user.incrementStat(Stats.USED.getOrCreateStat(this)); - world.playSound(user, pos, SoundEvents.BLOCK_LILY_PAD_PLACE, SoundCategory.BLOCKS, 1.0F, 1.0F); - - return TypedActionResult.success(stack); - } -} diff --git a/src/main/java/dev/spiritstudios/hollow/registry/HollowItems.java b/src/main/java/dev/spiritstudios/hollow/registry/HollowItems.java index 45d43d6..f5e4d37 100644 --- a/src/main/java/dev/spiritstudios/hollow/registry/HollowItems.java +++ b/src/main/java/dev/spiritstudios/hollow/registry/HollowItems.java @@ -2,7 +2,6 @@ import dev.spiritstudios.hollow.Hollow; import dev.spiritstudios.hollow.item.CopperHornItem; -import dev.spiritstudios.hollow.item.GiantLilyPadItem; import net.minecraft.item.Item; import net.minecraft.item.PlaceableOnWaterItem; import net.minecraft.item.SpawnEggItem; @@ -19,7 +18,7 @@ public final class HollowItems { ); public static final Item LOTUS_LILYPAD = new PlaceableOnWaterItem(HollowBlocks.LOTUS_LILYPAD, new Item.Settings()); - public static final Item GIANT_LILYPAD = new GiantLilyPadItem(HollowBlocks.GIANT_LILYPAD, new Item.Settings()); + public static final Item GIANT_LILYPAD = new PlaceableOnWaterItem(HollowBlocks.GIANT_LILYPAD, new Item.Settings()); public static final Item MUSIC_DISC_POSTMORTEM = new Item( new Item.Settings()