blob: 85aab487db1bca64139ee1e267c80d2702a6e436 [file] [log] [blame] [raw]
package mekanism.generators.common.tile;
import java.util.ArrayList;
import java.util.EnumSet;
import mekanism.api.Coord4D;
import mekanism.common.util.ChargeUtils;
import mekanism.common.util.MekanismUtils;
import mekanism.generators.common.MekanismGenerators;
import mekanism.generators.common.block.BlockGenerator.GeneratorType;
import micdoodle8.mods.galacticraft.api.world.ISolarLevel;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.world.biome.BiomeGenDesert;
import net.minecraftforge.common.ForgeDirection;
import com.google.common.io.ByteArrayDataInput;
import dan200.computer.api.IComputerAccess;
import dan200.computer.api.ILuaContext;
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()
{
super("SolarGenerator", 96000, MekanismGenerators.solarGeneration*2);
GENERATION_RATE = MekanismGenerators.solarGeneration;
inventory = new ItemStack[1];
}
public TileEntitySolarGenerator(String name, double maxEnergy, double output, double generation)
{
super(name, maxEnergy, output);
GENERATION_RATE = generation;
inventory = new ItemStack[1];
}
@Override
public int[] getAccessibleSlotsFromSide(int side)
{
return new int[] {0};
}
@Override
public float getVolumeMultiplier()
{
return 0.05F;
}
@Override
public boolean canSetFacing(int facing)
{
return facing != 0 && facing != 1;
}
@Override
public void onUpdate()
{
super.onUpdate();
ChargeUtils.charge(0, this);
if(!worldObj.isRemote)
{
if(worldObj.isDaytime() && !worldObj.isRaining() && !worldObj.isThundering() && !worldObj.provider.hasNoSky && worldObj.canBlockSeeTheSky(xCoord, yCoord+1, zCoord))
{
seesSun = true;
}
else {
seesSun = false;
}
if(canOperate())
{
setActive(true);
setEnergy(getEnergy() + getProduction());
}
else {
setActive(false);
}
}
}
@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(worldObj.provider instanceof ISolarLevel)
{
ret *= ((ISolarLevel)worldObj.provider).getSolarEnergyMultiplier();
}
if(worldObj.provider.getBiomeGenForCoords(xCoord >> 4, zCoord >> 4) instanceof BiomeGenDesert)
{
ret *= 1.5;
}
return ret;
}
return 0;
}
@Override
public String[] getMethodNames()
{
return new String[] {"getStored", "getOutput", "getMaxEnergy", "getEnergyNeeded", "getSeesSun"};
}
@Override
public Object[] callMethod(IComputerAccess computer, ILuaContext context, 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[] {MAX_ELECTRICITY};
case 3:
return new Object[] {(MAX_ELECTRICITY-electricityStored)};
case 4:
return new Object[] {seesSun};
default:
System.err.println("[Mekanism] Attempted to call unknown method with computer ID " + computer.getID());
return null;
}
}
@Override
public void handlePacketData(ByteArrayDataInput 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;
}
}