package tc.oc.commons.bukkit.hologram.content;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
/**
* Represents an immutable multi-{@link tc.oc.commons.bukkit.hologram.content.HologramFrame} animation that may be
* displayed by a {@link tc.oc.commons.bukkit.hologram.Hologram}.
*/
public class HologramAnimation implements HologramContent {
public static boolean DEFAULT_LOOP = true;
public static long DEFAULT_FRAME_DELAY = 1;
public static long DEFAULT_START_DELAY = 0;
public static long DEFAULT_END_DELAY = 0;
private final ImmutableList<HologramFrame> frames;
private final int maxHeight;
private final boolean loop;
private final long frameDelay;
private final long startDelay;
private final long endDelay;
/**
* Creates a new animation with the specified parameters.
*
* @param loop Whether or not to loop the animation at its conclusion.
* @param frameDelay The delay, in ticks.
* @param frames The frames to be displayed.
*/
public HologramAnimation(boolean loop, long frameDelay, long startDelay, long endDelay, HologramFrame... frames) {
Preconditions.checkArgument(frameDelay >= 1, "Tick delay must be at least 1 (was {0})", frameDelay);
Preconditions.checkNotNull(frames, "Frames");
Preconditions.checkArgument(frames.length > 1, "Frame count must be greater than 1 (was {0})", frames.length);
this.frames = ImmutableList.copyOf(frames);
int largest = 0;
for (HologramFrame frame : this.frames) {
largest = Math.max(largest, frame.getHeight());
}
this.maxHeight = largest;
this.loop = loop;
this.frameDelay = frameDelay;
this.startDelay = startDelay;
this.endDelay = endDelay;
}
/**
* Creates a new animation with the specified parameters and the default tick delay.
*
* @param loop Whether or not to loop the animation at its conclusion.
* @param frames The frames to be displayed.
* @see #DEFAULT_FRAME_DELAY
*/
public HologramAnimation(boolean loop, HologramFrame... frames) {
this(loop, DEFAULT_FRAME_DELAY, DEFAULT_START_DELAY, DEFAULT_END_DELAY, frames);
}
/**
* Creates a new animation with the specified frames, and the defaults for loop status and tick delay.
*
* @param frames The frames to be displayed.
* @see #DEFAULT_LOOP
* @see #DEFAULT_FRAME_DELAY
*/
public HologramAnimation(HologramFrame... frames) {
this(DEFAULT_LOOP, DEFAULT_FRAME_DELAY, DEFAULT_START_DELAY, DEFAULT_END_DELAY, frames);
}
/**
* Gets the frames of the animation.
*
* @return The frames of the animation.
*/
public ImmutableList<HologramFrame> getFrames() {
return this.frames;
}
/**
* Gets whether or not the animation should loop.
*
* @return Whether or not the animation should loop.
*/
public boolean shouldLoop() {
return this.loop;
}
/**
* Gets the number of ticks that the hologram should wait in between frames.
*
* @return The number of ticks that the hologram should wait in between frames.
*/
public long getFrameDelay() {
return this.frameDelay;
}
public long getStartDelay() {
return this.startDelay;
}
public long getEndDelay() {
return this.endDelay;
}
/**
* Gets the vertical height of the tallest frame in the animation.
*
* @return The vertical height of the tallest frame in the animation.
*/
public int getMaxHeight() {
return this.maxHeight;
}
}