/** * 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.core.block; import cn.academy.core.tile.TileInventory; import cn.academy.energy.api.IFItemManager; import cn.academy.energy.api.block.IWirelessGenerator; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.s11n.network.TargetPoints; import cn.lambdalib.s11n.network.NetworkMessage; import cn.lambdalib.s11n.network.NetworkMessage.Listener; import cpw.mods.fml.relauncher.Side; import net.minecraft.item.ItemStack; /** * @author WeAthFolD */ @Registrant public abstract class TileGeneratorBase extends TileInventory implements IWirelessGenerator { public final double bufferSize; public final double bandwidth; private int updateTicker = 20; /** * Amount of buffered energy. */ private double energy; public TileGeneratorBase(String _invName, int size, double _bufferSize, double _bandwidth) { super(_invName, size); bufferSize = _bufferSize; bandwidth = _bandwidth; } @Override public void updateEntity() { if(!getWorldObj().isRemote) { double required = bufferSize - energy; energy += getGeneration(required); if (energy > bufferSize) energy = bufferSize; if(--updateTicker == 0) { updateTicker = 20; NetworkMessage.sendToAllAround(TargetPoints.convert(this, 20), this, "sync_energy", energy); } } } /** * Manually add [amt] energy into the buffer. * @return Energy not consumed */ public double addEnergy(double amt) { return addEnergy(amt, false); } public double addEnergy(double amt, boolean simulate) { double add = Math.min(bufferSize - energy, amt); if(!simulate) energy += add; return amt - add; } @Override public double getProvidedEnergy(double req) { if(req > energy) req = energy; energy -= req; return req; } public double getEnergy() { return energy; } public void setEnergy(double energy) { this.energy = energy; } @Override public double getBandwidth() { return bandwidth; } /** * Try to charge a ItemStack with the buffer energy within the generator. */ public void tryChargeStack(ItemStack stack) { if(IFItemManager.instance.isSupported(stack)) { double cangive = Math.min(energy, bandwidth); double ret = IFItemManager.instance.charge(stack, cangive); energy -= (cangive - ret); } } /** * Get the energy generated by the generator this tick. */ public abstract double getGeneration(double required); @Listener(channel="sync_energy", side=Side.CLIENT) private void hSync(double energy) { this.energy = energy; } }