Soul animation stages
- Kinda cursed state machine but it works, good start for future iteration - Adjust the timings
|
@ -14,15 +14,15 @@ import net.minecraft.util.math.vector.Vector3f;
|
||||||
public class CustomRotationParticle extends SimpleAnimatedParticle {
|
public class CustomRotationParticle extends SimpleAnimatedParticle {
|
||||||
|
|
||||||
protected boolean mirror;
|
protected boolean mirror;
|
||||||
protected int loopTicks;
|
protected int loopLength;
|
||||||
|
|
||||||
public CustomRotationParticle(ClientWorld worldIn, double x, double y, double z, IAnimatedSprite spriteSet, float yAccel) {
|
public CustomRotationParticle(ClientWorld worldIn, double x, double y, double z, IAnimatedSprite spriteSet, float yAccel) {
|
||||||
super(worldIn, x, y, z, spriteSet, yAccel);
|
super(worldIn, x, y, z, spriteSet, yAccel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectSpriteLoopingWithAge(IAnimatedSprite sprite) {
|
public void selectSpriteLoopingWithAge(IAnimatedSprite sprite) {
|
||||||
int loopFrame = age % loopTicks;
|
int loopFrame = age % loopLength;
|
||||||
this.setSprite(sprite.get(loopFrame, loopTicks));
|
this.setSprite(sprite.get(loopFrame, loopLength));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) {
|
public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) {
|
||||||
|
|
|
@ -20,8 +20,8 @@ public class SoulBaseParticle extends CustomRotationParticle {
|
||||||
this.animatedSprite = spriteSet;
|
this.animatedSprite = spriteSet;
|
||||||
this.particleScale = 0.5f;
|
this.particleScale = 0.5f;
|
||||||
this.setSize(this.particleScale,this.particleScale);
|
this.setSize(this.particleScale,this.particleScale);
|
||||||
this.loopTicks = 16 + (int) (this.rand.nextFloat() * 2f - 1f);
|
this.loopLength = 16 + (int) (this.rand.nextFloat() * 2f - 1f);
|
||||||
this.maxAge = (int)(64.0F / (this.rand.nextFloat() * 0.36F + 0.64F));
|
this.maxAge = (int)(90.0F / (this.rand.nextFloat() * 0.36F + 0.64F));
|
||||||
this.selectSpriteLoopingWithAge(animatedSprite);
|
this.selectSpriteLoopingWithAge(animatedSprite);
|
||||||
this.field_21507 = true; // disable movement
|
this.field_21507 = true; // disable movement
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,26 +13,59 @@ public class SoulParticle extends CustomRotationParticle {
|
||||||
|
|
||||||
private final IAnimatedSprite animatedSprite;
|
private final IAnimatedSprite animatedSprite;
|
||||||
|
|
||||||
|
protected int startTicks;
|
||||||
|
protected int endTicks;
|
||||||
|
protected int numLoops;
|
||||||
|
|
||||||
|
protected int firstStartFrame = 0;
|
||||||
|
protected int startFrames = 17;
|
||||||
|
|
||||||
|
protected int firstLoopFrame = 17;
|
||||||
|
protected int loopFrames = 16;
|
||||||
|
|
||||||
|
protected int firstEndFrame = 33;
|
||||||
|
protected int endFrames = 20;
|
||||||
|
|
||||||
|
protected int totalFrames = 53;
|
||||||
|
|
||||||
|
protected int ticksPerFrame = 2;
|
||||||
|
|
||||||
|
protected AnimationStage animationStage;
|
||||||
|
|
||||||
public SoulParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz,
|
public SoulParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz,
|
||||||
IAnimatedSprite spriteSet) {
|
IAnimatedSprite spriteSet) {
|
||||||
super(worldIn, x, y, z, spriteSet, 0);
|
super(worldIn, x, y, z, spriteSet, 0);
|
||||||
this.animatedSprite = spriteSet;
|
this.animatedSprite = spriteSet;
|
||||||
this.particleScale = 0.5f;
|
this.particleScale = 0.5f;
|
||||||
this.setSize(this.particleScale,this.particleScale);
|
this.setSize(this.particleScale, this.particleScale);
|
||||||
this.loopTicks = 16 + (int) (this.rand.nextFloat() * 4f - 2f);
|
|
||||||
this.maxAge = (int)(64.0F / (this.rand.nextFloat() * 0.36F + 0.64F));
|
this.loopLength = loopFrames + (int) (this.rand.nextFloat() * 4f - 2f);
|
||||||
this.selectSpriteLoopingWithAge(animatedSprite);
|
this.startTicks = startFrames + (int) (this.rand.nextFloat() * 4f - 2f);
|
||||||
|
this.endTicks = endFrames + (int) (this.rand.nextFloat() * 4f - 2f);
|
||||||
|
this.numLoops = (int)(3.0F / (this.rand.nextFloat() * 0.36F + 0.64F));
|
||||||
|
|
||||||
|
this.setFrame(0);
|
||||||
this.field_21507 = true; // disable movement
|
this.field_21507 = true; // disable movement
|
||||||
this.mirror = this.rand.nextBoolean();
|
this.mirror = this.rand.nextBoolean();
|
||||||
|
|
||||||
|
this.animationStage = new StartAnimation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
if (this.age++ >= this.maxAge) {
|
|
||||||
|
this.animationStage.tick();
|
||||||
|
|
||||||
|
this.animationStage = animationStage.getNext();
|
||||||
|
|
||||||
|
if (animationStage == null)
|
||||||
this.setExpired();
|
this.setExpired();
|
||||||
} else {
|
|
||||||
this.selectSpriteLoopingWithAge(animatedSprite);
|
}
|
||||||
}
|
|
||||||
|
public void setFrame(int frame) {
|
||||||
|
if (frame >= 0 && frame < totalFrames)
|
||||||
|
this.setSprite(animatedSprite.get(frame, totalFrames));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,4 +83,107 @@ public class SoulParticle extends CustomRotationParticle {
|
||||||
return AllParticleTypes.SOUL.get();
|
return AllParticleTypes.SOUL.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static abstract class AnimationStage {
|
||||||
|
|
||||||
|
protected final SoulParticle particle;
|
||||||
|
|
||||||
|
protected int ticks;
|
||||||
|
protected int animAge;
|
||||||
|
|
||||||
|
public AnimationStage(SoulParticle particle) {
|
||||||
|
this.particle = particle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tick() {
|
||||||
|
ticks++;
|
||||||
|
|
||||||
|
if (ticks % particle.ticksPerFrame == 0)
|
||||||
|
animAge++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getAnimAge() {
|
||||||
|
return (float) animAge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract AnimationStage getNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class StartAnimation extends AnimationStage {
|
||||||
|
|
||||||
|
public StartAnimation(SoulParticle particle) {
|
||||||
|
super(particle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
|
particle.setFrame(particle.firstStartFrame + (int) (getAnimAge() / (float) particle.startTicks * particle.startFrames));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnimationStage getNext() {
|
||||||
|
if (animAge < particle.startTicks)
|
||||||
|
return this;
|
||||||
|
else
|
||||||
|
return new LoopAnimation(particle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LoopAnimation extends AnimationStage {
|
||||||
|
|
||||||
|
int loops;
|
||||||
|
|
||||||
|
public LoopAnimation(SoulParticle particle) {
|
||||||
|
super(particle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
|
int loopTick = getLoopTick();
|
||||||
|
|
||||||
|
if (loopTick == 0) loops++;
|
||||||
|
|
||||||
|
particle.setFrame(particle.firstLoopFrame + loopTick);//(int) (((float) loopTick / (float) particle.loopLength) * particle.loopFrames));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getLoopTick() {
|
||||||
|
return animAge % particle.loopFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnimationStage getNext() {
|
||||||
|
if (loops <= particle.numLoops)
|
||||||
|
return this;
|
||||||
|
else
|
||||||
|
return new EndAnimation(particle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class EndAnimation extends AnimationStage {
|
||||||
|
|
||||||
|
public EndAnimation(SoulParticle particle) {
|
||||||
|
super(particle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
|
||||||
|
particle.setFrame(particle.firstEndFrame + (int) ((getAnimAge() / (float) particle.endTicks) * particle.endFrames));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnimationStage getNext() {
|
||||||
|
if (animAge < particle.endTicks)
|
||||||
|
return this;
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,59 @@
|
||||||
{
|
{
|
||||||
"textures": [
|
"textures": [
|
||||||
"create:soul_particle_0",
|
"create:soul_sprite_start_1",
|
||||||
"create:soul_particle_1",
|
"create:soul_sprite_start_2",
|
||||||
"create:soul_particle_2",
|
"create:soul_sprite_start_3",
|
||||||
"create:soul_particle_3",
|
"create:soul_sprite_start_4",
|
||||||
"create:soul_particle_4",
|
"create:soul_sprite_start_5",
|
||||||
"create:soul_particle_5",
|
"create:soul_sprite_start_6",
|
||||||
"create:soul_particle_6",
|
"create:soul_sprite_start_7",
|
||||||
"create:soul_particle_7",
|
"create:soul_sprite_start_8",
|
||||||
"create:soul_particle_8",
|
"create:soul_sprite_start_9",
|
||||||
"create:soul_particle_9",
|
"create:soul_sprite_start_10",
|
||||||
"create:soul_particle_10",
|
"create:soul_sprite_start_11",
|
||||||
"create:soul_particle_11",
|
"create:soul_sprite_start_12",
|
||||||
"create:soul_particle_12",
|
"create:soul_sprite_start_13",
|
||||||
"create:soul_particle_13",
|
"create:soul_sprite_start_14",
|
||||||
"create:soul_particle_14",
|
"create:soul_sprite_start_15",
|
||||||
"create:soul_particle_15"
|
"create:soul_sprite_start_16",
|
||||||
|
"create:soul_sprite_start_17",
|
||||||
|
|
||||||
|
"create:soul_sprite_anim_1",
|
||||||
|
"create:soul_sprite_anim_2",
|
||||||
|
"create:soul_sprite_anim_3",
|
||||||
|
"create:soul_sprite_anim_4",
|
||||||
|
"create:soul_sprite_anim_5",
|
||||||
|
"create:soul_sprite_anim_6",
|
||||||
|
"create:soul_sprite_anim_7",
|
||||||
|
"create:soul_sprite_anim_8",
|
||||||
|
"create:soul_sprite_anim_9",
|
||||||
|
"create:soul_sprite_anim_10",
|
||||||
|
"create:soul_sprite_anim_11",
|
||||||
|
"create:soul_sprite_anim_12",
|
||||||
|
"create:soul_sprite_anim_13",
|
||||||
|
"create:soul_sprite_anim_14",
|
||||||
|
"create:soul_sprite_anim_15",
|
||||||
|
"create:soul_sprite_anim_16",
|
||||||
|
|
||||||
|
"create:soul_sprite_end_1",
|
||||||
|
"create:soul_sprite_end_2",
|
||||||
|
"create:soul_sprite_end_3",
|
||||||
|
"create:soul_sprite_end_4",
|
||||||
|
"create:soul_sprite_end_5",
|
||||||
|
"create:soul_sprite_end_6",
|
||||||
|
"create:soul_sprite_end_7",
|
||||||
|
"create:soul_sprite_end_8",
|
||||||
|
"create:soul_sprite_end_9",
|
||||||
|
"create:soul_sprite_end_10",
|
||||||
|
"create:soul_sprite_end_11",
|
||||||
|
"create:soul_sprite_end_12",
|
||||||
|
"create:soul_sprite_end_13",
|
||||||
|
"create:soul_sprite_end_14",
|
||||||
|
"create:soul_sprite_end_15",
|
||||||
|
"create:soul_sprite_end_16",
|
||||||
|
"create:soul_sprite_end_17",
|
||||||
|
"create:soul_sprite_end_18",
|
||||||
|
"create:soul_sprite_end_19",
|
||||||
|
"create:soul_sprite_end_20"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 351 B |
Before Width: | Height: | Size: 367 B |
Before Width: | Height: | Size: 376 B |
Before Width: | Height: | Size: 331 B |
Before Width: | Height: | Size: 311 B |
Before Width: | Height: | Size: 294 B |
Before Width: | Height: | Size: 320 B |
Before Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 305 B |
Before Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 327 B |
Before Width: | Height: | Size: 307 B |
Before Width: | Height: | Size: 323 B |
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 290 B |
After Width: | Height: | Size: 294 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 264 B |
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 267 B |
After Width: | Height: | Size: 263 B |
After Width: | Height: | Size: 252 B |
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 250 B |
After Width: | Height: | Size: 249 B |
After Width: | Height: | Size: 254 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 237 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 233 B |
After Width: | Height: | Size: 235 B |
After Width: | Height: | Size: 192 B |
After Width: | Height: | Size: 176 B |
After Width: | Height: | Size: 154 B |
After Width: | Height: | Size: 148 B |
After Width: | Height: | Size: 141 B |
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 133 B |
After Width: | Height: | Size: 267 B |
After Width: | Height: | Size: 263 B |
After Width: | Height: | Size: 251 B |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 242 B |
After Width: | Height: | Size: 241 B |
After Width: | Height: | Size: 133 B |
After Width: | Height: | Size: 254 B |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 290 B |
After Width: | Height: | Size: 294 B |
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 264 B |
After Width: | Height: | Size: 151 B |
After Width: | Height: | Size: 162 B |
After Width: | Height: | Size: 182 B |
After Width: | Height: | Size: 200 B |
After Width: | Height: | Size: 209 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 246 B |