124 lines
5.5 KiB
Java
124 lines
5.5 KiB
Java
package net.minecraft.util;
|
|
|
|
import java.util.function.Supplier;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.core.particles.BlockParticleOption;
|
|
import net.minecraft.core.particles.ParticleOptions;
|
|
import net.minecraft.core.particles.ParticleTypes;
|
|
import net.minecraft.util.valueproviders.IntProvider;
|
|
import net.minecraft.util.valueproviders.UniformInt;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.level.LevelAccessor;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
public class ParticleUtils {
|
|
public static void spawnParticlesOnBlockFaces(Level level, BlockPos pos, ParticleOptions particle, IntProvider count) {
|
|
for (Direction direction : Direction.values()) {
|
|
spawnParticlesOnBlockFace(level, pos, particle, count, direction, () -> getRandomSpeedRanges(level.random), 0.55);
|
|
}
|
|
}
|
|
|
|
public static void spawnParticlesOnBlockFace(
|
|
Level level, BlockPos pos, ParticleOptions particle, IntProvider count, Direction direction, Supplier<Vec3> speedSupplier, double spread
|
|
) {
|
|
int i = count.sample(level.random);
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
spawnParticleOnFace(level, pos, direction, particle, (Vec3)speedSupplier.get(), spread);
|
|
}
|
|
}
|
|
|
|
private static Vec3 getRandomSpeedRanges(RandomSource random) {
|
|
return new Vec3(Mth.nextDouble(random, -0.5, 0.5), Mth.nextDouble(random, -0.5, 0.5), Mth.nextDouble(random, -0.5, 0.5));
|
|
}
|
|
|
|
public static void spawnParticlesAlongAxis(Direction.Axis axis, Level level, BlockPos pos, double spread, ParticleOptions particle, UniformInt count) {
|
|
Vec3 vec3 = Vec3.atCenterOf(pos);
|
|
boolean bl = axis == Direction.Axis.X;
|
|
boolean bl2 = axis == Direction.Axis.Y;
|
|
boolean bl3 = axis == Direction.Axis.Z;
|
|
int i = count.sample(level.random);
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
double d = vec3.x + Mth.nextDouble(level.random, -1.0, 1.0) * (bl ? 0.5 : spread);
|
|
double e = vec3.y + Mth.nextDouble(level.random, -1.0, 1.0) * (bl2 ? 0.5 : spread);
|
|
double f = vec3.z + Mth.nextDouble(level.random, -1.0, 1.0) * (bl3 ? 0.5 : spread);
|
|
double g = bl ? Mth.nextDouble(level.random, -1.0, 1.0) : 0.0;
|
|
double h = bl2 ? Mth.nextDouble(level.random, -1.0, 1.0) : 0.0;
|
|
double k = bl3 ? Mth.nextDouble(level.random, -1.0, 1.0) : 0.0;
|
|
level.addParticle(particle, d, e, f, g, h, k);
|
|
}
|
|
}
|
|
|
|
public static void spawnParticleOnFace(Level level, BlockPos pos, Direction direction, ParticleOptions particle, Vec3 speed, double spread) {
|
|
Vec3 vec3 = Vec3.atCenterOf(pos);
|
|
int i = direction.getStepX();
|
|
int j = direction.getStepY();
|
|
int k = direction.getStepZ();
|
|
double d = vec3.x + (i == 0 ? Mth.nextDouble(level.random, -0.5, 0.5) : i * spread);
|
|
double e = vec3.y + (j == 0 ? Mth.nextDouble(level.random, -0.5, 0.5) : j * spread);
|
|
double f = vec3.z + (k == 0 ? Mth.nextDouble(level.random, -0.5, 0.5) : k * spread);
|
|
double g = i == 0 ? speed.x() : 0.0;
|
|
double h = j == 0 ? speed.y() : 0.0;
|
|
double l = k == 0 ? speed.z() : 0.0;
|
|
level.addParticle(particle, d, e, f, g, h, l);
|
|
}
|
|
|
|
public static void spawnParticleBelow(Level level, BlockPos pos, RandomSource random, ParticleOptions particle) {
|
|
double d = pos.getX() + random.nextDouble();
|
|
double e = pos.getY() - 0.05;
|
|
double f = pos.getZ() + random.nextDouble();
|
|
level.addParticle(particle, d, e, f, 0.0, 0.0, 0.0);
|
|
}
|
|
|
|
public static void spawnParticleInBlock(LevelAccessor level, BlockPos pos, int count, ParticleOptions particle) {
|
|
double d = 0.5;
|
|
BlockState blockState = level.getBlockState(pos);
|
|
double e = blockState.isAir() ? 1.0 : blockState.getShape(level, pos).max(Direction.Axis.Y);
|
|
spawnParticles(level, pos, count, 0.5, e, true, particle);
|
|
}
|
|
|
|
public static void spawnParticles(LevelAccessor level, BlockPos pos, int count, double xzSpread, double ySpread, boolean allowInAir, ParticleOptions particle) {
|
|
RandomSource randomSource = level.getRandom();
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
double d = randomSource.nextGaussian() * 0.02;
|
|
double e = randomSource.nextGaussian() * 0.02;
|
|
double f = randomSource.nextGaussian() * 0.02;
|
|
double g = 0.5 - xzSpread;
|
|
double h = pos.getX() + g + randomSource.nextDouble() * xzSpread * 2.0;
|
|
double j = pos.getY() + randomSource.nextDouble() * ySpread;
|
|
double k = pos.getZ() + g + randomSource.nextDouble() * xzSpread * 2.0;
|
|
if (allowInAir || !level.getBlockState(BlockPos.containing(h, j, k).below()).isAir()) {
|
|
level.addParticle(particle, h, j, k, d, e, f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void spawnSmashAttackParticles(LevelAccessor level, BlockPos pos, int power) {
|
|
Vec3 vec3 = pos.getCenter().add(0.0, 0.5, 0.0);
|
|
BlockParticleOption blockParticleOption = new BlockParticleOption(ParticleTypes.DUST_PILLAR, level.getBlockState(pos));
|
|
|
|
for (int i = 0; i < power / 3.0F; i++) {
|
|
double d = vec3.x + level.getRandom().nextGaussian() / 2.0;
|
|
double e = vec3.y;
|
|
double f = vec3.z + level.getRandom().nextGaussian() / 2.0;
|
|
double g = level.getRandom().nextGaussian() * 0.2F;
|
|
double h = level.getRandom().nextGaussian() * 0.2F;
|
|
double j = level.getRandom().nextGaussian() * 0.2F;
|
|
level.addParticle(blockParticleOption, d, e, f, g, h, j);
|
|
}
|
|
|
|
for (int i = 0; i < power / 1.5F; i++) {
|
|
double d = vec3.x + 3.5 * Math.cos(i) + level.getRandom().nextGaussian() / 2.0;
|
|
double e = vec3.y;
|
|
double f = vec3.z + 3.5 * Math.sin(i) + level.getRandom().nextGaussian() / 2.0;
|
|
double g = level.getRandom().nextGaussian() * 0.05F;
|
|
double h = level.getRandom().nextGaussian() * 0.05F;
|
|
double j = level.getRandom().nextGaussian() * 0.05F;
|
|
level.addParticle(blockParticleOption, d, e, f, g, h, j);
|
|
}
|
|
}
|
|
}
|