EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntit...

104 lines
3.9 KiB
Java

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<ReactorInputBlockEntity> 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;
}
}
}