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; } }