From 64515ac8085444d9b66f86fddc7a93cda4b912e8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 19 Oct 2023 16:12:48 +0100 Subject: [PATCH] Added particle effects to cloud blocks and break clouds when falling on them from a tall height --- .../unicopia/block/cloud/CloudBlock.java | 45 +++++++++++++++++++ .../unicopia/block/cloud/CloudSlabBlock.java | 1 + .../unicopia/block/cloud/SoggyCloudBlock.java | 1 + .../block/cloud/SoggyCloudSlabBlock.java | 1 + .../block/cloud/UnstableCloudBlock.java | 6 +++ 5 files changed, 54 insertions(+) diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java index c11fc3d3..1f2b17b0 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudBlock.java @@ -13,9 +13,12 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.particle.ParticleTypes; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.random.Random; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; @@ -42,9 +45,51 @@ public class CloudBlock extends TransparentBlock { } } + @Override + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + if (world.random.nextInt(150) == 0) { + generateSurfaceParticles(world, state, pos, ShapeContext.absent(), 1); + } + } + @Override public void onLandedUpon(World world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { entity.handleFallDamage(fallDistance, 0, world.getDamageSources().fall()); + generateSurfaceParticles(world, state, pos, ShapeContext.of(entity), 9); + + if (fallDistance > 7) { + world.breakBlock(pos, true); + } + } + + @Override + public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) { + if (world.random.nextInt(15) == 0) { + generateSurfaceParticles(world, state, pos, ShapeContext.of(entity), 1); + } + } + + protected void generateSurfaceParticles(World world, BlockState state, BlockPos pos, ShapeContext context, int count) { + VoxelShape shape = getCollisionShape(state, world, pos, context); + Random rng = world.random; + Box box = shape.getBoundingBox(); + + for (int i = 0; i < count; i++) { + world.addParticle(ParticleTypes.CLOUD, + pos.getX() + MathHelper.lerp(rng.nextFloat(), box.minX, box.maxX), + pos.getY() + box.maxY, + pos.getZ() + MathHelper.lerp(rng.nextFloat(), box.minZ, box.maxZ), 0, 0, 0); + + world.addParticle(ParticleTypes.CLOUD, + pos.getX() + (rng.nextBoolean() ? box.minX : box.maxX), + pos.getY() + MathHelper.lerp(rng.nextFloat(), box.minY, box.maxY), + pos.getZ() + MathHelper.lerp(rng.nextFloat(), box.minZ, box.maxZ), 0, 0, 0); + + world.addParticle(ParticleTypes.CLOUD, + pos.getX() + MathHelper.lerp(rng.nextFloat(), box.minX, box.maxX), + pos.getY() + MathHelper.lerp(rng.nextFloat(), box.minY, box.maxY), + pos.getZ() + (rng.nextBoolean() ? box.minZ : box.maxZ), 0, 0, 0); + } } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudSlabBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudSlabBlock.java index e4b721ac..12a6428a 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudSlabBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/CloudSlabBlock.java @@ -28,6 +28,7 @@ public class CloudSlabBlock extends WaterloggableCloudBlock { public CloudSlabBlock(Settings settings, boolean meltable, @Nullable Supplier soggyBlock) { super(settings, meltable, soggyBlock); + setDefaultState(getDefaultState().with(SlabBlock.TYPE, SlabType.BOTTOM)); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java index d7d5ff69..36124dbc 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudBlock.java @@ -47,6 +47,7 @@ public class SoggyCloudBlock extends CloudBlock implements Soakable { @Override public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + super.randomDisplayTick(state, world, pos, random); Soakable.addMoistureParticles(state, world, pos, random); } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java index e07fb744..d9f604fe 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/SoggyCloudSlabBlock.java @@ -48,6 +48,7 @@ public class SoggyCloudSlabBlock extends CloudSlabBlock { @Override public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + super.randomDisplayTick(state, world, pos, random); Soakable.addMoistureParticles(state, world, pos, random); } diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java index 82e59309..0f9f0c86 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java @@ -34,6 +34,7 @@ public class UnstableCloudBlock extends CloudBlock { @Override public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + super.randomDisplayTick(state, world, pos, random); int charge = state.get(CHARGE); if (charge > 0) { world.addParticle(new LightningBoltParticleEffect(true, 10, 1, 0.6F + (charge / (float)MAX_CHARGE) * 0.4F, Optional.empty()), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0, 0); @@ -49,6 +50,11 @@ public class UnstableCloudBlock extends CloudBlock { } world.playSound(null, pos, SoundEvents.BLOCK_WOOL_HIT, SoundCategory.BLOCKS, 1, 1); + if (fallDistance > 3) { + world.breakBlock(pos, true); + return; + } + if (state.get(CHARGE) < MAX_CHARGE) { world.setBlockState(pos, state.cycle(CHARGE)); } else {