package openmods.sync; import com.google.common.base.Preconditions; import java.io.DataInputStream; import java.io.DataOutputStream; import net.minecraft.nbt.NBTTagCompound; import openmods.utils.ByteUtils; public class SyncableEnum<E extends Enum<E>> extends SyncableObjectBase implements ISyncableValueProvider<E> { private final E[] values; private E value; public static <E extends Enum<E>> SyncableEnum<E> create(E initialValue) { return new SyncableEnum<E>(initialValue); } public SyncableEnum(E value) { this.value = value; this.values = value.getDeclaringClass().getEnumConstants(); } @Override public void readFromStream(DataInputStream stream) { int ordinal = ByteUtils.readVLI(stream); value = values[ordinal]; } @Override public void writeToStream(DataOutputStream stream) { ByteUtils.writeVLI(stream, value.ordinal()); } @Override public void writeToNBT(NBTTagCompound nbt, String name) { nbt.setInteger(name, value.ordinal()); } @Override public void readFromNBT(NBTTagCompound nbt, String name) { int original = nbt.getInteger(name); value = values[original]; } @Override public E getValue() { return value; } public E get() { return value; } public void set(E value) { Preconditions.checkNotNull(value); if (this.value != value) { this.value = value; markDirty(); } } public E increment() { final int next = value.ordinal() + 1; if (next >= values.length) value = values[0]; else value = values[next]; markDirty(); return value; } public E decrement() { final int prev = value.ordinal() - 1; if (prev < 0) value = values[values.length - 1]; else value = values[prev]; markDirty(); return value; } }