package de.ellpeck.actuallyadditions.common.tile; import java.util.ArrayList; import java.util.List; import de.ellpeck.actuallyadditions.common.items.ItemBattery; import de.ellpeck.actuallyadditions.common.util.ItemStackHandlerAA.IAcceptor; import de.ellpeck.actuallyadditions.common.util.ItemUtil; import de.ellpeck.actuallyadditions.common.util.StackUtil; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; public class TileEntityBatteryBox extends TileEntityInventoryBase implements ISharingEnergyProvider { private int lastEnergyStored; private int lastCompare; public TileEntityBatteryBox() { super(1, "batteryBox"); } @Override public IEnergyStorage getEnergyStorage(EnumFacing facing) { ItemStack stack = this.inv.getStackInSlot(0); if (StackUtil.isValid(stack) && stack.getItem() instanceof ItemBattery) { if (stack.hasCapability(CapabilityEnergy.ENERGY, null)) { return stack.getCapability(CapabilityEnergy.ENERGY, null); } } return null; } @Override public void updateEntity() { super.updateEntity(); if (!this.world.isRemote) { int currStorage = 0; IEnergyStorage storage = this.getEnergyStorage(null); if (storage != null) { ItemStack stack = this.inv.getStackInSlot(0); if (StackUtil.isValid(stack) && ItemUtil.isEnabled(stack)) { if (storage.getEnergyStored() > 0) { List tiles = new ArrayList<>(); this.energyPushOffLoop(this, tiles); if (!tiles.isEmpty()) { int amount = tiles.size(); int energyPer = storage.getEnergyStored() / amount; if (energyPer <= 0) { energyPer = storage.getEnergyStored(); } int maxPer = storage.extractEnergy(energyPer, true); for (TileEntityBatteryBox tile : tiles) { ItemStack battery = tile.inv.getStackInSlot(0); if (StackUtil.isValid(battery) && !ItemUtil.isEnabled(battery)) { if (tile.hasCapability(CapabilityEnergy.ENERGY, null)) { IEnergyStorage cap = tile.getCapability(CapabilityEnergy.ENERGY, null); if (cap != null) { int received = cap.receiveEnergy(maxPer, false); storage.extractEnergy(received, false); if (storage.getEnergyStored() <= 0) { break; } } } } } } } } currStorage = storage.getEnergyStored(); } if (this.lastCompare != this.getComparatorStrength()) { this.lastCompare = this.getComparatorStrength(); this.markDirty(); } if (this.lastEnergyStored != currStorage && this.sendUpdateWithInterval()) { this.lastEnergyStored = currStorage; } } } @Override public int getComparatorStrength() { IEnergyStorage storage = this.getEnergyStorage(null); if (storage != null) { float calc = (float) storage.getEnergyStored() / (float) storage.getMaxEnergyStored() * 15F; return (int) calc; } else { return 0; } } @Override public boolean respondsToPulses() { return true; } @Override public void activateOnPulse() { ItemStack stack = this.inv.getStackInSlot(0); if (StackUtil.isValid(stack)) { ItemUtil.changeEnabled(stack); this.markDirty(); } } private void energyPushOffLoop(TileEntityBatteryBox startTile, List pushOffTo) { if (pushOffTo.size() >= 15) { return; } for (TileEntity tile : startTile.tilesAround) { if (tile instanceof TileEntityBatteryBox) { TileEntityBatteryBox box = (TileEntityBatteryBox) tile; if (!pushOffTo.contains(box)) { pushOffTo.add(box); this.energyPushOffLoop(box, pushOffTo); } } } } @Override public IAcceptor getAcceptor() { return (slot, stack, automation) -> stack.getItem() instanceof ItemBattery; } @Override public boolean shouldSyncSlots() { return true; } @Override public int getEnergyToSplitShare() { IEnergyStorage storage = this.getEnergyStorage(null); if (storage != null) { return storage.getEnergyStored(); } else { return 0; } } @Override public boolean doesShareEnergy() { return true; } @Override public EnumFacing[] getEnergyShareSides() { return EnumFacing.values(); } @Override public boolean canShareTo(TileEntity tile) { return !(tile instanceof TileEntityBatteryBox); } }