ActuallyAdditions/src/main/java/de/ellpeck/actuallyadditions/common/tile/TileEntityBatteryBox.java
Michael be421af8e2
Big Refactor of the package layout
Ignore this commit for diffs
2020-09-09 15:48:43 +01:00

167 lines
5.6 KiB
Java

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<TileEntityBatteryBox> 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<TileEntityBatteryBox> 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);
}
}