package zmaster587.advancedRocketry.tile.multiblock;
import io.netty.buffer.ByteBuf;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import zmaster587.advancedRocketry.dimension.DimensionManager;
import zmaster587.advancedRocketry.dimension.DimensionProperties;
import zmaster587.advancedRocketry.inventory.modules.ModulePlanetSelector;
import zmaster587.advancedRocketry.util.ITilePlanetSystemSelectable;
import zmaster587.libVulpes.inventory.TextureResources;
import zmaster587.libVulpes.inventory.modules.IModularInventory;
import zmaster587.libVulpes.inventory.modules.IProgressBar;
import zmaster587.libVulpes.inventory.modules.ISelectionNotify;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.network.PacketHandler;
import zmaster587.libVulpes.network.PacketMachine;
import zmaster587.libVulpes.tile.TilePointer;
import zmaster587.libVulpes.util.INetworkMachine;
public class TilePlanetSelector extends TilePointer implements ISelectionNotify, IModularInventory, IProgressBar, INetworkMachine {
protected ModulePlanetSelector container;
public static final int certaintyDataValue = 5000;
DimensionProperties dimCache;
int[] cachedProgressValues;
public TilePlanetSelector() {
cachedProgressValues = new int[] { -1, -1, -1};
}
@Override
public void onSelectionConfirmed(Object sender) {
//Container Cannot be null at this time
TileEntity tile = getMasterBlock();
if(tile instanceof ITilePlanetSystemSelectable) {
((ITilePlanetSystemSelectable)tile).setSelectedPlanetId(container.getSelectedSystem());
}
onSelected(sender);
}
@Override
public void onSelected(Object sender) {
selectSystem(container.getSelectedSystem());
PacketHandler.sendToServer(new PacketMachine(this, (byte)0));
}
private void selectSystem(int id) {
if(id == -1)
dimCache = null;
else
dimCache = DimensionManager.getInstance().getDimensionProperties(container.getSelectedSystem());
}
@Override
public List<ModuleBase> getModules(int ID, EntityPlayer player) {
List<ModuleBase> modules = new LinkedList<ModuleBase>();
container = new ModulePlanetSelector(0, TextureResources.starryBG, this,true);
container.setOffset(1000, 1000);
modules.add(container);
//Transfer discovery values
if(!worldObj.isRemote) {
markDirty();
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
return modules;
}
@Override
public String getModularInventoryName() {
return "";
}
@Override
public boolean canInteractWithContainer(EntityPlayer entity) {
return true;
}
@Override
public float getNormallizedProgress(int id) {
return 0;
}
@Override
public void setProgress(int id, int progress) {
cachedProgressValues[id] = progress;
}
@Override
public int getProgress(int id) {
if(!worldObj.isRemote) {
return 25; /*
if(getMasterBlock() != null) {
ItemStack stack = ((ITilePlanetSystemSelectable)getMasterBlock()).getChipWithId(container.getSelectedSystem());
if(stack != null) {
DataType data;
if(id == 0)
data = DataType.ATMOSPHEREDENSITY;
else if(id == 1)
data = DataType.DISTANCE;
else //if(id == 2)
data = DataType.MASS;
int dataAmt = ((ItemPlanetIdentificationChip)stack.getItem()).getData(stack, data);
if(dataAmt != 0)
return (int)(certaintyDataValue/(float)dataAmt);
}
}*/
}
else {
return cachedProgressValues[id];
}
//return 400;
}
@Override
public int getTotalProgress(int id) {
if(dimCache == null)
return 50;
if(id == 0)
return dimCache.getAtmosphereDensity()/2;
else if(id == 1)
return dimCache.orbitalDist/2;
else //if(id == 2)
return (int) (dimCache.gravitationalMultiplier*50);
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound comp = new NBTTagCompound();
writeToNBTHelper(comp);
writeAdditionalNBT(comp);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, comp);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
super.onDataPacket(net, pkt);
readAdditionalNBT(pkt.func_148857_g());
}
public void writeAdditionalNBT(NBTTagCompound nbt) {
if(getMasterBlock() != null) {
List<Integer> list = ((ITilePlanetSystemSelectable)getMasterBlock()).getVisiblePlanets();
Integer[] intList = new Integer[list.size()];
nbt.setIntArray("visiblePlanets",ArrayUtils.toPrimitive(list.toArray(intList)));
}
}
public void readAdditionalNBT(NBTTagCompound nbt) {
if(container != null) {
int[] intArray = nbt.getIntArray("visiblePlanets");
for(int id : intArray)
container.setPlanetAsKnown(id);
}
}
@Override
public void setTotalProgress(int id, int progress) {
}
@Override
public void writeDataToNetwork(ByteBuf out, byte id) {
if(id == 0)
out.writeInt(container.getSelectedSystem());
}
@Override
public void readDataFromNetwork(ByteBuf in, byte packetId,
NBTTagCompound nbt) {
if(packetId == 0)
nbt.setInteger("id", in.readInt());
}
@Override
public void useNetworkData(EntityPlayer player, Side side, byte id,
NBTTagCompound nbt) {
if(id == 0) {
int dimId = nbt.getInteger("id");
container.setSelectedSystem(dimId);
selectSystem(dimId);
//Update known planets
markDirty();
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
@Override
public void onSystemFocusChanged(Object sender) {
PacketHandler.sendToServer(new PacketMachine(this, (byte)0));
}
}