package mekanism.common.tile.component; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.api.Coord4D; import mekanism.api.MekanismConfig.general; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.base.ITileComponent; import mekanism.common.frequency.Frequency; import mekanism.common.frequency.FrequencyManager; import mekanism.common.security.ISecurityTile.SecurityMode; import mekanism.common.security.SecurityFrequency; import mekanism.common.tile.TileEntityContainerBlock; import mekanism.common.util.MekanismUtils; import net.minecraft.nbt.NBTTagCompound; public class TileComponentSecurity implements ITileComponent { /** TileEntity implementing this component. */ public TileEntityContainerBlock tileEntity; private String owner; private SecurityMode securityMode = SecurityMode.PUBLIC; private SecurityFrequency frequency; public TileComponentSecurity(TileEntityContainerBlock tile) { tileEntity = tile; tile.components.add(this); } public void readFrom(TileComponentSecurity security) { owner = security.owner; securityMode = security.securityMode; } public SecurityFrequency getFrequency() { return frequency; } public String getOwner() { return owner; } public void setOwner(String o) { frequency = null; owner = o; } public SecurityMode getMode() { if(general.allowProtection) { return securityMode; } else { return SecurityMode.PUBLIC; } } public void setMode(SecurityMode mode) { securityMode = mode; } public FrequencyManager getManager(Frequency freq) { if(owner == null || freq == null) { return null; } return Mekanism.securityFrequencies; } public void setFrequency(String owner) { FrequencyManager manager = Mekanism.securityFrequencies; manager.deactivate(Coord4D.get(tileEntity)); for(Frequency freq : manager.getFrequencies()) { if(freq.owner.equals(owner)) { frequency = (SecurityFrequency)freq; frequency.activeCoords.add(Coord4D.get(tileEntity)); return; } } Frequency freq = new SecurityFrequency(owner).setPublic(true); freq.activeCoords.add(Coord4D.get(tileEntity)); manager.addFrequency(freq); frequency = (SecurityFrequency)freq; MekanismUtils.saveChunk(tileEntity); tileEntity.markDirty(); } @Override public void tick() { if(!tileEntity.getWorld().isRemote) { if(frequency == null && owner != null) { setFrequency(owner); } FrequencyManager manager = getManager(frequency); if(manager != null) { if(frequency != null && !frequency.valid) { frequency = (SecurityFrequency)manager.validateFrequency(owner, Coord4D.get(tileEntity), frequency); } if(frequency != null) { frequency = (SecurityFrequency)manager.update(owner, Coord4D.get(tileEntity), frequency); } } else { frequency = null; } } } @Override public void read(NBTTagCompound nbtTags) { securityMode = SecurityMode.values()[nbtTags.getInteger("securityMode")]; if(nbtTags.hasKey("owner")) { owner = nbtTags.getString("owner"); } if(nbtTags.hasKey("securityFreq")) { frequency = new SecurityFrequency(nbtTags.getCompoundTag("securityFreq")); frequency.valid = false; } } @Override public void read(ByteBuf dataStream) { securityMode = SecurityMode.values()[dataStream.readInt()]; if(dataStream.readBoolean()) { owner = PacketHandler.readString(dataStream); } else { owner = null; } if(dataStream.readBoolean()) { frequency = new SecurityFrequency(dataStream); } else { frequency = null; } } @Override public void write(NBTTagCompound nbtTags) { nbtTags.setInteger("securityMode", securityMode.ordinal()); if(owner != null) { nbtTags.setString("owner", owner); } if(frequency != null) { NBTTagCompound frequencyTag = new NBTTagCompound(); frequency.write(frequencyTag); nbtTags.setTag("securityFreq", frequencyTag); } } @Override public void write(ArrayList<Object> data) { data.add(securityMode.ordinal()); if(owner != null) { data.add(true); data.add(owner); } else { data.add(false); } if(frequency != null) { data.add(true); frequency.write(data); } else { data.add(false); } } @Override public void invalidate() { if(!tileEntity.getWorld().isRemote) { if(frequency != null) { FrequencyManager manager = getManager(frequency); if(manager != null) { manager.deactivate(Coord4D.get(tileEntity)); } } } } }