This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/block/entity/reactor/ReactorControllerBlockEntit...

116 lines
4.5 KiB
Java
Raw Normal View History

2020-07-13 20:37:21 +00:00
package com.thebrokenrail.energonrelics.block.entity.reactor;
2020-08-04 17:06:11 +00:00
import com.thebrokenrail.energonrelics.api.block.entity.helper.EnergyGeneratorBlockEntity;
2020-07-14 01:49:40 +00:00
import com.thebrokenrail.energonrelics.block.battery.PassiveBatteryControllerBlock;
import com.thebrokenrail.energonrelics.block.entity.battery.PassiveBatteryControllerBlockEntity;
2020-07-13 20:37:21 +00:00
import com.thebrokenrail.energonrelics.block.reactor.ReactorControllerBlock;
2020-07-28 20:38:21 +00:00
import com.thebrokenrail.energonrelics.config.HardcodedConfig;
2020-08-04 17:06:11 +00:00
import com.thebrokenrail.energonrelics.api.energy.tick.EnergyTickable;
import com.thebrokenrail.energonrelics.registry.reactor.ReactorFuelRegistry;
2020-07-13 20:37:21 +00:00
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
2020-07-22 20:40:19 +00:00
import net.minecraft.item.Item;
2020-07-13 20:37:21 +00:00
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
2020-07-26 22:31:05 +00:00
public List<EnergyTickable> startTick() {
2020-07-13 20:37:21 +00:00
if (getCachedState().get(ReactorControllerBlock.POWERED)) {
Reactor reactor = getReactor();
if (reactor != null && !reactor.core.isReacting()) {
2020-07-22 21:03:32 +00:00
float fuelMultiplier = 0f;
2020-07-13 20:37:21 +00:00
for (ReactorInputBlockEntity input : reactor.inputs) {
2020-07-22 21:03:32 +00:00
if (fuelMultiplier != 0f) {
2020-07-22 20:40:19 +00:00
break;
}
2020-07-13 20:37:21 +00:00
for (int i = 0; i < input.size(); i++) {
2020-07-22 20:40:19 +00:00
Item item = input.getStack(i).getItem();
2020-08-03 17:50:13 +00:00
fuelMultiplier = ReactorFuelRegistry.get(item);
2020-07-22 21:03:32 +00:00
if (fuelMultiplier != 0f) {
2020-07-13 20:37:21 +00:00
input.removeStack(i, 1);
2020-07-22 20:40:19 +00:00
break;
2020-07-13 20:37:21 +00:00
}
}
}
2020-07-22 21:03:32 +00:00
if (fuelMultiplier != 0f) {
2020-07-22 20:40:19 +00:00
reactor.core.startReaction(fuelMultiplier);
2020-07-13 20:37:21 +00:00
}
}
}
setEnergy(getDisplayEnergy());
2020-07-24 17:25:50 +00:00
return super.startTick();
2020-07-13 20:37:21 +00:00
}
@Override
public long getDisplayEnergy() {
if (getCachedState().get(ReactorControllerBlock.POWERED)) {
Reactor reactor = getReactor();
if (reactor != null && reactor.core.isReacting()) {
return HardcodedConfig.REACTOR_ENERGY_OUTPUT;
} else {
return 0;
}
2020-07-13 20:37:21 +00:00
} else {
return 0;
}
}
private Reactor getReactor() {
if (hasWorld()) {
2020-07-14 01:49:40 +00:00
Direction facing = getCachedState().get(PassiveBatteryControllerBlock.FACING);
2020-07-13 20:37:21 +00:00
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 || PassiveBatteryControllerBlockEntity.isInvalidBlock(state)) {
2020-07-13 20:37:21 +00:00
valid = false;
break;
}
}
}
}
if (valid) {
return new Reactor((ReactorCoreBlockEntity) entity, inputs.toArray(new ReactorInputBlockEntity[0]));
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
}
}