package mods.eln.sixnode.electricalfiredetector;
import mods.eln.item.electricalitem.BatteryItem;
import mods.eln.misc.Coordonate;
import mods.eln.misc.RcInterpolator;
import mods.eln.misc.Utils;
import mods.eln.sim.IProcess;
import mods.eln.sixnode.electricalwatch.ElectricalWatchContainer;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFire;
import net.minecraft.item.ItemStack;
import java.util.List;
public class ElectricalFireDetectorSlowProcess implements IProcess {
ElectricalFireDetectorElement element;
RcInterpolator rc;
double t = 0;
public ElectricalFireDetectorSlowProcess(final ElectricalFireDetectorElement element) {
this.element = element;
if (!element.descriptor.batteryPowered) {
rc = new RcInterpolator(0.6f);
}
}
double getBatteryLevel() {
ItemStack batteryStack = element.getInventory().getStackInSlot(ElectricalWatchContainer.batteryId);
BatteryItem battery = (BatteryItem) BatteryItem.getDescriptor(batteryStack);
if (battery != null) {
return battery.getEnergy(batteryStack) / battery.getEnergyMax(batteryStack);
} else {
return 0;
}
}
@Override
public void process(double time) {
if (element.descriptor.batteryPowered) {
ItemStack batteryStack = element.getInventory().getStackInSlot(ElectricalFireDetectorContainer.Companion.getBatteryId());
BatteryItem battery = (BatteryItem) BatteryItem.getDescriptor(batteryStack);
double energy;
if (battery == null || (energy = battery.getEnergy(batteryStack)) < element.descriptor.PowerComsumption * time * 4) {
boolean changed = element.powered;
element.powered = false;
if (changed) element.needPublish();
} else {
boolean changed = !element.powered;
element.powered = true;
if (changed) element.needPublish();
battery.setEnergy(batteryStack, energy - element.descriptor.PowerComsumption * time);
}
}
if (!element.powered) return;
t += time;
if (t >= element.descriptor.updateInterval) {
t = 0;
boolean fireDetected = false;
int maxRangeHalf = ((int) element.descriptor.maxRange - 1) / 2;
Coordonate detectionBBCenter = new Coordonate();
detectionBBCenter.copyFrom(element.getCoordonate());
switch (element.side) {
case XP:
detectionBBCenter.x -= maxRangeHalf;
break;
case XN:
detectionBBCenter.x += maxRangeHalf;
break;
case YP:
detectionBBCenter.y -= maxRangeHalf;
break;
case YN:
detectionBBCenter.y += maxRangeHalf;
break;
case ZP:
detectionBBCenter.z -= maxRangeHalf;
break;
case ZN:
detectionBBCenter.z += maxRangeHalf;
break;
}
for (int dx = -maxRangeHalf; dx <= maxRangeHalf; ++dx)
for (int dy = -maxRangeHalf; dy <= maxRangeHalf; ++dy)
for (int dz = -maxRangeHalf; dz <= maxRangeHalf; ++dz) {
Block block = detectionBBCenter.world().getBlock(detectionBBCenter.x + dx, detectionBBCenter.y + dy,
detectionBBCenter.z + dz);
if (block.getClass() == BlockFire.class) {
fireDetected = true;
Coordonate coord = element.getCoordonate();
List<Block> blockList = Utils.traceRay(coord.world(), coord.x + 0.5, coord.y + 0.5, coord.z + 0.5,
detectionBBCenter.x + dx + 0.5, detectionBBCenter.y + dy + 0.5, detectionBBCenter.z + dz + 0.5);
for (Block b : blockList)
if (b.isOpaqueCube()) {
fireDetected = false;
break;
}
if (fireDetected) {
break;
}
}
}
if (element.firePresent != fireDetected) {
element.firePresent = fireDetected;
element.needPublish();
}
}
if (!element.descriptor.batteryPowered) {
rc.setTarget(element.firePresent ? 1 : 0);
rc.step((float) time);
element.outputGateProcess.setOutputNormalized(rc.get());
}
}
}