diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java index d6820cec..ff92997e 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java @@ -44,9 +44,9 @@ public class SphereParticle extends Particle implements Attachment { super(w, x, y, z); this.radius = effect.getRadius(); - this.colorRed = effect.getRed() / 255F; - this.colorGreen = effect.getGreen() / 255F; - this.colorBlue = effect.getBlue() / 255F; + this.colorRed = effect.getColor().getX() / 255F; + this.colorGreen = effect.getColor().getY() / 255F; + this.colorBlue = effect.getColor().getZ() / 255F; this.colorAlpha = effect.getAlpha(); setMaxAge(10); diff --git a/src/main/java/com/minelittlepony/unicopia/particle/DiskParticleEffect.java b/src/main/java/com/minelittlepony/unicopia/particle/DiskParticleEffect.java index da15239e..dd049a15 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/DiskParticleEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/DiskParticleEffect.java @@ -3,35 +3,23 @@ package com.minelittlepony.unicopia.particle; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; import net.minecraft.network.PacketByteBuf; +import net.minecraft.particle.ParticleType; +import net.minecraft.util.math.Vec3f; public class DiskParticleEffect extends SphereParticleEffect { - public static final ParticleEffect.Factory FACTORY = new ParticleEffect.Factory() { - @Override - public DiskParticleEffect read(ParticleType particleType, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - float g = (float)reader.readDouble(); - reader.expect(' '); - float h = (float)reader.readDouble(); - reader.expect(' '); - float i = (float)reader.readDouble(); - reader.expect(' '); - float j = (float)reader.readDouble(); - reader.expect(' '); - float k = (float)reader.readDouble(); - return new DiskParticleEffect(g, h, i, j, k); - } + public static final Factory FACTORY = ParticleFactoryHelper.of(DiskParticleEffect::new, DiskParticleEffect::new); - @Override - public DiskParticleEffect read(ParticleType particleType, PacketByteBuf buf) { - return new DiskParticleEffect(buf.readFloat(), buf.readFloat(), buf.readFloat(), buf.readFloat(), buf.readFloat()); - } - }; + protected DiskParticleEffect(ParticleType type, StringReader reader) throws CommandSyntaxException { + super(type, reader); + } - public DiskParticleEffect(float red, float green, float blue, float alpha, float rad) { - super(red, green, blue, alpha, rad); + protected DiskParticleEffect(ParticleType type, PacketByteBuf buf) { + super(type, buf); + } + + public DiskParticleEffect(Vec3f color, float alpha, float rad) { + super(color, alpha, rad); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/particle/FollowingParticleEffect.java b/src/main/java/com/minelittlepony/unicopia/particle/FollowingParticleEffect.java index 34cdf3c0..defb2ddf 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/FollowingParticleEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/FollowingParticleEffect.java @@ -13,25 +13,7 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.World; public class FollowingParticleEffect implements ParticleEffect { - public static final ParticleEffect.Factory FACTORY = new ParticleEffect.Factory<>() { - @Override - public FollowingParticleEffect read(ParticleType type, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - double x = reader.readDouble(); - reader.expect(' '); - double y = reader.readDouble(); - reader.expect(' '); - double z = reader.readDouble(); - reader.expect(' '); - float speed = reader.readFloat(); - return new FollowingParticleEffect(type, -1, new Vec3d(x, y, z), speed); - } - - @Override - public FollowingParticleEffect read(ParticleType particleType, PacketByteBuf buf) { - return new FollowingParticleEffect(particleType, buf.readInt(), new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()), buf.readFloat()); - } - }; + public static final Factory FACTORY = ParticleFactoryHelper.of(FollowingParticleEffect::new, FollowingParticleEffect::new); private final ParticleType type; @@ -41,6 +23,14 @@ public class FollowingParticleEffect implements ParticleEffect { private final float followSpeed; + protected FollowingParticleEffect(ParticleType type, StringReader reader) throws CommandSyntaxException { + this(type, -1, ParticleFactoryHelper.readVector(reader), ParticleFactoryHelper.readFloat(reader)); + } + + protected FollowingParticleEffect(ParticleType particleType, PacketByteBuf buf) { + this(particleType, buf.readInt(), new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()), buf.readFloat()); + } + public FollowingParticleEffect(ParticleType type, Vec3d target, float followSpeed) { this.type = type; this.fixedTarget = target; diff --git a/src/main/java/com/minelittlepony/unicopia/particle/MagicParticleEffect.java b/src/main/java/com/minelittlepony/unicopia/particle/MagicParticleEffect.java index 6dbd9af2..5a468fd0 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/MagicParticleEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/MagicParticleEffect.java @@ -6,69 +6,47 @@ import com.minelittlepony.common.util.Color; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.particle.AbstractDustParticleEffect; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.Vec3f; import net.minecraft.util.registry.Registry; public class MagicParticleEffect implements ParticleEffect { - - public static final MagicParticleEffect UNICORN = new MagicParticleEffect(false, 0, 0, 0); - public static final ParticleEffect.Factory FACTORY = new ParticleEffect.Factory() { - @Override - public MagicParticleEffect read(ParticleType particleType, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - boolean f = reader.readBoolean(); - reader.expect(' '); - float g = (float)reader.readDouble(); - reader.expect(' '); - float h = (float)reader.readDouble(); - reader.expect(' '); - float i = (float)reader.readDouble(); - return new MagicParticleEffect(f, g, h, i); - } - - @Override - public MagicParticleEffect read(ParticleType particleType, PacketByteBuf buf) { - return new MagicParticleEffect(buf.readBoolean(), buf.readFloat(), buf.readFloat(), buf.readFloat()); - } - }; + public static final MagicParticleEffect UNICORN = new MagicParticleEffect(false, Vec3f.ZERO); + public static final ParticleEffect.Factory FACTORY = ParticleFactoryHelper.of(MagicParticleEffect::new, MagicParticleEffect::new); private final boolean tinted; - private final float red; - private final float green; - private final float blue; + private final Vec3f color; + + protected MagicParticleEffect(ParticleType particleType, StringReader reader) throws CommandSyntaxException { + this(ParticleFactoryHelper.readBoolean(reader), AbstractDustParticleEffect.readColor(reader)); + } + + protected MagicParticleEffect(ParticleType particleType, PacketByteBuf buf) { + this(buf.readBoolean(), AbstractDustParticleEffect.readColor(buf)); + } public MagicParticleEffect(int tint) { - this(true, Color.r(tint), Color.g(tint), Color.b(tint)); + this(true, new Vec3f(Color.r(tint), Color.g(tint), Color.b(tint))); } - public MagicParticleEffect(float r, float g, float b) { - this(true, r, g, b); + public MagicParticleEffect(Vec3f color) { + this(true, color); } - protected MagicParticleEffect(boolean tint, float r, float g, float b) { + protected MagicParticleEffect(boolean tint, Vec3f color) { tinted = tint; - red = r; - green = g; - blue = b; + this.color = color; } - public boolean hasTint() { return tinted; } - public float getRed() { - return red; - } - - public float getGreen() { - return green; - } - - public float getBlue() { - return blue; + public Vec3f getColor() { + return color; } @Override @@ -79,14 +57,14 @@ public class MagicParticleEffect implements ParticleEffect { @Override public void write(PacketByteBuf buf) { buf.writeBoolean(tinted); - buf.writeFloat(red); - buf.writeFloat(green); - buf.writeFloat(blue); + buf.writeFloat(color.getX()); + buf.writeFloat(color.getY()); + buf.writeFloat(color.getZ()); } @Override public String asString() { - return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(getType()), red, green, blue); + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(getType()), color.getX(), color.getY(), color.getZ()); } } diff --git a/src/main/java/com/minelittlepony/unicopia/particle/OrientedBillboardParticleEffect.java b/src/main/java/com/minelittlepony/unicopia/particle/OrientedBillboardParticleEffect.java index df4c9371..6297efbe 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/OrientedBillboardParticleEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/OrientedBillboardParticleEffect.java @@ -12,23 +12,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; public class OrientedBillboardParticleEffect implements ParticleEffect { - public static final ParticleEffect.Factory FACTORY = new ParticleEffect.Factory() { - @Override - public OrientedBillboardParticleEffect read(ParticleType type, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - boolean fixed = reader.readBoolean(); - reader.expect(' '); - float yaw = (float)reader.readDouble(); - reader.expect(' '); - float pitch = (float)reader.readDouble(); - return new OrientedBillboardParticleEffect(type, fixed, yaw, pitch); - } - - @Override - public OrientedBillboardParticleEffect read(ParticleType particleType, PacketByteBuf buf) { - return new OrientedBillboardParticleEffect(particleType, buf.readBoolean(), buf.readFloat(), buf.readFloat()); - } - }; + public static final ParticleEffect.Factory FACTORY = ParticleFactoryHelper.of(OrientedBillboardParticleEffect::new, OrientedBillboardParticleEffect::new); private final boolean fixed; private final float yaw; @@ -36,6 +20,14 @@ public class OrientedBillboardParticleEffect implements ParticleEffect { private final ParticleType type; + protected OrientedBillboardParticleEffect(ParticleType type, StringReader reader) throws CommandSyntaxException { + this(type, ParticleFactoryHelper.readBoolean(reader), ParticleFactoryHelper.readFloat(reader), ParticleFactoryHelper.readFloat(reader)); + } + + protected OrientedBillboardParticleEffect(ParticleType particleType, PacketByteBuf buf) { + this(particleType, buf.readBoolean(), buf.readFloat(), buf.readFloat()); + } + public OrientedBillboardParticleEffect(ParticleType type, Vec3d orientation) { this(type, (float)orientation.getX(), (float)orientation.getY()); } diff --git a/src/main/java/com/minelittlepony/unicopia/particle/ParticleFactoryHelper.java b/src/main/java/com/minelittlepony/unicopia/particle/ParticleFactoryHelper.java new file mode 100644 index 00000000..2a227231 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/particle/ParticleFactoryHelper.java @@ -0,0 +1,51 @@ +package com.minelittlepony.unicopia.particle; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import net.minecraft.network.PacketByteBuf; +import net.minecraft.particle.ParticleEffect; +import net.minecraft.particle.ParticleType; +import net.minecraft.util.math.Vec3d; + +public interface ParticleFactoryHelper { + + static Vec3d readVector(StringReader reader) throws CommandSyntaxException { + return new Vec3d(readDouble(reader), readDouble(reader), readDouble(reader)); + } + + static boolean readBoolean(StringReader reader) throws CommandSyntaxException { + reader.expect(' '); + return reader.readBoolean(); + } + + static double readDouble(StringReader reader) throws CommandSyntaxException { + reader.expect(' '); + return reader.readDouble(); + } + static float readFloat(StringReader reader) throws CommandSyntaxException { + reader.expect(' '); + return reader.readFloat(); + } + + static ParticleEffect.Factory of(CommandReader commandReader, PacketReader packetReader) { + return new ParticleEffect.Factory<>() { + @Override + public T read(ParticleType type, StringReader reader) throws CommandSyntaxException { + return commandReader.read(type, reader); + } + @Override + public T read(ParticleType type, PacketByteBuf buf) { + return packetReader.read(type, buf); + } + }; + } + + interface CommandReader { + T read(ParticleType type, StringReader reader) throws CommandSyntaxException; + } + + interface PacketReader { + T read(ParticleType type, PacketByteBuf buf); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/particle/SphereParticleEffect.java b/src/main/java/com/minelittlepony/unicopia/particle/SphereParticleEffect.java index 7faf8f43..e85f06a0 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/SphereParticleEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/SphereParticleEffect.java @@ -6,62 +6,40 @@ import com.minelittlepony.common.util.Color; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.particle.AbstractDustParticleEffect; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.Vec3f; import net.minecraft.util.registry.Registry; public class SphereParticleEffect implements ParticleEffect { - public static final ParticleEffect.Factory FACTORY = new ParticleEffect.Factory() { - @Override - public SphereParticleEffect read(ParticleType particleType, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - float g = (float)reader.readDouble(); - reader.expect(' '); - float h = (float)reader.readDouble(); - reader.expect(' '); - float i = (float)reader.readDouble(); - reader.expect(' '); - float j = (float)reader.readDouble(); - reader.expect(' '); - float k = (float)reader.readDouble(); - return new SphereParticleEffect(g, h, i, j, k); - } + public static final Factory FACTORY = ParticleFactoryHelper.of(SphereParticleEffect::new, SphereParticleEffect::new); - @Override - public SphereParticleEffect read(ParticleType particleType, PacketByteBuf buf) { - return new SphereParticleEffect(buf.readFloat(), buf.readFloat(), buf.readFloat(), buf.readFloat(), buf.readFloat()); - } - }; - - private final float red; - private final float green; - private final float blue; + private final Vec3f color; private final float alpha; private final float radius; - public SphereParticleEffect(int tint, float alpha, float rad) { - this(Color.r(tint), Color.g(tint), Color.b(tint), alpha, rad); + protected SphereParticleEffect(ParticleType type, StringReader reader) throws CommandSyntaxException { + this(AbstractDustParticleEffect.readColor(reader), ParticleFactoryHelper.readFloat(reader), ParticleFactoryHelper.readFloat(reader)); } - public SphereParticleEffect(float red, float green, float blue, float alpha, float rad) { - this.red = red; - this.green = green; - this.blue = blue; + protected SphereParticleEffect(ParticleType type, PacketByteBuf buf) { + this(AbstractDustParticleEffect.readColor(buf), buf.readFloat(), buf.readFloat()); + } + + public SphereParticleEffect(int tint, float alpha, float rad) { + this(new Vec3f(Color.r(tint), Color.g(tint), Color.b(tint)), alpha, rad); + } + + public SphereParticleEffect(Vec3f color, float alpha, float rad) { + this.color = color; this.alpha = alpha; this.radius = rad; } - public float getRed() { - return red; - } - - public float getGreen() { - return green; - } - - public float getBlue() { - return blue; + public Vec3f getColor() { + return color; } public float getAlpha() { @@ -79,16 +57,15 @@ public class SphereParticleEffect implements ParticleEffect { @Override public void write(PacketByteBuf buf) { - buf.writeFloat(red); - buf.writeFloat(green); - buf.writeFloat(blue); + buf.writeFloat(color.getX()); + buf.writeFloat(color.getY()); + buf.writeFloat(color.getZ()); buf.writeFloat(alpha); buf.writeFloat(radius); } @Override public String asString() { - return String.format(Locale.ROOT, "%s %.2f %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(getType()), red, green, blue, alpha, radius); + return String.format(Locale.ROOT, "%s %.2f %.2f %.2f %.2f", Registry.PARTICLE_TYPE.getId(getType()), color.getX(), color.getY(), color.getZ(), alpha, radius); } - }