package mekanism.common;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import mekanism.api.EnumColor;
import mekanism.common.multipart.TransmitterType;
import mekanism.common.util.LangUtils;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.ResourceLocation;
/**
* Tier information for Mekanism. This currently includes tiers for Energy Cubes and Smelting Factories.
* @author aidancbrady
*
*/
public final class Tier
{
private static List<ITier> tierTypes = new ArrayList<ITier>();
private static boolean initiated = false;
/** The default tiers used in Mekanism.
* @author aidancbrady
*/
public static enum BaseTier implements IStringSerializable
{
BASIC("Basic", EnumColor.BRIGHT_GREEN),
ADVANCED("Advanced", EnumColor.DARK_RED),
ELITE("Elite", EnumColor.DARK_BLUE),
ULTIMATE("Ultimate", EnumColor.PURPLE),
CREATIVE("Creative", EnumColor.BLACK);
public String getSimpleName()
{
return name;
}
public String getLocalizedName()
{
return LangUtils.localize("tier." + getSimpleName());
}
public EnumColor getColor()
{
return color;
}
public boolean isObtainable()
{
return this != CREATIVE;
}
private String name;
private EnumColor color;
private BaseTier(String s, EnumColor c)
{
name = s;
color = c;
}
@Override
public String getName()
{
return name().toLowerCase();
}
}
public static enum EnergyCubeTier implements ITier, IStringSerializable
{
BASIC(2000000, 800),
ADVANCED(8000000, 3200),
ELITE(32000000, 12800),
ULTIMATE(128000000, 51200),
CREATIVE(Double.MAX_VALUE, Double.MAX_VALUE);
public double maxEnergy;
private double baseMaxEnergy;
public double output;
private double baseOutput;
private EnergyCubeTier(double max, double out)
{
baseMaxEnergy = maxEnergy = max;
baseOutput = output = out;
}
@Override
public void loadConfig()
{
if(this != CREATIVE)
{
maxEnergy = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "EnergyCubeMaxEnergy", baseMaxEnergy).getDouble();
output = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "EnergyCubeOutput", baseOutput).getDouble();
}
}
@Override
public void readConfig(ByteBuf dataStream)
{
if(this != CREATIVE)
{
maxEnergy = dataStream.readDouble();
output = dataStream.readDouble();
}
}
@Override
public void writeConfig(ByteBuf dataStream)
{
if(this != CREATIVE)
{
dataStream.writeDouble(maxEnergy);
dataStream.writeDouble(output);
}
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public String getName()
{
return name().toLowerCase();
}
}
public static enum InductionCellTier implements ITier
{
BASIC(1E9D),
ADVANCED(8E9D),
ELITE(64E9D),
ULTIMATE(512E9D);
public double maxEnergy;
private double baseMaxEnergy;
private InductionCellTier(double max)
{
baseMaxEnergy = maxEnergy = max;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
maxEnergy = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "InductionCellMaxEnergy", baseMaxEnergy).getDouble();
}
@Override
public void readConfig(ByteBuf dataStream)
{
maxEnergy = dataStream.readDouble();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeDouble(maxEnergy);
}
}
public static enum InductionProviderTier implements ITier
{
BASIC(64000),
ADVANCED(512000),
ELITE(4096000),
ULTIMATE(32768000);
public double output;
private double baseOutput;
private InductionProviderTier(double out)
{
baseOutput = output = out;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
output = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "InductionProviderOutput", baseOutput).getDouble();
}
@Override
public void readConfig(ByteBuf dataStream)
{
output = dataStream.readDouble();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeDouble(output);
}
}
public static enum FactoryTier
{
BASIC(3, new ResourceLocation("mekanism", "gui/factory/GuiBasicFactory.png")),
ADVANCED(5, new ResourceLocation("mekanism", "gui/factory/GuiAdvancedFactory.png")),
ELITE(7, new ResourceLocation("mekanism", "gui/factory/GuiEliteFactory.png"));
public int processes;
public ResourceLocation guiLocation;
public static FactoryTier getFromName(String tierName)
{
for(FactoryTier tier : values())
{
if(tierName.contains(tier.getBaseTier().getSimpleName()))
{
return tier;
}
}
Mekanism.logger.error("Invalid tier identifier when retrieving with name.");
return BASIC;
}
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
private FactoryTier(int process, ResourceLocation gui)
{
processes = process;
guiLocation = gui;
}
}
public static enum CableTier implements ITier
{
BASIC(3200, TransmitterType.UNIVERSAL_CABLE_BASIC),
ADVANCED(12800, TransmitterType.UNIVERSAL_CABLE_ADVANCED),
ELITE(64000, TransmitterType.UNIVERSAL_CABLE_ELITE),
ULTIMATE(320000, TransmitterType.UNIVERSAL_CABLE_ULTIMATE);
public int cableCapacity;
private int baseCapacity;
public TransmitterType type;
private CableTier(int capacity, TransmitterType transmitterType)
{
baseCapacity = cableCapacity = capacity;
type = transmitterType;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
cableCapacity = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "CableCapacity", baseCapacity).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
cableCapacity = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(cableCapacity);
}
public static CableTier get(BaseTier tier)
{
for(CableTier transmitter : values())
{
if(transmitter.getBaseTier() == tier)
{
return transmitter;
}
}
return BASIC;
}
}
public static enum PipeTier implements ITier
{
BASIC(1000, 100, TransmitterType.MECHANICAL_PIPE_BASIC),
ADVANCED(4000, 400, TransmitterType.MECHANICAL_PIPE_ADVANCED),
ELITE(16000, 1600, TransmitterType.MECHANICAL_PIPE_ELITE),
ULTIMATE(64000, 6400, TransmitterType.MECHANICAL_PIPE_ULTIMATE);
public int pipeCapacity;
private int baseCapacity;
public int pipePullAmount;
private int basePull;
public TransmitterType type;
private PipeTier(int capacity, int pullAmount, TransmitterType transmitterType)
{
baseCapacity = pipeCapacity = capacity;
basePull = pipePullAmount = pullAmount;
type = transmitterType;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
pipeCapacity = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "PipeCapacity", baseCapacity).getInt();
pipePullAmount = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "PipePullAmount", basePull).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
pipeCapacity = dataStream.readInt();
pipePullAmount = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(pipeCapacity);
dataStream.writeInt(pipePullAmount);
}
public static PipeTier get(BaseTier tier)
{
for(PipeTier transmitter : values())
{
if(transmitter.getBaseTier() == tier)
{
return transmitter;
}
}
return BASIC;
}
}
public static enum TubeTier implements ITier
{
BASIC(256, 64, TransmitterType.PRESSURIZED_TUBE_BASIC),
ADVANCED(1024, 256, TransmitterType.PRESSURIZED_TUBE_ADVANCED),
ELITE(4096, 1024, TransmitterType.PRESSURIZED_TUBE_ELITE),
ULTIMATE(16384, 4096, TransmitterType.PRESSURIZED_TUBE_ULTIMATE);
public int tubeCapacity;
private int baseCapacity;
public int tubePullAmount;
private int basePull;
public TransmitterType type;
private TubeTier(int capacity, int pullAmount, TransmitterType transmitterType)
{
baseCapacity = tubeCapacity = capacity;
basePull = tubePullAmount = pullAmount;
type = transmitterType;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
tubeCapacity = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "TubeCapacity", baseCapacity).getInt();
tubePullAmount = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "TubePullAmount", basePull).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
tubeCapacity = dataStream.readInt();
tubePullAmount = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(tubeCapacity);
dataStream.writeInt(tubePullAmount);
}
public static TubeTier get(BaseTier tier)
{
for(TubeTier transmitter : values())
{
if(transmitter.getBaseTier() == tier)
{
return transmitter;
}
}
return BASIC;
}
}
public static enum TransporterTier implements ITier
{
BASIC(1, 5, TransmitterType.LOGISTICAL_TRANSPORTER_BASIC),
ADVANCED(16, 10, TransmitterType.LOGISTICAL_TRANSPORTER_ADVANCED),
ELITE(32, 20, TransmitterType.LOGISTICAL_TRANSPORTER_ELITE),
ULTIMATE(64, 50, TransmitterType.LOGISTICAL_TRANSPORTER_ULTIMATE);
public int pullAmount;
private int basePull;
public int speed;
private int baseSpeed;
public TransmitterType type;
private TransporterTier(int pull, int s, TransmitterType transmitterType)
{
basePull = pullAmount = pull;
baseSpeed = speed = s;
type = transmitterType;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
pullAmount = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "TransporterPullAmount", basePull).getInt();
speed = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "TransporterSpeed", baseSpeed).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
pullAmount = dataStream.readInt();
speed = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(pullAmount);
dataStream.writeInt(speed);
}
public static TransporterTier get(BaseTier tier)
{
for(TransporterTier transmitter : values())
{
if(transmitter.getBaseTier() == tier)
{
return transmitter;
}
}
return BASIC;
}
}
public static enum ConductorTier implements ITier
{
BASIC(5, 1, 10, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_BASIC),
ADVANCED(5, 1, 400, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ADVANCED),
ELITE(5, 1, 8000, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ELITE),
ULTIMATE(5, 1, 100000, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ULTIMATE);
public double inverseConduction;
private double baseConduction;
public double inverseHeatCapacity;
private double baseHeatCapacity;
public double inverseConductionInsulation;
private double baseConductionInsulation;
public ColourRGBA baseColour;
public TransmitterType type;
private ConductorTier(double inversek, double inverseC, double insulationInversek, ColourRGBA colour, TransmitterType transmitterType)
{
baseConduction = inverseConduction = inversek;
baseHeatCapacity = inverseHeatCapacity = inverseC;
baseConductionInsulation = inverseConductionInsulation = insulationInversek;
baseColour = colour;
type = transmitterType;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
inverseConduction = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "ConductorInverseConduction", baseConduction).getDouble();
inverseHeatCapacity = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "ConductorHeatCapacity", baseHeatCapacity).getDouble();
inverseConductionInsulation = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "ConductorConductionInsulation", baseConductionInsulation).getDouble();
}
@Override
public void readConfig(ByteBuf dataStream)
{
inverseConduction = dataStream.readDouble();
inverseHeatCapacity = dataStream.readDouble();
inverseConductionInsulation = dataStream.readDouble();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeDouble(inverseConduction);
dataStream.writeDouble(inverseHeatCapacity);
dataStream.writeDouble(inverseConductionInsulation);
}
public static ConductorTier get(BaseTier tier)
{
for(ConductorTier transmitter : values())
{
if(transmitter.getBaseTier() == tier)
{
return transmitter;
}
}
return BASIC;
}
}
public static enum FluidTankTier implements ITier
{
BASIC(14000, 400),
ADVANCED(28000, 800),
ELITE(56000, 1600),
ULTIMATE(112000, 3200),
CREATIVE(Integer.MAX_VALUE, Integer.MAX_VALUE);
public int storage;
private int baseStorage;
public int output;
private int baseOutput;
private FluidTankTier(int s, int o)
{
baseStorage = storage = s;
baseOutput = output = o;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
storage = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "FluidTankStorage", baseStorage).getInt();
output = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "FluidTankOutput", baseOutput).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
storage = dataStream.readInt();
output = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(storage);
dataStream.writeInt(output);
}
}
public static enum GasTankTier implements ITier, IStringSerializable
{
BASIC(64000, 256),
ADVANCED(128000, 512),
ELITE(256000, 1028),
ULTIMATE(512000, 2056),
CREATIVE(Integer.MAX_VALUE, Integer.MAX_VALUE);
public int storage;
private int baseStorage;
public int output;
private int baseOutput;
private GasTankTier(int s, int o)
{
baseStorage = storage = s;
baseOutput = output = o;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
storage = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "GasTankStorage", baseStorage).getInt();
output = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "GasTankOutput", baseOutput).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
storage = dataStream.readInt();
output = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(storage);
dataStream.writeInt(output);
}
@Override
public String getName()
{
return name().toLowerCase();
}
}
public static enum BinTier implements ITier
{
BASIC(4096),
ADVANCED(8192),
ELITE(32768),
ULTIMATE(262144),
CREATIVE(Integer.MAX_VALUE);
public int storage;
private int baseStorage;
private BinTier(int s)
{
baseStorage = storage = s;
}
@Override
public BaseTier getBaseTier()
{
return BaseTier.values()[ordinal()];
}
@Override
public void loadConfig()
{
storage = Mekanism.configuration.get("tier", getBaseTier().getSimpleName() + "BinStorage", baseStorage).getInt();
}
@Override
public void readConfig(ByteBuf dataStream)
{
storage = dataStream.readInt();
}
@Override
public void writeConfig(ByteBuf dataStream)
{
dataStream.writeInt(storage);
}
}
public static void init()
{
if(initiated)
{
return;
}
for(Class c : Tier.class.getDeclaredClasses())
{
if(c.isEnum())
{
try {
for(Object obj : c.getEnumConstants())
{
if(obj instanceof ITier)
{
tierTypes.add((ITier)obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
initiated = true;
}
public static void loadConfig()
{
for(ITier tier : tierTypes)
{
tier.loadConfig();
}
}
public static void readConfig(ByteBuf dataStream)
{
for(ITier tier : tierTypes)
{
tier.readConfig(dataStream);
}
}
public static void writeConfig(ByteBuf dataStream)
{
for(ITier tier : tierTypes)
{
tier.writeConfig(dataStream);
}
}
public static interface ITier
{
public BaseTier getBaseTier();
public void loadConfig();
public void readConfig(ByteBuf dataStream);
public void writeConfig(ByteBuf dataStream);
}
}