/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.energy.block;
import cn.academy.core.block.TileGeneratorBase;
import cn.academy.energy.IFConstants;
import cn.academy.energy.client.render.block.RenderSolarGen;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegTileEntity;
import cn.lambdalib.multiblock.BlockMulti;
import cn.lambdalib.multiblock.IMultiTile;
import cn.lambdalib.multiblock.InfoBlockMulti;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
/**
* @author WeAthFolD
*/
@Registrant
@RegTileEntity
@RegTileEntity.HasRender
public class TileSolarGen extends TileGeneratorBase implements IMultiTile {
public static final int SLOT_BATTERY = 0;
public enum SolarStatus {
STOPPED, WEAK, STRONG
}
@SideOnly(Side.CLIENT)
@RegTileEntity.Render
public static RenderSolarGen renderer;
public TileSolarGen() {
super("solar_generator", 1, 1000, IFConstants.LATENCY_MK2);
}
@Override
public double getGeneration(double required) {
World world = this.getWorldObj();
double brightLev = canGenerate() ? 1.0 : 0.0;
brightLev *= world.isRaining() ? 0.2 : 1.0;
return Math.min(required, brightLev * 3.0);
}
public SolarStatus getStatus() {
World world = getWorldObj();
if (canGenerate()) {
return world.isRaining() ? SolarStatus.WEAK : SolarStatus.STRONG;
} else {
return SolarStatus.STOPPED;
}
}
private boolean canGenerate() {
World world = getWorldObj();
long time = world.getWorldTime() % 24000;
boolean isDay = time >= 0 && time <= 12500;
return isDay && world.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord);
}
// InfoBlockMulti delegates
InfoBlockMulti info = new InfoBlockMulti(this);
@Override
public void updateEntity() {
super.updateEntity();
info.update();
ItemStack battery = getStackInSlot(SLOT_BATTERY);
if (battery != null) {
tryChargeStack(battery);
}
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
info = new InfoBlockMulti(this, tag);
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
info.save(tag);
}
@Override
public InfoBlockMulti getBlockInfo() {
return info;
}
@Override
public void setBlockInfo(InfoBlockMulti i) {
info = i;
}
@SideOnly(Side.CLIENT)
@Override
public AxisAlignedBB getRenderBoundingBox() {
Block block = getBlockType();
if(block instanceof BlockMulti) {
return ((BlockMulti) block).getRenderBB(xCoord, yCoord, zCoord, info.getDir());
} else {
return super.getRenderBoundingBox();
}
}
}