Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/data/Animation.java
T

274 lines
6.7 KiB
Java
Raw Normal View History

package noppes.npcs.controllers.data;
2023-02-06 23:17:05 -06:00
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import noppes.npcs.api.handler.data.IAnimation;
import noppes.npcs.api.handler.data.IFrame;
import noppes.npcs.constants.EnumAnimationPart;
import noppes.npcs.controllers.AnimationController;
import java.util.ArrayList;
public class Animation implements IAnimation {
public AnimationData parent; //Client-sided only
2023-11-05 21:28:49 -05:00
public int id = -1; // Only for internal usage
2023-02-06 23:17:05 -06:00
public ArrayList<Frame> frames = new ArrayList<>();
public int currentFrame = 0;
public int currentFrameTime = 0;
public String name = "";
public float speed = 1.0F;
public byte smooth = 0;
2023-01-25 22:05:11 -06:00
public int loop = -1; //If greater than 0 and less than the amount of frames, the animation will begin looping when it reaches this frame.
2024-08-22 16:47:45 -04:00
public boolean renderTicks = false; // If true, MC ticks are used. If false, render ticks are used.
public boolean whileStanding = true;
public boolean whileAttacking = true;
public boolean whileMoving = true;
2023-02-06 23:17:05 -06:00
//Client-sided
public boolean paused;
2023-01-12 19:40:06 -05:00
public Animation(){}
public Animation(int id, String name){
this.name = name;
this.id = id;
}
public Animation(int id, String name, float speed, byte smooth){
this.name = name;
this.speed = speed;
this.smooth = smooth;
this.id = id;
}
public IFrame currentFrame() {
return currentFrame < frames.size() ? frames.get(currentFrame) : null;
}
public IFrame[] getFrames() {
return frames.toArray(new Frame[0]);
}
public IAnimation setFrames(IFrame[] frames) {
this.clearFrames();
for (IFrame frame : frames) {
this.frames.add((Frame) frame);
}
return this;
}
public IAnimation clearFrames() {
this.frames.clear();
return this;
}
public IAnimation addFrame(IFrame frame) {
this.frames.add((Frame) frame);
return this;
}
public IAnimation addFrame(int index, IFrame frame) {
this.frames.add(index, (Frame) frame);
return this;
}
public IAnimation removeFrame(IFrame frame) {
this.frames.remove((Frame) frame);
return this;
}
public IAnimation setName(String name) {
this.name = name;
return this;
}
public String getName() {
return this.name;
}
public IAnimation setSpeed(float speed) {
this.speed = speed;
return this;
}
public float getSpeed() {
return this.speed;
}
public IAnimation setSmooth(byte smooth) {
this.smooth = smooth;
return this;
}
public byte isSmooth() {
return this.smooth;
}
2024-08-22 16:47:45 -04:00
public IAnimation useRenderTicks(boolean renderTicks) {
this.renderTicks = renderTicks;
return this;
}
public boolean useRenderTicks() {
return this.renderTicks;
}
public IAnimation doWhileStanding(boolean whileStanding) {
this.whileStanding = whileStanding;
return this;
}
public boolean doWhileStanding() {
return this.whileStanding;
}
public IAnimation doWhileMoving(boolean whileMoving) {
this.whileMoving = whileMoving;
return this;
}
public boolean doWhileMoving() {
return this.whileMoving;
}
public IAnimation doWhileAttacking(boolean whileAttacking) {
this.whileAttacking = whileAttacking;
return this;
}
public boolean doWhileAttacking() {
return this.whileAttacking;
}
2023-01-25 22:05:11 -06:00
public IAnimation setLoop(int loopAtFrame) {
this.loop = loopAtFrame;
return this;
}
public int loop() {
return this.loop;
}
public IAnimation save() {
2023-06-05 22:12:48 -04:00
return AnimationController.Instance.saveAnimation(this);
}
@Override
public int getID() {
return id;
}
@Override
public void setID(int newID) {
id = newID;
}
public void readFromNBT(NBTTagCompound compound){
2023-11-06 20:53:21 -05:00
if(compound.hasKey("ID")){
id = compound.getInteger("ID");
}
else if (AnimationController.Instance != null) {
2023-11-06 20:53:21 -05:00
id = AnimationController.Instance.getUnusedId();
}
name = compound.getString("Name");
speed = compound.getFloat("Speed");
smooth = compound.getByte("Smooth");
2023-01-25 22:05:11 -06:00
loop = compound.getInteger("Loop");
2024-08-22 16:47:45 -04:00
renderTicks = compound.getBoolean("RenderTicks");
2024-03-24 03:56:14 -05:00
ArrayList<Frame> frames = new ArrayList<Frame>();
NBTTagList list = compound.getTagList("Frames", 10);
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound item = list.getCompoundTagAt(i);
Frame frame = new Frame();
frame.parent = this;
frame.readFromNBT(item);
frames.add(frame);
}
this.frames = frames;
this.whileStanding = compound.getBoolean("WhileStanding");
this.whileMoving = compound.getBoolean("WhileWalking");
this.whileAttacking = compound.getBoolean("WhileAttacking");
}
public NBTTagCompound writeToNBT(){
NBTTagCompound compound = new NBTTagCompound();
compound.setInteger("ID", id);
compound.setString("Name", name);
compound.setFloat("Speed", speed);
compound.setByte("Smooth", smooth);
2023-01-25 22:05:11 -06:00
compound.setInteger("Loop",loop);
2024-08-22 16:47:45 -04:00
compound.setBoolean("RenderTicks", renderTicks);
NBTTagList list = new NBTTagList();
for(Frame frame : frames){
NBTTagCompound item = frame.writeToNBT();
list.appendTag(item);
}
compound.setTag("Frames", list);
compound.setBoolean("WhileStanding", whileStanding);
compound.setBoolean("WhileWalking", whileMoving);
compound.setBoolean("WhileAttacking", whileAttacking);
return compound;
}
2024-08-22 16:47:45 -04:00
@SideOnly(Side.CLIENT)
public void increaseTime() {
2023-02-06 23:17:05 -06:00
if (paused)
2024-08-22 16:47:45 -04:00
return;
2023-02-06 23:17:05 -06:00
if (this.parent != null && this.currentFrame < this.frames.size()) {
this.parent.finishedFrame = this.currentFrame;
}
this.currentFrameTime++;
2024-08-22 16:47:45 -04:00
if (this.currentFrameTime == this.currentFrame().getDuration()) {
Frame prevFrame = (Frame) this.currentFrame();
2023-01-25 22:05:11 -06:00
Frame nextFrame = null;
this.currentFrameTime = 0;
this.currentFrame++;
if (this.currentFrame < this.frames.size()) {
2023-01-25 22:05:11 -06:00
nextFrame = this.frames.get(this.currentFrame);
} else if (this.loop >= 0 && this.loop < this.frames.size()) {
this.currentFrame = this.loop;
}
if (nextFrame != null) {
for (EnumAnimationPart part : EnumAnimationPart.values()) {
if (prevFrame.frameParts.containsKey(part) && nextFrame.frameParts.containsKey(part)) {
nextFrame.frameParts.get(part).prevRotations = prevFrame.frameParts.get(part).prevRotations;
nextFrame.frameParts.get(part).prevPivots = prevFrame.frameParts.get(part).prevPivots;
}
}
} else if (this.parent != null && this.currentFrame > this.loop) {
2024-08-22 16:47:45 -04:00
this.parent.finishedTime = this.parent.animationEntity.getAge();
}
}
}
@SideOnly(Side.CLIENT)
public void jumpToCurrentFrame() {
2024-08-22 16:47:45 -04:00
this.currentFrameTime = 0;
Frame frame = (Frame) this.currentFrame();
if(frame != null){
for (EnumAnimationPart part : EnumAnimationPart.values()) {
if(part != null){
if (frame.frameParts.containsKey(part)) {
frame.frameParts.get(part).jumpToCurrentFrame();
}
}
}
}
}
}