Soul animation stages

- Kinda cursed state machine but it works, good start for future iteration
 - Adjust the timings
This commit is contained in:
JozsefA 2021-06-26 15:20:09 -07:00
parent 45fe9ba61c
commit 80f38ef05f
73 changed files with 204 additions and 29 deletions

View file

@ -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) {

View file

@ -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
} }

View file

@ -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;
}
}
} }

View file

@ -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"
] ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B