package zmaster587.advancedRocketry.tile;
import io.netty.buffer.ByteBuf;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import zmaster587.advancedRocketry.AdvancedRocketry;
import zmaster587.advancedRocketry.api.IAtmosphere;
import zmaster587.advancedRocketry.api.atmosphere.AtmosphereRegister;
import zmaster587.advancedRocketry.atmosphere.AtmosphereHandler;
import zmaster587.advancedRocketry.atmosphere.AtmosphereType;
import zmaster587.advancedRocketry.inventory.TextureResources;
import zmaster587.libVulpes.LibVulpes;
import zmaster587.libVulpes.inventory.modules.IButtonInventory;
import zmaster587.libVulpes.inventory.modules.IModularInventory;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.inventory.modules.ModuleButton;
import zmaster587.libVulpes.inventory.modules.ModuleContainerPan;
import zmaster587.libVulpes.network.PacketHandler;
import zmaster587.libVulpes.network.PacketMachine;
import zmaster587.libVulpes.util.INetworkMachine;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class TileAtmosphereDetector extends TileEntity implements IModularInventory, IButtonInventory, INetworkMachine {
IAtmosphere atmosphereToDetect;
public TileAtmosphereDetector() {
atmosphereToDetect = AtmosphereType.AIR;
}
@Override
public boolean canUpdate() {
return true;
}
@Override
public void updateEntity() {
if(!worldObj.isRemote && worldObj.getWorldTime() % 10 == 0) {
int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord);
boolean detectedAtm = false;
//TODO: Galacticcraft support
if(AtmosphereHandler.getOxygenHandler(worldObj.provider.dimensionId) == null) {
detectedAtm = atmosphereToDetect == AtmosphereType.AIR;
}
else {
for(int i = 1; i < ForgeDirection.values().length; i++) {
ForgeDirection direction = ForgeDirection.getOrientation(i);
detectedAtm = (!worldObj.getBlock(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ).isOpaqueCube() && atmosphereToDetect == AtmosphereHandler.getOxygenHandler(worldObj.provider.dimensionId).getAtmosphereType(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ));
if(detectedAtm) break;
}
}
if((meta == 1) != detectedAtm) {
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, detectedAtm ? 1 : 0, 3);
}
}
}
@Override
public List<ModuleBase> getModules(int id, EntityPlayer player) {
List<ModuleBase> modules = new LinkedList<ModuleBase>();
List<ModuleBase> btns = new LinkedList<ModuleBase>();
Iterator<IAtmosphere> atmIter = AtmosphereRegister.getInstance().getAtmosphereList().iterator();
int i = 0;
while(atmIter.hasNext()) {
IAtmosphere atm = atmIter.next();
btns.add(new ModuleButton(60, 4 + i*24, i, LibVulpes.proxy.getLocalizedString(atm.getUnlocalizedName()), this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild));
i++;
}
ModuleContainerPan panningContainer = new ModuleContainerPan(5, 20, btns, new LinkedList<ModuleBase>(), zmaster587.libVulpes.inventory.TextureResources.starryBG, 165, 120, 0, 500);
modules.add(panningContainer);
return modules;
}
@Override
public String getModularInventoryName() {
return "atmosphereDetector";
}
@Override
public boolean canInteractWithContainer(EntityPlayer entity) {
return true;
}
@Override
public void onInventoryButtonPressed(int buttonId) {
atmosphereToDetect = AtmosphereRegister.getInstance().getAtmosphereList().get(buttonId);
PacketHandler.sendToServer(new PacketMachine(this, (byte)0));
}
@Override
public void writeDataToNetwork(ByteBuf out, byte id) {
//Send the unlocalized name over the net to reduce chances of foulup due to client/server inconsistencies
if(id == 0) {
PacketBuffer buf = new PacketBuffer(out);
try {
buf.writeShort(atmosphereToDetect.getUnlocalizedName().length());
buf.writeStringToBuffer(atmosphereToDetect.getUnlocalizedName());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void readDataFromNetwork(ByteBuf in, byte packetId,
NBTTagCompound nbt) {
if(packetId == 0) {
PacketBuffer buf = new PacketBuffer(in);
try {
nbt.setString("uName", buf.readStringFromBuffer(buf.readShort()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void useNetworkData(EntityPlayer player, Side side, byte id,
NBTTagCompound nbt) {
if(id == 0) {
String name = nbt.getString("uName");
atmosphereToDetect = AtmosphereRegister.getInstance().getAtmosphere(name);
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setString("atmName", atmosphereToDetect.getUnlocalizedName());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
atmosphereToDetect = AtmosphereRegister.getInstance().getAtmosphere(nbt.getString("atmName"));
}
}