package mekanism.generators.common.tile; import java.util.ArrayList; import java.util.EnumSet; import mekanism.api.MekanismConfig.generators; import mekanism.common.Mekanism; import mekanism.common.util.ChargeUtils; import mekanism.common.util.MekanismUtils; import net.minecraft.item.ItemStack; import net.minecraft.world.biome.BiomeGenDesert; import net.minecraftforge.common.util.ForgeDirection; import cpw.mods.fml.common.ModAPIManager; import cpw.mods.fml.common.Optional.Method; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import micdoodle8.mods.galacticraft.api.world.ISolarLevel; 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[] getAccessibleSlotsFromSide(int side) { return new int[] {0}; } @Override @SideOnly(Side.CLIENT) public float getVolume() { return 0.05F; } @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.hasNoSky && worldObj.canBlockSeeTheSky(xCoord, yCoord+1, zCoord)) { seesSun = true; } else { seesSun = false; } if(canOperate()) { setActive(true); setEnergy(getEnergy() + getProduction()); } else { setActive(false); } } } public boolean isDesert() { return worldObj.provider.getBiomeGenForCoords(xCoord >> 4, zCoord >> 4) instanceof BiomeGenDesert; } @Override public boolean canExtractItem(int slotID, ItemStack itemstack, int 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; } @Override @Method(modid = "ComputerCraft") public String[] getMethodNames() { return new String[] {"getStored", "getOutput", "getMaxEnergy", "getEnergyNeeded", "getSeesSun"}; } @Override @Method(modid = "ComputerCraft") public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { 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: Mekanism.logger.error("Attempted to call unknown method with computer ID " + computer.getID()); return null; } } @Override public void handlePacketData(ByteBuf dataStream) { super.handlePacketData(dataStream); seesSun = dataStream.readBoolean(); } @Override public ArrayList getNetworkedData(ArrayList data) { super.getNetworkedData(data); data.add(seesSun); return data; } @Override public EnumSet<ForgeDirection> getOutputtingSides() { return EnumSet.of(ForgeDirection.getOrientation(0)); } @Override public boolean renderUpdate() { return false; } @Override public boolean lightUpdate() { return false; } }