package zmaster587.advancedRocketry.api; import java.util.Locale; import net.minecraft.nbt.NBTTagCompound; public class DataStorage { public enum DataType { UNDEFINED, DISTANCE, HUMIDITY, TEMPERATURE, COMPOSITION, ATMOSPHEREDENSITY, MASS; public String toString() { return "data." + name().toLowerCase(Locale.ENGLISH) + ".name"; }; } private int data, maxData; private DataType dataType; private boolean locked; public DataStorage() { dataType = DataType.UNDEFINED; locked = false; } public DataStorage(DataType data) { dataType = data; locked = false; } public boolean setData(int data, DataType dataType) { if(this.dataType == DataStorage.DataType.UNDEFINED) this.dataType = dataType; if(dataType == DataStorage.DataType.UNDEFINED || dataType == this.dataType) { this.data = Math.min(data, maxData); return true; } return false; } public void setDataType(DataType dataType) { this.dataType = dataType; } public int getData() { return data; } public DataType getDataType() { return dataType; } public void setMaxData(int maxData) { this.maxData = maxData; if(data > maxData) data = maxData; } public int getMaxData() { return maxData; } /** * Locks the DataStorage to only accept the specified type and will delete any data that does not match the type * @param type the type of data to lock to, null to unlock */ public void lockDataType(DataType type) { this.locked = type != null; if(this.locked) { if(this.dataType != type) this.data = 0; this.dataType = type; } else if(this.data == 0) this.dataType = DataType.UNDEFINED; } public boolean isLocked() { return this.locked; } /** * * @param data amount to add * @param dataType type to add * @return data amount added */ public int addData(int data, DataType dataType, boolean commit) { if(this.dataType == DataStorage.DataType.UNDEFINED || dataType == DataStorage.DataType.UNDEFINED || dataType == this.dataType) { if(this.dataType == DataStorage.DataType.UNDEFINED) this.dataType = dataType; int amountToAdd = Math.min(data, this.maxData - this.data); if(commit) this.data += amountToAdd; return amountToAdd; } return 0; } /** * @param data max amount of data to remove * @return amount of data removed */ public int removeData(int data, boolean commit) { int dataRemoved = Math.min(data, this.data); if(commit) this.data -= dataRemoved; if(!locked && this.data == 0) this.dataType = DataType.UNDEFINED; return dataRemoved; } public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("Data", data); nbt.setInteger("maxData", maxData); nbt.setInteger("DataType", dataType.ordinal()); nbt.setBoolean("locked", locked); } public void readFromNBT(NBTTagCompound nbt) { data = nbt.getInteger("Data"); maxData = nbt.getInteger("maxData"); dataType = DataType.values()[nbt.getInteger("DataType")]; ///TODO: dev compat if(nbt.hasKey("locked")) locked = nbt.getBoolean("locked"); else locked = false; } }