Skip to content

Commit

Permalink
add mesoglea particles by vox
Browse files Browse the repository at this point in the history
  • Loading branch information
AViewFromTheTop committed Feb 9, 2025
1 parent 3f55cbf commit e13125c
Show file tree
Hide file tree
Showing 136 changed files with 1,045 additions and 42 deletions.
49 changes: 43 additions & 6 deletions src/main/java/net/frozenblock/wilderwild/block/MesogleaBlock.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,18 +82,39 @@ public class MesogleaBlock extends HalfTransparentBlock {
Codec.BOOL.fieldOf("pearlescent").forGetter(MesogleaBlock::isPearlescent),
Codec.INT.fieldOf("water_fog_color").forGetter(MesogleaBlock::getWaterFogColorOverride),
ParticleTypes.CODEC.fieldOf("drip_particle").forGetter(mesogleaBlock -> mesogleaBlock.dripParticle),
ParticleTypes.CODEC.fieldOf("bubble_particle").forGetter(mesogleaBlock -> mesogleaBlock.bubbleParticle),
ParticleTypes.CODEC.fieldOf("bubble_column_up_particle").forGetter(mesogleaBlock -> mesogleaBlock.bubbleColumnUpParticle),
ParticleTypes.CODEC.fieldOf("current_down_particle").forGetter(mesogleaBlock -> mesogleaBlock.currentDownParticle),
ParticleTypes.CODEC.fieldOf("splash_particle").forGetter(mesogleaBlock -> mesogleaBlock.splashParticle),
propertiesCodec()
).apply(instance, MesogleaBlock::new));
private final boolean pearlescent;
private final int waterFogColor;
private final ParticleOptions dripParticle;
private final ParticleOptions bubbleParticle;
private final ParticleOptions bubbleColumnUpParticle;
private final ParticleOptions currentDownParticle;
private final ParticleOptions splashParticle;

public MesogleaBlock(boolean pearlescent, int waterFogColor, ParticleOptions dripParticle, @NotNull Properties properties) {
public MesogleaBlock(
boolean pearlescent,
int waterFogColor,
ParticleOptions dripParticle,
ParticleOptions bubbleParticle,
ParticleOptions bubbleColumnUpParticle,
ParticleOptions currentDownParticle,
ParticleOptions splashParticle,
@NotNull Properties properties
) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(BUBBLE_DIRECTION, BubbleDirection.NONE));
this.pearlescent = pearlescent;
this.waterFogColor = waterFogColor;
this.dripParticle = dripParticle;
this.bubbleParticle = bubbleParticle;
this.bubbleColumnUpParticle = bubbleColumnUpParticle;
this.currentDownParticle = currentDownParticle;
this.splashParticle = splashParticle;
}

public static boolean isMesoglea(@NotNull BlockState blockState) {
Expand Down Expand Up @@ -180,6 +201,22 @@ public int getWaterFogColorOverride() {
return this.waterFogColor;
}

public ParticleOptions getBubbleParticle() {
return this.bubbleParticle;
}

public ParticleOptions getBubbleColumnUpParticle() {
return this.bubbleColumnUpParticle;
}

public ParticleOptions getSplashParticle() {
return this.splashParticle;
}

public ParticleOptions getCurrentDownParticle() {
return this.currentDownParticle;
}

@Override
public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull Entity entity) {
Optional<Direction> dragDirection = getDragDirection(state);
Expand Down Expand Up @@ -207,7 +244,7 @@ public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNu
if (level instanceof ServerLevel serverLevel) {
for (int i = 0; i < 2; ++i) {
serverLevel.sendParticles(
ParticleTypes.SPLASH,
this.getSplashParticle(),
pos.getX() + level.random.nextDouble(),
pos.getY() + 1D,
pos.getZ() + level.random.nextDouble(),
Expand All @@ -218,7 +255,7 @@ public void entityInside(@NotNull BlockState state, @NotNull Level level, @NotNu
1D
);
serverLevel.sendParticles(
ParticleTypes.BUBBLE,
this.getBubbleParticle(),
pos.getX() + level.random.nextDouble(),
pos.getY() + 1D,
pos.getZ() + level.random.nextDouble(),
Expand Down Expand Up @@ -284,7 +321,7 @@ public void animateTick(@NotNull BlockState blockState, @NotNull Level level, @N
Optional<Direction> dragDirection = getDragDirection(blockState);
if (dragDirection.isPresent()) {
if (dragDirection.get() == Direction.DOWN) {
level.addAlwaysVisibleParticle(ParticleTypes.CURRENT_DOWN, d + 0.5D, e + 0.8D, f, 0D, 0D, 0D);
level.addAlwaysVisibleParticle(this.getCurrentDownParticle(), d + 0.5D, e + 0.8D, f, 0D, 0D, 0D);
if (randomSource.nextInt(AMBIENT_WHIRLPOOL_SOUND_CHANCE) == 0) {
level.playLocalSound(
d,
Expand All @@ -299,7 +336,7 @@ public void animateTick(@NotNull BlockState blockState, @NotNull Level level, @N
}
} else if (dragDirection.get() == Direction.UP) {
level.addAlwaysVisibleParticle(
ParticleTypes.BUBBLE_COLUMN_UP,
this.getBubbleColumnUpParticle(),
d + 0.5D,
e,
f + 0.5D,
Expand All @@ -308,7 +345,7 @@ public void animateTick(@NotNull BlockState blockState, @NotNull Level level, @N
0D
);
level.addAlwaysVisibleParticle(
ParticleTypes.BUBBLE_COLUMN_UP,
this.getBubbleColumnUpParticle(),
d + randomSource.nextDouble(),
e + randomSource.nextDouble(),
f + randomSource.nextDouble(),
Expand Down
103 changes: 103 additions & 0 deletions src/main/java/net/frozenblock/wilderwild/client/WWParticleEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@
import net.frozenblock.wilderwild.particle.FloatingSculkBubbleParticle;
import net.frozenblock.wilderwild.particle.LeafClusterSeedParticle;
import net.frozenblock.wilderwild.particle.LeafParticle;
import net.frozenblock.wilderwild.particle.MesogleaBubbleColumnUpParticle;
import net.frozenblock.wilderwild.particle.MesogleaBubbleParticle;
import net.frozenblock.wilderwild.particle.MesogleaBubblePopParticle;
import net.frozenblock.wilderwild.particle.MesogleaCurrentDownParticle;
import net.frozenblock.wilderwild.particle.MesogleaDripParticle;
import net.frozenblock.wilderwild.particle.PollenParticle;
import net.frozenblock.wilderwild.particle.SeedParticle;
Expand All @@ -34,6 +38,7 @@
import net.frozenblock.wilderwild.particle.WindParticle;
import net.frozenblock.wilderwild.particle.factory.WilderParticleFactories;
import net.frozenblock.wilderwild.registry.WWParticleTypes;
import net.minecraft.client.particle.SplashParticle;

@Environment(EnvType.CLIENT)
public final class WWParticleEngine {
Expand Down Expand Up @@ -72,23 +77,121 @@ public static void init() {
particleRegistry.register(WWParticleTypes.BLUE_PEARLESCENT_HANGING_MESOGLEA, MesogleaDripParticle.BPMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.BLUE_PEARLESCENT_FALLING_MESOGLEA, MesogleaDripParticle.BPMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.BLUE_PEARLESCENT_LANDING_MESOGLEA, MesogleaDripParticle.BPMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.BLUE_PEARLESCENT_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.PURPLE_PEARLESCENT_HANGING_MESOGLEA, MesogleaDripParticle.PPMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.PURPLE_PEARLESCENT_FALLING_MESOGLEA, MesogleaDripParticle.PPMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.PURPLE_PEARLESCENT_LANDING_MESOGLEA, MesogleaDripParticle.PPMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.PURPLE_PEARLESCENT_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.BLUE_HANGING_MESOGLEA, MesogleaDripParticle.BMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.BLUE_FALLING_MESOGLEA, MesogleaDripParticle.BMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.BLUE_LANDING_MESOGLEA, MesogleaDripParticle.BMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.BLUE_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.BLUE_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.BLUE_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.BLUE_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.BLUE_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.BLUE_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.YELLOW_HANGING_MESOGLEA, MesogleaDripParticle.YMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.YELLOW_FALLING_MESOGLEA, MesogleaDripParticle.YMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.YELLOW_LANDING_MESOGLEA, MesogleaDripParticle.YMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.YELLOW_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.YELLOW_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.YELLOW_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.YELLOW_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.YELLOW_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.YELLOW_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.YELLOW_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.YELLOW_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.LIME_HANGING_MESOGLEA, MesogleaDripParticle.LMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.LIME_FALLING_MESOGLEA, MesogleaDripParticle.LMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.LIME_LANDING_MESOGLEA, MesogleaDripParticle.LMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.LIME_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.LIME_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.LIME_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.LIME_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.LIME_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.LIME_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.LIME_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.LIME_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.PINK_HANGING_MESOGLEA, MesogleaDripParticle.PMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.PINK_FALLING_MESOGLEA, MesogleaDripParticle.PMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.PINK_LANDING_MESOGLEA, MesogleaDripParticle.PMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.PINK_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.PINK_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.PINK_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.PINK_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.PINK_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.PINK_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.PINK_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.PINK_MESOGLEA_SPLASH, SplashParticle.Provider::new);
particleRegistry.register(WWParticleTypes.RED_HANGING_MESOGLEA, MesogleaDripParticle.RMesogleaHangProvider::new);
particleRegistry.register(WWParticleTypes.RED_FALLING_MESOGLEA, MesogleaDripParticle.RMesogleaFallProvider::new);
particleRegistry.register(WWParticleTypes.RED_LANDING_MESOGLEA, MesogleaDripParticle.RMesogleaLandProvider::new);
particleRegistry.register(
WWParticleTypes.RED_MESOGLEA_BUBBLE,
(spriteProvider) -> new MesogleaBubbleParticle.BubbleFactory(spriteProvider, WWParticleTypes.RED_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.RED_MESOGLEA_BUBBLE_COLUMN_UP,
(spriteProvider) -> new MesogleaBubbleColumnUpParticle.BubbleFactory(spriteProvider, WWParticleTypes.RED_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(
WWParticleTypes.RED_MESOGLEA_CURRENT_DOWN,
(spriteProvider) -> new MesogleaCurrentDownParticle.BubbleFactory(spriteProvider, WWParticleTypes.RED_MESOGLEA_BUBBLE_POP)
);
particleRegistry.register(WWParticleTypes.RED_MESOGLEA_BUBBLE_POP, MesogleaBubblePopParticle.BubbleFactory::new);
particleRegistry.register(WWParticleTypes.RED_MESOGLEA_SPLASH, SplashParticle.Provider::new);
}
}
22 changes: 0 additions & 22 deletions src/main/java/net/frozenblock/wilderwild/entity/Jellyfish.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ public class Jellyfish extends NoFlopAbstractFish {
public static final float STING_PITCH_BABY = 1.2F;
public static final int SPAWN_CHANCE = 110;
public static final int SPAWN_HEIGHT_NORMAL_SEA_OFFSET = 13;
public static final float BUBBLE_SPAWN_CHANCE = 0.2F;
public static final double HIDABLE_PLAYER_DISTANCE = 24D;
public static final int HIDABLE_TICKS_SINCE_SPAWN = 150;
public static final int HIDING_CHANCE = 25;
Expand Down Expand Up @@ -265,14 +264,6 @@ protected SoundEvent getSwimSound() {
return WWSounds.ENTITY_JELLYFISH_SWIM;
}

@Override
protected void playSwimSound(float volume) {
super.playSwimSound(volume);
if (this.random.nextFloat() < BUBBLE_SPAWN_CHANCE) {
this.spawnBubbles();
}
}

@Override
protected SoundEvent getHurtSound(@NotNull DamageSource damageSource) {
return this.isInWaterOrBubble() ? WWSounds.ENTITY_JELLYFISH_HURT_WATER : WWSounds.ENTITY_JELLYFISH_HURT;
Expand Down Expand Up @@ -610,19 +601,6 @@ private Vec3 rotateVector(@NotNull Vec3 vector) {
return vec3;
}

private void spawnBubbles() {
if (this.level() instanceof ServerLevel serverLevel && !this.isBaby()) {
double deltaLength = this.getDeltaMovement().length();
float bbHeight = this.getBbHeight();
Vec3 vec3 = this.rotateVector(new Vec3(0D, -bbHeight, 0D)).add(this.getX(), this.getY(), this.getZ());
for (int i = 0; i < this.random.nextInt(0, (int) (2D + (deltaLength * 25D))); ++i) {
Vec3 vec32 = this.rotateVector(new Vec3(this.random.nextDouble() * 0.6D - 0.3D, -1D, this.random.nextDouble() * 0.6D - 0.3D));
Vec3 vec33 = vec32.scale(0.3D + (this.random.nextFloat() * 2D));
serverLevel.sendParticles(ParticleTypes.BUBBLE, vec3.x, vec3.y + (bbHeight * 0.5D), vec3.z, 0, vec33.x, vec33.y, vec33.z, (deltaLength * 2D) + 0.1D);
}
}
}

@Override
public boolean hurt(@NotNull DamageSource source, float amount) {
if (super.hurt(source, amount)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package net.frozenblock.wilderwild.mixin.client.mesoglea;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.frozenblock.wilderwild.block.MesogleaBlock;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleEngine;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;

@Environment(EnvType.CLIENT)
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {

@Shadow
private @Nullable ClientLevel level;

@WrapOperation(
method = "addParticleInternal(Lnet/minecraft/core/particles/ParticleOptions;ZZDDDDDD)Lnet/minecraft/client/particle/Particle;",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/particle/ParticleEngine;createParticle(Lnet/minecraft/core/particles/ParticleOptions;DDDDDD)Lnet/minecraft/client/particle/Particle;"
)
)
private Particle wilderWild$replaceWithMesogleaParticles(
ParticleEngine instance, ParticleOptions particleOptions, double d, double e, double f, double g, double h, double i, Operation<Particle> original
) {
if (this.level != null) {
if (particleOptions.equals(ParticleTypes.BUBBLE)) {
BlockState state = this.level.getBlockState(BlockPos.containing(d, e, f));
if (state.getBlock() instanceof MesogleaBlock mesogleaBlock) {
particleOptions = mesogleaBlock.getBubbleParticle();
}
} else if (particleOptions.equals(ParticleTypes.SPLASH)) {
BlockState state = this.level.getBlockState(BlockPos.containing(d, e, f));
if (state.getBlock() instanceof MesogleaBlock mesogleaBlock) {
particleOptions = mesogleaBlock.getSplashParticle();
}
}
}

return original.call(instance, particleOptions, d, e, f, g, h, i);
}

}
Loading

0 comments on commit e13125c

Please sign in to comment.