Fixed changeling particles appearing as regular magic particles

This commit is contained in:
Sollace 2020-09-27 17:44:39 +02:00
parent b364111df6
commit e83c552d93
4 changed files with 38 additions and 88 deletions

View file

@ -9,17 +9,30 @@ import com.minelittlepony.unicopia.client.particle.SphereParticle;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry.PendingParticleFactory;
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.SpriteProvider;
import net.minecraft.client.render.entity.FlyingItemEntityRenderer; import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.particle.ParticleEffect;
public interface URenderers { public interface URenderers {
static void bootstrap() { static void bootstrap() {
ParticleFactoryRegistry.getInstance().register(UParticles.UNICORN_MAGIC, MagicParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(UParticles.UNICORN_MAGIC, createFactory(MagicParticle::new));
ParticleFactoryRegistry.getInstance().register(UParticles.CHANGELING_MAGIC, ChangelingMagicParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(UParticles.CHANGELING_MAGIC, createFactory(ChangelingMagicParticle::new));
ParticleFactoryRegistry.getInstance().register(UParticles.RAIN_DROPS, RaindropsParticle.Factory::new); ParticleFactoryRegistry.getInstance().register(UParticles.RAIN_DROPS, createFactory(RaindropsParticle::new));
ParticleFactoryRegistry.getInstance().register(UParticles.SPHERE, SphereParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.SPHERE, SphereParticle::new);
ParticleFactoryRegistry.getInstance().register(UParticles.DISK, DiskParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.DISK, DiskParticle::new);
EntityRendererRegistry.INSTANCE.register(UEntities.THROWN_ITEM, (manager, context) -> new FlyingItemEntityRenderer<>(manager, context.getItemRenderer())); EntityRendererRegistry.INSTANCE.register(UEntities.THROWN_ITEM, (manager, context) -> new FlyingItemEntityRenderer<>(manager, context.getItemRenderer()));
} }
static <T extends ParticleEffect> PendingParticleFactory<T> createFactory(ParticleSupplier<T> supplier) {
return provider -> (effect, world, x, y, z, dx, dy, dz) -> supplier.get(provider, world, x, y, z, dx, dy, dz);
}
interface ParticleSupplier<T extends ParticleEffect> {
Particle get(SpriteProvider provider, ClientWorld world, double x, double y, double z, double dx, double dy, double dz);
}
} }

View file

@ -1,19 +1,14 @@
package com.minelittlepony.unicopia.client.particle; package com.minelittlepony.unicopia.client.particle;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleFactory;
import net.minecraft.client.particle.SpriteProvider; import net.minecraft.client.particle.SpriteProvider;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.particle.DefaultParticleType;
public class ChangelingMagicParticle extends MagicParticle { public class ChangelingMagicParticle extends MagicParticle {
private final SpriteProvider provider; private final SpriteProvider provider;
public ChangelingMagicParticle(SpriteProvider provider, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) { public ChangelingMagicParticle(SpriteProvider provider, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) {
super(world, x, y, z, dx, dy, dz, 1, 1, 1); super(provider, world, x, y, z, dx, dy, dz, 1, 1, 1);
this.provider = provider; this.provider = provider;
float intensity = random.nextFloat() * 0.6F + 0.4F; float intensity = random.nextFloat() * 0.6F + 0.4F;
@ -26,23 +21,6 @@ public class ChangelingMagicParticle extends MagicParticle {
@Override @Override
public void tick() { public void tick() {
setSpriteForAge(provider); setSpriteForAge(provider);
super.tick(); super.tick();
} }
@Environment(EnvType.CLIENT)
public static class Factory implements ParticleFactory<DefaultParticleType> {
private final SpriteProvider provider;
public Factory(SpriteProvider provider) {
this.provider = provider;
}
@Override
public Particle createParticle(DefaultParticleType effect, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) {
MagicParticle particle = new MagicParticle(world, x, y, z, dx, dy, dz);
particle.setSprite(provider);
return particle;
}
}
} }

View file

@ -1,14 +1,8 @@
package com.minelittlepony.unicopia.client.particle; package com.minelittlepony.unicopia.client.particle;
import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleFactory;
import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.ParticleTextureSheet;
import net.minecraft.client.particle.SpriteBillboardParticle; import net.minecraft.client.particle.SpriteBillboardParticle;
import net.minecraft.client.particle.SpriteProvider;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
public class MagicParticle extends SpriteBillboardParticle { public class MagicParticle extends SpriteBillboardParticle {
@ -16,8 +10,10 @@ public class MagicParticle extends SpriteBillboardParticle {
private double startY; private double startY;
private double startZ; private double startZ;
MagicParticle(ClientWorld w, double x, double y, double z, double vX, double vY, double vZ, float r, float g, float b) { MagicParticle(SpriteProvider provider, ClientWorld w, double x, double y, double z, double vX, double vY, double vZ, float r, float g, float b) {
super(w, x, y, z); super(w, x, y, z);
setSprite(provider);
velocityX = vX; velocityX = vX;
velocityY = vY; velocityY = vY;
velocityZ = vZ; velocityZ = vZ;
@ -32,8 +28,8 @@ public class MagicParticle extends SpriteBillboardParticle {
colorBlue = b; colorBlue = b;
} }
MagicParticle(ClientWorld w, double x, double y, double z, double vX, double vY, double vZ) { public MagicParticle(SpriteProvider provider, ClientWorld w, double x, double y, double z, double vX, double vY, double vZ) {
this(w, x, y, z, vX, vY, vZ, 1, 1, 1); this(provider, w, x, y, z, vX, vY, vZ, 1, 1, 1);
colorAlpha = 0.7F; colorAlpha = 0.7F;
colorGreen *= 0.3F; colorGreen *= 0.3F;
@ -67,16 +63,14 @@ public class MagicParticle extends SpriteBillboardParticle {
} }
@Override @Override
public int getColorMultiplier(float p_70070_1_) { public int getColorMultiplier(float tint) {
int i = super.getColorMultiplier(p_70070_1_); int light = super.getColorMultiplier(tint);
float f1 = (float)age / (float)maxAge; float timer = (float)age / (float)maxAge;
f1 *= f1;
f1 *= f1; int v = light >> 16 & 255;
int j = i & 255; v = (int)Math.min(v + Math.pow(timer, 4) * 240, 240);
int k = i >> 16 & 255;
k += f1 * 15 * 16; return (light & 255) | v << 16;
if (k > 240) k = 240;
return j | k << 16;
} }
@Override @Override
@ -85,33 +79,16 @@ public class MagicParticle extends SpriteBillboardParticle {
prevPosY = y; prevPosY = y;
prevPosZ = z; prevPosZ = z;
if (this.age++ >= this.maxAge) { if (age++ >= maxAge) {
this.markDead(); markDead();
} else { } else {
float var1 = (float)age / (float)maxAge; float timer = (float)age / (float)maxAge;
var1 = 1 + var1 - var1 * var1 * 2; timer = 1 + timer - timer * timer * 2;
x = startX + velocityX * var1; x = startX + velocityX * timer;
y = startY + velocityY; y = startY + velocityY;
z = startZ + velocityZ * var1; z = startZ + velocityZ * timer;
} }
} }
@Environment(EnvType.CLIENT)
public static class Factory implements ParticleFactory<MagicParticleEffect> {
private final FabricSpriteProvider provider;
public Factory(FabricSpriteProvider provider) {
this.provider = provider;
}
@Override
public Particle createParticle(MagicParticleEffect effect, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) {
MagicParticle particle = effect.hasTint() ?
new MagicParticle(world, x, y, z, dx, dy, dz, effect.getRed(), effect.getGreen(), effect.getBlue())
: new MagicParticle(world, x, y, z, dx, dy, dz);
particle.setSprite(provider);
return particle;
}
}
} }

View file

@ -1,15 +1,12 @@
package com.minelittlepony.unicopia.client.particle; package com.minelittlepony.unicopia.client.particle;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleFactory;
import net.minecraft.client.particle.RainSplashParticle; import net.minecraft.client.particle.RainSplashParticle;
import net.minecraft.client.particle.SpriteProvider; import net.minecraft.client.particle.SpriteProvider;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.particle.DefaultParticleType;
public class RaindropsParticle extends RainSplashParticle { public class RaindropsParticle extends RainSplashParticle {
public RaindropsParticle(ClientWorld world, double x, double y, double z, double dx, double dy, double dz) { public RaindropsParticle(SpriteProvider provider, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) {
super(world, x, y, z); super(world, x, y, z);
velocityY = -0.1; velocityY = -0.1;
maxAge += 19; maxAge += 19;
@ -25,19 +22,4 @@ public class RaindropsParticle extends RainSplashParticle {
velocityZ *= 0.30000001192092896D; velocityZ *= 0.30000001192092896D;
} }
} }
public static class Factory implements ParticleFactory<DefaultParticleType> {
private final SpriteProvider provider;
public Factory(SpriteProvider provider) {
this.provider = provider;
}
@Override
public Particle createParticle(DefaultParticleType defaultParticleType_1, ClientWorld world, double x, double y, double z, double dx, double dy, double dz) {
RaindropsParticle particle = new RaindropsParticle(world, x, y, z, dx, dy, dz);
particle.setSprite(provider);
return particle;
}
}
} }