package mekanism.generators.common.tile;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.EnumSet;
import mekanism.api.MekanismConfig.generators;
import mekanism.common.util.ChargeUtils;
import mekanism.common.util.MekanismUtils;
import micdoodle8.mods.galacticraft.api.world.ISolarLevel;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.biome.BiomeDesert;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TileEntitySolarGenerator extends TileEntityGenerator
{
/** Whether or not this generator sees the sun. */
public boolean seesSun = false;
/** How fast this tile entity generates energy. */
public double GENERATION_RATE;
public TileEntitySolarGenerator()
{
this("SolarGenerator", 96000, generators.solarGeneration*2);
GENERATION_RATE = generators.solarGeneration;
}
public TileEntitySolarGenerator(String name, double maxEnergy, double output)
{
super("solar", name, maxEnergy, output);
inventory = new ItemStack[1];
}
@Override
public int[] getSlotsForFace(EnumFacing side)
{
return new int[] {0};
}
@Override
@SideOnly(Side.CLIENT)
public float getVolume()
{
return 0.05F*super.getVolume();
}
@Override
public boolean canSetFacing(int facing)
{
return facing != 0 && facing != 1;
}
@Override
public void onUpdate()
{
super.onUpdate();
if(!worldObj.isRemote)
{
ChargeUtils.charge(0, this);
if(worldObj.isDaytime() && ((!worldObj.isRaining() && !worldObj.isThundering()) || isDesert()) && !worldObj.provider.getHasNoSky() && worldObj.canSeeSky(getPos().add(0, 4, 0)))
{
seesSun = true;
}
else {
seesSun = false;
}
if(canOperate())
{
setActive(true);
setEnergy(getEnergy() + getProduction());
}
else {
setActive(false);
}
}
}
public boolean isDesert()
{
return worldObj.provider.getBiomeForCoords(getPos()).getBiomeClass() == BiomeDesert.class;
}
@Override
public boolean canExtractItem(int slotID, ItemStack itemstack, EnumFacing side)
{
if(slotID == 0)
{
return ChargeUtils.canBeOutputted(itemstack, true);
}
return false;
}
@Override
public boolean isItemValidForSlot(int slotID, ItemStack itemstack)
{
if(slotID == 0)
{
return ChargeUtils.canBeCharged(itemstack);
}
return true;
}
@Override
public boolean canOperate()
{
return getEnergy() < getMaxEnergy() && seesSun && MekanismUtils.canFunction(this);
}
public double getProduction()
{
double ret = 0;
if(seesSun)
{
ret = GENERATION_RATE;
if(MekanismUtils.existsAndInstance(worldObj.provider, "micdoodle8.mods.galacticraft.api.world.ISolarLevel"))
{
ret *= ((ISolarLevel)worldObj.provider).getSolarEnergyMultiplier();
}
if(isDesert())
{
ret *= 1.5;
}
return ret;
}
return 0;
}
private static final String[] methods = new String[] {"getEnergy", "getOutput", "getMaxEnergy", "getEnergyNeeded", "getSeesSun"};
@Override
public String[] getMethods()
{
return methods;
}
@Override
public Object[] invoke(int method, Object[] arguments) throws Exception
{
switch(method)
{
case 0:
return new Object[] {electricityStored};
case 1:
return new Object[] {output};
case 2:
return new Object[] {BASE_MAX_ENERGY};
case 3:
return new Object[] {(BASE_MAX_ENERGY -electricityStored)};
case 4:
return new Object[] {seesSun};
default:
throw new NoSuchMethodException();
}
}
@Override
public void handlePacketData(ByteBuf dataStream)
{
super.handlePacketData(dataStream);
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
seesSun = dataStream.readBoolean();
}
}
@Override
public ArrayList getNetworkedData(ArrayList data)
{
super.getNetworkedData(data);
data.add(seesSun);
return data;
}
@Override
public EnumSet<EnumFacing> getOutputtingSides()
{
return EnumSet.of(EnumFacing.getFront(0));
}
@Override
public boolean renderUpdate()
{
return false;
}
@Override
public boolean lightUpdate()
{
return false;
}
}