package com.thebrokenrail.energonrelics.block.entity.reactor; import com.thebrokenrail.energonrelics.Config; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.block.battery.BatteryControllerBlock; import com.thebrokenrail.energonrelics.block.reactor.ReactorControllerBlock; import com.thebrokenrail.energonrelics.energy.helper.EnergyGeneratorBlockEntity; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import java.util.ArrayList; import java.util.List; public class ReactorControllerBlockEntity extends EnergyGeneratorBlockEntity { private static class Reactor { private final ReactorCoreBlockEntity core; private final ReactorInputBlockEntity[] inputs; private Reactor(ReactorCoreBlockEntity core, ReactorInputBlockEntity[] inputs) { this.core = core; this.inputs = inputs; } } public ReactorControllerBlockEntity(BlockEntityType type) { super(type); } @Override protected void serverTick() { if (getCachedState().get(ReactorControllerBlock.POWERED)) { Reactor reactor = getReactor(); if (reactor != null && !reactor.core.isReacting()) { boolean foundFuel = false; for (ReactorInputBlockEntity input : reactor.inputs) { for (int i = 0; i < input.size(); i++) { if (input.getStack(i).getItem() == EnergonRelics.VERIDIUM_INGOT) { foundFuel = true; input.removeStack(i, 1); } } } if (foundFuel) { reactor.core.startReaction(); } } } setEnergy(getDisplayEnergy()); super.serverTick(); } @Override public long getDisplayEnergy() { Reactor reactor = getReactor(); if (reactor != null && reactor.core.isReacting()) { return Config.REACTOR_ENERGY_OUTPUT; } else { return 0; } } private Reactor getReactor() { if (hasWorld()) { Direction facing = getCachedState().get(BatteryControllerBlock.FACING); BlockPos corePos = getPos().offset(facing.getOpposite()); assert getWorld() != null; BlockEntity entity = getWorld().getBlockEntity(corePos); if (entity instanceof ReactorCoreBlockEntity) { boolean valid = true; List inputs = new ArrayList<>(); for (Direction side : Direction.values()) { if (side != facing) { BlockPos checkPos = corePos.offset(side); BlockEntity potentialInput = getWorld().getBlockEntity(checkPos); if (potentialInput instanceof ReactorInputBlockEntity) { inputs.add((ReactorInputBlockEntity) potentialInput); } else { BlockState state = getWorld().getBlockState(checkPos); if (state == null || state.getBlock() != EnergonRelics.THERMAL_CASING_BLOCK) { valid = false; break; } } } } if (valid) { return new Reactor((ReactorCoreBlockEntity) entity, inputs.toArray(new ReactorInputBlockEntity[0])); } else { return null; } } else { return null; } } else { return null; } } }