blob: 5c6ea522cf233ad42f63b37b7d1a93868ccceb14 [file] [log] [blame] [raw]
package mekanism.common.tile.component;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mekanism.api.EnumColor;
import mekanism.api.transmitters.TransmissionType;
import mekanism.common.SideData;
import mekanism.common.SideData.EnergyState;
import mekanism.common.base.ITileComponent;
import mekanism.common.tile.TileEntityContainerBlock;
import mekanism.common.util.MekanismUtils;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
public class TileComponentConfig implements ITileComponent
{
public TileEntityContainerBlock tileEntity;
public Map<Integer, byte[]> sideConfigs = new HashMap<Integer, byte[]>();
public Map<Integer, ArrayList<SideData>> sideOutputs = new HashMap<Integer, ArrayList<SideData>>();
public Map<Integer, Boolean> ejecting = new HashMap<Integer, Boolean>();
public Map<Integer, Boolean> canEject = new HashMap<Integer, Boolean>();
public List<TransmissionType> transmissions = new ArrayList<TransmissionType>();
public TileComponentConfig(TileEntityContainerBlock tile, TransmissionType... types)
{
tileEntity = tile;
for(TransmissionType type : types)
{
addSupported(type);
}
tile.components.add(this);
}
public void readFrom(TileComponentConfig config)
{
sideConfigs = config.sideConfigs;
ejecting = config.ejecting;
canEject = config.canEject;
transmissions = config.transmissions;
}
public void addSupported(TransmissionType type)
{
if(!transmissions.contains(type))
{
transmissions.add(type);
}
sideOutputs.put(type.ordinal(), new ArrayList<SideData>());
ejecting.put(type.ordinal(), false);
canEject.put(type.ordinal(), true);
}
public EnumSet<EnumFacing> getSidesForData(TransmissionType type, EnumFacing facing, int dataIndex)
{
EnumSet<EnumFacing> ret = EnumSet.noneOf(EnumFacing.class);
for(EnumFacing f : EnumFacing.VALUES)
{
if(getConfig(type)[f.ordinal()] == dataIndex)
{
ret.add(MekanismUtils.getBaseOrientation(f, facing));
}
}
return ret;
}
public void setCanEject(TransmissionType type, boolean eject)
{
canEject.put(type.ordinal(), eject);
}
public boolean canEject(TransmissionType type)
{
return canEject.get(type.ordinal());
}
public void fillConfig(TransmissionType type, int data)
{
byte sideData = (byte)data;
setConfig(type, new byte[] {sideData, sideData, sideData, sideData, sideData, sideData});
}
public void setIOEnergyConfig()
{
addOutput(TransmissionType.ENERGY, new SideData("None", EnumColor.GREY, EnergyState.OFF));
addOutput(TransmissionType.ENERGY, new SideData("Input", EnumColor.DARK_GREEN, EnergyState.INPUT));
addOutput(TransmissionType.ENERGY, new SideData("Output", EnumColor.DARK_RED, EnergyState.OUTPUT));
setConfig(TransmissionType.ENERGY, new byte[] {1, 1, 2, 1, 1, 1});
}
public void setInputEnergyConfig()
{
addOutput(TransmissionType.ENERGY, new SideData("None", EnumColor.GREY, EnergyState.OFF));
addOutput(TransmissionType.ENERGY, new SideData("Input", EnumColor.DARK_GREEN, EnergyState.INPUT));
setConfig(TransmissionType.ENERGY, new byte[] {1, 1, 1, 1, 1, 1});
setCanEject(TransmissionType.ENERGY, false);
}
public void setConfig(TransmissionType type, byte[] config)
{
sideConfigs.put(type.ordinal(), config);
}
public void addOutput(TransmissionType type, SideData data)
{
sideOutputs.get(type.ordinal()).add(data);
}
public ArrayList<SideData> getOutputs(TransmissionType type)
{
return sideOutputs.get(type.ordinal());
}
public byte[] getConfig(TransmissionType type)
{
return sideConfigs.get(type.ordinal());
}
public SideData getOutput(TransmissionType type, EnumFacing side, EnumFacing facing)
{
return getOutputs(type).get(getConfig(type)[MekanismUtils.getBaseOrientation(side, facing).ordinal()]);
}
public SideData getOutput(TransmissionType type, int side)
{
return getOutputs(type).get(getConfig(type)[side]);
}
public boolean supports(TransmissionType type)
{
return transmissions.contains(type);
}
@Override
public void tick() {}
@Override
public void read(NBTTagCompound nbtTags)
{
if(nbtTags.getBoolean("sideDataStored"))
{
for(TransmissionType type : transmissions)
{
try {//TODO remove soon
if(nbtTags.getByteArray("config" + type.ordinal()).length > 0)
{
sideConfigs.put(type.ordinal(), nbtTags.getByteArray("config" + type.ordinal()));
ejecting.put(type.ordinal(), nbtTags.getBoolean("ejecting" + type.ordinal()));
}
} catch(Exception e) {
try {
byte[] bytes = new byte[6];
for(int i = 0; i < 6; i++)
{
bytes[i] = nbtTags.getByte("config"+i);
if(bytes[i] > 0)
{
bytes[i]--;
}
}
sideConfigs.put(TransmissionType.ITEM.ordinal(), bytes);
ejecting.put(TransmissionType.ITEM.ordinal(), nbtTags.getBoolean("ejecting"));
} catch(Exception e1) {}
}
}
}
}
@Override
public void read(ByteBuf dataStream)
{
transmissions.clear();
int amount = dataStream.readInt();
for(int i = 0; i < amount; i++)
{
transmissions.add(TransmissionType.values()[dataStream.readInt()]);
}
for(TransmissionType type : transmissions)
{
byte[] array = new byte[6];
dataStream.readBytes(array);
sideConfigs.put(type.ordinal(), array);
ejecting.put(type.ordinal(), dataStream.readBoolean());
}
}
@Override
public void write(NBTTagCompound nbtTags)
{
for(TransmissionType type : transmissions)
{
nbtTags.setByteArray("config" + type.ordinal(), sideConfigs.get(type.ordinal()));
nbtTags.setBoolean("ejecting" + type.ordinal(), ejecting.get(type.ordinal()));
}
nbtTags.setBoolean("sideDataStored", true);
}
@Override
public void write(ArrayList data)
{
data.add(transmissions.size());
for(TransmissionType type : transmissions)
{
data.add(type.ordinal());
}
for(TransmissionType type : transmissions)
{
data.add(sideConfigs.get(type.ordinal()));
data.add(ejecting.get(type.ordinal()));
}
}
public boolean isEjecting(TransmissionType type)
{
return ejecting.get(type.ordinal());
}
public void setEjecting(TransmissionType type, boolean eject)
{
ejecting.put(type.ordinal(), eject);
MekanismUtils.saveChunk(tileEntity);
}
}