68 lines
2.3 KiB
Java
68 lines
2.3 KiB
Java
package carpet.helpers;
|
|
|
|
import com.mojang.brigadier.StringReader;
|
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import net.minecraft.commands.arguments.ParticleArgument;
|
|
import net.minecraft.core.particles.ParticleOptions;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.server.level.ServerPlayer;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
public class ParticleDisplay
|
|
{
|
|
private static Map<String, ParticleOptions> particleCache = new HashMap<>();
|
|
|
|
private static ParticleOptions parseParticle(String name)
|
|
{
|
|
try
|
|
{
|
|
return ParticleArgument.readParticle(new StringReader(name));
|
|
}
|
|
catch (CommandSyntaxException e)
|
|
{
|
|
throw new RuntimeException("No such particle: "+name);
|
|
}
|
|
}
|
|
public static ParticleOptions getEffect(String name)
|
|
{
|
|
if (name == null) return null;
|
|
ParticleOptions res = particleCache.get(name);
|
|
if (res != null) return res;
|
|
particleCache.put(name, parseParticle(name));
|
|
return particleCache.get(name);
|
|
}
|
|
|
|
public static void drawParticleLine(ServerPlayer player, Vec3 from, Vec3 to, String main, String accent, int count, double spread)
|
|
{
|
|
ParticleOptions accentParticle = getEffect(accent);
|
|
ParticleOptions mainParticle = getEffect(main);
|
|
|
|
if (accentParticle != null) ((ServerLevel)player.level).sendParticles(
|
|
player,
|
|
accentParticle,
|
|
true,
|
|
to.x, to.y, to.z, count,
|
|
spread, spread, spread, 0.0);
|
|
|
|
double lineLengthSq = from.distanceToSqr(to);
|
|
if (lineLengthSq == 0) return;
|
|
|
|
Vec3 incvec = to.subtract(from).normalize();// multiply(50/sqrt(lineLengthSq));
|
|
int pcount = 0;
|
|
for (Vec3 delta = new Vec3(0.0,0.0,0.0);
|
|
delta.lengthSqr()<lineLengthSq;
|
|
delta = delta.add(incvec.scale(player.level.random.nextFloat())))
|
|
{
|
|
((ServerLevel)player.level).sendParticles(
|
|
player,
|
|
mainParticle,
|
|
true,
|
|
delta.x+from.x, delta.y+from.y, delta.z+from.z, 1,
|
|
0.0, 0.0, 0.0, 0.0);
|
|
}
|
|
}
|
|
|
|
}
|